summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKazuhiro Inaoka <inaoka.kazuhiro@renesas.com>2005-07-08 10:53:32 +0000
committerNick Clifton <nickc@gcc.gnu.org>2005-07-08 10:53:32 +0000
commit6a7b00ad6d2640c0660ee8f4a1fa9edc5812eb9f (patch)
tree644ecee0a44f77c4a7e260005a57beac129581c7 /gcc
parent0921bc44f78c9c3326d608039d099ea672541e39 (diff)
downloadgcc-6a7b00ad6d2640c0660ee8f4a1fa9edc5812eb9f.tar.gz
config/m32r/m32r.c (m32r_output_function_epilogue): Care for a large stack #
frame at epilogue. From-SVN: r101759
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog3
-rw-r--r--gcc/config/m32r/m32r.c20
2 files changed, 21 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d8ac67a1930..2f84490a063 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -4,6 +4,9 @@
(ENDFILE_SPEC): Likewise.
* config/m32r/m32r.h (ASM_SPEC): Likewise.
+ * config/m32r/m32r.c (m32r_output_function_epilogue): Care for
+ a large stack frame at epilogue.
+
2005-07-08 David Billinghurst <David.Billinghurst@riotinto.com>
* final.c: Include sdbout.h when required.
diff --git a/gcc/config/m32r/m32r.c b/gcc/config/m32r/m32r.c
index d772db08993..d6197d3da4a 100644
--- a/gcc/config/m32r/m32r.c
+++ b/gcc/config/m32r/m32r.c
@@ -1532,11 +1532,19 @@ m32r_output_function_epilogue (FILE * file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
else if (reg_offset < 32768)
fprintf (file, "\tadd3 %s,%s,%s%d\n",
sp_str, sp_str, IMMEDIATE_PREFIX, reg_offset);
- else
+ else if (reg_offset < (1 << 24))
fprintf (file, "\tld24 %s,%s%d\n\tadd %s,%s\n",
reg_names[PROLOGUE_TMP_REGNUM],
IMMEDIATE_PREFIX, reg_offset,
sp_str, reg_names[PROLOGUE_TMP_REGNUM]);
+ else
+ fprintf (file, "\tseth %s,%s%d\n\tor3 %s,%s,%s%d\n\tadd %s,%s\n",
+ reg_names[PROLOGUE_TMP_REGNUM],
+ IMMEDIATE_PREFIX, reg_offset >> 16,
+ reg_names[PROLOGUE_TMP_REGNUM],
+ reg_names[PROLOGUE_TMP_REGNUM],
+ IMMEDIATE_PREFIX, reg_offset & 0xffff,
+ sp_str, reg_names[PROLOGUE_TMP_REGNUM]);
}
else if (frame_pointer_needed)
{
@@ -1547,11 +1555,19 @@ m32r_output_function_epilogue (FILE * file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
else if (reg_offset < 32768)
fprintf (file, "\tadd3 %s,%s,%s%d\n",
sp_str, fp_str, IMMEDIATE_PREFIX, reg_offset);
- else
+ else if (reg_offset < (1 << 24))
fprintf (file, "\tld24 %s,%s%d\n\tadd %s,%s\n",
reg_names[PROLOGUE_TMP_REGNUM],
IMMEDIATE_PREFIX, reg_offset,
sp_str, reg_names[PROLOGUE_TMP_REGNUM]);
+ else
+ fprintf (file, "\tseth %s,%s%d\n\tor3 %s,%s,%s%d\n\tadd %s,%s\n",
+ reg_names[PROLOGUE_TMP_REGNUM],
+ IMMEDIATE_PREFIX, reg_offset >> 16,
+ reg_names[PROLOGUE_TMP_REGNUM],
+ reg_names[PROLOGUE_TMP_REGNUM],
+ IMMEDIATE_PREFIX, reg_offset & 0xffff,
+ sp_str, reg_names[PROLOGUE_TMP_REGNUM]);
}
else
gcc_unreachable ();