From: Uros Bizjak Date: Thu, 21 Dec 2023 12:50:26 +0000 (+0100) Subject: i386: Fix shifts with high register input operand [PR113044] X-Git-Tag: basepoints/gcc-15~3352 X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fgcc.git;a=commitdiff_plain;h=2766b83759a02572b7b303aae3d4b54a351f8f96 i386: Fix shifts with high register input operand [PR113044] The move to the output operand should use high register input operand. PR target/113044 gcc/ChangeLog: * config/i386/i386.md (*ashlqi_ext_1): Move from the high register of the input operand. (*qi_ext_1): Ditto. gcc/testsuite/ChangeLog: * gcc.target/i386/pr113044.c: New test. --- diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 710068e90933..4c6368bf3b72 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -15527,7 +15527,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)) @@ -16689,7 +16690,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 index 000000000000..923e7f48299d --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr113044.c @@ -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; +}