diff options
Diffstat (limited to 'gcc/config/i386')
-rw-r--r-- | gcc/config/i386/i386.md | 22 |
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) |