aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKazu Hirata <kazu@hxi.com>2000-08-06 18:03:58 +0000
committerJeff Law <law@gcc.gnu.org>2000-08-06 12:03:58 -0600
commit7b3d46133d45983d6f86bf6fe350981263f1f531 (patch)
treec332b29a7c87560cb9a0a2d987f05c299ce2f881 /gcc
parente6fcb60dd918ee3419b78329721ed6bd22c4be25 (diff)
downloadgcc-7b3d46133d45983d6f86bf6fe350981263f1f531.zip
gcc-7b3d46133d45983d6f86bf6fe350981263f1f531.tar.gz
gcc-7b3d46133d45983d6f86bf6fe350981263f1f531.tar.bz2
h8300.c (dosize): Rearrange code for conciseness.
* h8300.c (dosize): Rearrange code for conciseness. (split_adds_subs): Likewise. From-SVN: r35527
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog3
-rw-r--r--gcc/config/h8300/h8300.c77
2 files changed, 27 insertions, 53 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 01ad603..19549e7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,8 @@
2000-08-06 Kazu Hirata <kazu@hxi.com>
+ * h8300.c (dosize): Rearrange code for conciseness.
+ (split_adds_subs): Likewise.
+
* loop.c: Fix formatting.
* dwarf2out.c: Fix formatting.
diff --git a/gcc/config/h8300/h8300.c b/gcc/config/h8300/h8300.c
index 9bb802a..dbaa7ff 100644
--- a/gcc/config/h8300/h8300.c
+++ b/gcc/config/h8300/h8300.c
@@ -148,63 +148,35 @@ dosize (file, op, size)
const char *op;
unsigned int size;
{
- /* On the h8300h and h8300s, for sizes <= 8 bytes it is as good or
- better to use adds/subs insns rather than add.l/sub.l
- with an immediate value. */
- if (size > 4 && size <= 8 && (TARGET_H8300H || TARGET_H8300S))
+ /* On the H8/300H and H8/S, for sizes <= 8 bytes, it is as good or
+ better to use adds/subs insns rather than add.l/sub.l with an
+ immediate value.
+
+ Also, on the H8/300, if we don't have a temporary to hold the
+ size of the frame in the prologue, we simply emit a sequence of
+ subs since this shouldn't happen often. */
+ if ((TARGET_H8300 && size <= 4)
+ || ((TARGET_H8300H || TARGET_H8300S) && size <= 8)
+ || (TARGET_H8300 && current_function_needs_context
+ && strcmp (op, "sub")))
{
- /* Crank the size down to <= 4. */
- fprintf (file, "\t%ss\t#%d,sp\n", op, 4);
- size -= 4;
- }
+ HOST_WIDE_INT amount;
- switch (size)
- {
- case 4:
- if (TARGET_H8300H || TARGET_H8300S)
+ /* Try different amounts in descending order. */
+ for (amount = (TARGET_H8300H || TARGET_H8300S) ? 4 : 2;
+ amount > 0;
+ amount /= 2)
{
- fprintf (file, "\t%ss\t#%d,sp\n", op, 4);
- size = 0;
- break;
+ for(; size >= amount; size -= amount)
+ fprintf (file, "\t%ss\t#%d,sp\n", op, amount);
}
- case 3:
- fprintf (file, "\t%ss\t#%d,sp\n", op, 2);
- size -= 2;
- /* Fall through... */
- case 2:
- case 1:
- fprintf (file, "\t%ss\t#%d,sp\n", op, size);
- size = 0;
- break;
- case 0:
- break;
- default:
+ }
+ else
+ {
if (TARGET_H8300)
- {
- if (current_function_needs_context
- && strcmp (op, "sub") == 0)
- {
- /* Egad. We don't have a temporary to hold the
- size of the frame in the prologue! Just inline
- the bastard since this shouldn't happen often. */
- while (size >= 2)
- {
- fprintf (file, "\tsubs\t#2,sp\n");
- size -= 2;
- }
-
- if (size)
- fprintf (file, "\tsubs\t#1,sp\n");
-
- size = 0;
- }
- else
- fprintf (file, "\tmov.w\t#%d,r3\n\t%s.w\tr3,sp\n", size, op);
- }
+ fprintf (file, "\tmov.w\t#%d,r3\n\t%s.w\tr3,sp\n", size, op);
else
- fprintf (file, "\t%s\t#%d,sp\n", op, size);
- size = 0;
- break;
+ fprintf (file, "\t%s.l\t#%d,sp\n", op, size);
}
}
@@ -640,11 +612,10 @@ split_adds_subs (mode, operands)
amount > 0;
amount /= 2)
{
- while (val >= amount)
+ for(; val >= amount; val -= amount)
{
rtx tmp = gen_rtx_PLUS (mode, reg, GEN_INT (sign * amount));
emit_insn (gen_rtx_SET (VOIDmode, reg, tmp));
- val -= amount;
}
}