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
This commit is contained in:
parent
3b15076f36
commit
997e5af828
2 changed files with 30 additions and 6 deletions
|
@ -29,6 +29,9 @@ Mon Jul 17 02:37:06 2000 Marc Espie <espie@openbsd.org>
|
|||
|
||||
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.
|
||||
|
||||
2000-07-16 Laurynas Biveinis <lauras@softhome.net>
|
||||
|
|
|
@ -626,25 +626,46 @@ call_insn_operand (op, mode)
|
|||
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
|
||||
two_insn_adds_subs_operand (op, mode)
|
||||
rtx op;
|
||||
enum machine_mode mode ATTRIBUTE_UNUSED;
|
||||
enum machine_mode mode;
|
||||
{
|
||||
if (GET_CODE (op) == CONST_INT)
|
||||
{
|
||||
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 (value >= -8 && value < -4 && value != -7)
|
||||
return 1;
|
||||
if (value > 4 && value <= 8 && value != 7)
|
||||
return 1;
|
||||
/* A constant addition/subtraction takes 2 states in QImode,
|
||||
4 states in HImode, and 6 states in SImode. Thus, the
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue