From: Kazuhiro Inaoka Date: Fri, 8 Jul 2005 10:53:32 +0000 (+0000) Subject: config/m32r/m32r.c (m32r_output_function_epilogue): Care for a large stack # X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6a7b00ad6d2640c0660ee8f4a1fa9edc5812eb9f;p=gcc.git config/m32r/m32r.c (m32r_output_function_epilogue): Care for a large stack # frame at epilogue. From-SVN: r101759 --- 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 * 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 ();