S/390: movdf improvements
[gcc.git] / gcc / config / s390 / s390.md
index ca58c42fe4c850c6c43541140f3e1298f53400e7..554fb37a1c6e463cc6ea116b56427d452edd1f6a 100644 (file)
@@ -1,5 +1,5 @@
 ;;- Machine description for GNU compiler -- S/390 / zSeries version.
-;;  Copyright (C) 1999-2016 Free Software Foundation, Inc.
+;;  Copyright (C) 1999-2017 Free Software Foundation, Inc.
 ;;  Contributed by Hartmut Penner (hpenner@de.ibm.com) and
 ;;                 Ulrich Weigand (uweigand@de.ibm.com) and
 ;;                 Andreas Krebbel (Andreas.Krebbel@de.ibm.com)
    UNSPEC_VEC_UNPACKL
    UNSPEC_VEC_UNPACKL_L
    UNSPEC_VEC_ADDC
-   UNSPEC_VEC_ADDC_U128
    UNSPEC_VEC_ADDE_U128
    UNSPEC_VEC_ADDEC_U128
    UNSPEC_VEC_AVG
    UNSPEC_VEC_SRL
    UNSPEC_VEC_SRLB
 
-   UNSPEC_VEC_SUB_U128
    UNSPEC_VEC_SUBC
-   UNSPEC_VEC_SUBC_U128
    UNSPEC_VEC_SUBE_U128
    UNSPEC_VEC_SUBEC_U128
 
    ; Split stack support
    UNSPECV_SPLIT_STACK_CALL
    UNSPECV_SPLIT_STACK_DATA
+
+   UNSPECV_OSC_BREAK
   ])
 
 ;;
    (BASE_REGNUM                        13)
    ; Return address register.
    (RETURN_REGNUM              14)
+   ; Stack pointer register.
+   (STACK_REGNUM               15)
    ; Condition code register.
    (CC_REGNUM                  33)
    ; Thread local storage pointer register.
    (VR31_REGNUM                 53)
   ])
 
+; Rounding modes for binary floating point numbers
+(define_constants
+  [(BFP_RND_CURRENT                 0)
+   (BFP_RND_NEAREST_TIE_AWAY_FROM_0 1)
+   (BFP_RND_PREP_FOR_SHORT_PREC     3)
+   (BFP_RND_NEAREST_TIE_TO_EVEN     4)
+   (BFP_RND_TOWARD_0                5)
+   (BFP_RND_TOWARD_INF              6)
+   (BFP_RND_TOWARD_MINF             7)])
+
+; Rounding modes for decimal floating point numbers
+; 1-7 were introduced with the floating point extension facility
+; available with z196
+; With these rounding modes (1-7) a quantum exception might occur
+; which is suppressed for the other modes.
+(define_constants
+  [(DFP_RND_CURRENT                          0)
+   (DFP_RND_NEAREST_TIE_AWAY_FROM_0_QUANTEXC 1)
+   (DFP_RND_CURRENT_QUANTEXC                 2)
+   (DFP_RND_PREP_FOR_SHORT_PREC_QUANTEXC     3)
+   (DFP_RND_NEAREST_TIE_TO_EVEN_QUANTEXC     4)
+   (DFP_RND_TOWARD_0_QUANTEXC                5)
+   (DFP_RND_TOWARD_INF_QUANTEXC              6)
+   (DFP_RND_TOWARD_MINF_QUANTEXC             7)
+   (DFP_RND_NEAREST_TIE_TO_EVEN              8)
+   (DFP_RND_TOWARD_0                         9)
+   (DFP_RND_TOWARD_INF                      10)
+   (DFP_RND_TOWARD_MINF                     11)
+   (DFP_RND_NEAREST_TIE_AWAY_FROM_0         12)
+   (DFP_RND_NEAREST_TIE_TO_0                13)
+   (DFP_RND_AWAY_FROM_0                     14)
+   (DFP_RND_PREP_FOR_SHORT_PREC             15)])
+
 ;;
 ;; PFPO GPR0 argument format
 ;;
   (const (symbol_ref "s390_tune_attr")))
 
 (define_attr "cpu_facility"
-  "standard,ieee,zarch,cpu_zarch,longdisp,extimm,dfp,z10,z196,zEC12,vec"
+  "standard,ieee,zarch,cpu_zarch,longdisp,extimm,dfp,z10,z196,zEC12,vx,z13"
   (const_string "standard"))
 
 (define_attr "enabled" ""
               (match_test "TARGET_ZEC12"))
         (const_int 1)
 
-         (and (eq_attr "cpu_facility" "vec")
+         (and (eq_attr "cpu_facility" "vx")
               (match_test "TARGET_VX"))
-        (const_int 1)]
+        (const_int 1)
+
+         (and (eq_attr "cpu_facility" "z13")
+              (match_test "TARGET_Z13"))
+        (const_int 1)
+        ]
        (const_int 0)))
 
 ;; Pipeline description for z900.  For lack of anything better,
 ;; same template.
 (define_mode_iterator INT [(DI "TARGET_ZARCH") SI HI QI])
 (define_mode_iterator DINT [(TI "TARGET_ZARCH") DI SI HI QI])
+(define_mode_iterator SINT [SI HI QI])
 
 ;; This iterator allows some 'ashift' and 'lshiftrt' pattern to be defined from
 ;; the same template.
 
 ;; In place of GET_MODE_BITSIZE (<MODE>mode)
 (define_mode_attr bitsize [(DI "64") (SI "32") (HI "16") (QI "8")])
+;; 64 - bitsize
+(define_mode_attr bitoff [(DI "0") (SI "32") (HI "48") (QI "56")])
+(define_mode_attr bitoff_plus [(DI "") (SI "32+") (HI "48+") (QI "56+")])
 
 ;; In place of GET_MODE_SIZE (<MODE>mode)
 (define_mode_attr modesize [(DI "8") (SI "4")])
 ; Used with VFCMP to expand part of the mnemonic
 ; For fp we have a mismatch: eq in the insn name - e in asm
 (define_mode_attr asm_fcmp [(CCVEQ "e") (CCVFH "h") (CCVFHE "he")])
-(define_mode_attr insn_cmp [(CCVEQ "eq") (CCVH "h") (CCVHU "hl") (CCVFH "h") (CCVFHE "he")])
+(define_mode_attr insn_cmp [(CCVEQ "eq") (CCVIH "h") (CCVIHU "hl") (CCVFH "h") (CCVFHE "he")])
 
 ;; Subst pattern definitions
 (include "subst.md")
    tm\t%S0,%b1
    tmy\t%S0,%b1"
   [(set_attr "op_type" "SI,SIY")
+   (set_attr "cpu_facility" "*,longdisp")
    (set_attr "z10prop" "z10_super,z10_super")])
 
 (define_insn "*tmdi_reg"
         (compare
           (ashiftrt:DI
             (ashift:DI
-              (subreg:DI (match_operand:SI 0 "nonimmediate_operand" "d,RT") 0)
+              (subreg:DI (match_operand:SI 0 "nonimmediate_operand" "d,T") 0)
              (const_int 32)) (const_int 32))
          (match_operand:DI 1 "const0_operand" "")))
    (set (match_operand:DI 2 "register_operand" "=d,d")
 ; ltr, lt, ltgr, ltg
 (define_insn "*tst<mode>_extimm"
   [(set (reg CC_REGNUM)
-        (compare (match_operand:GPR 0 "nonimmediate_operand" "d,RT")
+        (compare (match_operand:GPR 0 "nonimmediate_operand" "d,T")
                  (match_operand:GPR 1 "const0_operand" "")))
    (set (match_operand:GPR 2 "register_operand" "=d,d")
         (match_dup 0))]
 ; ltr, lt, ltgr, ltg
 (define_insn "*tst<mode>_cconly_extimm"
   [(set (reg CC_REGNUM)
-        (compare (match_operand:GPR 0 "nonimmediate_operand" "d,RT")
+        (compare (match_operand:GPR 0 "nonimmediate_operand" "d,T")
                  (match_operand:GPR 1 "const0_operand" "")))
    (clobber (match_scratch:GPR 2 "=X,d"))]
   "s390_match_ccmode(insn, CCSmode) && TARGET_EXTIMM"
    icm\t%2,15,%S0
    icmy\t%2,15,%S0"
   [(set_attr "op_type" "RR,RS,RSY")
+   (set_attr "cpu_facility" "*,*,longdisp")
    (set_attr "z10prop" "z10_fr_E1,z10_super_E1,z10_super_E1")])
 
 (define_insn "*tstsi_cconly"
    icm\t%2,15,%S0
    icmy\t%2,15,%S0"
   [(set_attr "op_type" "RR,RS,RSY")
+   (set_attr "cpu_facility" "*,*,longdisp")
    (set_attr "z10prop" "z10_fr_E1,z10_super_E1,z10_super_E1")])
 
 (define_insn "*tstdi_cconly_31"
    icmy\t%2,<icm_lo>,%S0
    tml\t%0,<max_uint>"
   [(set_attr "op_type" "RS,RSY,RI")
+   (set_attr "cpu_facility" "*,longdisp,*")
    (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super")])
 
 (define_insn "*tsthiCCT_cconly"
    icmy\t%2,3,%S0
    tml\t%0,65535"
   [(set_attr "op_type" "RS,RSY,RI")
+   (set_attr "cpu_facility" "*,longdisp,*")
    (set_attr "z10prop" "z10_super_E1,z10_super_E1,z10_super")])
 
 (define_insn "*tstqiCCT_cconly"
    cliy\t%S0,0
    tml\t%0,255"
   [(set_attr "op_type" "SI,SIY,RI")
+   (set_attr "cpu_facility" "*,longdisp,*")
    (set_attr "z10prop" "z10_super,z10_super,z10_super")])
 
 (define_insn "*tst<mode>"
    icm\t%2,<icm_lo>,%S0
    icmy\t%2,<icm_lo>,%S0"
   [(set_attr "op_type" "RS,RSY")
+   (set_attr "cpu_facility" "*,longdisp")
    (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
 
 (define_insn "*tst<mode>_cconly"
    icm\t%2,<icm_lo>,%S0
    icmy\t%2,<icm_lo>,%S0"
   [(set_attr "op_type" "RS,RSY")
+   (set_attr "cpu_facility" "*,longdisp")
    (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
 
 
 (define_insn "*cmpdi_cct"
   [(set (reg CC_REGNUM)
         (compare (match_operand:DI 0 "nonimmediate_operand" "%d,d,d,d,Q")
-                 (match_operand:DI 1 "general_operand" "d,K,Os,RT,BQ")))]
+                 (match_operand:DI 1 "general_operand" "d,K,Os,T,BQ")))]
   "s390_match_ccmode (insn, CCTmode) && TARGET_ZARCH"
   "@
    cgr\t%0,%1
    cy\t%0,%1
    #"
   [(set_attr "op_type" "RR,RI,RIL,RX,RXY,SS")
+   (set_attr "cpu_facility" "*,*,*,*,longdisp,*")
    (set_attr "z10prop" "z10_super_c,z10_super,z10_super,z10_super,z10_super,*")])
 
 ; Compare (signed) instructions
 (define_insn "*cmpdi_ccs_sign"
   [(set (reg CC_REGNUM)
         (compare (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand"
-                                                    "d,RT,b"))
+                                                    "d,T,b"))
                  (match_operand:DI 0 "register_operand" "d, d,d")))]
   "s390_match_ccmode(insn, CCSRmode) && TARGET_ZARCH"
   "@
    chy\t%0,%1
    chrl\t%0,%1"
   [(set_attr "op_type"      "RX,RXY,RIL")
-   (set_attr "cpu_facility" "*,*,z10")
+   (set_attr "cpu_facility" "*,longdisp,z10")
    (set_attr "type"         "*,*,larl")
    (set_attr "z196prop" "z196_cracked,z196_cracked,z196_cracked")])
 
 
 (define_insn "*cmpdi_ccs_signhi_rl"
   [(set (reg CC_REGNUM)
-       (compare (sign_extend:DI (match_operand:HI 1 "memory_operand" "RT,b"))
+       (compare (sign_extend:DI (match_operand:HI 1 "memory_operand" "T,b"))
                 (match_operand:GPR 0 "register_operand"  "d,d")))]
   "s390_match_ccmode(insn, CCSRmode) && TARGET_Z10"
   "@
    c<y>\t%0,%1
    c<g>rl\t%0,%1"
   [(set_attr "op_type" "RR<E>,RI,SIL,RIL,RX<Y>,RXY,RIL")
-   (set_attr "cpu_facility" "*,*,z10,extimm,*,*,z10")
+   (set_attr "cpu_facility" "*,*,z10,extimm,*,longdisp,z10")
    (set_attr "type" "*,*,*,*,*,*,larl")
    (set_attr "z10prop" "z10_super_c,z10_super,z10_super,z10_super,z10_super,z10_super,z10_super")])
 
 (define_insn "*cmpdi_ccu_zero"
   [(set (reg CC_REGNUM)
         (compare (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand"
-                                                        "d,RT,b"))
-                 (match_operand:DI 0 "register_operand" "d, d,d")))]
+                                                        "d,T,b"))
+                 (match_operand:DI 0 "register_operand" "d,d,d")))]
   "s390_match_ccmode (insn, CCURmode) && TARGET_ZARCH"
   "@
    clgfr\t%0,%1
 (define_insn "*cmpdi_ccu"
   [(set (reg CC_REGNUM)
         (compare (match_operand:DI 0 "nonimmediate_operand"
-                                     "d, d,d,Q, d, Q,BQ")
+                                     "d, d,d,Q,d, Q,BQ")
                  (match_operand:DI 1 "general_operand"
-                                     "d,Op,b,D,RT,BQ,Q")))]
+                                     "d,Op,b,D,T,BQ,Q")))]
   "s390_match_ccmode (insn, CCUmode) && TARGET_ZARCH"
   "@
    clgr\t%0,%1
    #
    #"
   [(set_attr "op_type" "RR,RIL,RIL,SIL,RX,RXY,SS,SS")
-   (set_attr "cpu_facility" "*,extimm,z10,z10,*,*,*,*")
+   (set_attr "cpu_facility" "*,extimm,z10,z10,*,longdisp,*,*")
    (set_attr "type"         "*,*,larl,*,*,*,*,*")
    (set_attr "z10prop" "z10_super_c,z10_super,z10_super,z10_super,z10_super,z10_super,*,*")])
 
    #
    #"
   [(set_attr "op_type" "RS,RSY,SIL,SS,SS")
-   (set_attr "cpu_facility" "*,*,z10,*,*")
+   (set_attr "cpu_facility" "*,longdisp,z10,*,*")
    (set_attr "z10prop" "*,*,z10_super,*,*")])
 
 (define_insn "*cmpqi_ccu"
    #
    #"
   [(set_attr "op_type" "RS,RSY,SI,SIY,SS,SS")
+   (set_attr "cpu_facility" "*,longdisp,*,longdisp,*,*")
    (set_attr "z10prop" "*,*,z10_super,z10_super,*,*")])
 
 
 
 ; (TF|DF|SF|TD|DD|SD) instructions
 
+
+; load and test instructions turn SNaN into QNaN what is not
+; acceptable if the target will be used afterwards.  On the other hand
+; they are quite convenient for implementing comparisons with 0.0. So
+; try to enable them via splitter if the value isn't needed anymore.
+
 ; ltxbr, ltdbr, ltebr, ltxtr, ltdtr
 (define_insn "*cmp<mode>_ccs_0"
   [(set (reg CC_REGNUM)
-        (compare (match_operand:FP 0 "register_operand" "f")
-                 (match_operand:FP 1 "const0_operand"   "")))]
+       (compare (match_operand:FP 0 "register_operand"  "f")
+                (match_operand:FP 1 "const0_operand"    "")))
+   (clobber (match_operand:FP      2 "register_operand" "=0"))]
   "s390_match_ccmode(insn, CCSmode) && TARGET_HARD_FLOAT"
   "lt<xde><bt>r\t%0,%0"
    [(set_attr "op_type" "RRE")
     (set_attr "type"  "fsimp<mode>")])
 
+(define_split
+  [(set (match_operand 0 "cc_reg_operand")
+       (compare (match_operand:FP 1 "register_operand")
+                (match_operand:FP 2 "const0_operand")))]
+  "TARGET_HARD_FLOAT && REG_P (operands[1]) && dead_or_set_p (insn, operands[1])"
+  [(parallel
+    [(set (match_dup 0) (match_dup 3))
+     (clobber (match_dup 1))])]
+ {
+   /* s390_match_ccmode requires the compare to have the same CC mode
+      as the CC destination register.  */
+   operands[3] = gen_rtx_COMPARE (GET_MODE (operands[0]),
+                                 operands[1], operands[2]);
+ })
+
+
 ; cxtr, cxbr, cdtr, cdbr, cebr, cdb, ceb
 (define_insn "*cmp<mode>_ccs"
   [(set (reg CC_REGNUM)
        (compare:VFCMP (match_operand:DF 0 "register_operand" "v")
                       (match_operand:DF 1 "register_operand" "v")))
    (clobber (match_scratch:V2DI 2 "=v"))]
-  "TARGET_Z13 && TARGET_HARD_FLOAT"
+  "TARGET_VX && TARGET_HARD_FLOAT"
   "wfc<asm_fcmp>dbs\t%v2,%v0,%v1"
   [(set_attr "op_type" "VRR")])
 
 ; FIXME: More constants are possible by enabling jxx, jyy constraints
 ; for TImode (use double-int for the calculations)
 (define_insn "movti"
-  [(set (match_operand:TI 0 "nonimmediate_operand" "=d,QS,v,  v,  v,v,d, v,QR,   d,o")
-        (match_operand:TI 1 "general_operand"      "QS, d,v,j00,jm1,d,v,QR, v,dPRT,d"))]
+  [(set (match_operand:TI 0 "nonimmediate_operand" "=d,S,v,  v,  v,v,d,v,R,  d,o")
+        (match_operand:TI 1 "general_operand"      " S,d,v,j00,jm1,d,v,R,v,dPT,d"))]
   "TARGET_ZARCH"
   "@
    lmg\t%0,%N0,%S1
    #"
   [(set_attr "op_type" "RSY,RSY,VRR,VRI,VRI,VRR,*,VRX,VRX,*,*")
    (set_attr "type" "lm,stm,*,*,*,*,*,*,*,*,*")
-   (set_attr "cpu_facility" "*,*,vec,vec,vec,vec,vec,vec,vec,*,*")])
+   (set_attr "cpu_facility" "*,*,vx,vx,vx,vx,vx,vx,vx,*,*")])
 
 (define_split
   [(set (match_operand:TI 0 "nonimmediate_operand" "")
         (match_operand:TI 1 "general_operand" ""))]
   "TARGET_ZARCH && reload_completed
+   && !s_operand (operands[0], TImode)
+   && !s_operand (operands[1], TImode)
    && s390_split_ok_p (operands[0], operands[1], TImode, 0)"
   [(set (match_dup 2) (match_dup 4))
    (set (match_dup 3) (match_dup 5))]
   [(set (match_operand:TI 0 "nonimmediate_operand" "")
         (match_operand:TI 1 "general_operand" ""))]
   "TARGET_ZARCH && reload_completed
+   && !s_operand (operands[0], TImode)
+   && !s_operand (operands[1], TImode)
    && s390_split_ok_p (operands[0], operands[1], TImode, 1)"
   [(set (match_dup 2) (match_dup 4))
    (set (match_dup 3) (match_dup 5))]
 
 (define_insn "*movdi_64"
   [(set (match_operand:DI 0 "nonimmediate_operand"
-         "=d,    d,    d,    d,    d, d,    d,    d,f,d,d,d,d, d,RT,!*f,!*f,!*f,!R,!T,b,Q,d,t,Q,t,v,v,v,d, v,QR")
+         "=d,    d,    d,    d,    d, d,    d,    d,f,d,d,d,d,d,T,!*f,!*f,!*f,!R,!T,b,Q,d,t,Q,t,v,v,v,d,v,R")
         (match_operand:DI 1 "general_operand"
-         " K,N0HD0,N1HD0,N2HD0,N3HD0,Os,N0SD0,N1SD0,d,f,L,b,d,RT, d, *f,  R,  T,*f,*f,d,K,t,d,t,Q,K,v,d,v,QR, v"))]
+         " K,N0HD0,N1HD0,N2HD0,N3HD0,Os,N0SD0,N1SD0,d,f,L,b,d,T,d, *f,  R,  T,*f,*f,d,K,t,d,t,Q,K,v,d,v,R,v"))]
   "TARGET_ZARCH"
   "@
    lghi\t%0,%h1
                      *,*,*,*,*,*,*")
    (set_attr "cpu_facility" "*,*,*,*,*,extimm,extimm,extimm,dfp,dfp,longdisp,
                              z10,*,*,*,*,*,longdisp,*,longdisp,
-                             z10,z10,*,*,*,*,vec,vec,vec,vec,vec,vec")
+                             z10,z10,*,*,*,*,vx,vx,vx,vx,vx,vx")
    (set_attr "z10prop" "z10_fwd_A1,
                         z10_fwd_E1,
                         z10_fwd_E1,
 
 (define_insn "*movdi_31"
   [(set (match_operand:DI 0 "nonimmediate_operand"
-                            "=d,d,Q,S,d   ,o,!*f,!*f,!*f,!R,!T,d")
+                            "=d,d,Q,S,d  ,o,!*f,!*f,!*f,!R,!T,d")
         (match_operand:DI 1 "general_operand"
-                            " Q,S,d,d,dPRT,d, *f,  R,  T,*f,*f,b"))]
+                            " Q,S,d,d,dPT,d, *f,  R,  T,*f,*f,b"))]
   "!TARGET_ZARCH"
   "@
    lm\t%0,%N0,%S1
    #"
   [(set_attr "op_type" "RS,RSY,RS,RSY,*,*,RR,RX,RXY,RX,RXY,*")
    (set_attr "type" "lm,lm,stm,stm,*,*,floaddf,floaddf,floaddf,fstoredf,fstoredf,*")
-   (set_attr "cpu_facility" "*,*,*,*,*,*,*,*,*,*,*,z10")])
+   (set_attr "cpu_facility" "*,longdisp,*,longdisp,*,*,*,*,longdisp,*,longdisp,z10")])
 
 ; For a load from a symbol ref we can use one of the target registers
 ; together with larl to load the address.
   [(set (match_operand:DI 0 "nonimmediate_operand" "")
         (match_operand:DI 1 "general_operand" ""))]
   "!TARGET_ZARCH && reload_completed
