aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUros Bizjak <uros@gcc.gnu.org>2010-04-06 20:18:42 +0200
committerUros Bizjak <uros@gcc.gnu.org>2010-04-06 20:18:42 +0200
commitd079b87fab5e8de93c897940b750286d31d5d003 (patch)
tree63fdad1fa0b970340be7cdd0dec1efa5a59642e2
parentbe59db2d47d5de2c73132b9ea45bdfa7692a4bd8 (diff)
downloadgcc-d079b87fab5e8de93c897940b750286d31d5d003.zip
gcc-d079b87fab5e8de93c897940b750286d31d5d003.tar.gz
gcc-d079b87fab5e8de93c897940b750286d31d5d003.tar.bz2
i386-protos.h (x86_maybe_negate_const_int): Declare.
* config/i386/i386-protos.h (x86_maybe_negate_const_int): Declare. * config/i386/i386.c (x86_maybe_negate_const_int): New. (x86_output_mi_thunk): Use x86_maybe_negate_const_int. * config/i386/i386.md (*add<mode>_1, *addsi_1_zext, *addhi_1, *addhi_1_lea, *addqi_1, *addqi_1_lea, *addqi_1_slp, *add<mode>_2, *addsi_2_zext, *addhi_2, *addqi_2, *add<mode>_3, *addsi_3_zext, *addhi_3, *addqi_3,*add<mode>_5, *addhi_5, *addqi_5): Use x86_maybe_negate_const_int to output insn mnemonic. (*adddi_4, *addsi_4, *addhi_4, *addqi_4): Ditto. Remove overflow check from instruction predicate. Update comments. * config/i386/sync.md (sync_add<mode>): Use x86_maybe_negate_const_int to output insn mnemonic. From-SVN: r158013
-rw-r--r--gcc/ChangeLog32
-rw-r--r--gcc/config/i386/i386-protos.h1
-rw-r--r--gcc/config/i386/i386.c55
-rw-r--r--gcc/config/i386/i386.md282
-rw-r--r--gcc/config/i386/sync.md3
5 files changed, 144 insertions, 229 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a05b595..a958473 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,12 +1,28 @@
-2010-04-06 Jan Hubicka <jh@suse.czpli
+2010-04-06 Uros Bizjak <ubizjak@gmail.com>
+
+ * config/i386/i386-protos.h (x86_maybe_negate_const_int): Declare.
+ * config/i386/i386.c (x86_maybe_negate_const_int): New.
+ (x86_output_mi_thunk): Use x86_maybe_negate_const_int.
+ * config/i386/i386.md (*add<mode>_1, *addsi_1_zext, *addhi_1,
+ *addhi_1_lea, *addqi_1, *addqi_1_lea, *addqi_1_slp, *add<mode>_2,
+ *addsi_2_zext, *addhi_2, *addqi_2, *add<mode>_3, *addsi_3_zext,
+ *addhi_3, *addqi_3,*add<mode>_5, *addhi_5, *addqi_5):
+ Use x86_maybe_negate_const_int to output insn mnemonic.
+ (*adddi_4, *addsi_4, *addhi_4, *addqi_4): Ditto. Remove overflow
+ check from instruction predicate. Update comments.
+ * config/i386/sync.md (sync_add<mode>): Use
+ x86_maybe_negate_const_int to output insn mnemonic.
- PR tree-optimization/42906
- * tree-ssa-dce.c (mark_control_dependent_edges_necessary): Add IGNORE_SELF
- argument; set visited_control_parents for fully processed BBs.
+2010-04-06 Jan Hubicka <jh@suse.cz>
+
+ PR tree-optimization/42906
+ * tree-ssa-dce.c (mark_control_dependent_edges_necessary): Add
+ IGNORE_SELF argument. Set visited_control_parents for fully
+ processed BBs.
(find_obviously_necessary_stmts): Update call of
mark_control_dependent_edges_necessary.
- (propagate_necessity): Likewise; handle PHI edges more curefully.
+ (propagate_necessity): Likewise. Handle PHI edges more curefully.
2010-04-06 Uros Bizjak <ubizjak@gmail.com>
@@ -52,7 +68,7 @@
2010-04-02 Steven Bosscher <steven@gcc.gnu.org>
- * ada/gcc-interface/Make-lang.in, alias.c, attribs.c, auto-inc-dec.c,
+ * ada/gcc-interface/Make-lang.in, alias.c, attribs.c, auto-inc-dec.c,
basic-block.h, bb-reorder.c, calls.c, c-common.c, cgraph.h,
collect2.h, config/alpha/alpha.c, config/alpha/alpha.md,
config/alpha/predicates.md, config/arm/arm.md,
@@ -123,7 +139,7 @@
2010-04-02 Richard Earnshaw <rearnsha@arm.com>
PR target/43469
- * arm.c (legitimize_tls_address): Adjust call to
+ * arm.c (legitimize_tls_address): Adjust call to
gen_tls_load_dot_plus_four.
(arm_note_pic_base): New function.
(arm_cannot_copy_insn_p): Use it.
@@ -2684,7 +2700,7 @@
2010-02-15 Nick Clifton <nickc@redhat.com>
- * config/h8300/h8300.c: (h8300_push_pop): Use bool type for
+ * config/h8300/h8300.c (h8300_push_pop): Use bool type for
boolean parameters. Use emit_jump_insn when emitting a pop
instruction containing a return insn.
(push): Use 'true' rather than '1' as second parameter to F.
diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h
index d0dd8ca..5c6140d 100644
--- a/gcc/config/i386/i386-protos.h
+++ b/gcc/config/i386/i386-protos.h
@@ -44,6 +44,7 @@ extern int symbolic_reference_mentioned_p (rtx);
extern bool extended_reg_mentioned_p (rtx);
extern bool x86_extended_QIreg_mentioned_p (rtx);
extern bool x86_extended_reg_mentioned_p (rtx);
+extern bool x86_maybe_negate_const_int (rtx *, enum machine_mode);
extern enum machine_mode ix86_cc_mode (enum rtx_code, rtx, rtx);
extern int avx_vpermilp_parallel (rtx par, enum machine_mode mode);
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index cfd2270..d498b47 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -26202,10 +26202,7 @@ x86_output_mi_thunk (FILE *file,
/* Adjust the this parameter by a fixed constant. */
if (delta)
{
- /* Make things pretty and `subl $4,%eax' rather than `addl $-4,%eax'.
- Exceptions: -128 encodes smaller than 128, so swap sign and op. */
- bool sub = delta < 0 || delta == 128;
- xops[0] = GEN_INT (sub ? -delta : delta);
+ xops[0] = GEN_INT (delta);
xops[1] = this_reg ? this_reg : this_param;
if (TARGET_64BIT)
{
@@ -26217,12 +26214,12 @@ x86_output_mi_thunk (FILE *file,
xops[0] = tmp;
xops[1] = this_param;
}
- if (sub)
+ if (x86_maybe_negate_const_int (&xops[0], DImode))
output_asm_insn ("sub{q}\t{%0, %1|%1, %0}", xops);
else
output_asm_insn ("add{q}\t{%0, %1|%1, %0}", xops);
}
- else if (sub)
+ else if (x86_maybe_negate_const_int (&xops[0], SImode))
output_asm_insn ("sub{l}\t{%0, %1|%1, %0}", xops);
else
output_asm_insn ("add{l}\t{%0, %1|%1, %0}", xops);
@@ -26649,6 +26646,52 @@ x86_extended_reg_mentioned_p (rtx insn)
extended_reg_mentioned_1, NULL);
}
+/* If profitable, negate (without causing overflow) integer constant
+ of mode MODE at location LOC. Return true in this case. */
+bool
+x86_maybe_negate_const_int (rtx *loc, enum machine_mode mode)
+{
+ HOST_WIDE_INT val;
+
+ if (!CONST_INT_P (*loc))
+ return false;
+
+ switch (mode)
+ {
+ case DImode:
+ /* DImode x86_64 constants must fit in 32 bits. */
+ gcc_assert (x86_64_immediate_operand (*loc, mode));
+
+ mode = SImode;
+ break;
+
+ case SImode:
+ case HImode:
+ case QImode:
+ break;
+
+ default:
+ gcc_unreachable ();
+ }
+
+ /* Avoid overflows. */
+ if (mode_signbit_p (mode, *loc))
+ return false;
+
+ val = INTVAL (*loc);
+
+ /* Make things pretty and `subl $4,%eax' rather than `addl $-4,%eax'.
+ Exceptions: -128 encodes smaller than 128, so swap sign and op. */
+ if ((val < 0 && val != -128)
+ || val == 128)
+ {
+ *loc = GEN_INT (-val);
+ return true;
+ }
+
+ return false;
+}
+
/* Generate an unsigned DImode/SImode to FP conversion. This is the same code
optabs would emit if we didn't have TFmode patterns. */
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 376d10e..8bd8e0f 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -6010,20 +6010,9 @@
return "add{<imodesuffix>}\t{%1, %0|%0, %1}";
gcc_assert (rtx_equal_p (operands[0], operands[1]));
+ if (x86_maybe_negate_const_int (&operands[2], <MODE>mode))
+ return "sub{<imodesuffix>}\t{%2, %0|%0, %2}";
- /* Make things pretty and `subl $4,%eax' rather than `addl $-4,%eax'.
- Exceptions: -128 encodes smaller than 128, so swap sign and op. */
- if (CONST_INT_P (operands[2])
- /* Avoid overflows. */
- && (<MODE>mode != DImode
- || ((INTVAL (operands[2]) & ((((unsigned int) 1) << 31) - 1))))
- && (INTVAL (operands[2]) == 128
- || (INTVAL (operands[2]) < 0
- && INTVAL (operands[2]) != -128)))
- {
- operands[2] = GEN_INT (-INTVAL (operands[2]));
- return "sub{<imodesuffix>}\t{%2, %0|%0, %2}";
- }
return "add{<imodesuffix>}\t{%2, %0|%0, %2}";
}
}
@@ -6078,16 +6067,9 @@
}
default:
- /* Make things pretty and `subl $4,%eax' rather than `addl $-4,%eax'.
- Exceptions: -128 encodes smaller than 128, so swap sign and op. */
- if (CONST_INT_P (operands[2])
- && (INTVAL (operands[2]) == 128
- || (INTVAL (operands[2]) < 0
- && INTVAL (operands[2]) != -128)))
- {
- operands[2] = GEN_INT (-INTVAL (operands[2]));
- return "sub{l}\t{%2, %k0|%k0, %2}";
- }
+ if (x86_maybe_negate_const_int (&operands[2], SImode))
+ return "sub{l}\t{%2, %k0|%k0, %2}";
+
return "add{l}\t{%2, %k0|%k0, %2}";
}
}
@@ -6129,16 +6111,9 @@
}
default:
- /* Make things pretty and `subw $4,%ax' rather than `addw $-4,%ax'.
- Exceptions: -128 encodes smaller than 128, so swap sign and op. */
- if (CONST_INT_P (operands[2])
- && (INTVAL (operands[2]) == 128
- || (INTVAL (operands[2]) < 0
- && INTVAL (operands[2]) != -128)))
- {
- operands[2] = GEN_INT (-INTVAL (operands[2]));
- return "sub{w}\t{%2, %0|%0, %2}";
- }
+ if (x86_maybe_negate_const_int (&operands[2], HImode))
+ return "sub{w}\t{%2, %0|%0, %2}";
+
return "add{w}\t{%2, %0|%0, %2}";
}
}
@@ -6179,16 +6154,9 @@
}
default:
- /* Make things pretty and `subw $4,%ax' rather than `addw $-4,%ax'.
- Exceptions: -128 encodes smaller than 128, so swap sign and op. */
- if (CONST_INT_P (operands[2])
- && (INTVAL (operands[2]) == 128
- || (INTVAL (operands[2]) < 0
- && INTVAL (operands[2]) != -128)))
- {
- operands[2] = GEN_INT (-INTVAL (operands[2]));
- return "sub{w}\t{%2, %0|%0, %2}";
- }
+ if (x86_maybe_negate_const_int (&operands[2], HImode))
+ return "sub{w}\t{%2, %0|%0, %2}";
+
return "add{w}\t{%2, %0|%0, %2}";
}
}
@@ -6226,14 +6194,8 @@
}
default:
- /* Make things pretty and `subb $4,%al' rather than `addb $-4,%al'.
- Exceptions: -128 encodes smaller than 128, so swap sign and op. */
- if (CONST_INT_P (operands[2])
- && (INTVAL (operands[2]) == 128
- || (INTVAL (operands[2]) < 0
- && INTVAL (operands[2]) != -128)))
+ if (x86_maybe_negate_const_int (&operands[2], QImode))
{
- operands[2] = GEN_INT (-INTVAL (operands[2]));
if (widen)
return "sub{l}\t{%2, %k0|%k0, %2}";
else
@@ -6280,14 +6242,8 @@
}
default:
- /* Make things pretty and `subb $4,%al' rather than `addb $-4,%al'.
- Exceptions: -128 encodes smaller than 128, so swap sign and op. */
- if (CONST_INT_P (operands[2])
- && (INTVAL (operands[2]) == 128
- || (INTVAL (operands[2]) < 0
- && INTVAL (operands[2]) != -128)))
+ if (x86_maybe_negate_const_int (&operands[2], QImode))
{
- operands[2] = GEN_INT (-INTVAL (operands[2]));
if (widen)
return "sub{l}\t{%2, %k0|%k0, %2}";
else
@@ -6332,13 +6288,9 @@
}
default:
- /* Make things pretty and `subb $4,%al' rather than `addb $-4,%al'. */
- if (CONST_INT_P (operands[1])
- && INTVAL (operands[1]) < 0)
- {
- operands[1] = GEN_INT (-INTVAL (operands[1]));
- return "sub{b}\t{%1, %0|%0, %1}";
- }
+ if (x86_maybe_negate_const_int (&operands[1], QImode))
+ return "sub{b}\t{%1, %0|%0, %1}";
+
return "add{b}\t{%1, %0|%0, %1}";
}
}
@@ -6383,19 +6335,9 @@
gcc_assert (rtx_equal_p (operands[0], operands[1]));
/* ???? In DImode, we ought to handle there the 32bit case too
- do we need new constraint? */
- /* Make things pretty and `subl $4,%eax' rather than `addl $-4,%eax'.
- Exceptions: -128 encodes smaller than 128, so swap sign and op. */
- if (CONST_INT_P (operands[2])
- /* Avoid overflows. */
- && (<MODE>mode != DImode
- || ((INTVAL (operands[2]) & ((((unsigned int) 1) << 31) - 1))))
- && (INTVAL (operands[2]) == 128
- || (INTVAL (operands[2]) < 0
- && INTVAL (operands[2]) != -128)))
- {
- operands[2] = GEN_INT (-INTVAL (operands[2]));
- return "sub{<imodesuffix>}\t{%2, %0|%0, %2}";
- }
+ if (x86_maybe_negate_const_int (&operands[2], <MODE>mode))
+ return "sub{<imodesuffix>}\t{%2, %0|%0, %2}";
+
return "add{<imodesuffix>}\t{%2, %0|%0, %2}";
}
}
@@ -6437,16 +6379,9 @@
}
default:
- /* Make things pretty and `subl $4,%eax' rather than `addl $-4,%eax'.
- Exceptions: -128 encodes smaller than 128, so swap sign and op. */
- if (CONST_INT_P (operands[2])
- && (INTVAL (operands[2]) == 128
- || (INTVAL (operands[2]) < 0
- && INTVAL (operands[2]) != -128)))
- {
- operands[2] = GEN_INT (-INTVAL (operands[2]));
- return "sub{l}\t{%2, %k0|%k0, %2}";
- }
+ if (x86_maybe_negate_const_int (&operands[2], SImode))
+ return "sub{l}\t{%2, %k0|%k0, %2}";
+
return "add{l}\t{%2, %k0|%k0, %2}";
}
}
@@ -6484,16 +6419,9 @@
}
default:
- /* Make things pretty and `subw $4,%ax' rather than `addw $-4,%ax'.
- Exceptions: -128 encodes smaller than 128, so swap sign and op. */
- if (CONST_INT_P (operands[2])
- && (INTVAL (operands[2]) == 128
- || (INTVAL (operands[2]) < 0
- && INTVAL (operands[2]) != -128)))
- {
- operands[2] = GEN_INT (-INTVAL (operands[2]));
- return "sub{w}\t{%2, %0|%0, %2}";
- }
+ if (x86_maybe_negate_const_int (&operands[2], HImode))
+ return "sub{w}\t{%2, %0|%0, %2}";
+
return "add{w}\t{%2, %0|%0, %2}";
}
}
@@ -6533,13 +6461,9 @@
}
default:
- /* Make things pretty and `subb $4,%al' rather than `addb $-4,%al'. */
- if (CONST_INT_P (operands[2])
- && INTVAL (operands[2]) < 0)
- {
- operands[2] = GEN_INT (-INTVAL (operands[2]));
- return "sub{b}\t{%2, %0|%0, %2}";
- }
+ if (x86_maybe_negate_const_int (&operands[2], QImode))
+ return "sub{b}\t{%2, %0|%0, %2}";
+
return "add{b}\t{%2, %0|%0, %2}";
}
}
@@ -6577,19 +6501,9 @@
gcc_assert (rtx_equal_p (operands[0], operands[1]));
/* ???? In DImode, we ought to handle there the 32bit case too
- do we need new constraint? */
- /* Make things pretty and `subl $4,%eax' rather than `addl $-4, %eax'.
- Exceptions: -128 encodes smaller than 128, so swap sign and op. */
- if (CONST_INT_P (operands[2])
- /* Avoid overflows. */
- && (<MODE>mode != DImode
- || ((INTVAL (operands[2]) & ((((unsigned int) 1) << 31) - 1))))
- && (INTVAL (operands[2]) == 128
- || (INTVAL (operands[2]) < 0
- && INTVAL (operands[2]) != -128)))
- {
- operands[2] = GEN_INT (-INTVAL (operands[2]));
- return "sub{<imodesuffix>}\t{%2, %0|%0, %2}";
- }
+ if (x86_maybe_negate_const_int (&operands[2], <MODE>mode))
+ return "sub{<imodesuffix>}\t{%2, %0|%0, %2}";
+
return "add{<imodesuffix>}\t{%2, %0|%0, %2}";
}
}
@@ -6630,16 +6544,9 @@
}
default:
- /* Make things pretty and `subl $4,%eax' rather than `addl $-4,%eax'.
- Exceptions: -128 encodes smaller than 128, so swap sign and op. */
- if (CONST_INT_P (operands[2])
- && (INTVAL (operands[2]) == 128
- || (INTVAL (operands[2]) < 0
- && INTVAL (operands[2]) != -128)))
- {
- operands[2] = GEN_INT (-INTVAL (operands[2]));
- return "sub{l}\t{%2, %k0|%k0, %2}";
- }
+ if (x86_maybe_negate_const_int (&operands[2], SImode))
+ return "sub{l}\t{%2, %k0|%k0, %2}";
+
return "add{l}\t{%2, %k0|%k0, %2}";
}
}
@@ -6675,16 +6582,9 @@
}
default:
- /* Make things pretty and `subw $4,%ax' rather than `addw $-4,%ax'.
- Exceptions: -128 encodes smaller than 128, so swap sign and op. */
- if (CONST_INT_P (operands[2])
- && (INTVAL (operands[2]) == 128
- || (INTVAL (operands[2]) < 0
- && INTVAL (operands[2]) != -128)))
- {
- operands[2] = GEN_INT (-INTVAL (operands[2]));
- return "sub{w}\t{%2, %0|%0, %2}";
- }
+ if (x86_maybe_negate_const_int (&operands[2], HImode))
+ return "sub{w}\t{%2, %0|%0, %2}";
+
return "add{w}\t{%2, %0|%0, %2}";
}
}
@@ -6722,13 +6622,9 @@
}
default:
- /* Make things pretty and `subb $4,%al' rather than `addb $-4,%al'. */
- if (CONST_INT_P (operands[2])
- && INTVAL (operands[2]) < 0)
- {
- operands[2] = GEN_INT (-INTVAL (operands[2]));
- return "sub{b}\t{%2, %0|%0, %2}";
- }
+ if (x86_maybe_negate_const_int (&operands[2], QImode))
+ return "sub{b}\t{%2, %0|%0, %2}";
+
return "add{b}\t{%2, %0|%0, %2}";
}
}
@@ -6742,8 +6638,6 @@
; by converting cmp to add, inc or dec as done by peephole2. This pattern
; is matched then. We can't accept general immediate, because for
; case of overflows, the result is messed up.
-; This pattern also don't hold of 0x8000000000000000, since the value
-; overflows when negated.
; Also carry flag is reversed compared to cmp, so this conversion is valid
; only for comparisons not depending on it.
@@ -6769,16 +6663,10 @@
default:
gcc_assert (rtx_equal_p (operands[0], operands[1]));
- /* Make things pretty and `subl $4,%eax' rather than `addl $-4,%eax'.
- Exceptions: -128 encodes smaller than 128, so swap sign and op. */
- if ((INTVAL (operands[2]) == -128
- || (INTVAL (operands[2]) > 0
- && INTVAL (operands[2]) != 128))
- /* Avoid overflows. */
- && ((INTVAL (operands[2]) & ((((unsigned int) 1) << 31) - 1))))
- return "sub{q}\t{%2, %0|%0, %2}";
- operands[2] = GEN_INT (-INTVAL (operands[2]));
- return "add{q}\t{%2, %0|%0, %2}";
+ if (x86_maybe_negate_const_int (&operands[2], DImode))
+ return "add{q}\t{%2, %0|%0, %2}";
+
+ return "sub{q}\t{%2, %0|%0, %2}";
}
}
[(set (attr "type")
@@ -6796,8 +6684,6 @@
; by converting cmp to add, inc or dec as done by peephole2. This pattern
; is matched then. We can't accept general immediate, because for
; case of overflows, the result is messed up.
-; This pattern also don't hold of 0x80000000, since the value overflows
-; when negated.
; Also carry flag is reversed compared to cmp, so this conversion is valid
; only for comparisons not depending on it.
@@ -6807,8 +6693,7 @@
(match_operand:SI 1 "nonimmediate_operand" "0")
(match_operand:SI 2 "const_int_operand" "n")))
(clobber (match_scratch:SI 0 "=rm"))]
- "ix86_match_ccmode (insn, CCGCmode)
- && (INTVAL (operands[2]) & 0xffffffff) != 0x80000000"
+ "ix86_match_ccmode (insn, CCGCmode)"
{
switch (get_attr_type (insn))
{
@@ -6823,14 +6708,10 @@
default:
gcc_assert (rtx_equal_p (operands[0], operands[1]));
- /* Make things pretty and `subl $4,%eax' rather than `addl $-4,%eax'.
- Exceptions: -128 encodes smaller than 128, so swap sign and op. */
- if ((INTVAL (operands[2]) == -128
- || (INTVAL (operands[2]) > 0
- && INTVAL (operands[2]) != 128)))
- return "sub{l}\t{%2, %0|%0, %2}";
- operands[2] = GEN_INT (-INTVAL (operands[2]));
- return "add{l}\t{%2, %0|%0, %2}";
+ if (x86_maybe_negate_const_int (&operands[2], SImode))
+ return "add{l}\t{%2, %0|%0, %2}";
+
+ return "sub{l}\t{%2, %0|%0, %2}";
}
}
[(set (attr "type")
@@ -6852,8 +6733,7 @@
(match_operand:HI 1 "nonimmediate_operand" "0")
(match_operand:HI 2 "const_int_operand" "n")))
(clobber (match_scratch:HI 0 "=rm"))]
- "ix86_match_ccmode (insn, CCGCmode)
- && (INTVAL (operands[2]) & 0xffff) != 0x8000"
+ "ix86_match_ccmode (insn, CCGCmode)"
{
switch (get_attr_type (insn))
{
@@ -6868,14 +6748,10 @@
default:
gcc_assert (rtx_equal_p (operands[0], operands[1]));
- /* Make things pretty and `subw $4,%ax' rather than `addw $-4,%ax'.
- Exceptions: -128 encodes smaller than 128, so swap sign and op. */
- if ((INTVAL (operands[2]) == -128
- || (INTVAL (operands[2]) > 0
- && INTVAL (operands[2]) != 128)))
- return "sub{w}\t{%2, %0|%0, %2}";
- operands[2] = GEN_INT (-INTVAL (operands[2]));
- return "add{w}\t{%2, %0|%0, %2}";
+ if (x86_maybe_negate_const_int (&operands[2], HImode))
+ return "add{w}\t{%2, %0|%0, %2}";
+
+ return "sub{w}\t{%2, %0|%0, %2}";
}
}
[(set (attr "type")
@@ -6897,8 +6773,7 @@
(match_operand:QI 1 "nonimmediate_operand" "0")
(match_operand:QI 2 "const_int_operand" "n")))
(clobber (match_scratch:QI 0 "=qm"))]
- "ix86_match_ccmode (insn, CCGCmode)
- && (INTVAL (operands[2]) & 0xff) != 0x80"
+ "ix86_match_ccmode (insn, CCGCmode)"
{
switch (get_attr_type (insn))
{
@@ -6915,11 +6790,9 @@
default:
gcc_assert (rtx_equal_p (operands[0], operands[1]));
- if (INTVAL (operands[2]) < 0)
- {
- operands[2] = GEN_INT (-INTVAL (operands[2]));
- return "add{b}\t{%2, %0|%0, %2}";
- }
+ if (x86_maybe_negate_const_int (&operands[2], QImode))
+ return "add{b}\t{%2, %0|%0, %2}";
+
return "sub{b}\t{%2, %0|%0, %2}";
}
}
@@ -6957,19 +6830,9 @@
default:
gcc_assert (rtx_equal_p (operands[0], operands[1]));
- /* Make things pretty and `subl $4,%eax' rather than `addl $-4,%eax'.
- Exceptions: -128 encodes smaller than 128, so swap sign and op. */
- if (CONST_INT_P (operands[2])
- /* Avoid overflows. */
- && (<MODE>mode != DImode
- || ((INTVAL (operands[2]) & ((((unsigned int) 1) << 31) - 1))))
- && (INTVAL (operands[2]) == 128
- || (INTVAL (operands[2]) < 0
- && INTVAL (operands[2]) != -128)))
- {
- operands[2] = GEN_INT (-INTVAL (operands[2]));
- return "sub{<imodesuffix>}\t{%2, %0|%0, %2}";
- }
+ if (x86_maybe_negate_const_int (&operands[2], <MODE>mode))
+ return "sub{<imodesuffix>}\t{%2, %0|%0, %2}";
+
return "add{<imodesuffix>}\t{%2, %0|%0, %2}";
}
}
@@ -7006,16 +6869,9 @@
}
default:
- /* Make things pretty and `subw $4,%ax' rather than `addw $-4,%ax'.
- Exceptions: -128 encodes smaller than 128, so swap sign and op. */
- if (CONST_INT_P (operands[2])
- && (INTVAL (operands[2]) == 128
- || (INTVAL (operands[2]) < 0
- && INTVAL (operands[2]) != -128)))
- {
- operands[2] = GEN_INT (-INTVAL (operands[2]));
- return "sub{w}\t{%2, %0|%0, %2}";
- }
+ if (x86_maybe_negate_const_int (&operands[2], HImode))
+ return "sub{w}\t{%2, %0|%0, %2}";
+
return "add{w}\t{%2, %0|%0, %2}";
}
}
@@ -7054,13 +6910,9 @@
}
default:
- /* Make things pretty and `subb $4,%al' rather than `addb $-4,%al'. */
- if (CONST_INT_P (operands[2])
- && INTVAL (operands[2]) < 0)
- {
- operands[2] = GEN_INT (-INTVAL (operands[2]));
- return "sub{b}\t{%2, %0|%0, %2}";
- }
+ if (x86_maybe_negate_const_int (&operands[2], QImode))
+ return "sub{b}\t{%2, %0|%0, %2}";
+
return "add{b}\t{%2, %0|%0, %2}";
}
}
diff --git a/gcc/config/i386/sync.md b/gcc/config/i386/sync.md
index 0df85c7..feea161 100644
--- a/gcc/config/i386/sync.md
+++ b/gcc/config/i386/sync.md
@@ -202,6 +202,9 @@
return "lock{%;| }dec{<imodesuffix>}\t%0";
}
+ if (x86_maybe_negate_const_int (&operands[1], <MODE>mode))
+ return "lock{%;| }sub{<imodesuffix>}\t{%1, %0|%0, %1}";
+
return "lock{%;| }add{<imodesuffix>}\t{%1, %0|%0, %1}";
})