aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeffrey A Law <law@cygnus.com>1998-08-12 16:41:11 +0000
committerJeff Law <law@gcc.gnu.org>1998-08-12 10:41:11 -0600
commit980d0e8162562c3126df6748bd09d5680bd32a86 (patch)
treef5191aabd1734993abe5a0977509099a6bcd0dc1
parent6e755043ddb0a6055edff6654b14585ca4b02218 (diff)
downloadgcc-980d0e8162562c3126df6748bd09d5680bd32a86.zip
gcc-980d0e8162562c3126df6748bd09d5680bd32a86.tar.gz
gcc-980d0e8162562c3126df6748bd09d5680bd32a86.tar.bz2
mn10300.c (REG_SAVE_BYTES): Only reserve space for registers which will be saved.
* mn10300.c (REG_SAVE_BYTES): Only reserve space for registers which will be saved. * mn10300.md (prologue insn): Only save registers which need saving. (epilogue insn): Similarly. From-SVN: r21687
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/mn10300/mn10300.c5
-rw-r--r--gcc/config/mn10300/mn10300.md68
3 files changed, 75 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 726102a..5e90c3a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
Wed Aug 12 17:25:18 1998 Jeffrey A Law (law@cygnus.com)
+ * mn10300.c (REG_SAVE_BYTES): Only reserve space for registers
+ which will be saved.
+ * mn10300.md (prologue insn): Only save registers which need saving.
+ (epilogue insn): Similarly.
+
* mn10300.c, mn10300.h, mn10300.md: Remove "global zero register"
optimizations.
diff --git a/gcc/config/mn10300/mn10300.c b/gcc/config/mn10300/mn10300.c
index d1f71ef..9f1ff84 100644
--- a/gcc/config/mn10300/mn10300.c
+++ b/gcc/config/mn10300/mn10300.c
@@ -39,7 +39,10 @@ Boston, MA 02111-1307, USA. */
/* The size of the callee register save area. Right now we save everything
on entry since it costs us nothing in code size. It does cost us from a
speed standpoint, so we want to optimize this sooner or later. */
-#define REG_SAVE_BYTES (16)
+#define REG_SAVE_BYTES (4 * regs_ever_live[2] \
+ + 4 * regs_ever_live[3] \
+ + 4 * regs_ever_live[6] \
+ + 4 * regs_ever_live[7])
void
asm_file_start (file)
diff --git a/gcc/config/mn10300/mn10300.md b/gcc/config/mn10300/mn10300.md
index 8a652eb..d3061ad5 100644
--- a/gcc/config/mn10300/mn10300.md
+++ b/gcc/config/mn10300/mn10300.md
@@ -1370,7 +1370,39 @@
""
"*
{
- return \"ret [d2,d3,a2,a3],%0\";
+ int i, need_comma;
+ int d2, d3, a2, a3;
+
+ need_comma = 0;
+ fputs (\"\\tret [\", asm_out_file);
+ if (regs_ever_live[2])
+ {
+ fputs (\"d2\", asm_out_file);
+ need_comma = 1;
+ }
+ if (regs_ever_live[3])
+ {
+ if (need_comma)
+ fputc (',', asm_out_file);
+ fputs (\"d3\", asm_out_file);
+ need_comma = 1;
+ }
+ if (regs_ever_live[6])
+ {
+ if (need_comma)
+ fputc (',', asm_out_file);
+ fputs (\"a2\", asm_out_file);
+ need_comma = 1;
+ }
+ if (regs_ever_live[7])
+ {
+ if (need_comma)
+ fputc (',', asm_out_file);
+ fputs (\"a3\", asm_out_file);
+ need_comma = 1;
+ }
+ fprintf (asm_out_file, \"],%d\\n\", INTVAL (operands[0]));
+ return \"\";
}"
[(set_attr "cc" "clobber")])
@@ -1379,7 +1411,39 @@
""
"*
{
- return \"movm [d2,d3,a2,a3],(sp)\";
+ int i, need_comma;
+ int d2, d3, a2, a3;
+
+ need_comma = 0;
+ fputs (\"\\tmovm [\", asm_out_file);
+ if (regs_ever_live[2])
+ {
+ fputs (\"d2\", asm_out_file);
+ need_comma = 1;
+ }
+ if (regs_ever_live[3])
+ {
+ if (need_comma)
+ fputc (',', asm_out_file);
+ fputs (\"d3\", asm_out_file);
+ need_comma = 1;
+ }
+ if (regs_ever_live[6])
+ {
+ if (need_comma)
+ fputc (',', asm_out_file);
+ fputs (\"a2\", asm_out_file);
+ need_comma = 1;
+ }
+ if (regs_ever_live[7])
+ {
+ if (need_comma)
+ fputc (',', asm_out_file);
+ fputs (\"a3\", asm_out_file);
+ need_comma = 1;
+ }
+ fputs (\"],(sp)\\n\", asm_out_file);
+ return \"\";
}"
[(set_attr "cc" "clobber")])