+   && !s_operand (operands[0], DImode)
+   && !s_operand (operands[1], DImode)
    && s390_split_ok_p (operands[0], operands[1], DImode, 0)"
   [(set (match_dup 2) (match_dup 4))
    (set (match_dup 3) (match_dup 5))]
   [(set (match_operand:DI 0 "nonimmediate_operand" "")
         (match_operand:DI 1 "general_operand" ""))]
   "!TARGET_ZARCH && reload_completed
+   && !s_operand (operands[0], DImode)
+   && !s_operand (operands[1], DImode)
    && s390_split_ok_p (operands[0], operands[1], DImode, 1)"
   [(set (match_dup 2) (match_dup 4))
    (set (match_dup 3) (match_dup 5))]
 
 (define_insn "*la_64"
   [(set (match_operand:DI 0 "register_operand" "=d,d")
-        (match_operand:QI 1 "address_operand" "ZQZR,ZSZT"))]
+        (match_operand:QI 1 "address_operand" "ZR,ZT"))]
   "TARGET_64BIT"
   "@
    la\t%0,%a1
    lay\t%0,%a1"
   [(set_attr "op_type" "RX,RXY")
    (set_attr "type"    "la")
+   (set_attr "cpu_facility" "*,longdisp")
    (set_attr "z10prop" "z10_fwd_A1,z10_fwd_A1")])
 
 (define_peephole2
 
 (define_insn "*movsi_zarch"
   [(set (match_operand:SI 0 "nonimmediate_operand"
-        "=d,    d,    d, d,d,d,d,d,d,R,T,!*f,!*f,!*f,!*f,!*f,!R,!T,d,t,Q,b,Q,t,v,v,v,d, v,QR")
+        "=d,    d,    d, d,d,d,d,d,d,R,T,!*f,!*f,!*f,!*f,!*f,!R,!T,d,t,Q,b,Q,t,v,v,v,d,v,R")
         (match_operand:SI 1 "general_operand"
-        " K,N0HS0,N1HS0,Os,L,b,d,R,T,d,d, *f, *f,  R,  R,  T,*f,*f,t,d,t,d,K,Q,K,v,d,v,QR, v"))]
+        " K,N0HS0,N1HS0,Os,L,b,d,R,T,d,d, *f, *f,  R,  R,  T,*f,*f,t,d,t,d,K,Q,K,v,d,v,R,v"))]
   "TARGET_ZARCH"
   "@
    lhi\t%0,%h1
    ly\t%0,%1
    st\t%1,%0
    sty\t%1,%0
-   lder\t%0,%1
+   ldr\t%0,%1
    ler\t%0,%1
    lde\t%0,%1
    le\t%0,%1
    vlef\t%v0,%1,0
    vstef\t%v1,%0,0"
   [(set_attr "op_type" "RI,RI,RI,RIL,RXY,RIL,RR,RX,RXY,RX,RXY,
-                        RRE,RR,RXE,RX,RXY,RX,RXY,RRE,RRE,RS,RIL,SIL,RS,VRI,VRR,VRS,VRS,VRX,VRX")
+                        RR,RR,RXE,RX,RXY,RX,RXY,RRE,RRE,RS,RIL,SIL,RS,VRI,VRR,VRS,VRS,VRX,VRX")
    (set_attr "type" "*,
                      *,
                      *,
                      *,
                      *,*,*,*,*,*,*")
    (set_attr "cpu_facility" "*,*,*,extimm,longdisp,z10,*,*,longdisp,*,longdisp,
-                             vec,*,vec,*,longdisp,*,longdisp,*,*,*,z10,z10,*,vec,vec,vec,vec,vec,vec")
+                             vx,*,vx,*,longdisp,*,longdisp,*,*,*,z10,z10,*,vx,vx,vx,vx,vx,vx")
    (set_attr "z10prop" "z10_fwd_A1,
                         z10_fwd_E1,
                         z10_fwd_E1,
    lr\t%0,%1
    l\t%0,%1
    st\t%1,%0
-   lder\t%0,%1
+   ldr\t%0,%1
    ler\t%0,%1
    lde\t%0,%1
    le\t%0,%1
    sar\t%0,%1
    stam\t%1,%1,%S0
    lam\t%0,%0,%S1"
-  [(set_attr "op_type" "RI,RR,RX,RX,RRE,RR,RXE,RX,RX,RRE,RRE,RS,RS")
+  [(set_attr "op_type" "RI,RR,RX,RX,RR,RR,RXE,RX,RX,RRE,RRE,RS,RS")
    (set_attr "type" "*,lr,load,store,floadsf,floadsf,floadsf,floadsf,fstoresf,*,*,*,*")
    (set_attr "z10prop" "z10_fwd_A1,z10_fr_E1,z10_fwd_A3,z10_rec,*,*,*,*,*,z10_super_E1,
                         z10_super,*,*")
-   (set_attr "cpu_facility" "*,*,*,*,vec,*,vec,*,*,*,*,*,*")
+   (set_attr "cpu_facility" "*,*,*,*,vx,*,vx,*,*,*,*,*,*")
 ])
 
 (define_peephole2
 
 (define_insn "*la_31"
   [(set (match_operand:SI 0 "register_operand" "=d,d")
-        (match_operand:QI 1 "address_operand" "ZQZR,ZSZT"))]
+        (match_operand:QI 1 "address_operand" "ZR,ZT"))]
   "!TARGET_64BIT && legitimate_la_operand_p (operands[1])"
   "@
    la\t%0,%a1
    lay\t%0,%a1"
   [(set_attr "op_type"  "RX,RXY")
    (set_attr "type"     "la")
+   (set_attr "cpu_facility" "*,longdisp")
    (set_attr "z10prop" "z10_fwd_A1,z10_fwd_A1")])
 
 (define_peephole2
 
 (define_insn "*la_31_and"
   [(set (match_operand:SI 0 "register_operand" "=d,d")
-        (and:SI (match_operand:QI 1 "address_operand" "ZQZR,ZSZT")
+        (and:SI (match_operand:QI 1 "address_operand" "ZR,ZT")
                 (const_int 2147483647)))]
   "!TARGET_64BIT"
   "@
    lay\t%0,%a1"
   [(set_attr "op_type"  "RX,RXY")
    (set_attr "type"     "la")
+   (set_attr "cpu_facility" "*,longdisp")
    (set_attr "z10prop" "z10_fwd_A1,z10_fwd_A1")])
 
 (define_insn_and_split "*la_31_and_cc"
 
 (define_insn "force_la_31"
   [(set (match_operand:SI 0 "register_operand" "=d,d")
-        (match_operand:QI 1 "address_operand" "ZQZR,ZSZT"))
+        (match_operand:QI 1 "address_operand" "ZR,ZT"))
    (use (const_int 0))]
   "!TARGET_64BIT"
   "@
    lay\t%0,%a1"
   [(set_attr "op_type"  "RX")
    (set_attr "type"     "la")
+   (set_attr "cpu_facility" "*,longdisp")
    (set_attr "z10prop" "z10_fwd_A1,z10_fwd_A1")])
 
 ;
 })
 
 (define_insn "*movhi"
-  [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,d,d,d,R,T,b,Q,v,v,v,d, v,QR")
-        (match_operand:HI 1 "general_operand"      " d,n,R,T,b,d,d,d,K,K,v,d,v,QR, v"))]
+  [(set (match_operand:HI 0 "nonimmediate_operand" "=d,d,d,d,d,R,T,b,Q,v,v,v,d,v,R")
+        (match_operand:HI 1 "general_operand"      " d,n,R,T,b,d,d,d,K,K,v,d,v,R,v"))]
   ""
   "@
    lr\t%0,%1
    vsteh\t%v1,%0,0"
   [(set_attr "op_type"      "RR,RI,RX,RXY,RIL,RX,RXY,RIL,SIL,VRI,VRR,VRS,VRS,VRX,VRX")
    (set_attr "type"         "lr,*,*,*,larl,store,store,store,*,*,*,*,*,*,*")
-   (set_attr "cpu_facility" "*,*,*,*,z10,*,*,z10,z10,vec,vec,vec,vec,vec,vec")
+   (set_attr "cpu_facility" "*,*,*,longdisp,z10,*,longdisp,z10,z10,vx,vx,vx,vx,vx,vx")
    (set_attr "z10prop" "z10_fr_E1,
                        z10_fwd_A1,
                        z10_super_E1,
 })
 
 (define_insn "*movqi"
-  [(set (match_operand:QI 0 "nonimmediate_operand" "=d,d,d,d,R,T,Q,S,?Q,v,v,v,d, v,QR")
-        (match_operand:QI 1 "general_operand"      " d,n,R,T,d,d,n,n,?Q,K,v,d,v,QR, v"))]
+  [(set (match_operand:QI 0 "nonimmediate_operand" "=d,d,d,d,R,T,Q,S,?Q,v,v,v,d,v,R")
+        (match_operand:QI 1 "general_operand"      " d,n,R,T,d,d,n,n,?Q,K,v,d,v,R,v"))]
   ""
   "@
    lr\t%0,%1
    vsteb\t%v1,%0,0"
   [(set_attr "op_type" "RR,RI,RX,RXY,RX,RXY,SI,SIY,SS,VRI,VRR,VRS,VRS,VRX,VRX")
    (set_attr "type" "lr,*,*,*,store,store,store,store,*,*,*,*,*,*,*")
-   (set_attr "cpu_facility" "*,*,*,*,*,*,*,*,*,vec,vec,vec,vec,vec,vec")
+   (set_attr "cpu_facility" "*,*,*,longdisp,*,longdisp,*,longdisp,*,vx,vx,vx,vx,vx,vx")
    (set_attr "z10prop" "z10_fr_E1,
                         z10_fwd_A1,
                         z10_super_E1,
    ic\t%0,%1
    icy\t%0,%1"
   [(set_attr "op_type"  "RX,RXY")
+   (set_attr "cpu_facility" "*,longdisp")
    (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
 
 ;
    icm\t%0,3,%S1
    icmy\t%0,3,%S1"
   [(set_attr "op_type" "RS,RSY")
+   (set_attr "cpu_facility" "*,longdisp")
    (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
 
 ;
    ear\t%0,%1"
   [(set_attr "op_type" "RR,RX,RXY,RRE")
    (set_attr "type" "lr,load,load,*")
+   (set_attr "cpu_facility" "*,*,longdisp,*")
    (set_attr "z10prop" "z10_fr_E1,z10_fwd_A3,z10_fwd_A3,z10_super_E1")])
 
 ;
   "")
 
 (define_insn "*mov<mode>_64"
-  [(set (match_operand:TD_TF 0 "nonimmediate_operand" "=f,f,f,o, d,QS,  d,o")
-        (match_operand:TD_TF 1 "general_operand"      " G,f,o,f,QS, d,dRT,d"))]
+  [(set (match_operand:TD_TF 0 "nonimmediate_operand" "=f,f,f,o,d,S, d,o")
+        (match_operand:TD_TF 1 "general_operand"      " G,f,o,f,S,d,dT,d"))]
   "TARGET_ZARCH"
   "@
    lzxr\t%0
   [(set (match_operand:TD_TF 0 "nonimmediate_operand" "")
         (match_operand:TD_TF 1 "general_operand"      ""))]
   "TARGET_ZARCH && reload_completed
+   && !s_operand (operands[0], <MODE>mode)
+   && !s_operand (operands[1], <MODE>mode)
    && s390_split_ok_p (operands[0], operands[1], <MODE>mode, 0)"
   [(set (match_dup 2) (match_dup 4))
    (set (match_dup 3) (match_dup 5))]
   [(set (match_operand:TD_TF 0 "nonimmediate_operand" "")
         (match_operand:TD_TF 1 "general_operand"      ""))]
   "TARGET_ZARCH && reload_completed
+   && !s_operand (operands[0], <MODE>mode)
+   && !s_operand (operands[1], <MODE>mode)
    && s390_split_ok_p (operands[0], operands[1], <MODE>mode, 1)"
   [(set (match_dup 2) (match_dup 4))
    (set (match_dup 3) (match_dup 5))]
 
 (define_insn "*mov<mode>_64dfp"
   [(set (match_operand:DD_DF 0 "nonimmediate_operand"
-                              "=f,f,f,d,f,f,R,T,d,d,d, d,b,RT,v,v,d,v,QR")
+                              "=f,f,f,d,f,f,R,T,d,d,d,d,b,T,v,v,v,d,v,R")
         (match_operand:DD_DF 1 "general_operand"
-                              " G,f,d,f,R,T,f,f,G,d,b,RT,d, d,v,d,v,QR,v"))]
+                              " G,f,d,f,R,T,f,f,G,d,b,T,d,d,v,G,d,v,R,v"))]
   "TARGET_DFP"
   "@
    lzdr\t%0
    stgrl\t%1,%0
    stg\t%1,%0
    vlr\t%v0,%v1
+   vleig\t%v0,0,0
    vlvgg\t%v0,%1,0
    vlgvg\t%0,%v1,0
    vleg\t%0,%1,0
    vsteg\t%1,%0,0"
-  [(set_attr "op_type" "RRE,RR,RRE,RRE,RX,RXY,RX,RXY,RI,RRE,RIL,RXY,RIL,RXY,VRR,VRS,VRS,VRX,VRX")
+  [(set_attr "op_type" "RRE,RR,RRE,RRE,RX,RXY,RX,RXY,RI,RRE,RIL,RXY,RIL,RXY,VRR,VRI,VRS,VRS,VRX,VRX")
    (set_attr "type" "fsimpdf,floaddf,floaddf,floaddf,floaddf,floaddf,
-                     fstoredf,fstoredf,*,lr,load,load,store,store,*,*,*,load,store")
-   (set_attr "z10prop" "*,*,*,*,*,*,*,*,z10_fwd_A1,z10_fr_E1,z10_fwd_A3,z10_fwd_A3,z10_rec,z10_rec,*,*,*,*,*")
-   (set_attr "cpu_facility" "z196,*,*,*,*,*,*,*,*,*,z10,*,z10,*,vec,vec,vec,vec,vec")])
+                     fstoredf,fstoredf,*,lr,load,load,store,store,*,*,*,*,load,store")
+   (set_attr "z10prop" "*,*,*,*,*,*,*,*,z10_fwd_A1,z10_fr_E1,z10_fwd_A3,z10_fwd_A3,z10_rec,z10_rec,*,*,*,*,*,*")
+   (set_attr "cpu_facility" "z196,*,*,*,*,longdisp,*,longdisp,*,*,z10,*,z10,*,vx,vx,vx,vx,vx,vx")])
 
 (define_insn "*mov<mode>_64"
-  [(set (match_operand:DD_DF 0 "nonimmediate_operand" "=f,f,f,f,R,T,d,d,d, d,b,RT,v,v,QR")
-        (match_operand:DD_DF 1 "general_operand"      " G,f,R,T,f,f,G,d,b,RT,d, d,v,QR,v"))]
+  [(set (match_operand:DD_DF 0 "nonimmediate_operand" "=f,f,f,f,R,T,d,d,d,d,b,T")
+        (match_operand:DD_DF 1 "general_operand"      " G,f,R,T,f,f,G,d,b,T,d,d"))]
   "TARGET_ZARCH"
   "@
    lzdr\t%0
    lgrl\t%0,%1
    lg\t%0,%1
    stgrl\t%1,%0
-   stg\t%1,%0
-   vlr\t%v0,%v1
-   vleg\t%v0,%1,0
-   vsteg\t%v1,%0,0"
-  [(set_attr "op_type" "RRE,RR,RX,RXY,RX,RXY,RI,RRE,RIL,RXY,RIL,RXY,VRR,VRX,VRX")
+   stg\t%1,%0"
+  [(set_attr "op_type" "RRE,RR,RX,RXY,RX,RXY,RI,RRE,RIL,RXY,RIL,RXY")
    (set_attr "type"    "fsimpdf,fload<mode>,fload<mode>,fload<mode>,
-                        fstore<mode>,fstore<mode>,*,lr,load,load,store,store,*,load,store")
-   (set_attr "z10prop" "*,*,*,*,*,*,z10_fwd_A1,z10_fr_E1,z10_fwd_A3,z10_fwd_A3,z10_rec,z10_rec,*,*,*")
-   (set_attr "cpu_facility" "z196,*,*,*,*,*,*,*,z10,*,z10,*,vec,vec,vec")])
+                        fstore<mode>,fstore<mode>,*,lr,load,load,store,store")
+   (set_attr "z10prop" "*,*,*,*,*,*,z10_fwd_A1,z10_fr_E1,z10_fwd_A3,z10_fwd_A3,z10_rec,z10_rec")
+   (set_attr "cpu_facility" "z196,*,*,longdisp,*,longdisp,*,*,z10,*,z10,*")])
 
 (define_insn "*mov<mode>_31"
   [(set (match_operand:DD_DF 0 "nonimmediate_operand"
-                               "=f,f,f,f,R,T,d,d,Q,S,   d,o")
+                               "=f,f,f,f,R,T,d,d,Q,S,  d,o")
         (match_operand:DD_DF 1 "general_operand"
-                               " G,f,R,T,f,f,Q,S,d,d,dPRT,d"))]
+                               " G,f,R,T,f,f,Q,S,d,d,dPT,d"))]
   "!TARGET_ZARCH"
   "@
    lzdr\t%0
   [(set_attr "op_type" "RRE,RR,RX,RXY,RX,RXY,RS,RSY,RS,RSY,*,*")
    (set_attr "type"    "fsimpdf,fload<mode>,fload<mode>,fload<mode>,
                         fstore<mode>,fstore<mode>,lm,lm,stm,stm,*,*")
-   (set_attr "cpu_facility" "z196,*,*,*,*,*,*,*,*,*,*,*")])
+   (set_attr "cpu_facility" "z196,*,*,longdisp,*,longdisp,*,longdisp,*,longdisp,*,*")])
 
 (define_split
   [(set (match_operand:DD_DF 0 "nonimmediate_operand" "")
         (match_operand:DD_DF 1 "general_operand" ""))]
   "!TARGET_ZARCH && reload_completed
+   && !s_operand (operands[0], <MODE>mode)
+   && !s_operand (operands[1], <MODE>mode)
    && s390_split_ok_p (operands[0], operands[1], <MODE>mode, 0)"
   [(set (match_dup 2) (match_dup 4))
    (set (match_dup 3) (match_dup 5))]
   [(set (match_operand:DD_DF 0 "nonimmediate_operand" "")
         (match_operand:DD_DF 1 "general_operand" ""))]
   "!TARGET_ZARCH && reload_completed
+   && !s_operand (operands[0], <MODE>mode)
+   && !s_operand (operands[1], <MODE>mode)
    && s390_split_ok_p (operands[0], operands[1], <MODE>mode, 1)"
   [(set (match_dup 2) (match_dup 4))
    (set (match_dup 3) (match_dup 5))]
 
 (define_insn "mov<mode>"
   [(set (match_operand:SD_SF 0 "nonimmediate_operand"
-                              "=f,f,f,f,f,f,R,T,d,d,d,d,d,b,R,T,v,v,v,d,v,QR")
+                              "=f,f,f,f,f,f,R,T,d,d,d,d,d,b,R,T,v,v,v,d,v,R")
         (match_operand:SD_SF 1 "general_operand"
-                              " G,f,f,R,R,T,f,f,G,d,b,R,T,d,d,d,v,G,d,v,QR,v"))]
+                              " G,f,f,R,R,T,f,f,G,d,b,R,T,d,d,d,v,G,d,v,R,v"))]
   ""
   "@
    lzer\t%0
