Thanks for pointing out these errors. Pushed to trunk with the wording
fix, will wait for a week before backporting.

Uros Bizjak <[email protected]> 于2026年8月11日周二 23:53写道:
>
> On Tue, Aug 11, 2026 at 11:00 AM Hongyu Wang <[email protected]> wrote:
> >
> > 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
>
> libgfortran
>
> > 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.
>
> register
>
> >
> > Bootstrapped/regtested on x86_64-pc-linux-gnu, and --with-arch=native
> > bootstrap on novalake.
>
> Nova Lake.
>
> >
> > Ok for master and backport down to gcc 15?
>
> OK, but please wait for a week before backporting from the mainline.
>
> Thanks,
> Uros.
>
> >
> > 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