mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-01-11 23:15:17 +08:00
ip2k.c (function_epilogue): Optimize stack deallocation.
* config/ip2k/ip2k.c (function_epilogue): Optimize stack deallocation. * config/ip2k/libgcc.S: Combine routines used by function epilogue. From-SVN: r58027
This commit is contained in:
parent
f930bfd067
commit
b687818845
@ -1,3 +1,10 @@
|
|||||||
|
2002-10-10 Denis Chertykov <denisc@overta.ru>
|
||||||
|
|
||||||
|
* config/ip2k/ip2k.c (function_epilogue): Optimize stack
|
||||||
|
deallocation.
|
||||||
|
* config/ip2k/libgcc.S: Combine routines used by function
|
||||||
|
epilogue.
|
||||||
|
|
||||||
2002-10-10 Jim Wilson <wilson@redhat.com>
|
2002-10-10 Jim Wilson <wilson@redhat.com>
|
||||||
|
|
||||||
* cse.c (fold_rtx): Don't perform associative optimization for DIV and
|
* cse.c (fold_rtx): Don't perform associative optimization for DIV and
|
||||||
|
@ -304,6 +304,8 @@ function_epilogue (file, size)
|
|||||||
int leaf_func_p;
|
int leaf_func_p;
|
||||||
int reg,savelimit;
|
int reg,savelimit;
|
||||||
rtx operands[2]; /* Dummy used by OUT_ASn */
|
rtx operands[2]; /* Dummy used by OUT_ASn */
|
||||||
|
int args_locals_size = current_function_args_size;
|
||||||
|
int saved_regs_p = 0;
|
||||||
int need_ret = 1;
|
int need_ret = 1;
|
||||||
|
|
||||||
/* Use this opportunity to reset the reorg flags! */
|
/* Use this opportunity to reset the reorg flags! */
|
||||||
@ -325,42 +327,54 @@ function_epilogue (file, size)
|
|||||||
epilogue_size = 0;
|
epilogue_size = 0;
|
||||||
fprintf (file, "/* epilogue: frame size=%d */\n", size);
|
fprintf (file, "/* epilogue: frame size=%d */\n", size);
|
||||||
|
|
||||||
|
savelimit = (CHAIN_FRAMES) ? REG_FP : (REG_FP + 2);
|
||||||
|
for (reg = 0; reg < savelimit; reg++)
|
||||||
|
if (regs_ever_live[reg] && ! call_used_regs[reg])
|
||||||
|
{
|
||||||
|
saved_regs_p = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (size)
|
if (size)
|
||||||
{
|
{
|
||||||
operands[0] = GEN_INT (size);
|
if (leaf_func_p && !CHAIN_FRAMES && !saved_regs_p
|
||||||
|
&& current_function_pops_args)
|
||||||
switch (size & 0xff)
|
args_locals_size = current_function_args_size + size;
|
||||||
|
else
|
||||||
{
|
{
|
||||||
default:
|
operands[0] = GEN_INT (size);
|
||||||
OUT_AS2 (mov, w, %L0);
|
|
||||||
OUT_AS2 (add, spl, w);
|
|
||||||
epilogue_size += 4;
|
|
||||||
/* fall-thru */
|
|
||||||
case 0:
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
OUT_AS1 (inc, spl);
|
|
||||||
epilogue_size += 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (size & 0xff00)
|
switch (size & 0xff)
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
if ((size & 0xff) != ((size >> 8) & 0xff))
|
OUT_AS2 (mov, w, %L0);
|
||||||
OUT_AS2 (mov, w, %H0);
|
OUT_AS2 (add, spl, w);
|
||||||
OUT_AS2 (add, sph, w);
|
epilogue_size += 4;
|
||||||
epilogue_size += 4;
|
/* fall-thru */
|
||||||
/* fall-thru */
|
case 0:
|
||||||
case 0:
|
break;
|
||||||
break;
|
case 1:
|
||||||
case 0x100:
|
OUT_AS1 (inc, spl);
|
||||||
OUT_AS1 (inc, sph);
|
epilogue_size += 2;
|
||||||
epilogue_size += 2;
|
}
|
||||||
|
|
||||||
|
switch (size & 0xff00)
|
||||||
|
{
|
||||||
|
default:
|
||||||
|
if ((size & 0xff) != ((size >> 8) & 0xff))
|
||||||
|
OUT_AS2 (mov, w, %H0);
|
||||||
|
OUT_AS2 (add, sph, w);
|
||||||
|
epilogue_size += 4;
|
||||||
|
/* fall-thru */
|
||||||
|
case 0:
|
||||||
|
break;
|
||||||
|
case 0x100:
|
||||||
|
OUT_AS1 (inc, sph);
|
||||||
|
epilogue_size += 2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
savelimit = (CHAIN_FRAMES) ? REG_FP : (REG_FP + 2);
|
|
||||||
|
|
||||||
for (reg = 0; reg < savelimit; reg++)
|
for (reg = 0; reg < savelimit; reg++)
|
||||||
{
|
{
|
||||||
if (regs_ever_live[reg] && ! call_used_regs[reg])
|
if (regs_ever_live[reg] && ! call_used_regs[reg])
|
||||||
@ -428,10 +442,10 @@ function_epilogue (file, size)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (current_function_pops_args
|
if (current_function_pops_args
|
||||||
&& current_function_args_size >= 2
|
&& args_locals_size >= 2
|
||||||
&& current_function_args_size < 0x100)
|
&& args_locals_size < 0x100)
|
||||||
{
|
{
|
||||||
if (current_function_args_size == 2)
|
if (args_locals_size == 2)
|
||||||
{
|
{
|
||||||
if (CHAIN_FRAMES)
|
if (CHAIN_FRAMES)
|
||||||
{
|
{
|
||||||
@ -443,7 +457,7 @@ function_epilogue (file, size)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
operands[0] = GEN_INT (current_function_args_size);
|
operands[0] = GEN_INT (args_locals_size);
|
||||||
if (CHAIN_FRAMES)
|
if (CHAIN_FRAMES)
|
||||||
{
|
{
|
||||||
OUT_AS2 (mov, w, %L0);
|
OUT_AS2 (mov, w, %L0);
|
||||||
@ -456,12 +470,11 @@ function_epilogue (file, size)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (current_function_pops_args && current_function_args_size
|
if (current_function_pops_args && args_locals_size && need_ret)
|
||||||
&& need_ret)
|
|
||||||
{
|
{
|
||||||
operands[0] = GEN_INT (current_function_args_size);
|
operands[0] = GEN_INT (args_locals_size);
|
||||||
|
|
||||||
switch (current_function_args_size & 0xff)
|
switch (args_locals_size & 0xff)
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
OUT_AS2 (mov, w, %L0);
|
OUT_AS2 (mov, w, %L0);
|
||||||
@ -477,11 +490,10 @@ function_epilogue (file, size)
|
|||||||
epilogue_size += 2;
|
epilogue_size += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (current_function_args_size & 0xff00)
|
switch (args_locals_size & 0xff00)
|
||||||
{
|
{
|
||||||
default:
|
default:
|
||||||
if ((current_function_args_size & 0xff)
|
if ((args_locals_size & 0xff) != ((args_locals_size >> 8) & 0xff))
|
||||||
!= ((current_function_args_size >> 8) & 0xff))
|
|
||||||
OUT_AS2 (mov, w, %H0);
|
OUT_AS2 (mov, w, %H0);
|
||||||
OUT_AS2 (add, sph, w);
|
OUT_AS2 (add, sph, w);
|
||||||
epilogue_size += 4;
|
epilogue_size += 4;
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
; libgcc.S for the Ubicom IP2k architecture.
|
|
||||||
;
|
;
|
||||||
; Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
|
; Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
|
||||||
; Contributed by Red Hat, Inc and Ubicom, Inc.
|
; Contributed by Red Hat, Inc and Ubicom, Inc.
|
||||||
@ -1327,8 +1326,11 @@ __cmpdi2_dp:
|
|||||||
.sect .pram.libgcc,"ax"
|
.sect .pram.libgcc,"ax"
|
||||||
.global __fp_pop_args_ret
|
.global __fp_pop_args_ret
|
||||||
.global __pop_args_ret
|
.global __pop_args_ret
|
||||||
.func __fp_pop_args_ret, __fp_pop_args_ret
|
.global __pop2_args_ret
|
||||||
|
.func __fp_pop2_args_ret, __fp_pop2_args_ret
|
||||||
|
|
||||||
|
__fp_pop2_args_ret:
|
||||||
|
mov w, #2
|
||||||
__fp_pop_args_ret:
|
__fp_pop_args_ret:
|
||||||
pop 0xfd
|
pop 0xfd
|
||||||
pop 0xfe
|
pop 0xfe
|
||||||
@ -1341,29 +1343,11 @@ __pop_args_ret:
|
|||||||
.endfunc
|
.endfunc
|
||||||
#endif /* L_fp_pop_args_ret */
|
#endif /* L_fp_pop_args_ret */
|
||||||
|
|
||||||
#if defined(L_leaf_fp_pop_args_ret)
|
#if defined(L__pop2_args_ret)
|
||||||
.sect .pram.libgcc,"ax"
|
.sect .pram.libgcc,"ax"
|
||||||
.global __leaf_fp_pop_args_ret
|
|
||||||
.func __leaf_fp_pop_args_ret, __leaf_fp_pop_args_ret
|
|
||||||
|
|
||||||
__leaf_fp_pop_args_ret:
|
|
||||||
pop 0xfd
|
|
||||||
pop 0xfe
|
|
||||||
add spl, w
|
|
||||||
ret
|
|
||||||
|
|
||||||
.endfunc
|
|
||||||
#endif /* L_leaf_fp_pop_args_ret */
|
|
||||||
|
|
||||||
#if defined(L_fp_pop2_args_ret)
|
|
||||||
.sect .pram.libgcc,"ax"
|
|
||||||
.global __fp_pop2_args_ret
|
|
||||||
.global __pop2_args_ret
|
.global __pop2_args_ret
|
||||||
.func __fp_pop2_args_ret, __fp_pop2_args_ret
|
.func __pop2_args_ret, __pop2_args_ret
|
||||||
|
|
||||||
__fp_pop2_args_ret:
|
|
||||||
pop 0xfd
|
|
||||||
pop 0xfe
|
|
||||||
__pop2_args_ret:
|
__pop2_args_ret:
|
||||||
mov w, #2
|
mov w, #2
|
||||||
pop callh
|
pop callh
|
||||||
@ -1372,22 +1356,23 @@ __pop2_args_ret:
|
|||||||
ret
|
ret
|
||||||
|
|
||||||
.endfunc
|
.endfunc
|
||||||
#endif /* L_fp_pop2_args_ret */
|
#endif /* L__pop2_args_ret */
|
||||||
|
|
||||||
#if defined(L_leaf_fp_pop2_args_ret)
|
#if defined(L_leaf_fp_pop_args_ret)
|
||||||
.sect .pram.libgcc,"ax"
|
.sect .pram.libgcc,"ax"
|
||||||
.global __leaf_fp_pop2_args_ret
|
.global __leaf_fp_pop_args_ret, __leaf_fp_pop2_args_ret
|
||||||
.func __leaf_fp_pop2_args_ret, __leaf_fp_pop2_args_ret
|
.func __leaf_fp2_pop_args_ret, __leaf_fp_pop2_args_ret
|
||||||
|
|
||||||
__leaf_fp_pop2_args_ret:
|
__leaf_fp_pop2_args_ret:
|
||||||
|
mov w, #2
|
||||||
|
__leaf_fp_pop_args_ret:
|
||||||
pop 0xfd
|
pop 0xfd
|
||||||
pop 0xfe
|
pop 0xfe
|
||||||
mov w, #2
|
|
||||||
add spl, w
|
add spl, w
|
||||||
ret
|
ret
|
||||||
|
|
||||||
.endfunc
|
.endfunc
|
||||||
#endif /* L_leaf_fp_pop2_args_ret */
|
#endif /* L_leaf_fp_pop_args_ret */
|
||||||
|
|
||||||
#if defined(L_movstrhi_countqi)
|
#if defined(L_movstrhi_countqi)
|
||||||
.sect .pram.libgcc,"ax"
|
.sect .pram.libgcc,"ax"
|
||||||
@ -1529,4 +1514,3 @@ _write:
|
|||||||
|
|
||||||
.endfunc
|
.endfunc
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -17,9 +17,8 @@ LIB1ASMFUNCS = \
|
|||||||
_cmpdi2 \
|
_cmpdi2 \
|
||||||
_cmpdi2_dp \
|
_cmpdi2_dp \
|
||||||
_fp_pop_args_ret \
|
_fp_pop_args_ret \
|
||||||
|
_pop2_args_ret \
|
||||||
_leaf_fp_pop_args_ret \
|
_leaf_fp_pop_args_ret \
|
||||||
_fp_pop2_args_ret \
|
|
||||||
_leaf_fp_pop2_args_ret \
|
|
||||||
_movstrhi_countqi \
|
_movstrhi_countqi \
|
||||||
_movstrhi_counthi \
|
_movstrhi_counthi \
|
||||||
abort \
|
abort \
|
||||||
|
Loading…
Reference in New Issue
Block a user