On Fri, Jul 11, 2025 at 9:57 AM Uros Bizjak <ubiz...@gmail.com> wrote: > > On Fri, Jul 11, 2025 at 6:05 AM H.J. Lu <hjl.to...@gmail.com> wrote: > > > gcc/ > > > > PR target/121015 > > * config/i386/constraints.md (BX): New constraint. > > * config/i386/i386.cc (ix86_print_operand): Support CONSTM1_RTX. > > * config/i386/mmx.md (MMXMODE:*mov<mode>_internal): Replace C with > > BX for memory and integer register destination. Replace <v,C> > > with <v,BX>. > > Update 32-bit MMXMODE move splitter to also split all 1s vector > > source operand. > > * config/i386/predicates.md (vector_const0_or_m1_operand): New > > predicate. > > (nonimm_or_vector_const0_or_m1_operand): Likewise. > > > > gcc/testsuite/ > > > > PR target/121015 > > * gcc.target/i386/pr106022-2.c: Adjusted. > > * gcc.target/i386/pr121015-1.c: New test. > > * gcc.target/i386/pr121015-2.c: Likewise. > > * gcc.target/i386/pr121015-3.c: Likewise. > > * gcc.target/i386/pr121015-4.c: Likewise. > > * gcc.target/i386/pr121015-5.c: Likewise. > > * gcc.target/i386/pr121015-6.c: Likewise. > > > > OK for master? > > Please try the attached patch that introduces "all ones" handling to MMX > moves.
Bah, wrong version attached (missing 32bit modes in mmxconstm1) - please try this. Uros.
diff --git a/gcc/config/i386/i386.cc b/gcc/config/i386/i386.cc index ad7360ec71a..c9b0ddf290c 100644 --- a/gcc/config/i386/i386.cc +++ b/gcc/config/i386/i386.cc @@ -5448,6 +5448,8 @@ standard_sse_constant_p (rtx x, machine_mode pred_mode) return 2; break; case 16: + case 8: + case 4: if (TARGET_SSE2) return 2; break; diff --git a/gcc/config/i386/mmx.md b/gcc/config/i386/mmx.md index 79202323e53..c5e4f4239e6 100644 --- a/gcc/config/i386/mmx.md +++ b/gcc/config/i386/mmx.md @@ -111,6 +111,13 @@ (define_mode_attr mmxinsnmode (V4BF "DI") (V2BF "SI") (V2SF "DI")]) +;; MMX constant -1 constraint +(define_mode_attr mmxconstm1 + [(V8QI "BC") (V4HI "BC") (V2SI "BC") (V1DI "BC") + (V4QI "BC") (V2HI "BC") (V1SI "BC") + (V4HF "BF") (V4BF "BF") (V2SF "BF") + (V2HF "BF") (V2BF "BF")]) + (define_mode_attr mmxdoublemode [(V8QI "V8HI") (V4HI "V4SI")]) @@ -174,7 +181,7 @@ (define_mode_attr Yv_Yw (define_expand "mov<mode>" [(set (match_operand:MMXMODE 0 "nonimmediate_operand") - (match_operand:MMXMODE 1 "nonimm_or_0_operand"))] + (match_operand:MMXMODE 1 "nonimmediate_or_sse_const_operand"))] "TARGET_MMX || TARGET_MMX_WITH_SSE" { ix86_expand_vector_move (<MODE>mode, operands); @@ -183,9 +190,9 @@ (define_expand "mov<mode>" (define_insn "*mov<mode>_internal" [(set (match_operand:MMXMODE 0 "nonimmediate_operand" - "=r ,o ,r,r ,m ,?!y,!y,?!y,m ,r ,?!y,v,v,v,m,r,v,!y,*x") - (match_operand:MMXMODE 1 "nonimm_or_0_operand" - "rCo,rC,C,rm,rC,C ,!y,m ,?!y,?!y,r ,C,v,m,v,v,r,*x,!y"))] + "=r ,o ,r,r ,m ,?!y,!y,?!y,m ,r ,?!y,v,v ,v,v,m,r,v,!y,*x") + (match_operand:MMXMODE 1 "nonimmediate_or_sse_const_operand" + "rCo,rC,C,rm,rC,C ,!y,m ,?!y,?!y,r ,C,<mmxconstm1>,v,m,v,v,r,*x,!y"))] "(TARGET_MMX || TARGET_MMX_WITH_SSE) && !(MEM_P (operands[0]) && MEM_P (operands[1])) && ix86_hardreg_mov_ok (operands[0], operands[1])" @@ -232,9 +239,9 @@ (define_insn "*mov<mode>_internal" (const_string "nox64") (eq_attr "alternative" "2,3,4,9,10") (const_string "x64") - (eq_attr "alternative" "15,16") + (eq_attr "alternative" "16,17") (const_string "x64_sse2") - (eq_attr "alternative" "17,18") + (eq_attr "alternative" "12,18,19") (const_string "sse2") ] (const_string "*"))) @@ -247,14 +254,14 @@ (define_insn "*mov<mode>_internal" (const_string "mmx") (eq_attr "alternative" "6,7,8,9,10") (const_string "mmxmov") - (eq_attr "alternative" "11") + (eq_attr "alternative" "11,12") (const_string "sselog1") - (eq_attr "alternative" "17,18") + (eq_attr "alternative" "18,19") (const_string "ssecvt") ] (const_string "ssemov"))) (set (attr "prefix_rex") - (if_then_else (eq_attr "alternative" "9,10,15,16") + (if_then_else (eq_attr "alternative" "9,10,16,17") (const_string "1") (const_string "*"))) (set (attr "prefix") @@ -269,7 +276,7 @@ (define_insn "*mov<mode>_internal" (set (attr "mode") (cond [(eq_attr "alternative" "2") (const_string "SI") - (eq_attr "alternative" "11,12") + (eq_attr "alternative" "11,12,13") (cond [(match_test "<MODE>mode == V2SFmode || <MODE>mode == V4HFmode || <MODE>mode == V4BFmode") @@ -280,7 +287,7 @@ (define_insn "*mov<mode>_internal" ] (const_string "TI")) - (and (eq_attr "alternative" "13") + (and (eq_attr "alternative" "14") (ior (ior (and (match_test "<MODE>mode == V2SFmode") (not (match_test "TARGET_MMX_WITH_SSE"))) (not (match_test "TARGET_SSE2"))) @@ -288,7 +295,7 @@ (define_insn "*mov<mode>_internal" || <MODE>mode == V4BFmode"))) (const_string "V2SF") - (and (eq_attr "alternative" "14") + (and (eq_attr "alternative" "15") (ior (ior (match_test "<MODE>mode == V2SFmode") (not (match_test "TARGET_SSE2"))) (match_test "<MODE>mode == V4HFmode @@ -297,9 +304,9 @@ (define_insn "*mov<mode>_internal" ] (const_string "DI"))) (set (attr "preferred_for_speed") - (cond [(eq_attr "alternative" "9,15") + (cond [(eq_attr "alternative" "9,16") (symbol_ref "TARGET_INTER_UNIT_MOVES_FROM_VEC") - (eq_attr "alternative" "10,16") + (eq_attr "alternative" "10,17") (symbol_ref "TARGET_INTER_UNIT_MOVES_TO_VEC") ] (symbol_ref "true")))]) @@ -329,7 +336,7 @@ (define_expand "movmisalign<mode>" (define_expand "mov<mode>" [(set (match_operand:V_32 0 "nonimmediate_operand") - (match_operand:V_32 1 "nonimmediate_operand"))] + (match_operand:V_32 1 "nonimmediate_or_sse_const_operand"))] "" { ix86_expand_vector_move (<MODE>mode, operands); @@ -338,9 +345,9 @@ (define_expand "mov<mode>" (define_insn "*mov<mode>_internal" [(set (match_operand:V_32 0 "nonimmediate_operand" - "=r ,m ,v,v,v,m,r,v") - (match_operand:V_32 1 "general_operand" - "rmC,rC,C,v,m,v,v,r"))] + "=r ,m ,v,v ,v,v,m,r,v") + (match_operand:V_32 1 "nonimmediate_or_sse_const_operand" + "rmC,rC,C,<mmxconstm1>,v,m,v,v,r"))] "!(MEM_P (operands[0]) && MEM_P (operands[1])) && ix86_hardreg_mov_ok (operands[0], operands[1])" { @@ -360,14 +367,14 @@ (define_insn "*mov<mode>_internal" } } [(set (attr "isa") - (cond [(eq_attr "alternative" "6,7") + (cond [(eq_attr "alternative" "3,7,8") (const_string "sse2") ] (const_string "*"))) (set (attr "type") - (cond [(eq_attr "alternative" "2") + (cond [(eq_attr "alternative" "2,3") (const_string "sselog1") - (eq_attr "alternative" "3,4,5,6,7") + (eq_attr "alternative" "4,5,6,7,8") (const_string "ssemov") ] (const_string "imov"))) @@ -380,7 +387,7 @@ (define_insn "*mov<mode>_internal" (const_string "1") (const_string "*"))) (set (attr "mode") - (cond [(eq_attr "alternative" "2,3") + (cond [(eq_attr "alternative" "2,3,4") (cond [(match_test "<MODE>mode == V2HFmode || <MODE>mode == V2BFmode") (const_string "V4SF") @@ -392,7 +399,7 @@ (define_insn "*mov<mode>_internal" ] (const_string "TI")) - (and (eq_attr "alternative" "4,5") + (and (eq_attr "alternative" "5,6") (ior (match_test "<MODE>mode == V2HFmode || <MODE>mode == V2BFmode") (not (match_test "TARGET_SSE2")))) @@ -400,9 +407,9 @@ (define_insn "*mov<mode>_internal" ] (const_string "SI"))) (set (attr "preferred_for_speed") - (cond [(eq_attr "alternative" "6") + (cond [(eq_attr "alternative" "7") (symbol_ref "TARGET_INTER_UNIT_MOVES_FROM_VEC") - (eq_attr "alternative" "7") + (eq_attr "alternative" "8") (symbol_ref "TARGET_INTER_UNIT_MOVES_TO_VEC") ] (symbol_ref "true")))])