rs6000.c (rs6000_rtx_costs): Indicate that the rs6000 doesn't have shift-and-add...
authorRoger Sayle <roger@eyesopen.com>
Mon, 12 Jul 2004 13:42:28 +0000 (13:42 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Mon, 12 Jul 2004 13:42:28 +0000 (13:42 +0000)
* config/rs6000/rs6000.c (rs6000_rtx_costs): Indicate that the
rs6000 doesn't have shift-and-add or shift-and-sub instructions
by returning the cost of a multiplication plus an addition.

From-SVN: r84556

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index 1cac842bde386ef588cbdebf9e071b1f4d005b8b..e3d670dece480bcbd6199413ea80f33a2a47c1a2 100644 (file)
@@ -1,3 +1,9 @@
+2004-07-12  Roger Sayle  <roger@eyesopen.com>
+
+       * config/rs6000/rs6000.c (rs6000_rtx_costs): Indicate that the
+       rs6000 doesn't have shift-and-add or shift-and-sub instructions
+       by returning the cost of a multiplication plus an addition.
+
 2004-07-12  Paolo Bonzini  <bonzini@gnu.org>
 
        PR tree-optimization/14107
index 713a09bcc9692e1772974bd2b1f165bae7bfdb49..0722ed7502192ffd8b5f99a152a15a59b372d8bc 100644 (file)
@@ -16535,6 +16535,12 @@ rs6000_rtx_costs (rtx x, int code, int outer_code ATTRIBUTE_UNUSED,
                 : rs6000_cost->fp;
       else if (mode == SFmode)
        *total = rs6000_cost->fp;
+      else if (GET_CODE (XEXP (x, 0)) == MULT)
+       {
+         /* The rs6000 doesn't have shift-and-add instructions.  */
+         rs6000_rtx_costs (XEXP (x, 0), MULT, PLUS, total);
+         *total += COSTS_N_INSNS (1);
+       }
       else
        *total = ((GET_CODE (XEXP (x, 1)) == CONST_INT
                  && ((unsigned HOST_WIDE_INT) (INTVAL (XEXP (x, 1))
@@ -16551,6 +16557,12 @@ rs6000_rtx_costs (rtx x, int code, int outer_code ATTRIBUTE_UNUSED,
                 : rs6000_cost->fp;
       else if (mode == SFmode)
        *total = rs6000_cost->fp;
+      else if (GET_CODE (XEXP (x, 0)) == MULT)
+       {
+         /* The rs6000 doesn't have shift-and-sub instructions.  */
+         rs6000_rtx_costs (XEXP (x, 0), MULT, MINUS, total);
+         *total += COSTS_N_INSNS (1);
+       }
       else
         *total = COSTS_N_INSNS (1);
       return true;