From 2766b83759a02572b7b303aae3d4b54a351f8f96 Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Thu, 21 Dec 2023 13:50:26 +0100 Subject: [PATCH] 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. --- gcc/config/i386/i386.md | 6 ++++-- gcc/testsuite/gcc.target/i386/pr113044.c | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr113044.c 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; +} -- 2.47.2