re PR target/56102 (Wrong rtx cost calculated for Thumb1)
authorBin Cheng <bin.cheng@arm.com>
Wed, 27 Mar 2013 08:16:54 +0000 (08:16 +0000)
committerBin Cheng <amker@gcc.gnu.org>
Wed, 27 Mar 2013 08:16:54 +0000 (08:16 +0000)
PR target/56102
* config/arm/arm.c (thumb1_rtx_costs, thumb1_size_rtx_costs): Fix
rtx costs for SET/ASHIFT/ASHIFTRT/LSHIFTRT/ROTATERT patterns with
mult-word mode.

From-SVN: r197155

gcc/ChangeLog
gcc/config/arm/arm.c

index a6e9c1b..f8ae2ac 100644 (file)
@@ -1,3 +1,10 @@
+2013-03-27  Bin Cheng  <bin.cheng@arm.com>
+
+       PR target/56102
+       * config/arm/arm.c (thumb1_rtx_costs, thumb1_size_rtx_costs): Fix
+       rtx costs for SET/ASHIFT/ASHIFTRT/LSHIFTRT/ROTATERT patterns with
+       mult-word mode.
+
 2013-03-27  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
 
        * config/s390/s390.h (TARGET_FLT_EVAL_METHOD): Define.
index 21020b9..5f63a2e 100644 (file)
@@ -7116,7 +7116,7 @@ static inline int
 thumb1_rtx_costs (rtx x, enum rtx_code code, enum rtx_code outer)
 {
   enum machine_mode mode = GET_MODE (x);
-  int total;
+  int total, words;
 
   switch (code)
     {
@@ -7124,6 +7124,8 @@ thumb1_rtx_costs (rtx x, enum rtx_code code, enum rtx_code outer)
     case ASHIFTRT:
     case LSHIFTRT:
     case ROTATERT:
+      return (mode == SImode) ? COSTS_N_INSNS (1) : COSTS_N_INSNS (2);
+
     case PLUS:
     case MINUS:
     case COMPARE:
@@ -7147,7 +7149,10 @@ thumb1_rtx_costs (rtx x, enum rtx_code code, enum rtx_code outer)
       return COSTS_N_INSNS (1) + 16;
 
     case SET:
-      return (COSTS_N_INSNS (1)
+      /* A SET doesn't have a mode, so let's look at the SET_DEST to get
+        the mode.  */
+      words = ARM_NUM_INTS (GET_MODE_SIZE (GET_MODE (SET_DEST (x))));
+      return (COSTS_N_INSNS (words)
              + 4 * ((MEM_P (SET_SRC (x)))
                     + MEM_P (SET_DEST (x))));
 
@@ -7844,6 +7849,7 @@ static inline int
 thumb1_size_rtx_costs (rtx x, enum rtx_code code, enum rtx_code outer)
 {
   enum machine_mode mode = GET_MODE (x);
+  int words;
 
   switch (code)
     {
@@ -7851,6 +7857,8 @@ thumb1_size_rtx_costs (rtx x, enum rtx_code code, enum rtx_code outer)
     case ASHIFTRT:
     case LSHIFTRT:
     case ROTATERT:
+      return (mode == SImode) ? COSTS_N_INSNS (1) : COSTS_N_INSNS (2);
+
     case PLUS:
     case MINUS:
     case COMPARE:
@@ -7869,7 +7877,10 @@ thumb1_size_rtx_costs (rtx x, enum rtx_code code, enum rtx_code outer)
       return COSTS_N_INSNS (1);
 
     case SET:
-      return (COSTS_N_INSNS (1)
+      /* A SET doesn't have a mode, so let's look at the SET_DEST to get
+        the mode.  */
+      words = ARM_NUM_INTS (GET_MODE_SIZE (GET_MODE (SET_DEST (x))));
+      return (COSTS_N_INSNS (words)
               + 4 * ((MEM_P (SET_SRC (x)))
                      + MEM_P (SET_DEST (x))));