From: liuhongt Date: Tue, 20 Aug 2024 06:41:00 +0000 (+0800) Subject: Align predicates for operands[1] between mov and *mov_internal. X-Git-Tag: basepoints/gcc-16~6495 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bb42c551905024ea23095a0eb7b58fdbcfbcaef6;p=thirdparty%2Fgcc.git Align predicates for operands[1] between mov and *mov_internal. > 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 and *mov_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_internal, but not for mov. I think we can align the predicate between mov and *mov_internal. gcc/ChangeLog: * config/i386/sse.md (mov): Align predicates for operands[1] between mov and *mov_internal. * config/i386/mmx.md (mov): Ditto. --- diff --git a/gcc/config/i386/mmx.md b/gcc/config/i386/mmx.md index 94d3a6e5692..cb2697537a8 100644 --- a/gcc/config/i386/mmx.md +++ b/gcc/config/i386/mmx.md @@ -169,7 +169,7 @@ (define_expand "mov" [(set (match_operand:MMXMODE 0 "nonimmediate_operand") - (match_operand:MMXMODE 1 "nonimmediate_operand"))] + (match_operand:MMXMODE 1 "nonimm_or_0_operand"))] "TARGET_MMX || TARGET_MMX_WITH_SSE" { ix86_expand_vector_move (mode, operands); diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index 8f34c9300d0..e67d25f960e 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -1387,7 +1387,7 @@ (define_expand "mov" [(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, operands);