diff options
author | Uros Bizjak <ubizjak@gmail.com> | 2017-02-03 19:54:20 +0100 |
---|---|---|
committer | Uros Bizjak <uros@gcc.gnu.org> | 2017-02-03 19:54:20 +0100 |
commit | d5d9703a2caeb411411e02a102756493587073a6 (patch) | |
tree | 63e38cea1bb38cbac4b23254628856cc556dc76e /gcc | |
parent | 86010a086b6ae8f1b129b6e992ed2ce2a36e38e3 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 21 |
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)); |