i386: Fix the order of operands in andn<MMXMODEI:mode>3 [PR117192]

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.
This commit is contained in:
Uros Bizjak 2024-10-18 16:04:12 +02:00
parent d0a9ae1321
commit 3a12ac4032
2 changed files with 19 additions and 3 deletions

View file

@ -4470,9 +4470,9 @@
(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")

View file

@ -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;
}