i386.md (cmpqi_minus_1): Use q constraints instead of r.
authorJakub Jelinek <jakub@redhat.com>
Wed, 17 Jan 2001 12:32:49 +0000 (13:32 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 17 Jan 2001 12:32:49 +0000 (13:32 +0100)
* config/i386/i386.md (cmpqi_minus_1): Use q constraints instead of r.

* gcc.c-torture/compile/20010117-2.c: New test.

From-SVN: r39093

gcc/ChangeLog
gcc/config/i386/i386.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/20010117-2.c [new file with mode: 0644]

index 2ab5dce2ccdf797c698fb84961e5802193f2bffb..37baa52a7ebeec6ee7a817833de7bb3bd7908eb9 100644 (file)
@@ -1,6 +1,7 @@
 2001-01-17  Jakub Jelinek  <jakub@redhat.com>
 
        * config/i386/i386.md (cmpqi_minus_1): Use {b} for QImode operation.
+       Use q constraints instead of r.
 
 Tue Jan 16 22:23:04 2001  Alan Modra (alan@linuxcare.com.au)
 
index 99111acee4772727c375d74407d15b4151442083..125b9fc6a5d590d584377381fc992eac2d3febd7 100644 (file)
 
 (define_insn "*cmpqi_minus_1"
   [(set (reg 17)
-       (compare (minus:QI (match_operand:QI 0 "nonimmediate_operand" "rm,r")
-                          (match_operand:QI 1 "general_operand" "ri,mr"))
+       (compare (minus:QI (match_operand:QI 0 "nonimmediate_operand" "qm,q")
+                          (match_operand:QI 1 "general_operand" "qi,mq"))
                 (const_int 0)))]
   "ix86_match_ccmode (insn, CCGOCmode)"
   "cmp{b}\\t{%1, %0|%0, %1}"
index 7ff22a20a8a2adf7d3512fadbdd62bd5383c4610..4dc5f061b318528ea1c9bab42c2d310627a100fd 100644 (file)
@@ -1,6 +1,7 @@
 2001-01-17  Jakub Jelinek  <jakub@redhat.com>
 
        * gcc.c-torture/compile/20010117-1.c: New test.
+       * gcc.c-torture/compile/20010117-2.c: New test.
 
 2001-01-15  Toon Moene  <toon@moene.indiv.nluug.nl>
 
diff --git a/gcc/testsuite/gcc.c-torture/compile/20010117-2.c b/gcc/testsuite/gcc.c-torture/compile/20010117-2.c
new file mode 100644 (file)
index 0000000..813468b
--- /dev/null
@@ -0,0 +1,20 @@
+unsigned char a, b;
+
+void baz (void)
+{
+  if (b & 0x08)
+    {
+      int g = 0;
+      int c = (b & 0x01);
+      int d = a - g - c;
+      int e = (a & 0x0f) - (g & 0x0f);
+      int f = (a & 0xf0) - (g & 0xf0);
+      int h = (a & 0x0f) - (g & 0x0f);
+
+      if ((a ^ g) & (a ^ d) & 0x80) b |= 0x40;
+      if ((d & 0xff00) == 0) b |= 0x01;
+      if (!((a - h - c) & 0xff)) b |= 0x02;
+      if ((a - g - c) & 0x80) b |= 0x80;
+      a = (e & 0x0f) | (f & 0xf0);
+    }
+}