From 7d5de349d21479d7ec61dd0153e6f0958ad7384f Mon Sep 17 00:00:00 2001 From: liuhongt Date: Wed, 12 Aug 2020 10:48:17 +0800 Subject: [PATCH] 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. --- gcc/config/i386/i386-expand.c | 2 - gcc/testsuite/gcc.target/i386/pr96562-1.c | 81 +++++++++++++++++++++++ 2 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr96562-1.c diff --git a/gcc/config/i386/i386-expand.c b/gcc/config/i386/i386-expand.c index d8368bfd4a9..68fbe8385b3 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 00000000000..6ebeeb1fb17 --- /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}; +} -- 2.30.2