-   lder\t%0,%1
+   ldr\t%0,%1
    ler\t%0,%1
    lde\t%0,%1
    le\t%0,%1
    st\t%1,%0
    sty\t%1,%0
    vlr\t%v0,%v1
-   vleif\t%v0,0
+   vleif\t%v0,0,0
    vlvgf\t%v0,%1,0
    vlgvf\t%0,%v1,0
-   vleg\t%0,%1,0
-   vsteg\t%1,%0,0"
-  [(set_attr "op_type" "RRE,RRE,RR,RXE,RX,RXY,RX,RXY,RI,RR,RIL,RX,RXY,RIL,RX,RXY,VRR,VRI,VRS,VRS,VRX,VRX")
+   vlef\t%0,%1,0
+   vstef\t%1,%0,0"
+  [(set_attr "op_type" "RRE,RR,RR,RXE,RX,RXY,RX,RXY,RI,RR,RIL,RX,RXY,RIL,RX,RXY,VRR,VRI,VRS,VRS,VRX,VRX")
    (set_attr "type"    "fsimpsf,fsimpsf,fload<mode>,fload<mode>,fload<mode>,fload<mode>,
                         fstore<mode>,fstore<mode>,*,lr,load,load,load,store,store,store,*,*,*,*,load,store")
    (set_attr "z10prop" "*,*,*,*,*,*,*,*,z10_fwd_A1,z10_fr_E1,z10_fr_E1,z10_fwd_A3,z10_fwd_A3,z10_rec,z10_rec,z10_rec,*,*,*,*,*,*")
-   (set_attr "cpu_facility" "z196,vec,*,vec,*,*,*,*,*,*,z10,*,*,z10,*,*,vec,vec,vec,vec,vec,vec")])
+   (set_attr "cpu_facility" "z196,vx,*,vx,*,longdisp,*,longdisp,*,*,z10,*,longdisp,z10,*,longdisp,vx,vx,vx,vx,vx,vx")])
 
 ;
 ; movcc instruction pattern
    sty\t%1,%0"
   [(set_attr "op_type" "RR,RI,RRE,RX,RXY,RX,RXY")
    (set_attr "type" "lr,*,*,load,load,store,store")
+   (set_attr "cpu_facility" "*,*,*,*,longdisp,*,longdisp")
    (set_attr "z10prop" "z10_fr_E1,z10_super,*,z10_fwd_A3,z10_fwd_A3,z10_rec,z10_rec")
    (set_attr "z196prop" "*,*,z196_ends,*,*,*,*")])
 
 (define_insn "*load_multiple_di"
   [(match_parallel 0 "load_multiple_operation"
                   [(set (match_operand:DI 1 "register_operand" "=r")
-                        (match_operand:DI 2 "s_operand" "QS"))])]
+                        (match_operand:DI 2 "s_operand" "S"))])]
   "reload_completed && TARGET_ZARCH"
 {
   int words = XVECLEN (operands[0], 0);
   return which_alternative == 0 ? "lm\t%1,%0,%S2" : "lmy\t%1,%0,%S2";
 }
    [(set_attr "op_type" "RS,RSY")
+    (set_attr "cpu_facility" "*,longdisp")
     (set_attr "type"    "lm")])
 
 ;
 
 (define_insn "*store_multiple_di"
   [(match_parallel 0 "store_multiple_operation"
-                  [(set (match_operand:DI 1 "s_operand" "=QS")
+                  [(set (match_operand:DI 1 "s_operand" "=S")
                         (match_operand:DI 2 "register_operand" "r"))])]
   "reload_completed && TARGET_ZARCH"
 {
   return which_alternative == 0 ? "stm\t%2,%0,%S1" : "stmy\t%2,%0,%S1";
 }
    [(set_attr "op_type" "RS,RSY")
+    (set_attr "cpu_facility" "*,longdisp")
     (set_attr "type"    "stm")])
 
 ;;
   [(parallel
     [(clobber (match_dup 1))
      (set (match_operand:BLK 0 "memory_operand" "")
-         (unspec:BLK [(match_operand:P 2 "shift_count_or_setmem_operand" "")
+         (unspec:BLK [(match_operand:P 2 "setmem_operand" "")
                      (match_dup 4)] UNSPEC_REPLICATE_BYTE))
      (use (match_dup 3))
      (clobber (reg:CC CC_REGNUM))])]
 (define_insn "*setmem_long"
   [(clobber (match_operand:<DBL> 0 "register_operand" "=d"))
    (set (mem:BLK (subreg:P (match_operand:<DBL> 3 "register_operand" "0") 0))
-        (unspec:BLK [(match_operand:P 2 "shift_count_or_setmem_operand" "Y")
+        (unspec:BLK [(match_operand:P 2 "setmem_operand" "Y")
                     (subreg:P (match_dup 3) <modesize>)]
                     UNSPEC_REPLICATE_BYTE))
    (use (match_operand:<DBL> 1 "register_operand" "d"))
 (define_insn "*setmem_long_and"
   [(clobber (match_operand:<DBL> 0 "register_operand" "=d"))
    (set (mem:BLK (subreg:P (match_operand:<DBL> 3 "register_operand" "0") 0))
-        (unspec:BLK [(and:P
-                     (match_operand:P 2 "shift_count_or_setmem_operand" "Y")
-                     (match_operand:P 4 "const_int_operand"             "n"))
+        (unspec:BLK [(zero_extend:P (match_operand:QI 2 "setmem_operand" "Y"))
                    (subreg:P (match_dup 3) <modesize>)]
                    UNSPEC_REPLICATE_BYTE))
    (use (match_operand:<DBL> 1 "register_operand" "d"))
    (clobber (reg:CC CC_REGNUM))]
-  "(TARGET_64BIT || !TARGET_ZARCH) &&
-   (INTVAL (operands[4]) & 255) == 255"
+  "(TARGET_64BIT || !TARGET_ZARCH)"
   "mvcle\t%0,%1,%Y2\;jo\t.-4"
   [(set_attr "length" "8")
    (set_attr "type" "vs")])
 (define_insn "*setmem_long_31z"
   [(clobber (match_operand:TI 0 "register_operand" "=d"))
    (set (mem:BLK (subreg:SI (match_operand:TI 3 "register_operand" "0") 4))
-        (unspec:BLK [(match_operand:SI 2 "shift_count_or_setmem_operand" "Y")
+        (unspec:BLK [(match_operand:SI 2 "setmem_operand" "Y")
                     (subreg:SI (match_dup 3) 12)] UNSPEC_REPLICATE_BYTE))
    (use (match_operand:TI 1 "register_operand" "d"))
    (clobber (reg:CC CC_REGNUM))]
 (define_insn "*setmem_long_and_31z"
   [(clobber (match_operand:TI 0 "register_operand" "=d"))
    (set (mem:BLK (subreg:SI (match_operand:TI 3 "register_operand" "0") 4))
-        (unspec:BLK [(and:SI
-                     (match_operand:SI 2 "shift_count_or_setmem_operand" "Y")
-                     (match_operand:SI 4 "const_int_operand"             "n"))
+        (unspec:BLK [(zero_extend:SI (match_operand:QI 2 "setmem_operand" "Y"))
                    (subreg:SI (match_dup 3) 12)] UNSPEC_REPLICATE_BYTE))
    (use (match_operand:TI 1 "register_operand" "d"))
    (clobber (reg:CC CC_REGNUM))]
-  "(!TARGET_64BIT && TARGET_ZARCH) &&
-   (INTVAL (operands[4]) & 255) == 255"
+  "(!TARGET_64BIT && TARGET_ZARCH)"
   "mvcle\t%0,%1,%Y2\;jo\t.-4"
   [(set_attr "length" "8")
    (set_attr "type" "vs")])
    icm\t%0,%2,%S1
    icmy\t%0,%2,%S1"
   [(set_attr "op_type" "RS,RSY")
+   (set_attr "cpu_facility" "*,longdisp")
    (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
 
 (define_insn "*sethighpartdi_64"
   [(set (match_operand:DI 0 "register_operand" "=d")
-       (unspec:DI [(match_operand:BLK 1 "s_operand" "QS")
+       (unspec:DI [(match_operand:BLK 1 "s_operand" "S")
                    (match_operand 2 "const_int_operand" "n")] UNSPEC_ICM))
    (clobber (reg:CC CC_REGNUM))]
   "TARGET_ZARCH"
    icm\t%0,%2,%S1
    icmy\t%0,%2,%S1"
   [(set_attr "op_type" "RS,RSY")
+   (set_attr "cpu_facility" "*,longdisp")
    (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
 
 ;
      (clobber (reg:CC CC_REGNUM))])]
   "TARGET_Z10"
 {
+  if (! EXTRACT_ARGS_IN_RANGE (INTVAL (operands[2]), INTVAL (operands[3]), 64))
+    FAIL;
   /* Starting with zEC12 there is risbgn not clobbering CC.  */
   if (TARGET_ZEC12)
     {
     }
 })
 
-(define_insn "*extzv<mode>_zEC12"
+(define_insn "*extzv<mode><clobbercc_or_nocc>"
   [(set (match_operand:GPR 0 "register_operand" "=d")
       (zero_extract:GPR
         (match_operand:GPR 1 "register_operand" "d")
         (match_operand 2 "const_int_operand" "")   ; size
-        (match_operand 3 "const_int_operand" "")))] ; start]
-  "TARGET_ZEC12"
-  "risbgn\t%0,%1,64-%2,128+63,<bitsize>+%3+%2" ; dst, src, start, end, shift
-  [(set_attr "op_type" "RIE")])
+        (match_operand 3 "const_int_operand" ""))) ; start
+  ]
+  "<z10_or_zEC12_cond>
+   && EXTRACT_ARGS_IN_RANGE (INTVAL (operands[2]), INTVAL (operands[3]),
+                            GET_MODE_BITSIZE (<MODE>mode))"
+  "<risbg_n>\t%0,%1,64-%2,128+63,<bitoff_plus>%3+%2" ; dst, src, start, end, shift
+  [(set_attr "op_type" "RIE")
+   (set_attr "z10prop" "z10_super_E1")])
 
-(define_insn "*extzv<mode>_z10"
-  [(set (match_operand:GPR 0 "register_operand" "=d")
-      (zero_extract:GPR
-       (match_operand:GPR 1 "register_operand" "d")
-       (match_operand 2 "const_int_operand" "")   ; size
-       (match_operand 3 "const_int_operand" ""))) ; start
-   (clobber (reg:CC CC_REGNUM))]
-  "TARGET_Z10"
-  "risbg\t%0,%1,64-%2,128+63,<bitsize>+%3+%2" ; dst, src, start, end, shift
+; 64 bit: (a & -16) | ((b >> 8) & 15)
+(define_insn "*extzvdi<clobbercc_or_nocc>_lshiftrt"
+  [(set (zero_extract:DI (match_operand:DI 0 "register_operand" "+d")
+                        (match_operand 1 "const_int_operand" "")  ; size
+                        (match_operand 2 "const_int_operand" "")) ; start
+       (lshiftrt:DI (match_operand:DI 3 "register_operand" "d")
+                    (match_operand:DI 4 "nonzero_shift_count_operand" "")))]
+  "<z10_or_zEC12_cond>
+   && EXTRACT_ARGS_IN_RANGE (INTVAL (operands[1]), INTVAL (operands[2]), 64)
+   && 64 - UINTVAL (operands[4]) >= UINTVAL (operands[1])"
+  "<risbg_n>\t%0,%3,%2,%2+%1-1,128-%2-%1-%4"
+  [(set_attr "op_type" "RIE")
+   (set_attr "z10prop" "z10_super_E1")])
+
+; 32 bit: (a & -16) | ((b >> 8) & 15)
+(define_insn "*<risbg_n>_ior_and_sr_ze"
+  [(set (match_operand:SI 0 "register_operand" "=d")
+       (ior:SI (and:SI
+                (match_operand:SI 1 "register_operand" "0")
+                (match_operand:SI 2 "const_int_operand" ""))
+               (subreg:SI
+                (zero_extract:DI
+                 (match_operand:DI 3 "register_operand" "d")
+                 (match_operand 4 "const_int_operand" "") ; size
+                 (match_operand 5 "const_int_operand" "")) ; start
+                4)))]
+  "<z10_or_zEC12_cond>
+   && EXTRACT_ARGS_IN_RANGE (INTVAL (operands[4]), INTVAL (operands[5]), 64)
+   && UINTVAL (operands[2]) == (~(0ULL) << UINTVAL (operands[4]))"
+  "<risbg_n>\t%0,%3,64-%4,63,%4+%5"
+  [(set_attr "op_type" "RIE")
+   (set_attr "z10prop" "z10_super_E1")])
+
+; ((int)foo >> 10) & 1;
+(define_insn "*extract1bitdi<clobbercc_or_nocc>"
+  [(set (match_operand:DI 0 "register_operand" "=d")
+       (ne:DI (zero_extract:DI
+               (match_operand:DI 1 "register_operand" "d")
+               (const_int 1)  ; size
+               (match_operand 2 "const_int_operand" "")) ; start
+              (const_int 0)))]
+  "<z10_or_zEC12_cond>
+   && EXTRACT_ARGS_IN_RANGE (1, INTVAL (operands[2]), 64)"
+  "<risbg_n>\t%0,%1,64-1,128+63,%2+1" ; dst, src, start, end, shift
+  [(set_attr "op_type" "RIE")
+   (set_attr "z10prop" "z10_super_E1")])
+
+(define_insn "*<risbg_n>_and_subregdi_rotr"
+  [(set (match_operand:DI 0 "register_operand" "=d")
+       (and:DI (subreg:DI
+                (rotate:SINT (match_operand:SINT 1 "register_operand" "d")
+                            (match_operand:SINT 2 "const_int_operand" "")) 0)
+               (match_operand:DI 3 "contiguous_bitmask_operand" "")))]
+  "<z10_or_zEC12_cond>
+   && UINTVAL (operands[3]) < (1ULL << (UINTVAL (operands[2]) & 0x3f))"
+  "<risbg_n>\t%0,%1,%s3,128+%e3,<bitoff_plus>%2" ; dst, src, start, end, shift
+  [(set_attr "op_type" "RIE")
+   (set_attr "z10prop" "z10_super_E1")])
+
+(define_insn "*<risbg_n>_and_subregdi_rotl"
+  [(set (match_operand:DI 0 "register_operand" "=d")
+       (and:DI (subreg:DI
+                (rotate:SINT (match_operand:SINT 1 "register_operand" "d")
+                            (match_operand:SINT 2 "const_int_operand" "")) 0)
+               (match_operand:DI 3 "contiguous_bitmask_operand" "")))]
+  "<z10_or_zEC12_cond>
+   && !(UINTVAL (operands[3]) & ((1ULL << (UINTVAL (operands[2]) & 0x3f)) - 1))"
+  "<risbg_n>\t%0,%1,%s3,128+%e3,%2" ; dst, src, start, end, shift
+  [(set_attr "op_type" "RIE")
+   (set_attr "z10prop" "z10_super_E1")])
+
+(define_insn "*<risbg_n>_di_and_rot"
+  [(set (match_operand:DI 0 "register_operand" "=d")
+       (and:DI (rotate:DI (match_operand:DI 1 "register_operand" "d")
+                           (match_operand:DI 2 "const_int_operand" ""))
+               (match_operand:DI 3 "contiguous_bitmask_operand" "")))]
+  "<z10_or_zEC12_cond>"
+  "<risbg_n>\t%0,%1,%s3,128+%e3,%2" ; dst, src, start, end, shift
   [(set_attr "op_type" "RIE")
    (set_attr "z10prop" "z10_super_E1")])
 
 (define_insn_and_split "*pre_z10_extzv<mode>"
   [(set (match_operand:GPR 0 "register_operand" "=d")
-       (zero_extract:GPR (match_operand:QI 1 "s_operand" "QS")
+       (zero_extract:GPR (match_operand:QI 1 "s_operand" "S")
                          (match_operand 2 "nonzero_shift_count_operand" "")
                          (const_int 0)))
    (clobber (reg:CC CC_REGNUM))]
 
 (define_insn_and_split "*pre_z10_extv<mode>"
   [(set (match_operand:GPR 0 "register_operand" "=d")
-       (sign_extract:GPR (match_operand:QI 1 "s_operand" "QS")
+       (sign_extract:GPR (match_operand:QI 1 "s_operand" "S")
                          (match_operand 2 "nonzero_shift_count_operand" "")
                          (const_int 0)))
    (clobber (reg:CC CC_REGNUM))]
 ; The normal RTL expansion will never generate a zero_extract where
 ; the location operand isn't word mode.  However, we do this in the
 ; back-end when generating atomic operations. See s390_two_part_insv.
-(define_insn "*insv<mode>_zEC12"
+(define_insn "*insv<mode><clobbercc_or_nocc>"
   [(set (zero_extract:GPR (match_operand:GPR 0 "nonimmediate_operand" "+d")
                          (match_operand 1 "const_int_operand"    "I")  ; size
                          (match_operand 2 "const_int_operand"    "I")) ; pos
        (match_operand:GPR 3 "nonimmediate_operand" "d"))]
-  "TARGET_ZEC12
+  "<z10_or_zEC12_cond>
+   && EXTRACT_ARGS_IN_RANGE (INTVAL (operands[1]), INTVAL (operands[2]),
+                            GET_MODE_BITSIZE (<MODE>mode))
    && (INTVAL (operands[1]) + INTVAL (operands[2])) <= <bitsize>"
-  "risbgn\t%0,%3,64-<bitsize>+%2,64-<bitsize>+%2+%1-1,<bitsize>-%2-%1"
-  [(set_attr "op_type" "RIE")])
-
-(define_insn "*insv<mode>_z10"
-  [(set (zero_extract:GPR (match_operand:GPR 0 "nonimmediate_operand" "+d")
-                         (match_operand 1 "const_int_operand"    "I")  ; size
-                         (match_operand 2 "const_int_operand"    "I")) ; pos
-       (match_operand:GPR 3 "nonimmediate_operand" "d"))
-   (clobber (reg:CC CC_REGNUM))]
-  "TARGET_Z10
-   && (INTVAL (operands[1]) + INTVAL (operands[2])) <= <bitsize>"
-  "risbg\t%0,%3,64-<bitsize>+%2,64-<bitsize>+%2+%1-1,<bitsize>-%2-%1"
+  "<risbg_n>\t%0,%3,<bitoff_plus>%2,<bitoff_plus>%2+%1-1,<bitsize>-%2-%1"
   [(set_attr "op_type" "RIE")
    (set_attr "z10prop" "z10_super_E1")])
 
 ; and op1 with a mask being 1 for the selected bits and 0 for the rest
 ; and op3=op0 with a mask being 0 for the selected bits and 1 for the rest
-(define_insn "*insv<mode>_zEC12_noshift"
-  [(set (match_operand:GPR 0 "nonimmediate_operand" "=d")
-       (ior:GPR (and:GPR (match_operand:GPR 1 "nonimmediate_operand" "d")
+(define_insn "*insv<mode><clobbercc_or_nocc>_noshift"
+  [(set (match_operand:GPR 0 "nonimmediate_operand" "=d,d")
+       (ior:GPR (and:GPR (match_operand:GPR 1 "nonimmediate_operand" "d,0")
                          (match_operand:GPR 2 "contiguous_bitmask_operand" ""))
-                (and:GPR (match_operand:GPR 3 "nonimmediate_operand" "0")
+                (and:GPR (match_operand:GPR 3 "nonimmediate_operand" "0,d")
                          (match_operand:GPR 4 "const_int_operand" ""))))]
-  "TARGET_ZEC12 && INTVAL (operands[2]) == ~INTVAL (operands[4])"
-  "risbgn\t%0,%1,%<bfstart>2,%<bfend>2,0"
-  [(set_attr "op_type" "RIE")])
+  "<z10_or_zEC12_cond> && INTVAL (operands[2]) == ~INTVAL (operands[4])"
+  "@
+   <risbg_n>\t%0,%1,%<bfstart>2,%<bfend>2,0
+   <risbg_n>\t%0,%3,%<bfstart>4,%<bfend>4,0"
+  [(set_attr "op_type" "RIE")
+   (set_attr "z10prop" "z10_super_E1")])
 
-(define_insn "*insv<mode>_z10_noshift"
-  [(set (match_operand:GPR 0 "nonimmediate_operand" "=d")
-       (ior:GPR (and:GPR (match_operand:GPR 1 "nonimmediate_operand" "d")
-                         (match_operand:GPR 2 "contiguous_bitmask_operand" ""))
-                (and:GPR (match_operand:GPR 3 "nonimmediate_operand" "0")
-                         (match_operand:GPR 4 "const_int_operand" ""))))
-   (clobber (reg:CC CC_REGNUM))]
-  "TARGET_Z10 && INTVAL (operands[2]) == ~INTVAL (operands[4])"
-  "risbg\t%0,%1,%<bfstart>2,%<bfend>2,0"
+(define_insn "*insv_z10_noshift_cc"
+  [(set (reg CC_REGNUM)
+       (compare
+       (ior:DI
+        (and:DI (match_operand:DI 1 "nonimmediate_operand" "d,0")
+                 (match_operand:DI 2 "contiguous_bitmask_operand" ""))
+        (and:DI (match_operand:DI 3 "nonimmediate_operand" "0,d")
+                 (match_operand:DI 4 "const_int_operand" "")))
+       (const_int 0)))
+   (set (match_operand:DI 0 "nonimmediate_operand" "=d,d")
+       (ior:DI (and:DI (match_dup 1) (match_dup 2))
+                (and:DI (match_dup 3) (match_dup 4))))]
+  "TARGET_Z10 && s390_match_ccmode (insn, CCSmode)
+   && INTVAL (operands[2]) == ~INTVAL (operands[4])"
+  "@
+   risbg\t%0,%1,%s2,%e2,0
+   risbg\t%0,%3,%s4,%e4,0"
+  [(set_attr "op_type" "RIE")
+   (set_attr "z10prop" "z10_super_E1")])
+
+(define_insn "*insv_z10_noshift_cconly"
+  [(set
+    (reg CC_REGNUM)
+    (compare
+     (ior:DI
+      (and:DI (match_operand:DI 1 "nonimmediate_operand" "d,0")
+              (match_operand:DI 2 "contiguous_bitmask_operand" ""))
+      (and:DI (match_operand:DI 3 "nonimmediate_operand" "0,d")
+              (match_operand:DI 4 "const_int_operand" "")))
+     (const_int 0)))
+  (clobber (match_scratch:DI 0 "=d,d"))]
+  "TARGET_Z10 && s390_match_ccmode (insn, CCSmode)
+   && INTVAL (operands[2]) == ~INTVAL (operands[4])"
+  "@
+   risbg\t%0,%1,%s2,%e2,0
+   risbg\t%0,%3,%s4,%e4,0"
   [(set_attr "op_type" "RIE")
    (set_attr "z10prop" "z10_super_E1")])
 
 ; Implement appending Y on the left of S bits of X
 ; x = (y << s) | (x & ((1 << s) - 1))
-(define_insn "*insv<mode>_zEC12_appendbitsleft"
+(define_insn "*insv<mode><clobbercc_or_nocc>_appendbitsleft"
   [(set (match_operand:GPR 0 "nonimmediate_operand" "=d")
        (ior:GPR (and:GPR (match_operand:GPR 1 "nonimmediate_operand" "0")
                          (match_operand:GPR 2 "immediate_operand" ""))
                 (ashift:GPR (match_operand:GPR 3 "nonimmediate_operand" "d")
                             (match_operand:GPR 4 "nonzero_shift_count_operand" ""))))]
-  "TARGET_ZEC12 && UINTVAL (operands[2]) == (1UL << UINTVAL (operands[4])) - 1"
-  "risbgn\t%0,%3,64-<bitsize>,64-%4-1,%4"
+  "<z10_or_zEC12_cond>
+   && UINTVAL (operands[2]) == (1UL << UINTVAL (operands[4])) - 1"
+  "<risbg_n>\t%0,%3,<bitoff>,64-%4-1,%4"
   [(set_attr "op_type" "RIE")
    (set_attr "z10prop" "z10_super_E1")])
 
-(define_insn "*insv<mode>_z10_appendbitsleft"
-  [(set (match_operand:GPR 0 "nonimmediate_operand" "=d")
-       (ior:GPR (and:GPR (match_operand:GPR 1 "nonimmediate_operand" "0")
-                         (match_operand:GPR 2 "immediate_operand" ""))
-                (ashift:GPR (match_operand:GPR 3 "nonimmediate_operand" "d")
-                            (match_operand:GPR 4 "nonzero_shift_count_operand" ""))))
-   (clobber (reg:CC CC_REGNUM))]
-  "TARGET_Z10 && !TARGET_ZEC12 && UINTVAL (operands[2]) == (1UL << UINTVAL (operands[4])) - 1"
-  "risbg\t%0,%3,64-<bitsize>,64-%4-1,%4"
+; a = ((i32)a & -16777216) | (((ui32)b) >> 8)
+(define_insn "*<risbg_n>_<mode>_ior_and_lshiftrt"
+  [(set (match_operand:GPR 0 "register_operand" "=d")
+       (ior:GPR (and:GPR
+                 (match_operand:GPR 1 "register_operand" "0")
+                 (match_operand:GPR 2 "const_int_operand" ""))
+                (lshiftrt:GPR
+                 (match_operand:GPR 3 "register_operand" "d")
+                 (match_operand:GPR 4 "nonzero_shift_count_operand" ""))))]
+  "<z10_or_zEC12_cond> && UINTVAL (operands[2])
+   == (~(0ULL) << (GET_MODE_BITSIZE (<MODE>mode) - UINTVAL (operands[4])))"
+  "<risbg_n>\t%0,%3,<bitoff_plus>%4,63,64-%4"
+  [(set_attr "op_type" "RIE")
+   (set_attr "z10prop" "z10_super_E1")])
+
+; (ui32)(((ui64)x) >> 48) | ((i32)y & -65536);
+(define_insn "*<risbg_n>_sidi_ior_and_lshiftrt"
+  [(set (match_operand:SI 0 "register_operand" "=d")
+       (ior:SI (and:SI
+                (match_operand:SI 1 "register_operand" "0")
+                (match_operand:SI 2 "const_int_operand" ""))
+               (subreg:SI
+                (lshiftrt:DI
+                 (match_operand:DI 3 "register_operand" "d")
+                 (match_operand:DI 4 "nonzero_shift_count_operand" "")) 4)))]
+  "<z10_or_zEC12_cond>
+   && UINTVAL (operands[2]) == ~(~(0ULL) >> UINTVAL (operands[4]))"
+  "<risbg_n>\t%0,%3,%4,63,64-%4"
+  [(set_attr "op_type" "RIE")
+   (set_attr "z10prop" "z10_super_E1")])
+
+; (ui32)(((ui64)x) >> 12) & -4
+(define_insn "*trunc_sidi_and_subreg_lshrt<clobbercc_or_nocc>"
+  [(set (match_operand:SI 0 "register_operand" "=d")
+       (and:SI
+        (subreg:SI (lshiftrt:DI
+                    (match_operand:DI 1 "register_operand" "d")
+                    (match_operand:DI 2 "nonzero_shift_count_operand" "")) 4)
+        (match_operand:SI 3 "contiguous_bitmask_nowrap_operand" "")))]
+  "<z10_or_zEC12_cond>"
+  "<risbg_n>\t%0,%1,%t3,128+%f3,64-%2"
   [(set_attr "op_type" "RIE")
    (set_attr "z10prop" "z10_super_E1")])
 
                 (ashift:GPR (match_dup 3) (match_dup 4))))]
 {
   operands[5] = GEN_INT ((1UL << UINTVAL (operands[4])) - 1);
-  if (rtx_equal_p (operands[0], operands[3]))
+  if (reg_overlap_mentioned_p (operands[0], operands[3]))
     {
       if (!can_create_pseudo_p ())
        FAIL;
      (clobber (reg:CC CC_REGNUM))])]
 {
   operands[5] = GEN_INT ((1UL << UINTVAL (operands[4])) - 1);
-  if (rtx_equal_p (operands[0], operands[3]))
+  if (reg_overlap_mentioned_p (operands[0], operands[3]))
     {
       if (!can_create_pseudo_p ())
        FAIL;
     operands[6] = operands[0];
 })
 
+; rosbg, rxsbg
 (define_insn "*r<noxa>sbg_<mode>_noshift"
   [(set (match_operand:GPR 0 "nonimmediate_operand" "=d")
        (IXOR:GPR
   "r<noxa>sbg\t%0,%1,%<bfstart>2,%<bfend>2,0"
   [(set_attr "op_type" "RIE")])
 
+; rosbg, rxsbg
 (define_insn "*r<noxa>sbg_di_rotl"
   [(set (match_operand:DI 0 "nonimmediate_operand" "=d")
        (IXOR:DI
   "r<noxa>sbg\t%0,%1,%<bfstart>2,%<bfend>2,%b3"
   [(set_attr "op_type" "RIE")])
 
-(define_insn "*r<noxa>sbg_<mode>_srl"
+; rosbg, rxsbg
+(define_insn "*r<noxa>sbg_<mode>_srl_bitmask"
   [(set (match_operand:GPR 0 "nonimmediate_operand" "=d")
        (IXOR:GPR
          (and:GPR
            (lshiftrt:GPR
               (match_operand:GPR 1 "nonimmediate_operand" "d")
               (match_operand:GPR 3 "nonzero_shift_count_operand" ""))
-            (match_operand:GPR 2 "contiguous_bitmask_operand" ""))
+            (match_operand:GPR 2 "contiguous_bitmask_nowrap_operand" ""))
          (match_operand:GPR 4 "nonimmediate_operand" "0")))
    (clobber (reg:CC CC_REGNUM))]
   "TARGET_Z10
   "r<noxa>sbg\t%0,%1,%<bfstart>2,%<bfend>2,64-%3"
   [(set_attr "op_type" "RIE")])
 
-(define_insn "*r<noxa>sbg_<mode>_sll"
+; rosbg, rxsbg
+(define_insn "*r<noxa>sbg_<mode>_sll_bitmask"
   [(set (match_operand:GPR 0 "nonimmediate_operand" "=d")
        (IXOR:GPR
          (and:GPR
            (ashift:GPR
               (match_operand:GPR 1 "nonimmediate_operand" "d")
               (match_operand:GPR 3 "nonzero_shift_count_operand" ""))
-            (match_operand:GPR 2 "contiguous_bitmask_operand" ""))
+            (match_operand:GPR 2 "contiguous_bitmask_nowrap_operand" ""))
          (match_operand:GPR 4 "nonimmediate_operand" "0")))
    (clobber (reg:CC CC_REGNUM))]
   "TARGET_Z10
   "r<noxa>sbg\t%0,%1,%<bfstart>2,%<bfend>2,%3"
   [(set_attr "op_type" "RIE")])
 
+;; unsigned {int,long} a, b
+;; a = a | (b << const_int)
+;; a = a ^ (b << const_int)
+; rosbg, rxsbg
+(define_insn "*r<noxa>sbg_<mode>_sll"
+  [(set (match_operand:GPR 0 "nonimmediate_operand" "=d")
+       (IXOR:GPR
+         (ashift:GPR
+            (match_operand:GPR 1 "nonimmediate_operand" "d")
+            (match_operand:GPR 2 "nonzero_shift_count_operand" ""))
+         (match_operand:GPR 3 "nonimmediate_operand" "0")))
+   (clobber (reg:CC CC_REGNUM))]
+  "TARGET_Z10"
+  "r<noxa>sbg\t%0,%1,<bitoff>,63-%2,%2"
+  [(set_attr "op_type" "RIE")])
+
+;; unsigned {int,long} a, b
+;; a = a | (b >> const_int)
+;; a = a ^ (b >> const_int)
+; rosbg, rxsbg
+(define_insn "*r<noxa>sbg_<mode>_srl"
+  [(set (match_operand:GPR 0 "nonimmediate_operand" "=d")
+       (IXOR:GPR
+         (lshiftrt:GPR
+            (match_operand:GPR 1 "nonimmediate_operand" "d")
+            (match_operand:GPR 2 "nonzero_shift_count_operand" ""))
+         (match_operand:GPR 3 "nonimmediate_operand" "0")))
+   (clobber (reg:CC CC_REGNUM))]
+  "TARGET_Z10"
+  "r<noxa>sbg\t%0,%1,<bitoff_plus>%2,63,64-%2"
+  [(set_attr "op_type" "RIE")])
+
 ;; These two are generated by combine for s.bf &= val.
 ;; ??? For bitfields smaller than 32-bits, we wind up with SImode
 ;; shifts and ands, which results in some truly awful patterns
          (match_operand:DI 3 "nonimmediate_operand" "d")))
    (clobber (reg:CC CC_REGNUM))]
   "TARGET_Z10
+   && EXTRACT_ARGS_IN_RANGE (INTVAL (operands[1]), INTVAL (operands[2]), 64)
    && INTVAL (operands[1]) + INTVAL (operands[2]) == 64"
   "rnsbg\t%0,%3,%2,63,0"
   [(set_attr "op_type" "RIE")])
          (match_operand:DI 4 "nonimmediate_operand" "d")))
    (clobber (reg:CC CC_REGNUM))]
   "TARGET_Z10
+   && EXTRACT_ARGS_IN_RANGE (INTVAL (operands[1]), INTVAL (operands[2]), 64)
    && INTVAL (operands[3]) == 64 - INTVAL (operands[1]) - INTVAL (operands[2])"
   "rnsbg\t%0,%4,%2,%2+%1-1,%3"
   [(set_attr "op_type" "RIE")])
                        (match_operand 1 "const_int_operand" "n,n")
                        (const_int 0))
        (match_operand:W 2 "register_operand" "d,d"))]
-  "INTVAL (operands[1]) > 0
+  "EXTRACT_ARGS_IN_RANGE (INTVAL (operands[1]), 0, 64)
+   && INTVAL (operands[1]) > 0
    && INTVAL (operands[1]) <= GET_MODE_BITSIZE (SImode)
    && INTVAL (operands[1]) % BITS_PER_UNIT == 0"
 {
                                    : "stcmy\t%2,%1,%S0";
 }
   [(set_attr "op_type" "RS,RSY")
+   (set_attr "cpu_facility" "*,longdisp")
    (set_attr "z10prop" "z10_super,z10_super")])
 
 (define_insn "*insvdi_mem_reghigh"
-  [(set (zero_extract:DI (match_operand:QI 0 "memory_operand" "+QS")
+  [(set (zero_extract:DI (match_operand:QI 0 "memory_operand" "+S")
                         (match_operand 1 "const_int_operand" "n")
                         (const_int 0))
        (lshiftrt:DI (match_operand:DI 2 "register_operand" "d")
                     (const_int 32)))]
   "TARGET_ZARCH
+   && EXTRACT_ARGS_IN_RANGE (INTVAL (operands[1]), 0, 64)
    && INTVAL (operands[1]) > 0
    && INTVAL (operands[1]) <= GET_MODE_BITSIZE (SImode)
    && INTVAL (operands[1]) % BITS_PER_UNIT == 0"
                         (match_operand 1 "const_int_operand" "n"))
        (match_operand:DI 2 "const_int_operand" "n"))]
   "TARGET_ZARCH
+   && EXTRACT_ARGS_IN_RANGE (16, INTVAL (operands[1]), 64)
    && INTVAL (operands[1]) >= 0
    && INTVAL (operands[1]) < BITS_PER_WORD
    && INTVAL (operands[1]) % 16 == 0"
 
 (define_insn "*extendsidi2"
   [(set (match_operand:DI 0 "register_operand" "=d,d,d")
-        (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" "d,RT,b")))]
+        (sign_extend:DI (match_operand:SI 1 "nonimmediate_operand" "d,T,b")))]
   "TARGET_ZARCH"
   "@
    lgfr\t%0,%1
 
 (define_insn "*extendhidi2_extimm"
   [(set (match_operand:DI 0 "register_operand" "=d,d,d")
-        (sign_extend:DI (match_operand:HI 1 "general_operand" "d,RT,b")))]
+        (sign_extend:DI (match_operand:HI 1 "general_operand" "d,T,b")))]
   "TARGET_ZARCH && TARGET_EXTIMM"
   "@
    lghr\t%0,%1
 
 (define_insn "*extendhidi2"
   [(set (match_operand:DI 0 "register_operand" "=d")
-        (sign_extend:DI (match_operand:HI 1 "memory_operand" "RT")))]
+        (sign_extend:DI (match_operand:HI 1 "memory_operand" "T")))]
   "TARGET_ZARCH"
   "lgh\t%0,%1"
   [(set_attr "op_type" "RXY")
    lh\t%0,%1
    lhy\t%0,%1"
   [(set_attr "op_type" "RX,RXY")
+   (set_attr "cpu_facility" "*,longdisp")
    (set_attr "z10prop" "z10_super_E1,z10_super_E1")])
 
 ;
 ; lbr, lgbr, lb, lgb
 (define_insn "*extendqi<mode>2_extimm"
   [(set (match_operand:GPR 0 "register_operand" "=d,d")
-        (sign_extend:GPR (match_operand:QI 1 "nonimmediate_operand" "d,RT")))]
+        (sign_extend:GPR (match_operand:QI 1 "nonimmediate_operand" "d,T")))]
   "TARGET_EXTIMM"
   "@
    l<g>br\t%0,%1
 ; lb, lgb
 (define_insn "*extendqi<mode>2"
   [(set (match_operand:GPR 0 "register_operand" "=d")
-        (sign_extend:GPR (match_operand:QI 1 "memory_operand" "RT")))]
+        (sign_extend:GPR (match_operand:QI 1 "memory_operand" "T")))]
   "!TARGET_EXTIMM && TARGET_LONG_DISPLACEMENT"
   "l<g>b\t%0,%1"
   [(set_attr "op_type" "RXY")
 
 (define_insn "*zero_extendsidi2"
   [(set (match_operand:DI 0 "register_operand" "=d,d,d")
-        (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "d,RT,b")))]
+        (zero_extend:DI (match_operand:SI 1 "nonimmediate_operand" "d,T,b")))]
   "TARGET_ZARCH"
   "@
    llgfr\t%0,%1
 
 (define_insn "*llgt_sidi"
   [(set (match_operand:DI 0 "register_operand" "=d")
-        (and:DI (subreg:DI (match_operand:SI 1 "memory_operand" "RT") 0)
+        (and:DI (subreg:DI (match_operand:SI 1 "memory_operand" "T") 0)
                (const_int 2147483647)))]
   "TARGET_ZARCH"
   "llgt\t%0,%1"
 
 (define_insn_and_split "*llgt_sidi_split"
   [(set (match_operand:DI 0 "register_operand" "=d")
-        (and:DI (subreg:DI (match_operand:SI 1 "memory_operand" "RT") 0)
+        (and:DI (subreg:DI (match_operand:SI 1 "memory_operand" "T") 0)
                (const_int 2147483647)))
    (clobber (reg:CC CC_REGNUM))]
   "TARGET_ZARCH"
 
 (define_insn "*llgt_sisi"
   [(set (match_operand:SI 0 "register_operand" "=d,d")
-        (and:SI (match_operand:SI 1 "nonimmediate_operand" "d,RT")
+        (and:SI (match_operand:SI 1 "nonimmediate_operand" "d,T")
                (const_int 2147483647)))]
   "TARGET_ZARCH"
   "@
 ; llhrl, llghrl
 (define_insn "*zero_extendhi<mode>2_z10"
   [(set (match_operand:GPR 0 "register_operand" "=d,d,d")
-        (zero_extend:GPR (match_operand:HI 1 "nonimmediate_operand" "d,RT,b")))]
+        (zero_extend:GPR (match_operand:HI 1 "nonimmediate_operand" "d,T,b")))]
   "TARGET_Z10"
   "@
    ll<g>hr\t%0,%1
 ; llhr, llcr, llghr, llgcr, llh, llc, llgh, llgc
 (define_insn "*zero_extend<HQI:mode><GPR:mode>2_extimm"
   [(set (match_operand:GPR 0 "register_operand" "=d,d")
-        (zero_extend:GPR (match_operand:HQI 1 "nonimmediate_operand" "d,RT")))]
+        (zero_extend:GPR (match_operand:HQI 1 "nonimmediate_operand" "d,T")))]
   "TARGET_EXTIMM"
   "@
    ll<g><hc>r\t%0,%1
 ; llgh, llgc
 (define_insn "*zero_extend<HQI:mode><GPR:mode>2"
   [(set (match_operand:GPR 0 "register_operand" "=d")
-        (zero_extend:GPR (match_operand:HQI 1 "memory_operand" "RT")))]
+        (zero_extend:GPR (match_operand:HQI 1 "memory_operand" "T")))]
   "TARGET_ZARCH && !TARGET_EXTIMM"
   "llg<hc>\t%0,%1"
   [(set_attr "op_type" "RXY")
 
 (define_insn_and_split "*zero_extendhisi2_31"
   [(set (match_operand:SI 0 "register_operand" "=&d")
-        (zero_extend:SI (match_operand:HI 1 "s_operand" "QS")))
+        (zero_extend:SI (match_operand:HI 1 "s_operand" "S")))
    (clobber (reg:CC CC_REGNUM))]
   "!TARGET_ZARCH"
   "#"
 
 (define_insn_and_split "*zero_extendqisi2_31"
   [(set (match_operand:SI 0 "register_operand" "=&d")
-        (zero_extend:SI (match_operand:QI 1 "memory_operand" "RT")))]
+        (zero_extend:SI (match_operand:QI 1 "memory_operand" "T")))]
   "!TARGET_ZARCH"
   "#"
   "&& reload_completed"
 
 (define_insn "*zero_extendqihi2_64"
   [(set (match_operand:HI 0 "register_operand" "=d")
-        (zero_extend:HI (match_operand:QI 1 "memory_operand" "RT")))]
+        (zero_extend:HI (match_operand:QI 1 "memory_operand" "T")))]
   "TARGET_ZARCH && !TARGET_EXTIMM"
   "llgc\t%0,%1"
   [(set_attr "op_type" "RXY")
 
 (define_insn_and_split "*zero_extendqihi2_31"
   [(set (match_operand:HI 0 "register_operand" "=&d")
-        (zero_extend:HI (match_operand:QI 1 "memory_operand" "RT")))]
+        (zero_extend:HI (match_operand:QI 1 "memory_operand" "T")))]
   "!TARGET_ZARCH"
   "#"
   "&& reload_completed"
   [(parallel
     [(set (match_operand:DI 0 "register_operand" "")
          (unsigned_fix:DI (match_operand:DD 1 "register_operand" "")))
-     (unspec:DI [(const_int 5)] UNSPEC_ROUND)
+     (unspec:DI [(const_int DFP_RND_TOWARD_0)] UNSPEC_ROUND)
      (clobber (reg:CC CC_REGNUM))])]
 
   "TARGET_HARD_DFP"
            LT, NULL_RTX, VOIDmode, 0, label1);
       emit_insn (gen_subtd3 (temp, temp,
            const_double_from_real_value (sub, TDmode)));
-      emit_insn (gen_fix_trunctddi2_dfp (operands[0], temp, GEN_INT (11)));
+      emit_insn (gen_fix_trunctddi2_dfp (operands[0], temp,
+                                        GEN_INT (DFP_RND_TOWARD_MINF)));
       emit_jump (label2);
 
       emit_label (label1);
-      emit_insn (gen_fix_truncdddi2_dfp (operands[0], operands[1], GEN_INT (9)));
+      emit_insn (gen_fix_truncdddi2_dfp (operands[0], operands[1],
+                                        GEN_INT (DFP_RND_TOWARD_0)));
       emit_label (label2);
       DONE;
     }
   [(parallel
     [(set (match_operand:DI 0 "register_operand" "")
          (unsigned_fix:DI (match_operand:TD 1 "register_operand" "")))
-     (unspec:DI [(const_int 5)] UNSPEC_ROUND)
+     (unspec:DI [(const_int DFP_RND_TOWARD_0)] UNSPEC_ROUND)
      (clobber (reg:CC CC_REGNUM))])]
 
   "TARGET_HARD_DFP"
            LT, NULL_RTX, VOIDmode, 0, label1);
       emit_insn (gen_subtd3 (temp, operands[1],
            const_double_from_real_value (sub, TDmode)));
-      emit_insn (gen_fix_trunctddi2_dfp (operands[0], temp, GEN_INT (11)));
+      emit_insn (gen_fix_trunctddi2_dfp (operands[0], temp,
+                                        GEN_INT (DFP_RND_TOWARD_MINF)));
       emit_jump (label2);
 
       emit_label (label1);
-      emit_insn (gen_fix_trunctddi2_dfp (operands[0], operands[1], GEN_INT (9)));
+      emit_insn (gen_fix_trunctddi2_dfp (operands[0], operands[1],
+                                        GEN_INT (DFP_RND_TOWARD_0)));
       emit_label (label2);
       DONE;
     }
   [(parallel
     [(set (match_operand:GPR 0 "register_operand" "")
          (unsigned_fix:GPR (match_operand:BFP 1 "register_operand" "")))
-     (unspec:GPR [(const_int 5)] UNSPEC_ROUND)
+     (unspec:GPR [(const_int BFP_RND_TOWARD_0)] UNSPEC_ROUND)
      (clobber (reg:CC CC_REGNUM))])]
   "TARGET_HARD_FLOAT"
 {
       emit_insn (gen_sub<BFP:mode>3 (temp, operands[1],
            const_double_from_real_value (sub, <BFP:MODE>mode)));
       emit_insn (gen_fix_trunc<BFP:mode><GPR:mode>2_bfp (operands[0], temp,
-           GEN_INT (7)));
+           GEN_INT (BFP_RND_TOWARD_MINF)));
       emit_jump (label2);
 
       emit_label (label1);
       emit_insn (gen_fix_trunc<BFP:mode><GPR:mode>2_bfp (operands[0],
-           operands[1], GEN_INT (5)));
+           operands[1], GEN_INT (BFP_RND_TOWARD_0)));
       emit_label (label2);
       DONE;
     }
   [(parallel
     [(set (match_operand:SI 0 "register_operand" "")
          (unsigned_fix:SI (match_operand:DFP 1 "register_operand" "")))
-     (unspec:SI [(const_int 5)] UNSPEC_ROUND)
+     (unspec:SI [(const_int DFP_RND_TOWARD_0)] UNSPEC_ROUND)
      (clobber (reg:CC CC_REGNUM))])]
   "TARGET_Z196 && TARGET_HARD_DFP"
   "")
        (unsigned_fix:DI (match_operand:DF 1 "register_operand"  "f,v")))
    (unspec:DI [(match_operand:DI           2 "immediate_operand" "K,K")] UNSPEC_ROUND)
    (clobber (reg:CC CC_REGNUM))]
-   "TARGET_Z13 && TARGET_HARD_FLOAT"
+   "TARGET_VX && TARGET_HARD_FLOAT"
    "@
     clgdbr\t%0,%h2,%1,0
     wclgdb\t%v0,%v1,0,%h2"
    (unspec:GPR [(match_operand:GPR          2 "immediate_operand" "K")] UNSPEC_ROUND)
    (clobber (reg:CC CC_REGNUM))]
    "TARGET_Z196 && TARGET_HARD_FLOAT
-    && (!TARGET_Z13 || <GPR:MODE>mode != DImode || <FP:MODE>mode != DFmode)"
+    && (!TARGET_VX || <GPR:MODE>mode != DImode || <FP:MODE>mode != DFmode)"
    "cl<GPR:gf><FP:xde><FP:bt>r\t%0,%h2,%1,0"
    [(set_attr "op_type" "RRF")
     (set_attr "type"    "ftoi")])
   "TARGET_HARD_FLOAT"
 {
   emit_insn (gen_fix_trunc<DSF:mode><GPR:mode>2_bfp (operands[0], operands[1],
-             GEN_INT (5)));
+             GEN_INT (BFP_RND_TOWARD_0)));
   DONE;
 })
 
         (fix:DI (match_operand:DF 1 "register_operand"  "f,v")))
    (unspec:DI [(match_operand:DI  2 "immediate_operand" "K,K")] UNSPEC_ROUND)
    (clobber (reg:CC CC_REGNUM))]
