aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorUros Bizjak <ubizjak@gmail.com>2017-02-03 19:54:20 +0100
committerUros Bizjak <uros@gcc.gnu.org>2017-02-03 19:54:20 +0100
commitd5d9703a2caeb411411e02a102756493587073a6 (patch)
tree63e38cea1bb38cbac4b23254628856cc556dc76e /gcc
parent86010a086b6ae8f1b129b6e992ed2ce2a36e38e3 (diff)
downloadgcc-d5d9703a2caeb411411e02a102756493587073a6.zip
gcc-d5d9703a2caeb411411e02a102756493587073a6.tar.gz
gcc-d5d9703a2caeb411411e02a102756493587073a6.tar.bz2
i386.c (dimode_scalar_chain::convert_reg): Use pextrd for TARGET_SSE4_1 when creating scalar copy.
* config/i386/i386.c (dimode_scalar_chain::convert_reg): Use pextrd for TARGET_SSE4_1 when creating scalar copy. From-SVN: r245161
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/i386/i386.c21
2 files changed, 23 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 733a325..d722840 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2017-02-03 Uros Bizjak <ubizjak@gmail.com>
+
+ * config/i386/i386.c (dimode_scalar_chain::convert_reg):
+ Use pextrd for TARGET_SSE4_1 when creating scalar copy.
+
2017-02-03 Walter Lee <walt@tilera.com>
PR target/78862
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 01a05c6..3a65945 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -3622,11 +3622,26 @@ dimode_scalar_chain::convert_reg (unsigned regno)
if (scalar_copy)
{
- rtx vcopy = gen_reg_rtx (V2DImode);
-
start_sequence ();
- if (TARGET_INTER_UNIT_MOVES_FROM_VEC)
+ if (TARGET_SSE4_1)
+ {
+ rtx tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, const0_rtx));
+ emit_insn
+ (gen_rtx_SET
+ (gen_rtx_SUBREG (SImode, scopy, 0),
+ gen_rtx_VEC_SELECT (SImode,
+ gen_rtx_SUBREG (V4SImode, reg, 0), tmp)));
+
+ tmp = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (1, const1_rtx));
+ emit_insn
+ (gen_rtx_SET
+ (gen_rtx_SUBREG (SImode, scopy, 4),
+ gen_rtx_VEC_SELECT (SImode,
+ gen_rtx_SUBREG (V4SImode, reg, 0), tmp)));
+ }
+ else if (TARGET_INTER_UNIT_MOVES_FROM_VEC)
{
+ rtx vcopy = gen_reg_rtx (V2DImode);
emit_move_insn (vcopy, gen_rtx_SUBREG (V2DImode, reg, 0));
emit_move_insn (gen_rtx_SUBREG (SImode, scopy, 0),
gen_rtx_SUBREG (SImode, vcopy, 0));