re PR target/80723 (FAIL gcc.target/i386/cadd.c scan assembler sbb)
authorUros Bizjak <uros@gcc.gnu.org>
Fri, 12 May 2017 18:52:51 +0000 (20:52 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Fri, 12 May 2017 18:52:51 +0000 (20:52 +0200)
PR target/80723
* config/i386/i386.c (ix86_rtx_cost) [case PLUS]: Ignore the
cost of adding a carry flag for ADC instruction.
[case MINUS]: Ignore the cost of subtracting a carry flag
for SBB instruction.

From-SVN: r247991

gcc/ChangeLog
gcc/config/i386/i386.c

index 99f1648f914370c505122e5bb845666cd0620994..cc9f7a32be98da3312b6e2ff5433d3bd3ef37ef4 100644 (file)
@@ -1,3 +1,11 @@
+2017-05-12  Uros Bizjak  <ubizjak@gmail.com>
+
+       PR target/80723
+       * config/i386/i386.c (ix86_rtx_cost) [case PLUS]: Ignore the
+       cost of adding a carry flag for ADC instruction.
+       [case MINUS]: Ignore the cost of subtracting a carry flag
+       for SBB instruction.
+
 2017-05-12  Steven Munroe  <munroesj@gcc.gnu.org>
 
        * config.gcc (powerpc*-*-*): Add bmi2intrin.h, bmiintrin.h,
@@ -8,7 +16,7 @@
 
 2017-05-12  Jeff Law  <law@redhat.com>
 
-       * tree-vrp.c (vrp_dom_walker::before_dom_childern): Push unwinding
+       * tree-vrp.c (vrp_dom_walker::before_dom_children): Push unwinding
        markers.
 
 2017-05-12  Peter Bergner  <bergner@vnet.ibm.com>
index 7e8cdb9602ac33e24255501342b1e0db66b1f208..b5bdcd636089561d048e8c2fad4b26cbdb03c6ad 100644 (file)
@@ -40913,9 +40913,16 @@ ix86_rtx_costs (rtx x, machine_mode mode, int outer_code_i, int opno,
            }
          else if (GET_CODE (XEXP (x, 0)) == PLUS)
            {
-             *total = cost->lea;
-             *total += rtx_cost (XEXP (XEXP (x, 0), 0), mode,
-                                 outer_code, opno, speed);
+             /* Add with carry, ignore the cost of adding a carry flag.  */
+             if (ix86_carry_flag_operator (XEXP (XEXP (x, 0), 0), mode))
+               *total = cost->add;
+             else
+               {
+                 *total = cost->lea;
+                 *total += rtx_cost (XEXP (XEXP (x, 0), 0), mode,
+                                     outer_code, opno, speed);
+               }
+
              *total += rtx_cost (XEXP (XEXP (x, 0), 1), mode,
                                  outer_code, opno, speed);
              *total += rtx_cost (XEXP (x, 1), mode,
@@ -40926,6 +40933,20 @@ ix86_rtx_costs (rtx x, machine_mode mode, int outer_code_i, int opno,
       /* FALLTHRU */
 
     case MINUS:
+      /* Subtract with borrow, ignore the cost of subtracting a carry flag.  */
+      if (GET_MODE_CLASS (mode) == MODE_INT
+         && GET_MODE_SIZE (mode) <= UNITS_PER_WORD
+         && GET_CODE (XEXP (x, 0)) == MINUS
+         && ix86_carry_flag_operator (XEXP (XEXP (x, 0), 1), mode))
+       {
+         *total = cost->add;
+         *total += rtx_cost (XEXP (XEXP (x, 0), 0), mode,
+                             outer_code, opno, speed);
+         *total += rtx_cost (XEXP (x, 1), mode,
+                             outer_code, opno, speed);
+         return true;
+       }
+
       if (SSE_FLOAT_MODE_P (mode) && TARGET_SSE_MATH)
        {
          /* ??? SSE cost should be used here.  */