diff options
author | Kazu Hirata <kazu@cs.umass.edu> | 2002-12-02 22:22:05 +0000 |
---|---|---|
committer | Kazu Hirata <kazu@gcc.gnu.org> | 2002-12-02 22:22:05 +0000 |
commit | e8a68017b07181dfe3451ec65cf4c4f979f4fc3c (patch) | |
tree | cc3b881e4186a2c4649e638f9089af71857f7fdb | |
parent | 61b8da3733cfa15ed60eb93615b37e716af2fc5e (diff) | |
download | gcc-e8a68017b07181dfe3451ec65cf4c4f979f4fc3c.zip gcc-e8a68017b07181dfe3451ec65cf4c4f979f4fc3c.tar.gz gcc-e8a68017b07181dfe3451ec65cf4c4f979f4fc3c.tar.bz2 |
h8300.c (dosize): Replace argument op with sign.
* config/h8300/h8300.c (dosize): Replace argument op with
sign.
(h8300_output_function_prologue): Update the call to dosize.
(h8300_output_function_epilogue): Likewise.
From-SVN: r59746
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/h8300/h8300.c | 79 |
2 files changed, 66 insertions, 20 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7d2ee31..7b4eecb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2002-12-02 Kazu Hirata <kazu@cs.umass.edu> + + * config/h8300/h8300.c (dosize): Replace argument op with + sign. + (h8300_output_function_prologue): Update the call to dosize. + (h8300_output_function_epilogue): Likewise. + 2002-12-02 Bob Wilson <bob.wilson@acm.org> * config/xtensa/xtensa.h: Delete ifndefs with nothing inside them. diff --git a/gcc/config/h8300/h8300.c b/gcc/config/h8300/h8300.c index bf82186..71e3477 100644 --- a/gcc/config/h8300/h8300.c +++ b/gcc/config/h8300/h8300.c @@ -48,7 +48,7 @@ static const char *byte_reg PARAMS ((rtx, int)); static int h8300_interrupt_function_p PARAMS ((tree)); static int h8300_monitor_function_p PARAMS ((tree)); static int h8300_os_task_function_p PARAMS ((tree)); -static void dosize PARAMS ((FILE *, const char *, unsigned int)); +static void dosize PARAMS ((FILE *, int, unsigned int)); static int round_frame_size PARAMS ((int)); static unsigned int compute_saved_regs PARAMS ((void)); static void push PARAMS ((FILE *, int)); @@ -393,9 +393,9 @@ byte_reg (x, b) SIZE to adjust the stack pointer. */ static void -dosize (file, op, size) +dosize (file, sign, size) FILE *file; - const char *op; + int sign; unsigned int size; { /* On the H8/300H and H8S, for sizes <= 8 bytes, it is as good or @@ -409,8 +409,9 @@ dosize (file, op, size) || ((TARGET_H8300H || TARGET_H8300S) && size <= 8) || (TARGET_H8300 && interrupt_handler) || (TARGET_H8300 && current_function_needs_context - && ! strcmp (op, "sub"))) + && sign < 0)) { + const char *op = (sign > 0) ? "add" : "sub"; unsigned HOST_WIDE_INT amount; /* Try different amounts in descending order. */ @@ -429,9 +430,13 @@ dosize (file, op, size) else { if (TARGET_H8300) - fprintf (file, "\tmov.w\t#%d,r3\n\t%s.w\tr3,r7\n", size, op); + { + fprintf (file, "\tmov.w\t#%d,r3\n\tadd.w\tr3,r7\n", sign * size); + } else - fprintf (file, "\t%s.l\t#%d,er7\n", op, size); + { + fprintf (file, "\tadd.l\t#%d,er7\n", sign * size); + } } } @@ -586,7 +591,7 @@ h8300_output_function_prologue (file, size) } /* Leave room for locals. */ - dosize (file, "sub", fsize); + dosize (file, -1, fsize); /* Push the rest of the registers in ascending order. */ saved_regs = compute_saved_regs (); @@ -611,12 +616,29 @@ h8300_output_function_prologue (file, size) n_regs = 2; } - if (n_regs == 1) - push (file, regno); - else - fprintf (file, "\tstm.l\t%s-%s,@-er7\n", - h8_reg_names[regno], - h8_reg_names[regno + (n_regs - 1)]); + switch (n_regs) + { + case 1: + push (file, regno); + break; + case 2: + fprintf (file, "\tstm.l\t%s-%s,@-er7\n", + h8_reg_names[regno], + h8_reg_names[regno + 1]); + break; + case 3: + fprintf (file, "\tstm.l\t%s-%s,@-er7\n", + h8_reg_names[regno], + h8_reg_names[regno + 2]); + break; + case 4: + fprintf (file, "\tstm.l\t%s-%s,@-er7\n", + h8_reg_names[regno], + h8_reg_names[regno + 3]); + break; + default: + abort (); + } } } } @@ -677,17 +699,34 @@ h8300_output_function_epilogue (file, size) n_regs = 2; } - if (n_regs == 1) - pop (file, regno); - else - fprintf (file, "\tldm.l\t@er7+,%s-%s\n", - h8_reg_names[regno - (n_regs - 1)], - h8_reg_names[regno]); + switch (n_regs) + { + case 1: + pop (file, regno); + break; + case 2: + fprintf (file, "\tldm.l\t@er7+,%s-%s\n", + h8_reg_names[regno - 1], + h8_reg_names[regno]); + break; + case 3: + fprintf (file, "\tldm.l\t@er7+,%s-%s\n", + h8_reg_names[regno - 2], + h8_reg_names[regno]); + break; + case 4: + fprintf (file, "\tldm.l\t@er7+,%s-%s\n", + h8_reg_names[regno - 3], + h8_reg_names[regno]); + break; + default: + abort (); + } } } /* Deallocate locals. */ - dosize (file, "add", fsize); + dosize (file, 1, fsize); /* Pop frame pointer if we had one. */ if (frame_pointer_needed) |