-  "TARGET_Z13 && TARGET_HARD_FLOAT"
+  "TARGET_VX && TARGET_HARD_FLOAT"
   "@
    cgdbr\t%0,%h2,%1
    wcgdb\t%v0,%v1,0,%h2"
 {
   operands[1] = force_reg (<MODE>mode, operands[1]);
   emit_insn (gen_fix_trunc<mode>di2_dfp (operands[0], operands[1],
-      GEN_INT (9)));
+      GEN_INT (DFP_RND_TOWARD_0)));
   DONE;
 })
 
 (define_expand "fix_trunctf<mode>2"
   [(parallel [(set (match_operand:GPR 0 "register_operand" "")
                   (fix:GPR (match_operand:TF 1 "register_operand" "")))
-             (unspec:GPR [(const_int 5)] UNSPEC_ROUND)
+             (unspec:GPR [(const_int BFP_RND_TOWARD_0)] UNSPEC_ROUND)
              (clobber (reg:CC CC_REGNUM))])]
   "TARGET_HARD_FLOAT"
   "")
    wcdgb\t%v0,%v1,0,0"
   [(set_attr "op_type"      "RRE,VRR")
    (set_attr "type"         "itof<mode>" )
-   (set_attr "cpu_facility" "*,vec")
+   (set_attr "cpu_facility" "*,vx")
    (set_attr "enabled"      "*,<DFDI>")])
 
 ; cxfbr, cdfbr, cefbr
 (define_insn "*floatunsdidf2_z13"
   [(set (match_operand:DF                    0 "register_operand" "=f,v")
         (unsigned_float:DF (match_operand:DI 1 "register_operand"  "d,v")))]
-  "TARGET_Z13 && TARGET_HARD_FLOAT"
+  "TARGET_VX && TARGET_HARD_FLOAT"
   "@
    cdlgbr\t%0,0,%1,0
    wcdlgb\t%v0,%v1,0,0"
                        ; According to BFP rounding mode
   [(set_attr "op_type"      "RRE,VRR")
    (set_attr "type"         "ftruncdf")
-   (set_attr "cpu_facility" "*,vec")])
+   (set_attr "cpu_facility" "*,vx")])
 
 ;
 ; trunctf(df|sf)2 instruction pattern(s).
 ; trunctddd2 and truncddsd2 instruction pattern(s).
 ;
 
