OSDN Git Service

* h8300.c (two_insn_adds_subs_operand): Improve code for detecting
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 17 Jul 2000 08:55:51 +0000 (08:55 +0000)
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 17 Jul 2000 08:55:51 +0000 (08:55 +0000)
        profitable adds/subs sequences.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@35081 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/h8300/h8300.c

index 0d81edd..1e3ac96 100644 (file)
@@ -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>
index 4eb304e..ba46d04 100644 (file)
@@ -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;
        }
     }