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. Bootstrapped and regression tested on x86_64-linux-gnu {,-m32}. Uros.
diff --git a/gcc/config/i386/mmx.md b/gcc/config/i386/mmx.md index ef4ed8b501a..506f4cab6a8 100644 --- a/gcc/config/i386/mmx.md +++ b/gcc/config/i386/mmx.md @@ -4470,9 +4470,9 @@ (define_split (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 index 00000000000..8480c72dc0e --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr117192.c @@ -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; +}