diff options
author | liuhongt <hongtao.liu@intel.com> | 2020-08-12 10:48:17 +0800 |
---|---|---|
committer | liuhongt <hongtao.liu@intel.com> | 2020-08-18 14:19:40 +0800 |
commit | 7d5de349d21479d7ec61dd0153e6f0958ad7384f (patch) | |
tree | a3f1827015012f2fb02787c2d1f15f091cabc408 | |
parent | 6d42cbe5ad7a7b46437f2576c9920e44dc14b386 (diff) | |
download | gcc-7d5de349d21479d7ec61dd0153e6f0958ad7384f.zip gcc-7d5de349d21479d7ec61dd0153e6f0958ad7384f.tar.gz gcc-7d5de349d21479d7ec61dd0153e6f0958ad7384f.tar.bz2 |
Don't use pinsr/pextr for struct initialization/extraction.
gcc/
PR target/96562
PR target/93897
* config/i386/i386-expand.c (ix86_expand_pinsr): Don't use
pinsr for TImode.
(ix86_expand_pextr): Don't use pextr for TImode.
gcc/testsuite/
* gcc.target/i386/pr96562-1.c: New test.
-rw-r--r-- | gcc/config/i386/i386-expand.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr96562-1.c | 81 |
2 files changed, 81 insertions, 2 deletions
diff --git a/gcc/config/i386/i386-expand.c b/gcc/config/i386/i386-expand.c index d8368bf..68fbe83 100644 --- a/gcc/config/i386/i386-expand.c +++ b/gcc/config/i386/i386-expand.c @@ -20302,7 +20302,6 @@ ix86_expand_pextr (rtx *operands) case E_V4SImode: case E_V2DImode: case E_V1TImode: - case E_TImode: { machine_mode srcmode, dstmode; rtx d, pat; @@ -20398,7 +20397,6 @@ ix86_expand_pinsr (rtx *operands) case E_V4SImode: case E_V2DImode: case E_V1TImode: - case E_TImode: { machine_mode srcmode, dstmode; rtx (*pinsr)(rtx, rtx, rtx, rtx); diff --git a/gcc/testsuite/gcc.target/i386/pr96562-1.c b/gcc/testsuite/gcc.target/i386/pr96562-1.c new file mode 100644 index 0000000..6ebeeb1 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr96562-1.c @@ -0,0 +1,81 @@ +/* { dg-do compile} */ +/* { dg-options "-msse4.1 -O2" } */ +/* { dg-final { scan-assembler-not "pinsr" } } */ + +typedef struct +{ + long long a; + int b; +} st1; + +typedef struct +{ + long long a; + int b; + short c; +} st2; + +typedef struct +{ + long long a; + int b; + short c; + char d; +} st3; + +typedef struct +{ + int b; + long long a; +} st4; + +typedef struct +{ + short c; + int b; + long long a; +} st5; + +typedef struct +{ + char d; + short c; + int b; + long long a; +} st6; + +st1 +foo1 (long long a, int b) +{ + return (st1){a, b}; +} + +st2 +foo2 (long long a, int b, short c) +{ + return (st2){a, b, c}; +} + +st3 +foo3 (long long a, int b, short c, char d) +{ + return (st3){a, b, c, d}; +} + +st4 +foo4 (long long a, int b) +{ + return (st4){b, a}; +} + +st5 +foo5 (long long a, int b, short c) +{ + return (st5){c, b, a}; +} + +st6 +foo6 (long long a, int b, short c, char d) +{ + return (st6){d, c, b, a}; +} |