Hi,

FMA4 and XOP instructions are VEX-only, so cannot be promoted to EVEX form.
When enforcing -mapxf on such target clone, which is at --with-arch=native
under libgfrotran bootstrap, the fma4 clone may generate unencodable
vfmaddps with egpr in mem.

Restrict all the FMA4/XOP patterns with replacing 'm' to 'jm' and add gpr16
to the addr attribute to avoid egpr usage under high regrister pressure.

Bootstrapped/regtested on x86_64-pc-linux-gnu, and --with-arch=native
bootstrap on novalake.

Ok for master and backport down to gcc 15?

gcc/ChangeLog:

        PR target/126787
        * config/i386/sse.md (*fma_fmadd_<mode>): Use the "jm" to replace
        "m" constraint and set addr attribute to "gpr16" for vex only
        alternatives.
        (*fma_fmsub_<mode>): Likewise.
        (*fma_fnmadd_<mode>): Likewise.
        (*fma_fnmsub_<mode>): Likewise.
        (*fma_fmaddsub_<mode>): Likewise.
        (*fma_fmsubadd_<mode>): Likewise.
        (xop_p<macs><ssemodesuffix><ssemodesuffix>): Likewise.
        (xop_p<macs>dql): Likewise.
        (xop_p<macs>dqh): Likewise.
        (xop_p<macs>wd): Likewise.
        (xop_p<madcs>wd): Likewise.
        (xop_pcmov_<mode><avxsizesuffix>): Likewise.
        (xop_phadd<u>bw): Likewise.
        (xop_phadd<u>bd): Likewise.
        (xop_phadd<u>bq): Likewise.
        (xop_phadd<u>wd): Likewise.
        (xop_phadd<u>wq): Likewise.
        (xop_phadd<u>dq): Likewise.
        (xop_phsubbw): Likewise.
        (xop_phsubwd): Likewise.
        (xop_phsubdq): Likewise.
        (xop_pperm): Likewise.
        (xop_pperm_pack_v2di_v4si): Likewise.
        (xop_pperm_pack_v4si_v8hi): Likewise.
        (xop_pperm_pack_v8hi_v16qi): Likewise.
        (xop_rotl<mode>3): Likewise.
        (xop_rotr<mode>3): Likewise.
        (xop_vrotl<mode>3): Likewise.
        (xop_sha<mode>3): Likewise.
        (xop_shl<mode>3): Likewise.
        (xop_frcz<mode>2): Likewise.
        (*xop_vmfrcz<mode>2): Likewise.
        (xop_maskcmp<mode>3): Likewise.
        (xop_maskcmp_uns<mode>3): Likewise.
        (xop_maskcmp_uns2<mode>3): Likewise.
        (xop_pcom_tf<mode>3): Likewise.
        (xop_vpermil2<mode>3): Likewise.

gcc/testsuite/ChangeLog:

        PR target/126787
        * gcc.target/i386/pr126787.c: New test.
---
 gcc/config/i386/sse.md                   | 141 ++++++++++++++---------
 gcc/testsuite/gcc.target/i386/pr126787.c |  15 +++
 2 files changed, 104 insertions(+), 52 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/i386/pr126787.c

diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
index db4e0613527..bf4c4505601 100644
--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -6332,8 +6332,8 @@ (define_insn "*fma_fmadd_<mode>"
   [(set (match_operand:FMAMODE 0 "register_operand" "=v,v,v,x,x")
        (fma:FMAMODE
          (match_operand:FMAMODE 1 "nonimmediate_operand" "%0,0,v,x,x")
-         (match_operand:FMAMODE 2 "nonimmediate_operand" "vm,v,vm,x,m")
-         (match_operand:FMAMODE 3 "nonimmediate_operand" "v,vm,0,xm,x")))]
+         (match_operand:FMAMODE 2 "nonimmediate_operand" "vm,v,vm,x,jm")
+         (match_operand:FMAMODE 3 "nonimmediate_operand" "v,vm,0,xjm,x")))]
   "TARGET_FMA || TARGET_FMA4"
   "@
    vfmadd132<ssemodesuffix>\t{%2, %3, %0|%0, %3, %2}
@@ -6343,6 +6343,7 @@ (define_insn "*fma_fmadd_<mode>"
    vfmadd<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
   [(set_attr "isa" "fma,fma,fma,fma4,fma4")
    (set_attr "type" "ssemuladd")
+   (set_attr "addr" "*,*,*,gpr16,gpr16")
    (set_attr "mode" "<MODE>")])
 
 ;; Suppose AVX-512F as baseline
