From 9492393e341dc647bae76005a1597bbbd1daa686 Mon Sep 17 00:00:00 2001 From: Kazu Hirata Date: Mon, 31 Jul 2000 12:44:28 +0000 Subject: [PATCH] * h8300.c (split_adds_subs): Rearrange code for conciseness. From-SVN: r35371 --- gcc/ChangeLog | 4 +++ gcc/config/h8300/h8300.c | 64 +++++++++++----------------------------- 2 files changed, 21 insertions(+), 47 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index adb56754de9..d1d5440c61f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2000-07-31 Kazu Hirata + + * h8300.c (split_adds_subs): Rearrange code for conciseness. + Mon Jul 31 12:27:55 MET DST 2000 Jan Hubicka * i386.md (addsi to lea splitter, ashlqi3_1_lea): Fix bugs diff --git a/gcc/config/h8300/h8300.c b/gcc/config/h8300/h8300.c index 5c404eb1f98..7cb293eb08b 100644 --- a/gcc/config/h8300/h8300.c +++ b/gcc/config/h8300/h8300.c @@ -682,61 +682,31 @@ split_adds_subs (mode, operands) { HOST_WIDE_INT val = INTVAL (operands[1]); rtx reg = operands[0]; - rtx tmp; + HOST_WIDE_INT sign = 1; + HOST_WIDE_INT amount; - /* Take care of +/- 4 for H8300H and H8300S. */ - if (TARGET_H8300H || TARGET_H8300S) + /* Force VAL to be positive so that we do not have to consider the + sign. */ + if (val < 0) { - /* Get the value in range of +/- 4. */ - if (val > 4) - { - tmp = gen_rtx_PLUS (mode, reg, GEN_INT (4)); - emit_insn (gen_rtx_SET (VOIDmode, reg, tmp)); - val -= 4; - } - else if (val < -4) - { - tmp = gen_rtx_PLUS (mode, reg, GEN_INT (-4)); - emit_insn (gen_rtx_SET (VOIDmode, reg, tmp)); - val += 4; - } + val = -val; + sign = -1; + } - if (val == 4 || val == -4) + /* Try different amounts in descending order. */ + for (amount = (TARGET_H8300H || TARGET_H8300S) ? 4 : 2; + amount > 0; + amount /= 2) + { + while (val >= amount) { - tmp = gen_rtx_PLUS (mode, reg, GEN_INT (val)); + rtx tmp = gen_rtx_PLUS (mode, reg, GEN_INT (sign * amount)); emit_insn (gen_rtx_SET (VOIDmode, reg, tmp)); - return; + val -= amount; } } - /* Get the value in range of +/- 2. */ - if (val > 2) - { - tmp = gen_rtx_PLUS (mode, reg, GEN_INT (2)); - emit_insn (gen_rtx_SET (VOIDmode, reg, tmp)); - val -= 2; - } - else if (val < -2) - { - tmp = gen_rtx_PLUS (mode, reg, GEN_INT (-2)); - emit_insn (gen_rtx_SET (VOIDmode, reg, tmp)); - val += 2; - } - - /* If not optimizing, we might be asked to add 0. */ - if (val == 0) - return; - - /* We should have one or two now. */ - if (val >= -2 && val <= 2) - { - tmp = gen_rtx_PLUS (mode, reg, GEN_INT (val)); - emit_insn (gen_rtx_SET (VOIDmode, reg, tmp)); - return; - } - - /* In theory, this can't happen. */ - abort (); + return; } /* Return true if OP is a valid call operand, and OP represents -- 2.30.2