https://gcc.gnu.org/bugzilla/show_bug.cgi?id=125880

Hongtao Liu <liuhongt at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |liuhongt at gcc dot gnu.org

--- Comment #6 from Hongtao Liu <liuhongt at gcc dot gnu.org> ---

> For the cases above the code comes from the vec_init expander but I can
> imagine this might be too early for a perfect decision.

it comes from ix86_expand_vector_init_interleave which use SImode for
V*HI/V*QImode for vec_init_0.

18396      else
18397        {
18398          /* Extend the odd element to SImode using a paradoxical SUBREG. 
*/
18399          op0 = gen_reg_rtx (SImode);
18400          emit_move_insn (op0, gen_lowpart (SImode, op));
18401
18402          /* Insert the SImode value as low element of V4SImode vector. 
*/
18403          op1 = gen_reg_rtx (V4SImode);
18404          op0 = gen_rtx_VEC_MERGE (V4SImode,
18405                                   gen_rtx_VEC_DUPLICATE (V4SImode,
18406                                                          op0),
18407                                   CONST0_RTX (V4SImode),
18408                                   const1_rtx);
18409          emit_insn (gen_rtx_SET (op1, op0));
18410
18411          /* Cast the V4SImode vector back to a vector in original mode. 
*/
18412          op0 = gen_reg_rtx (mode);
18413          emit_move_insn (op0, gen_lowpart (mode, op1));
18414
18415          /* Load even elements into the second position.  */
18416          emit_insn (gen_load_even (op0,
18417                                    force_reg (inner_mode,
18418                                               ops[i + i + 1]),
18419                                    const1_rtx));
18420        }

Reply via email to