-(define_insn "trunctddd2"
+
+(define_expand "trunctddd2"
+  [(parallel
+    [(set (match_operand:DD 0 "register_operand" "")
+         (float_truncate:DD (match_operand:TD 1 "register_operand" "")))
+     (unspec:DI [(const_int DFP_RND_CURRENT)] UNSPEC_ROUND)
+     (clobber (scratch:TD))])]
+  "TARGET_HARD_DFP")
+
+(define_insn "*trunctddd2"
   [(set (match_operand:DD 0 "register_operand" "=f")
        (float_truncate:DD (match_operand:TD 1 "register_operand" "f")))
-   (clobber (match_scratch:TD 2 "=f"))]
+   (unspec:DI [(match_operand:DI 2 "const_mask_operand" "I")] UNSPEC_ROUND)
+   (clobber (match_scratch:TD 3 "=f"))]
   "TARGET_HARD_DFP"
-  "ldxtr\t%2,0,%1,0\;ldr\t%0,%2"
+  "ldxtr\t%3,%2,%1,0\;ldr\t%0,%3"
   [(set_attr "length"  "6")
    (set_attr "type"    "ftruncdd")])
 
 
 (define_expand "trunctdsd2"
   [(parallel
-    [(set (match_dup 3)
+    [(set (match_dup 2)
          (float_truncate:DD (match_operand:TD 1 "register_operand" "")))
-     (clobber (match_scratch:TD 2 ""))])
+     (unspec:DI [(const_int DFP_RND_PREP_FOR_SHORT_PREC)] UNSPEC_ROUND)
+     (clobber (match_scratch:TD 3 ""))])
    (set (match_operand:SD 0 "register_operand" "")
-       (float_truncate:SD (match_dup 3)))]
+       (float_truncate:SD (match_dup 2)))]
   "TARGET_HARD_DFP"
 {
-  operands[3] = gen_reg_rtx (DDmode);
+  operands[2] = gen_reg_rtx (DDmode);
 })
 
 ;
 (define_insn "*extendsfdf2_z13"
   [(set (match_operand:DF                  0 "register_operand"     "=f,f,v")
         (float_extend:DF (match_operand:SF 1 "nonimmediate_operand"  "f,R,v")))]
-  "TARGET_Z13 && TARGET_HARD_FLOAT"
+  "TARGET_VX && TARGET_HARD_FLOAT"
   "@
    ldebr\t%0,%1
    ldeb\t%0,%1
 
 (define_insn "*adddi3_sign"
   [(set (match_operand:DI 0 "register_operand" "=d,d")
-        (plus:DI (sign_extend:DI (match_operand:SI 2 "general_operand" "d,RT"))
+        (plus:DI (sign_extend:DI (match_operand:SI 2 "general_operand" "d,T"))
                  (match_operand:DI 1 "register_operand" "0,0")))
    (clobber (reg:CC CC_REGNUM))]
   "TARGET_ZARCH"
 
 (define_insn "*adddi3_zero_cc"
   [(set (reg CC_REGNUM)
-        (compare (plus:DI (zero_extend:DI (match_operand:SI 2 "general_operand" "d,RT"))
+        (compare (plus:DI (zero_extend:DI (match_operand:SI 2 "general_operand" "d,T"))
                           (match_operand:DI 1 "register_operand" "0,0"))
                  (const_int 0)))
    (set (match_operand:DI 0 "register_operand" "=d,d")
 
 (define_insn "*adddi3_zero_cconly"
   [(set (reg CC_REGNUM)
-        (compare (plus:DI (zero_extend:DI (match_operand:SI 2 "general_operand" "d,RT"))
+        (compare (plus:DI (zero_extend:DI (match_operand:SI 2 "general_operand" "d,T"))
                           (match_operand:DI 1 "register_operand" "0,0"))
                  (const_int 0)))
    (clobber (match_scratch:DI 0 "=d,d"))]
 
 (define_insn "*adddi3_zero"
   [(set (match_operand:DI 0 "register_operand" "=d,d")
-        (plus:DI (zero_extend:DI (match_operand:SI 2 "general_operand" "d,RT"))
+        (plus:DI (zero_extend:DI (match_operand:SI 2 "general_operand" "d,T"))
                  (match_operand:DI 1 "register_operand" "0,0")))
    (clobber (reg:CC CC_REGNUM))]
   "TARGET_ZARCH"
    ah\t%0,%2
    ahy\t%0,%2"
   [(set_attr "op_type"  "RX,RXY")
+   (set_attr "cpu_facility" "*,longdisp")
    (set_attr "z196prop" "z196_cracked,z196_cracked")])
 
 ;
 
 ; ark, agrk, ar, ahi, ahik, aghik, alfi, slfi, a, ay, agr, aghi, algfi, slgfi, ag, asi, agsi
 (define_insn "*add<mode>3"
-  [(set (match_operand:GPR 0 "nonimmediate_operand"           "=d,d,d,d, d, d,d,d,QS")
-        (plus:GPR (match_operand:GPR 1 "nonimmediate_operand" "%0,d,0,d, 0, 0,0,0, 0")
-                 (match_operand:GPR 2 "general_operand"      " d,d,K,K,Op,On,R,T, C") ) )
+  [(set (match_operand:GPR 0 "nonimmediate_operand"           "=d,d,d,d, d, d,d,d,S")
+        (plus:GPR (match_operand:GPR 1 "nonimmediate_operand" "%0,d,0,d, 0, 0,0,0,0")
+                 (match_operand:GPR 2 "general_operand"      " d,d,K,K,Op,On,R,T,C") ) )
    (clobber (reg:CC CC_REGNUM))]
   ""
   "@
    a<y>\t%0,%2
    a<g>si\t%0,%c2"
   [(set_attr "op_type"  "RR<E>,RRF,RI,RIE,RIL,RIL,RX<Y>,RXY,SIY")
-   (set_attr "cpu_facility" "*,z196,*,z196,extimm,extimm,*,*,z10")
+   (set_attr "cpu_facility" "*,z196,*,z196,extimm,extimm,*,longdisp,z10")
    (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,*,z10_super_E1,z10_super_E1,
                         z10_super_E1,z10_super_E1,z10_super_E1")])
 
    al<y>\t%0,%2
    al<g>si\t%0,%c2"
   [(set_attr "op_type"      "RR<E>,RRF,RIL,RIL,RIE,RX<Y>,RXY,SIY")
-   (set_attr "cpu_facility" "*,z196,extimm,extimm,z196,*,*,z10")
+   (set_attr "cpu_facility" "*,z196,extimm,extimm,z196,*,longdisp,z10")
    (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super_E1,*,
                         z10_super_E1,z10_super_E1,z10_super_E1")])
 
    al<g>\t%0,%2
    al<y>\t%0,%2"
   [(set_attr "op_type"  "RR<E>,RRF,RX<Y>,RXY")
-   (set_attr "cpu_facility" "*,z196,*,*")
+   (set_attr "cpu_facility" "*,z196,*,longdisp")
    (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super_E1")])
 
 ; alr, alfi, slfi, al, aly, algr, algfi, slgfi, alg, alsi, algsi, alrk, algrk, alhsik, alghsik
 (define_insn "*add<mode>3_carry2_cc"
   [(set (reg CC_REGNUM)
-        (compare (plus:GPR (match_operand:GPR 1 "nonimmediate_operand" "%0,d, 0, 0,d,0,0, 0")
-                          (match_operand:GPR 2 "general_operand"      " d,d,Op,On,K,R,T, C"))
+        (compare (plus:GPR (match_operand:GPR 1 "nonimmediate_operand" "%0,d, 0, 0,d,0,0,0")
+                          (match_operand:GPR 2 "general_operand"      " d,d,Op,On,K,R,T,C"))
                  (match_dup 2)))
-   (set (match_operand:GPR 0 "nonimmediate_operand"                    "=d,d, d, d,d,d,d,RS")
+   (set (match_operand:GPR 0 "nonimmediate_operand"                    "=d,d, d, d,d,d,d,S")
         (plus:GPR (match_dup 1) (match_dup 2)))]
   "s390_match_ccmode (insn, CCL1mode)"
   "@
    al<y>\t%0,%2
    al<g>si\t%0,%c2"
   [(set_attr "op_type"  "RR<E>,RRF,RIL,RIL,RIE,RX<Y>,RXY,SIY")
-   (set_attr "cpu_facility" "*,z196,extimm,extimm,z196,*,*,z10")
+   (set_attr "cpu_facility" "*,z196,extimm,extimm,z196,*,longdisp,z10")
    (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super_E1,*,
                         z10_super_E1,z10_super_E1,z10_super_E1")])
 
    al<g>\t%0,%2
    al<y>\t%0,%2"
   [(set_attr "op_type"  "RR<E>,RRF,RX<Y>,RXY")
-   (set_attr "cpu_facility" "*,z196,*,*")
+   (set_attr "cpu_facility" "*,z196,*,longdisp")
    (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super_E1")])
 
 ; alr, alfi, slfi, al, aly, algr, algfi, slgfi, alg, alsi, algsi, alrk, algrk, alhsik, alghsik
 (define_insn "*add<mode>3_cc"
   [(set (reg CC_REGNUM)
-        (compare (plus:GPR (match_operand:GPR 1 "nonimmediate_operand" "%0,d, 0, 0,d,0,0, 0")
-                          (match_operand:GPR 2 "general_operand"      " d,d,Op,On,K,R,T, C"))
+        (compare (plus:GPR (match_operand:GPR 1 "nonimmediate_operand" "%0,d, 0, 0,d,0,0,0")
+                          (match_operand:GPR 2 "general_operand"      " d,d,Op,On,K,R,T,C"))
                  (const_int 0)))
-   (set (match_operand:GPR 0 "nonimmediate_operand"                    "=d,d, d, d,d,d,d,RS")
+   (set (match_operand:GPR 0 "nonimmediate_operand"                    "=d,d, d, d,d,d,d,S")
         (plus:GPR (match_dup 1) (match_dup 2)))]
   "s390_match_ccmode (insn, CCLmode)"
   "@
    al<y>\t%0,%2
    al<g>si\t%0,%c2"
   [(set_attr "op_type"  "RR<E>,RRF,RIL,RIL,RIE,RX<Y>,RXY,SIY")
-   (set_attr "cpu_facility" "*,z196,extimm,extimm,z196,*,*,z10")
+   (set_attr "cpu_facility" "*,z196,extimm,extimm,z196,*,longdisp,z10")
    (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super_E1,
                         *,z10_super_E1,z10_super_E1,z10_super_E1")])
 
    al<g>\t%0,%2
    al<y>\t%0,%2"
   [(set_attr "op_type"  "RR<E>,RRF,RX<Y>,RXY")
-   (set_attr "cpu_facility" "*,z196,*,*")
+   (set_attr "cpu_facility" "*,z196,*,longdisp")
    (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super_E1")])
 
 ; alr, al, aly, algr, alg, alrk, algrk
    al<g>\t%0,%2
    al<y>\t%0,%2"
   [(set_attr "op_type"  "RR<E>,RRF,RX<Y>,RXY")
-   (set_attr "cpu_facility" "*,z196,*,*")
+   (set_attr "cpu_facility" "*,z196,*,longdisp")
    (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super_E1")])
 
 ; ahi, afi, aghi, agfi, asi, agsi
 (define_insn "*add<mode>3_imm_cc"
   [(set (reg CC_REGNUM)
         (compare (plus:GPR (match_operand:GPR 1 "nonimmediate_operand" " 0, d,0, 0")
-                          (match_operand:GPR 2 "const_int_operand"    " K, K,Os, C"))
+                          (match_operand:GPR 2 "const_int_operand"    " K, K,Os,C"))
                  (const_int 0)))
-   (set (match_operand:GPR 0 "nonimmediate_operand"                    "=d, d,d,QS")
+   (set (match_operand:GPR 0 "nonimmediate_operand"                    "=d, d,d, S")
         (plus:GPR (match_dup 1) (match_dup 2)))]
   "s390_match_ccmode (insn, CCAmode)
    && (CONST_OK_FOR_CONSTRAINT_P (INTVAL (operands[2]), 'K', \"K\")
    wfadb\t%v0,%v1,%v2"
   [(set_attr "op_type"      "RRF,RRE,RXE,VRR")
    (set_attr "type"         "fsimp<mode>")
-   (set_attr "cpu_facility" "*,*,*,vec")
+   (set_attr "cpu_facility" "*,*,*,vx")
    (set_attr "enabled"      "<nBFP>,<nDFP>,<DSF>,<DFDI>")])
 
 ; axbr, adbr, aebr, axb, adb, aeb, adtr, axtr
      (clobber (reg:CC CC_REGNUM))])]
   "TARGET_ZARCH"
 {
-  /* For z13 we have vaq which doesn't set CC.  */
+  /* For z13 we have vsq which doesn't set CC.  */
   if (TARGET_VX)
     {
       emit_insn (gen_rtx_SET (operands[0],
 (define_insn "*subdi3_sign"
   [(set (match_operand:DI 0 "register_operand" "=d,d")
         (minus:DI (match_operand:DI 1 "register_operand" "0,0")
-                  (sign_extend:DI (match_operand:SI 2 "general_operand" "d,RT"))))
+                  (sign_extend:DI (match_operand:SI 2 "general_operand" "d,T"))))
    (clobber (reg:CC CC_REGNUM))]
   "TARGET_ZARCH"
   "@
 (define_insn "*subdi3_zero_cc"
   [(set (reg CC_REGNUM)
         (compare (minus:DI (match_operand:DI 1 "register_operand" "0,0")
-                           (zero_extend:DI (match_operand:SI 2 "general_operand" "d,RT")))
+                           (zero_extend:DI (match_operand:SI 2 "general_operand" "d,T")))
                  (const_int 0)))
    (set (match_operand:DI 0 "register_operand" "=d,d")
         (minus:DI (match_dup 1) (zero_extend:DI (match_dup 2))))]
 (define_insn "*subdi3_zero_cconly"
   [(set (reg CC_REGNUM)
         (compare (minus:DI (match_operand:DI 1 "register_operand" "0,0")
-                           (zero_extend:DI (match_operand:SI 2 "general_operand" "d,RT")))
+                           (zero_extend:DI (match_operand:SI 2 "general_operand" "d,T")))
                  (const_int 0)))
    (clobber (match_scratch:DI 0 "=d,d"))]
   "s390_match_ccmode (insn, CCLmode) && TARGET_ZARCH"
 (define_insn "*subdi3_zero"
   [(set (match_operand:DI 0 "register_operand" "=d,d")
         (minus:DI (match_operand:DI 1 "register_operand" "0,0")
-                  (zero_extend:DI (match_operand:SI 2 "general_operand" "d,RT"))))
+                  (zero_extend:DI (match_operand:SI 2 "general_operand" "d,T"))))
    (clobber (reg:CC CC_REGNUM))]
   "TARGET_ZARCH"
   "@
    sh\t%0,%2
    shy\t%0,%2"
   [(set_attr "op_type"  "RX,RXY")
+   (set_attr "cpu_facility" "*,longdisp")
    (set_attr "z196prop" "z196_cracked,z196_cracked")])
 
 ;
    s<g>\t%0,%2
    s<y>\t%0,%2"
   [(set_attr "op_type"  "RR<E>,RRF,RX<Y>,RXY")
-   (set_attr "cpu_facility" "*,z196,*,*")
+   (set_attr "cpu_facility" "*,z196,*,longdisp")
    (set_attr "z10prop" "z10_super_c_E1,*,z10_super_E1,z10_super_E1")])
 
 ; slr, sl, sly, slgr, slg, slrk, slgrk
    sl<g>\t%0,%2
    sl<y>\t%0,%2"
   [(set_attr "op_type"  "RR<E>,RRF,RX<Y>,RXY")
-   (set_attr "cpu_facility" "*,z196,*,*")
+   (set_attr "cpu_facility" "*,z196,*,longdisp")
    (set_attr "z10prop" "z10_super_c_E1,*,z10_super_E1,z10_super_E1")])
 
 ; slr, sl, sly, slgr, slg, slrk, slgrk
    sl<g>\t%0,%2
    sl<y>\t%0,%2"
   [(set_attr "op_type"  "RR<E>,RRF,RX<Y>,RXY")
-   (set_attr "cpu_facility" "*,z196,*,*")
+   (set_attr "cpu_facility" "*,z196,*,longdisp")
    (set_attr "z10prop" "z10_super_c_E1,*,z10_super_E1,z10_super_E1")])
 
 ; slr, sl, sly, slgr, slg, slrk, slgrk
    sl<g>\t%0,%2
    sl<y>\t%0,%2"
   [(set_attr "op_type"  "RR<E>,RRF,RX<Y>,RXY")
-   (set_attr "cpu_facility" "*,z196,*,*")
+   (set_attr "cpu_facility" "*,z196,*,longdisp")
    (set_attr "z10prop" "z10_super_c_E1,*,z10_super_E1,z10_super_E1")])
 
 ; slr, sl, sly, slgr, slg, slrk, slgrk
    sl<g>\t%0,%2
    sl<y>\t%0,%2"
   [(set_attr "op_type"  "RR<E>,RRF,RX<Y>,RXY")
-   (set_attr "cpu_facility" "*,z196,*,*")
+   (set_attr "cpu_facility" "*,z196,*,longdisp")
    (set_attr "z10prop" "z10_super_c_E1,*,z10_super_E1,z10_super_E1")])
 
 ; slr, sl, sly, slgr, slg, slrk, slgrk
    sl<g>\t%0,%2
    sl<y>\t%0,%2"
   [(set_attr "op_type"  "RR<E>,RRF,RX<Y>,RXY")
-   (set_attr "cpu_facility" "*,z196,*,*")
+   (set_attr "cpu_facility" "*,z196,*,longdisp")
    (set_attr "z10prop" "z10_super_c_E1,*,z10_super_E1,z10_super_E1")])
 
 
    sl<g>\t%0,%2
    sl<y>\t%0,%2"
   [(set_attr "op_type"  "RR<E>,RRF,RX<Y>,RXY")
-   (set_attr "cpu_facility" "*,z196,*,*")
+   (set_attr "cpu_facility" "*,z196,*,longdisp")
    (set_attr "z10prop" "z10_super_c_E1,*,z10_super_E1,z10_super_E1")])
 
 
    wfsdb\t%v0,%v1,%v2"
   [(set_attr "op_type"      "RRF,RRE,RXE,VRR")
    (set_attr "type"         "fsimp<mode>")
-   (set_attr "cpu_facility" "*,*,*,vec")
+   (set_attr "cpu_facility" "*,*,*,vx")
    (set_attr "enabled"      "<nBFP>,<nDFP>,<DSF>,<DFDI>")])
 
 ; sxbr, sdbr, sebr, sdb, seb, sxtr, sdtr
         (compare
           (plus:GPR (plus:GPR (match_operand:GPR 3 "s390_alc_comparison" "")
                               (match_operand:GPR 1 "nonimmediate_operand" "%0,0"))
-                    (match_operand:GPR 2 "general_operand" "d,RT"))
+                    (match_operand:GPR 2 "general_operand" "d,T"))
           (match_dup 1)))
    (set (match_operand:GPR 0 "register_operand" "=d,d")
         (plus:GPR (plus:GPR (match_dup 3) (match_dup 1)) (match_dup 2)))]
         (compare
           (plus:GPR (plus:GPR (match_operand:GPR 3 "s390_alc_comparison" "")
                               (match_operand:GPR 1 "nonimmediate_operand" "%0,0"))
-                    (match_operand:GPR 2 "general_operand" "d,RT"))
+                    (match_operand:GPR 2 "general_operand" "d,T"))
           (match_dup 1)))
    (clobber (match_scratch:GPR 0 "=d,d"))]
   "s390_match_ccmode (insn, CCL1mode) && TARGET_CPU_ZARCH"
         (compare
           (plus:GPR (plus:GPR (match_operand:GPR 3 "s390_alc_comparison" "")
                               (match_operand:GPR 1 "nonimmediate_operand" "%0,0"))
-                    (match_operand:GPR 2 "general_operand" "d,RT"))
+                    (match_operand:GPR 2 "general_operand" "d,T"))
           (match_dup 2)))
    (set (match_operand:GPR 0 "register_operand" "=d,d")
         (plus:GPR (plus:GPR (match_dup 3) (match_dup 1)) (match_dup 2)))]
         (compare
           (plus:GPR (plus:GPR (match_operand:GPR 3 "s390_alc_comparison" "")
                               (match_operand:GPR 1 "nonimmediate_operand" "%0,0"))
-                    (match_operand:GPR 2 "general_operand" "d,RT"))
+                    (match_operand:GPR 2 "general_operand" "d,T"))
           (match_dup 2)))
    (clobber (match_scratch:GPR 0 "=d,d"))]
   "s390_match_ccmode (insn, CCL1mode) && TARGET_CPU_ZARCH"
         (compare
           (plus:GPR (plus:GPR (match_operand:GPR 3 "s390_alc_comparison" "")
                               (match_operand:GPR 1 "nonimmediate_operand" "%0,0"))
-                    (match_operand:GPR 2 "general_operand" "d,RT"))
+                    (match_operand:GPR 2 "general_operand" "d,T"))
           (const_int 0)))
    (set (match_operand:GPR 0 "register_operand" "=d,d")
         (plus:GPR (plus:GPR (match_dup 3) (match_dup 1)) (match_dup 2)))]
   [(set (match_operand:GPR 0 "register_operand" "=d,d")
         (plus:GPR (plus:GPR (match_operand:GPR 3 "s390_alc_comparison" "")
                             (match_operand:GPR 1 "nonimmediate_operand" "%0,0"))
-                  (match_operand:GPR 2 "general_operand" "d,RT")))
+                  (match_operand:GPR 2 "general_operand" "d,T")))
    (clobber (reg:CC CC_REGNUM))]
   "TARGET_CPU_ZARCH"
   "@
   [(set (reg CC_REGNUM)
         (compare
           (minus:GPR (minus:GPR (match_operand:GPR 1 "nonimmediate_operand" "0,0")
-                                (match_operand:GPR 2 "general_operand" "d,RT"))
+                                (match_operand:GPR 2 "general_operand" "d,T"))
                      (match_operand:GPR 3 "s390_slb_comparison" ""))
           (const_int 0)))
    (set (match_operand:GPR 0 "register_operand" "=d,d")
 (define_insn "*sub<mode>3_slb"
   [(set (match_operand:GPR 0 "register_operand" "=d,d")
         (minus:GPR (minus:GPR (match_operand:GPR 1 "nonimmediate_operand" "0,0")
-                              (match_operand:GPR 2 "general_operand" "d,RT"))
+                              (match_operand:GPR 2 "general_operand" "d,T"))
                    (match_operand:GPR 3 "s390_slb_comparison" "")))
    (clobber (reg:CC CC_REGNUM))]
   "TARGET_CPU_ZARCH"
                                     XEXP (operands[1], 1));
 })
 
-; locr, loc, stoc, locgr, locg, stocg
+; locr, loc, stoc, locgr, locg, stocg, lochi, locghi
 (define_insn_and_split "*mov<mode>cc"
-  [(set (match_operand:GPR 0 "nonimmediate_operand"   "=d,d, d, d,QS,QS,&d")
+  [(set (match_operand:GPR 0 "nonimmediate_operand"   "=d,d,d,d,d,d,S,S,&d")
        (if_then_else:GPR
          (match_operator 1 "s390_comparison"
-           [(match_operand 2 "cc_reg_operand"        " c,c, c, c, c, c, c")
+           [(match_operand 2 "cc_reg_operand"        " c,c,c,c,c,c,c,c,c")
             (match_operand 5 "const_int_operand"     "")])
-         (match_operand:GPR 3 "nonimmediate_operand" " d,0,QS, 0, d, 0,QS")
-         (match_operand:GPR 4 "nonimmediate_operand" " 0,d, 0,QS, 0, d,QS")))]
+         (match_operand:GPR 3 "loc_operand" " d,0,S,0,K,0,d,0,S")
+         (match_operand:GPR 4 "loc_operand" " 0,d,0,S,0,K,0,d,S")))]
   "TARGET_Z196"
   "@
    loc<g>r%C1\t%0,%3
    loc<g>r%D1\t%0,%4
    loc<g>%C1\t%0,%3
    loc<g>%D1\t%0,%4
+   loc<g>hi%C1\t%0,%h3
+   loc<g>hi%D1\t%0,%h4
    stoc<g>%C1\t%3,%0
    stoc<g>%D1\t%4,%0
    #"
         (match_dup 0)
         (match_dup 4)))]
   ""
-  [(set_attr "op_type" "RRF,RRF,RSY,RSY,RSY,RSY,*")])
+  [(set_attr "op_type" "RRF,RRF,RSY,RSY,RIE,RIE,RSY,RSY,*")
+   (set_attr "cpu_facility" "*,*,*,*,z13,z13,*,*,*")])
 
 ;;
 ;;- Multiply instructions.
 
 (define_insn "*muldi3_sign"
   [(set (match_operand:DI 0 "register_operand" "=d,d")
-        (mult:DI (sign_extend:DI (match_operand:SI 2 "general_operand" "d,RT"))
+        (mult:DI (sign_extend:DI (match_operand:SI 2 "general_operand" "d,T"))
                  (match_operand:DI 1 "register_operand" "0,0")))]
   "TARGET_ZARCH"
   "@
 (define_insn "muldi3"
   [(set (match_operand:DI 0 "register_operand" "=d,d,d,d")
         (mult:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0,0,0")
-                 (match_operand:DI 2 "general_operand" "d,K,RT,Os")))]
+                 (match_operand:DI 2 "general_operand" "d,K,T,Os")))]
   "TARGET_ZARCH"
   "@
    msgr\t%0,%2
    msfi\t%0,%2"
   [(set_attr "op_type"      "RRE,RI,RX,RXY,RIL")
    (set_attr "type"         "imulsi,imulhi,imulsi,imulsi,imulsi")
-   (set_attr "cpu_facility" "*,*,*,*,z10")])
+   (set_attr "cpu_facility" "*,*,*,longdisp,z10")])
 
 ;
 ; mulsidi3 instruction pattern(s).
 
 ; mlr, ml, mlgr, mlg
 (define_insn "umul<dwh><mode>3"
-  [(set (match_operand:DW 0 "register_operand"                   "=d, d")
+  [(set (match_operand:DW 0 "register_operand"                   "=d,d")
         (mult:DW (zero_extend:DW
-                  (match_operand:<DWH> 1 "register_operand"     "%0, 0"))
+                  (match_operand:<DWH> 1 "register_operand"     "%0,0"))
                  (zero_extend:DW
-                  (match_operand:<DWH> 2 "nonimmediate_operand" " d,RT"))))]
+                  (match_operand:<DWH> 2 "nonimmediate_operand" " d,T"))))]
   "TARGET_CPU_ZARCH"
   "@
    ml<tg>r\t%0,%2
    wfmdb\t%v0,%v1,%v2"
   [(set_attr "op_type"      "RRF,RRE,RXE,VRR")
    (set_attr "type"         "fmul<mode>")
-   (set_attr "cpu_facility" "*,*,*,vec")
+   (set_attr "cpu_facility" "*,*,*,vx")
    (set_attr "enabled"      "<nBFP>,<nDFP>,<DSF>,<DFDI>")])
 
 ; madbr, maebr, maxb, madb, maeb
    wfmadb\t%v0,%v1,%v2,%v3"
   [(set_attr "op_type"      "RRE,RXE,VRR")
    (set_attr "type"         "fmadd<mode>")
-   (set_attr "cpu_facility" "*,*,vec")
+   (set_attr "cpu_facility" "*,*,vx")
    (set_attr "enabled"      "*,*,<DFDI>")])
 
 ; msxbr, msdbr, msebr, msxb, msdb, mseb
    wfmsdb\t%v0,%v1,%v2,%v3"
   [(set_attr "op_type"      "RRE,RXE,VRR")
    (set_attr "type"         "fmadd<mode>")
-   (set_attr "cpu_facility" "*,*,vec")
+   (set_attr "cpu_facility" "*,*,vx")
    (set_attr "enabled"      "*,*,<DFDI>")])
 
 ;;
    (clobber (match_dup 4))]
   "TARGET_ZARCH"
 {
-  rtx insn, div_equal, mod_equal;
+  rtx div_equal, mod_equal;
+  rtx_insn *insn;
 
   div_equal = gen_rtx_DIV (DImode, operands[1], operands[2]);
   mod_equal = gen_rtx_MOD (DImode, operands[1], operands[2]);
           (ashift:TI
             (zero_extend:TI
               (mod:DI (match_operand:DI 1 "register_operand" "0,0")
-                      (match_operand:DI 2 "general_operand" "d,RT")))
+                      (match_operand:DI 2 "general_operand" "d,T")))
             (const_int 64))
           (zero_extend:TI (div:DI (match_dup 1) (match_dup 2)))))]
   "TARGET_ZARCH"
             (zero_extend:TI
               (mod:DI (match_operand:DI 1 "register_operand" "0,0")
                       (sign_extend:DI
-                        (match_operand:SI 2 "nonimmediate_operand" "d,RT"))))
+                        (match_operand:SI 2 "nonimmediate_operand" "d,T"))))
             (const_int 64))
           (zero_extend:TI
             (div:DI (match_dup 1) (sign_extend:DI (match_dup 2))))))]
    (clobber (match_dup 4))]
   "TARGET_ZARCH"
 {
-  rtx insn, div_equal, mod_equal, equal;
+  rtx div_equal, mod_equal, equal;
+  rtx_insn *insn;
 
   div_equal = gen_rtx_UDIV (DImode, operands[1], operands[2]);
   mod_equal = gen_rtx_UMOD (DImode, operands[1], operands[2]);
               (truncate:DI
                 (umod:TI (match_operand:TI 1 "register_operand" "0,0")
                          (zero_extend:TI
-                           (match_operand:DI 2 "nonimmediate_operand" "d,RT")))))
+                           (match_operand:DI 2 "nonimmediate_operand" "d,T")))))
             (const_int 64))
           (zero_extend:TI
             (truncate:DI
    (clobber (match_dup 4))]
   "!TARGET_ZARCH"
 {
-  rtx insn, div_equal, mod_equal, equal;
+  rtx div_equal, mod_equal, equal;
+  rtx_insn *insn;
 
   div_equal = gen_rtx_DIV (SImode, operands[1], operands[2]);
   mod_equal = gen_rtx_MOD (SImode, operands[1], operands[2]);
    (clobber (match_dup 4))]
   "!TARGET_ZARCH && TARGET_CPU_ZARCH"
 {
-  rtx insn, div_equal, mod_equal, equal;
+  rtx div_equal, mod_equal, equal;
+  rtx_insn *insn;
 
   div_equal = gen_rtx_UDIV (SImode, operands[1], operands[2]);
   mod_equal = gen_rtx_UMOD (SImode, operands[1], operands[2]);
               (truncate:SI
                 (umod:DI (match_operand:DI 1 "register_operand" "0,0")
                          (zero_extend:DI
-                           (match_operand:SI 2 "nonimmediate_operand" "d,RT")))))
+                           (match_operand:SI 2 "nonimmediate_operand" "d,T")))))
             (const_int 32))
           (zero_extend:DI
             (truncate:SI
    (clobber (match_dup 3))]
   "!TARGET_ZARCH && !TARGET_CPU_ZARCH"
 {
-  rtx insn, udiv_equal, umod_equal, equal;
+  rtx udiv_equal, umod_equal, equal;
+  rtx_insn *insn;
 
   udiv_equal = gen_rtx_UDIV (SImode, operands[1], operands[2]);
   umod_equal = gen_rtx_UMOD (SImode, operands[1], operands[2]);
    (clobber (match_dup 3))]
   "!TARGET_ZARCH && !TARGET_CPU_ZARCH"
 {
-  rtx insn, udiv_equal, umod_equal, equal;
+  rtx udiv_equal, umod_equal, equal;
+  rtx_insn *insn;
 
   udiv_equal = gen_rtx_UDIV (SImode, operands[1], operands[2]);
   umod_equal = gen_rtx_UMOD (SImode, operands[1], operands[2]);
    wfddb\t%v0,%v1,%v2"
   [(set_attr "op_type"      "RRF,RRE,RXE,VRR")
    (set_attr "type"         "fdiv<mode>")
-   (set_attr "cpu_facility" "*,*,*,vec")
+   (set_attr "cpu_facility" "*,*,*,vx")
    (set_attr "enabled"      "<nBFP>,<nDFP>,<DSF>,<DFDI>")])
 
 
 (define_insn "*anddi3_cc"
   [(set (reg CC_REGNUM)
         (compare
-         (and:DI (match_operand:DI 1 "nonimmediate_operand" "%0,d, 0,    d")
-                  (match_operand:DI 2 "general_operand"      " d,d,RT,NxxDq"))
+         (and:DI (match_operand:DI 1 "nonimmediate_operand" "%0,d,0,    d")
+                  (match_operand:DI 2 "general_operand"      " d,d,T,NxxDw"))
           (const_int 0)))
-   (set (match_operand:DI 0 "register_operand"               "=d,d, d,    d")
+   (set (match_operand:DI 0 "register_operand"               "=d,d,d,    d")
         (and:DI (match_dup 1) (match_dup 2)))]
   "TARGET_ZARCH && s390_match_ccmode(insn, CCTmode)"
   "@
 (define_insn "*anddi3_cconly"
   [(set (reg CC_REGNUM)
         (compare
-         (and:DI (match_operand:DI 1 "nonimmediate_operand" "%0,d, 0,    d")
-                  (match_operand:DI 2 "general_operand"      " d,d,RT,NxxDq"))
+         (and:DI (match_operand:DI 1 "nonimmediate_operand" "%0,d,0,    d")
+                  (match_operand:DI 2 "general_operand"      " d,d,T,NxxDw"))
                  (const_int 0)))
-   (clobber (match_scratch:DI 0                              "=d,d, d,    d"))]
+   (clobber (match_scratch:DI 0                              "=d,d,d,    d"))]
   "TARGET_ZARCH
    && s390_match_ccmode(insn, CCTmode)
    /* Do not steal TM patterns.  */
 
 (define_insn "*anddi3"
   [(set (match_operand:DI 0 "nonimmediate_operand"
-            "=d,d,    d,    d,    d,    d,    d,    d,d,d, d,    d,   AQ,Q")
+            "=d,d,    d,    d,    d,    d,    d,    d,d,d,d,    d,   AQ,Q")
         (and:DI
          (match_operand:DI 1 "nonimmediate_operand"
-            "%d,o,    0,    0,    0,    0,    0,    0,0,d, 0,    d,    0,0")
+            "%d,o,    0,    0,    0,    0,    0,    0,0,d,0,    d,    0,0")
           (match_operand:DI 2 "general_operand"
-            "M, M,N0HDF,N1HDF,N2HDF,N3HDF,N0SDF,N1SDF,d,d,RT,NxxDq,NxQDF,Q")))
+            "M, M,N0HDF,N1HDF,N2HDF,N3HDF,N0SDF,N1SDF,d,d,T,NxxDw,NxQDF,Q")))
    (clobber (reg:CC CC_REGNUM))]
   "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
   "@
   "s390_narrow_logical_operator (AND, &operands[0], &operands[1]);")
 
 ;; These two are what combine generates for (ashift (zero_extract)).
