On Tue, Aug 20, 2024 at 12:25 PM liuhongt <hongtao....@intel.com> wrote:
>
> From [1]
> > > It's not obvious to me why movv16qi requires a nonimmediate_operand
> > > source, especially since ix86_expand_vector_mode does have code to
> > > cope with constant operand[1]s.  emit_move_insn_1 doesn't check the
> > > predicates anyway, so the predicate will have little effect.
> > >
> > > A workaround would be to check legitimate_constant_p instead of the
> > > predicate, but I'm not sure that that should be necessary.
> > >
> > > Has this already been discussed?  If not, we should loop in the x86
> > > maintainers (but I didn't do that here in case it would be a repeat).
> >
> > I also noticed it. Not sure why movv16qi requires a
> > nonimmediate_operand, while ix86_expand_vector_mode could deal with
> > constant op. Looking forward to Hongtao's comments.
> The code has been there since 2005 before I'm involved.
>  It looks to me at the beginning both mov<mode> and
> *mov<mode>_internal only support nonimmediate_operand for the
> operands[1].
> And r0-75606-g5656a184e83983 adjusted the nonimmediate_operand to
> nonimmediate_or_sse_const_operand for *mov<mode>_internal, but not for
> mov<mode>. I think we can align the predicate between mov<mode>
> and *mov<mode>_internal.

It looks to me that ix86_expand_vector_move correctly handles
standard_sse_constant_p operands.

> Bootstrapped and regtested on x86_64-pc-linux-gnu{-m32,}.
> Ok for trunk?
>
> gcc/ChangeLog:
>
>         * config/i386/sse.md (mov<mode>): Align predicates for
>         operands[1] between mov<mode> and *mov<mode>_internal.

OK, but please also change mov<mode> expander in mmx.md

> ---
>  gcc/config/i386/sse.md | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
> index d1010bc5682..7ecfbd55809 100644
> --- a/gcc/config/i386/sse.md
> +++ b/gcc/config/i386/sse.md
> @@ -1387,7 +1387,7 @@ (define_mode_attr DOUBLEMASKMODE
>
>  (define_expand "mov<mode>"
>    [(set (match_operand:VMOVE 0 "nonimmediate_operand")
> -       (match_operand:VMOVE 1 "nonimmediate_operand"))]
> +       (match_operand:VMOVE 1 "nonimmediate_or_sse_const_operand"))]
>    "TARGET_SSE"
>  {
>    ix86_expand_vector_move (<MODE>mode, operands);

Please also change expander in mmx.md to use nonimm_or_0 predicate
(for some reason -1 is not handled here).

Thanks,
Uros.

Reply via email to