]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
i386: Fix the order of operands in andn<MMXMODEI:mode>3 [PR117192]
authorUros Bizjak <ubizjak@gmail.com>
Fri, 18 Oct 2024 14:04:12 +0000 (16:04 +0200)
committerUros Bizjak <ubizjak@gmail.com>
Fri, 18 Oct 2024 14:04:57 +0000 (16:04 +0200)
Fix the order of operands in andn<MMXMODEI:mode>3 expander to comply
with the specification, where bitwise-complement applies to operand 2.

PR target/117192

gcc/ChangeLog:

* config/i386/mmx.md (andn<MMXMODEI:mode>3): Swap operand
indexes 1 and 2 to comply with andn specification.

gcc/testsuite/ChangeLog:

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

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

index ef4ed8b501a170292aa4eb60eb2b03b37cec008c..506f4cab6a811c37d92e133278f0ab6656aaf6e6 100644 (file)
 (define_expand "andn<mode>3"
   [(set (match_operand:MMXMODEI 0 "register_operand")
         (and:MMXMODEI
-          (not:MMXMODEI (match_operand:MMXMODEI 1 "register_operand"))
-          (match_operand:MMXMODEI 2 "register_operand")))]
-  "TARGET_SSE2")
+          (not:MMXMODEI (match_operand:MMXMODEI 2 "register_operand"))
+          (match_operand:MMXMODEI 1 "register_operand")))]
+  "TARGET_MMX_WITH_SSE")
 
 (define_insn "mmx_andnot<mode>3"
   [(set (match_operand:MMXMODEI 0 "register_operand" "=y,x,x,v")
diff --git a/gcc/testsuite/gcc.target/i386/pr117192.c b/gcc/testsuite/gcc.target/i386/pr117192.c
new file mode 100644 (file)
index 0000000..8480c72
--- /dev/null
@@ -0,0 +1,16 @@
+/* PR target/117192 */
+/* { dg-do run } */
+/* { dg-options "-O3 -fno-unswitch-loops" } */
+
+int a, b, c, d;
+int main() {
+  int e[6];
+  for (d = 0; d < 6; d++)
+    if (!c)
+      e[d] = 0;
+  for (; b < 6; b++)
+    a = e[b];
+  if (a != 0)
+    __builtin_abort();
+  return 0;
+}