-(define_insn "*extzv_<mode>_srl"
+(define_insn "*extzv_<mode>_srl<clobbercc_or_nocc>"
   [(set (match_operand:GPR 0 "register_operand" "=d")
        (and:GPR (lshiftrt:GPR
                   (match_operand:GPR 1 "register_operand" "d")
                   (match_operand:GPR 2 "nonzero_shift_count_operand" ""))
-               (match_operand:GPR 3 "contiguous_bitmask_operand" "")))
-   (clobber (reg:CC CC_REGNUM))]
-  "TARGET_Z10
+               (match_operand:GPR 3 "contiguous_bitmask_nowrap_operand" "")))]
+  "<z10_or_zEC12_cond>
    /* Note that even for the SImode pattern, the rotate is always DImode.  */
    && s390_extzv_shift_ok (<bitsize>, -INTVAL (operands[2]),
                           INTVAL (operands[3]))"
-  "risbg\t%0,%1,%<bfstart>3,128+%<bfend>3,64-%2"
+  "<risbg_n>\t%0,%1,%<bfstart>3,128+%<bfend>3,64-%2"
   [(set_attr "op_type" "RIE")
    (set_attr "z10prop" "z10_super_E1")])
 
-(define_insn "*extzv_<mode>_sll"
+(define_insn "*extzv_<mode>_sll<clobbercc_or_nocc>"
   [(set (match_operand:GPR 0 "register_operand" "=d")
        (and:GPR (ashift:GPR
                  (match_operand:GPR 1 "register_operand" "d")
                  (match_operand:GPR 2 "nonzero_shift_count_operand" ""))
-               (match_operand:GPR 3 "contiguous_bitmask_operand" "")))
-   (clobber (reg:CC CC_REGNUM))]
-  "TARGET_Z10
+               (match_operand:GPR 3 "contiguous_bitmask_nowrap_operand" "")))]
+  "<z10_or_zEC12_cond>
    && s390_extzv_shift_ok (<bitsize>, INTVAL (operands[2]),
                           INTVAL (operands[3]))"
