aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Van Artsdalen <jrv@gnu.org>1992-10-12 21:38:15 +0000
committerJames Van Artsdalen <jrv@gnu.org>1992-10-12 21:38:15 +0000
commit981661494522a10d35c902192629f28189372773 (patch)
tree3fdced49c46528634c15f68de2680323902d6e4f
parentb329456eff9087db32b6dd24e8300ef59821f07c (diff)
downloadgcc-981661494522a10d35c902192629f28189372773.zip
gcc-981661494522a10d35c902192629f28189372773.tar.gz
gcc-981661494522a10d35c902192629f28189372773.tar.bz2
(cmpstrM patterns): Compare strings of unsigned chars, not strings of
signed chars. From-SVN: r2414
-rw-r--r--gcc/config/i386/i386.md17
1 files changed, 11 insertions, 6 deletions
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index dfd8fa6..f7dd53f 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -3976,7 +3976,7 @@
}")
(define_expand "cmpstrsi"
- [(parallel [(set (match_operand:QI 0 "general_operand" "")
+ [(parallel [(set (match_operand:SI 0 "general_operand" "")
(compare:CC (match_operand:BLK 1 "general_operand" "")
(match_operand:BLK 2 "general_operand" "")))
(use (match_operand:SI 3 "general_operand" ""))
@@ -4013,7 +4013,7 @@
;; code to handle zero-length compares.
(define_insn ""
- [(set (match_operand:QI 0 "general_operand" "=&q")
+ [(set (match_operand:SI 0 "general_operand" "=&r")
(compare:CC (mem:BLK (match_operand:SI 1 "address_operand" "S"))
(mem:BLK (match_operand:SI 2 "address_operand" "D"))))
(use (match_operand:SI 3 "register_operand" "c"))
@@ -4024,12 +4024,12 @@
""
"*
{
- rtx xops[3], label;
+ rtx xops[4], label;
label = gen_label_rtx ();
output_asm_insn (\"cld\", operands);
- output_asm_insn (AS2 (xor%B0,%0,%0), operands);
+ output_asm_insn (AS2 (xor%L0,%0,%0), operands);
output_asm_insn (\"repz\;cmps%B2\", operands);
output_asm_insn (\"je %l0\", &label);
@@ -4038,9 +4038,12 @@
gen_rtx (PLUS, SImode, operands[1], constm1_rtx));
xops[2] = gen_rtx (MEM, QImode,
gen_rtx (PLUS, SImode, operands[2], constm1_rtx));
+ xops[3] = operands[3];
- output_asm_insn (AS2 (mov%B0,%1,%b0), xops);
- output_asm_insn (AS2 (sub%B0,%2,%b0), xops);
+ output_asm_insn (AS2 (movz%B1%L0,%1,%0), xops);
+ output_asm_insn (AS2 (movz%B2%L3,%2,%3), xops);
+
+ output_asm_insn (AS2 (sub%L0,%3,%0), xops);
ASM_OUTPUT_INTERNAL_LABEL (asm_out_file, \"L\", CODE_LABEL_NUMBER (label));
RET;
}")
@@ -4059,6 +4062,8 @@
{
rtx xops[2];
+ cc_status.flags |= CC_NOT_SIGNED;
+
xops[0] = gen_rtx (REG, QImode, 0);
xops[1] = CONST0_RTX (QImode);