@@ -6428,9 +6429,9 @@ (define_insn "*fma_fmsub_<mode>"
   [(set (match_operand:FMAMODE 0 "register_operand" "=v,v,v,x,x")
        (fma:FMAMODE
          (match_operand:FMAMODE   1 "nonimmediate_operand" "%0,0,v,x,x")
-         (match_operand:FMAMODE   2 "nonimmediate_operand" "vm,v,vm,x,m")
+         (match_operand:FMAMODE   2 "nonimmediate_operand" "vm,v,vm,x,jm")
          (neg:FMAMODE
-           (match_operand:FMAMODE 3 "nonimmediate_operand" "v,vm,0,xm,x"))))]
+           (match_operand:FMAMODE 3 "nonimmediate_operand" "v,vm,0,xjm,x"))))]
   "TARGET_FMA || TARGET_FMA4"
   "@
    vfmsub132<ssemodesuffix>\t{%2, %3, %0|%0, %3, %2}
@@ -6440,6 +6441,7 @@ (define_insn "*fma_fmsub_<mode>"
    vfmsub<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
   [(set_attr "isa" "fma,fma,fma,fma4,fma4")
    (set_attr "type" "ssemuladd")
+   (set_attr "addr" "*,*,*,gpr16,gpr16")
    (set_attr "mode" "<MODE>")])
 
 (define_expand "<avx512>_fmsub_<mode>_maskz<round_expand_name>"
@@ -6535,8 +6537,8 @@ (define_insn "*fma_fnmadd_<mode>"
        (fma:FMAMODE
          (neg:FMAMODE
            (match_operand:FMAMODE 1 "nonimmediate_operand" "%0,0,v,x,x"))
-         (match_operand:FMAMODE   2 "nonimmediate_operand" "vm,v,vm,x,m")
-         (match_operand:FMAMODE   3 "nonimmediate_operand" "v,vm,0,xm,x")))]
+         (match_operand:FMAMODE   2 "nonimmediate_operand" "vm,v,vm,x,jm")
+         (match_operand:FMAMODE   3 "nonimmediate_operand" "v,vm,0,xjm,x")))]
   "TARGET_FMA || TARGET_FMA4"
   "@
    vfnmadd132<ssemodesuffix>\t{%2, %3, %0|%0, %3, %2}
