aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorUros Bizjak <uros@gcc.gnu.org>2017-05-12 20:52:51 +0200
committerUros Bizjak <uros@gcc.gnu.org>2017-05-12 20:52:51 +0200
commit88ce9dc38a0590608dd036e08758b478f8ca429c (patch)
tree0fae5c62139cd17defd0553bc7128f24b2c2e1bc /gcc
parentb76f15500970fd9b00ae4c6979fbe1b4ab7ed126 (diff)
downloadgcc-88ce9dc38a0590608dd036e08758b478f8ca429c.zip
gcc-88ce9dc38a0590608dd036e08758b478f8ca429c.tar.gz
gcc-88ce9dc38a0590608dd036e08758b478f8ca429c.tar.bz2
re PR target/80723 (FAIL gcc.target/i386/cadd.c scan assembler sbb)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/config/i386/i386.c27
2 files changed, 33 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 99f1648..cc9f7a3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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>
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 7e8cdb9..b5bdcd6 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -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. */