Commit 997e5af8 by Kazu Hirata Committed by Jeff Law

h8300.c (two_insn_adds_subs_operand): Improve code for detecting profitable adds/subs sequences.

        * h8300.c (two_insn_adds_subs_operand): Improve code for detecting
        profitable adds/subs sequences.

From-SVN: r35081
parent 3b15076f
...@@ -29,6 +29,9 @@ Mon Jul 17 02:37:06 2000 Marc Espie <espie@openbsd.org> ...@@ -29,6 +29,9 @@ Mon Jul 17 02:37:06 2000 Marc Espie <espie@openbsd.org>
2000-07-17 Kazu Hirata <kazu@hxi.com> 2000-07-17 Kazu Hirata <kazu@hxi.com>
* h8300.c (two_insn_adds_subs_operand): Improve code for detecting
profitable adds/subs sequences.
* fold-const.c: Fix comment typos. * fold-const.c: Fix comment typos.
2000-07-16 Laurynas Biveinis <lauras@softhome.net> 2000-07-16 Laurynas Biveinis <lauras@softhome.net>
......
...@@ -626,25 +626,46 @@ call_insn_operand (op, mode) ...@@ -626,25 +626,46 @@ call_insn_operand (op, mode)
return 0; return 0;
} }
/* Return 1 if a addition/subtraction of a constant integer can be
transformed into two consecutive adds/subs that are faster than the
straightforward way. Otherwise, return 0. */
int int
two_insn_adds_subs_operand (op, mode) two_insn_adds_subs_operand (op, mode)
rtx op; rtx op;
enum machine_mode mode ATTRIBUTE_UNUSED; enum machine_mode mode;
{ {
if (GET_CODE (op) == CONST_INT) if (GET_CODE (op) == CONST_INT)
{ {
HOST_WIDE_INT value = INTVAL (op); HOST_WIDE_INT value = INTVAL (op);
/* Force VALUE to be positive so that we do not have to consider
the negative case. */
if (value < 0)
value = -value;
if (TARGET_H8300H || TARGET_H8300S) if (TARGET_H8300H || TARGET_H8300S)
{ {
if (value >= -8 && value < -4 && value != -7) /* A constant addition/subtraction takes 2 states in QImode,
return 1; 4 states in HImode, and 6 states in SImode. Thus, the
if (value > 4 && value <= 8 && value != 7) only case we can win is when SImode is used, in which
case, two adds/subs is used, taking 4 states. */
if (mode == SImode
&& (value == 2 + 1
|| value == 4 + 1
|| value == 4 + 2
|| value == 4 + 4))
return 1; return 1;
} }
else else
{ {
if (value == -4 || value == -3 || value == 3 || value == 4) /* A constant addition/subtraction takes 2 states in
QImode. It takes 6 states in HImode, requiring the
constant to be loaded to a register first, and a lot more
in SImode. Thus the only case we can win is when either
HImode or SImode is used. */
if (mode != QImode
&& (value == 2 + 1
|| value == 2 + 2))
return 1; return 1;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment