aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/i386
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/config/i386')
-rw-r--r--gcc/config/i386/i386.md22
1 files changed, 17 insertions, 5 deletions
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 14a9428..0770422 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -3464,7 +3464,8 @@
(use (match_operand:SI 4 "immediate_operand" ""))
(clobber (match_dup 1))
(clobber (match_dup 2))
- (clobber (match_dup 3))])]
+ (clobber (match_dup 3))
+ (clobber (match_scratch:SI 5 ""))])]
""
"
{
@@ -3481,13 +3482,18 @@
(use (match_operand:SI 4 "immediate_operand" "i"))
(clobber (match_dup 1))
(clobber (match_dup 2))
- (clobber (match_dup 3))]
+ (clobber (match_dup 3))
+ (clobber (match_scratch:SI 5 "=&r"))]
""
"*
{
- rtx xops[3];
+ rtx xops[3], label;
+
+ label = gen_label_rtx ();
+ output_asm_insn (AS2 (xor%B0,%0,%0), operands);
output_asm_insn (\"repz\;cmps%B2\", operands);
+ output_asm_insn (\"je %l0\", &label);
xops[0] = operands[0];
xops[1] = gen_rtx (MEM, QImode,
@@ -3497,6 +3503,7 @@
output_asm_insn (AS2 (mov%B0,%1,%b0), xops);
output_asm_insn (AS2 (sub%B0,%2,%b0), xops);
+ ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (label));
RET;
}")
@@ -3508,9 +3515,14 @@
(use (match_operand:SI 3 "immediate_operand" "i"))
(clobber (match_dup 0))
(clobber (match_dup 1))
- (clobber (match_dup 2))]
+ (clobber (match_dup 2))
+ (clobber (match_scratch:SI 4 "=&r"))]
""
- "repz\;cmps%B2")
+ "*
+{
+ output_asm_insn (AS2 (xor%L4,%4,%4), operands);
+ return \"repz\;cmps%B2\";
+}")
(define_expand "ffssi2"
[(set (match_dup 2)