]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
i386: Fix shifts with high register input operand [PR113044]
authorUros Bizjak <ubizjak@gmail.com>
Thu, 21 Dec 2023 12:50:26 +0000 (13:50 +0100)
committerUros Bizjak <ubizjak@gmail.com>
Thu, 21 Dec 2023 14:58:03 +0000 (15:58 +0100)
The move to the output operand should use high register input operand.

PR target/113044

gcc/ChangeLog:

* config/i386/i386.md (*ashlqi_ext<mode>_1): Move from the
high register of the input operand.
(*<insn>qi_ext<mode>_1): Ditto.

gcc/testsuite/ChangeLog:

* gcc.target/i386/pr113044.c: New test.

gcc/config/i386/i386.md
gcc/testsuite/gcc.target/i386/pr113044.c [new file with mode: 0644]

index 710068e9093359584a3acbd87026630007681309..4c6368bf3b72a7fb2defe8a5cf777b1bb1a24f09 100644 (file)
    && !(rtx_equal_p (operands[0], operands[1]))"
   [(set (zero_extract:SWI248
          (match_dup 0) (const_int 8) (const_int 8))
-       (match_dup 1))
+       (zero_extract:SWI248
+         (match_dup 1) (const_int 8) (const_int 8)))
    (parallel
      [(set (zero_extract:SWI248
             (match_dup 0) (const_int 8) (const_int 8))
    && !(rtx_equal_p (operands[0], operands[1]))"
   [(set (zero_extract:SWI248
          (match_dup 0) (const_int 8) (const_int 8))
-       (match_dup 1))
+       (zero_extract:SWI248
+         (match_dup 1) (const_int 8) (const_int 8)))
    (parallel
      [(set (zero_extract:SWI248
             (match_dup 0) (const_int 8) (const_int 8))
diff --git a/gcc/testsuite/gcc.target/i386/pr113044.c b/gcc/testsuite/gcc.target/i386/pr113044.c
new file mode 100644 (file)
index 0000000..923e7f4
--- /dev/null
@@ -0,0 +1,24 @@
+/* PR target/113044 */
+/* { dg-do run } */
+/* { dg-options "-O" } */
+
+typedef unsigned char __attribute__((__vector_size__ (2))) V;
+
+V
+foo (char c, V v)
+{
+  V x = v >> (v & 8);
+  volatile char d = c;
+  if (!d)
+    __builtin_abort();
+  return x;
+}
+
+int
+main (void)
+{
+  V x = foo (10, (V){3});
+  if (x[0] != 3 || x[1])
+    __builtin_abort();
+  return 0;
+}