diff options
author | denisc <denisc@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-10-10 19:45:59 +0000 |
---|---|---|
committer | denisc <denisc@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-10-10 19:45:59 +0000 |
commit | 93576dcb74f4d2c447592b12e3be94bbe05a8e5b (patch) | |
tree | 1782ee906b22c9d264a4b143b433ef0d5e6b0e3b /gcc/config/ip2k/ip2k.c | |
parent | 7a4fa2a11409c1ee75e543791f8e21ace9a0829e (diff) | |
download | gcc-93576dcb74f4d2c447592b12e3be94bbe05a8e5b.tar.gz |
* config/ip2k/ip2k.c (function_epilogue): Optimize stack
deallocation.
* config/ip2k/libgcc.S: Combine routines used by function
epilogue.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@58027 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/ip2k/ip2k.c')
-rw-r--r-- | gcc/config/ip2k/ip2k.c | 92 |
1 files changed, 52 insertions, 40 deletions
diff --git a/gcc/config/ip2k/ip2k.c b/gcc/config/ip2k/ip2k.c index 9b392f59132..36c9b5fe4b0 100644 --- a/gcc/config/ip2k/ip2k.c +++ b/gcc/config/ip2k/ip2k.c @@ -304,6 +304,8 @@ function_epilogue (file, size) int leaf_func_p; int reg,savelimit; 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; /* Use this opportunity to reset the reorg flags! */ @@ -325,42 +327,54 @@ function_epilogue (file, size) epilogue_size = 0; 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) { - operands[0] = GEN_INT (size); - - switch (size & 0xff) + if (leaf_func_p && !CHAIN_FRAMES && !saved_regs_p + && current_function_pops_args) + args_locals_size = current_function_args_size + size; + else { - default: - 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; - } + operands[0] = GEN_INT (size); - 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; + switch (size & 0xff) + { + default: + 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) + { + 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++) { if (regs_ever_live[reg] && ! call_used_regs[reg]) @@ -428,10 +442,10 @@ function_epilogue (file, size) else { if (current_function_pops_args - && current_function_args_size >= 2 - && current_function_args_size < 0x100) + && args_locals_size >= 2 + && args_locals_size < 0x100) { - if (current_function_args_size == 2) + if (args_locals_size == 2) { if (CHAIN_FRAMES) { @@ -443,7 +457,7 @@ function_epilogue (file, size) } else { - operands[0] = GEN_INT (current_function_args_size); + operands[0] = GEN_INT (args_locals_size); if (CHAIN_FRAMES) { OUT_AS2 (mov, w, %L0); @@ -456,12 +470,11 @@ function_epilogue (file, size) } } - if (current_function_pops_args && current_function_args_size - && need_ret) + if (current_function_pops_args && args_locals_size && 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: OUT_AS2 (mov, w, %L0); @@ -477,11 +490,10 @@ function_epilogue (file, size) epilogue_size += 2; } - switch (current_function_args_size & 0xff00) + switch (args_locals_size & 0xff00) { default: - if ((current_function_args_size & 0xff) - != ((current_function_args_size >> 8) & 0xff)) + if ((args_locals_size & 0xff) != ((args_locals_size >> 8) & 0xff)) OUT_AS2 (mov, w, %H0); OUT_AS2 (add, sph, w); epilogue_size += 4; |