@@ -6546,6 +6548,7 @@ (define_insn "*fma_fnmadd_<mode>"
    vfnmadd<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
   [(set_attr "isa" "fma,fma,fma,fma4,fma4")
    (set_attr "type" "ssemuladd")
+   (set_attr "addr" "*,*,*,gpr16,gpr16")
    (set_attr "mode" "<MODE>")])
 
 (define_expand "<avx512>_fnmadd_<mode>_maskz<round_expand_name>"
@@ -6641,9 +6644,9 @@ (define_insn "*fma_fnmsub_<mode>"
        (fma:FMAMODE
          (neg:FMAMODE
            (match_operand:FMAMODE 1 "nonimmediate_operand" "%0,0,v,x,x"))
-         (match_operand:FMAMODE   2 "nonimmediate_operand" "vm,v,vm,x,m")
+         (match_operand:FMAMODE   2 "nonimmediate_operand" "vm,v,vm,x,jm")
          (neg:FMAMODE
-           (match_operand:FMAMODE 3 "nonimmediate_operand" "v,vm,0,xm,x"))))]
+           (match_operand:FMAMODE 3 "nonimmediate_operand" "v,vm,0,xjm,x"))))]
   "TARGET_FMA || TARGET_FMA4"
   "@
    vfnmsub132<ssemodesuffix>\t{<round_sd_mask_op4>%2, %3, 
%0<sd_mask_op4>|%0<sd_mask_op4>, %3, %2<round_sd_mask_op4>}
@@ -6653,6 +6656,7 @@ (define_insn "*fma_fnmsub_<mode>"
    vfnmsub<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
   [(set_attr "isa" "fma,fma,fma,fma4,fma4")
    (set_attr "type" "ssemuladd")
+   (set_attr "addr" "*,*,*,gpr16,gpr16")
    (set_attr "mode" "<MODE>")])
 
 (define_expand "<avx512>_fnmsub_<mode>_maskz<round_expand_name>"
@@ -6818,8 +6822,8 @@ (define_insn "*fma_fmaddsub_<mode>"
   [(set (match_operand:VF_128_256 0 "register_operand" "=v,v,v,x,x")
        (unspec:VF_128_256
          [(match_operand:VF_128_256 1 "nonimmediate_operand" "%0,0,v,x,x")
-          (match_operand:VF_128_256 2 "nonimmediate_operand" "vm,v,vm,x,m")
-          (match_operand:VF_128_256 3 "nonimmediate_operand" "v,vm,0,xm,x")]
+          (match_operand:VF_128_256 2 "nonimmediate_operand" "vm,v,vm,x,jm")
+          (match_operand:VF_128_256 3 "nonimmediate_operand" "v,vm,0,xjm,x")]
          UNSPEC_FMADDSUB))]
   "TARGET_FMA || TARGET_FMA4"
   "@
@@ -6830,6 +6834,7 @@ (define_insn "*fma_fmaddsub_<mode>"
    vfmaddsub<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
   [(set_attr "isa" "fma,fma,fma,fma4,fma4")
    (set_attr "type" "ssemuladd")
+   (set_attr "addr" "*,*,*,gpr16,gpr16")
    (set_attr "mode" "<MODE>")])
 
 (define_insn "<sd_mask_codefor>fma_fmaddsub_<mode><sd_maskz_name><round_name>"
@@ -6886,9 +6891,9 @@ (define_insn "*fma_fmsubadd_<mode>"
   [(set (match_operand:VF_128_256 0 "register_operand" "=v,v,v,x,x")
        (unspec:VF_128_256
          [(match_operand:VF_128_256   1 "nonimmediate_operand" "%0,0,v,x,x")
-          (match_operand:VF_128_256   2 "nonimmediate_operand" "vm,v,vm,x,m")
+          (match_operand:VF_128_256   2 "nonimmediate_operand" "vm,v,vm,x,jm")
           (neg:VF_128_256
-            (match_operand:VF_128_256 3 "nonimmediate_operand" "v,vm,0,xm,x"))]
+            (match_operand:VF_128_256 3 "nonimmediate_operand" 
"v,vm,0,xjm,x"))]
          UNSPEC_FMADDSUB))]
   "TARGET_FMA || TARGET_FMA4"
   "@
@@ -6899,6 +6904,7 @@ (define_insn "*fma_fmsubadd_<mode>"
    vfmsubadd<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
   [(set_attr "isa" "fma,fma,fma,fma4,fma4")
    (set_attr "type" "ssemuladd")
+   (set_attr "addr" "*,*,*,gpr16,gpr16")
    (set_attr "mode" "<MODE>")])
 
 (define_insn "<sd_mask_codefor>fma_fmsubadd_<mode><sd_maskz_name><round_name>"
@@ -27352,12 +27358,13 @@ (define_insn 
"xop_p<macs><ssemodesuffix><ssemodesuffix>"
        (xop_plus:VI24_128
         (mult:VI24_128
          (match_operand:VI24_128 1 "nonimmediate_operand" "%x")
-         (match_operand:VI24_128 2 "nonimmediate_operand" "xm"))
+         (match_operand:VI24_128 2 "nonimmediate_operand" "xjm"))
         (match_operand:VI24_128 3 "register_operand" "x")))]
   "TARGET_XOP"
   "vp<macs><ssemodesuffix><ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
   [(set_attr "type" "ssemuladd")
    (set_attr "prefix" "vex")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "TI")])
 
 (define_insn "xop_p<macs>dql"
@@ -27370,13 +27377,14 @@ (define_insn "xop_p<macs>dql"
            (parallel [(const_int 0) (const_int 2)])))
          (sign_extend:V2DI
           (vec_select:V2SI
-           (match_operand:V4SI 2 "nonimmediate_operand" "xm")
+           (match_operand:V4SI 2 "nonimmediate_operand" "xjm")
            (parallel [(const_int 0) (const_int 2)]))))
         (match_operand:V2DI 3 "register_operand" "x")))]
   "TARGET_XOP"
   "vp<macs>dql\t{%3, %2, %1, %0|%0, %1, %2, %3}"
   [(set_attr "type" "ssemuladd")
    (set_attr "prefix" "vex")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "TI")])
 
 (define_insn "xop_p<macs>dqh"
@@ -27389,13 +27397,14 @@ (define_insn "xop_p<macs>dqh"
            (parallel [(const_int 1) (const_int 3)])))
          (sign_extend:V2DI
           (vec_select:V2SI
-           (match_operand:V4SI 2 "nonimmediate_operand" "xm")
+           (match_operand:V4SI 2 "nonimmediate_operand" "xjm")
            (parallel [(const_int 1) (const_int 3)]))))
         (match_operand:V2DI 3 "register_operand" "x")))]
   "TARGET_XOP"
   "vp<macs>dqh\t{%3, %2, %1, %0|%0, %1, %2, %3}"
   [(set_attr "type" "ssemuladd")
    (set_attr "prefix" "vex")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "TI")])
 
 ;; XOP parallel integer multiply/add instructions for the intrinisics
