]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[APX EGPR] Handle vex insns that only support GPR16 (5/5)
authorKong Lingling <lingling.kong@intel.com>
Wed, 29 Mar 2023 08:22:54 +0000 (16:22 +0800)
committerHongyu Wang <hongyu.wang@intel.com>
Sat, 7 Oct 2023 08:34:31 +0000 (16:34 +0800)
These vex insn may have legacy counterpart that could support EGPR,
but they do not have evex counterpart. Split out its vex part from
patterns and set the vex part to non-EGPR supported by adjusting
constraints and attr_gpr32.

insn list:
1. vmovmskpd/vmovmskps
2. vpmovmskb
3. vrsqrtss/vrsqrtps
4. vrcpss/vrcpps
5. vhaddpd/vhaddps, vhsubpd/vhsubps
6. vldmxcsr/vstmxcsr
7. vaddsubpd/vaddsubps
8. vlddqu
9. vtestps/vtestpd
10. vmaskmovps/vmaskmovpd, vpmaskmovd/vpmaskmovq
11. vperm2f128/vperm2i128
12. vinserti128/vinsertf128
13. vbroadcasti128/vbroadcastf128
14. vcmppd/vcmpps, vcmpss/vcmpsd
15. vgatherdps/vgatherqps, vgatherdpd/vgatherqpd

gcc/ChangeLog:

* config/i386/constraints.md (jb): New constraint for vsib memory
that does not allow gpr32.
* config/i386/i386.md: (setcc_<mode>_sse): Replace m to jm for avx
alternative and set attr_gpr32 to 0.
(movmsk_df): Split avx/noavx alternatives and  replace "r" to "jr" for
avx alternative.
(<sse>_rcp<mode>2): Split avx/noavx alternatives and replace
"m/Bm" to "jm/ja" for avx alternative, set its gpr32 attr to 0.
(*rsqrtsf2_sse): Likewise.
* config/i386/mmx.md (mmx_pmovmskb): Split alternative 1 to
avx/noavx and assign jr/r constraint to dest.
* config/i386/sse.md (<sse>_movmsk<ssemodesuffix><avxsizesuffix>):
Split avx/noavx alternatives and replace "r" to "jr" for avx alternative.
(*<sse>_movmsk<ssemodesuffix><avxsizesuffix>_<u>ext): Likewise.
(*<sse>_movmsk<ssemodesuffix><avxsizesuffix>_lt): Likewise.
(*<sse>_movmsk<ssemodesuffix><avxsizesuffix>_<u>ext_lt): Likewise.
(*<sse>_movmsk<ssemodesuffix><avxsizesuffix>_shift): Likewise.
(*<sse>_movmsk<ssemodesuffix><avxsizesuffix>_<u>ext_shift): Likewise.
(<sse2_avx2>_pmovmskb): Likewise.
(*<sse2_avx2>_pmovmskb_zext): Likewise.
(*sse2_pmovmskb_ext): Likewise.
(*<sse2_avx2>_pmovmskb_lt): Likewise.
(*<sse2_avx2>_pmovmskb_zext_lt): Likewise.
(*sse2_pmovmskb_ext_lt): Likewise.
(<sse>_rcp<mode>2): Split avx/noavx alternatives and replace
"m/Bm" to "jm/ja" for avx alternative, set its attr_gpr32 to 0.
(sse_vmrcpv4sf2): Likewise.
(*sse_vmrcpv4sf2): Likewise.
(rsqrt<mode>2): Likewise.
(sse_vmrsqrtv4sf2): Likewise.
(*sse_vmrsqrtv4sf2): Likewise.
(avx_h<insn>v4df3): Likewise.
(sse3_hsubv2df3): Likewise.
(avx_h<insn>v8sf3): Likewise.
(sse3_h<insn>v4sf3): Likewise.
(<sse3>_lddqu<avxsizesuffix>): Likewise.
(avx_cmp<mode>3): Likewise.
(avx_vmcmp<mode>3): Likewise.
(*sse2_gt<mode>3): Likewise.
(sse_ldmxcsr): Likewise.
(sse_stmxcsr): Likewise.
(avx_vtest<ssemodesuffix><avxsizesuffix>): Replace m to jm for
avx alternative and set attr_gpr32 to 0.
(avx2_permv2ti): Likewise.
(*avx_vperm2f128<mode>_full): Likewise.
(*avx_vperm2f128<mode>_nozero): Likewise.
(vec_set_lo_v32qi): Likewise.
(<avx_avx2>_maskload<ssemodesuffix><avxsizesuffix>): Likewise.
(<avx_avx2>_maskstore<ssemodesuffix><avxsi)zesuffix>: Likewise.
(avx_cmp<mode>3): Likewise.
(avx_vmcmp<mode>3): Likewise.
(*<sse>_maskcmp<mode>3_comm): Likewise.
(*avx2_gathersi<VEC_GATHER_MODE:mode>): Replace Tv to jb and set
attr_gpr32 to 0.
(*avx2_gathersi<VEC_GATHER_MODE:mode>_2): Likewise.
(*avx2_gatherdi<VEC_GATHER_MODE:mode>): Likewise.
(*avx2_gatherdi<VEC_GATHER_MODE:mode>_2): Likewise.
(*avx2_gatherdi<VI4F_256:mode>_3): Likewise.
(*avx2_gatherdi<VI4F_256:mode>_4): Likewise.
(avx_vbroadcastf128_<mode>): Restrict non-egpr alternative to
noavx512vl, set its constraint to jm and set attr_gpr32 to 0.
(vec_set_lo_<mode><mask_name>): Likewise.
(vec_set_lo_<mode><mask_name>): Likewise for SF/SI modes.
(vec_set_hi_<mode><mask_name>): Likewise.
(vec_set_hi_<mode><mask_name>): Likewise for SF/SI modes.
(vec_set_hi_<mode>): Likewise.
(vec_set_lo_<mode>): Likewise.
(avx2_set_hi_v32qi): Likewise.

Co-authored-by: Hongyu Wang <hongyu.wang@intel.com>
Co-authored-by: Hongtao Liu <hongtao.liu@intel.com>
gcc/config/i386/constraints.md
gcc/config/i386/i386.md
gcc/config/i386/mmx.md
gcc/config/i386/sse.md

index 36c268d7f9b2fab031c48b96904bb211b124ca31..dc91bd94b27d3cd801cfe0ed0377a3669b6fbe14 100644 (file)
   (and (match_operand 0 "vector_memory_operand")
        (not (and (match_test "TARGET_APX_EGPR")
                 (match_test "x86_extended_rex2reg_mentioned_p (op)")))))
+
+(define_address_constraint "jb"
+  "VSIB address operand without EGPR"
+  (and (match_operand 0 "vsib_address_operand")
+       (not (and (match_test "TARGET_APX_EGPR")
+                (match_test "x86_extended_rex2reg_mentioned_p (op)")))))
index b68a6a75072c69d99caaaa15c2af8735c10a9912..65a0dd025c79f8eeec4e4f506158c70dd726a798 100644 (file)
                    avx,noavx,avx2,noavx2,bmi,bmi2,fma4,fma,avx512f,noavx512f,
                    avx512bw,noavx512bw,avx512dq,noavx512dq,fma_or_avx512vl,
                    avx512vl,noavx512vl,avxvnni,avx512vnnivl,avx512fp16,avxifma,
-                   avx512ifmavl,avxneconvert,avx512bf16vl,vpclmulqdqvl"
+                   avx512ifmavl,avxneconvert,avx512bf16vl,vpclmulqdqvl,
+                   avx_noavx512f,avx_noavx512vl"
   (const_string "base"))
 
 ;; The (bounding maximum) length of an instruction immediate.
         (eq_attr "isa" "sse4_noavx")
           (symbol_ref "TARGET_SSE4_1 && !TARGET_AVX")
         (eq_attr "isa" "avx") (symbol_ref "TARGET_AVX")