-  "risbg\t%0,%1,%<bfstart>3,128+%<bfend>3,%2"
+  "<risbg_n>\t%0,%1,%<bfstart>3,128+%<bfend>3,%2"
   [(set_attr "op_type" "RIE")
    (set_attr "z10prop" "z10_super_E1")])
 
    ny\t%0,%2
    risbg\t%0,%1,%t2,128+%f2,0"
   [(set_attr "op_type"  "RIL,RR,RRF,RX,RXY,RIE")
-   (set_attr "cpu_facility" "*,*,z196,*,*,z10")
+   (set_attr "cpu_facility" "*,*,z196,*,longdisp,z10")
    (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,
                        z10_super_E1,z10_super_E1,z10_super_E1")])
 
    ny\t%0,%2
    risbg\t%0,%1,%t2,128+%f2,0"
   [(set_attr "op_type"  "RIL,RR,RRF,RX,RXY,RIE")
-   (set_attr "cpu_facility" "*,*,z196,*,*,z10")
+   (set_attr "cpu_facility" "*,*,z196,*,longdisp,z10")
    (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,
                         z10_super_E1,z10_super_E1,z10_super_E1")])
 
         (and:SI (match_operand:SI 1 "nonimmediate_operand"
                            "%d,o,    0,    0, 0,0,d,0,0,    d,    0,0")
                 (match_operand:SI 2 "general_operand"
-                           " M,M,N0HSF,N1HSF,Os,d,d,R,T,NxxSq,NxQSF,Q")))
+                           " M,M,N0HSF,N1HSF,Os,d,d,R,T,NxxSw,NxQSF,Q")))
    (clobber (reg:CC CC_REGNUM))]
   "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
   "@
    #
    #"
   [(set_attr "op_type"  "RRE,RXE,RI,RI,RIL,RR,RRF,RX,RXY,RIE,SI,SS")
-   (set_attr "cpu_facility" "*,*,*,*,*,*,z196,*,*,z10,*,*")
+   (set_attr "cpu_facility" "*,*,*,*,*,*,z196,*,longdisp,z10,*,*")
    (set_attr "z10prop" "*,
                         *,
                         z10_super_E1,
    niy\t%S0,%b2
    #"
   [(set_attr "op_type"  "RR,RRF,RI,SI,SIY,SS")
-   (set_attr "cpu_facility" "*,z196,*,*,*,*")
+   (set_attr "cpu_facility" "*,z196,*,*,longdisp,*")
    (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,z10_super,z10_super,*")])
 
 (define_insn "*andqi3_esa"
   [(set_attr "op_type"  "RR,SI,SS")
    (set_attr "z10prop" "z10_super_E1,z10_super,*")])
 
+;
+; And with complement
+;
+; c = ~b & a = (b & a) ^ a
+
+(define_insn_and_split "*andc_split_<mode>"
+  [(set (match_operand:GPR 0 "nonimmediate_operand" "")
+       (and:GPR (not:GPR (match_operand:GPR 1 "nonimmediate_operand" ""))
+                (match_operand:GPR 2 "general_operand" "")))
+   (clobber (reg:CC CC_REGNUM))]
+  "! reload_completed
+   && (GET_CODE (operands[0]) != MEM
+      /* Ensure that s390_logical_operator_ok_p will succeed even
+        on the split xor if (b & a) is stored into a pseudo.  */
+       || rtx_equal_p (operands[0], operands[2]))"
+  "#"
+  "&& 1"
+  [
+  (parallel
+   [(set (match_dup 3) (and:GPR (match_dup 1) (match_dup 2)))
+   (clobber (reg:CC CC_REGNUM))])
+  (parallel
+   [(set (match_dup 0) (xor:GPR (match_dup 3) (match_dup 2)))
+   (clobber (reg:CC CC_REGNUM))])]
+{
+  if (reg_overlap_mentioned_p (operands[0], operands[2]))
+    operands[3] = gen_reg_rtx (<MODE>mode);
+  else
+    operands[3] = operands[0];
+})
+
 ;
 ; Block and (NC) patterns.
 ;
 
 (define_insn "*iordi3_cc"
   [(set (reg CC_REGNUM)
-        (compare (ior:DI (match_operand:DI 1 "nonimmediate_operand" "%0,d, 0")
-                         (match_operand:DI 2 "general_operand"      " d,d,RT"))
+        (compare (ior:DI (match_operand:DI 1 "nonimmediate_operand" "%0,d,0")
+                         (match_operand:DI 2 "general_operand"      " d,d,T"))
                  (const_int 0)))
-   (set (match_operand:DI 0 "register_operand"                      "=d,d, d")
+   (set (match_operand:DI 0 "register_operand"                      "=d,d,d")
         (ior:DI (match_dup 1) (match_dup 2)))]
   "s390_match_ccmode(insn, CCTmode) && TARGET_ZARCH"
   "@
 (define_insn "*iordi3_cconly"
   [(set (reg CC_REGNUM)
         (compare (ior:DI (match_operand:DI 1 "nonimmediate_operand" "%0,d,0")
-                         (match_operand:DI 2 "general_operand"      " d,d,RT"))
+                         (match_operand:DI 2 "general_operand"      " d,d,T"))
                  (const_int 0)))
    (clobber (match_scratch:DI 0                                     "=d,d,d"))]
   "s390_match_ccmode(insn, CCTmode) && TARGET_ZARCH"
 
 (define_insn "*iordi3"
   [(set (match_operand:DI 0 "nonimmediate_operand"
-                               "=d,    d,    d,    d,    d,    d,d,d, d,   AQ,Q")
+                               "=d,    d,    d,    d,    d,    d,d,d,d,   AQ,Q")
         (ior:DI (match_operand:DI 1 "nonimmediate_operand"
-                            "   %0,    0,    0,    0,    0,    0,0,d, 0,    0,0")
+                            "   %0,    0,    0,    0,    0,    0,0,d,0,    0,0")
                 (match_operand:DI 2 "general_operand"
-                            "N0HD0,N1HD0,N2HD0,N3HD0,N0SD0,N1SD0,d,d,RT,NxQD0,Q")))
+                            "N0HD0,N1HD0,N2HD0,N3HD0,N0SD0,N1SD0,d,d,T,NxQD0,Q")))
    (clobber (reg:CC CC_REGNUM))]
   "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
   "@
    o\t%0,%2
    oy\t%0,%2"
   [(set_attr "op_type"  "RIL,RR,RRF,RX,RXY")
-   (set_attr "cpu_facility" "*,*,z196,*,*")
+   (set_attr "cpu_facility" "*,*,z196,*,longdisp")
    (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,z10_super_E1,z10_super_E1")])
 
 (define_insn "*iorsi3_cconly"
    o\t%0,%2
    oy\t%0,%2"
   [(set_attr "op_type"  "RIL,RR,RRF,RX,RXY")
-   (set_attr "cpu_facility" "*,*,z196,*,*")
+   (set_attr "cpu_facility" "*,*,z196,*,longdisp")
    (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,z10_super_E1,z10_super_E1")])
 
 (define_insn "*iorsi3_zarch"
    #
    #"
   [(set_attr "op_type"  "RI,RI,RIL,RR,RRF,RX,RXY,SI,SS")
-   (set_attr "cpu_facility" "*,*,*,*,z196,*,*,*,*")
+   (set_attr "cpu_facility" "*,*,*,*,z196,*,longdisp,*,*")
    (set_attr "z10prop" "z10_super_E1,
                         z10_super_E1,
                         z10_super_E1,
    oiy\t%S0,%b2
    #"
   [(set_attr "op_type" "RR,RRF,RI,SI,SIY,SS")
-   (set_attr "cpu_facility" "*,z196,*,*,*,*")
+   (set_attr "cpu_facility" "*,z196,*,*,longdisp,*")
    (set_attr "z10prop" "z10_super_E1,*,z10_super_E1,
                         z10_super,z10_super,*")])
 
 
 (define_insn "*xordi3_cc"
   [(set (reg CC_REGNUM)
-        (compare (xor:DI (match_operand:DI 1 "nonimmediate_operand" "%0,d, 0")
-                         (match_operand:DI 2 "general_operand"      " d,d,RT"))
+        (compare (xor:DI (match_operand:DI 1 "nonimmediate_operand" "%0,d,0")
+                         (match_operand:DI 2 "general_operand"      " d,d,T"))
                  (const_int 0)))
-   (set (match_operand:DI 0 "register_operand"                      "=d,d, d")
+   (set (match_operand:DI 0 "register_operand"                      "=d,d,d")
         (xor:DI (match_dup 1) (match_dup 2)))]
   "s390_match_ccmode(insn, CCTmode) && TARGET_ZARCH"
   "@
 
 (define_insn "*xordi3_cconly"
   [(set (reg CC_REGNUM)
-        (compare (xor:DI (match_operand:DI 1 "nonimmediate_operand" "%0,d, 0")
-                         (match_operand:DI 2 "general_operand"      " d,d,RT"))
+        (compare (xor:DI (match_operand:DI 1 "nonimmediate_operand" "%0,d,0")
+                         (match_operand:DI 2 "general_operand"      " d,d,T"))
                  (const_int 0)))
-   (clobber (match_scratch:DI 0                                     "=d,d, d"))]
+   (clobber (match_scratch:DI 0                                     "=d,d,d"))]
   "s390_match_ccmode(insn, CCTmode) && TARGET_ZARCH"
   "@
    xgr\t%0,%2
    (set_attr "z10prop" "z10_super_E1,*,z10_super_E1")])
 
 (define_insn "*xordi3"
-  [(set (match_operand:DI 0 "nonimmediate_operand"         "=d,    d,d,d, d,   AQ,Q")
-        (xor:DI (match_operand:DI 1 "nonimmediate_operand" "%0,    0,0,d, 0,    0,0")
-                (match_operand:DI 2 "general_operand"   "N0SD0,N1SD0,d,d,RT,NxQD0,Q")))
+  [(set (match_operand:DI 0 "nonimmediate_operand"         "=d,    d,d,d,d,   AQ,Q")
+        (xor:DI (match_operand:DI 1 "nonimmediate_operand" "%0,    0,0,d,0,    0,0")
+                (match_operand:DI 2 "general_operand"   "N0SD0,N1SD0,d,d,T,NxQD0,Q")))
    (clobber (reg:CC CC_REGNUM))]
   "TARGET_ZARCH && s390_logical_operator_ok_p (operands)"
   "@
    x\t%0,%2
    xy\t%0,%2"
   [(set_attr "op_type" "RIL,RR,RRF,RX,RXY")
-   (set_attr "cpu_facility" "*,*,z196,*,*")
+   (set_attr "cpu_facility" "*,*,z196,*,longdisp")
    (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,
                         z10_super_E1,z10_super_E1")])
 
    x\t%0,%2
    xy\t%0,%2"
   [(set_attr "op_type" "RIL,RR,RRF,RX,RXY")
-   (set_attr "cpu_facility" "*,*,z196,*,*")
+   (set_attr "cpu_facility" "*,*,z196,*,longdisp")
    (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,
                         z10_super_E1,z10_super_E1")])
 
    #
    #"
   [(set_attr "op_type"  "RIL,RR,RRF,RX,RXY,SI,SS")
-   (set_attr "cpu_facility" "*,*,z196,*,*,*,*")
+   (set_attr "cpu_facility" "*,*,z196,*,longdisp,*,*")
    (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,
                         z10_super_E1,z10_super_E1,*,*")])
 
    xiy\t%S0,%b2
    #"
   [(set_attr "op_type"  "RIL,RR,RRF,SI,SIY,SS")
-   (set_attr "cpu_facility" "*,*,z196,*,*,*")
+   (set_attr "cpu_facility" "*,*,z196,*,longdisp,*")
    (set_attr "z10prop" "z10_super_E1,z10_super_E1,*,z10_super,z10_super,*")])
 
 
    lc<xde>br\t%0,%1
    wflcdb\t%0,%1"
   [(set_attr "op_type"      "RRE,VRR")
-   (set_attr "cpu_facility" "*,vec")
+   (set_attr "cpu_facility" "*,vx")
    (set_attr "type"         "fsimp<mode>,*")
    (set_attr "enabled"      "*,<DFDI>")])
 
     lp<xde>br\t%0,%1
     wflpdb\t%0,%1"
   [(set_attr "op_type"      "RRE,VRR")
-   (set_attr "cpu_facility" "*,vec")
+   (set_attr "cpu_facility" "*,vx")
    (set_attr "type"         "fsimp<mode>,*")
    (set_attr "enabled"      "*,<DFDI>")])
 
    ln<xde>br\t%0,%1
    wflndb\t%0,%1"
   [(set_attr "op_type"      "RRE,VRR")
-   (set_attr "cpu_facility" "*,vec")
+   (set_attr "cpu_facility" "*,vx")
    (set_attr "type"         "fsimp<mode>,*")
    (set_attr "enabled"      "*,<DFDI>")])
 
    wfsqdb\t%v0,%v1"
   [(set_attr "op_type"      "RRE,RXE,VRR")
    (set_attr "type"         "fsqrt<mode>")
-   (set_attr "cpu_facility" "*,*,vec")
+   (set_attr "cpu_facility" "*,*,vx")
    (set_attr "enabled"      "*,<DSF>,<DFDI>")])
 
 
        (clz:DI (match_operand:DI 1 "register_operand" "d")))]
   "TARGET_EXTIMM && TARGET_ZARCH"
 {
-  rtx insn, clz_equal;
+  rtx_insn *insn;
+  rtx clz_equal;
   rtx wide_reg = gen_reg_rtx (TImode);
-  rtx msb = gen_rtx_CONST_INT (DImode, (unsigned HOST_WIDE_INT) 1 << 63);
+  rtx msb = gen_rtx_CONST_INT (DImode, HOST_WIDE_INT_1U << 63);
 
   clz_equal = gen_rtx_CLZ (DImode, operands[1]);
 
            (const_int 64))
           (zero_extend:TI (clz:DI (match_dup 1)))))
    (clobber (reg:CC CC_REGNUM))]
-  "(unsigned HOST_WIDE_INT) INTVAL (operands[2])
-   == (unsigned HOST_WIDE_INT) 1 << 63
+  "UINTVAL (operands[2]) == HOST_WIDE_INT_1U << 63
    && TARGET_EXTIMM && TARGET_ZARCH"
   "flogr\t%0,%1"
   [(set_attr "op_type"  "RRE")])
 ; clrt, clgrt, clfit, clgit, clt, clgt
 (define_insn "*cmp_and_trap_unsigned_int<mode>"
   [(trap_if (match_operator 0 "s390_unsigned_integer_comparison"
-              [(match_operand:GPR 1 "register_operand" "d,d, d")
-               (match_operand:GPR 2 "general_operand"  "d,D,RT")])
+              [(match_operand:GPR 1 "register_operand" "d,d,d")
+               (match_operand:GPR 2 "general_operand"  "d,D,T")])
            (const_int 0))]
   "TARGET_Z10"
   "@
 
 ; lat, lgat
 (define_insn "*load_and_trap<mode>"
-  [(trap_if (eq (match_operand:GPR 0 "memory_operand"  "RT")
+  [(trap_if (eq (match_operand:GPR 0 "memory_operand"  "T")
                (const_int 0))
            (const_int 0))
    (set (match_operand:GPR 1 "register_operand" "=d")
         (if_then_else
           (ne (match_operand:SI 1 "register_operand" "d")
               (const_int 1))
-          (match_operand 0 "address_operand" "ZQZR")
+          (match_operand 0 "address_operand" "ZR")
           (pc)))
    (set (match_operand:SI 2 "register_operand" "=1")
         (plus:SI (match_dup 1) (const_int -1)))
 ;
 
 (define_insn "indirect_jump"
- [(set (pc) (match_operand 0 "address_operand" "ZQZR"))]
+ [(set (pc) (match_operand 0 "address_operand" "ZR"))]
   ""
 {
   if (get_attr_op_type (insn) == OP_TYPE_RR)
 ;
 
 (define_insn "casesi_jump"
- [(set (pc) (match_operand 0 "address_operand" "ZQZR"))
+ [(set (pc) (match_operand 0 "address_operand" "ZR"))
    (use (label_ref (match_operand 1 "" "")))]
   ""
 {
    (set_attr "z196prop" "z196_cracked")])
 
 (define_insn "*basr"
-  [(call (mem:QI (match_operand 0 "address_operand" "ZQZR"))
+  [(call (mem:QI (match_operand 0 "address_operand" "ZR"))
          (match_operand 1 "const_int_operand" "n"))
    (clobber (match_operand 2 "register_operand" "=r"))]
   "!SIBLING_CALL_P (insn) && GET_MODE (operands[2]) == Pmode"
 
 (define_insn "*basr_r"
   [(set (match_operand 0 "" "")
-        (call (mem:QI (match_operand 1 "address_operand" "ZQZR"))
+        (call (mem:QI (match_operand 1 "address_operand" "ZR"))
               (match_operand 2 "const_int_operand" "n")))
    (clobber (match_operand 3 "register_operand" "=r"))]
   "!SIBLING_CALL_P (insn) && GET_MODE (operands[3]) == Pmode"
 
 (define_insn "*tls_load_64"
   [(set (match_operand:DI 0 "register_operand" "=d")
-        (unspec:DI [(match_operand:DI 1 "memory_operand" "RT")
+        (unspec:DI [(match_operand:DI 1 "memory_operand" "T")
                     (match_operand:DI 2 "" "")]
                   UNSPEC_TLS_LOAD))]
   "TARGET_64BIT"
    ly\t%0,%1%J2"
   [(set_attr "op_type" "RX,RXY")
    (set_attr "type" "load")
+   (set_attr "cpu_facility" "*,longdisp")
    (set_attr "z10prop" "z10_fwd_A3,z10_fwd_A3")])
 
 (define_insn "*bras_tls"
 
 (define_insn "*basr_tls"
   [(set (match_operand 0 "" "")
-        (call (mem:QI (match_operand 1 "address_operand" "ZQZR"))
+        (call (mem:QI (match_operand 1 "address_operand" "ZR"))
               (match_operand 2 "const_int_operand" "n")))
    (clobber (match_operand 3 "register_operand" "=r"))
    (use (match_operand 4 "" ""))]
    ld\t%0,%1
    ldy\t%0,%1"
   [(set_attr "op_type" "RS,RSY,RS,RSY")
+   (set_attr "cpu_facility" "*,longdisp,*,longdisp")
    (set_attr "type" "lm,lm,floaddf,floaddf")])
 
 (define_insn "atomic_loadti_1"
   [(set (match_operand:TI 0 "register_operand" "=r")
-       (unspec:TI [(match_operand:TI 1 "memory_operand" "RT")]
+       (unspec:TI [(match_operand:TI 1 "memory_operand" "T")]
                   UNSPEC_MOVA))]
   "TARGET_ZARCH"
   "lpq\t%0,%1"
    std %1,%0
    stdy %1,%0"
   [(set_attr "op_type" "RS,RSY,RS,RSY")
+   (set_attr "cpu_facility" "*,longdisp,*,longdisp")
    (set_attr "type" "stm,stm,fstoredf,fstoredf")])
 
 (define_insn "atomic_storeti_1"
-  [(set (match_operand:TI 0 "memory_operand" "=RT")
+  [(set (match_operand:TI 0 "memory_operand" "=T")
        (unspec:TI [(match_operand:TI 1 "register_operand" "r")]
                   UNSPEC_MOVA))]
   "TARGET_ZARCH"
 ; cdsg, csg
 (define_insn "*atomic_compare_and_swap<mode>_1"
   [(set (match_operand:TDI 0 "register_operand" "=r")
-       (match_operand:TDI 1 "memory_operand" "+QS"))
+       (match_operand:TDI 1 "memory_operand" "+S"))
    (set (match_dup 1)
        (unspec_volatile:TDI
          [(match_dup 1)
    cds\t%0,%3,%S1
    cdsy\t%0,%3,%S1"
   [(set_attr "op_type" "RS,RSY")
+   (set_attr "cpu_facility" "*,longdisp")
    (set_attr "type" "sem")])
 
 ; cs, csy
    cs\t%0,%3,%S1
    csy\t%0,%3,%S1"
   [(set_attr "op_type" "RS,RSY")
+   (set_attr "cpu_facility" "*,longdisp")
    (set_attr "type"   "sem")])
 
 ;
 ; lan, lang, lao, laog, lax, laxg, laa, laag
 (define_insn "atomic_fetch_<atomic><mode>_iaf"
   [(set (match_operand:GPR 0 "register_operand" "=d")
-       (match_operand:GPR 1 "memory_operand" "+QS"))
+       (match_operand:GPR 1 "memory_operand" "+S"))
    (set (match_dup 1)
        (unspec_volatile:GPR
         [(ATOMIC_Z196:GPR (match_dup 1)
 (define_insn "nop_2_byte"
   [(unspec_volatile [(const_int 0)] UNSPECV_NOP_2_BYTE)]
   ""
-  "nopr\t%%r7"
+  "nopr\t%%r0"
   [(set_attr "op_type" "RR")])
 
 (define_insn "nop_4_byte"
   [(set_attr "length" "0")])
 
 
+(define_insn "stack_restore_from_fpr"
+  [(set (reg:DI STACK_REGNUM)
+       (match_operand:DI 0 "register_operand" "f"))
+   (clobber (mem:BLK (scratch)))]
+  "TARGET_Z10"
+  "lgdr\t%%r15,%0"
+  [(set_attr "op_type"  "RRE")])
+
 ;
 ; Data prefetch patterns
 ;
 
 (define_insn "prefetch"
-  [(prefetch (match_operand 0    "address_operand"   "ZQZRZSZT,X")
-            (match_operand:SI 1 "const_int_operand" "       n,n")
-            (match_operand:SI 2 "const_int_operand" "       n,n"))]
+  [(prefetch (match_operand 0    "address_operand"   "ZT,X")
+            (match_operand:SI 1 "const_int_operand" " n,n")
+            (match_operand:SI 2 "const_int_operand" " n,n"))]
   "TARGET_Z10"
 {
   switch (which_alternative)
       case 1:
         if (larl_operand (operands[0], Pmode))
          return INTVAL (operands[1]) == 1 ? "pfdrl\t2,%a0" : "pfdrl\t1,%a0";
+         /* fallthrough */
       default:
 
         /* This might be reached for symbolic operands with an odd
 
 ; FIXME: There is also mvcin but we cannot use it since src and target
 ; may overlap.
+; lrvr, lrv, strv, lrvgr, lrvg, strvg
 (define_insn "bswap<mode>2"
-  [(set (match_operand:GPR 0            "nonimmediate_operand" "=d, d,RT")
-       (bswap:GPR (match_operand:GPR 1 "nonimmediate_operand" " d,RT, d")))]
+  [(set (match_operand:GPR 0            "nonimmediate_operand" "=d,d,T")
+       (bswap:GPR (match_operand:GPR 1 "nonimmediate_operand" " d,T,d")))]
   "TARGET_CPU_ZARCH"
   "@
    lrv<g>r\t%0,%1
    (set_attr "z10prop" "z10_super")])
 
 (define_insn "bswaphi2"
-  [(set (match_operand:HI 0           "nonimmediate_operand" "=d, d,RT")
-       (bswap:HI (match_operand:HI 1 "nonimmediate_operand" " d,RT, d")))]
+  [(set (match_operand:HI 0           "nonimmediate_operand" "=d,d,T")
+       (bswap:HI (match_operand:HI 1 "nonimmediate_operand" " d,T,d")))]
   "TARGET_CPU_ZARCH"
   "@
    #
   if (CONST_INT_P (operands[0])
       && INTVAL (operands[0]) >= 0 && INTVAL (operands[0]) <= 255)
     {
-      error ("Invalid transaction abort code: " HOST_WIDE_INT_PRINT_DEC
+      error ("invalid transaction abort code: " HOST_WIDE_INT_PRINT_DEC
             ".  Values in range 0 through 255 are reserved.",
             INTVAL (operands[0]));
       FAIL;
 ; Non-transactional store
 
 (define_insn "ntstg"
-  [(set (match_operand:DI 0 "memory_operand" "=RT")
+  [(set (match_operand:DI 0 "memory_operand" "=T")
        (unspec_volatile:DI [(match_operand:DI 1 "register_operand" "d")]
                            UNSPECV_NTSTG))]
   "TARGET_HTM"
 
 (define_insn "lcbb"
   [(set (match_operand:SI             0 "register_operand"  "=d")
-       (unspec:SI [(match_operand    1 "address_operand" "ZQZR")
+       (unspec:SI [(match_operand    1 "address_operand" "ZR")
                    (match_operand:SI 2 "immediate_operand"  "C")] UNSPEC_LCBB))
    (clobber (reg:CC CC_REGNUM))]
   "TARGET_Z13"
   "jg%C1\t%0"
   [(set_attr "op_type" "RIL")
    (set_attr "type"  "branch")])
+
+(define_insn "osc_break"
+  [(unspec_volatile [(const_int 0)] UNSPECV_OSC_BREAK)]
+  ""
+  "bcr\t7,%%r0"
+  [(set_attr "op_type" "RR")])