i386.c (dimode_scalar_chain::convert_reg): Use pextrd for TARGET_SSE4_1 when creating...
authorUros Bizjak <ubizjak@gmail.com>
Fri, 3 Feb 2017 18:54:20 +0000 (19:54 +0100)
committerUros Bizjak <uros@gcc.gnu.org>
Fri, 3 Feb 2017 18:54:20 +0000 (19:54 +0100)
* config/i386/i386.c (dimode_scalar_chain::convert_reg):
Use pextrd for TARGET_SSE4_1 when creating scalar copy.

From-SVN: r245161

gcc/ChangeLog
gcc/config/i386/i386.c

index 733a32519af10ee146f061cb544085498931a021..d722840f51911cf1fb50ae6c5d05871993ddda8e 100644 (file)
@@ -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
index 01a05c63ccd1d5e4d5fdee4369ab4ac125b27a3a..3a659458ab0816730a740c6314ce92f087c3c45f 100644 (file)
@@ -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));