On Sun, Apr 28, 2013 at 11:43 PM, Jakub Jelinek <ja...@redhat.com> wrote:
> On Sat, Apr 27, 2013 at 11:07:50AM +0200, Uros Bizjak wrote:
>> Yes, please add a new predicate, the pattern is much more descriptive
>> this way. (Without the predicate, it looks like an expander that
>> generates a RTX fragment, used instead of gen_RTX... sequences).
>
> Ok, updated patch below.  Bootstrapped/regtested again on x86_64-linux and
> i686-linux.
>
>> OTOH, does vector mode "general_operand" still accept scalar
>> immediates? The predicate, proposed above is effectively
>
> general_operand doesn't accept most of CONST_VECTOR constants (because they
> aren't targetm.legitimate_constant_p).  It won't accept CONST_INT
> or CONST_DOUBLE due to:
>   /* Don't accept CONST_INT or anything similar
>      if the caller wants something floating.  */
>   if (GET_MODE (op) == VOIDmode && mode != VOIDmode
>       && GET_MODE_CLASS (mode) != MODE_INT
>       && GET_MODE_CLASS (mode) != MODE_PARTIAL_INT)
>     return 0;
>
> 2013-04-28  Jakub Jelinek  <ja...@redhat.com>
>
>         * config/i386/predicates.md (general_vector_operand): New predicate.
>         * config/i386/i386.c (const_vector_equal_evenodd_p): New function.
>         (ix86_expand_mul_widen_evenodd): Force op1 resp. op2 into register
>         if they aren't nonimmediate operands.  If their original values
>         satisfy const_vector_equal_evenodd_p, don't shift them.
>         * config/i386/sse.md (mul<mode>3): Use general_vector_operand
>         predicates.  For the SSE4.1 case force operands[{1,2}] into registers 
> if
>         not nonimmediate_operand.
>         (vec_widen_smult_even_v4si): Use nonimmediate_operand predicates
>         instead of register_operand.
>         (vec_widen_<s>mult_odd_<mode>): Use general_vector_operand predicates.

OK for mainline.

Thanks,
Uros.

Reply via email to