On Thu, Apr 21, 2016 at 2:59 PM, H.J. Lu <[email protected]> wrote:
>> We know, that const_int (-1) is allowed with TARGET_SSE2 and that
>> const_wide_int (-1) is allowed with TARGET_AVX2. Probably we don't
>> have to check AVX512F in standard_sse_constant_p, as it implies
>> TARGET_AVX2.
>>
>> As said, it is the job of insn mode attributes to emit correct instruction.
>>
>> Based on the above observations, mode checks for -1 are not needed in
>> standard_sse_constant_p.
>
> void
> ix86_expand_vector_move (machine_mode mode, rtx operands[])
> {
> rtx op0 = operands[0], op1 = operands[1];
> /* Use GET_MODE_BITSIZE instead of GET_MODE_ALIGNMENT for IA MCU
> psABI since the biggest alignment is 4 byte for IA MCU psABI. */
> unsigned int align = (TARGET_IAMCU
> ? GET_MODE_BITSIZE (mode)
> : GET_MODE_ALIGNMENT (mode));
>
> if (push_operand (op0, VOIDmode))
> op0 = emit_move_resolve_push (mode, op0);
>
> /* Force constants other than zero into memory. We do not know how
> the instructions used to build constants modify the upper 64 bits
> of the register, once we have that information we may be able
> to handle some of them more efficiently. */
> if (can_create_pseudo_p ()
> && register_operand (op0, mode)
> && (CONSTANT_P (op1)
> || (SUBREG_P (op1)
> && CONSTANT_P (SUBREG_REG (op1))))
> && !standard_sse_constant_p (op1))
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>
> What should it return for op1 == (VOIDmode) -1 when
> TARGET_AVX is true and TARGET_AVX2 is false for
> mode == TImode and mode == OImode?
>
> op1 = validize_mem (force_const_mem (mode, op1));
Let me rethink and redesign this whole mess, so we will have
consistent predicates.
Uros.