i386.md (addqi_1_lea): Fix mode (QI instead of HI).
authorJakub Jelinek <jakub@redhat.com>
Mon, 29 Jan 2001 18:31:35 +0000 (19:31 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 29 Jan 2001 18:31:35 +0000 (19:31 +0100)
* config/i386/i386.md (addqi_1_lea): Fix mode (QI instead of HI).
(testqi_1, andqi_2): If widening to SImode, make sure CONST_INT does
not have any upper bits set.

* gcc.c-torture/execute/20010129-1.c: New test.
* gcc.c-torture/execute/20010129-1.x: Add -mcpu=i686 on ia32.

From-SVN: r39331

gcc/ChangeLog
gcc/config/i386/i386.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/20010129-1.c [new file with mode: 0644]
gcc/testsuite/gcc.c-torture/execute/20010129-1.x [new file with mode: 0644]

index 5b79236b3b363826c85b0bbcb127c7caa708b5a6..3123cf60a8d70f171094f92bf87b0f2b1f897ea6 100644 (file)
@@ -1,3 +1,9 @@
+2001-01-29  Jakub Jelinek  <jakub@redhat.com>
+
+       * config/i386/i386.md (addqi_1_lea): Fix mode (QI instead of HI).
+       (testqi_1, andqi_2): If widening to SImode, make sure CONST_INT does
+       not have any upper bits set.
+
 2001-01-29  Phil Edwards  <pme@sources.redhat.com>
 
        * COPYING.LIB:  Update to LGPL 2.1 from the FSF.
index 125b9fc6a5d590d584377381fc992eac2d3febd7..df16d5b608deda166332363185c5452f9f5926cf 100644 (file)
   [(set (attr "type")
      (if_then_else (eq_attr "alternative" "3")
        (const_string "lea")
-       (if_then_else (match_operand:HI 2 "incdec_operand" "")
+       (if_then_else (match_operand:QI 2 "incdec_operand" "")
           (const_string "incdec")
           (const_string "alu"))))
-   (set_attr "mode" "HI,HI,SI,SI")])
+   (set_attr "mode" "QI,QI,SI,SI")])
 
 (define_insn "*addqi_1"
   [(set (match_operand:QI 0 "nonimmediate_operand" "=qm,q,r")
                         (match_operand:QI 1 "nonmemory_operand" "n,n,qn,n"))
                 (const_int 0)))]
   "ix86_match_ccmode (insn, CCNOmode)"
-  "@
-   test{b}\\t{%1, %0|%0, %1} 
-   test{b}\\t{%1, %0|%0, %1} 
-   test{b}\\t{%1, %0|%0, %1} 
-   test{l}\\t{%1, %k0|%k0, %1}"
+  "*
+{
+  if (which_alternative == 3)
+    {
+      if (GET_CODE (operands[1]) == CONST_INT
+         && (INTVAL (operands[1]) & 0xffffff00))
+       operands[1] = GEN_INT (INTVAL (operands[1]) & 0xff);
+      return \"test{l}\\t{%1, %k0|%k0, %1}\";
+    }
+  return \"test{b}\\t{%1, %0|%0, %1}\";
+}"
   [(set_attr "type" "test")
    (set_attr "modrm" "0,1,1,1")
    (set_attr "mode" "QI,QI,QI,SI")
        (and:QI (match_dup 1) (match_dup 2)))]
   "ix86_match_ccmode (insn, CCNOmode)
    && ix86_binary_operator_ok (AND, QImode, operands)"
-  "@
-   and{b}\\t{%2, %0|%0, %2}
-   and{b}\\t{%2, %0|%0, %2}
-   and{l}\\t{%2, %k0|%k0, %2}"
+  "*
+{
+  if (which_alternative == 2)
+    {
+      if (GET_CODE (operands[2]) == CONST_INT
+          && (INTVAL (operands[2]) & 0xffffff00))
+        operands[2] = GEN_INT (INTVAL (operands[2]) & 0xff);
+      return \"and{l}\\t{%2, %k0|%k0, %2}\";
+    }
+  return \"and{b}\\t{%2, %0|%0, %2}\";
+}"
   [(set_attr "type" "alu")
    (set_attr "mode" "QI,QI,SI")])
 
index d5e7c9e88a875776b0904ab14c766a9c873b2000..74015cffbfcbf7d0217977d9c0702b5f24cb18af 100644 (file)
@@ -1,3 +1,8 @@
+2001-01-29  Jakub Jelinek  <jakub@redhat.com>
+
+       * gcc.c-torture/execute/20010129-1.c: New test.
+       * gcc.c-torture/execute/20010129-1.x: Add -mcpu=i686 on ia32.
+
 2001-01-28  Neil Booth  <neil@daikokuya.demon.co.uk>
 
         * gcc.dg/cpp/avoidpaste1.c: Test case.
diff --git a/gcc/testsuite/gcc.c-torture/execute/20010129-1.c b/gcc/testsuite/gcc.c-torture/execute/20010129-1.c
new file mode 100644 (file)
index 0000000..a4ea5e4
--- /dev/null
@@ -0,0 +1,64 @@
+long baz1 (void *a)
+{
+  static long l;
+  return l++;
+}
+
+int baz2 (const char *a)
+{
+  return 0;
+}
+
+int baz3 (int i)
+{
+  if (!i)
+    abort ();
+  return 1;
+}
+
+void **bar;
+
+int foo (void *a, long b, int c)
+{
+  int d = 0, e, f = 0, i;
+  char g[256];
+  void **h;
+
+  g[0] = '\n';
+  g[1] = 0;
+
+  while (baz1 (a) < b) {
+    if (g[0] != ' ' && g[0] != '\t') {
+      f = 1;
+      e = 0;
+      if (!d && baz2 (g) == 0) {
+       if ((c & 0x10) == 0)
+         continue;
+       e = d = 1;
+      }
+      if (!((c & 0x10) && (c & 0x4000) && e) && (c & 2))
+       continue;
+      if ((c & 0x2000) && baz2 (g) == 0)
+       continue;
+      if ((c & 0x1408) && baz2 (g) == 0)
+       continue;
+      if ((c & 0x200) && baz2 (g) == 0)
+       continue;
+      if (c & 0x80) {
+       for (h = bar, i = 0; h; h = (void **)*h, i++)
+         if (baz3 (i))
+           break;
+      }
+      f = 0;
+    }
+  }
+  return 0;
+}
+
+int main ()
+{
+  void *n = 0;
+  bar = &n;
+  foo (&n, 1, 0xc811);
+  exit (0);
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/20010129-1.x b/gcc/testsuite/gcc.c-torture/execute/20010129-1.x
new file mode 100644 (file)
index 0000000..1d34c19
--- /dev/null
@@ -0,0 +1,4 @@
+if { [istarget "i?86-*-*"] } {
+  set additional_flags "-mcpu=i686"
+}
+return 0