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.

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..1cfd09ed59e 100644
--- a/gcc/config/i386/mmx.md
+++ b/gcc/config/i386/mmx.md
@@ -111,6 +111,11 @@ (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")
+   (V4HF "BF") (V4BF "BF") (V2SF "BF")])
+
 (define_mode_attr mmxdoublemode
   [(V8QI "V8HI") (V4HI "V4SI")])
 
@@ -174,7 +179,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 +188,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 +237,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 +252,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 +274,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 +285,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 +293,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 +302,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 +334,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 +343,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 +365,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 +385,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 +397,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 +405,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")))])

Reply via email to