https://gcc.gnu.org/g:860da841585bcd722ec5a51dfc86efdb5b52f1aa
commit r16-7904-g860da841585bcd722ec5a51dfc86efdb5b52f1aa Author: Jakub Jelinek <[email protected]> Date: Thu Mar 5 09:35:39 2026 +0100 i386: Fix operand order for @wrss<mode> and @wruss<mode> [PR124366] These two insns were using the same operand order for both -masm=att and -masm=intel, which is ok if using the same operand for both, but not when they are different. 2026-03-05 Jakub Jelinek <[email protected]> PR target/124366 * config/i386/i386.md (@wrss<mode>, @wruss<mode>): Swap operand order for -masm=intel. * gcc.target/i386/cet-pr124366.c: New test. Diff: --- gcc/config/i386/i386.md | 4 ++-- gcc/testsuite/gcc.target/i386/cet-pr124366.c | 31 ++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 660098429a2a..5533c6e92d3b 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -30267,7 +30267,7 @@ (match_operand:SWI48 1 "memory_operand" "m")] UNSPECV_WRSS)] "TARGET_SHSTK" - "wrss<mskmodesuffix>\t%0, %1" + "wrss<mskmodesuffix>\t{%0, %1|%1, %0}" [(set_attr "length" "3") (set_attr "type" "other")]) @@ -30276,7 +30276,7 @@ (match_operand:SWI48 1 "memory_operand" "m")] UNSPECV_WRUSS)] "TARGET_SHSTK" - "wruss<mskmodesuffix>\t%0, %1" + "wruss<mskmodesuffix>\t{%0, %1|%1, %0}" [(set_attr "length" "4") (set_attr "type" "other")]) diff --git a/gcc/testsuite/gcc.target/i386/cet-pr124366.c b/gcc/testsuite/gcc.target/i386/cet-pr124366.c new file mode 100644 index 000000000000..30a528299c1e --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/cet-pr124366.c @@ -0,0 +1,31 @@ +/* PR target/124366 */ +/* { dg-do assemble { target { cet && masm_intel } } } */ +/* { dg-options "-O2 -mshstk -masm=intel" } */ + +#include <x86intrin.h> + +void +wrssd (unsigned int x, void *y) +{ + _wrssd (x, y); +} + +void +wrussd (unsigned int x, void *y) +{ + _wrussd (x, y); +} + +#ifdef __x86_64__ +void +wrssq (unsigned long long x, void *y) +{ + _wrssq (x, y); +} + +void +wrussq (unsigned long long x, void *y) +{ + _wrussq (x, y); +} +#endif