@@ -27410,7 +27419,7 @@ (define_insn "xop_p<macs>wd"
                       (const_int 5) (const_int 7)])))
          (sign_extend:V4SI
           (vec_select:V4HI
-           (match_operand:V8HI 2 "nonimmediate_operand" "xm")
+           (match_operand:V8HI 2 "nonimmediate_operand" "xjm")
            (parallel [(const_int 1) (const_int 3)
                       (const_int 5) (const_int 7)]))))
         (match_operand:V4SI 3 "register_operand" "x")))]
@@ -27418,6 +27427,7 @@ (define_insn "xop_p<macs>wd"
   "vp<macs>wd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
   [(set_attr "type" "ssemuladd")
    (set_attr "prefix" "vex")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "TI")])
 
 (define_insn "xop_p<madcs>wd"
@@ -27432,7 +27442,7 @@ (define_insn "xop_p<madcs>wd"
                        (const_int 4) (const_int 6)])))
           (sign_extend:V4SI
            (vec_select:V4HI
-            (match_operand:V8HI 2 "nonimmediate_operand" "xm")
+            (match_operand:V8HI 2 "nonimmediate_operand" "xjm")
             (parallel [(const_int 0) (const_int 2)
                        (const_int 4) (const_int 6)]))))
          (mult:V4SI
@@ -27451,18 +27461,20 @@ (define_insn "xop_p<madcs>wd"
   "vp<madcs>wd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
   [(set_attr "type" "ssemuladd")
    (set_attr "prefix" "vex")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "TI")])
 
 ;; XOP parallel XMM conditional moves
 (define_insn "xop_pcmov_<mode><avxsizesuffix>"
   [(set (match_operand:V_128_256 0 "register_operand" "=x,x")
        (if_then_else:V_128_256
-         (match_operand:V_128_256 3 "nonimmediate_operand" "x,m")
+         (match_operand:V_128_256 3 "nonimmediate_operand" "x,jm")
          (match_operand:V_128_256 1 "register_operand" "x,x")
-         (match_operand:V_128_256 2 "nonimmediate_operand" "xm,x")))]
+         (match_operand:V_128_256 2 "nonimmediate_operand" "xjm,x")))]
   "TARGET_XOP"
   "vpcmov\t{%3, %2, %1, %0|%0, %1, %2, %3}"
   [(set_attr "type" "sse4arg")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "<sseinsnmode>")])
 
 ;; Recognize XOP's vpcmov from canonical (xor (and (xor t f) c) f)
