On Thu, Apr 21, 2016 at 3:54 PM, H.J. Lu <hjl.to...@gmail.com> wrote:
> On Thu, Apr 21, 2016 at 6:48 AM, Uros Bizjak <ubiz...@gmail.com> wrote:
>> On Thu, Apr 21, 2016 at 3:43 PM, H.J. Lu <hjl.to...@gmail.com> wrote:
>>> On Thu, Apr 21, 2016 at 6:33 AM, Uros Bizjak <ubiz...@gmail.com> wrote:
>>>> On Thu, Apr 21, 2016 at 2:59 PM, H.J. Lu <hjl.to...@gmail.com> 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.
>>>
>>> The problem is because -1 has no mode.  We can't tell
>>> if -1 is a valid SSE constant without mode.  That is my
>>> change to standard_sse_constant_p and
>>> ix86_expand_vector_move is for.   It is sufficient for
>>> all my tests, including benchmark runs.
>>
>> I'm not against mode checks, but IMO, we have to do these checks in
>> predicates, where we know operand mode.
>
> I tried and it doesn't work since the correct mode may not be always
> available in predicates.  Yes, they pass mode.  But they just do
>
> mode = GET_MODE (op);
>
> which returns VOIDmode for -1.

Well, looking at generated gcc/insns-preds.c, the predicates do:

(mode == VOIDmode || GET_MODE (op) == mode).

They *check* and don't *assign* "mode" variable.

So, I see no problem checking "mode" variable (that gets the value
from the pattern) in the predicates.

Uros.

Reply via email to