+        (eq_attr "isa" "avx_noavx512f")
+          (symbol_ref "TARGET_AVX && !TARGET_AVX512F")
         (eq_attr "isa" "noavx") (symbol_ref "!TARGET_AVX")
         (eq_attr "isa" "avx2") (symbol_ref "TARGET_AVX2")
         (eq_attr "isa" "noavx2") (symbol_ref "!TARGET_AVX2")
   [(set (match_operand:MODEF 0 "register_operand" "=x,x")
        (match_operator:MODEF 3 "sse_comparison_operator"
          [(match_operand:MODEF 1 "register_operand" "0,x")
-          (match_operand:MODEF 2 "nonimmediate_operand" "xm,xm")]))]
+          (match_operand:MODEF 2 "nonimmediate_operand" "xm,xjm")]))]
   "SSE_FLOAT_MODE_P (<MODE>mode)"
   "@
    cmp%D3<ssemodesuffix>\t{%2, %0|%0, %2}
    vcmp%D3<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
   [(set_attr "isa" "noavx,avx")
+   (set_attr "gpr32" "1,0")
    (set_attr "type" "ssecmp")
    (set_attr "length_immediate" "1")
    (set_attr "prefix" "orig,vex")
    (set_attr "mode" "HF")])
 
 (define_insn "*rcpsf2_sse"
-  [(set (match_operand:SF 0 "register_operand" "=x,x,x")
-       (unspec:SF [(match_operand:SF 1 "nonimmediate_operand" "0,x,m")]
+  [(set (match_operand:SF 0 "register_operand" "=x,x,x,x")
+       (unspec:SF [(match_operand:SF 1 "nonimmediate_operand" "0,x,m,ja")]
                   UNSPEC_RCP))]
   "TARGET_SSE && TARGET_SSE_MATH"
   "@
    %vrcpss\t{%d1, %0|%0, %d1}
    %vrcpss\t{%d1, %0|%0, %d1}
-   %vrcpss\t{%1, %d0|%d0, %1}"
-  [(set_attr "type" "sse")
+   rcpss\t{%1, %d0|%d0, %1}
+   vrcpss\t{%1, %d0|%d0, %1}"
+  [(set_attr "isa" "*,*,noavx,avx")
+   (set_attr "gpr32" "1,1,1,0")
+   (set_attr "type" "sse")
    (set_attr "atom_sse_attr" "rcp")
    (set_attr "btver2_sse_attr" "rcp")
    (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "SF")
-   (set_attr "avx_partial_xmm_update" "false,false,true")
+   (set_attr "avx_partial_xmm_update" "false,false,true,true")
    (set (attr "preferred_for_speed")
       (cond [(match_test "TARGET_AVX")
               (symbol_ref "true")
-            (eq_attr "alternative" "1,2")
+            (eq_attr "alternative" "1,2,3")
               (symbol_ref "!TARGET_SSE_PARTIAL_REG_DEPENDENCY")
            ]
            (symbol_ref "true")))])
    (set_attr "bdver1_decode" "direct")])
 
 (define_insn "*rsqrtsf2_sse"
-  [(set (match_operand:SF 0 "register_operand" "=x,x,x")
-       (unspec:SF [(match_operand:SF 1 "nonimmediate_operand" "0,x,m")]
+  [(set (match_operand:SF 0 "register_operand" "=x,x,x,x")
+       (unspec:SF [(match_operand:SF 1 "nonimmediate_operand" "0,x,m,ja")]
                   UNSPEC_RSQRT))]
   "TARGET_SSE && TARGET_SSE_MATH"
   "@
    %vrsqrtss\t{%d1, %0|%0, %d1}
    %vrsqrtss\t{%d1, %0|%0, %d1}
-   %vrsqrtss\t{%1, %d0|%d0, %1}"
-  [(set_attr "type" "sse")
+   rsqrtss\t{%1, %d0|%d0, %1}
+   vrsqrtss\t{%1, %d0|%d0, %1}"
+  [(set_attr "isa" "*,*,noavx,avx")
+   (set_attr "gpr32" "1,1,1,0")
+   (set_attr "type" "sse")
    (set_attr "atom_sse_attr" "rcp")
    (set_attr "btver2_sse_attr" "rcp")
    (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "SF")
-   (set_attr "avx_partial_xmm_update" "false,false,true")
+   (set_attr "avx_partial_xmm_update" "false,false,true,true")
    (set (attr "preferred_for_speed")
       (cond [(match_test "TARGET_AVX")
               (symbol_ref "true")
-            (eq_attr "alternative" "1,2")
+            (eq_attr "alternative" "1,2,3")
               (symbol_ref "!TARGET_SSE_PARTIAL_REG_DEPENDENCY")
            ]
            (symbol_ref "true")))])
 })
 
 (define_insn "movmsk_df"
-  [(set (match_operand:SI 0 "register_operand" "=r")
+  [(set (match_operand:SI 0 "register_operand" "=r,jr")
        (unspec:SI
-         [(match_operand:DF 1 "register_operand" "x")]
+         [(match_operand:DF 1 "register_operand" "x,x")]
          UNSPEC_MOVMSK))]
   "SSE_FLOAT_MODE_P (DFmode) && TARGET_SSE_MATH"
   "%vmovmskpd\t{%1, %0|%0, %1}"
-  [(set_attr "type" "ssemov")
-   (set_attr "prefix" "maybe_vex")
+  [(set_attr "isa" "noavx,avx")
+   (set_attr "type" "ssemov")
+   (set_attr "prefix" "maybe_evex")
    (set_attr "mode" "DF")])
 
 ;; Use movmskpd in SSE mode to avoid store forwarding stall
index 73809585a5d6df252dafd672f59642fccc21e39e..3530615c706ea41c0e7cdb46aa2dbf7bd0d41813 100644 (file)
 })
 
 (define_insn_and_split "mmx_pmovmskb"
-  [(set (match_operand:SI 0 "register_operand" "=r,r")
-       (unspec:SI [(match_operand:V8QI 1 "register_operand" "y,x")]
+  [(set (match_operand:SI 0 "register_operand" "=r,r,jr")
+       (unspec:SI [(match_operand:V8QI 1 "register_operand" "y,x,x")]
                   UNSPEC_MOVMSK))]
   "(TARGET_MMX || TARGET_MMX_WITH_SSE)
    && (TARGET_SSE || TARGET_3DNOW_A)"
   "@
    pmovmskb\t{%1, %0|%0, %1}
+   #
    #"
   "TARGET_SSE2 && reload_completed
    && SSE_REGNO_P (REGNO (operands[1]))"
   operands[2] = lowpart_subreg (QImode, operands[0],
                                GET_MODE (operands[0]));
 }
-  [(set_attr "mmx_isa" "native,sse")
-   (set_attr "type" "mmxcvt,ssemov")
-   (set_attr "mode" "DI,TI")])
+  [(set_attr "mmx_isa" "native,sse_noavx,avx")
+   (set_attr "type" "mmxcvt,ssemov,ssemov")
+   (set_attr "mode" "DI,TI,TI")])
 
 (define_expand "mmx_maskmovq"
   [(set (match_operand:V8QI 0 "memory_operand")
index d3b59c4866b39ffef760b832eeb0874978ab0d4e..6bffd749c6dceaeffb36e68589292b1e5d97c7ab 100644 (file)
   "operands[4] = adjust_address (operands[0], V2DFmode, 0);")
 
 (define_insn "<sse3>_lddqu<avxsizesuffix>"
-  [(set (match_operand:VI1 0 "register_operand" "=x")
-       (unspec:VI1 [(match_operand:VI1 1 "memory_operand" "m")]
+  [(set (match_operand:VI1 0 "register_operand" "=x,x")
+       (unspec:VI1 [(match_operand:VI1 1 "memory_operand" "m,jm")]
                    UNSPEC_LDDQU))]
   "TARGET_SSE3"
   "%vlddqu\t{%1, %0|%0, %1}"
-  [(set_attr "type" "ssemov")
+  [(set_attr "isa" "noavx,avx")
+   (set_attr "type" "ssemov")
+   (set_attr "gpr32" "1,0")
    (set_attr "movu" "1")
    (set (attr "prefix_data16")
      (if_then_else
    (set_attr "mode" "<MODE>")])
 
 (define_insn "<sse>_rcp<mode>2"
-  [(set (match_operand:VF1_128_256 0 "register_operand" "=x")
+  [(set (match_operand:VF1_128_256 0 "register_operand" "=x,x")
        (unspec:VF1_128_256
-         [(match_operand:VF1_128_256 1 "vector_operand" "xBm")] UNSPEC_RCP))]
+         [(match_operand:VF1_128_256 1 "vector_operand" "xBm,xja")] UNSPEC_RCP))]
   "TARGET_SSE"
   "%vrcpps\t{%1, %0|%0, %1}"
-  [(set_attr "type" "sse")
+  [(set_attr "isa" "noavx,avx")
+   (set_attr "type" "sse")
+   (set_attr "gpr32" "1,0")
    (set_attr "atom_sse_attr" "rcp")
    (set_attr "btver2_sse_attr" "rcp")
    (set_attr "prefix" "maybe_vex")
 (define_insn "sse_vmrcpv4sf2"
   [(set (match_operand:V4SF 0 "register_operand" "=x,x")
        (vec_merge:V4SF
-         (unspec:V4SF [(match_operand:V4SF 1 "nonimmediate_operand" "xm,xm")]
+         (unspec:V4SF [(match_operand:V4SF 1 "nonimmediate_operand" "xm,xjm")]
                       UNSPEC_RCP)
          (match_operand:V4SF 2 "register_operand" "0,x")
          (const_int 1)))]
    vrcpss\t{%1, %2, %0|%0, %2, %k1}"
   [(set_attr "isa" "noavx,avx")
    (set_attr "type" "sse")
+   (set_attr "gpr32" "1,0")
    (set_attr "atom_sse_attr" "rcp")
    (set_attr "btver2_sse_attr" "rcp")
    (set_attr "prefix" "orig,vex")
   [(set (match_operand:V4SF 0 "register_operand" "=x,x")
        (vec_merge:V4SF
          (vec_duplicate:V4SF
-           (unspec:SF [(match_operand:SF 1 "nonimmediate_operand" "xm,xm")]
+           (unspec:SF [(match_operand:SF 1 "nonimmediate_operand" "xm,xjm")]
                         UNSPEC_RCP))
          (match_operand:V4SF 2 "register_operand" "0,x")
          (const_int 1)))]
    vrcpss\t{%1, %2, %0|%0, %2, %1}"
   [(set_attr "isa" "noavx,avx")
    (set_attr "type" "sse")
+   (set_attr "gpr32" "1,0")
    (set_attr "atom_sse_attr" "rcp")
    (set_attr "btver2_sse_attr" "rcp")
    (set_attr "prefix" "orig,vex")
   "TARGET_AVX512FP16")
 
 (define_insn "<sse>_rsqrt<mode>2"
-  [(set (match_operand:VF1_128_256 0 "register_operand" "=x")
+  [(set (match_operand:VF1_128_256 0 "register_operand" "=x,x")
        (unspec:VF1_128_256
-         [(match_operand:VF1_128_256 1 "vector_operand" "xBm")] UNSPEC_RSQRT))]
+         [(match_operand:VF1_128_256 1 "vector_operand" "xBm,xja")] UNSPEC_RSQRT))]
   "TARGET_SSE"
   "%vrsqrtps\t{%1, %0|%0, %1}"
-  [(set_attr "type" "sse")
+  [(set_attr "isa" "noavx,avx")
+   (set_attr "type" "sse")
+   (set_attr "gpr32" "1,0")
    (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "<MODE>")])
 
 (define_insn "sse_vmrsqrtv4sf2"
   [(set (match_operand:V4SF 0 "register_operand" "=x,x")
        (vec_merge:V4SF
-         (unspec:V4SF [(match_operand:V4SF 1 "nonimmediate_operand" "xm,xm")]
+         (unspec:V4SF [(match_operand:V4SF 1 "nonimmediate_operand" "xm,xjm")]
                       UNSPEC_RSQRT)
          (match_operand:V4SF 2 "register_operand" "0,x")
          (const_int 1)))]
    vrsqrtss\t{%1, %2, %0|%0, %2, %k1}"
   [(set_attr "isa" "noavx,avx")
    (set_attr "type" "sse")
+   (set_attr "gpr32" "1,0")
    (set_attr "prefix" "orig,vex")
    (set_attr "mode" "SF")])
 
   [(set (match_operand:V4SF 0 "register_operand" "=x,x")
        (vec_merge:V4SF
          (vec_duplicate:V4SF
-           (unspec:SF [(match_operand:SF 1 "nonimmediate_operand" "xm,xm")]
+           (unspec:SF [(match_operand:SF 1 "nonimmediate_operand" "xm,xjm")]
                         UNSPEC_RSQRT))
          (match_operand:V4SF 2 "register_operand" "0,x")
          (const_int 1)))]
    vrsqrtss\t{%1, %2, %0|%0, %2, %1}"
   [(set_attr "isa" "noavx,avx")
    (set_attr "type" "sse")
+   (set_attr "gpr32" "1,0")
    (set_attr "prefix" "orig,vex")
    (set_attr "mode" "SF")])
 
         (vec_merge:VF_128_256
          (minus:VF_128_256
            (match_operand:VF_128_256 1 "register_operand" "0,x")
-           (match_operand:VF_128_256 2 "vector_operand" "xBm, xm"))
+           (match_operand:VF_128_256 2 "vector_operand" "xBm, xjm"))
          (plus:VF_128_256 (match_dup 1) (match_dup 2))
          (const_int <addsub_cst>)))]
   "TARGET_SSE3"
    vaddsub<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
   [(set_attr "isa" "noavx,avx")
    (set_attr "type" "sseadd")
+   (set_attr "gpr32" "1,0")
    (set (attr "atom_unit")
      (if_then_else
        (match_test "<MODE>mode == V2DFmode")
              (vec_select:DF (match_dup 1) (parallel [(const_int 1)])))
            (plusminus:DF
              (vec_select:DF
-               (match_operand:V4DF 2 "nonimmediate_operand" "xm")
+               (match_operand:V4DF 2 "nonimmediate_operand" "xjm")
                (parallel [(const_int 0)]))
              (vec_select:DF (match_dup 2) (parallel [(const_int 1)]))))
          (vec_concat:V2DF
   "TARGET_AVX"
   "vh<plusminus_mnemonic>pd\t{%2, %1, %0|%0, %1, %2}"
   [(set_attr "type" "sseadd")
+   (set_attr "gpr32" "0")
    (set_attr "prefix" "vex")
    (set_attr "mode" "V4DF")])
 
              (parallel [(match_operand:SI 4 "const_0_to_1_operand")])))
          (plus:DF
            (vec_select:DF
-             (match_operand:V2DF 2 "vector_operand" "xBm,xm")
+             (match_operand:V2DF 2 "vector_operand" "xBm,xjm")
              (parallel [(match_operand:SI 5 "const_0_to_1_operand")]))
            (vec_select:DF
              (match_dup 2)
    haddpd\t{%2, %0|%0, %2}
    vhaddpd\t{%2, %1, %0|%0, %1, %2}"
   [(set_attr "isa" "noavx,avx")
+   (set_attr "gpr32" "1,0")
    (set_attr "type" "sseadd")
    (set_attr "prefix" "orig,vex")
    (set_attr "mode" "V2DF")])
            (vec_select:DF (match_dup 1) (parallel [(const_int 1)])))
          (minus:DF
            (vec_select:DF
-             (match_operand:V2DF 2 "vector_operand" "xBm,xm")
+             (match_operand:V2DF 2 "vector_operand" "xBm,xjm")
              (parallel [(const_int 0)]))
            (vec_select:DF (match_dup 2) (parallel [(const_int 1)])))))]
   "TARGET_SSE3"
    vhsubpd\t{%2, %1, %0|%0, %1, %2}"
   [(set_attr "isa" "noavx,avx")
    (set_attr "type" "sseadd")
+   (set_attr "gpr32" "1,0")
    (set_attr "prefix" "orig,vex")
    (set_attr "mode" "V2DF")])
 
            (vec_concat:V2SF
              (plusminus:SF
                (vec_select:SF
-                 (match_operand:V8SF 2 "nonimmediate_operand" "xm")
+                 (match_operand:V8SF 2 "nonimmediate_operand" "xjm")
                  (parallel [(const_int 0)]))
                (vec_select:SF (match_dup 2) (parallel [(const_int 1)])))
              (plusminus:SF
   "TARGET_AVX"
   "vh<plusminus_mnemonic>ps\t{%2, %1, %0|%0, %1, %2}"
   [(set_attr "type" "sseadd")
+   (set_attr "gpr32" "0")
    (set_attr "prefix" "vex")
    (set_attr "mode" "V8SF")])
 
          (vec_concat:V2SF
            (plusminus:SF
              (vec_select:SF
-               (match_operand:V4SF 2 "vector_operand" "xBm,xm")
+               (match_operand:V4SF 2 "vector_operand" "xBm,xjm")
                (parallel [(const_int 0)]))
              (vec_select:SF (match_dup 2) (parallel [(const_int 1)])))
            (plusminus:SF
    vh<plusminus_mnemonic>ps\t{%2, %1, %0|%0, %1, %2}"
   [(set_attr "isa" "noavx,avx")
    (set_attr "type" "sseadd")
+   (set_attr "gpr32" "1,0")
    (set_attr "atom_unit" "complex")
    (set_attr "prefix" "orig,vex")
    (set_attr "prefix_rep" "1,*")
   [(set (match_operand:VF_128_256 0 "register_operand" "=x")
        (unspec:VF_128_256
          [(match_operand:VF_128_256 1 "register_operand" "x")
-          (match_operand:VF_128_256 2 "nonimmediate_operand" "xm")
+          (match_operand:VF_128_256 2 "nonimmediate_operand" "xjm")
           (match_operand:SI 3 "const_0_to_31_operand")]
          UNSPEC_PCMP))]
   "TARGET_AVX"
   "vcmp<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
   [(set_attr "type" "ssecmp")
+   (set_attr "gpr32" "0")
    (set_attr "length_immediate" "1")
    (set_attr "prefix" "vex")
    (set_attr "mode" "<MODE>")])
        (vec_merge:VF_128
          (unspec:VF_128
            [(match_operand:VF_128 1 "register_operand" "x")
-            (match_operand:VF_128 2 "nonimmediate_operand" "xm")
+            (match_operand:VF_128 2 "nonimmediate_operand" "xjm")
             (match_operand:SI 3 "const_0_to_31_operand")]
            UNSPEC_PCMP)
         (match_dup 1)
   "TARGET_AVX"
   "vcmp<ssescalarmodesuffix>\t{%3, %2, %1, %0|%0, %1, %<iptr>2, %3}"
   [(set_attr "type" "ssecmp")
+   (set_attr "gpr32" "0")
    (set_attr "length_immediate" "1")
    (set_attr "prefix" "vex")
    (set_attr "mode" "<ssescalarmode>")])
   [(set (match_operand:VF_128_256 0 "register_operand" "=x,x")
        (match_operator:VF_128_256 3 "sse_comparison_operator"
          [(match_operand:VF_128_256 1 "register_operand" "%0,x")
-          (match_operand:VF_128_256 2 "vector_operand" "xBm,xm")]))]
+          (match_operand:VF_128_256 2 "vector_operand" "xBm,xjm")]))]
   "TARGET_SSE
    && GET_RTX_CLASS (GET_CODE (operands[3])) == RTX_COMM_COMPARE"
   "@
    cmp%D3<ssemodesuffix>\t{%2, %0|%0, %2}
    vcmp%D3<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
   [(set_attr "isa" "noavx,avx")
+   (set_attr "gpr32" "1,0")
    (set_attr "type" "ssecmp")
    (set_attr "length_immediate" "1")
    (set_attr "prefix" "orig,vex")
   [(set (match_operand:VF_128_256 0 "register_operand" "=x,x")
        (match_operator:VF_128_256 3 "sse_comparison_operator"
          [(match_operand:VF_128_256 1 "register_operand" "0,x")
-          (match_operand:VF_128_256 2 "vector_operand" "xBm,xm")]))]
+          (match_operand:VF_128_256 2 "vector_operand" "xBm,xjm")]))]
   "TARGET_SSE"
   "@
    cmp%D3<ssemodesuffix>\t{%2, %0|%0, %2}
    vcmp%D3<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
   [(set_attr "isa" "noavx,avx")
+   (set_attr "gpr32" "1,0")
    (set_attr "type" "ssecmp")
    (set_attr "length_immediate" "1")
    (set_attr "prefix" "orig,vex")
        (vec_merge:VF_128
         (match_operator:VF_128 3 "sse_comparison_operator"
           [(match_operand:VF_128 1 "register_operand" "0,x")
-           (match_operand:VF_128 2 "nonimmediate_operand" "xm,xm")])
+           (match_operand:VF_128 2 "nonimmediate_operand" "xm,xjm")])
         (match_dup 1)
         (const_int 1)))]
   "TARGET_SSE"
    cmp%D3<ssescalarmodesuffix>\t{%2, %0|%0, %<iptr>2}
    vcmp%D3<ssescalarmodesuffix>\t{%2, %1, %0|%0, %1, %<iptr>2}"
   [(set_attr "isa" "noavx,avx")
+   (set_attr "gpr32" "1,0")
    (set_attr "type" "ssecmp")
    (set_attr "length_immediate" "1,*")
    (set_attr "prefix" "orig,vex")
        (and:VFB_128_256
          (not:VFB_128_256
            (match_operand:VFB_128_256 1 "register_operand" "0,x,v,v"))
-         (match_operand:VFB_128_256 2 "vector_operand" "xBm,xm,vm,vm")))]
+         (match_operand:VFB_128_256 2 "vector_operand" "xBm,xjm,vm,vm")))]
   "TARGET_SSE && <mask_avx512vl_condition>
    && (!<mask_applied> || <ssescalarmode>mode != HFmode)"
 {
   output_asm_insn (buf, operands);
   return "";
 }
-  [(set_attr "isa" "noavx,avx,avx512dq,avx512f")
+  [(set_attr "isa" "noavx,avx_noavx512f,avx512dq,avx512f")
+   (set_attr "gpr32" "1,0,1,1")
    (set_attr "type" "sselog")
    (set_attr "prefix" "orig,maybe_vex,evex,evex")
    (set (attr "mode")
                    (and (eq_attr "alternative" "1")
                         (match_test "!TARGET_AVX512DQ")))
                 (const_string "<sseintvecmode2>")
+              (and (not (match_test "<mask_applied>"))
+                   (eq_attr "alternative" "3")
+                   (match_test "!x86_evex_reg_mentioned_p (operands, 3)"))
+                (const_string "<MODE>")
               (eq_attr "alternative" "3")
                 (const_string "<sseintvecmode2>")
               (match_test "TARGET_AVX")
   [(set (match_operand:ANDNOT_MODE 0 "register_operand" "=x,x,v,v")
        (and:ANDNOT_MODE
          (not:ANDNOT_MODE (match_operand:ANDNOT_MODE 1 "register_operand" "0,x,v,v"))
-         (match_operand:ANDNOT_MODE 2 "vector_operand" "xBm,xm,vm,v")))]
+         (match_operand:ANDNOT_MODE 2 "vector_operand" "xBm,xjm,vm,v")))]
   "TARGET_SSE"
 {
   char buf[128];
   output_asm_insn (buf, operands);
   return "";
 }
-  [(set_attr "isa" "noavx,avx,avx512vl,avx512f")
+  [(set_attr "isa" "noavx,avx_noavx512f,avx512vl,avx512f")
+   (set_attr "gpr32" "1,0,1,1")
    (set_attr "type" "sselog")
    (set (attr "prefix_data16")
      (if_then_else
        (const_string "*")))
    (set_attr "prefix" "orig,vex,evex,evex")
    (set (attr "mode")
-       (cond [(eq_attr "alternative" "2")
+       (cond [(and (eq_attr "alternative" "3")
+                   (match_test "!x86_evex_reg_mentioned_p (operands, 3)"))
+                (const_string "TI")
+              (eq_attr "alternative" "2")
                 (const_string "TI")
               (eq_attr "alternative" "3")
                 (const_string "XI")
   "operands[1] = gen_lowpart (V16QImode, operands[1]);")
 
 (define_insn "vec_extract_hi_v32qi"
-  [(set (match_operand:V16QI 0 "nonimmediate_operand" "=xm,vm")
+  [(set (match_operand:V16QI 0 "nonimmediate_operand" "=xjm,vm")
        (vec_select:V16QI
          (match_operand:V32QI 1 "register_operand" "x,v")
          (parallel [(const_int 16) (const_int 17)
   [(set_attr "type" "sselog1")
    (set_attr "prefix_extra" "1")
    (set_attr "length_immediate" "1")
-   (set_attr "isa" "*,avx512vl")
+   (set_attr "isa" "noavx512vl,avx512vl")
+   (set_attr "gpr32" "0,1")
    (set_attr "prefix" "vex,evex")
    (set_attr "mode" "OI")])
 
    pcmpgt<ssemodesuffix>\t{%2, %0|%0, %2}
    vpcmpgt<ssemodesuffix>\t{%2, %1, %0|%0, %1, %2}"
   [(set_attr "isa" "noavx,avx")
+   (set_attr "gpr32" "1,0")
    (set_attr "type" "ssecmp")
    (set_attr "prefix" "orig,vex")
    (set_attr "mode" "TI")])
   [(set (match_operand:VI 0 "register_operand" "=x,x,v,v,v")
        (and:VI
          (not:VI (match_operand:VI 1 "bcst_vector_operand" "0,x,v,m,Br"))
-         (match_operand:VI 2 "bcst_vector_operand" "xBm,xm,vmBr,0,0")))]
+         (match_operand:VI 2 "bcst_vector_operand" "xBm,xjm,vmBr,0,0")))]
   "TARGET_SSE
    && (register_operand (operands[1], <MODE>mode)
        || register_operand (operands[2], <MODE>mode))"
   output_asm_insn (buf, operands);
   return "";
 }
-  [(set_attr "isa" "noavx,avx,avx,*,*")
+  [(set_attr "isa" "noavx,avx_noavx512f,avx512f,*,*")
+   (set_attr "gpr32" "1,0,1,1,1")
    (set_attr "type" "sselog")
    (set (attr "prefix_data16")
      (if_then_else
   [(set (match_operand:VI48_AVX_AVX512F 0 "register_operand" "=x,x,v")
        (any_logic:VI48_AVX_AVX512F
          (match_operand:VI48_AVX_AVX512F 1 "bcst_vector_operand" "%0,x,v")
-         (match_operand:VI48_AVX_AVX512F 2 "bcst_vector_operand" "xBm,xm,vmBr")))]
+         (match_operand:VI48_AVX_AVX512F 2 "bcst_vector_operand" "xBm,xjm,vmBr")))]
   "TARGET_SSE && <mask_mode512bit_condition>
    && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)"
 {
        case E_V4DImode:
        case E_V4SImode:
        case E_V2DImode:
-         ssesuffix = (TARGET_AVX512VL
-                      && (<mask_applied> || which_alternative == 2)
-                      ? "<ssemodesuffix>" : "");
+         ssesuffix = ((TARGET_AVX512VL
+                       && (<mask_applied> || which_alternative == 2))
+                      || (MEM_P (operands[2]) && which_alternative == 2
+                          && x86_extended_rex2reg_mentioned_p (operands[2])))
+                      ? "<ssemodesuffix>" : "";
          break;
        default:
          gcc_unreachable ();
   output_asm_insn (buf, operands);
   return "";
 }
-  [(set_attr "isa" "noavx,avx,avx")
+  [(set_attr "isa" "noavx,avx_noavx512f,avx512f")
+   (set_attr "gpr32" "1,0,1")
    (set_attr "type" "sselog")
    (set (attr "prefix_data16")
      (if_then_else
   [(set (match_operand:VI12_AVX_AVX512F 0 "register_operand" "=x,x,v")
        (any_logic:VI12_AVX_AVX512F
          (match_operand:VI12_AVX_AVX512F 1 "vector_operand" "%0,x,v")
-         (match_operand:VI12_AVX_AVX512F 2 "vector_operand" "xBm,xm,vm")))]
+         (match_operand:VI12_AVX_AVX512F 2 "vector_operand" "xBm,xjm,vm")))]
   "TARGET_SSE && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
 {
   char buf[64];
        case E_V16HImode:
        case E_V16QImode:
        case E_V8HImode:
-         ssesuffix = TARGET_AVX512VL && which_alternative == 2 ? "q" : "";
+         ssesuffix = (((TARGET_AVX512VL && which_alternative == 2)
+                      || (MEM_P (operands[2]) && which_alternative == 2
+                          && x86_extended_rex2reg_mentioned_p (operands[2]))))
+                      ? "q" : "";
          break;
        default:
          gcc_unreachable ();
   output_asm_insn (buf, operands);
   return "";
 }
-  [(set_attr "isa" "noavx,avx,avx")
+  [(set_attr "isa" "noavx,avx_noavx512f,avx512f")
+   (set_attr "gpr32" "1,0,1")
    (set_attr "type" "sselog")
    (set (attr "prefix_data16")
      (if_then_else
   [(set (match_operand:V1TI 0 "register_operand" "=x,x,v")
        (any_logic:V1TI
          (match_operand:V1TI 1 "register_operand" "%0,x,v")
-         (match_operand:V1TI 2 "vector_operand" "xBm,xm,vm")))]
+         (match_operand:V1TI 2 "vector_operand" "xBm,xjm,vm")))]
   "TARGET_SSE2"
   "@
    p<logic>\t{%2, %0|%0, %2}
    vp<logic>\t{%2, %1, %0|%0, %1, %2}
    vp<logic>d\t{%2, %1, %0|%0, %1, %2}"
-  [(set_attr "isa" "noavx,avx,avx512vl")
+  [(set_attr "isa" "noavx,avx_noavx512vl,avx512vl")
+   (set_attr "gpr32" "1,0,1")
    (set_attr "prefix" "orig,vex,evex")
    (set_attr "prefix_data16" "1,*,*")
    (set_attr "type" "sselog")
    (set_attr "mode" "<sseinsnmode>")])
 
 (define_insn "<sse>_movmsk<ssemodesuffix><avxsizesuffix>"
-  [(set (match_operand:SI 0 "register_operand" "=r")
+  [(set (match_operand:SI 0 "register_operand" "=r,jr")
        (unspec:SI
-         [(match_operand:VF_128_256 1 "register_operand" "x")]
+         [(match_operand:VF_128_256 1 "register_operand" "x,x")]
          UNSPEC_MOVMSK))]
   "TARGET_SSE"
   "%vmovmsk<ssemodesuffix>\t{%1, %0|%0, %1}"
-  [(set_attr "type" "ssemov")
-   (set_attr "prefix" "maybe_vex")
+  [(set_attr "isa" "noavx,avx")
+   (set_attr "type" "ssemov")
+   (set_attr "prefix" "maybe_evex")
    (set_attr "mode" "<MODE>")])
 
 (define_insn "*<sse>_movmsk<ssemodesuffix><avxsizesuffix>_<u>ext"
-  [(set (match_operand:DI 0 "register_operand" "=r")
+  [(set (match_operand:DI 0 "register_operand" "=r,jr")
        (any_extend:DI
          (unspec:SI
-           [(match_operand:VF_128_256 1 "register_operand" "x")]
+           [(match_operand:VF_128_256 1 "register_operand" "x,x")]
            UNSPEC_MOVMSK)))]
   "TARGET_64BIT && TARGET_SSE"
-  "%vmovmsk<ssemodesuffix>\t{%1, %k0|%k0, %1}"
-  [(set_attr "type" "ssemov")
-   (set_attr "prefix" "maybe_vex")
+  "%vmovmsk<ssemodesuffix>\t{%1, %0|%0, %1}"
+  [(set_attr "isa" "noavx,avx")
+   (set_attr "type" "ssemov")
+   (set_attr "prefix" "maybe_evex")
    (set_attr "mode" "<MODE>")])
 
 (define_insn_and_split "*<sse>_movmsk<ssemodesuffix><avxsizesuffix>_lt"
-  [(set (match_operand:SI 0 "register_operand" "=r")
+  [(set (match_operand:SI 0 "register_operand" "=r,jr")
        (unspec:SI
          [(lt:VF_128_256
-            (match_operand:<sseintvecmode> 1 "register_operand" "x")
+            (match_operand:<sseintvecmode> 1 "register_operand" "x,x")
             (match_operand:<sseintvecmode> 2 "const0_operand"))]
          UNSPEC_MOVMSK))]
   "TARGET_SSE"
   [(set (match_dup 0)
        (unspec:SI [(match_dup 1)] UNSPEC_MOVMSK))]
   "operands[1] = gen_lowpart (<MODE>mode, operands[1]);"
-  [(set_attr "type" "ssemov")
+  [(set_attr "isa" "noavx,avx")
+   (set_attr "type" "ssemov")
    (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "<MODE>")])
 
 (define_insn_and_split "*<sse>_movmsk<ssemodesuffix><avxsizesuffix>_<u>ext_lt"
-  [(set (match_operand:DI 0 "register_operand" "=r")
+  [(set (match_operand:DI 0 "register_operand" "=r,jr")
        (any_extend:DI
          (unspec:SI
            [(lt:VF_128_256
-              (match_operand:<sseintvecmode> 1 "register_operand" "x")
+              (match_operand:<sseintvecmode> 1 "register_operand" "x,x")
               (match_operand:<sseintvecmode> 2 "const0_operand"))]
            UNSPEC_MOVMSK)))]
   "TARGET_64BIT && TARGET_SSE"
   [(set (match_dup 0)
        (any_extend:DI (unspec:SI [(match_dup 1)] UNSPEC_MOVMSK)))]
   "operands[1] = gen_lowpart (<MODE>mode, operands[1]);"
-  [(set_attr "type" "ssemov")
+  [(set_attr "isa" "noavx,avx")
+   (set_attr "type" "ssemov")
    (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "<MODE>")])
 
 (define_insn_and_split "*<sse>_movmsk<ssemodesuffix><avxsizesuffix>_shift"
-  [(set (match_operand:SI 0 "register_operand" "=r")
+  [(set (match_operand:SI 0 "register_operand" "=r,jr")
        (unspec:SI
          [(subreg:VF_128_256
             (ashiftrt:<sseintvecmode>
-              (match_operand:<sseintvecmode> 1 "register_operand" "x")
+              (match_operand:<sseintvecmode> 1 "register_operand" "x,x")
               (match_operand:QI 2 "const_int_operand")) 0)]
          UNSPEC_MOVMSK))]
   "TARGET_SSE"
   [(set (match_dup 0)
        (unspec:SI [(match_dup 1)] UNSPEC_MOVMSK))]
   "operands[1] = gen_lowpart (<MODE>mode, operands[1]);"
-  [(set_attr "type" "ssemov")
+  [(set_attr "isa" "noavx,avx")
+   (set_attr "type" "ssemov")
    (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "<MODE>")])
 
 (define_insn_and_split "*<sse>_movmsk<ssemodesuffix><avxsizesuffix>_<u>ext_shift"
-  [(set (match_operand:DI 0 "register_operand" "=r")
+  [(set (match_operand:DI 0 "register_operand" "=r,jr")
        (any_extend:DI
          (unspec:SI
            [(subreg:VF_128_256
               (ashiftrt:<sseintvecmode>
-                (match_operand:<sseintvecmode> 1 "register_operand" "x")
+                (match_operand:<sseintvecmode> 1 "register_operand" "x,x")
               (match_operand:QI 2 "const_int_operand")) 0)]
            UNSPEC_MOVMSK)))]
   "TARGET_64BIT && TARGET_SSE"
   [(set (match_dup 0)
        (any_extend:DI (unspec:SI [(match_dup 1)] UNSPEC_MOVMSK)))]
   "operands[1] = gen_lowpart (<MODE>mode, operands[1]);"
-  [(set_attr "type" "ssemov")
+  [(set_attr "isa" "noavx,avx")
+   (set_attr "type" "ssemov")
    (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "<MODE>")])
 
 (define_insn "<sse2_avx2>_pmovmskb"
-  [(set (match_operand:SI 0 "register_operand" "=r")
+  [(set (match_operand:SI 0 "register_operand" "=r,jr")
        (unspec:SI
-         [(match_operand:VI1_AVX2 1 "register_operand" "x")]
+         [(match_operand:VI1_AVX2 1 "register_operand" "x,x")]
          UNSPEC_MOVMSK))]
   "TARGET_SSE2"
   "%vpmovmskb\t{%1, %0|%0, %1}"
-  [(set_attr "type" "ssemov")
+  [(set_attr "isa" "noavx,avx")
+   (set_attr "type" "ssemov")
    (set (attr "prefix_data16")
      (if_then_else
        (match_test "TARGET_AVX")
    (set_attr "mode" "SI")])
 
 (define_insn "*<sse2_avx2>_pmovmskb_zext"
-  [(set (match_operand:DI 0 "register_operand" "=r")
+  [(set (match_operand:DI 0 "register_operand" "=r,jr")
        (zero_extend:DI
          (unspec:SI
-           [(match_operand:VI1_AVX2 1 "register_operand" "x")]
+           [(match_operand:VI1_AVX2 1 "register_operand" "x,x")]
            UNSPEC_MOVMSK)))]
   "TARGET_64BIT && TARGET_SSE2"
   "%vpmovmskb\t{%1, %k0|%k0, %1}"
-  [(set_attr "type" "ssemov")
+  [(set_attr "isa" "noavx,avx")
+   (set_attr "type" "ssemov")
    (set (attr "prefix_data16")
      (if_then_else
        (match_test "TARGET_AVX")
    (set_attr "mode" "SI")])
 
 (define_insn "*sse2_pmovmskb_ext"
-  [(set (match_operand:DI 0 "register_operand" "=r")
+  [(set (match_operand:DI 0 "register_operand" "=r,jr")
        (sign_extend:DI
          (unspec:SI
-           [(match_operand:V16QI 1 "register_operand" "x")]
+           [(match_operand:V16QI 1 "register_operand" "x,x")]
            UNSPEC_MOVMSK)))]
   "TARGET_64BIT && TARGET_SSE2"
   "%vpmovmskb\t{%1, %k0|%k0, %1}"
-  [(set_attr "type" "ssemov")
+  [(set_attr "isa" "noavx,avx")
+   (set_attr "type" "ssemov")
    (set (attr "prefix_data16")
      (if_then_else
        (match_test "TARGET_AVX")
 })
 
 (define_insn_and_split "*<sse2_avx2>_pmovmskb_lt"
-  [(set (match_operand:SI 0 "register_operand" "=r")
+  [(set (match_operand:SI 0 "register_operand" "=r,jr")
        (unspec:SI
-         [(lt:VI1_AVX2 (match_operand:VI1_AVX2 1 "register_operand" "x")
+         [(lt:VI1_AVX2 (match_operand:VI1_AVX2 1 "register_operand" "x,x")
                        (match_operand:VI1_AVX2 2 "const0_operand"))]
          UNSPEC_MOVMSK))]
   "TARGET_SSE2"
   [(set (match_dup 0)
        (unspec:SI [(match_dup 1)] UNSPEC_MOVMSK))]
   ""
-  [(set_attr "type" "ssemov")
+  [(set_attr "isa" "noavx,avx")
+   (set_attr "type" "ssemov")
    (set (attr "prefix_data16")
      (if_then_else
        (match_test "TARGET_AVX")
    (set_attr "mode" "SI")])
 
 (define_insn_and_split "*<sse2_avx2>_pmovmskb_zext_lt"
-  [(set (match_operand:DI 0 "register_operand" "=r")
+  [(set (match_operand:DI 0 "register_operand" "=r,jr")
        (zero_extend:DI
          (unspec:SI
-           [(lt:VI1_AVX2 (match_operand:VI1_AVX2 1 "register_operand" "x")
+           [(lt:VI1_AVX2 (match_operand:VI1_AVX2 1 "register_operand" "x,x")
                          (match_operand:VI1_AVX2 2 "const0_operand"))]
            UNSPEC_MOVMSK)))]
   "TARGET_64BIT && TARGET_SSE2"
   [(set (match_dup 0)
        (zero_extend:DI (unspec:SI [(match_dup 1)] UNSPEC_MOVMSK)))]
   ""
-  [(set_attr "type" "ssemov")
+  [(set_attr "isa" "noavx,avx")
+   (set_attr "type" "ssemov")
    (set (attr "prefix_data16")
      (if_then_else
        (match_test "TARGET_AVX")
    (set_attr "mode" "SI")])
 
 (define_insn_and_split "*sse2_pmovmskb_ext_lt"
-  [(set (match_operand:DI 0 "register_operand" "=r")
+  [(set (match_operand:DI 0 "register_operand" "=r,jr")
        (sign_extend:DI
          (unspec:SI
-           [(lt:V16QI (match_operand:V16QI 1 "register_operand" "x")
+           [(lt:V16QI (match_operand:V16QI 1 "register_operand" "x,x")
                       (match_operand:V16QI 2 "const0_operand"))]
            UNSPEC_MOVMSK)))]
   "TARGET_64BIT && TARGET_SSE2"
   [(set (match_dup 0)
        (sign_extend:DI (unspec:SI [(match_dup 1)] UNSPEC_MOVMSK)))]
   ""
-  [(set_attr "type" "ssemov")
+  [(set_attr "isa" "noavx,avx")
+   (set_attr "type" "ssemov")
    (set (attr "prefix_data16")
      (if_then_else
        (match_test "TARGET_AVX")
    (set_attr "mode" "TI")])
 
 (define_insn "sse_ldmxcsr"
-  [(unspec_volatile [(match_operand:SI 0 "memory_operand" "m")]
+  [(unspec_volatile [(match_operand:SI 0 "memory_operand" "m,jm")]
                    UNSPECV_LDMXCSR)]
   "TARGET_SSE"
   "%vldmxcsr\t%0"
-  [(set_attr "type" "sse")
+  [(set_attr "isa" "noavx,avx")
+   (set_attr "type" "sse")
+   (set_attr "gpr32" "1,0")
    (set_attr "atom_sse_attr" "mxcsr")
    (set_attr "prefix" "maybe_vex")
    (set_attr "memory" "load")])
 
 (define_insn "sse_stmxcsr"
-  [(set (match_operand:SI 0 "memory_operand" "=m")
+  [(set (match_operand:SI 0 "memory_operand" "=m,jm")
        (unspec_volatile:SI [(const_int 0)] UNSPECV_STMXCSR))]
   "TARGET_SSE"
   "%vstmxcsr\t%0"
-  [(set_attr "type" "sse")
+  [(set_attr "isa" "noavx,avx")
+   (set_attr "type" "sse")
+   (set_attr "gpr32" "0")
    (set_attr "atom_sse_attr" "mxcsr")
    (set_attr "prefix" "maybe_vex")
    (set_attr "memory" "store")])
 (define_insn "avx_vtest<ssemodesuffix><avxsizesuffix>"
   [(set (reg:CC FLAGS_REG)
        (unspec:CC [(match_operand:VF_128_256 0 "register_operand" "x")
-                   (match_operand:VF_128_256 1 "nonimmediate_operand" "xm")]
+                   (match_operand:VF_128_256 1 "nonimmediate_operand" "xjm")]
                   UNSPEC_VTESTP))]
   "TARGET_AVX"
   "vtest<ssemodesuffix>\t{%1, %0|%0, %1}"
   [(set_attr "type" "ssecomi")
+   (set_attr "gpr32" "0")
    (set_attr "prefix_extra" "1")
    (set_attr "prefix" "vex")
    (set_attr "mode" "<MODE>")])
 (define_insn "avx_vbroadcastf128_<mode>"
   [(set (match_operand:V_256 0 "register_operand" "=x,x,x,v,v,v,v")
        (vec_concat:V_256
-         (match_operand:<ssehalfvecmode> 1 "nonimmediate_operand" "m,0,?x,m,0,m,0")
+         (match_operand:<ssehalfvecmode> 1 "nonimmediate_operand" "jm,0,?x,m,0,m,0")
          (match_dup 1)))]
   "TARGET_AVX"
   "@
    vinsert<i128vldq>\t{$1, %1, %0, %0|%0, %0, %1, 1}
    vbroadcast<shuffletype>32x4\t{%1, %0|%0, %1}
    vinsert<shuffletype>32x4\t{$1, %1, %0, %0|%0, %0, %1, 1}"
-  [(set_attr "isa" "*,*,*,avx512dq,avx512dq,avx512vl,avx512vl")
+  [(set_attr "isa" "noavx512vl,*,*,avx512dq,avx512dq,avx512vl,avx512vl")
    (set_attr "type" "ssemov,sselog1,sselog1,ssemov,sselog1,ssemov,sselog1")
+   (set_attr "gpr32" "0,1,1,1,1,1,1")
    (set_attr "prefix_extra" "1")
    (set_attr "length_immediate" "0,1,1,0,1,0,1")
    (set_attr "prefix" "vex,vex,vex,evex,evex,evex,evex")
   [(set (match_operand:AVX256MODE2P 0 "register_operand" "=x")
        (unspec:AVX256MODE2P
          [(match_operand:AVX256MODE2P 1 "register_operand" "x")
-          (match_operand:AVX256MODE2P 2 "nonimmediate_operand" "xm")
+          (match_operand:AVX256MODE2P 2 "nonimmediate_operand" "xjm")
           (match_operand:SI 3 "const_0_to_255_operand")]
          UNSPEC_VPERMIL2F128))]
   "TARGET_AVX"
   "vperm2<i128>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
   [(set_attr "type" "sselog")
+   (set_attr "gpr32" "0")
    (set_attr "prefix_extra" "1")
    (set_attr "length_immediate" "1")
    (set_attr "prefix" "vex")
 })
 
 (define_insn "vec_set_lo_<mode><mask_name>"
-  [(set (match_operand:VI8F_256 0 "register_operand" "=v")
+  [(set (match_operand:VI8F_256 0 "register_operand" "=x,v")
        (vec_concat:VI8F_256
-         (match_operand:<ssehalfvecmode> 2 "nonimmediate_operand" "vm")
+         (match_operand:<ssehalfvecmode> 2 "nonimmediate_operand" "xjm,vm")
          (vec_select:<ssehalfvecmode>
-           (match_operand:VI8F_256 1 "register_operand" "v")
+           (match_operand:VI8F_256 1 "register_operand" "x,v")
            (parallel [(const_int 2) (const_int 3)]))))]
   "TARGET_AVX && <mask_avx512dq_condition>"
 {
   else
     return "vinsert<i128>\t{$0x0, %2, %1, %0|%0, %1, %2, 0x0}";
 }
-  [(set_attr "type" "sselog")
+  [(set_attr "isa" "noavx512vl,avx512vl")
+   (set_attr "gpr32" "0,1")
+   (set_attr "type" "sselog")
    (set_attr "prefix_extra" "1")
    (set_attr "length_immediate" "1")
    (set_attr "prefix" "vex")
    (set_attr "mode" "<sseinsnmode>")])
 
 (define_insn "vec_set_lo_<mode><mask_name>"
-  [(set (match_operand:VI4F_256 0 "register_operand" "=v")
+  [(set (match_operand:VI4F_256 0 "register_operand" "=x,v")
        (vec_concat:VI4F_256
-         (match_operand:<ssehalfvecmode> 2 "nonimmediate_operand" "vm")
+         (match_operand:<ssehalfvecmode> 2 "nonimmediate_operand" "xjm,vm")
          (vec_select:<ssehalfvecmode>
-           (match_operand:VI4F_256 1 "register_operand" "v")
+           (match_operand:VI4F_256 1 "register_operand" "x,v")
            (parallel [(const_int 4) (const_int 5)
                       (const_int 6) (const_int 7)]))))]
   "TARGET_AVX"
   else
     return "vinsert<i128>\t{$0x0, %2, %1, %0|%0, %1, %2, 0x0}";
 }
-  [(set_attr "type" "sselog")
+  [(set_attr "isa" "noavx512vl,avx512vl")
+   (set_attr "gpr32" "0,1")
+   (set_attr "type" "sselog")
    (set_attr "prefix_extra" "1")
    (set_attr "length_immediate" "1")
    (set_attr "prefix" "vex")
    (set_attr "mode" "<sseinsnmode>")])
 
 (define_insn "vec_set_hi_<mode><mask_name>"
-  [(set (match_operand:VI4F_256 0 "register_operand" "=v")
+  [(set (match_operand:VI4F_256 0 "register_operand" "=x,v")
        (vec_concat:VI4F_256
          (vec_select:<ssehalfvecmode>
-           (match_operand:VI4F_256 1 "register_operand" "v")
+           (match_operand:VI4F_256 1 "register_operand" "x,v")
            (parallel [(const_int 0) (const_int 1)
                       (const_int 2) (const_int 3)]))
-         (match_operand:<ssehalfvecmode> 2 "nonimmediate_operand" "vm")))]
+         (match_operand:<ssehalfvecmode> 2 "nonimmediate_operand" "xjm,vm")))]
   "TARGET_AVX"
 {
   if (TARGET_AVX512VL)
   else
     return "vinsert<i128>\t{$0x1, %2, %1, %0|%0, %1, %2, 0x1}";
 }
-  [(set_attr "type" "sselog")
+  [(set_attr "isa" "noavx512vl,avx512vl")
+   (set_attr "gpr32" "0,1")
+   (set_attr "type" "sselog")
    (set_attr "prefix_extra" "1")
    (set_attr "length_immediate" "1")
    (set_attr "prefix" "vex")
 (define_insn "vec_set_lo_<mode>"
   [(set (match_operand:V16_256 0 "register_operand" "=x,v")
        (vec_concat:V16_256
-         (match_operand:<ssehalfvecmode> 2 "nonimmediate_operand" "xm,vm")
+         (match_operand:<ssehalfvecmode> 2 "nonimmediate_operand" "xjm,vm")
          (vec_select:<ssehalfvecmode>
            (match_operand:V16_256 1 "register_operand" "x,v")
            (parallel [(const_int 8) (const_int 9)
   "@
    vinsert%~128\t{$0x0, %2, %1, %0|%0, %1, %2, 0x0}
    vinserti32x4\t{$0x0, %2, %1, %0|%0, %1, %2, 0x0}"
-  [(set_attr "type" "sselog")
+  [(set_attr "isa" "noavx512vl,avx512vl")
+   (set_attr "gpr32" "0,1")
+   (set_attr "type" "sselog")
    (set_attr "prefix_extra" "1")
    (set_attr "length_immediate" "1")
    (set_attr "prefix" "vex,evex")
                       (const_int 2) (const_int 3)
                       (const_int 4) (const_int 5)
                       (const_int 6) (const_int 7)]))
-         (match_operand:<ssehalfvecmode> 2 "nonimmediate_operand" "xm,vm")))]
+         (match_operand:<ssehalfvecmode> 2 "nonimmediate_operand" "xjm,vm")))]
   "TARGET_AVX"
   "@
    vinsert%~128\t{$0x1, %2, %1, %0|%0, %1, %2, 0x1}
    vinserti32x4\t{$0x1, %2, %1, %0|%0, %1, %2, 0x1}"
-  [(set_attr "type" "sselog")
+  [(set_attr "isa" "noavx512vl,avx512vl")
+   (set_attr "gpr32" "0,1")
+   (set_attr "type" "sselog")
    (set_attr "prefix_extra" "1")
    (set_attr "length_immediate" "1")
    (set_attr "prefix" "vex,evex")
 (define_insn "vec_set_lo_v32qi"
   [(set (match_operand:V32QI 0 "register_operand" "=x,v")
        (vec_concat:V32QI
-         (match_operand:V16QI 2 "nonimmediate_operand" "xm,v")
+         (match_operand:V16QI 2 "nonimmediate_operand" "xjm,v")
          (vec_select:V16QI
            (match_operand:V32QI 1 "register_operand" "x,v")
            (parallel [(const_int 16) (const_int 17)
   "@
    vinsert%~128\t{$0x0, %2, %1, %0|%0, %1, %2, 0x0}
    vinserti32x4\t{$0x0, %2, %1, %0|%0, %1, %2, 0x0}"
-  [(set_attr "type" "sselog")
+  [(set_attr "isa" "noavx512vl,avx512vl")
+   (set_attr "type" "sselog")
+   (set_attr "gpr32" "0,1")
    (set_attr "prefix_extra" "1")
    (set_attr "length_immediate" "1")
    (set_attr "prefix" "vex,evex")
                       (const_int 10) (const_int 11)
                       (const_int 12) (const_int 13)
                       (const_int 14) (const_int 15)]))
-         (match_operand:V16QI 2 "nonimmediate_operand" "xm,vm")))]
+         (match_operand:V16QI 2 "nonimmediate_operand" "xjm,vm")))]
   "TARGET_AVX"
   "@
    vinsert%~128\t{$0x1, %2, %1, %0|%0, %1, %2, 0x1}
    vinserti32x4\t{$0x1, %2, %1, %0|%0, %1, %2, 0x1}"
-  [(set_attr "type" "sselog")
+  [(set_attr "isa" "noavx512vl,avx512vl")
+   (set_attr "gpr32" "0")
+   (set_attr "type" "sselog")
    (set_attr "prefix_extra" "1")
    (set_attr "length_immediate" "1")
    (set_attr "prefix" "vex,evex")
   [(set (match_operand:V48_128_256 0 "register_operand" "=x")
        (unspec:V48_128_256
          [(match_operand:<sseintvecmode> 2 "register_operand" "x")
-          (match_operand:V48_128_256 1 "memory_operand" "m")]
+          (match_operand:V48_128_256 1 "memory_operand" "jm")]
          UNSPEC_MASKMOV))]
   "TARGET_AVX"
 {
     return "vmaskmov<ssefltmodesuffix>\t{%1, %2, %0|%0, %2, %1}";
 }
   [(set_attr "type" "sselog1")
+   (set_attr "gpr32" "0")
    (set_attr "prefix_extra" "1")
    (set_attr "prefix" "vex")
    (set_attr "btver2_decode" "vector")
    (set_attr "mode" "<sseinsnmode>")])
 
 (define_insn "<avx_avx2>_maskstore<ssemodesuffix><avxsizesuffix>"
-  [(set (match_operand:V48_128_256 0 "memory_operand" "+m")
+  [(set (match_operand:V48_128_256 0 "memory_operand" "+jm")
        (unspec:V48_128_256
          [(match_operand:<sseintvecmode> 1 "register_operand" "x")
           (match_operand:V48_128_256 2 "register_operand" "x")
     return "vmaskmov<ssefltmodesuffix>\t{%2, %1, %0|%0, %1, %2}";
 }
   [(set_attr "type" "sselog1")
+   (set_attr "gpr32" "0")
    (set_attr "prefix_extra" "1")
    (set_attr "prefix" "vex")
    (set_attr "btver2_decode" "vector") 
   [(set (match_operand:V_256_512 0 "register_operand" "=x,v,x,Yv")
        (vec_concat:V_256_512
          (match_operand:<ssehalfvecmode> 1 "nonimmediate_operand" "x,v,xm,vm")
-         (match_operand:<ssehalfvecmode> 2 "nonimm_or_0_operand" "xBt,vm,C,C")))]
+         (match_operand:<ssehalfvecmode> 2 "nonimm_or_0_operand" "xjm,vm,C,C")))]
   "TARGET_AVX
    && (operands[2] == CONST0_RTX (<ssehalfvecmode>mode)
        || !MEM_P (operands[1]))"
          [(match_operand:VEC_GATHER_MODE 2 "register_operand" "0")
           (match_operator:<ssescalarmode> 7 "vsib_mem_operator"
             [(unspec:P
-               [(match_operand:P 3 "vsib_address_operand" "Tv")
+               [(match_operand:P 3 "vsib_address_operand" "jb")
                 (match_operand:<VEC_GATHER_IDXSI> 4 "register_operand" "x")
                 (match_operand:SI 6 "const1248_operand")]
                UNSPEC_VSIBADDR)])
   "TARGET_AVX2"
   "%M3v<sseintprefix>gatherd<ssemodesuffix>\t{%1, %7, %0|%0, %7, %1}"
   [(set_attr "type" "ssemov")
+   (set_attr "gpr32" "0")
    (set_attr "prefix" "vex")
    (set_attr "mode" "<sseinsnmode>")])
 
          [(pc)
           (match_operator:<ssescalarmode> 6 "vsib_mem_operator"
             [(unspec:P
-               [(match_operand:P 2 "vsib_address_operand" "Tv")
+               [(match_operand:P 2 "vsib_address_operand" "jb")
                 (match_operand:<VEC_GATHER_IDXSI> 3 "register_operand" "x")
                 (match_operand:SI 5 "const1248_operand")]
                UNSPEC_VSIBADDR)])
   "TARGET_AVX2"
   "%M2v<sseintprefix>gatherd<ssemodesuffix>\t{%1, %6, %0|%0, %6, %1}"
   [(set_attr "type" "ssemov")
+   (set_attr "gpr32" "0")
    (set_attr "prefix" "vex")
    (set_attr "mode" "<sseinsnmode>")])
 
          [(match_operand:<VEC_GATHER_SRCDI> 2 "register_operand" "0")
           (match_operator:<ssescalarmode> 7 "vsib_mem_operator"
             [(unspec:P
-               [(match_operand:P 3 "vsib_address_operand" "Tv")
+               [(match_operand:P 3 "vsib_address_operand" "jb")
                 (match_operand:<VEC_GATHER_IDXDI> 4 "register_operand" "x")
                 (match_operand:SI 6 "const1248_operand")]
                UNSPEC_VSIBADDR)])
   "TARGET_AVX2"
   "%M3v<sseintprefix>gatherq<ssemodesuffix>\t{%5, %7, %2|%2, %7, %5}"
   [(set_attr "type" "ssemov")
+   (set_attr "gpr32" "0")
    (set_attr "prefix" "vex")
    (set_attr "mode" "<sseinsnmode>")])
 
          [(pc)
           (match_operator:<ssescalarmode> 6 "vsib_mem_operator"
             [(unspec:P
-               [(match_operand:P 2 "vsib_address_operand" "Tv")
+               [(match_operand:P 2 "vsib_address_operand" "jb")
                 (match_operand:<VEC_GATHER_IDXDI> 3 "register_operand" "x")
                 (match_operand:SI 5 "const1248_operand")]
                UNSPEC_VSIBADDR)])
   return "%M2v<sseintprefix>gatherq<ssemodesuffix>\t{%4, %6, %0|%0, %6, %4}";
 }
   [(set_attr "type" "ssemov")
+   (set_attr "gpr32" "0")
    (set_attr "prefix" "vex")
    (set_attr "mode" "<sseinsnmode>")])
 
            [(match_operand:<VEC_GATHER_SRCDI> 2 "register_operand" "0")
             (match_operator:<ssescalarmode> 7 "vsib_mem_operator"
               [(unspec:P
-                 [(match_operand:P 3 "vsib_address_operand" "Tv")
+                 [(match_operand:P 3 "vsib_address_operand" "jb")
                   (match_operand:<VEC_GATHER_IDXDI> 4 "register_operand" "x")
                   (match_operand:SI 6 "const1248_operand")]
                  UNSPEC_VSIBADDR)])
   "TARGET_AVX2"
   "%M3v<sseintprefix>gatherq<ssemodesuffix>\t{%5, %7, %0|%0, %7, %5}"
   [(set_attr "type" "ssemov")
+   (set_attr "gpr32" "0")
    (set_attr "prefix" "vex")
    (set_attr "mode" "<sseinsnmode>")])
 
            [(pc)
             (match_operator:<ssescalarmode> 6 "vsib_mem_operator"
               [(unspec:P
-                 [(match_operand:P 2 "vsib_address_operand" "Tv")
+                 [(match_operand:P 2 "vsib_address_operand" "jb")
                   (match_operand:<VEC_GATHER_IDXDI> 3 "register_operand" "x")
                   (match_operand:SI 5 "const1248_operand")]
                  UNSPEC_VSIBADDR)])
   "TARGET_AVX2"
   "%M2v<sseintprefix>gatherq<ssemodesuffix>\t{%4, %6, %0|%0, %6, %4}"
   [(set_attr "type" "ssemov")
+   (set_attr "gpr32" "0")
    (set_attr "prefix" "vex")
    (set_attr "mode" "<sseinsnmode>")])