@@ -27497,7 +27509,7 @@ (define_insn "xop_phadd<u>bw"
        (plus:V8HI
         (any_extend:V8HI
          (vec_select:V8QI
-          (match_operand:V16QI 1 "nonimmediate_operand" "xm")
+          (match_operand:V16QI 1 "nonimmediate_operand" "xjm")
           (parallel [(const_int 0) (const_int 2)
                      (const_int 4) (const_int 6)
                      (const_int 8) (const_int 10)
@@ -27515,6 +27527,7 @@ (define_insn "xop_phadd<u>bw"
    (set_attr "c86_attr" "hplus")
    (set_attr "prefix" "vex")
    (set_attr "prefix_extra" "1")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "TI")])
 
 (define_insn "xop_phadd<u>bd"
@@ -27523,7 +27536,7 @@ (define_insn "xop_phadd<u>bd"
         (plus:V4SI
          (any_extend:V4SI
           (vec_select:V4QI
-           (match_operand:V16QI 1 "nonimmediate_operand" "xm")
+           (match_operand:V16QI 1 "nonimmediate_operand" "xjm")
            (parallel [(const_int 0) (const_int 4)
                       (const_int 8) (const_int 12)])))
          (any_extend:V4SI
@@ -27548,6 +27561,7 @@ (define_insn "xop_phadd<u>bd"
    (set_attr "c86_attr" "hplus")
    (set_attr "prefix" "vex")
    (set_attr "prefix_extra" "1")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "TI")])
 
 (define_insn "xop_phadd<u>bq"
@@ -27557,7 +27571,7 @@ (define_insn "xop_phadd<u>bq"
          (plus:V2DI
           (any_extend:V2DI
            (vec_select:V2QI
-            (match_operand:V16QI 1 "nonimmediate_operand" "xm")
+            (match_operand:V16QI 1 "nonimmediate_operand" "xjm")
             (parallel [(const_int 0) (const_int 8)])))
           (any_extend:V2DI
            (vec_select:V2QI
@@ -27597,6 +27611,7 @@ (define_insn "xop_phadd<u>bq"
    (set_attr "c86_attr" "hplus")
    (set_attr "prefix" "vex")
    (set_attr "prefix_extra" "1")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "TI")])
 
 (define_insn "xop_phadd<u>wd"
@@ -27604,7 +27619,7 @@ (define_insn "xop_phadd<u>wd"
        (plus:V4SI
         (any_extend:V4SI
          (vec_select:V4HI
-          (match_operand:V8HI 1 "nonimmediate_operand" "xm")
+          (match_operand:V8HI 1 "nonimmediate_operand" "xjm")
           (parallel [(const_int 0) (const_int 2)
                      (const_int 4) (const_int 6)])))
         (any_extend:V4SI
@@ -27618,6 +27633,7 @@ (define_insn "xop_phadd<u>wd"
    (set_attr "c86_attr" "hplus")
    (set_attr "prefix" "vex")
    (set_attr "prefix_extra" "1")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "TI")])
 
 (define_insn "xop_phadd<u>wq"
@@ -27626,7 +27642,7 @@ (define_insn "xop_phadd<u>wq"
         (plus:V2DI
          (any_extend:V2DI
           (vec_select:V2HI
-           (match_operand:V8HI 1 "nonimmediate_operand" "xm")
+           (match_operand:V8HI 1 "nonimmediate_operand" "xjm")
            (parallel [(const_int 0) (const_int 4)])))
          (any_extend:V2DI
           (vec_select:V2HI
@@ -27647,6 +27663,7 @@ (define_insn "xop_phadd<u>wq"
    (set_attr "c86_attr" "hplus")
    (set_attr "prefix" "vex")
    (set_attr "prefix_extra" "1")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "TI")])
 
 (define_insn "xop_phadd<u>dq"
@@ -27654,7 +27671,7 @@ (define_insn "xop_phadd<u>dq"
        (plus:V2DI
         (any_extend:V2DI
          (vec_select:V2SI
-          (match_operand:V4SI 1 "nonimmediate_operand" "xm")
+          (match_operand:V4SI 1 "nonimmediate_operand" "xjm")
           (parallel [(const_int 0) (const_int 2)])))
         (any_extend:V2DI
          (vec_select:V2SI
@@ -27666,6 +27683,7 @@ (define_insn "xop_phadd<u>dq"
    (set_attr "c86_attr" "hplus")
    (set_attr "prefix" "vex")
    (set_attr "prefix_extra" "1")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "TI")])
 
 (define_insn "xop_phsubbw"
@@ -27673,7 +27691,7 @@ (define_insn "xop_phsubbw"
        (minus:V8HI
         (sign_extend:V8HI
          (vec_select:V8QI
-          (match_operand:V16QI 1 "nonimmediate_operand" "xm")
+          (match_operand:V16QI 1 "nonimmediate_operand" "xjm")
           (parallel [(const_int 0) (const_int 2)
                      (const_int 4) (const_int 6)
                      (const_int 8) (const_int 10)
@@ -27691,6 +27709,7 @@ (define_insn "xop_phsubbw"
    (set_attr "c86_attr" "hplus")
    (set_attr "prefix" "vex")
    (set_attr "prefix_extra" "1")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "TI")])
 
 (define_insn "xop_phsubwd"
@@ -27698,7 +27717,7 @@ (define_insn "xop_phsubwd"
        (minus:V4SI
         (sign_extend:V4SI
          (vec_select:V4HI
-          (match_operand:V8HI 1 "nonimmediate_operand" "xm")
+          (match_operand:V8HI 1 "nonimmediate_operand" "xjm")
           (parallel [(const_int 0) (const_int 2)
                      (const_int 4) (const_int 6)])))
         (sign_extend:V4SI
@@ -27712,6 +27731,7 @@ (define_insn "xop_phsubwd"
    (set_attr "c86_attr" "hplus")
    (set_attr "prefix" "vex")
    (set_attr "prefix_extra" "1")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "TI")])
 
 (define_insn "xop_phsubdq"
@@ -27719,7 +27739,7 @@ (define_insn "xop_phsubdq"
        (minus:V2DI
         (sign_extend:V2DI
          (vec_select:V2SI
-          (match_operand:V4SI 1 "nonimmediate_operand" "xm")
+          (match_operand:V4SI 1 "nonimmediate_operand" "xjm")
           (parallel [(const_int 0) (const_int 2)])))
         (sign_extend:V2DI
          (vec_select:V2SI
@@ -27731,6 +27751,7 @@ (define_insn "xop_phsubdq"
    (set_attr "c86_attr" "hplus")
    (set_attr "prefix" "vex")
    (set_attr "prefix_extra" "1")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "TI")])
 
 ;; XOP permute instructions
@@ -27738,12 +27759,13 @@ (define_insn "xop_pperm"
   [(set (match_operand:V16QI 0 "register_operand" "=x,x")
        (unspec:V16QI
          [(match_operand:V16QI 1 "register_operand" "x,x")
-          (match_operand:V16QI 2 "nonimmediate_operand" "x,m")
-          (match_operand:V16QI 3 "nonimmediate_operand" "xm,x")]
+          (match_operand:V16QI 2 "nonimmediate_operand" "x,jm")
+          (match_operand:V16QI 3 "nonimmediate_operand" "xjm,x")]
          UNSPEC_XOP_PERMUTE))]
   "TARGET_XOP && !(MEM_P (operands[2]) && MEM_P (operands[3]))"
   "vpperm\t{%3, %2, %1, %0|%0, %1, %2, %3}"
   [(set_attr "type" "sse4arg")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "TI")])
 
 ;; XOP pack instructions that combine two vectors into a smaller vector
@@ -27753,11 +27775,12 @@ (define_insn "xop_pperm_pack_v2di_v4si"
         (truncate:V2SI
          (match_operand:V2DI 1 "register_operand" "x,x"))
         (truncate:V2SI
-         (match_operand:V2DI 2 "nonimmediate_operand" "x,m"))))
-   (use (match_operand:V16QI 3 "nonimmediate_operand" "xm,x"))]
+         (match_operand:V2DI 2 "nonimmediate_operand" "x,jm"))))
+   (use (match_operand:V16QI 3 "nonimmediate_operand" "xjm,x"))]
   "TARGET_XOP && !(MEM_P (operands[2]) && MEM_P (operands[3]))"
   "vpperm\t{%3, %2, %1, %0|%0, %1, %2, %3}"
   [(set_attr "type" "sse4arg")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "TI")])
 
 (define_insn "xop_pperm_pack_v4si_v8hi"
@@ -27766,11 +27789,12 @@ (define_insn "xop_pperm_pack_v4si_v8hi"
         (truncate:V4HI
          (match_operand:V4SI 1 "register_operand" "x,x"))
         (truncate:V4HI
-         (match_operand:V4SI 2 "nonimmediate_operand" "x,m"))))
-   (use (match_operand:V16QI 3 "nonimmediate_operand" "xm,x"))]
+         (match_operand:V4SI 2 "nonimmediate_operand" "x,jm"))))
+   (use (match_operand:V16QI 3 "nonimmediate_operand" "xjm,x"))]
   "TARGET_XOP && !(MEM_P (operands[2]) && MEM_P (operands[3]))"
   "vpperm\t{%3, %2, %1, %0|%0, %1, %2, %3}"
   [(set_attr "type" "sse4arg")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "TI")])
 
 (define_insn "xop_pperm_pack_v8hi_v16qi"
@@ -27779,11 +27803,12 @@ (define_insn "xop_pperm_pack_v8hi_v16qi"
         (truncate:V8QI
          (match_operand:V8HI 1 "register_operand" "x,x"))
         (truncate:V8QI
-         (match_operand:V8HI 2 "nonimmediate_operand" "x,m"))))
-   (use (match_operand:V16QI 3 "nonimmediate_operand" "xm,x"))]
+         (match_operand:V8HI 2 "nonimmediate_operand" "x,jm"))))
+   (use (match_operand:V16QI 3 "nonimmediate_operand" "xjm,x"))]
   "TARGET_XOP && !(MEM_P (operands[2]) && MEM_P (operands[3]))"
   "vpperm\t{%3, %2, %1, %0|%0, %1, %2, %3}"
   [(set_attr "type" "sse4arg")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "TI")])
 
 ;; XOP packed rotate instructions
@@ -27854,7 +27879,7 @@ (define_expand "rotr<mode>3"
 (define_insn "xop_rotl<mode>3"
   [(set (match_operand:VI_128 0 "register_operand" "=x")
        (rotate:VI_128
-        (match_operand:VI_128 1 "nonimmediate_operand" "xm")
+        (match_operand:VI_128 1 "nonimmediate_operand" "xjm")
         (match_operand:SI 2 "const_0_to_<sserotatemax>_operand")))]
   "TARGET_XOP"
   "vprot<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
@@ -27862,12 +27887,13 @@ (define_insn "xop_rotl<mode>3"
    (set_attr "prefix" "vex")
    (set_attr "prefix_extra" "1")
    (set_attr "length_immediate" "1")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "TI")])
 
 (define_insn "xop_rotr<mode>3"
   [(set (match_operand:VI_128 0 "register_operand" "=x")
        (rotatert:VI_128
-        (match_operand:VI_128 1 "nonimmediate_operand" "xm")
+        (match_operand:VI_128 1 "nonimmediate_operand" "xjm")
         (match_operand:SI 2 "const_0_to_<sserotatemax>_operand")))]
   "TARGET_XOP"
 {
@@ -27879,6 +27905,7 @@ (define_insn "xop_rotr<mode>3"
    (set_attr "prefix" "vex")
    (set_attr "prefix_extra" "1")
    (set_attr "length_immediate" "1")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "TI")])
 
 (define_expand "vrotr<mode>3"
@@ -27907,10 +27934,10 @@ (define_insn "xop_vrotl<mode>3"
   [(set (match_operand:VI_128 0 "register_operand" "=x,x")
        (if_then_else:VI_128
         (ge:VI_128
-         (match_operand:VI_128 2 "nonimmediate_operand" "x,m")
+         (match_operand:VI_128 2 "nonimmediate_operand" "x,jm")
          (const_int 0))
         (rotate:VI_128
-         (match_operand:VI_128 1 "nonimmediate_operand" "xm,x")
+         (match_operand:VI_128 1 "nonimmediate_operand" "xjm,x")
          (match_dup 2))
         (rotatert:VI_128
          (match_dup 1)
@@ -27920,6 +27947,7 @@ (define_insn "xop_vrotl<mode>3"
   [(set_attr "type" "sseishft")
    (set_attr "prefix" "vex")
    (set_attr "prefix_extra" "1")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "TI")])
 
 ;; XOP packed shift instructions.
@@ -28144,10 +28172,10 @@ (define_insn "xop_sha<mode>3"
   [(set (match_operand:VI_128 0 "register_operand" "=x,x")
        (if_then_else:VI_128
         (ge:VI_128
-         (match_operand:VI_128 2 "nonimmediate_operand" "x,m")
+         (match_operand:VI_128 2 "nonimmediate_operand" "x,jm")
          (const_int 0))
         (ashift:VI_128
-         (match_operand:VI_128 1 "nonimmediate_operand" "xm,x")
+         (match_operand:VI_128 1 "nonimmediate_operand" "xjm,x")
          (match_dup 2))
         (ashiftrt:VI_128
          (match_dup 1)
@@ -28157,16 +28185,17 @@ (define_insn "xop_sha<mode>3"
   [(set_attr "type" "sseishft")
    (set_attr "prefix" "vex")
    (set_attr "prefix_extra" "1")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "TI")])
 
 (define_insn "xop_shl<mode>3"
   [(set (match_operand:VI_128 0 "register_operand" "=x,x")
        (if_then_else:VI_128
         (ge:VI_128
-         (match_operand:VI_128 2 "nonimmediate_operand" "x,m")
+         (match_operand:VI_128 2 "nonimmediate_operand" "x,jm")
          (const_int 0))
         (ashift:VI_128
-         (match_operand:VI_128 1 "nonimmediate_operand" "xm,x")
+         (match_operand:VI_128 1 "nonimmediate_operand" "xjm,x")
          (match_dup 2))
         (lshiftrt:VI_128
          (match_dup 1)
@@ -28176,6 +28205,7 @@ (define_insn "xop_shl<mode>3"
   [(set_attr "type" "sseishft")
    (set_attr "prefix" "vex")
    (set_attr "prefix_extra" "1")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "TI")])
 
 (define_expand "<insn><mode>3"
@@ -28320,13 +28350,14 @@ (define_insn_and_split "*ashrv2di3"
 (define_insn "xop_frcz<mode>2"
   [(set (match_operand:FMAMODE 0 "register_operand" "=x")
        (unspec:FMAMODE
-        [(match_operand:FMAMODE 1 "nonimmediate_operand" "xm")]
+        [(match_operand:FMAMODE 1 "nonimmediate_operand" "xjm")]
         UNSPEC_FRCZ))]
   "TARGET_XOP"
   "vfrcz<ssemodesuffix>\t{%1, %0|%0, %1}"
   [(set_attr "type" "ssecvt1")
    (set_attr "prefix" "vex")
    (set_attr "prefix_extra" "1")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "<MODE>")])
 
 (define_expand "xop_vmfrcz<mode>2"
@@ -28344,7 +28375,7 @@ (define_insn "*xop_vmfrcz<mode>2"
   [(set (match_operand:VF_128 0 "register_operand" "=x")
        (vec_merge:VF_128
          (unspec:VF_128
-          [(match_operand:VF_128 1 "nonimmediate_operand" "xm")]
+          [(match_operand:VF_128 1 "nonimmediate_operand" "xjm")]
           UNSPEC_FRCZ)
          (match_operand:VF_128 2 "const0_operand")
          (const_int 1)))]
@@ -28353,26 +28384,29 @@ (define_insn "*xop_vmfrcz<mode>2"
   [(set_attr "type" "ssecvt1")
    (set_attr "prefix" "vex")
    (set_attr "prefix_extra" "1")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "<MODE>")])
 
 (define_insn "xop_maskcmp<mode>3"
   [(set (match_operand:VI_128 0 "register_operand" "=x")
        (match_operator:VI_128 1 "ix86_comparison_int_operator"
         [(match_operand:VI_128 2 "register_operand" "x")
-         (match_operand:VI_128 3 "nonimmediate_operand" "xm")]))]
+         (match_operand:VI_128 3 "nonimmediate_operand" "xjm")]))]
   "TARGET_XOP"
   "vpcom%Y1<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3}"
   [(set_attr "type" "sse4arg")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "TI")])
 
 (define_insn "xop_maskcmp_uns<mode>3"
   [(set (match_operand:VI_128 0 "register_operand" "=x")
        (match_operator:VI_128 1 "ix86_comparison_uns_operator"
         [(match_operand:VI_128 2 "register_operand" "x")
-         (match_operand:VI_128 3 "nonimmediate_operand" "xm")]))]
+         (match_operand:VI_128 3 "nonimmediate_operand" "xjm")]))]
   "TARGET_XOP"
   "vpcom%Y1u<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3}"
   [(set_attr "type" "sse4arg")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "TI")])
 
 ;; Version of pcom*u* that is called from the intrinsics that allows pcomequ*
@@ -28383,11 +28417,12 @@ (define_insn "xop_maskcmp_uns2<mode>3"
        (unspec:VI_128
         [(match_operator:VI_128 1 "ix86_comparison_uns_operator"
          [(match_operand:VI_128 2 "register_operand" "x")
-          (match_operand:VI_128 3 "nonimmediate_operand" "xm")])]
+          (match_operand:VI_128 3 "nonimmediate_operand" "xjm")])]
         UNSPEC_XOP_UNSIGNED_CMP))]
   "TARGET_XOP"
   "vpcom%Y1u<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3}"
   [(set_attr "type" "sse4arg")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "TI")])
 
 ;; Pcomtrue and pcomfalse support.  These are useless instructions, but are
@@ -28396,7 +28431,7 @@ (define_insn "xop_pcom_tf<mode>3"
   [(set (match_operand:VI_128 0 "register_operand" "=x")
        (unspec:VI_128
          [(match_operand:VI_128 1 "register_operand" "x")
-          (match_operand:VI_128 2 "nonimmediate_operand" "xm")
+          (match_operand:VI_128 2 "nonimmediate_operand" "xjm")
           (match_operand:SI 3 "const_int_operand")]
          UNSPEC_XOP_TRUEFALSE))]
   "TARGET_XOP"
@@ -28406,19 +28441,21 @@ (define_insn "xop_pcom_tf<mode>3"
          : "vpcomfalse<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}");
 }
   [(set_attr "type" "sse4arg")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "TI")])
 
 (define_insn "xop_vpermil2<mode>3"
   [(set (match_operand:VF_128_256 0 "register_operand" "=x,x")
        (unspec:VF_128_256
          [(match_operand:VF_128_256 1 "register_operand" "x,x")
-          (match_operand:VF_128_256 2 "nonimmediate_operand" "x,m")
-          (match_operand:<sseintvecmode> 3 "nonimmediate_operand" "xm,x")
+          (match_operand:VF_128_256 2 "nonimmediate_operand" "x,jm")
+          (match_operand:<sseintvecmode> 3 "nonimmediate_operand" "xjm,x")
           (match_operand:SI 4 "const_0_to_3_operand")]
          UNSPEC_VPERMIL2))]
   "TARGET_XOP"
   "vpermil2<ssemodesuffix>\t{%4, %3, %2, %1, %0|%0, %1, %2, %3, %4}"
   [(set_attr "type" "sse4arg")
+   (set_attr "addr" "gpr16")
    (set_attr "mode" "<MODE>")])
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
diff --git a/gcc/testsuite/gcc.target/i386/pr126787.c 
b/gcc/testsuite/gcc.target/i386/pr126787.c
new file mode 100644
index 00000000000..a15928c139f
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr126787.c
@@ -0,0 +1,15 @@
+/* { dg-do assemble { target { apxf && { ! ia32 } } } } */
+/* { dg-options "-O2 -mapxf -mprefer-avx128 -funroll-loops --param 
max-unroll-times=4 -ffast-math -ftree-vectorize" } */
+
+typedef float f4;
+__attribute__((__target__("avx,fma4")))
+void smm_avx128_fma4(f4 * restrict c, const f4 * restrict a,
+                     const f4 * restrict b, int m, int n, int k)
+{
+    for (int j = 0; j < n; j++)
+        for (int l = 0; l < k; l++) {
+            f4 bl = b[l + j*k];
+            for (int i = 0; i < m; i++)
+                c[i + j*m] += a[i + l*m] * bl;
+        }
+}
-- 
2.31.1

Reply via email to