Home | History | Annotate | Line # | Download | only in s390
      1  1.1  mrg ;;- Instruction patterns for the System z vector facility
      2  1.7  mrg ;;  Copyright (C) 2015-2022 Free Software Foundation, Inc.
      3  1.1  mrg ;;  Contributed by Andreas Krebbel (Andreas.Krebbel (a] de.ibm.com)
      4  1.1  mrg 
      5  1.1  mrg ;; This file is part of GCC.
      6  1.1  mrg 
      7  1.1  mrg ;; GCC is free software; you can redistribute it and/or modify it under
      8  1.1  mrg ;; the terms of the GNU General Public License as published by the Free
      9  1.1  mrg ;; Software Foundation; either version 3, or (at your option) any later
     10  1.1  mrg ;; version.
     11  1.1  mrg 
     12  1.1  mrg ;; GCC is distributed in the hope that it will be useful, but WITHOUT ANY
     13  1.1  mrg ;; WARRANTY; without even the implied warranty of MERCHANTABILITY or
     14  1.1  mrg ;; FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
     15  1.1  mrg ;; for more details.
     16  1.1  mrg 
     17  1.1  mrg ;; You should have received a copy of the GNU General Public License
     18  1.1  mrg ;; along with GCC; see the file COPYING3.  If not see
     19  1.1  mrg ;; <http://www.gnu.org/licenses/>.
     20  1.1  mrg 
     21  1.1  mrg ; All vector modes supported in a vector register
     22  1.1  mrg (define_mode_iterator V
     23  1.1  mrg   [V1QI V2QI V4QI V8QI V16QI V1HI V2HI V4HI V8HI V1SI V2SI V4SI V1DI V2DI V1SF
     24  1.1  mrg    V2SF V4SF V1DF V2DF])
     25  1.1  mrg (define_mode_iterator VT
     26  1.1  mrg   [V1QI V2QI V4QI V8QI V16QI V1HI V2HI V4HI V8HI V1SI V2SI V4SI V1DI V2DI V1SF
     27  1.1  mrg    V2SF V4SF V1DF V2DF V1TF V1TI TI])
     28  1.1  mrg 
     29  1.3  mrg ; All modes directly supported by the hardware having full vector reg size
     30  1.7  mrg ; V_HW2 is for having two iterators expanding independently e.g. vcond.
     31  1.7  mrg ; It's similar to V_HW, but not fully identical: V1TI is not included, because
     32  1.7  mrg ; there are no 128-bit compares.
     33  1.7  mrg (define_mode_iterator V_HW  [V16QI V8HI V4SI V2DI (V1TI "TARGET_VXE") V2DF
     34  1.7  mrg 			     (V4SF "TARGET_VXE") (V1TF "TARGET_VXE")
     35  1.7  mrg 			     (TF "TARGET_VXE")])
     36  1.7  mrg (define_mode_iterator V_HW2 [V16QI V8HI V4SI V2DI V2DF (V4SF "TARGET_VXE")
     37  1.7  mrg 			     (V1TF "TARGET_VXE") (TF "TARGET_VXE")])
     38  1.3  mrg 
     39  1.5  mrg (define_mode_iterator VT_HW_HSDT [V8HI V4SI V4SF V2DI V2DF V1TI V1TF TI TF])
     40  1.5  mrg (define_mode_iterator V_HW_HSD [V8HI V4SI (V4SF "TARGET_VXE") V2DI V2DF])
     41  1.3  mrg 
     42  1.1  mrg ; Including TI for instructions that support it (va, vn, ...)
     43  1.3  mrg (define_mode_iterator VT_HW [V16QI V8HI V4SI V2DI V2DF V1TI TI (V4SF "TARGET_VXE") (V1TF "TARGET_VXE")])
     44  1.1  mrg 
     45  1.1  mrg ; All full size integer vector modes supported in a vector register + TImode
     46  1.1  mrg (define_mode_iterator VIT_HW    [V16QI V8HI V4SI V2DI V1TI TI])
     47  1.1  mrg (define_mode_iterator VI_HW     [V16QI V8HI V4SI V2DI])
     48  1.1  mrg (define_mode_iterator VI_HW_QHS [V16QI V8HI V4SI])
     49  1.3  mrg (define_mode_iterator VI_HW_HSD [V8HI  V4SI V2DI])
     50  1.3  mrg (define_mode_iterator VI_HW_HS  [V8HI  V4SI])
     51  1.1  mrg (define_mode_iterator VI_HW_QH  [V16QI V8HI])
     52  1.7  mrg 
     53  1.7  mrg ; Directly supported vector modes with a certain number of elements
     54  1.7  mrg (define_mode_iterator V_HW_2   [V2DI V2DF])
     55  1.7  mrg (define_mode_iterator V_HW_4   [V4SI V4SF])
     56  1.1  mrg 
     57  1.1  mrg ; All integer vector modes supported in a vector register + TImode
     58  1.1  mrg (define_mode_iterator VIT [V1QI V2QI V4QI V8QI V16QI V1HI V2HI V4HI V8HI V1SI V2SI V4SI V1DI V2DI V1TI TI])
     59  1.1  mrg (define_mode_iterator VI  [V1QI V2QI V4QI V8QI V16QI V1HI V2HI V4HI V8HI V1SI V2SI V4SI V1DI V2DI])
     60  1.1  mrg (define_mode_iterator VI_QHS [V1QI V2QI V4QI V8QI V16QI V1HI V2HI V4HI V8HI V1SI V2SI V4SI])
     61  1.1  mrg 
     62  1.3  mrg (define_mode_iterator VFT [(V1SF "TARGET_VXE") (V2SF "TARGET_VXE") (V4SF "TARGET_VXE")
     63  1.3  mrg 			   V1DF V2DF
     64  1.7  mrg 			   (V1TF "TARGET_VXE") (TF "TARGET_VXE")])
     65  1.7  mrg 
     66  1.7  mrg ; All modes present in V_HW and VFT.
     67  1.7  mrg (define_mode_iterator V_HW_FT [V16QI V8HI V4SI V2DI (V1TI "TARGET_VXE") V1DF
     68  1.7  mrg 			       V2DF (V1SF "TARGET_VXE") (V2SF "TARGET_VXE")
     69  1.7  mrg 			       (V4SF "TARGET_VXE") (V1TF "TARGET_VXE")
     70  1.7  mrg 			       (TF "TARGET_VXE")])
     71  1.3  mrg 
     72  1.3  mrg ; FP vector modes directly supported by the HW.  This does not include
     73  1.3  mrg ; vector modes using only part of a vector register and should be used
     74  1.3  mrg ; for instructions which might trigger IEEE exceptions.
     75  1.7  mrg (define_mode_iterator VF_HW [(V4SF "TARGET_VXE") V2DF (V1TF "TARGET_VXE")
     76  1.7  mrg 			     (TF "TARGET_VXE")])
     77  1.3  mrg 
     78  1.1  mrg (define_mode_iterator V_8   [V1QI])
     79  1.1  mrg (define_mode_iterator V_16  [V2QI  V1HI])
     80  1.1  mrg (define_mode_iterator V_32  [V4QI  V2HI V1SI V1SF])
     81  1.1  mrg (define_mode_iterator V_64  [V8QI  V4HI V2SI V2SF V1DI V1DF])
     82  1.7  mrg (define_mode_iterator V_128 [V16QI V8HI V4SI V4SF V2DI V2DF V1TI V1TF
     83  1.7  mrg 			     (TF "TARGET_VXE")])
     84  1.3  mrg (define_mode_iterator V_128_NOSINGLE [V16QI V8HI V4SI V4SF V2DI V2DF])
     85  1.3  mrg 
     86  1.5  mrg ; 32 bit int<->fp vector conversion instructions are available since VXE2 (z15).
     87  1.5  mrg (define_mode_iterator VX_VEC_CONV_BFP [V2DF (V4SF "TARGET_VXE2")])
     88  1.5  mrg (define_mode_iterator VX_VEC_CONV_INT [V2DI (V4SI "TARGET_VXE2")])
     89  1.5  mrg 
     90  1.3  mrg ; Empty string for all but TImode.  This is used to hide the TImode
     91  1.3  mrg ; expander name in case it is defined already.  See addti3 for an
     92  1.3  mrg ; example.
     93  1.3  mrg (define_mode_attr ti* [(V1QI "")  (V2QI "") (V4QI "") (V8QI "") (V16QI "")
     94  1.3  mrg 		       (V1HI "")  (V2HI "") (V4HI "") (V8HI "")
     95  1.3  mrg 		       (V1SI "")  (V2SI "") (V4SI "")
     96  1.3  mrg 		       (V1DI "")  (V2DI "")
     97  1.3  mrg 		       (V1TI "")  (TI "*")
     98  1.3  mrg 		       (V1SF "")  (V2SF "") (V4SF "")
     99  1.3  mrg 		       (V1DF "")  (V2DF "")
    100  1.3  mrg 		       (V1TF "")  (TF "")])
    101  1.1  mrg 
    102  1.7  mrg ;; Facilitate dispatching TFmode expanders on z14+.
    103  1.7  mrg (define_mode_attr tf_vr [(TF "_vr") (V4SF "") (V2DF "") (V1TF "") (V1SF "")
    104  1.7  mrg 			 (V2SF "") (V1DF "") (V16QI "") (V8HI "") (V4SI "")
    105  1.7  mrg 			 (V2DI "") (V1TI "")])
    106  1.7  mrg 
    107  1.1  mrg ; The element type of the vector.
    108  1.1  mrg (define_mode_attr non_vec[(V1QI "QI") (V2QI "QI") (V4QI "QI") (V8QI "QI") (V16QI "QI")
    109  1.1  mrg 			  (V1HI "HI") (V2HI "HI") (V4HI "HI") (V8HI "HI")
    110  1.1  mrg 			  (V1SI "SI") (V2SI "SI") (V4SI "SI")
    111  1.1  mrg 			  (V1DI "DI") (V2DI "DI")
    112  1.3  mrg 			  (V1TI "TI") (TI "TI")
    113  1.1  mrg 			  (V1SF "SF") (V2SF "SF") (V4SF "SF")
    114  1.1  mrg 			  (V1DF "DF") (V2DF "DF")
    115  1.3  mrg 			  (V1TF "TF") (TF "TF")])
    116  1.1  mrg 
    117  1.4  mrg ; Like above, but in lower case.
    118  1.4  mrg (define_mode_attr non_vec_l[(V1QI "qi") (V2QI "qi") (V4QI "qi") (V8QI "qi")
    119  1.4  mrg 			    (V16QI "qi")
    120  1.4  mrg 			    (V1HI "hi") (V2HI "hi") (V4HI "hi") (V8HI "hi")
    121  1.4  mrg 			    (V1SI "si") (V2SI "si") (V4SI "si")
    122  1.4  mrg 			    (V1DI "di") (V2DI "di")
    123  1.4  mrg 			    (V1TI "ti") (TI "ti")
    124  1.4  mrg 			    (V1SF "sf") (V2SF "sf") (V4SF "sf")
    125  1.4  mrg 			    (V1DF "df") (V2DF "df")
    126  1.4  mrg 			    (V1TF "tf") (TF "tf")])
    127  1.4  mrg 
    128  1.3  mrg ; The instruction suffix for integer instructions and instructions
    129  1.3  mrg ; which do not care about whether it is floating point or integer.
    130  1.1  mrg (define_mode_attr bhfgq[(V1QI "b") (V2QI "b") (V4QI "b") (V8QI "b") (V16QI "b")
    131  1.1  mrg 			(V1HI "h") (V2HI "h") (V4HI "h") (V8HI "h")
    132  1.1  mrg 			(V1SI "f") (V2SI "f") (V4SI "f")
    133  1.1  mrg 			(V1DI "g") (V2DI "g")
    134  1.1  mrg 			(V1TI "q") (TI "q")
    135  1.1  mrg 			(V1SF "f") (V2SF "f") (V4SF "f")
    136  1.1  mrg 			(V1DF "g") (V2DF "g")
    137  1.7  mrg 			(V1TF "q") (TF "q")])
    138  1.1  mrg 
    139  1.1  mrg ; This is for vmalhw. It gets an 'w' attached to avoid confusion with
    140  1.1  mrg ; multiply and add logical high vmalh.
    141  1.1  mrg (define_mode_attr w [(V1QI "")  (V2QI "")  (V4QI "")  (V8QI "") (V16QI "")
    142  1.1  mrg 		     (V1HI "w") (V2HI "w") (V4HI "w") (V8HI "w")
    143  1.1  mrg 		     (V1SI "")  (V2SI "")  (V4SI "")
    144  1.1  mrg 		     (V1DI "")  (V2DI "")])
    145  1.1  mrg 
    146  1.1  mrg ; Resulting mode of a vector comparison.  For floating point modes an
    147  1.1  mrg ; integer vector mode with the same element size is picked.
    148  1.7  mrg (define_mode_attr TOINTVEC [(V1QI "V1QI") (V2QI "V2QI") (V4QI "V4QI") (V8QI "V8QI") (V16QI "V16QI")
    149  1.1  mrg 			    (V1HI "V1HI") (V2HI "V2HI") (V4HI "V4HI") (V8HI "V8HI")
    150  1.1  mrg 			    (V1SI "V1SI") (V2SI "V2SI") (V4SI "V4SI")
    151  1.1  mrg 			    (V1DI "V1DI") (V2DI "V2DI")
    152  1.1  mrg 			    (V1TI "V1TI")
    153  1.1  mrg 			    (V1SF "V1SI") (V2SF "V2SI") (V4SF "V4SI")
    154  1.1  mrg 			    (V1DF "V1DI") (V2DF "V2DI")
    155  1.7  mrg 			    (V1TF "V1TI") (TF "V1TI")])
    156  1.7  mrg 
    157  1.7  mrg (define_mode_attr tointvec [(V1QI "v1qi") (V2QI "v2qi") (V4QI "v4qi") (V8QI "v8qi") (V16QI "v16qi")
    158  1.7  mrg 			    (V1HI "v1hi") (V2HI "v2hi") (V4HI "v4hi") (V8HI "v8hi")
    159  1.7  mrg 			    (V1SI "v1si") (V2SI "v2si") (V4SI "v4si")
    160  1.7  mrg 			    (V1DI "v1di") (V2DI "v2di")
    161  1.7  mrg 			    (V1TI "v1ti")
    162  1.7  mrg 			    (V1SF "v1si") (V2SF "v2si") (V4SF "v4si")
    163  1.7  mrg 			    (V1DF "v1di") (V2DF "v2di")
    164  1.7  mrg 			    (V1TF "v1ti") (TF   "v1ti")])
    165  1.7  mrg 
    166  1.3  mrg (define_mode_attr vw [(SF "w") (V1SF "w") (V2SF "v") (V4SF "v")
    167  1.3  mrg 		      (DF "w") (V1DF "w") (V2DF "v")
    168  1.3  mrg 		      (TF "w") (V1TF "w")])
    169  1.3  mrg 
    170  1.3  mrg (define_mode_attr sdx [(SF "s") (V1SF "s") (V2SF "s") (V4SF "s")
    171  1.3  mrg 		       (DF "d") (V1DF "d") (V2DF "d")
    172  1.3  mrg 		       (TF "x") (V1TF "x")])
    173  1.1  mrg 
    174  1.7  mrg ; Vector with widened element size but half the number of elements.
    175  1.1  mrg (define_mode_attr vec_double [(V1QI "V1HI") (V2QI "V1HI") (V4QI "V2HI") (V8QI "V4HI") (V16QI "V8HI")
    176  1.1  mrg 			      (V1HI "V1SI") (V2HI "V1SI") (V4HI "V2SI") (V8HI "V4SI")
    177  1.1  mrg 			      (V1SI "V1DI") (V2SI "V1DI") (V4SI "V2DI")
    178  1.1  mrg 			      (V1DI "V1TI") (V2DI "V1TI")
    179  1.1  mrg 			      (V1SF "V1DF") (V2SF "V1DF") (V4SF "V2DF")])
    180  1.1  mrg 
    181  1.7  mrg ; Vector with shrinked element size but twice the number of elements.
    182  1.1  mrg (define_mode_attr vec_half [(V1HI "V2QI") (V2HI "V4QI") (V4HI "V8QI") (V8HI "V16QI")
    183  1.1  mrg 			    (V1SI "V2HI") (V2SI "V4HI") (V4SI "V8HI")
    184  1.1  mrg 			    (V1DI "V2SI") (V2DI "V4SI")
    185  1.1  mrg 			    (V1TI "V2DI")
    186  1.1  mrg 			    (V1DF "V2SF") (V2DF "V4SF")
    187  1.1  mrg 			    (V1TF "V1DF")])
    188  1.1  mrg 
    189  1.7  mrg ; Vector with twice the number of elements but same element size.
    190  1.7  mrg (define_mode_attr vec_2x_nelts [(V1QI "V2QI") (V2QI "V4QI") (V4QI "V8QI") (V8QI "V16QI") (V16QI "V32QI")
    191  1.7  mrg 				(V1HI "V2HI") (V2HI "V4HI") (V4HI "V8HI") (V8HI "V16HI")
    192  1.7  mrg 				(V1SI "V2SI") (V2SI "V4SI") (V4SI "V8SI")
    193  1.7  mrg 				(V1DI "V2DI") (V2DI "V4DI")
    194  1.7  mrg 				(V1SF "V2SF") (V2SF "V4SF") (V4SF "V8SF")
    195  1.7  mrg 				(V1DF "V2DF") (V2DF "V4DF")])
    196  1.7  mrg 
    197  1.7  mrg ; Vector with widened element size and the same number of elements.
    198  1.7  mrg (define_mode_attr vec_2x_wide [(V1QI "V1HI") (V2QI "V2HI") (V4QI "V4HI") (V8QI "V8HI") (V16QI "V16HI")
    199  1.7  mrg 			       (V1HI "V1SI") (V2HI "V2SI") (V4HI "V4SI") (V8HI "V8SI")
    200  1.7  mrg 			       (V1SI "V1DI") (V2SI "V2DI") (V4SI "V4DI")
    201  1.7  mrg 			       (V1DI "V1TI") (V2DI "V2TI")
    202  1.7  mrg 			       (V1SF "V1DF") (V2SF "V2DF") (V4SF "V4DF")
    203  1.7  mrg 			       (V1DF "V1TF") (V2DF "V2TF")])
    204  1.7  mrg 
    205  1.3  mrg ; Vector with half the element size AND half the number of elements.
    206  1.3  mrg (define_mode_attr vec_halfhalf
    207  1.3  mrg   [(V2HI "V2QI") (V4HI "V4QI") (V8HI "V8QI")
    208  1.3  mrg    (V2SI "V2HI") (V4SI "V4HI")
    209  1.3  mrg    (V2DI "V2SI")
    210  1.3  mrg    (V2DF "V2SF")])
    211  1.3  mrg 
    212  1.3  mrg (define_mode_attr vec_halfnumelts
    213  1.3  mrg   [(V4SF "V2SF") (V4SI "V2SI")])
    214  1.3  mrg 
    215  1.1  mrg 
    216  1.1  mrg 
    217  1.1  mrg ; Comparison operators on int and fp compares which are directly
    218  1.1  mrg ; supported by the HW.
    219  1.1  mrg (define_code_iterator VICMP_HW_OP [eq gt gtu])
    220  1.1  mrg ; For int insn_cmp_op can be used in the insn name as well as in the asm output.
    221  1.1  mrg (define_code_attr insn_cmp_op [(eq "eq") (gt "h") (gtu "hl") (ge "he")])
    222  1.1  mrg 
    223  1.1  mrg ; Flags for vector string instructions (vfae all 4, vfee only ZS and CS, vstrc all 4)
    224  1.1  mrg (define_constants
    225  1.1  mrg   [(VSTRING_FLAG_IN         8)   ; invert result
    226  1.1  mrg    (VSTRING_FLAG_RT         4)   ; result type
    227  1.1  mrg    (VSTRING_FLAG_ZS         2)   ; zero search
    228  1.1  mrg    (VSTRING_FLAG_CS         1)]) ; condition code set
    229  1.1  mrg 
    230  1.1  mrg (include "vx-builtins.md")
    231  1.1  mrg 
    232  1.1  mrg ; Full HW vector size moves
    233  1.3  mrg 
    234  1.3  mrg ; We don't use lm/stm for 128 bit moves since these are slower than
    235  1.3  mrg ; splitting it into separate moves.
    236  1.3  mrg 
    237  1.3  mrg ; FIXME: More constants are possible by enabling jxx, jyy constraints
    238  1.3  mrg ; for TImode (use double-int for the calculations)
    239  1.3  mrg 
    240  1.3  mrg ; vgmb, vgmh, vgmf, vgmg, vrepib, vrepih, vrepif, vrepig
    241  1.7  mrg (define_insn "mov<mode><tf_vr>"
    242  1.3  mrg   [(set (match_operand:V_128 0 "nonimmediate_operand" "=v,v,R,  v,  v,  v,  v,  v,v,*d,*d,?o")
    243  1.3  mrg 	(match_operand:V_128 1 "general_operand"      " v,R,v,j00,jm1,jyy,jxx,jKK,d, v,dT,*d"))]
    244  1.3  mrg   ""
    245  1.1  mrg   "@
    246  1.1  mrg    vlr\t%v0,%v1
    247  1.5  mrg    vl\t%v0,%1%A1
    248  1.5  mrg    vst\t%v1,%0%A0
    249  1.1  mrg    vzero\t%v0
    250  1.1  mrg    vone\t%v0
    251  1.1  mrg    vgbm\t%v0,%t1
    252  1.1  mrg    vgm<bhfgq>\t%v0,%s1,%e1
    253  1.1  mrg    vrepi<bhfgq>\t%v0,%h1
    254  1.1  mrg    vlvgp\t%v0,%1,%N1
    255  1.3  mrg    #
    256  1.3  mrg    #
    257  1.1  mrg    #"
    258  1.3  mrg   [(set_attr "cpu_facility" "vx,vx,vx,vx,vx,vx,vx,vx,vx,vx,*,*")
    259  1.3  mrg    (set_attr "op_type"      "VRR,VRX,VRX,VRI,VRI,VRI,VRI,VRI,VRR,*,*,*")])
    260  1.1  mrg 
    261  1.7  mrg (define_expand "movtf"
    262  1.7  mrg   [(match_operand:TF 0 "nonimmediate_operand" "")
    263  1.7  mrg    (match_operand:TF 1 "general_operand"      "")]
    264  1.7  mrg   ""
    265  1.7  mrg   { EXPAND_MOVTF(movtf); })
    266  1.7  mrg 
    267  1.3  mrg ; VR -> GPR, no instruction so split it into 64 element sets.
    268  1.1  mrg (define_split
    269  1.1  mrg   [(set (match_operand:V_128 0 "register_operand" "")
    270  1.1  mrg 	(match_operand:V_128 1 "register_operand" ""))]
    271  1.1  mrg   "TARGET_VX && GENERAL_REG_P (operands[0]) && VECTOR_REG_P (operands[1])"
    272  1.1  mrg   [(set (match_dup 2)
    273  1.1  mrg 	(unspec:DI [(subreg:V2DI (match_dup 1) 0)
    274  1.1  mrg 		    (const_int 0)] UNSPEC_VEC_EXTRACT))
    275  1.1  mrg    (set (match_dup 3)
    276  1.1  mrg 	(unspec:DI [(subreg:V2DI (match_dup 1) 0)
    277  1.1  mrg 		    (const_int 1)] UNSPEC_VEC_EXTRACT))]
    278  1.1  mrg {
    279  1.1  mrg   operands[2] = operand_subword (operands[0], 0, 0, <MODE>mode);
    280  1.1  mrg   operands[3] = operand_subword (operands[0], 1, 0, <MODE>mode);
    281  1.1  mrg })
    282  1.1  mrg 
    283  1.3  mrg ; Split the 128 bit GPR move into two word mode moves
    284  1.3  mrg ; s390_split_ok_p decides which part needs to be moved first.
    285  1.3  mrg 
    286  1.3  mrg (define_split
    287  1.3  mrg   [(set (match_operand:V_128 0 "nonimmediate_operand" "")
    288  1.3  mrg         (match_operand:V_128 1 "general_operand" ""))]
    289  1.3  mrg   "reload_completed
    290  1.3  mrg    && s390_split_ok_p (operands[0], operands[1], <MODE>mode, 0)"
    291  1.3  mrg   [(set (match_dup 2) (match_dup 4))
    292  1.3  mrg    (set (match_dup 3) (match_dup 5))]
    293  1.3  mrg {
    294  1.3  mrg   operands[2] = operand_subword (operands[0], 0, 0, <MODE>mode);
    295  1.3  mrg   operands[3] = operand_subword (operands[0], 1, 0, <MODE>mode);
    296  1.3  mrg   operands[4] = operand_subword (operands[1], 0, 0, <MODE>mode);
    297  1.3  mrg   operands[5] = operand_subword (operands[1], 1, 0, <MODE>mode);
    298  1.3  mrg })
    299  1.3  mrg 
    300  1.3  mrg (define_split
    301  1.3  mrg   [(set (match_operand:V_128 0 "nonimmediate_operand" "")
    302  1.3  mrg         (match_operand:V_128 1 "general_operand" ""))]
    303  1.3  mrg   "reload_completed
    304  1.3  mrg    && s390_split_ok_p (operands[0], operands[1], <MODE>mode, 1)"
    305  1.3  mrg   [(set (match_dup 2) (match_dup 4))
    306  1.3  mrg    (set (match_dup 3) (match_dup 5))]
    307  1.3  mrg {
    308  1.3  mrg   operands[2] = operand_subword (operands[0], 1, 0, <MODE>mode);
    309  1.3  mrg   operands[3] = operand_subword (operands[0], 0, 0, <MODE>mode);
    310  1.3  mrg   operands[4] = operand_subword (operands[1], 1, 0, <MODE>mode);
    311  1.3  mrg   operands[5] = operand_subword (operands[1], 0, 0, <MODE>mode);
    312  1.3  mrg })
    313  1.3  mrg 
    314  1.3  mrg ; This is the vector equivalent to the TImode splitter in s390.md.  It
    315  1.3  mrg ; is required if both target GPRs occur in the source address operand.
    316  1.3  mrg 
    317  1.3  mrg ; For non-s_operands at least one of the target GPRs does not conflict
    318  1.3  mrg ; with the address operand and one of the splitters above will take
    319  1.3  mrg ; over.
    320  1.3  mrg (define_split
    321  1.3  mrg   [(set (match_operand:V_128 0 "register_operand" "")
    322  1.3  mrg         (match_operand:V_128 1 "memory_operand" ""))]
    323  1.3  mrg   "TARGET_ZARCH && reload_completed
    324  1.3  mrg    && !VECTOR_REG_P (operands[0])
    325  1.3  mrg    && !s_operand (operands[1], VOIDmode)"
    326  1.3  mrg   [(set (match_dup 0) (match_dup 1))]
    327  1.3  mrg {
    328  1.3  mrg   rtx addr = operand_subword (operands[0], 1, 0, <MODE>mode);
    329  1.3  mrg   addr = gen_lowpart (Pmode, addr);
    330  1.3  mrg   s390_load_address (addr, XEXP (operands[1], 0));
    331  1.3  mrg   operands[1] = replace_equiv_address (operands[1], addr);
    332  1.3  mrg })
    333  1.3  mrg 
    334  1.1  mrg ; Moves for smaller vector modes.
    335  1.1  mrg 
    336  1.1  mrg ; In these patterns only the vlr, vone, and vzero instructions write
    337  1.1  mrg ; VR bytes outside the mode.  This should be ok since we disallow
    338  1.1  mrg ; formerly bigger modes being accessed with smaller modes via
    339  1.1  mrg ; subreg. Note: The vone, vzero instructions could easily be replaced
    340  1.1  mrg ; with vlei which would only access the bytes belonging to the mode.
    341  1.1  mrg ; However, this would probably be slower.
    342  1.1  mrg 
    343  1.1  mrg (define_insn "mov<mode>"
    344  1.4  mrg   [(set (match_operand:V_8 0 "nonimmediate_operand" "=v,v,d,v,R,  v,  v,  v,  v,d,  Q,  S,  Q,  S,  d,  d,d,R,T")
    345  1.4  mrg         (match_operand:V_8 1 "general_operand"      " v,d,v,R,v,j00,jm1,jyy,jxx,d,j00,j00,jm1,jm1,j00,jm1,T,d,d"))]
    346  1.4  mrg   "TARGET_VX"
    347  1.1  mrg   "@
    348  1.1  mrg    vlr\t%v0,%v1
    349  1.1  mrg    vlvgb\t%v0,%1,0
    350  1.1  mrg    vlgvb\t%0,%v1,0
    351  1.1  mrg    vleb\t%v0,%1,0
    352  1.1  mrg    vsteb\t%v1,%0,0
    353  1.1  mrg    vzero\t%v0
    354  1.1  mrg    vone\t%v0
    355  1.1  mrg    vgbm\t%v0,%t1
    356  1.1  mrg    vgm\t%v0,%s1,%e1
    357  1.1  mrg    lr\t%0,%1
    358  1.1  mrg    mvi\t%0,0
    359  1.1  mrg    mviy\t%0,0
    360  1.7  mrg    mvi\t%0,255
    361  1.7  mrg    mviy\t%0,255
    362  1.1  mrg    lhi\t%0,0
    363  1.1  mrg    lhi\t%0,-1
    364  1.4  mrg    llc\t%0,%1
    365  1.1  mrg    stc\t%1,%0
    366  1.1  mrg    stcy\t%1,%0"
    367  1.4  mrg   [(set_attr "op_type"      "VRR,VRS,VRS,VRX,VRX,VRI,VRI,VRI,VRI,RR,SI,SIY,SI,SIY,RI,RI,RXY,RX,RXY")])
    368  1.1  mrg 
    369  1.1  mrg (define_insn "mov<mode>"
    370  1.3  mrg   [(set (match_operand:V_16 0 "nonimmediate_operand" "=v,v,d,v,R,  v,  v,  v,  v,d,  Q,  Q,  d,  d,d,d,d,R,T,b")
    371  1.3  mrg         (match_operand:V_16 1 "general_operand"      " v,d,v,R,v,j00,jm1,jyy,jxx,d,j00,jm1,j00,jm1,R,T,b,d,d,d"))]
    372  1.1  mrg   ""
    373  1.1  mrg   "@
    374  1.1  mrg    vlr\t%v0,%v1
    375  1.1  mrg    vlvgh\t%v0,%1,0
    376  1.1  mrg    vlgvh\t%0,%v1,0
    377  1.1  mrg    vleh\t%v0,%1,0
    378  1.1  mrg    vsteh\t%v1,%0,0
    379  1.1  mrg    vzero\t%v0
    380  1.1  mrg    vone\t%v0
    381  1.1  mrg    vgbm\t%v0,%t1
    382  1.1  mrg    vgm\t%v0,%s1,%e1
    383  1.1  mrg    lr\t%0,%1
    384  1.1  mrg    mvhhi\t%0,0
    385  1.1  mrg    mvhhi\t%0,-1
    386  1.1  mrg    lhi\t%0,0
    387  1.1  mrg    lhi\t%0,-1
    388  1.1  mrg    lh\t%0,%1
    389  1.1  mrg    lhy\t%0,%1
    390  1.1  mrg    lhrl\t%0,%1
    391  1.1  mrg    sth\t%1,%0
    392  1.1  mrg    sthy\t%1,%0
    393  1.1  mrg    sthrl\t%1,%0"
    394  1.1  mrg   [(set_attr "op_type"      "VRR,VRS,VRS,VRX,VRX,VRI,VRI,VRI,VRI,RR,SIL,SIL,RI,RI,RX,RXY,RIL,RX,RXY,RIL")])
    395  1.1  mrg 
    396  1.1  mrg (define_insn "mov<mode>"
    397  1.3  mrg   [(set (match_operand:V_32 0 "nonimmediate_operand" "=f,f,f,R,T,v,v,d,v,R,  f,  v,  v,  v,  v,  Q,  Q,  d,  d,d,d,d,d,R,T,b")
    398  1.3  mrg 	(match_operand:V_32 1 "general_operand"      " f,R,T,f,f,v,d,v,R,v,j00,j00,jm1,jyy,jxx,j00,jm1,j00,jm1,b,d,R,T,d,d,d"))]
    399  1.1  mrg   "TARGET_VX"
    400  1.1  mrg   "@
    401  1.3  mrg    ldr\t%v0,%v1
    402  1.1  mrg    lde\t%0,%1
    403  1.1  mrg    ley\t%0,%1
    404  1.1  mrg    ste\t%1,%0
    405  1.1  mrg    stey\t%1,%0
    406  1.1  mrg    vlr\t%v0,%v1
    407  1.1  mrg    vlvgf\t%v0,%1,0
    408  1.1  mrg    vlgvf\t%0,%v1,0
    409  1.1  mrg    vlef\t%v0,%1,0
    410  1.1  mrg    vstef\t%1,%0,0
    411  1.1  mrg    lzer\t%v0
    412  1.1  mrg    vzero\t%v0
    413  1.1  mrg    vone\t%v0
    414  1.1  mrg    vgbm\t%v0,%t1
    415  1.1  mrg    vgm\t%v0,%s1,%e1
    416  1.1  mrg    mvhi\t%0,0
    417  1.1  mrg    mvhi\t%0,-1
    418  1.1  mrg    lhi\t%0,0
    419  1.1  mrg    lhi\t%0,-1
    420  1.1  mrg    lrl\t%0,%1
    421  1.1  mrg    lr\t%0,%1
    422  1.1  mrg    l\t%0,%1
    423  1.1  mrg    ly\t%0,%1
    424  1.1  mrg    st\t%1,%0
    425  1.1  mrg    sty\t%1,%0
    426  1.1  mrg    strl\t%1,%0"
    427  1.3  mrg   [(set_attr "op_type" "RR,RXE,RXY,RX,RXY,VRR,VRS,VRS,VRX,VRX,RRE,VRI,VRI,VRI,VRI,SIL,SIL,RI,RI,
    428  1.1  mrg                         RIL,RR,RX,RXY,RX,RXY,RIL")])
    429  1.1  mrg 
    430  1.1  mrg (define_insn "mov<mode>"
    431  1.1  mrg   [(set (match_operand:V_64 0 "nonimmediate_operand"
    432  1.3  mrg          "=f,f,f,R,T,v,v,d,v,R,  f,  v,  v,  v,  v,  Q,  Q,  d,  d,f,d,d,d,d,T,b")
    433  1.1  mrg         (match_operand:V_64 1 "general_operand"
    434  1.3  mrg          " f,R,T,f,f,v,d,v,R,v,j00,j00,jm1,jyy,jxx,j00,jm1,j00,jm1,d,f,b,d,T,d,d"))]
    435  1.1  mrg   "TARGET_ZARCH"
    436  1.1  mrg   "@
    437  1.1  mrg    ldr\t%0,%1
    438  1.1  mrg    ld\t%0,%1
    439  1.1  mrg    ldy\t%0,%1
    440  1.1  mrg    std\t%1,%0
    441  1.1  mrg    stdy\t%1,%0
    442  1.1  mrg    vlr\t%v0,%v1
    443  1.1  mrg    vlvgg\t%v0,%1,0
    444  1.1  mrg    vlgvg\t%0,%v1,0
    445  1.1  mrg    vleg\t%v0,%1,0
    446  1.1  mrg    vsteg\t%v1,%0,0
    447  1.1  mrg    lzdr\t%0
    448  1.1  mrg    vzero\t%v0
    449  1.1  mrg    vone\t%v0
    450  1.1  mrg    vgbm\t%v0,%t1
    451  1.1  mrg    vgm\t%v0,%s1,%e1
    452  1.1  mrg    mvghi\t%0,0
    453  1.1  mrg    mvghi\t%0,-1
    454  1.1  mrg    lghi\t%0,0
    455  1.1  mrg    lghi\t%0,-1
    456  1.1  mrg    ldgr\t%0,%1
    457  1.1  mrg    lgdr\t%0,%1
    458  1.1  mrg    lgrl\t%0,%1
    459  1.1  mrg    lgr\t%0,%1
    460  1.1  mrg    lg\t%0,%1
    461  1.1  mrg    stg\t%1,%0
    462  1.1  mrg    stgrl\t%1,%0"
    463  1.1  mrg   [(set_attr "op_type" "RRE,RX,RXY,RX,RXY,VRR,VRS,VRS,VRX,VRX,RRE,VRI,VRI,VRI,VRI,
    464  1.1  mrg                         SIL,SIL,RI,RI,RRE,RRE,RIL,RR,RXY,RXY,RIL")])
    465  1.1  mrg 
    466  1.1  mrg 
    467  1.1  mrg ; vec_load_lanes?
    468  1.1  mrg 
    469  1.1  mrg ; vec_store_lanes?
    470  1.1  mrg 
    471  1.3  mrg ; vec_set is supposed to *modify* an existing vector so operand 0 is
    472  1.3  mrg ; duplicated as input operand.
    473  1.3  mrg (define_expand "vec_set<mode>"
    474  1.3  mrg   [(set (match_operand:V                    0 "register_operand"  "")
    475  1.3  mrg 	(unspec:V [(match_operand:<non_vec> 1 "general_operand"   "")
    476  1.3  mrg 		   (match_operand:SI        2 "nonmemory_operand" "")
    477  1.3  mrg 		   (match_dup 0)]
    478  1.3  mrg 		   UNSPEC_VEC_SET))]
    479  1.3  mrg   "TARGET_VX")
    480  1.3  mrg 
    481  1.1  mrg ; FIXME: Support also vector mode operands for 1
    482  1.1  mrg ; FIXME: A target memory operand seems to be useful otherwise we end
    483  1.1  mrg ; up with vl vlvgg vst.  Shouldn't the middle-end be able to handle
    484  1.1  mrg ; that itself?
    485  1.3  mrg ; vlvgb, vlvgh, vlvgf, vlvgg, vleb, vleh, vlef, vleg, vleib, vleih, vleif, vleig
    486  1.1  mrg (define_insn "*vec_set<mode>"
    487  1.3  mrg   [(set (match_operand:V                    0 "register_operand"  "=v,v,v")
    488  1.3  mrg 	(unspec:V [(match_operand:<non_vec> 1 "general_operand"    "d,R,K")
    489  1.3  mrg 		   (match_operand:SI        2 "nonmemory_operand" "an,I,I")
    490  1.3  mrg 		   (match_operand:V         3 "register_operand"   "0,0,0")]
    491  1.1  mrg 		  UNSPEC_VEC_SET))]
    492  1.3  mrg   "TARGET_VX
    493  1.3  mrg    && (!CONST_INT_P (operands[2])
    494  1.3  mrg        || UINTVAL (operands[2]) < GET_MODE_NUNITS (<V:MODE>mode))"
    495  1.1  mrg   "@
    496  1.1  mrg    vlvg<bhfgq>\t%v0,%1,%Y2
    497  1.1  mrg    vle<bhfgq>\t%v0,%1,%2
    498  1.1  mrg    vlei<bhfgq>\t%v0,%1,%2"
    499  1.1  mrg   [(set_attr "op_type" "VRS,VRX,VRI")])
    500  1.1  mrg 
    501  1.3  mrg ; vlvgb, vlvgh, vlvgf, vlvgg
    502  1.3  mrg (define_insn "*vec_set<mode>_plus"
    503  1.3  mrg   [(set (match_operand:V                      0 "register_operand" "=v")
    504  1.3  mrg 	(unspec:V [(match_operand:<non_vec>   1 "general_operand"   "d")
    505  1.3  mrg 		   (plus:SI (match_operand:SI 2 "register_operand"  "a")
    506  1.3  mrg 			    (match_operand:SI 4 "const_int_operand" "n"))
    507  1.3  mrg 		   (match_operand:V           3 "register_operand"  "0")]
    508  1.3  mrg 		  UNSPEC_VEC_SET))]
    509  1.3  mrg   "TARGET_VX"
    510  1.3  mrg   "vlvg<bhfgq>\t%v0,%1,%Y4(%2)"
    511  1.3  mrg   [(set_attr "op_type" "VRS")])
    512  1.3  mrg 
    513  1.1  mrg 
    514  1.1  mrg ; FIXME: Support also vector mode operands for 0
    515  1.1  mrg ; FIXME: This should be (vec_select ..) or something but it does only allow constant selectors :(
    516  1.1  mrg ; This is used via RTL standard name as well as for expanding the builtin
    517  1.4  mrg (define_expand "vec_extract<mode><non_vec_l>"
    518  1.3  mrg   [(set (match_operand:<non_vec> 0 "nonimmediate_operand" "")
    519  1.3  mrg 	(unspec:<non_vec> [(match_operand:V  1 "register_operand" "")
    520  1.3  mrg 			   (match_operand:SI 2 "nonmemory_operand" "")]
    521  1.3  mrg 			  UNSPEC_VEC_EXTRACT))]
    522  1.3  mrg   "TARGET_VX")
    523  1.3  mrg 
    524  1.3  mrg ; vlgvb, vlgvh, vlgvf, vlgvg, vsteb, vsteh, vstef, vsteg
    525  1.3  mrg (define_insn "*vec_extract<mode>"
    526  1.3  mrg   [(set (match_operand:<non_vec> 0 "nonimmediate_operand"          "=d,R")
    527  1.3  mrg 	(unspec:<non_vec> [(match_operand:V  1 "register_operand"   "v,v")
    528  1.3  mrg 			   (match_operand:SI 2 "nonmemory_operand" "an,I")]
    529  1.1  mrg 			  UNSPEC_VEC_EXTRACT))]
    530  1.3  mrg   "TARGET_VX
    531  1.3  mrg    && (!CONST_INT_P (operands[2])
    532  1.3  mrg        || UINTVAL (operands[2]) < GET_MODE_NUNITS (<V:MODE>mode))"
    533  1.1  mrg   "@
    534  1.1  mrg    vlgv<bhfgq>\t%0,%v1,%Y2
    535  1.1  mrg    vste<bhfgq>\t%v1,%0,%2"
    536  1.1  mrg   [(set_attr "op_type" "VRS,VRX")])
    537  1.1  mrg 
    538  1.3  mrg ; vlgvb, vlgvh, vlgvf, vlgvg
    539  1.3  mrg (define_insn "*vec_extract<mode>_plus"
    540  1.3  mrg   [(set (match_operand:<non_vec>                      0 "nonimmediate_operand" "=d")
    541  1.3  mrg 	(unspec:<non_vec> [(match_operand:V           1 "register_operand"      "v")
    542  1.3  mrg 			   (plus:SI (match_operand:SI 2 "nonmemory_operand"     "a")
    543  1.3  mrg 				    (match_operand:SI 3 "const_int_operand"     "n"))]
    544  1.3  mrg 			   UNSPEC_VEC_EXTRACT))]
    545  1.3  mrg   "TARGET_VX"
    546  1.3  mrg   "vlgv<bhfgq>\t%0,%v1,%Y3(%2)"
    547  1.3  mrg   [(set_attr "op_type" "VRS")])
    548  1.3  mrg 
    549  1.4  mrg (define_expand "vec_init<mode><non_vec_l>"
    550  1.3  mrg   [(match_operand:V_128 0 "register_operand" "")
    551  1.3  mrg    (match_operand:V_128 1 "nonmemory_operand" "")]
    552  1.1  mrg   "TARGET_VX"
    553  1.1  mrg {
    554  1.1  mrg   s390_expand_vec_init (operands[0], operands[1]);
    555  1.1  mrg   DONE;
    556  1.1  mrg })
    557  1.1  mrg 
    558  1.3  mrg (define_insn "*vec_vllezlf<mode>"
    559  1.7  mrg   [(set (match_operand:V_HW_4              0 "register_operand" "=v")
    560  1.7  mrg 	(vec_concat:V_HW_4
    561  1.3  mrg 	 (vec_concat:<vec_halfnumelts>
    562  1.3  mrg 	  (match_operand:<non_vec> 1 "memory_operand"    "R")
    563  1.3  mrg 	  (const_int 0))
    564  1.3  mrg 	 (vec_concat:<vec_halfnumelts>
    565  1.3  mrg 	  (const_int 0)
    566  1.3  mrg 	  (const_int 0))))]
    567  1.3  mrg   "TARGET_VXE"
    568  1.3  mrg   "vllezlf\t%v0,%1"
    569  1.3  mrg   [(set_attr "op_type" "VRX")])
    570  1.3  mrg 
    571  1.1  mrg ; Replicate from vector element
    572  1.3  mrg ; vrepb, vreph, vrepf, vrepg
    573  1.1  mrg (define_insn "*vec_splat<mode>"
    574  1.3  mrg   [(set (match_operand:V_128_NOSINGLE   0 "register_operand" "=v")
    575  1.3  mrg 	(vec_duplicate:V_128_NOSINGLE
    576  1.1  mrg 	 (vec_select:<non_vec>
    577  1.3  mrg 	  (match_operand:V_128_NOSINGLE 1 "register_operand"  "v")
    578  1.1  mrg 	  (parallel
    579  1.1  mrg 	   [(match_operand:QI 2 "const_mask_operand" "C")]))))]
    580  1.3  mrg   "TARGET_VX && UINTVAL (operands[2]) < GET_MODE_NUNITS (<MODE>mode)"
    581  1.1  mrg   "vrep<bhfgq>\t%v0,%v1,%2"
    582  1.1  mrg   [(set_attr "op_type" "VRI")])
    583  1.1  mrg 
    584  1.3  mrg ; vlrepb, vlreph, vlrepf, vlrepg, vrepib, vrepih, vrepif, vrepig, vrepb, vreph, vrepf, vrepg
    585  1.1  mrg (define_insn "*vec_splats<mode>"
    586  1.3  mrg   [(set (match_operand:V_128_NOSINGLE                          0 "register_operand" "=v,v,v,v")
    587  1.3  mrg 	(vec_duplicate:V_128_NOSINGLE (match_operand:<non_vec> 1 "general_operand"  " R,K,v,d")))]
    588  1.1  mrg   "TARGET_VX"
    589  1.1  mrg   "@
    590  1.1  mrg    vlrep<bhfgq>\t%v0,%1
    591  1.1  mrg    vrepi<bhfgq>\t%v0,%h1
    592  1.1  mrg    vrep<bhfgq>\t%v0,%v1,0
    593  1.1  mrg    #"
    594  1.1  mrg   [(set_attr "op_type" "VRX,VRI,VRI,*")])
    595  1.1  mrg 
    596  1.5  mrg ; vlbrreph, vlbrrepf, vlbrrepg
    597  1.5  mrg (define_insn "*vec_splats_bswap_vec<mode>"
    598  1.5  mrg   [(set (match_operand:V_HW_HSD                           0 "register_operand"        "=v")
    599  1.5  mrg 	(bswap:V_HW_HSD
    600  1.5  mrg 	 (vec_duplicate:V_HW_HSD (match_operand:<non_vec> 1 "memory_operand"           "R"))))
    601  1.5  mrg    (use (match_operand:V16QI                              2 "permute_pattern_operand"  "X"))]
    602  1.5  mrg   "TARGET_VXE2"
    603  1.5  mrg   "vlbrrep<bhfgq>\t%v0,%1"
    604  1.5  mrg   [(set_attr "op_type" "VRX")])
    605  1.5  mrg 
    606  1.5  mrg ; Why do we need both? Shouldn't there be a canonical form?
    607  1.5  mrg ; vlbrreph, vlbrrepf, vlbrrepg
    608  1.5  mrg (define_insn "*vec_splats_bswap_elem<mode>"
    609  1.5  mrg   [(set (match_operand:V_HW_HSD                    0 "register_operand" "=v")
    610  1.5  mrg 	(vec_duplicate:V_HW_HSD
    611  1.5  mrg 	 (bswap:<non_vec> (match_operand:<non_vec> 1 "memory_operand"    "R"))))]
    612  1.5  mrg   "TARGET_VXE2"
    613  1.5  mrg   "vlbrrep<bhfgq>\t%v0,%1"
    614  1.5  mrg   [(set_attr "op_type" "VRX")])
    615  1.5  mrg 
    616  1.3  mrg ; A TFmode operand resides in FPR register pairs while V1TF is in a
    617  1.3  mrg ; single vector register.
    618  1.7  mrg (define_insn "*vec_tf_to_v1tf_fpr"
    619  1.7  mrg   [(set (match_operand:V1TF                   0 "nonimmediate_operand" "=v,v,R,v,v")
    620  1.7  mrg 	(vec_duplicate:V1TF (match_operand:TF 1 "general_operand"       "f,R,f,G,d")))]
    621  1.7  mrg   "TARGET_VX && !TARGET_VXE"
    622  1.7  mrg   "@
    623  1.7  mrg    vmrhg\t%v0,%1,%N1
    624  1.7  mrg    vl\t%v0,%1%A1
    625  1.7  mrg    vst\t%v1,%0%A0
    626  1.7  mrg    vzero\t%v0
    627  1.7  mrg    vlvgp\t%v0,%1,%N1"
    628  1.7  mrg   [(set_attr "op_type" "VRR,VRX,VRX,VRI,VRR")])
    629  1.7  mrg 
    630  1.7  mrg ; Both TFmode and V1TFmode operands reside in vector registers.
    631  1.7  mrg (define_insn "*vec_tf_to_v1tf_vr"
    632  1.3  mrg   [(set (match_operand:V1TF                   0 "nonimmediate_operand" "=v,v,R,v,v")
    633  1.3  mrg 	(vec_duplicate:V1TF (match_operand:TF 1 "general_operand"       "v,R,v,G,d")))]
    634  1.7  mrg   "TARGET_VXE"
    635  1.3  mrg   "@
    636  1.7  mrg    vlr\t%v0,%1
    637  1.5  mrg    vl\t%v0,%1%A1
    638  1.5  mrg    vst\t%v1,%0%A0
    639  1.3  mrg    vzero\t%v0
    640  1.3  mrg    vlvgp\t%v0,%1,%N1"
    641  1.3  mrg   [(set_attr "op_type" "VRR,VRX,VRX,VRI,VRR")])
    642  1.3  mrg 
    643  1.7  mrg (define_insn_and_split "fprx2_to_tf"
    644  1.7  mrg   [(set (match_operand:TF               0 "nonimmediate_operand" "=v,AR")
    645  1.7  mrg 	(subreg:TF (match_operand:FPRX2 1 "general_operand"       "f,f") 0))]
    646  1.7  mrg   "TARGET_VXE"
    647  1.7  mrg   "@
    648  1.7  mrg    vmrhg\t%v0,%1,%N1
    649  1.7  mrg    #"
    650  1.7  mrg   "!(MEM_P (operands[0]) && MEM_VOLATILE_P (operands[0]))"
    651  1.7  mrg   [(set (match_dup 2) (match_dup 3))
    652  1.7  mrg    (set (match_dup 4) (match_dup 5))]
    653  1.7  mrg {
    654  1.7  mrg   operands[2] = simplify_gen_subreg (DFmode, operands[0], TFmode, 0);
    655  1.7  mrg   operands[3] = simplify_gen_subreg (DFmode, operands[1], FPRX2mode, 0);
    656  1.7  mrg   operands[4] = simplify_gen_subreg (DFmode, operands[0], TFmode, 8);
    657  1.7  mrg   operands[5] = simplify_gen_subreg (DFmode, operands[1], FPRX2mode, 8);
    658  1.7  mrg }
    659  1.7  mrg   [(set_attr "op_type" "VRR,*")])
    660  1.7  mrg 
    661  1.3  mrg (define_insn "*vec_ti_to_v1ti"
    662  1.3  mrg   [(set (match_operand:V1TI                   0 "nonimmediate_operand" "=v,v,R,  v,  v,v")
    663  1.3  mrg 	(vec_duplicate:V1TI (match_operand:TI 1 "general_operand"       "v,R,v,j00,jm1,d")))]
    664  1.3  mrg   "TARGET_VX"
    665  1.3  mrg   "@
    666  1.3  mrg    vlr\t%v0,%v1
    667  1.5  mrg    vl\t%v0,%1%A1
    668  1.5  mrg    vst\t%v1,%0%A0
    669  1.3  mrg    vzero\t%v0
    670  1.3  mrg    vone\t%v0
    671  1.3  mrg    vlvgp\t%v0,%1,%N1"
    672  1.3  mrg   [(set_attr "op_type" "VRR,VRX,VRX,VRI,VRI,VRR")])
    673  1.3  mrg 
    674  1.1  mrg ; vec_splats is supposed to replicate op1 into all elements of op0
    675  1.1  mrg ; This splitter first sets the rightmost element of op0 to op1 and
    676  1.1  mrg ; then does a vec_splat to replicate that element into all other
    677  1.1  mrg ; elements.
    678  1.1  mrg (define_split
    679  1.3  mrg   [(set (match_operand:V_128_NOSINGLE                          0 "register_operand" "")
    680  1.3  mrg 	(vec_duplicate:V_128_NOSINGLE (match_operand:<non_vec> 1 "register_operand" "")))]
    681  1.1  mrg   "TARGET_VX && GENERAL_REG_P (operands[1])"
    682  1.1  mrg   [(set (match_dup 0)
    683  1.3  mrg 	(unspec:V_128_NOSINGLE [(match_dup 1) (match_dup 2) (match_dup 0)] UNSPEC_VEC_SET))
    684  1.1  mrg    (set (match_dup 0)
    685  1.3  mrg 	(vec_duplicate:V_128_NOSINGLE
    686  1.1  mrg 	 (vec_select:<non_vec>
    687  1.1  mrg 	  (match_dup 0) (parallel [(match_dup 2)]))))]
    688  1.1  mrg {
    689  1.1  mrg   operands[2] = GEN_INT (GET_MODE_NUNITS (<MODE>mode) - 1);
    690  1.1  mrg })
    691  1.1  mrg 
    692  1.6  mrg (define_predicate "vcond_comparison_operator"
    693  1.6  mrg   (match_operand 0 "comparison_operator")
    694  1.6  mrg {
    695  1.6  mrg   if (!HONOR_NANS (GET_MODE (XEXP (op, 0)))
    696  1.6  mrg       && !HONOR_NANS (GET_MODE (XEXP (op, 1))))
    697  1.6  mrg     return true;
    698  1.6  mrg   switch (GET_CODE (op))
    699  1.6  mrg     {
    700  1.6  mrg     case LE:
    701  1.6  mrg     case LT:
    702  1.6  mrg     case GE:
    703  1.6  mrg     case GT:
    704  1.6  mrg     case LTGT:
    705  1.6  mrg       /* Signaling vector comparisons are supported only on z14+.  */
    706  1.6  mrg       return TARGET_VXE || TARGET_NONSIGNALING_VECTOR_COMPARE_OK;
    707  1.6  mrg     default:
    708  1.6  mrg       return true;
    709  1.6  mrg     }
    710  1.6  mrg })
    711  1.6  mrg 
    712  1.1  mrg (define_expand "vcond<V_HW:mode><V_HW2:mode>"
    713  1.1  mrg   [(set (match_operand:V_HW 0 "register_operand" "")
    714  1.1  mrg 	(if_then_else:V_HW
    715  1.6  mrg 	 (match_operator 3 "vcond_comparison_operator"
    716  1.1  mrg 			 [(match_operand:V_HW2 4 "register_operand" "")
    717  1.3  mrg 			  (match_operand:V_HW2 5 "nonmemory_operand" "")])
    718  1.1  mrg 	 (match_operand:V_HW 1 "nonmemory_operand" "")
    719  1.1  mrg 	 (match_operand:V_HW 2 "nonmemory_operand" "")))]
    720  1.1  mrg   "TARGET_VX && GET_MODE_NUNITS (<V_HW:MODE>mode) == GET_MODE_NUNITS (<V_HW2:MODE>mode)"
    721  1.1  mrg {
    722  1.1  mrg   s390_expand_vcond (operands[0], operands[1], operands[2],
    723  1.1  mrg 		     GET_CODE (operands[3]), operands[4], operands[5]);
    724  1.1  mrg   DONE;
    725  1.1  mrg })
    726  1.1  mrg 
    727  1.1  mrg (define_expand "vcondu<V_HW:mode><V_HW2:mode>"
    728  1.1  mrg   [(set (match_operand:V_HW 0 "register_operand" "")
    729  1.1  mrg 	(if_then_else:V_HW
    730  1.1  mrg 	 (match_operator 3 "comparison_operator"
    731  1.1  mrg 			 [(match_operand:V_HW2 4 "register_operand" "")
    732  1.3  mrg 			  (match_operand:V_HW2 5 "nonmemory_operand" "")])
    733  1.1  mrg 	 (match_operand:V_HW 1 "nonmemory_operand" "")
    734  1.1  mrg 	 (match_operand:V_HW 2 "nonmemory_operand" "")))]
    735  1.1  mrg   "TARGET_VX && GET_MODE_NUNITS (<V_HW:MODE>mode) == GET_MODE_NUNITS (<V_HW2:MODE>mode)"
    736  1.1  mrg {
    737  1.1  mrg   s390_expand_vcond (operands[0], operands[1], operands[2],
    738  1.1  mrg 		     GET_CODE (operands[3]), operands[4], operands[5]);
    739  1.1  mrg   DONE;
    740  1.1  mrg })
    741  1.1  mrg 
    742  1.7  mrg (define_expand "vcond_mask_<mode><tointvec>"
    743  1.7  mrg   [(set (match_operand:V 0 "register_operand" "")
    744  1.7  mrg 	(if_then_else:V
    745  1.7  mrg 	 (eq (match_operand:<TOINTVEC> 3 "register_operand" "")
    746  1.7  mrg 	     (match_dup 4))
    747  1.7  mrg 	 (match_operand:V 2 "register_operand" "")
    748  1.7  mrg 	 (match_operand:V 1 "register_operand" "")))]
    749  1.7  mrg   "TARGET_VX"
    750  1.7  mrg   "operands[4] = CONST0_RTX (<TOINTVEC>mode);")
    751  1.7  mrg 
    752  1.7  mrg 
    753  1.1  mrg ; We only have HW support for byte vectors.  The middle-end is
    754  1.1  mrg ; supposed to lower the mode if required.
    755  1.1  mrg (define_insn "vec_permv16qi"
    756  1.1  mrg   [(set (match_operand:V16QI 0 "register_operand"               "=v")
    757  1.1  mrg 	(unspec:V16QI [(match_operand:V16QI 1 "register_operand" "v")
    758  1.1  mrg 		       (match_operand:V16QI 2 "register_operand" "v")
    759  1.1  mrg 		       (match_operand:V16QI 3 "register_operand" "v")]
    760  1.1  mrg 		      UNSPEC_VEC_PERM))]
    761  1.1  mrg   "TARGET_VX"
    762  1.1  mrg   "vperm\t%v0,%v1,%v2,%v3"
    763  1.1  mrg   [(set_attr "op_type" "VRR")])
    764  1.1  mrg 
    765  1.5  mrg (define_insn "*vec_perm<mode>"
    766  1.5  mrg   [(set (match_operand:VT_HW                                            0 "register_operand" "=v")
    767  1.5  mrg 	(subreg:VT_HW (unspec:V16QI [(subreg:V16QI (match_operand:VT_HW 1 "register_operand"  "v") 0)
    768  1.5  mrg 				     (subreg:V16QI (match_operand:VT_HW 2 "register_operand"  "v") 0)
    769  1.5  mrg 				     (match_operand:V16QI               3 "register_operand"  "v")]
    770  1.5  mrg 				    UNSPEC_VEC_PERM) 0))]
    771  1.5  mrg   "TARGET_VX"
    772  1.5  mrg   "vperm\t%v0,%v1,%v2,%v3"
    773  1.5  mrg   [(set_attr "op_type" "VRR")])
    774  1.5  mrg 
    775  1.5  mrg 
    776  1.7  mrg ; First DW of op1 and second DW of op2
    777  1.7  mrg (define_insn "@vpdi1<mode>"
    778  1.7  mrg   [(set (match_operand:V_HW_2   0 "register_operand" "=v")
    779  1.7  mrg 	(vec_select:V_HW_2
    780  1.7  mrg 	 (vec_concat:<vec_2x_nelts>
    781  1.7  mrg 	  (match_operand:V_HW_2 1 "register_operand"  "v")
    782  1.7  mrg 	  (match_operand:V_HW_2 2 "register_operand"  "v"))
    783  1.7  mrg 	 (parallel [(const_int 0) (const_int 3)])))]
    784  1.7  mrg   "TARGET_VX"
    785  1.7  mrg   "vpdi\t%v0,%v1,%v2,1"
    786  1.7  mrg   [(set_attr "op_type" "VRR")])
    787  1.7  mrg 
    788  1.7  mrg ; Second DW of op1 and first of op2
    789  1.7  mrg (define_insn "@vpdi4<mode>"
    790  1.7  mrg   [(set (match_operand:V_HW_2   0 "register_operand" "=v")
    791  1.7  mrg 	(vec_select:V_HW_2
    792  1.7  mrg 	 (vec_concat:<vec_2x_nelts>
    793  1.7  mrg 	  (match_operand:V_HW_2 1 "register_operand"  "v")
    794  1.7  mrg 	  (match_operand:V_HW_2 2 "register_operand"  "v"))
    795  1.7  mrg 	 (parallel [(const_int 1) (const_int 2)])))]
    796  1.7  mrg   "TARGET_VX"
    797  1.7  mrg   "vpdi\t%v0,%v1,%v2,4"
    798  1.7  mrg   [(set_attr "op_type" "VRR")])
    799  1.7  mrg 
    800  1.7  mrg 
    801  1.7  mrg (define_insn "*vmrhb"
    802  1.7  mrg   [(set (match_operand:V16QI                     0 "register_operand" "=v")
    803  1.7  mrg         (vec_select:V16QI
    804  1.7  mrg 	  (vec_concat:V32QI (match_operand:V16QI 1 "register_operand"  "v")
    805  1.7  mrg 			    (match_operand:V16QI 2 "register_operand"  "v"))
    806  1.7  mrg 	  (parallel [(const_int 0) (const_int 16)
    807  1.7  mrg 		     (const_int 1) (const_int 17)
    808  1.7  mrg 		     (const_int 2) (const_int 18)
    809  1.7  mrg 		     (const_int 3) (const_int 19)
    810  1.7  mrg 		     (const_int 4) (const_int 20)
    811  1.7  mrg 		     (const_int 5) (const_int 21)
    812  1.7  mrg 		     (const_int 6) (const_int 22)
    813  1.7  mrg 		     (const_int 7) (const_int 23)])))]
    814  1.7  mrg   "TARGET_VX"
    815  1.7  mrg   "vmrhb\t%0,%1,%2";
    816  1.7  mrg   [(set_attr "op_type" "VRR")])
    817  1.7  mrg 
    818  1.7  mrg (define_insn "*vmrlb"
    819  1.7  mrg   [(set (match_operand:V16QI                     0 "register_operand" "=v")
    820  1.7  mrg         (vec_select:V16QI
    821  1.7  mrg 	  (vec_concat:V32QI (match_operand:V16QI 1 "register_operand"  "v")
    822  1.7  mrg 			    (match_operand:V16QI 2 "register_operand"  "v"))
    823  1.7  mrg 	  (parallel [(const_int  8) (const_int 24)
    824  1.7  mrg 		     (const_int  9) (const_int 25)
    825  1.7  mrg 		     (const_int 10) (const_int 26)
    826  1.7  mrg 		     (const_int 11) (const_int 27)
    827  1.7  mrg 		     (const_int 12) (const_int 28)
    828  1.7  mrg 		     (const_int 13) (const_int 29)
    829  1.7  mrg 		     (const_int 14) (const_int 30)
    830  1.7  mrg 		     (const_int 15) (const_int 31)])))]
    831  1.7  mrg   "TARGET_VX"
    832  1.7  mrg   "vmrlb\t%0,%1,%2";
    833  1.7  mrg   [(set_attr "op_type" "VRR")])
    834  1.7  mrg 
    835  1.7  mrg (define_insn "*vmrhh"
    836  1.7  mrg   [(set (match_operand:V8HI                     0 "register_operand" "=v")
    837  1.7  mrg         (vec_select:V8HI
    838  1.7  mrg 	  (vec_concat:V16HI (match_operand:V8HI 1 "register_operand"  "v")
    839  1.7  mrg 			    (match_operand:V8HI 2 "register_operand"  "v"))
    840  1.7  mrg 	  (parallel [(const_int 0) (const_int 8)
    841  1.7  mrg 		     (const_int 1) (const_int 9)
    842  1.7  mrg 		     (const_int 2) (const_int 10)
    843  1.7  mrg 		     (const_int 3) (const_int 11)])))]
    844  1.7  mrg   "TARGET_VX"
    845  1.7  mrg   "vmrhh\t%0,%1,%2";
    846  1.7  mrg   [(set_attr "op_type" "VRR")])
    847  1.7  mrg 
    848  1.7  mrg (define_insn "*vmrlh"
    849  1.7  mrg   [(set (match_operand:V8HI                     0 "register_operand" "=v")
    850  1.7  mrg         (vec_select:V8HI
    851  1.7  mrg 	  (vec_concat:V16HI (match_operand:V8HI 1 "register_operand"  "v")
    852  1.7  mrg 			    (match_operand:V8HI 2 "register_operand"  "v"))
    853  1.7  mrg 	  (parallel [(const_int 4) (const_int 12)
    854  1.7  mrg 		     (const_int 5) (const_int 13)
    855  1.7  mrg 		     (const_int 6) (const_int 14)
    856  1.7  mrg 		     (const_int 7) (const_int 15)])))]
    857  1.7  mrg   "TARGET_VX"
    858  1.7  mrg   "vmrlh\t%0,%1,%2";
    859  1.7  mrg   [(set_attr "op_type" "VRR")])
    860  1.7  mrg 
    861  1.7  mrg (define_insn "*vmrhf"
    862  1.7  mrg   [(set (match_operand:V_HW_4                              0 "register_operand" "=v")
    863  1.7  mrg         (vec_select:V_HW_4
    864  1.7  mrg 	  (vec_concat:<vec_2x_nelts> (match_operand:V_HW_4 1 "register_operand"  "v")
    865  1.7  mrg 				     (match_operand:V_HW_4 2 "register_operand"  "v"))
    866  1.7  mrg 	  (parallel [(const_int 0) (const_int 4)
    867  1.7  mrg 		     (const_int 1) (const_int 5)])))]
    868  1.7  mrg   "TARGET_VX"
    869  1.7  mrg   "vmrhf\t%0,%1,%2";
    870  1.7  mrg   [(set_attr "op_type" "VRR")])
    871  1.7  mrg 
    872  1.7  mrg (define_insn "*vmrlf"
    873  1.7  mrg   [(set (match_operand:V_HW_4                              0 "register_operand" "=v")
    874  1.7  mrg         (vec_select:V_HW_4
    875  1.7  mrg 	  (vec_concat:<vec_2x_nelts> (match_operand:V_HW_4 1 "register_operand"  "v")
    876  1.7  mrg 				     (match_operand:V_HW_4 2 "register_operand"  "v"))
    877  1.7  mrg 	  (parallel [(const_int 2) (const_int 6)
    878  1.7  mrg 		     (const_int 3) (const_int 7)])))]
    879  1.7  mrg   "TARGET_VX"
    880  1.7  mrg   "vmrlf\t%0,%1,%2";
    881  1.7  mrg   [(set_attr "op_type" "VRR")])
    882  1.7  mrg 
    883  1.7  mrg (define_insn "*vmrhg"
    884  1.7  mrg   [(set (match_operand:V_HW_2                              0 "register_operand" "=v")
    885  1.7  mrg         (vec_select:V_HW_2
    886  1.7  mrg 	  (vec_concat:<vec_2x_nelts> (match_operand:V_HW_2 1 "register_operand"  "v")
    887  1.7  mrg 				     (match_operand:V_HW_2 2 "register_operand"  "v"))
    888  1.7  mrg 	  (parallel [(const_int 0) (const_int 2)])))]
    889  1.7  mrg   "TARGET_VX"
    890  1.7  mrg   "vmrhg\t%0,%1,%2";
    891  1.7  mrg   [(set_attr "op_type" "VRR")])
    892  1.7  mrg 
    893  1.7  mrg (define_insn "*vmrlg"
    894  1.7  mrg   [(set (match_operand:V_HW_2                              0 "register_operand" "=v")
    895  1.7  mrg         (vec_select:V_HW_2
    896  1.7  mrg 	  (vec_concat:<vec_2x_nelts> (match_operand:V_HW_2 1 "register_operand"  "v")
    897  1.7  mrg 				     (match_operand:V_HW_2 2 "register_operand"  "v"))
    898  1.7  mrg 	  (parallel [(const_int 1) (const_int 3)])))]
    899  1.7  mrg   "TARGET_VX"
    900  1.7  mrg   "vmrlg\t%0,%1,%2";
    901  1.7  mrg   [(set_attr "op_type" "VRR")])
    902  1.7  mrg 
    903  1.7  mrg (define_insn "tf_to_fprx2"
    904  1.7  mrg   [(set (match_operand:FPRX2             0 "register_operand" "=f,f ,f")
    905  1.7  mrg 	(unspec:FPRX2 [(match_operand:TF 1 "general_operand"   "v,AR,AT")]
    906  1.7  mrg 		      UNSPEC_TF_TO_FPRX2))]
    907  1.7  mrg   "TARGET_VXE"
    908  1.7  mrg {
    909  1.7  mrg   char buf[64];
    910  1.7  mrg   const char *reg_pair = reg_names[REGNO (operands[0]) + 1];
    911  1.7  mrg   switch (which_alternative)
    912  1.7  mrg     {
    913  1.7  mrg     case 0:
    914  1.7  mrg       if (REGNO (operands[0]) == REGNO (operands[1]))
    915  1.7  mrg 	{
    916  1.7  mrg 	  reg_pair += 2;  // get rid of prefix %f
    917  1.7  mrg 	  snprintf (buf, sizeof (buf), "vpdi\t%%%%v%s,%%v1,%%%%v%s,5", reg_pair, reg_pair);
    918  1.7  mrg 	  output_asm_insn (buf, operands);
    919  1.7  mrg 	  return "";
    920  1.7  mrg 	}
    921  1.7  mrg       else
    922  1.7  mrg 	{
    923  1.7  mrg 	  reg_pair += 2;  // get rid of prefix %f
    924  1.7  mrg 	  snprintf (buf, sizeof (buf), "vlr\t%%v0,%%v1;vpdi\t%%%%v%s,%%v1,%%%%v%s,5", reg_pair, reg_pair);
    925  1.7  mrg 	  output_asm_insn (buf, operands);
    926  1.7  mrg 	  return "";
    927  1.7  mrg 	}
    928  1.7  mrg     case 1:
    929  1.7  mrg       {
    930  1.7  mrg 	snprintf (buf, sizeof (buf), "ld\t%%f0,%%1;ld\t%%%s,8+%%1", reg_pair);
    931  1.7  mrg 	output_asm_insn (buf, operands);
    932  1.7  mrg 	return "";
    933  1.7  mrg       }
    934  1.7  mrg     case 2:
    935  1.7  mrg       {
    936  1.7  mrg 	snprintf (buf, sizeof (buf), "ldy\t%%f0,%%1;ldy\t%%%s,8+%%1", reg_pair);
    937  1.7  mrg 	output_asm_insn (buf, operands);
    938  1.7  mrg 	return "";
    939  1.7  mrg       }
    940  1.7  mrg     default: gcc_unreachable ();
    941  1.7  mrg     }
    942  1.7  mrg })
    943  1.7  mrg 
    944  1.1  mrg 
    945  1.1  mrg ;;
    946  1.1  mrg ;; Vector integer arithmetic instructions
    947  1.1  mrg ;;
    948  1.1  mrg 
    949  1.1  mrg ; vab, vah, vaf, vag, vaq
    950  1.1  mrg 
    951  1.1  mrg ; We use nonimmediate_operand instead of register_operand since it is
    952  1.1  mrg ; better to have the reloads into VRs instead of splitting the
    953  1.1  mrg ; operation into two DImode ADDs.
    954  1.1  mrg (define_insn "<ti*>add<mode>3"
    955  1.1  mrg   [(set (match_operand:VIT           0 "nonimmediate_operand" "=v")
    956  1.6  mrg 	(plus:VIT (match_operand:VIT 1 "nonimmediate_operand"  "v")
    957  1.1  mrg 		  (match_operand:VIT 2 "general_operand"       "v")))]
    958  1.1  mrg   "TARGET_VX"
    959  1.1  mrg   "va<bhfgq>\t%v0,%v1,%v2"
    960  1.1  mrg   [(set_attr "op_type" "VRR")])
    961  1.1  mrg 
    962  1.1  mrg ; vsb, vsh, vsf, vsg, vsq
    963  1.1  mrg (define_insn "<ti*>sub<mode>3"
    964  1.1  mrg   [(set (match_operand:VIT            0 "nonimmediate_operand" "=v")
    965  1.1  mrg 	(minus:VIT (match_operand:VIT 1 "nonimmediate_operand"  "v")
    966  1.6  mrg 		   (match_operand:VIT 2 "general_operand"       "v")))]
    967  1.1  mrg   "TARGET_VX"
    968  1.1  mrg   "vs<bhfgq>\t%v0,%v1,%v2"
    969  1.1  mrg   [(set_attr "op_type" "VRR")])
    970  1.1  mrg 
    971  1.1  mrg ; vmlb, vmlhw, vmlf
    972  1.1  mrg (define_insn "mul<mode>3"
    973  1.1  mrg   [(set (match_operand:VI_QHS              0 "register_operand" "=v")
    974  1.6  mrg 	(mult:VI_QHS (match_operand:VI_QHS 1 "register_operand"  "v")
    975  1.1  mrg 		     (match_operand:VI_QHS 2 "register_operand"  "v")))]
    976  1.1  mrg   "TARGET_VX"
    977  1.1  mrg   "vml<bhfgq><w>\t%v0,%v1,%v2"
    978  1.1  mrg   [(set_attr "op_type" "VRR")])
    979  1.1  mrg 
    980  1.1  mrg ; vlcb, vlch, vlcf, vlcg
    981  1.1  mrg (define_insn "neg<mode>2"
    982  1.1  mrg   [(set (match_operand:VI         0 "register_operand" "=v")
    983  1.1  mrg 	(neg:VI (match_operand:VI 1 "register_operand"  "v")))]
    984  1.1  mrg   "TARGET_VX"
    985  1.1  mrg   "vlc<bhfgq>\t%v0,%v1"
    986  1.1  mrg   [(set_attr "op_type" "VRR")])
    987  1.1  mrg 
    988  1.1  mrg ; vlpb, vlph, vlpf, vlpg
    989  1.1  mrg (define_insn "abs<mode>2"
    990  1.1  mrg   [(set (match_operand:VI         0 "register_operand" "=v")
    991  1.1  mrg 	(abs:VI (match_operand:VI 1 "register_operand"  "v")))]
    992  1.1  mrg   "TARGET_VX"
    993  1.1  mrg   "vlp<bhfgq>\t%v0,%v1"
    994  1.1  mrg   [(set_attr "op_type" "VRR")])
    995  1.1  mrg 
    996  1.1  mrg 
    997  1.1  mrg ; Vector sum across
    998  1.1  mrg 
    999  1.1  mrg ; Sum across DImode parts of the 1st operand and add the rightmost
   1000  1.1  mrg ; element of 2nd operand
   1001  1.1  mrg ; vsumgh, vsumgf
   1002  1.1  mrg (define_insn "*vec_sum2<mode>"
   1003  1.1  mrg   [(set (match_operand:V2DI 0 "register_operand" "=v")
   1004  1.1  mrg 	(unspec:V2DI [(match_operand:VI_HW_HS 1 "register_operand" "v")
   1005  1.1  mrg 		      (match_operand:VI_HW_HS 2 "register_operand" "v")]
   1006  1.1  mrg 		     UNSPEC_VEC_VSUMG))]
   1007  1.1  mrg   "TARGET_VX"
   1008  1.1  mrg   "vsumg<bhfgq>\t%v0,%v1,%v2"
   1009  1.1  mrg   [(set_attr "op_type" "VRR")])
   1010  1.1  mrg 
   1011  1.1  mrg ; vsumb, vsumh
   1012  1.1  mrg (define_insn "*vec_sum4<mode>"
   1013  1.1  mrg   [(set (match_operand:V4SI 0 "register_operand" "=v")
   1014  1.1  mrg 	(unspec:V4SI [(match_operand:VI_HW_QH 1 "register_operand" "v")
   1015  1.1  mrg 		      (match_operand:VI_HW_QH 2 "register_operand" "v")]
   1016  1.1  mrg 		     UNSPEC_VEC_VSUM))]
   1017  1.1  mrg   "TARGET_VX"
   1018  1.1  mrg   "vsum<bhfgq>\t%v0,%v1,%v2"
   1019  1.1  mrg   [(set_attr "op_type" "VRR")])
   1020  1.1  mrg 
   1021  1.1  mrg ;;
   1022  1.1  mrg ;; Vector bit instructions (int + fp)
   1023  1.1  mrg ;;
   1024  1.1  mrg 
   1025  1.1  mrg ; Vector and
   1026  1.1  mrg 
   1027  1.1  mrg (define_insn "and<mode>3"
   1028  1.1  mrg   [(set (match_operand:VT         0 "register_operand" "=v")
   1029  1.6  mrg 	(and:VT (match_operand:VT 1 "register_operand"  "v")
   1030  1.1  mrg 		(match_operand:VT 2 "register_operand"  "v")))]
   1031  1.1  mrg   "TARGET_VX"
   1032  1.1  mrg   "vn\t%v0,%v1,%v2"
   1033  1.1  mrg   [(set_attr "op_type" "VRR")])
   1034  1.1  mrg 
   1035  1.3  mrg ; Vector not and
   1036  1.3  mrg 
   1037  1.3  mrg (define_insn "notand<mode>3"
   1038  1.3  mrg   [(set (match_operand:VT                 0 "register_operand" "=v")
   1039  1.6  mrg 	(ior:VT (not:VT (match_operand:VT 1 "register_operand"  "v"))
   1040  1.3  mrg 		(not:VT	(match_operand:VT 2 "register_operand"  "v"))))]
   1041  1.3  mrg   "TARGET_VXE"
   1042  1.3  mrg   "vnn\t%v0,%v1,%v2"
   1043  1.3  mrg   [(set_attr "op_type" "VRR")])
   1044  1.1  mrg 
   1045  1.1  mrg ; Vector or
   1046  1.1  mrg 
   1047  1.1  mrg (define_insn "ior<mode>3"
   1048  1.1  mrg   [(set (match_operand:VT         0 "register_operand" "=v")
   1049  1.6  mrg 	(ior:VT (match_operand:VT 1 "register_operand"  "v")
   1050  1.1  mrg 		(match_operand:VT 2 "register_operand"  "v")))]
   1051  1.1  mrg   "TARGET_VX"
   1052  1.1  mrg   "vo\t%v0,%v1,%v2"
   1053  1.1  mrg   [(set_attr "op_type" "VRR")])
   1054  1.1  mrg 
   1055  1.3  mrg ; Vector or with complement
   1056  1.3  mrg 
   1057  1.3  mrg (define_insn "ior_not<mode>3"
   1058  1.3  mrg   [(set (match_operand:VT                 0 "register_operand" "=v")
   1059  1.3  mrg 	(ior:VT (not:VT (match_operand:VT 2 "register_operand"  "v"))
   1060  1.6  mrg 		(match_operand:VT         1 "register_operand"  "v")))]
   1061  1.3  mrg   "TARGET_VXE"
   1062  1.3  mrg   "voc\t%v0,%v1,%v2"
   1063  1.3  mrg   [(set_attr "op_type" "VRR")])
   1064  1.1  mrg 
   1065  1.1  mrg ; Vector xor
   1066  1.1  mrg 
   1067  1.1  mrg (define_insn "xor<mode>3"
   1068  1.1  mrg   [(set (match_operand:VT         0 "register_operand" "=v")
   1069  1.6  mrg 	(xor:VT (match_operand:VT 1 "register_operand"  "v")
   1070  1.1  mrg 		(match_operand:VT 2 "register_operand"  "v")))]
   1071  1.1  mrg   "TARGET_VX"
   1072  1.1  mrg   "vx\t%v0,%v1,%v2"
   1073  1.1  mrg   [(set_attr "op_type" "VRR")])
   1074  1.1  mrg 
   1075  1.3  mrg ; Vector not xor
   1076  1.3  mrg 
   1077  1.3  mrg (define_insn "notxor<mode>3"
   1078  1.3  mrg   [(set (match_operand:VT                 0 "register_operand" "=v")
   1079  1.6  mrg 	(not:VT (xor:VT (match_operand:VT 1 "register_operand"  "v")
   1080  1.3  mrg 			(match_operand:VT 2 "register_operand"  "v"))))]
   1081  1.3  mrg   "TARGET_VXE"
   1082  1.3  mrg   "vnx\t%v0,%v1,%v2"
   1083  1.3  mrg   [(set_attr "op_type" "VRR")])
   1084  1.1  mrg 
   1085  1.3  mrg ; Bitwise inversion of a vector
   1086  1.3  mrg (define_insn "one_cmpl<mode>2"
   1087  1.1  mrg   [(set (match_operand:VT         0 "register_operand" "=v")
   1088  1.1  mrg 	(not:VT (match_operand:VT 1 "register_operand"  "v")))]
   1089  1.1  mrg   "TARGET_VX"
   1090  1.1  mrg   "vnot\t%v0,%v1"
   1091  1.1  mrg   [(set_attr "op_type" "VRR")])
   1092  1.1  mrg 
   1093  1.1  mrg ; Vector population count
   1094  1.1  mrg 
   1095  1.3  mrg (define_expand "popcount<mode>2"
   1096  1.3  mrg   [(set (match_operand:VI_HW                0 "register_operand" "=v")
   1097  1.3  mrg 	(unspec:VI_HW [(match_operand:VI_HW 1 "register_operand"  "v")]
   1098  1.3  mrg 		      UNSPEC_POPCNT))]
   1099  1.3  mrg   "TARGET_VX"
   1100  1.3  mrg {
   1101  1.3  mrg   if (TARGET_VXE)
   1102  1.3  mrg     emit_insn (gen_popcount<mode>2_vxe (operands[0], operands[1]));
   1103  1.3  mrg   else
   1104  1.3  mrg     emit_insn (gen_popcount<mode>2_vx (operands[0], operands[1]));
   1105  1.3  mrg   DONE;
   1106  1.3  mrg })
   1107  1.3  mrg 
   1108  1.3  mrg ; vpopctb, vpopcth, vpopctf, vpopctg
   1109  1.3  mrg (define_insn "popcount<mode>2_vxe"
   1110  1.3  mrg   [(set (match_operand:VI_HW                0 "register_operand" "=v")
   1111  1.3  mrg 	(unspec:VI_HW [(match_operand:VI_HW 1 "register_operand"  "v")]
   1112  1.3  mrg 		      UNSPEC_POPCNT))]
   1113  1.3  mrg   "TARGET_VXE"
   1114  1.3  mrg   "vpopct<bhfgq>\t%v0,%v1"
   1115  1.3  mrg   [(set_attr "op_type" "VRR")])
   1116  1.3  mrg 
   1117  1.3  mrg (define_insn "popcountv16qi2_vx"
   1118  1.1  mrg   [(set (match_operand:V16QI                0 "register_operand" "=v")
   1119  1.1  mrg 	(unspec:V16QI [(match_operand:V16QI 1 "register_operand"  "v")]
   1120  1.1  mrg 		      UNSPEC_POPCNT))]
   1121  1.3  mrg   "TARGET_VX && !TARGET_VXE"
   1122  1.1  mrg   "vpopct\t%v0,%v1,0"
   1123  1.1  mrg   [(set_attr "op_type" "VRR")])
   1124  1.1  mrg 
   1125  1.1  mrg ; vpopct only counts bits in byte elements.  Bigger element sizes need
   1126  1.1  mrg ; to be emulated.  Word and doubleword elements can use the sum across
   1127  1.1  mrg ; instructions.  For halfword sized elements we do a shift of a copy
   1128  1.1  mrg ; of the result, add it to the result and extend it to halfword
   1129  1.1  mrg ; element size (unpack).
   1130  1.1  mrg 
   1131  1.3  mrg (define_expand "popcountv8hi2_vx"
   1132  1.1  mrg   [(set (match_dup 2)
   1133  1.6  mrg 	(unspec:V16QI [(match_operand:V8HI 1 "register_operand" "v")]
   1134  1.1  mrg 		      UNSPEC_POPCNT))
   1135  1.1  mrg    ; Make a copy of the result
   1136  1.1  mrg    (set (match_dup 3) (match_dup 2))
   1137  1.1  mrg    ; Generate the shift count operand in a VR (8->byte 7)
   1138  1.1  mrg    (set (match_dup 4) (match_dup 5))
   1139  1.1  mrg    (set (match_dup 4) (unspec:V16QI [(const_int 8)
   1140  1.1  mrg 				     (const_int 7)
   1141  1.1  mrg 				     (match_dup 4)] UNSPEC_VEC_SET))
   1142  1.1  mrg    ; Vector shift right logical by one byte
   1143  1.1  mrg    (set (match_dup 3)
   1144  1.1  mrg 	(unspec:V16QI [(match_dup 3) (match_dup 4)] UNSPEC_VEC_SRLB))
   1145  1.1  mrg    ; Add the shifted and the original result
   1146  1.1  mrg    (set (match_dup 2)
   1147  1.1  mrg 	(plus:V16QI (match_dup 2) (match_dup 3)))
   1148  1.1  mrg    ; Generate mask for the odd numbered byte elements
   1149  1.1  mrg    (set (match_dup 3)
   1150  1.1  mrg 	(const_vector:V16QI [(const_int 0) (const_int 255)
   1151  1.1  mrg 			     (const_int 0) (const_int 255)
   1152  1.1  mrg 			     (const_int 0) (const_int 255)
   1153  1.1  mrg 			     (const_int 0) (const_int 255)
   1154  1.1  mrg 			     (const_int 0) (const_int 255)
   1155  1.1  mrg 			     (const_int 0) (const_int 255)
   1156  1.1  mrg 			     (const_int 0) (const_int 255)
   1157  1.1  mrg 			     (const_int 0) (const_int 255)]))
   1158  1.1  mrg    ; Zero out the even indexed bytes
   1159  1.1  mrg    (set (match_operand:V8HI 0 "register_operand" "=v")
   1160  1.1  mrg 	(and:V8HI (subreg:V8HI (match_dup 2) 0)
   1161  1.1  mrg 		  (subreg:V8HI (match_dup 3) 0)))
   1162  1.1  mrg ]
   1163  1.3  mrg   "TARGET_VX && !TARGET_VXE"
   1164  1.1  mrg {
   1165  1.6  mrg   operands[1] = simplify_gen_subreg (V16QImode, operands[1],
   1166  1.6  mrg 				     V8HImode, 0);
   1167  1.1  mrg   operands[2] = gen_reg_rtx (V16QImode);
   1168  1.1  mrg   operands[3] = gen_reg_rtx (V16QImode);
   1169  1.1  mrg   operands[4] = gen_reg_rtx (V16QImode);
   1170  1.1  mrg   operands[5] = CONST0_RTX (V16QImode);
   1171  1.1  mrg })
   1172  1.1  mrg 
   1173  1.3  mrg (define_expand "popcountv4si2_vx"
   1174  1.1  mrg   [(set (match_dup 2)
   1175  1.6  mrg 	(unspec:V16QI [(match_operand:V4SI 1 "register_operand" "v")]
   1176  1.1  mrg 		      UNSPEC_POPCNT))
   1177  1.1  mrg    (set (match_operand:V4SI 0 "register_operand" "=v")
   1178  1.1  mrg 	(unspec:V4SI [(match_dup 2) (match_dup 3)]
   1179  1.1  mrg 		     UNSPEC_VEC_VSUM))]
   1180  1.3  mrg   "TARGET_VX && !TARGET_VXE"
   1181  1.1  mrg {
   1182  1.6  mrg   operands[1] = simplify_gen_subreg (V16QImode, operands[1], V4SImode, 0);
   1183  1.1  mrg   operands[2] = gen_reg_rtx (V16QImode);
   1184  1.1  mrg   operands[3] = force_reg (V16QImode, CONST0_RTX (V16QImode));
   1185  1.1  mrg })
   1186  1.1  mrg 
   1187  1.3  mrg (define_expand "popcountv2di2_vx"
   1188  1.1  mrg   [(set (match_dup 2)
   1189  1.6  mrg 	(unspec:V16QI [(match_operand:V2DI 1 "register_operand" "v")]
   1190  1.1  mrg 		      UNSPEC_POPCNT))
   1191  1.1  mrg    (set (match_dup 3)
   1192  1.1  mrg 	(unspec:V4SI [(match_dup 2) (match_dup 4)]
   1193  1.1  mrg 		     UNSPEC_VEC_VSUM))
   1194  1.1  mrg    (set (match_operand:V2DI 0 "register_operand" "=v")
   1195  1.1  mrg 	(unspec:V2DI [(match_dup 3) (match_dup 5)]
   1196  1.1  mrg 		     UNSPEC_VEC_VSUMG))]
   1197  1.3  mrg   "TARGET_VX && !TARGET_VXE"
   1198  1.1  mrg {
   1199  1.6  mrg   operands[1] = simplify_gen_subreg (V16QImode, operands[1], V2DImode, 0);
   1200  1.1  mrg   operands[2] = gen_reg_rtx (V16QImode);
   1201  1.1  mrg   operands[3] = gen_reg_rtx (V4SImode);
   1202  1.1  mrg   operands[4] = force_reg (V16QImode, CONST0_RTX (V16QImode));
   1203  1.1  mrg   operands[5] = force_reg (V4SImode, CONST0_RTX (V4SImode));
   1204  1.1  mrg })
   1205  1.1  mrg 
   1206  1.1  mrg ; Count leading zeros
   1207  1.3  mrg ; vclzb, vclzh, vclzf, vclzg
   1208  1.1  mrg (define_insn "clz<mode>2"
   1209  1.1  mrg   [(set (match_operand:V        0 "register_operand" "=v")
   1210  1.1  mrg 	(clz:V (match_operand:V 1 "register_operand"  "v")))]
   1211  1.1  mrg   "TARGET_VX"
   1212  1.1  mrg   "vclz<bhfgq>\t%v0,%v1"
   1213  1.1  mrg   [(set_attr "op_type" "VRR")])
   1214  1.1  mrg 
   1215  1.1  mrg ; Count trailing zeros
   1216  1.3  mrg ; vctzb, vctzh, vctzf, vctzg
   1217  1.1  mrg (define_insn "ctz<mode>2"
   1218  1.1  mrg   [(set (match_operand:V        0 "register_operand" "=v")
   1219  1.1  mrg 	(ctz:V (match_operand:V 1 "register_operand"  "v")))]
   1220  1.1  mrg   "TARGET_VX"
   1221  1.1  mrg   "vctz<bhfgq>\t%v0,%v1"
   1222  1.1  mrg   [(set_attr "op_type" "VRR")])
   1223  1.1  mrg 
   1224  1.1  mrg 
   1225  1.1  mrg 
   1226  1.1  mrg ; Each vector element rotated by the corresponding vector element
   1227  1.1  mrg ; verllvb, verllvh, verllvf, verllvg
   1228  1.1  mrg (define_insn "vrotl<mode>3"
   1229  1.1  mrg   [(set (match_operand:VI            0 "register_operand" "=v")
   1230  1.1  mrg 	(rotate:VI (match_operand:VI 1 "register_operand"  "v")
   1231  1.1  mrg 		   (match_operand:VI 2 "register_operand"  "v")))]
   1232  1.1  mrg   "TARGET_VX"
   1233  1.1  mrg   "verllv<bhfgq>\t%v0,%v1,%v2"
   1234  1.1  mrg   [(set_attr "op_type" "VRR")])
   1235  1.1  mrg 
   1236  1.1  mrg 
   1237  1.3  mrg ; Vector rotate and shift by scalar instructions
   1238  1.3  mrg 
   1239  1.3  mrg (define_code_iterator VEC_SHIFTS [ashift ashiftrt lshiftrt rotate])
   1240  1.3  mrg (define_code_attr vec_shifts_name [(ashift "ashl")    (ashiftrt "ashr")
   1241  1.3  mrg 				   (lshiftrt "lshr")  (rotate "rotl")])
   1242  1.3  mrg (define_code_attr vec_shifts_mnem [(ashift "vesl")    (ashiftrt "vesra")
   1243  1.3  mrg 				   (lshiftrt "vesrl") (rotate "verll")])
   1244  1.1  mrg 
   1245  1.3  mrg ; Each vector element rotated by a scalar
   1246  1.3  mrg (define_expand "<vec_shifts_name><mode>3"
   1247  1.3  mrg   [(set (match_operand:VI 0 "register_operand" "")
   1248  1.3  mrg 	(VEC_SHIFTS:VI (match_operand:VI 1 "register_operand" "")
   1249  1.6  mrg 		       (match_operand:QI 2 "shift_count_operand" "")))]
   1250  1.3  mrg   "TARGET_VX")
   1251  1.1  mrg 
   1252  1.3  mrg ; verllb, verllh, verllf, verllg
   1253  1.3  mrg ; veslb,  veslh,  veslf,  veslg
   1254  1.1  mrg ; vesrab, vesrah, vesraf, vesrag
   1255  1.1  mrg ; vesrlb, vesrlh, vesrlf, vesrlg
   1256  1.6  mrg (define_insn "*<vec_shifts_name><mode>3"
   1257  1.3  mrg   [(set (match_operand:VI                0 "register_operand"  "=v")
   1258  1.3  mrg 	(VEC_SHIFTS:VI (match_operand:VI 1 "register_operand"   "v")
   1259  1.6  mrg 		       (match_operand:QI 2 "shift_count_operand_vec" "jsc")))]
   1260  1.6  mrg   "TARGET_VX
   1261  1.6  mrg   && s390_valid_shift_count (operands[2],
   1262  1.6  mrg     GET_MODE_BITSIZE (GET_MODE_INNER (<MODE>mode)) - 1)
   1263  1.6  mrg   "
   1264  1.6  mrg   "<vec_shifts_mnem><bhfgq>\t%v0,%v1,%Y2"
   1265  1.1  mrg   [(set_attr "op_type" "VRS")])
   1266  1.1  mrg 
   1267  1.6  mrg 
   1268  1.1  mrg ; Shift each element by corresponding vector element
   1269  1.1  mrg 
   1270  1.1  mrg ; veslvb, veslvh, veslvf, veslvg
   1271  1.1  mrg (define_insn "vashl<mode>3"
   1272  1.1  mrg   [(set (match_operand:VI            0 "register_operand" "=v")
   1273  1.1  mrg 	(ashift:VI (match_operand:VI 1 "register_operand"  "v")
   1274  1.1  mrg 		   (match_operand:VI 2 "register_operand"  "v")))]
   1275  1.1  mrg   "TARGET_VX"
   1276  1.1  mrg   "veslv<bhfgq>\t%v0,%v1,%v2"
   1277  1.1  mrg   [(set_attr "op_type" "VRR")])
   1278  1.1  mrg 
   1279  1.1  mrg ; vesravb, vesravh, vesravf, vesravg
   1280  1.1  mrg (define_insn "vashr<mode>3"
   1281  1.1  mrg   [(set (match_operand:VI              0 "register_operand" "=v")
   1282  1.1  mrg 	(ashiftrt:VI (match_operand:VI 1 "register_operand"  "v")
   1283  1.1  mrg 		     (match_operand:VI 2 "register_operand"  "v")))]
   1284  1.1  mrg   "TARGET_VX"
   1285  1.1  mrg   "vesrav<bhfgq>\t%v0,%v1,%v2"
   1286  1.1  mrg   [(set_attr "op_type" "VRR")])
   1287  1.1  mrg 
   1288  1.1  mrg ; vesrlvb, vesrlvh, vesrlvf, vesrlvg
   1289  1.1  mrg (define_insn "vlshr<mode>3"
   1290  1.1  mrg   [(set (match_operand:VI              0 "register_operand" "=v")
   1291  1.1  mrg 	(lshiftrt:VI (match_operand:VI 1 "register_operand"  "v")
   1292  1.1  mrg 		     (match_operand:VI 2 "register_operand"  "v")))]
   1293  1.1  mrg   "TARGET_VX"
   1294  1.1  mrg   "vesrlv<bhfgq>\t%v0,%v1,%v2"
   1295  1.1  mrg   [(set_attr "op_type" "VRR")])
   1296  1.1  mrg 
   1297  1.1  mrg ; Vector shift right logical by byte
   1298  1.1  mrg 
   1299  1.1  mrg ; Pattern used by e.g. popcount
   1300  1.1  mrg (define_insn "*vec_srb<mode>"
   1301  1.4  mrg   [(set (match_operand:V_128                0 "register_operand" "=v")
   1302  1.4  mrg 	(unspec:V_128 [(match_operand:V_128 1 "register_operand"  "v")
   1303  1.4  mrg 		       (match_operand:V16QI 2 "register_operand"  "v")]
   1304  1.4  mrg 		   UNSPEC_VEC_SRLB))]
   1305  1.1  mrg   "TARGET_VX"
   1306  1.1  mrg   "vsrlb\t%v0,%v1,%v2"
   1307  1.1  mrg   [(set_attr "op_type" "VRR")])
   1308  1.1  mrg 
   1309  1.1  mrg 
   1310  1.4  mrg ; Vector shift left by byte
   1311  1.4  mrg 
   1312  1.4  mrg (define_insn "*vec_slb<mode>"
   1313  1.4  mrg   [(set (match_operand:V_128                0 "register_operand" "=v")
   1314  1.4  mrg 	(unspec:V_128 [(match_operand:V_128 1 "register_operand"  "v")
   1315  1.4  mrg 		    (match_operand:V16QI    2 "register_operand"  "v")]
   1316  1.4  mrg 		   UNSPEC_VEC_SLB))]
   1317  1.4  mrg   "TARGET_VX"
   1318  1.4  mrg   "vslb\t%v0,%v1,%v2"
   1319  1.4  mrg   [(set_attr "op_type" "VRR")])
   1320  1.4  mrg 
   1321  1.4  mrg ; vec_shr is defined as shift towards element 0
   1322  1.4  mrg ; this means it is a left shift on BE targets!
   1323  1.4  mrg (define_expand "vec_shr_<mode>"
   1324  1.4  mrg   [(set (match_dup 3)
   1325  1.4  mrg 	(unspec:V16QI [(match_operand:SI 2 "const_shift_by_byte_operand" "")
   1326  1.4  mrg 		   (const_int 7)
   1327  1.4  mrg 		   (match_dup 3)]
   1328  1.4  mrg 		   UNSPEC_VEC_SET))
   1329  1.4  mrg    (set (match_operand:V_128 0 "register_operand" "")
   1330  1.4  mrg 	(unspec:V_128 [(match_operand:V_128 1 "register_operand" "")
   1331  1.4  mrg 		    (match_dup 3)]
   1332  1.4  mrg 		   UNSPEC_VEC_SLB))]
   1333  1.4  mrg   "TARGET_VX"
   1334  1.4  mrg  {
   1335  1.4  mrg    operands[3] = gen_reg_rtx(V16QImode);
   1336  1.4  mrg  })
   1337  1.4  mrg 
   1338  1.1  mrg ; vmnb, vmnh, vmnf, vmng
   1339  1.1  mrg (define_insn "smin<mode>3"
   1340  1.1  mrg   [(set (match_operand:VI          0 "register_operand" "=v")
   1341  1.6  mrg 	(smin:VI (match_operand:VI 1 "register_operand"  "v")
   1342  1.1  mrg 		 (match_operand:VI 2 "register_operand"  "v")))]
   1343  1.1  mrg   "TARGET_VX"
   1344  1.1  mrg   "vmn<bhfgq>\t%v0,%v1,%v2"
   1345  1.1  mrg   [(set_attr "op_type" "VRR")])
   1346  1.1  mrg 
   1347  1.1  mrg ; vmxb, vmxh, vmxf, vmxg
   1348  1.1  mrg (define_insn "smax<mode>3"
   1349  1.1  mrg   [(set (match_operand:VI          0 "register_operand" "=v")
   1350  1.6  mrg 	(smax:VI (match_operand:VI 1 "register_operand"  "v")
   1351  1.1  mrg 		 (match_operand:VI 2 "register_operand"  "v")))]
   1352  1.1  mrg   "TARGET_VX"
   1353  1.1  mrg   "vmx<bhfgq>\t%v0,%v1,%v2"
   1354  1.1  mrg   [(set_attr "op_type" "VRR")])
   1355  1.1  mrg 
   1356  1.1  mrg ; vmnlb, vmnlh, vmnlf, vmnlg
   1357  1.1  mrg (define_insn "umin<mode>3"
   1358  1.1  mrg   [(set (match_operand:VI          0 "register_operand" "=v")
   1359  1.6  mrg 	(umin:VI (match_operand:VI 1 "register_operand"  "v")
   1360  1.1  mrg 		 (match_operand:VI 2 "register_operand"  "v")))]
   1361  1.1  mrg   "TARGET_VX"
   1362  1.1  mrg   "vmnl<bhfgq>\t%v0,%v1,%v2"
   1363  1.1  mrg   [(set_attr "op_type" "VRR")])
   1364  1.1  mrg 
   1365  1.1  mrg ; vmxlb, vmxlh, vmxlf, vmxlg
   1366  1.1  mrg (define_insn "umax<mode>3"
   1367  1.1  mrg   [(set (match_operand:VI          0 "register_operand" "=v")
   1368  1.6  mrg 	(umax:VI (match_operand:VI 1 "register_operand"  "v")
   1369  1.1  mrg 		 (match_operand:VI 2 "register_operand"  "v")))]
   1370  1.1  mrg   "TARGET_VX"
   1371  1.1  mrg   "vmxl<bhfgq>\t%v0,%v1,%v2"
   1372  1.1  mrg   [(set_attr "op_type" "VRR")])
   1373  1.1  mrg 
   1374  1.1  mrg ; vmeb, vmeh, vmef
   1375  1.1  mrg (define_insn "vec_widen_smult_even_<mode>"
   1376  1.1  mrg   [(set (match_operand:<vec_double>                 0 "register_operand" "=v")
   1377  1.6  mrg 	(unspec:<vec_double> [(match_operand:VI_QHS 1 "register_operand"  "v")
   1378  1.1  mrg 			      (match_operand:VI_QHS 2 "register_operand"  "v")]
   1379  1.1  mrg 			     UNSPEC_VEC_SMULT_EVEN))]
   1380  1.1  mrg   "TARGET_VX"
   1381  1.1  mrg   "vme<bhfgq>\t%v0,%v1,%v2"
   1382  1.1  mrg   [(set_attr "op_type" "VRR")])
   1383  1.1  mrg 
   1384  1.1  mrg ; vmleb, vmleh, vmlef
   1385  1.1  mrg (define_insn "vec_widen_umult_even_<mode>"
   1386  1.1  mrg   [(set (match_operand:<vec_double>                 0 "register_operand" "=v")
   1387  1.6  mrg 	(unspec:<vec_double> [(match_operand:VI_QHS 1 "register_operand"  "v")
   1388  1.1  mrg 			      (match_operand:VI_QHS 2 "register_operand"  "v")]
   1389  1.1  mrg 			     UNSPEC_VEC_UMULT_EVEN))]
   1390  1.1  mrg   "TARGET_VX"
   1391  1.1  mrg   "vmle<bhfgq>\t%v0,%v1,%v2"
   1392  1.1  mrg   [(set_attr "op_type" "VRR")])
   1393  1.1  mrg 
   1394  1.1  mrg ; vmob, vmoh, vmof
   1395  1.1  mrg (define_insn "vec_widen_smult_odd_<mode>"
   1396  1.1  mrg   [(set (match_operand:<vec_double>                 0 "register_operand" "=v")
   1397  1.6  mrg 	(unspec:<vec_double> [(match_operand:VI_QHS 1 "register_operand"  "v")
   1398  1.1  mrg 			      (match_operand:VI_QHS 2 "register_operand"  "v")]
   1399  1.1  mrg 			     UNSPEC_VEC_SMULT_ODD))]
   1400  1.1  mrg   "TARGET_VX"
   1401  1.1  mrg   "vmo<bhfgq>\t%v0,%v1,%v2"
   1402  1.1  mrg   [(set_attr "op_type" "VRR")])
   1403  1.1  mrg 
   1404  1.1  mrg ; vmlob, vmloh, vmlof
   1405  1.1  mrg (define_insn "vec_widen_umult_odd_<mode>"
   1406  1.1  mrg   [(set (match_operand:<vec_double>                 0 "register_operand" "=v")
   1407  1.6  mrg 	(unspec:<vec_double> [(match_operand:VI_QHS 1 "register_operand"  "v")
   1408  1.1  mrg 			      (match_operand:VI_QHS 2 "register_operand"  "v")]
   1409  1.1  mrg 			     UNSPEC_VEC_UMULT_ODD))]
   1410  1.1  mrg   "TARGET_VX"
   1411  1.1  mrg   "vmlo<bhfgq>\t%v0,%v1,%v2"
   1412  1.1  mrg   [(set_attr "op_type" "VRR")])
   1413  1.1  mrg 
   1414  1.4  mrg 
   1415  1.4  mrg ; Widening hi/lo multiplications
   1416  1.4  mrg 
   1417  1.4  mrg ; The S/390 instructions vml and vmh return the low or high parts of
   1418  1.4  mrg ; the double sized result elements in the corresponding elements of
   1419  1.4  mrg ; the target register.  That's NOT what the vec_widen_umult_lo/hi
   1420  1.4  mrg ; patterns are expected to do.
   1421  1.4  mrg 
   1422  1.4  mrg ; We emulate the widening lo/hi multiplies with the even/odd versions
   1423  1.4  mrg ; followed by a vector merge
   1424  1.4  mrg 
   1425  1.4  mrg 
   1426  1.4  mrg (define_expand "vec_widen_umult_lo_<mode>"
   1427  1.4  mrg   [(set (match_dup 3)
   1428  1.6  mrg 	(unspec:<vec_double> [(match_operand:VI_QHS 1 "register_operand" "")
   1429  1.6  mrg 			      (match_operand:VI_QHS 2 "register_operand" "")]
   1430  1.4  mrg 			     UNSPEC_VEC_UMULT_EVEN))
   1431  1.4  mrg    (set (match_dup 4)
   1432  1.4  mrg 	(unspec:<vec_double> [(match_dup 1) (match_dup 2)]
   1433  1.4  mrg 			     UNSPEC_VEC_UMULT_ODD))
   1434  1.6  mrg    (set (match_operand:<vec_double>                 0 "register_operand" "")
   1435  1.7  mrg         (vec_select:<vec_double>
   1436  1.7  mrg 	 (vec_concat:<vec_2x_wide> (match_dup 3) (match_dup 4))
   1437  1.7  mrg 	 (match_dup 5)))]
   1438  1.4  mrg   "TARGET_VX"
   1439  1.4  mrg  {
   1440  1.4  mrg    operands[3] = gen_reg_rtx (<vec_double>mode);
   1441  1.4  mrg    operands[4] = gen_reg_rtx (<vec_double>mode);
   1442  1.7  mrg    operands[5] = s390_expand_merge_perm_const (<vec_double>mode, false);
   1443  1.4  mrg  })
   1444  1.4  mrg 
   1445  1.4  mrg (define_expand "vec_widen_umult_hi_<mode>"
   1446  1.4  mrg   [(set (match_dup 3)
   1447  1.6  mrg 	(unspec:<vec_double> [(match_operand:VI_QHS 1 "register_operand" "")
   1448  1.6  mrg 			      (match_operand:VI_QHS 2 "register_operand" "")]
   1449  1.4  mrg 			     UNSPEC_VEC_UMULT_EVEN))
   1450  1.4  mrg    (set (match_dup 4)
   1451  1.4  mrg 	(unspec:<vec_double> [(match_dup 1) (match_dup 2)]
   1452  1.4  mrg 			     UNSPEC_VEC_UMULT_ODD))
   1453  1.6  mrg    (set (match_operand:<vec_double>                 0 "register_operand" "")
   1454  1.7  mrg         (vec_select:<vec_double>
   1455  1.7  mrg 	 (vec_concat:<vec_2x_wide> (match_dup 3) (match_dup 4))
   1456  1.7  mrg 	 (match_dup 5)))]
   1457  1.4  mrg   "TARGET_VX"
   1458  1.4  mrg  {
   1459  1.4  mrg    operands[3] = gen_reg_rtx (<vec_double>mode);
   1460  1.4  mrg    operands[4] = gen_reg_rtx (<vec_double>mode);
   1461  1.7  mrg    operands[5] = s390_expand_merge_perm_const (<vec_double>mode, true);
   1462  1.4  mrg  })
   1463  1.4  mrg 
   1464  1.4  mrg (define_expand "vec_widen_smult_lo_<mode>"
   1465  1.4  mrg   [(set (match_dup 3)
   1466  1.6  mrg 	(unspec:<vec_double> [(match_operand:VI_QHS 1 "register_operand" "")
   1467  1.6  mrg 			      (match_operand:VI_QHS 2 "register_operand" "")]
   1468  1.4  mrg 			     UNSPEC_VEC_SMULT_EVEN))
   1469  1.4  mrg    (set (match_dup 4)
   1470  1.4  mrg 	(unspec:<vec_double> [(match_dup 1) (match_dup 2)]
   1471  1.4  mrg 			     UNSPEC_VEC_SMULT_ODD))
   1472  1.6  mrg    (set (match_operand:<vec_double>                 0 "register_operand" "")
   1473  1.7  mrg         (vec_select:<vec_double>
   1474  1.7  mrg 	 (vec_concat:<vec_2x_wide> (match_dup 3) (match_dup 4))
   1475  1.7  mrg 	 (match_dup 5)))]
   1476  1.4  mrg   "TARGET_VX"
   1477  1.4  mrg  {
   1478  1.4  mrg    operands[3] = gen_reg_rtx (<vec_double>mode);
   1479  1.4  mrg    operands[4] = gen_reg_rtx (<vec_double>mode);
   1480  1.7  mrg    operands[5] = s390_expand_merge_perm_const (<vec_double>mode, false);
   1481  1.4  mrg  })
   1482  1.4  mrg 
   1483  1.4  mrg (define_expand "vec_widen_smult_hi_<mode>"
   1484  1.4  mrg   [(set (match_dup 3)
   1485  1.6  mrg 	(unspec:<vec_double> [(match_operand:VI_QHS 1 "register_operand" "")
   1486  1.6  mrg 			      (match_operand:VI_QHS 2 "register_operand" "")]
   1487  1.4  mrg 			     UNSPEC_VEC_SMULT_EVEN))
   1488  1.4  mrg    (set (match_dup 4)
   1489  1.4  mrg 	(unspec:<vec_double> [(match_dup 1) (match_dup 2)]
   1490  1.4  mrg 			     UNSPEC_VEC_SMULT_ODD))
   1491  1.6  mrg    (set (match_operand:<vec_double>                 0 "register_operand" "")
   1492  1.7  mrg         (vec_select:<vec_double>
   1493  1.7  mrg 	 (vec_concat:<vec_2x_wide> (match_dup 3) (match_dup 4))
   1494  1.7  mrg 	 (match_dup 5)))]
   1495  1.4  mrg   "TARGET_VX"
   1496  1.4  mrg  {
   1497  1.4  mrg    operands[3] = gen_reg_rtx (<vec_double>mode);
   1498  1.4  mrg    operands[4] = gen_reg_rtx (<vec_double>mode);
   1499  1.7  mrg    operands[5] = s390_expand_merge_perm_const (<vec_double>mode, true);
   1500  1.4  mrg  })
   1501  1.1  mrg 
   1502  1.1  mrg ; vec_widen_ushiftl_hi
   1503  1.1  mrg ; vec_widen_ushiftl_lo
   1504  1.1  mrg ; vec_widen_sshiftl_hi
   1505  1.1  mrg ; vec_widen_sshiftl_lo
   1506  1.1  mrg 
   1507  1.1  mrg ;;
   1508  1.1  mrg ;; Vector floating point arithmetic instructions
   1509  1.1  mrg ;;
   1510  1.1  mrg 
   1511  1.3  mrg ; vfasb, vfadb, wfasb, wfadb, wfaxb
   1512  1.7  mrg (define_insn "add<mode>3<tf_vr>"
   1513  1.3  mrg   [(set (match_operand:VF_HW             0 "register_operand" "=v")
   1514  1.6  mrg 	(plus:VF_HW (match_operand:VF_HW 1 "register_operand"  "v")
   1515  1.3  mrg 		    (match_operand:VF_HW 2 "register_operand"  "v")))]
   1516  1.1  mrg   "TARGET_VX"
   1517  1.3  mrg   "<vw>fa<sdx>b\t%v0,%v1,%v2"
   1518  1.1  mrg   [(set_attr "op_type" "VRR")])
   1519  1.1  mrg 
   1520  1.7  mrg (define_expand "addtf3"
   1521  1.7  mrg   [(match_operand:TF 0 "register_operand"     "")
   1522  1.7  mrg    (match_operand:TF 1 "nonimmediate_operand" "")
   1523  1.7  mrg    (match_operand:TF 2 "general_operand"      "")]
   1524  1.7  mrg   "HAVE_TF (addtf3)"
   1525  1.7  mrg   { EXPAND_TF (addtf3, 3); })
   1526  1.7  mrg 
   1527  1.3  mrg ; vfssb, vfsdb, wfssb, wfsdb, wfsxb
   1528  1.7  mrg (define_insn "sub<mode>3<tf_vr>"
   1529  1.3  mrg   [(set (match_operand:VF_HW              0 "register_operand" "=v")
   1530  1.6  mrg 	(minus:VF_HW (match_operand:VF_HW 1 "register_operand"  "v")
   1531  1.3  mrg 		     (match_operand:VF_HW 2 "register_operand"  "v")))]
   1532  1.1  mrg   "TARGET_VX"
   1533  1.3  mrg   "<vw>fs<sdx>b\t%v0,%v1,%v2"
   1534  1.1  mrg   [(set_attr "op_type" "VRR")])
   1535  1.1  mrg 
   1536  1.7  mrg (define_expand "subtf3"
   1537  1.7  mrg   [(match_operand:TF 0 "register_operand" "")
   1538  1.7  mrg    (match_operand:TF 1 "register_operand" "")
   1539  1.7  mrg    (match_operand:TF 2 "general_operand"  "")]
   1540  1.7  mrg   "HAVE_TF (subtf3)"
   1541  1.7  mrg   { EXPAND_TF (subtf3, 3); })
   1542  1.7  mrg 
   1543  1.3  mrg ; vfmsb, vfmdb, wfmsb, wfmdb, wfmxb
   1544  1.7  mrg (define_insn "mul<mode>3<tf_vr>"
   1545  1.3  mrg   [(set (match_operand:VF_HW             0 "register_operand" "=v")
   1546  1.6  mrg 	(mult:VF_HW (match_operand:VF_HW 1 "register_operand"  "v")
   1547  1.3  mrg 		    (match_operand:VF_HW 2 "register_operand"  "v")))]
   1548  1.1  mrg   "TARGET_VX"
   1549  1.3  mrg   "<vw>fm<sdx>b\t%v0,%v1,%v2"
   1550  1.1  mrg   [(set_attr "op_type" "VRR")])
   1551  1.1  mrg 
   1552  1.7  mrg (define_expand "multf3"
   1553  1.7  mrg   [(match_operand:TF 0 "register_operand"     "")
   1554  1.7  mrg    (match_operand:TF 1 "nonimmediate_operand" "")
   1555  1.7  mrg    (match_operand:TF 2 "general_operand"      "")]
   1556  1.7  mrg   "HAVE_TF (multf3)"
   1557  1.7  mrg   { EXPAND_TF (multf3, 3); })
   1558  1.7  mrg 
   1559  1.3  mrg ; vfdsb, vfddb, wfdsb, wfddb, wfdxb
   1560  1.7  mrg (define_insn "div<mode>3<tf_vr>"
   1561  1.3  mrg   [(set (match_operand:VF_HW            0 "register_operand" "=v")
   1562  1.3  mrg 	(div:VF_HW (match_operand:VF_HW 1 "register_operand"  "v")
   1563  1.3  mrg 		   (match_operand:VF_HW 2 "register_operand"  "v")))]
   1564  1.1  mrg   "TARGET_VX"
   1565  1.3  mrg   "<vw>fd<sdx>b\t%v0,%v1,%v2"
   1566  1.1  mrg   [(set_attr "op_type" "VRR")])
   1567  1.1  mrg 
   1568  1.7  mrg (define_expand "divtf3"
   1569  1.7  mrg   [(match_operand:TF 0 "register_operand" "")
   1570  1.7  mrg    (match_operand:TF 1 "register_operand" "")
   1571  1.7  mrg    (match_operand:TF 2 "general_operand"  "")]
   1572  1.7  mrg   "HAVE_TF (divtf3)"
   1573  1.7  mrg   { EXPAND_TF (divtf3, 3); })
   1574  1.7  mrg 
   1575  1.3  mrg ; vfsqsb, vfsqdb, wfsqsb, wfsqdb, wfsqxb
   1576  1.7  mrg (define_insn "sqrt<mode>2<tf_vr>"
   1577  1.7  mrg   [(set (match_operand:VF_HW             0 "register_operand" "=v")
   1578  1.3  mrg 	(sqrt:VF_HW (match_operand:VF_HW 1 "register_operand"  "v")))]
   1579  1.1  mrg   "TARGET_VX"
   1580  1.3  mrg   "<vw>fsq<sdx>b\t%v0,%v1"
   1581  1.1  mrg   [(set_attr "op_type" "VRR")])
   1582  1.1  mrg 
   1583  1.7  mrg (define_expand "sqrttf2"
   1584  1.7  mrg   [(match_operand:TF 0 "register_operand" "")
   1585  1.7  mrg    (match_operand:TF 1 "general_operand"  "")]
   1586  1.7  mrg   "HAVE_TF (sqrttf2)"
   1587  1.7  mrg   { EXPAND_TF (sqrttf2, 2); })
   1588  1.7  mrg 
   1589  1.3  mrg ; vfmasb, vfmadb, wfmasb, wfmadb, wfmaxb
   1590  1.3  mrg (define_insn "fma<mode>4"
   1591  1.3  mrg   [(set (match_operand:VF_HW            0 "register_operand" "=v")
   1592  1.6  mrg 	(fma:VF_HW (match_operand:VF_HW 1 "register_operand"  "v")
   1593  1.3  mrg 		   (match_operand:VF_HW 2 "register_operand"  "v")
   1594  1.3  mrg 		   (match_operand:VF_HW 3 "register_operand"  "v")))]
   1595  1.7  mrg   "TARGET_VX && s390_fma_allowed_p (<MODE>mode)"
   1596  1.3  mrg   "<vw>fma<sdx>b\t%v0,%v1,%v2,%v3"
   1597  1.1  mrg   [(set_attr "op_type" "VRR")])
   1598  1.1  mrg 
   1599  1.3  mrg ; vfmssb, vfmsdb, wfmssb, wfmsdb, wfmsxb
   1600  1.3  mrg (define_insn "fms<mode>4"
   1601  1.3  mrg   [(set (match_operand:VF_HW                     0 "register_operand" "=v")
   1602  1.6  mrg 	(fma:VF_HW (match_operand:VF_HW          1 "register_operand"  "v")
   1603  1.3  mrg 		   (match_operand:VF_HW          2 "register_operand"  "v")
   1604  1.3  mrg 		 (neg:VF_HW (match_operand:VF_HW 3 "register_operand"  "v"))))]
   1605  1.7  mrg   "TARGET_VX && s390_fma_allowed_p (<MODE>mode)"
   1606  1.3  mrg   "<vw>fms<sdx>b\t%v0,%v1,%v2,%v3"
   1607  1.3  mrg   [(set_attr "op_type" "VRR")])
   1608  1.3  mrg 
   1609  1.3  mrg ; vfnmasb, vfnmadb, wfnmasb, wfnmadb, wfnmaxb
   1610  1.3  mrg (define_insn "neg_fma<mode>4"
   1611  1.3  mrg   [(set (match_operand:VF_HW             0 "register_operand" "=v")
   1612  1.3  mrg 	(neg:VF_HW
   1613  1.6  mrg 	 (fma:VF_HW (match_operand:VF_HW 1 "register_operand"  "v")
   1614  1.3  mrg 		    (match_operand:VF_HW 2 "register_operand"  "v")
   1615  1.3  mrg 		    (match_operand:VF_HW 3 "register_operand"  "v"))))]
   1616  1.7  mrg   "TARGET_VXE && s390_fma_allowed_p (<MODE>mode)"
   1617  1.3  mrg   "<vw>fnma<sdx>b\t%v0,%v1,%v2,%v3"
   1618  1.1  mrg   [(set_attr "op_type" "VRR")])
   1619  1.1  mrg 
   1620  1.3  mrg ; vfnmssb, vfnmsdb, wfnmssb, wfnmsdb, wfnmsxb
   1621  1.3  mrg (define_insn "neg_fms<mode>4"
   1622  1.3  mrg   [(set (match_operand:VF_HW                      0 "register_operand" "=v")
   1623  1.3  mrg 	(neg:VF_HW
   1624  1.6  mrg 	 (fma:VF_HW (match_operand:VF_HW          1 "register_operand"  "v")
   1625  1.3  mrg 		    (match_operand:VF_HW          2 "register_operand"  "v")
   1626  1.3  mrg 		  (neg:VF_HW (match_operand:VF_HW 3 "register_operand"  "v")))))]
   1627  1.7  mrg   "TARGET_VXE && s390_fma_allowed_p (<MODE>mode)"
   1628  1.3  mrg   "<vw>fnms<sdx>b\t%v0,%v1,%v2,%v3"
   1629  1.3  mrg   [(set_attr "op_type" "VRR")])
   1630  1.3  mrg 
   1631  1.3  mrg ; vflcsb, vflcdb, wflcsb, wflcdb, wflcxb
   1632  1.7  mrg (define_insn "neg<mode>2<tf_vr>"
   1633  1.3  mrg   [(set (match_operand:VFT          0 "register_operand" "=v")
   1634  1.3  mrg 	(neg:VFT (match_operand:VFT 1 "register_operand"  "v")))]
   1635  1.1  mrg   "TARGET_VX"
   1636  1.3  mrg   "<vw>flc<sdx>b\t%v0,%v1"
   1637  1.1  mrg   [(set_attr "op_type" "VRR")])
   1638  1.1  mrg 
   1639  1.7  mrg (define_expand "negtf2"
   1640  1.7  mrg   [(match_operand:TF 0 "register_operand" "")
   1641  1.7  mrg    (match_operand:TF 1 "register_operand" "")]
   1642  1.7  mrg   "HAVE_TF (negtf2)"
   1643  1.7  mrg   { EXPAND_TF (negtf2, 2); })
   1644  1.7  mrg 
   1645  1.3  mrg ; vflpsb, vflpdb, wflpsb, wflpdb, wflpxb
   1646  1.7  mrg (define_insn "abs<mode>2<tf_vr>"
   1647  1.3  mrg   [(set (match_operand:VFT          0 "register_operand" "=v")
   1648  1.3  mrg 	(abs:VFT (match_operand:VFT 1 "register_operand"  "v")))]
   1649  1.1  mrg   "TARGET_VX"
   1650  1.3  mrg   "<vw>flp<sdx>b\t%v0,%v1"
   1651  1.1  mrg   [(set_attr "op_type" "VRR")])
   1652  1.1  mrg 
   1653  1.7  mrg (define_expand "abstf2"
   1654  1.7  mrg   [(match_operand:TF 0 "register_operand" "")
   1655  1.7  mrg    (match_operand:TF 1 "register_operand" "")]
   1656  1.7  mrg   "HAVE_TF (abstf2)"
   1657  1.7  mrg   { EXPAND_TF (abstf2, 2); })
   1658  1.7  mrg 
   1659  1.3  mrg ; vflnsb, vflndb, wflnsb, wflndb, wflnxb
   1660  1.3  mrg (define_insn "negabs<mode>2"
   1661  1.3  mrg   [(set (match_operand:VFT                   0 "register_operand" "=v")
   1662  1.3  mrg 	(neg:VFT (abs:VFT (match_operand:VFT 1 "register_operand"  "v"))))]
   1663  1.1  mrg   "TARGET_VX"
   1664  1.3  mrg   "<vw>fln<sdx>b\t%v0,%v1"
   1665  1.3  mrg   [(set_attr "op_type" "VRR")])
   1666  1.3  mrg 
   1667  1.3  mrg (define_expand "smax<mode>3"
   1668  1.3  mrg   [(set (match_operand:VF_HW             0 "register_operand")
   1669  1.3  mrg 	(smax:VF_HW (match_operand:VF_HW 1 "register_operand")
   1670  1.3  mrg 		    (match_operand:VF_HW 2 "register_operand")))]
   1671  1.3  mrg   "TARGET_VX")
   1672  1.3  mrg 
   1673  1.3  mrg ; vfmaxsb, vfmaxdb, wfmaxsb, wfmaxdb, wfmaxxb
   1674  1.3  mrg (define_insn "*smax<mode>3_vxe"
   1675  1.3  mrg   [(set (match_operand:VF_HW             0 "register_operand" "=v")
   1676  1.6  mrg 	(smax:VF_HW (match_operand:VF_HW 1 "register_operand"  "v")
   1677  1.3  mrg 		    (match_operand:VF_HW 2 "register_operand"  "v")))]
   1678  1.3  mrg   "TARGET_VXE"
   1679  1.3  mrg   "<vw>fmax<sdx>b\t%v0,%v1,%v2,4"
   1680  1.1  mrg   [(set_attr "op_type" "VRR")])
   1681  1.1  mrg 
   1682  1.1  mrg ; Emulate with compare + select
   1683  1.3  mrg (define_insn_and_split "*smaxv2df3_vx"
   1684  1.1  mrg   [(set (match_operand:V2DF            0 "register_operand" "=v")
   1685  1.6  mrg 	(smax:V2DF (match_operand:V2DF 1 "register_operand"  "v")
   1686  1.1  mrg 		   (match_operand:V2DF 2 "register_operand"  "v")))]
   1687  1.3  mrg   "TARGET_VX && !TARGET_VXE"
   1688  1.1  mrg   "#"
   1689  1.3  mrg   "&& 1"
   1690  1.1  mrg   [(set (match_dup 3)
   1691  1.6  mrg 	(not:V2DI
   1692  1.6  mrg 	 (unge:V2DI (match_dup 2) (match_dup 1))))
   1693  1.1  mrg    (set (match_dup 0)
   1694  1.1  mrg 	(if_then_else:V2DF
   1695  1.1  mrg 	 (eq (match_dup 3) (match_dup 4))
   1696  1.1  mrg 	 (match_dup 2)
   1697  1.1  mrg 	 (match_dup 1)))]
   1698  1.1  mrg {
   1699  1.1  mrg   operands[3] = gen_reg_rtx (V2DImode);
   1700  1.1  mrg   operands[4] = CONST0_RTX (V2DImode);
   1701  1.1  mrg })
   1702  1.1  mrg 
   1703  1.3  mrg (define_expand "smin<mode>3"
   1704  1.3  mrg   [(set (match_operand:VF_HW             0 "register_operand")
   1705  1.3  mrg 	(smin:VF_HW (match_operand:VF_HW 1 "register_operand")
   1706  1.3  mrg 		    (match_operand:VF_HW 2 "register_operand")))]
   1707  1.3  mrg   "TARGET_VX")
   1708  1.3  mrg 
   1709  1.3  mrg ; vfminsb, vfmindb, wfminsb, wfmindb, wfminxb
   1710  1.3  mrg (define_insn "*smin<mode>3_vxe"
   1711  1.3  mrg   [(set (match_operand:VF_HW             0 "register_operand" "=v")
   1712  1.6  mrg 	(smin:VF_HW (match_operand:VF_HW 1 "register_operand"  "v")
   1713  1.3  mrg 		    (match_operand:VF_HW 2 "register_operand"  "v")))]
   1714  1.3  mrg   "TARGET_VXE"
   1715  1.3  mrg   "<vw>fmin<sdx>b\t%v0,%v1,%v2,4"
   1716  1.3  mrg   [(set_attr "op_type" "VRR")])
   1717  1.3  mrg 
   1718  1.1  mrg ; Emulate with compare + select
   1719  1.3  mrg (define_insn_and_split "*sminv2df3_vx"
   1720  1.1  mrg   [(set (match_operand:V2DF            0 "register_operand" "=v")
   1721  1.6  mrg 	(smin:V2DF (match_operand:V2DF 1 "register_operand"  "v")
   1722  1.1  mrg 		   (match_operand:V2DF 2 "register_operand"  "v")))]
   1723  1.3  mrg   "TARGET_VX && !TARGET_VXE"
   1724  1.1  mrg   "#"
   1725  1.3  mrg   "&& 1"
   1726  1.1  mrg   [(set (match_dup 3)
   1727  1.6  mrg 	(not:V2DI
   1728  1.6  mrg 	 (unge:V2DI (match_dup 2) (match_dup 1))))
   1729  1.1  mrg    (set (match_dup 0)
   1730  1.1  mrg 	(if_then_else:V2DF
   1731  1.1  mrg 	 (eq (match_dup 3) (match_dup 4))
   1732  1.1  mrg 	 (match_dup 1)
   1733  1.1  mrg 	 (match_dup 2)))]
   1734  1.1  mrg {
   1735  1.1  mrg   operands[3] = gen_reg_rtx (V2DImode);
   1736  1.1  mrg   operands[4] = CONST0_RTX (V2DImode);
   1737  1.1  mrg })
   1738  1.1  mrg 
   1739  1.5  mrg ; Vector copysign, implement using vector select
   1740  1.5  mrg (define_expand "copysign<mode>3"
   1741  1.7  mrg   [(set (match_operand:VFT            0 "register_operand" "")
   1742  1.7  mrg 	(ior:VFT
   1743  1.7  mrg 	 (and:VFT (match_operand:VFT  2 "register_operand" "")
   1744  1.7  mrg 		  (match_dup 3))
   1745  1.7  mrg 	 (and:VFT (not:VFT (match_dup 3))
   1746  1.7  mrg 		  (match_operand:VFT  1 "register_operand" ""))))]
   1747  1.5  mrg   "TARGET_VX"
   1748  1.5  mrg {
   1749  1.7  mrg   rtx mask = s390_build_signbit_mask (<MODE>mode);
   1750  1.7  mrg   operands[3] = force_reg (<MODE>mode, mask);
   1751  1.7  mrg })
   1752  1.5  mrg 
   1753  1.7  mrg ;;
   1754  1.7  mrg ;; Compares
   1755  1.7  mrg ;;
   1756  1.5  mrg 
   1757  1.7  mrg (define_expand "vec_cmp<mode><tointvec>"
   1758  1.7  mrg   [(set (match_operand:<TOINTVEC>  0 "register_operand" "")
   1759  1.7  mrg 	(match_operator:<TOINTVEC> 1 "vcond_comparison_operator"
   1760  1.7  mrg 	  [(match_operand:V_HW     2 "register_operand" "")
   1761  1.7  mrg 	   (match_operand:V_HW     3 "nonmemory_operand" "")]))]
   1762  1.7  mrg   "TARGET_VX"
   1763  1.7  mrg {
   1764  1.7  mrg   s390_expand_vec_compare (operands[0], GET_CODE(operands[1]), operands[2], operands[3]);
   1765  1.7  mrg   DONE;
   1766  1.7  mrg })
   1767  1.5  mrg 
   1768  1.7  mrg (define_expand "vec_cmpu<VI_HW:mode><VI_HW:mode>"
   1769  1.7  mrg   [(set (match_operand:VI_HW    0 "register_operand" "")
   1770  1.7  mrg 	(match_operator:VI_HW   1 ""
   1771  1.7  mrg 	  [(match_operand:VI_HW 2 "register_operand" "")
   1772  1.7  mrg 	   (match_operand:VI_HW 3 "register_operand" "")]))]
   1773  1.7  mrg   "TARGET_VX"
   1774  1.7  mrg {
   1775  1.7  mrg   s390_expand_vec_compare (operands[0], GET_CODE(operands[1]), operands[2], operands[3]);
   1776  1.7  mrg   DONE;
   1777  1.5  mrg })
   1778  1.1  mrg 
   1779  1.7  mrg (define_insn "*vec_cmp<VICMP_HW_OP:code><VI:mode><VI:mode>_nocc"
   1780  1.1  mrg   [(set (match_operand:VI                 2 "register_operand" "=v")
   1781  1.1  mrg 	(VICMP_HW_OP:VI (match_operand:VI 0 "register_operand"  "v")
   1782  1.1  mrg 			(match_operand:VI 1 "register_operand"  "v")))]
   1783  1.1  mrg   "TARGET_VX"
   1784  1.1  mrg   "vc<VICMP_HW_OP:insn_cmp_op><VI:bhfgq>\t%v2,%v0,%v1"
   1785  1.1  mrg   [(set_attr "op_type" "VRR")])
   1786  1.1  mrg 
   1787  1.1  mrg 
   1788  1.1  mrg ;;
   1789  1.1  mrg ;; Floating point compares
   1790  1.1  mrg ;;
   1791  1.1  mrg 
   1792  1.6  mrg ; vfcesb, vfcedb, wfcexb: non-signaling "==" comparison (a == b)
   1793  1.6  mrg (define_insn "*vec_cmpeq<mode>_quiet_nocc"
   1794  1.7  mrg   [(set (match_operand:<TOINTVEC>         0 "register_operand" "=v")
   1795  1.7  mrg 	(eq:<TOINTVEC> (match_operand:VFT 1 "register_operand" "v")
   1796  1.6  mrg 		       (match_operand:VFT 2 "register_operand" "v")))]
   1797  1.6  mrg   "TARGET_VX"
   1798  1.6  mrg   "<vw>fce<sdx>b\t%v0,%v1,%v2"
   1799  1.6  mrg   [(set_attr "op_type" "VRR")])
   1800  1.6  mrg 
   1801  1.6  mrg ; vfchsb, vfchdb, wfchxb: non-signaling > comparison (!(b u>= a))
   1802  1.6  mrg (define_insn "vec_cmpgt<mode>_quiet_nocc"
   1803  1.7  mrg   [(set (match_operand:<TOINTVEC>            0 "register_operand" "=v")
   1804  1.7  mrg 	(not:<TOINTVEC>
   1805  1.7  mrg 	 (unge:<TOINTVEC> (match_operand:VFT 2 "register_operand" "v")
   1806  1.6  mrg 			  (match_operand:VFT 1 "register_operand" "v"))))]
   1807  1.6  mrg   "TARGET_VX"
   1808  1.6  mrg   "<vw>fch<sdx>b\t%v0,%v1,%v2"
   1809  1.6  mrg   [(set_attr "op_type" "VRR")])
   1810  1.6  mrg 
   1811  1.6  mrg (define_expand "vec_cmplt<mode>_quiet_nocc"
   1812  1.7  mrg   [(set (match_operand:<TOINTVEC>            0 "register_operand" "=v")
   1813  1.7  mrg 	(not:<TOINTVEC>
   1814  1.7  mrg 	 (unge:<TOINTVEC> (match_operand:VFT 1 "register_operand" "v")
   1815  1.6  mrg 			  (match_operand:VFT 2 "register_operand" "v"))))]
   1816  1.6  mrg   "TARGET_VX")
   1817  1.6  mrg 
   1818  1.6  mrg ; vfchesb, vfchedb, wfchexb: non-signaling >= comparison (!(a u< b))
   1819  1.6  mrg (define_insn "vec_cmpge<mode>_quiet_nocc"
   1820  1.7  mrg   [(set (match_operand:<TOINTVEC>            0 "register_operand" "=v")
   1821  1.7  mrg 	(not:<TOINTVEC>
   1822  1.7  mrg 	 (unlt:<TOINTVEC> (match_operand:VFT 1 "register_operand" "v")
   1823  1.6  mrg 			  (match_operand:VFT 2 "register_operand" "v"))))]
   1824  1.6  mrg   "TARGET_VX"
   1825  1.6  mrg   "<vw>fche<sdx>b\t%v0,%v1,%v2"
   1826  1.6  mrg   [(set_attr "op_type" "VRR")])
   1827  1.6  mrg 
   1828  1.6  mrg (define_expand "vec_cmple<mode>_quiet_nocc"
   1829  1.7  mrg   [(set (match_operand:<TOINTVEC>            0 "register_operand" "=v")
   1830  1.7  mrg 	(not:<TOINTVEC>
   1831  1.7  mrg 	 (unlt:<TOINTVEC> (match_operand:VFT 2 "register_operand" "v")
   1832  1.6  mrg 			  (match_operand:VFT 1 "register_operand" "v"))))]
   1833  1.6  mrg   "TARGET_VX")
   1834  1.6  mrg 
   1835  1.6  mrg ; vfkesb, vfkedb, wfkexb: signaling == comparison ((a >= b) & (b >= a))
   1836  1.6  mrg (define_insn "*vec_cmpeq<mode>_signaling_nocc"
   1837  1.7  mrg   [(set (match_operand:<TOINTVEC>          0 "register_operand" "=v")
   1838  1.7  mrg 	(and:<TOINTVEC>
   1839  1.7  mrg 	 (ge:<TOINTVEC> (match_operand:VFT 1 "register_operand" "v")
   1840  1.6  mrg 			(match_operand:VFT 2 "register_operand" "v"))
   1841  1.7  mrg 	 (ge:<TOINTVEC> (match_dup         2)
   1842  1.6  mrg 			(match_dup         1))))]
   1843  1.6  mrg   "TARGET_VXE"
   1844  1.6  mrg   "<vw>fke<sdx>b\t%v0,%v1,%v2"
   1845  1.6  mrg   [(set_attr "op_type" "VRR")])
   1846  1.6  mrg 
   1847  1.6  mrg ; vfkhsb, vfkhdb, wfkhxb: signaling > comparison (a > b)
   1848  1.6  mrg (define_insn "*vec_cmpgt<mode>_signaling_nocc"
   1849  1.7  mrg   [(set (match_operand:<TOINTVEC>         0 "register_operand" "=v")
   1850  1.7  mrg 	(gt:<TOINTVEC> (match_operand:VFT 1 "register_operand" "v")
   1851  1.6  mrg 		       (match_operand:VFT 2 "register_operand" "v")))]
   1852  1.6  mrg   "TARGET_VXE"
   1853  1.6  mrg   "<vw>fkh<sdx>b\t%v0,%v1,%v2"
   1854  1.6  mrg   [(set_attr "op_type" "VRR")])
   1855  1.6  mrg 
   1856  1.6  mrg (define_insn "*vec_cmpgt<mode>_signaling_finite_nocc"
   1857  1.7  mrg   [(set (match_operand:<TOINTVEC>         0 "register_operand" "=v")
   1858  1.7  mrg 	(gt:<TOINTVEC> (match_operand:VFT 1 "register_operand" "v")
   1859  1.6  mrg 		       (match_operand:VFT 2 "register_operand" "v")))]
   1860  1.6  mrg   "TARGET_NONSIGNALING_VECTOR_COMPARE_OK"
   1861  1.6  mrg   "<vw>fch<sdx>b\t%v0,%v1,%v2"
   1862  1.6  mrg   [(set_attr "op_type" "VRR")])
   1863  1.6  mrg 
   1864  1.6  mrg ; vfkhesb, vfkhedb, wfkhexb: signaling >= comparison (a >= b)
   1865  1.6  mrg (define_insn "*vec_cmpge<mode>_signaling_nocc"
   1866  1.7  mrg   [(set (match_operand:<TOINTVEC>         0 "register_operand" "=v")
   1867  1.7  mrg 	(ge:<TOINTVEC> (match_operand:VFT 1 "register_operand" "v")
   1868  1.6  mrg 		       (match_operand:VFT 2 "register_operand" "v")))]
   1869  1.6  mrg   "TARGET_VXE"
   1870  1.6  mrg   "<vw>fkhe<sdx>b\t%v0,%v1,%v2"
   1871  1.6  mrg   [(set_attr "op_type" "VRR")])
   1872  1.6  mrg 
   1873  1.6  mrg (define_insn "*vec_cmpge<mode>_signaling_finite_nocc"
   1874  1.7  mrg   [(set (match_operand:<TOINTVEC>         0 "register_operand" "=v")
   1875  1.7  mrg 	(ge:<TOINTVEC> (match_operand:VFT 1 "register_operand" "v")
   1876  1.6  mrg 		       (match_operand:VFT 2 "register_operand" "v")))]
   1877  1.6  mrg   "TARGET_NONSIGNALING_VECTOR_COMPARE_OK"
   1878  1.6  mrg   "<vw>fche<sdx>b\t%v0,%v1,%v2"
   1879  1.1  mrg   [(set_attr "op_type" "VRR")])
   1880  1.1  mrg 
   1881  1.1  mrg ; Expanders for not directly supported comparisons
   1882  1.6  mrg ; Signaling comparisons must be expressed via signaling rtxes only,
   1883  1.6  mrg ; and quiet comparisons must be expressed via quiet rtxes only.
   1884  1.6  mrg 
   1885  1.6  mrg ; UNGT a u> b -> !!(b u< a)
   1886  1.6  mrg (define_expand "vec_cmpungt<mode>"
   1887  1.7  mrg   [(set (match_operand:<TOINTVEC>            0 "register_operand" "=v")
   1888  1.7  mrg 	(not:<TOINTVEC>
   1889  1.7  mrg 	 (unlt:<TOINTVEC> (match_operand:VFT 2 "register_operand" "v")
   1890  1.6  mrg 			  (match_operand:VFT 1 "register_operand" "v"))))
   1891  1.6  mrg    (set (match_dup                           0)
   1892  1.7  mrg 	(not:<TOINTVEC> (match_dup           0)))]
   1893  1.6  mrg   "TARGET_VX")
   1894  1.6  mrg 
   1895  1.6  mrg ; UNGE a u>= b -> !!(a u>= b)
   1896  1.6  mrg (define_expand "vec_cmpunge<mode>"
   1897  1.7  mrg   [(set (match_operand:<TOINTVEC>            0 "register_operand" "=v")
   1898  1.7  mrg 	(not:<TOINTVEC>
   1899  1.7  mrg 	 (unge:<TOINTVEC> (match_operand:VFT 1 "register_operand" "v")
   1900  1.6  mrg 			  (match_operand:VFT 2 "register_operand" "v"))))
   1901  1.6  mrg    (set (match_dup                           0)
   1902  1.7  mrg 	(not:<TOINTVEC> (match_dup           0)))]
   1903  1.6  mrg   "TARGET_VX")
   1904  1.1  mrg 
   1905  1.6  mrg ; UNEQ a u== b -> !(!(a u>= b) | !(b u>= a))
   1906  1.3  mrg (define_expand "vec_cmpuneq<mode>"
   1907  1.7  mrg   [(set (match_operand:<TOINTVEC>            0 "register_operand" "=v")
   1908  1.7  mrg 	(not:<TOINTVEC>
   1909  1.7  mrg 	 (unge:<TOINTVEC> (match_operand:VFT 1 "register_operand"  "v")
   1910  1.6  mrg 		          (match_operand:VFT 2 "register_operand"  "v"))))
   1911  1.6  mrg    (set (match_dup                           3)
   1912  1.7  mrg 	(not:<TOINTVEC>
   1913  1.7  mrg 	 (unge:<TOINTVEC> (match_dup         2)
   1914  1.6  mrg 	                  (match_dup         1))))
   1915  1.6  mrg    (set (match_dup                           0)
   1916  1.7  mrg 	(ior:<TOINTVEC> (match_dup           0)
   1917  1.6  mrg 			(match_dup           3)))
   1918  1.6  mrg    (set (match_dup                           0)
   1919  1.7  mrg 	(not:<TOINTVEC> (match_dup           0)))]
   1920  1.1  mrg   "TARGET_VX"
   1921  1.1  mrg {
   1922  1.7  mrg   operands[3] = gen_reg_rtx (<TOINTVEC>mode);
   1923  1.1  mrg })
   1924  1.1  mrg 
   1925  1.1  mrg ; LTGT a <> b -> a > b | b > a
   1926  1.3  mrg (define_expand "vec_cmpltgt<mode>"
   1927  1.7  mrg   [(set (match_operand:<TOINTVEC>         0 "register_operand" "=v")
   1928  1.7  mrg 	(gt:<TOINTVEC> (match_operand:VFT 1 "register_operand"  "v")
   1929  1.3  mrg 		    (match_operand:VFT 2 "register_operand"  "v")))
   1930  1.7  mrg    (set (match_dup 3) (gt:<TOINTVEC> (match_dup 2) (match_dup 1)))
   1931  1.7  mrg    (set (match_dup 0) (ior:<TOINTVEC> (match_dup 0) (match_dup 3)))]
   1932  1.6  mrg   "TARGET_VXE"
   1933  1.1  mrg {
   1934  1.7  mrg   operands[3] = gen_reg_rtx (<TOINTVEC>mode);
   1935  1.1  mrg })
   1936  1.1  mrg 
   1937  1.6  mrg ; ORDERED (a, b): !(a u< b) | !(a u>= b)
   1938  1.6  mrg (define_expand "vec_cmpordered<mode>"
   1939  1.7  mrg   [(set (match_operand:<TOINTVEC>            0 "register_operand" "=v")
   1940  1.7  mrg 	(not:<TOINTVEC>
   1941  1.7  mrg 	 (unlt:<TOINTVEC> (match_operand:VFT 1 "register_operand" "v")
   1942  1.6  mrg 		          (match_operand:VFT 2 "register_operand" "v"))))
   1943  1.6  mrg    (set (match_dup                           3)
   1944  1.7  mrg 	(not:<TOINTVEC>
   1945  1.7  mrg 	 (unge:<TOINTVEC> (match_dup         1)
   1946  1.6  mrg 			  (match_dup         2))))
   1947  1.6  mrg    (set (match_dup                           0)
   1948  1.7  mrg 	(ior:<TOINTVEC> (match_dup           0)
   1949  1.6  mrg 			(match_dup           3)))]
   1950  1.1  mrg   "TARGET_VX"
   1951  1.1  mrg {
   1952  1.7  mrg   operands[3] = gen_reg_rtx (<TOINTVEC>mode);
   1953  1.1  mrg })
   1954  1.1  mrg 
   1955  1.6  mrg ; UNORDERED (a, b): !ORDERED (a, b)
   1956  1.6  mrg (define_expand "vec_cmpunordered<mode>"
   1957  1.7  mrg   [(match_operand:<TOINTVEC> 0 "register_operand" "=v")
   1958  1.6  mrg    (match_operand:VFT        1 "register_operand" "v")
   1959  1.6  mrg    (match_operand:VFT        2 "register_operand" "v")]
   1960  1.4  mrg   "TARGET_VX"
   1961  1.4  mrg {
   1962  1.6  mrg   emit_insn (gen_vec_cmpordered<mode> (operands[0], operands[1], operands[2]));
   1963  1.6  mrg   emit_insn (gen_rtx_SET (operands[0],
   1964  1.7  mrg 	     gen_rtx_NOT (<TOINTVEC>mode, operands[0])));
   1965  1.4  mrg   DONE;
   1966  1.4  mrg })
   1967  1.4  mrg 
   1968  1.6  mrg (define_code_iterator VEC_CMP_EXPAND
   1969  1.6  mrg   [ungt unge uneq ltgt ordered unordered])
   1970  1.1  mrg 
   1971  1.6  mrg (define_expand "vec_cmp<code>"
   1972  1.4  mrg   [(match_operand 0 "register_operand" "")
   1973  1.6  mrg    (VEC_CMP_EXPAND (match_operand 1 "register_operand" "")
   1974  1.6  mrg                    (match_operand 2 "register_operand" ""))]
   1975  1.4  mrg   "TARGET_VX"
   1976  1.4  mrg {
   1977  1.4  mrg   if (GET_MODE (operands[1]) == V4SFmode)
   1978  1.6  mrg     emit_insn (gen_vec_cmp<code>v4sf (operands[0], operands[1], operands[2]));
   1979  1.4  mrg   else if (GET_MODE (operands[1]) == V2DFmode)
   1980  1.6  mrg     emit_insn (gen_vec_cmp<code>v2df (operands[0], operands[1], operands[2]));
   1981  1.4  mrg   else
   1982  1.4  mrg     gcc_unreachable ();
   1983  1.4  mrg 
   1984  1.4  mrg   DONE;
   1985  1.4  mrg })
   1986  1.4  mrg 
   1987  1.3  mrg (define_insn "*vec_load_pair<mode>"
   1988  1.7  mrg   [(set (match_operand:V_HW_2                       0 "register_operand" "=v,v")
   1989  1.7  mrg 	(vec_concat:V_HW_2 (match_operand:<non_vec> 1 "register_operand"  "d,v")
   1990  1.7  mrg 			   (match_operand:<non_vec> 2 "register_operand"  "d,v")))]
   1991  1.1  mrg   "TARGET_VX"
   1992  1.3  mrg   "@
   1993  1.3  mrg    vlvgp\t%v0,%1,%2
   1994  1.3  mrg    vmrhg\t%v0,%v1,%v2"
   1995  1.3  mrg   [(set_attr "op_type" "VRR,VRR")])
   1996  1.1  mrg 
   1997  1.1  mrg (define_insn "vllv16qi"
   1998  1.1  mrg   [(set (match_operand:V16QI              0 "register_operand" "=v")
   1999  1.1  mrg 	(unspec:V16QI [(match_operand:SI  1 "register_operand"  "d")
   2000  1.1  mrg 		       (match_operand:BLK 2 "memory_operand"    "Q")]
   2001  1.1  mrg 		      UNSPEC_VEC_LOAD_LEN))]
   2002  1.1  mrg   "TARGET_VX"
   2003  1.1  mrg   "vll\t%v0,%1,%2"
   2004  1.1  mrg   [(set_attr "op_type" "VRS")])
   2005  1.1  mrg 
   2006  1.7  mrg ; vfeebs, vfeehs, vfeefs
   2007  1.7  mrg ; vfeezbs, vfeezhs, vfeezfs
   2008  1.7  mrg (define_insn "@vec_vfees<mode>"
   2009  1.7  mrg   [(set (match_operand:VI_HW_QHS 0 "register_operand" "=v")
   2010  1.7  mrg 	(unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "v")
   2011  1.7  mrg 			   (match_operand:VI_HW_QHS 2 "register_operand" "v")
   2012  1.7  mrg 			   (match_operand:QI 3 "const_mask_operand" "C")]
   2013  1.7  mrg 			  UNSPEC_VEC_VFEE))
   2014  1.7  mrg    (set (reg:CCRAW CC_REGNUM)
   2015  1.7  mrg 	(unspec:CCRAW [(match_dup 1)
   2016  1.7  mrg 		       (match_dup 2)
   2017  1.7  mrg 		       (match_dup 3)]
   2018  1.7  mrg 		      UNSPEC_VEC_VFEECC))]
   2019  1.7  mrg   "TARGET_VX"
   2020  1.7  mrg {
   2021  1.7  mrg   unsigned HOST_WIDE_INT flags = UINTVAL (operands[3]);
   2022  1.7  mrg 
   2023  1.7  mrg   gcc_assert (!(flags & ~(VSTRING_FLAG_ZS | VSTRING_FLAG_CS)));
   2024  1.7  mrg   flags &= ~VSTRING_FLAG_CS;
   2025  1.7  mrg 
   2026  1.7  mrg   if (flags == VSTRING_FLAG_ZS)
   2027  1.7  mrg     return "vfeez<bhfgq>s\t%v0,%v1,%v2";
   2028  1.7  mrg   return "vfee<bhfgq>s\t%v0,%v1,%v2";
   2029  1.7  mrg }
   2030  1.7  mrg   [(set_attr "op_type" "VRR")])
   2031  1.7  mrg 
   2032  1.1  mrg ; vfenebs, vfenehs, vfenefs
   2033  1.1  mrg ; vfenezbs, vfenezhs, vfenezfs
   2034  1.1  mrg (define_insn "vec_vfenes<mode>"
   2035  1.1  mrg   [(set (match_operand:VI_HW_QHS 0 "register_operand" "=v")
   2036  1.1  mrg 	(unspec:VI_HW_QHS [(match_operand:VI_HW_QHS 1 "register_operand" "v")
   2037  1.1  mrg 			   (match_operand:VI_HW_QHS 2 "register_operand" "v")
   2038  1.1  mrg 			   (match_operand:QI 3 "const_mask_operand" "C")]
   2039  1.1  mrg 			  UNSPEC_VEC_VFENE))
   2040  1.1  mrg    (set (reg:CCRAW CC_REGNUM)
   2041  1.1  mrg 	(unspec:CCRAW [(match_dup 1)
   2042  1.1  mrg 		       (match_dup 2)
   2043  1.1  mrg 		       (match_dup 3)]
   2044  1.1  mrg 		      UNSPEC_VEC_VFENECC))]
   2045  1.1  mrg   "TARGET_VX"
   2046  1.1  mrg {
   2047  1.3  mrg   unsigned HOST_WIDE_INT flags = UINTVAL (operands[3]);
   2048  1.1  mrg 
   2049  1.1  mrg   gcc_assert (!(flags & ~(VSTRING_FLAG_ZS | VSTRING_FLAG_CS)));
   2050  1.1  mrg   flags &= ~VSTRING_FLAG_CS;
   2051  1.1  mrg 
   2052  1.1  mrg   if (flags == VSTRING_FLAG_ZS)
   2053  1.1  mrg     return "vfenez<bhfgq>s\t%v0,%v1,%v2";
   2054  1.1  mrg   return "vfene<bhfgq>s\t%v0,%v1,%v2";
   2055  1.1  mrg }
   2056  1.1  mrg   [(set_attr "op_type" "VRR")])
   2057  1.1  mrg 
   2058  1.1  mrg 
   2059  1.1  mrg ; Vector select
   2060  1.1  mrg 
   2061  1.1  mrg ; The following splitters simplify vec_sel for constant 0 or -1
   2062  1.1  mrg ; selection sources.  This is required to generate efficient code for
   2063  1.1  mrg ; vcond.
   2064  1.1  mrg 
   2065  1.1  mrg ; a = b == c;
   2066  1.1  mrg (define_split
   2067  1.1  mrg   [(set (match_operand:V 0 "register_operand" "")
   2068  1.1  mrg 	(if_then_else:V
   2069  1.7  mrg 	 (eq (match_operand:<TOINTVEC> 3 "register_operand" "")
   2070  1.1  mrg 	     (match_operand:V 4 "const0_operand" ""))
   2071  1.1  mrg 	 (match_operand:V 1 "const0_operand" "")
   2072  1.1  mrg 	 (match_operand:V 2 "all_ones_operand" "")))]
   2073  1.1  mrg   "TARGET_VX"
   2074  1.1  mrg   [(set (match_dup 0) (match_dup 3))]
   2075  1.1  mrg {
   2076  1.1  mrg   PUT_MODE (operands[3], <V:MODE>mode);
   2077  1.1  mrg })
   2078  1.1  mrg 
   2079  1.1  mrg ; a = ~(b == c)
   2080  1.1  mrg (define_split
   2081  1.1  mrg   [(set (match_operand:V 0 "register_operand" "")
   2082  1.1  mrg 	(if_then_else:V
   2083  1.7  mrg 	 (eq (match_operand:<TOINTVEC> 3 "register_operand" "")
   2084  1.1  mrg 	     (match_operand:V 4 "const0_operand" ""))
   2085  1.1  mrg 	 (match_operand:V 1 "all_ones_operand" "")
   2086  1.1  mrg 	 (match_operand:V 2 "const0_operand" "")))]
   2087  1.1  mrg   "TARGET_VX"
   2088  1.1  mrg   [(set (match_dup 0) (not:V (match_dup 3)))]
   2089  1.1  mrg {
   2090  1.1  mrg   PUT_MODE (operands[3], <V:MODE>mode);
   2091  1.1  mrg })
   2092  1.1  mrg 
   2093  1.1  mrg ; a = b != c
   2094  1.1  mrg (define_split
   2095  1.1  mrg   [(set (match_operand:V 0 "register_operand" "")
   2096  1.1  mrg 	(if_then_else:V
   2097  1.7  mrg 	 (ne (match_operand:<TOINTVEC> 3 "register_operand" "")
   2098  1.1  mrg 	     (match_operand:V 4 "const0_operand" ""))
   2099  1.1  mrg 	 (match_operand:V 1 "all_ones_operand" "")
   2100  1.1  mrg 	 (match_operand:V 2 "const0_operand" "")))]
   2101  1.1  mrg   "TARGET_VX"
   2102  1.1  mrg   [(set (match_dup 0) (match_dup 3))]
   2103  1.1  mrg {
   2104  1.1  mrg   PUT_MODE (operands[3], <V:MODE>mode);
   2105  1.1  mrg })
   2106  1.1  mrg 
   2107  1.1  mrg ; a = ~(b != c)
   2108  1.1  mrg (define_split
   2109  1.1  mrg   [(set (match_operand:V 0 "register_operand" "")
   2110  1.1  mrg 	(if_then_else:V
   2111  1.7  mrg 	 (ne (match_operand:<TOINTVEC> 3 "register_operand" "")
   2112  1.1  mrg 	     (match_operand:V 4 "const0_operand" ""))
   2113  1.1  mrg 	 (match_operand:V 1 "const0_operand" "")
   2114  1.1  mrg 	 (match_operand:V 2 "all_ones_operand" "")))]
   2115  1.1  mrg   "TARGET_VX"
   2116  1.1  mrg   [(set (match_dup 0) (not:V (match_dup 3)))]
   2117  1.1  mrg {
   2118  1.1  mrg   PUT_MODE (operands[3], <V:MODE>mode);
   2119  1.1  mrg })
   2120  1.1  mrg 
   2121  1.1  mrg ; op0 = op3 == 0 ? op1 : op2
   2122  1.1  mrg (define_insn "*vec_sel0<mode>"
   2123  1.1  mrg   [(set (match_operand:V 0 "register_operand" "=v")
   2124  1.1  mrg 	(if_then_else:V
   2125  1.7  mrg 	 (eq (match_operand:<TOINTVEC> 3 "register_operand" "v")
   2126  1.7  mrg 	     (match_operand:<TOINTVEC> 4 "const0_operand" ""))
   2127  1.1  mrg 	 (match_operand:V 1 "register_operand" "v")
   2128  1.1  mrg 	 (match_operand:V 2 "register_operand" "v")))]
   2129  1.1  mrg   "TARGET_VX"
   2130  1.1  mrg   "vsel\t%v0,%2,%1,%3"
   2131  1.1  mrg   [(set_attr "op_type" "VRR")])
   2132  1.1  mrg 
   2133  1.1  mrg ; op0 = !op3 == 0 ? op1 : op2
   2134  1.1  mrg (define_insn "*vec_sel0<mode>"
   2135  1.1  mrg   [(set (match_operand:V 0 "register_operand" "=v")
   2136  1.1  mrg 	(if_then_else:V
   2137  1.7  mrg 	 (eq (not:<TOINTVEC> (match_operand:<TOINTVEC> 3 "register_operand" "v"))
   2138  1.7  mrg 	     (match_operand:<TOINTVEC> 4 "const0_operand" ""))
   2139  1.1  mrg 	 (match_operand:V 1 "register_operand" "v")
   2140  1.1  mrg 	 (match_operand:V 2 "register_operand" "v")))]
   2141  1.1  mrg   "TARGET_VX"
   2142  1.1  mrg   "vsel\t%v0,%1,%2,%3"
   2143  1.1  mrg   [(set_attr "op_type" "VRR")])
   2144  1.1  mrg 
   2145  1.1  mrg ; op0 = op3 == -1 ? op1 : op2
   2146  1.1  mrg (define_insn "*vec_sel1<mode>"
   2147  1.1  mrg   [(set (match_operand:V 0 "register_operand" "=v")
   2148  1.1  mrg 	(if_then_else:V
   2149  1.7  mrg 	 (eq (match_operand:<TOINTVEC> 3 "register_operand" "v")
   2150  1.7  mrg 	     (match_operand:<TOINTVEC> 4 "all_ones_operand" ""))
   2151  1.1  mrg 	 (match_operand:V 1 "register_operand" "v")
   2152  1.1  mrg 	 (match_operand:V 2 "register_operand" "v")))]
   2153  1.1  mrg   "TARGET_VX"
   2154  1.1  mrg   "vsel\t%v0,%1,%2,%3"
   2155  1.1  mrg   [(set_attr "op_type" "VRR")])
   2156  1.1  mrg 
   2157  1.1  mrg ; op0 = !op3 == -1 ? op1 : op2
   2158  1.1  mrg (define_insn "*vec_sel1<mode>"
   2159  1.1  mrg   [(set (match_operand:V 0 "register_operand" "=v")
   2160  1.1  mrg 	(if_then_else:V
   2161  1.7  mrg 	 (eq (not:<TOINTVEC> (match_operand:<TOINTVEC> 3 "register_operand" "v"))
   2162  1.7  mrg 	     (match_operand:<TOINTVEC> 4 "all_ones_operand" ""))
   2163  1.1  mrg 	 (match_operand:V 1 "register_operand" "v")
   2164  1.1  mrg 	 (match_operand:V 2 "register_operand" "v")))]
   2165  1.1  mrg   "TARGET_VX"
   2166  1.1  mrg   "vsel\t%v0,%2,%1,%3"
   2167  1.1  mrg   [(set_attr "op_type" "VRR")])
   2168  1.1  mrg 
   2169  1.3  mrg ; vec_pack_trunc
   2170  1.3  mrg 
   2171  1.3  mrg ; vpkh, vpkf, vpkg
   2172  1.3  mrg (define_insn "vec_pack_trunc_<mode>"
   2173  1.3  mrg   [(set (match_operand:<vec_half> 0 "register_operand" "=v")
   2174  1.3  mrg 	(vec_concat:<vec_half>
   2175  1.3  mrg 	 (truncate:<vec_halfhalf>
   2176  1.3  mrg 	  (match_operand:VI_HW_HSD 1 "register_operand" "v"))
   2177  1.3  mrg 	 (truncate:<vec_halfhalf>
   2178  1.3  mrg 	  (match_operand:VI_HW_HSD 2 "register_operand" "v"))))]
   2179  1.3  mrg   "TARGET_VX"
   2180  1.3  mrg   "vpk<bhfgq>\t%0,%1,%2"
   2181  1.3  mrg   [(set_attr "op_type" "VRR")])
   2182  1.3  mrg 
   2183  1.3  mrg ; vpksh, vpksf, vpksg
   2184  1.3  mrg (define_insn "vec_pack_ssat_<mode>"
   2185  1.3  mrg   [(set (match_operand:<vec_half> 0 "register_operand" "=v")
   2186  1.3  mrg 	(vec_concat:<vec_half>
   2187  1.3  mrg 	 (ss_truncate:<vec_halfhalf>
   2188  1.3  mrg 	  (match_operand:VI_HW_HSD 1 "register_operand" "v"))
   2189  1.3  mrg 	 (ss_truncate:<vec_halfhalf>
   2190  1.3  mrg 	  (match_operand:VI_HW_HSD 2 "register_operand" "v"))))]
   2191  1.3  mrg   "TARGET_VX"
   2192  1.3  mrg   "vpks<bhfgq>\t%0,%1,%2"
   2193  1.3  mrg   [(set_attr "op_type" "VRR")])
   2194  1.3  mrg 
   2195  1.3  mrg ; vpklsh, vpklsf, vpklsg
   2196  1.3  mrg (define_insn "vec_pack_usat_<mode>"
   2197  1.3  mrg   [(set (match_operand:<vec_half> 0 "register_operand" "=v")
   2198  1.3  mrg 	(vec_concat:<vec_half>
   2199  1.3  mrg 	 (us_truncate:<vec_halfhalf>
   2200  1.3  mrg 	  (match_operand:VI_HW_HSD 1 "register_operand" "v"))
   2201  1.3  mrg 	 (us_truncate:<vec_halfhalf>
   2202  1.3  mrg 	  (match_operand:VI_HW_HSD 2 "register_operand" "v"))))]
   2203  1.3  mrg   "TARGET_VX"
   2204  1.3  mrg   "vpkls<bhfgq>\t%0,%1,%2"
   2205  1.3  mrg   [(set_attr "op_type" "VRR")])
   2206  1.3  mrg 
   2207  1.3  mrg ;; vector unpack v16qi
   2208  1.1  mrg 
   2209  1.3  mrg ; signed
   2210  1.3  mrg 
   2211  1.3  mrg (define_insn "vec_unpacks_hi_v16qi"
   2212  1.3  mrg   [(set (match_operand:V8HI 0 "register_operand" "=v")
   2213  1.3  mrg 	(sign_extend:V8HI
   2214  1.3  mrg 	 (vec_select:V8QI
   2215  1.3  mrg 	  (match_operand:V16QI 1 "register_operand" "v")
   2216  1.3  mrg 	  (parallel [(const_int 0)(const_int 1)(const_int 2)(const_int 3)
   2217  1.3  mrg 		     (const_int 4)(const_int 5)(const_int 6)(const_int 7)]))))]
   2218  1.3  mrg   "TARGET_VX"
   2219  1.3  mrg   "vuphb\t%0,%1"
   2220  1.3  mrg   [(set_attr "op_type" "VRR")])
   2221  1.3  mrg 
   2222  1.4  mrg (define_insn "vec_unpacks_lo_v16qi"
   2223  1.3  mrg   [(set (match_operand:V8HI 0 "register_operand" "=v")
   2224  1.3  mrg 	(sign_extend:V8HI
   2225  1.3  mrg 	 (vec_select:V8QI
   2226  1.3  mrg 	  (match_operand:V16QI 1 "register_operand" "v")
   2227  1.3  mrg 	  (parallel [(const_int 8) (const_int 9) (const_int 10)(const_int 11)
   2228  1.3  mrg 		     (const_int 12)(const_int 13)(const_int 14)(const_int 15)]))))]
   2229  1.3  mrg   "TARGET_VX"
   2230  1.3  mrg   "vuplb\t%0,%1"
   2231  1.3  mrg   [(set_attr "op_type" "VRR")])
   2232  1.3  mrg 
   2233  1.3  mrg ; unsigned
   2234  1.3  mrg 
   2235  1.3  mrg (define_insn "vec_unpacku_hi_v16qi"
   2236  1.3  mrg   [(set (match_operand:V8HI 0 "register_operand" "=v")
   2237  1.3  mrg 	(zero_extend:V8HI
   2238  1.3  mrg 	 (vec_select:V8QI
   2239  1.3  mrg 	  (match_operand:V16QI 1 "register_operand" "v")
   2240  1.3  mrg 	  (parallel [(const_int 0)(const_int 1)(const_int 2)(const_int 3)
   2241  1.3  mrg 		     (const_int 4)(const_int 5)(const_int 6)(const_int 7)]))))]
   2242  1.3  mrg   "TARGET_VX"
   2243  1.3  mrg   "vuplhb\t%0,%1"
   2244  1.3  mrg   [(set_attr "op_type" "VRR")])
   2245  1.3  mrg 
   2246  1.4  mrg (define_insn "vec_unpacku_lo_v16qi"
   2247  1.3  mrg   [(set (match_operand:V8HI 0 "register_operand" "=v")
   2248  1.3  mrg 	(zero_extend:V8HI
   2249  1.3  mrg 	 (vec_select:V8QI
   2250  1.3  mrg 	  (match_operand:V16QI 1 "register_operand" "v")
   2251  1.3  mrg 	  (parallel [(const_int 8) (const_int 9) (const_int 10)(const_int 11)
   2252  1.3  mrg 		     (const_int 12)(const_int 13)(const_int 14)(const_int 15)]))))]
   2253  1.3  mrg   "TARGET_VX"
   2254  1.3  mrg   "vupllb\t%0,%1"
   2255  1.3  mrg   [(set_attr "op_type" "VRR")])
   2256  1.3  mrg 
   2257  1.3  mrg ;; vector unpack v8hi
   2258  1.3  mrg 
   2259  1.3  mrg ; signed
   2260  1.3  mrg 
   2261  1.3  mrg (define_insn "vec_unpacks_hi_v8hi"
   2262  1.3  mrg   [(set (match_operand:V4SI 0 "register_operand" "=v")
   2263  1.3  mrg 	(sign_extend:V4SI
   2264  1.3  mrg 	 (vec_select:V4HI
   2265  1.3  mrg 	  (match_operand:V8HI 1 "register_operand" "v")
   2266  1.3  mrg 	  (parallel [(const_int 0)(const_int 1)(const_int 2)(const_int 3)]))))]
   2267  1.3  mrg   "TARGET_VX"
   2268  1.3  mrg   "vuphh\t%0,%1"
   2269  1.3  mrg   [(set_attr "op_type" "VRR")])
   2270  1.3  mrg 
   2271  1.3  mrg (define_insn "vec_unpacks_lo_v8hi"
   2272  1.3  mrg   [(set (match_operand:V4SI 0 "register_operand" "=v")
   2273  1.3  mrg 	(sign_extend:V4SI
   2274  1.3  mrg 	 (vec_select:V4HI
   2275  1.3  mrg 	  (match_operand:V8HI 1 "register_operand" "v")
   2276  1.3  mrg 	  (parallel [(const_int 4)(const_int 5)(const_int 6)(const_int 7)]))))]
   2277  1.3  mrg   "TARGET_VX"
   2278  1.3  mrg   "vuplhw\t%0,%1"
   2279  1.3  mrg   [(set_attr "op_type" "VRR")])
   2280  1.3  mrg 
   2281  1.3  mrg ; unsigned
   2282  1.3  mrg 
   2283  1.3  mrg (define_insn "vec_unpacku_hi_v8hi"
   2284  1.3  mrg   [(set (match_operand:V4SI 0 "register_operand" "=v")
   2285  1.3  mrg 	(zero_extend:V4SI
   2286  1.3  mrg 	 (vec_select:V4HI
   2287  1.3  mrg 	  (match_operand:V8HI 1 "register_operand" "v")
   2288  1.3  mrg 	  (parallel [(const_int 0)(const_int 1)(const_int 2)(const_int 3)]))))]
   2289  1.3  mrg   "TARGET_VX"
   2290  1.3  mrg   "vuplhh\t%0,%1"
   2291  1.3  mrg   [(set_attr "op_type" "VRR")])
   2292  1.3  mrg 
   2293  1.3  mrg (define_insn "vec_unpacku_lo_v8hi"
   2294  1.3  mrg   [(set (match_operand:V4SI 0 "register_operand" "=v")
   2295  1.3  mrg 	(zero_extend:V4SI
   2296  1.3  mrg 	 (vec_select:V4HI
   2297  1.3  mrg 	  (match_operand:V8HI 1 "register_operand" "v")
   2298  1.3  mrg 	  (parallel [(const_int 4)(const_int 5)(const_int 6)(const_int 7)]))))]
   2299  1.3  mrg   "TARGET_VX"
   2300  1.3  mrg   "vupllh\t%0,%1"
   2301  1.3  mrg   [(set_attr "op_type" "VRR")])
   2302  1.3  mrg 
   2303  1.3  mrg ;; vector unpack v4si
   2304  1.3  mrg 
   2305  1.3  mrg ; signed
   2306  1.3  mrg 
   2307  1.3  mrg (define_insn "vec_unpacks_hi_v4si"
   2308  1.3  mrg   [(set (match_operand:V2DI 0 "register_operand" "=v")
   2309  1.3  mrg 	(sign_extend:V2DI
   2310  1.3  mrg 	 (vec_select:V2SI
   2311  1.3  mrg 	  (match_operand:V4SI 1 "register_operand" "v")
   2312  1.3  mrg 	  (parallel [(const_int 0)(const_int 1)]))))]
   2313  1.3  mrg   "TARGET_VX"
   2314  1.3  mrg   "vuphf\t%0,%1"
   2315  1.3  mrg   [(set_attr "op_type" "VRR")])
   2316  1.3  mrg 
   2317  1.3  mrg (define_insn "vec_unpacks_lo_v4si"
   2318  1.3  mrg   [(set (match_operand:V2DI 0 "register_operand" "=v")
   2319  1.3  mrg 	(sign_extend:V2DI
   2320  1.3  mrg 	 (vec_select:V2SI
   2321  1.3  mrg 	  (match_operand:V4SI 1 "register_operand" "v")
   2322  1.3  mrg 	  (parallel [(const_int 2)(const_int 3)]))))]
   2323  1.3  mrg   "TARGET_VX"
   2324  1.3  mrg   "vuplf\t%0,%1"
   2325  1.3  mrg   [(set_attr "op_type" "VRR")])
   2326  1.3  mrg 
   2327  1.3  mrg ; unsigned
   2328  1.3  mrg 
   2329  1.3  mrg (define_insn "vec_unpacku_hi_v4si"
   2330  1.3  mrg   [(set (match_operand:V2DI 0 "register_operand" "=v")
   2331  1.3  mrg 	(zero_extend:V2DI
   2332  1.3  mrg 	 (vec_select:V2SI
   2333  1.3  mrg 	  (match_operand:V4SI 1 "register_operand" "v")
   2334  1.3  mrg 	  (parallel [(const_int 0)(const_int 1)]))))]
   2335  1.3  mrg   "TARGET_VX"
   2336  1.3  mrg   "vuplhf\t%0,%1"
   2337  1.3  mrg   [(set_attr "op_type" "VRR")])
   2338  1.3  mrg 
   2339  1.3  mrg (define_insn "vec_unpacku_lo_v4si"
   2340  1.3  mrg   [(set (match_operand:V2DI 0 "register_operand" "=v")
   2341  1.3  mrg 	(zero_extend:V2DI
   2342  1.3  mrg 	 (vec_select:V2SI
   2343  1.3  mrg 	  (match_operand:V4SI 1 "register_operand" "v")
   2344  1.3  mrg 	  (parallel [(const_int 2)(const_int 3)]))))]
   2345  1.3  mrg   "TARGET_VX"
   2346  1.3  mrg   "vupllf\t%0,%1"
   2347  1.3  mrg   [(set_attr "op_type" "VRR")])
   2348  1.3  mrg 
   2349  1.3  mrg ;; vector load lengthened
   2350  1.3  mrg 
   2351  1.4  mrg ; vflls float -> double
   2352  1.3  mrg (define_insn "*vec_extendv4sf"
   2353  1.3  mrg   [(set (match_operand:V2DF 0 "register_operand" "=v")
   2354  1.3  mrg 	(float_extend:V2DF
   2355  1.3  mrg 	 (vec_select:V2SF
   2356  1.3  mrg 	  (match_operand:V4SF 1 "register_operand" "v")
   2357  1.3  mrg 	  (parallel [(const_int 0) (const_int 2)]))))]
   2358  1.3  mrg   "TARGET_VX"
   2359  1.3  mrg   "vldeb\t%v0,%v1"
   2360  1.3  mrg   [(set_attr "op_type" "VRR")])
   2361  1.3  mrg 
   2362  1.4  mrg (define_expand "vec_unpacks_lo_v4sf"
   2363  1.4  mrg   [(set (match_dup 2)
   2364  1.7  mrg         (vec_select:V4SF
   2365  1.7  mrg 	 (vec_concat:V8SF (match_operand:V4SF 1 "register_operand" "") (match_dup 1))
   2366  1.7  mrg 	 (match_dup 3)))
   2367  1.7  mrg    (set (match_operand:V2DF                   0 "register_operand" "")
   2368  1.4  mrg 	(float_extend:V2DF
   2369  1.4  mrg 	 (vec_select:V2SF
   2370  1.4  mrg 	  (match_dup 2)
   2371  1.4  mrg 	  (parallel [(const_int 0) (const_int 2)]))))]
   2372  1.4  mrg   "TARGET_VX"
   2373  1.7  mrg {
   2374  1.7  mrg   operands[2] = gen_reg_rtx(V4SFmode);
   2375  1.7  mrg   operands[3] = s390_expand_merge_perm_const (V4SFmode, false);
   2376  1.7  mrg })
   2377  1.4  mrg 
   2378  1.4  mrg (define_expand "vec_unpacks_hi_v4sf"
   2379  1.4  mrg   [(set (match_dup 2)
   2380  1.7  mrg         (vec_select:V4SF
   2381  1.7  mrg 	 (vec_concat:V8SF (match_operand:V4SF 1 "register_operand" "") (match_dup 1))
   2382  1.7  mrg 	 (match_dup 3)))
   2383  1.7  mrg    (set (match_operand:V2DF                   0 "register_operand" "")
   2384  1.4  mrg 	(float_extend:V2DF
   2385  1.4  mrg 	 (vec_select:V2SF
   2386  1.4  mrg 	  (match_dup 2)
   2387  1.4  mrg 	  (parallel [(const_int 0) (const_int 2)]))))]
   2388  1.4  mrg   "TARGET_VX"
   2389  1.7  mrg {
   2390  1.7  mrg   operands[2] = gen_reg_rtx(V4SFmode);
   2391  1.7  mrg   operands[3] = s390_expand_merge_perm_const (V4SFmode, true);
   2392  1.7  mrg })
   2393  1.4  mrg 
   2394  1.4  mrg 
   2395  1.4  mrg ; double -> long double
   2396  1.3  mrg (define_insn "*vec_extendv2df"
   2397  1.3  mrg   [(set (match_operand:V1TF 0 "register_operand" "=v")
   2398  1.3  mrg 	(float_extend:V1TF
   2399  1.3  mrg 	 (vec_select:V1DF
   2400  1.3  mrg 	  (match_operand:V2DF 1 "register_operand" "v")
   2401  1.3  mrg 	  (parallel [(const_int 0)]))))]
   2402  1.3  mrg   "TARGET_VXE"
   2403  1.3  mrg   "wflld\t%v0,%v1"
   2404  1.3  mrg   [(set_attr "op_type" "VRR")])
   2405  1.1  mrg 
   2406  1.4  mrg (define_expand "vec_unpacks_lo_v2df"
   2407  1.4  mrg   [(set (match_dup 2)
   2408  1.7  mrg         (vec_select:V2DF
   2409  1.7  mrg 	 (vec_concat:V4DF (match_operand:V2DF 1 "register_operand" "") (match_dup 1))
   2410  1.7  mrg 	 (match_dup 3)))
   2411  1.7  mrg    (set (match_operand:V1TF                   0 "register_operand" "")
   2412  1.4  mrg 	(float_extend:V1TF
   2413  1.4  mrg 	 (vec_select:V1DF
   2414  1.4  mrg 	  (match_dup 2)
   2415  1.4  mrg 	  (parallel [(const_int 0)]))))]
   2416  1.4  mrg   "TARGET_VXE"
   2417  1.7  mrg {
   2418  1.7  mrg   operands[2] = gen_reg_rtx (V2DFmode);
   2419  1.7  mrg   operands[3] = s390_expand_merge_perm_const (V2DFmode, false);
   2420  1.7  mrg })
   2421  1.4  mrg 
   2422  1.4  mrg (define_expand "vec_unpacks_hi_v2df"
   2423  1.4  mrg   [(set (match_dup 2)
   2424  1.7  mrg         (vec_select:V2DF
   2425  1.7  mrg 	 (vec_concat:V4DF (match_operand:V2DF 1 "register_operand" "") (match_dup 1))
   2426  1.7  mrg 	 (match_dup 3)))
   2427  1.7  mrg    (set (match_operand:V1TF                   0 "register_operand" "")
   2428  1.4  mrg 	(float_extend:V1TF
   2429  1.4  mrg 	 (vec_select:V1DF
   2430  1.4  mrg 	  (match_dup 2)
   2431  1.4  mrg 	  (parallel [(const_int 0)]))))]
   2432  1.4  mrg   "TARGET_VXE"
   2433  1.7  mrg {
   2434  1.7  mrg   operands[2] = gen_reg_rtx (V2DFmode);
   2435  1.7  mrg   operands[3] = s390_expand_merge_perm_const (V2DFmode, true);
   2436  1.7  mrg })
   2437  1.4  mrg 
   2438  1.4  mrg 
   2439  1.4  mrg ; 2 x v2df -> 1 x v4sf
   2440  1.4  mrg (define_expand "vec_pack_trunc_v2df"
   2441  1.4  mrg   [(set (match_dup 3)
   2442  1.4  mrg 	(unspec:V4SF [(match_operand:V2DF 1 "register_operand" "")
   2443  1.4  mrg 		      (const_int VEC_INEXACT)
   2444  1.4  mrg 		      (const_int VEC_RND_CURRENT)]
   2445  1.4  mrg 		     UNSPEC_VEC_VFLR))
   2446  1.4  mrg    (set (match_dup 4)
   2447  1.4  mrg 	(unspec:V4SF [(match_operand:V2DF 2 "register_operand" "")
   2448  1.4  mrg 		      (const_int VEC_INEXACT)
   2449  1.4  mrg 		      (const_int VEC_RND_CURRENT)]
   2450  1.4  mrg 		     UNSPEC_VEC_VFLR))
   2451  1.4  mrg    (set (match_dup 6)
   2452  1.4  mrg 	(unspec:V16QI [(subreg:V16QI (match_dup 3) 0)
   2453  1.4  mrg 		       (subreg:V16QI (match_dup 4) 0)
   2454  1.4  mrg 		       (match_dup 5)]
   2455  1.4  mrg 		      UNSPEC_VEC_PERM))
   2456  1.4  mrg    (set (match_operand:V4SF 0 "register_operand" "")
   2457  1.4  mrg 	(subreg:V4SF (match_dup 6) 0))]
   2458  1.4  mrg   "TARGET_VX"
   2459  1.4  mrg {
   2460  1.4  mrg   rtx constv, perm[16];
   2461  1.4  mrg   int i;
   2462  1.4  mrg 
   2463  1.4  mrg   for (i = 0; i < 4; ++i)
   2464  1.4  mrg     {
   2465  1.4  mrg       perm[i] = GEN_INT (i);
   2466  1.4  mrg       perm[i + 4] = GEN_INT (i + 8);
   2467  1.4  mrg       perm[i + 8] = GEN_INT (i + 16);
   2468  1.4  mrg       perm[i + 12] = GEN_INT (i + 24);
   2469  1.4  mrg     }
   2470  1.4  mrg   constv = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, perm));
   2471  1.4  mrg 
   2472  1.4  mrg   operands[3] = gen_reg_rtx (V4SFmode);
   2473  1.4  mrg   operands[4] = gen_reg_rtx (V4SFmode);
   2474  1.4  mrg   operands[5] = force_reg (V16QImode, constv);
   2475  1.4  mrg   operands[6] = gen_reg_rtx (V16QImode);
   2476  1.4  mrg })
   2477  1.4  mrg 
   2478  1.5  mrg ;
   2479  1.5  mrg ; BFP <-> integer conversions
   2480  1.5  mrg ;
   2481  1.5  mrg 
   2482  1.5  mrg ; signed integer to floating point
   2483  1.5  mrg 
   2484  1.5  mrg ; op2: inexact exception not suppressed (IEEE 754 2008)
   2485  1.5  mrg ; op3: according to current rounding mode
   2486  1.5  mrg ; vcdgb, vcefb
   2487  1.5  mrg (define_insn "float<VX_VEC_CONV_INT:mode><VX_VEC_CONV_BFP:mode>2"
   2488  1.5  mrg   [(set (match_operand:VX_VEC_CONV_BFP                        0 "register_operand" "=v")
   2489  1.5  mrg 	(float:VX_VEC_CONV_BFP (match_operand:VX_VEC_CONV_INT 1 "register_operand"  "v")))]
   2490  1.5  mrg   "TARGET_VX
   2491  1.5  mrg    && GET_MODE_UNIT_SIZE (<VX_VEC_CONV_INT:MODE>mode) == GET_MODE_UNIT_SIZE (<VX_VEC_CONV_BFP:MODE>mode)"
   2492  1.5  mrg   "vc<VX_VEC_CONV_BFP:xde><VX_VEC_CONV_INT:bhfgq>b\t%v0,%v1,0,0"
   2493  1.5  mrg   [(set_attr "op_type" "VRR")])
   2494  1.5  mrg 
   2495  1.7  mrg ; There is no instruction for loading a signed integer into an extended BFP
   2496  1.7  mrg ; operand in a VR, therefore we need to load it into a FPR pair first.
   2497  1.7  mrg (define_expand "float<mode>tf2_vr"
   2498  1.7  mrg   [(set (match_dup 2)
   2499  1.7  mrg 	(float:FPRX2 (match_operand:DSI 1 "register_operand" "")))
   2500  1.7  mrg    (set (match_operand:TF               0 "register_operand" "")
   2501  1.7  mrg 	(subreg:TF (match_dup 2) 0))]
   2502  1.7  mrg   "TARGET_VXE"
   2503  1.7  mrg {
   2504  1.7  mrg   operands[2] = gen_reg_rtx (FPRX2mode);
   2505  1.7  mrg })
   2506  1.7  mrg 
   2507  1.7  mrg (define_expand "float<mode>tf2"
   2508  1.7  mrg   [(match_operand:TF  0 "register_operand" "")
   2509  1.7  mrg    (match_operand:DSI 1 "register_operand" "")]
   2510  1.7  mrg   "HAVE_TF (float<mode>tf2)"
   2511  1.7  mrg   { EXPAND_TF (float<mode>tf2, 2); })
   2512  1.7  mrg 
   2513  1.5  mrg ; unsigned integer to floating point
   2514  1.5  mrg 
   2515  1.5  mrg ; op2: inexact exception not suppressed (IEEE 754 2008)
   2516  1.5  mrg ; op3: according to current rounding mode
   2517  1.5  mrg ; vcdlgb, vcelfb
   2518  1.5  mrg (define_insn "floatuns<VX_VEC_CONV_INT:mode><VX_VEC_CONV_BFP:mode>2"
   2519  1.5  mrg   [(set (match_operand:VX_VEC_CONV_BFP                                 0 "register_operand" "=v")
   2520  1.5  mrg 	(unsigned_float:VX_VEC_CONV_BFP (match_operand:VX_VEC_CONV_INT 1 "register_operand"  "v")))]
   2521  1.5  mrg   "TARGET_VX
   2522  1.5  mrg    && GET_MODE_UNIT_SIZE (<VX_VEC_CONV_INT:MODE>mode) == GET_MODE_UNIT_SIZE (<VX_VEC_CONV_BFP:MODE>mode)"
   2523  1.5  mrg   "vc<VX_VEC_CONV_BFP:xde>l<VX_VEC_CONV_INT:bhfgq>b\t%v0,%v1,0,0"
   2524  1.5  mrg   [(set_attr "op_type" "VRR")])
   2525  1.5  mrg 
   2526  1.7  mrg ; There is no instruction for loading an unsigned integer into an extended BFP
   2527  1.7  mrg ; operand in a VR, therefore load it into a FPR pair first.
   2528  1.7  mrg (define_expand "floatuns<mode>tf2_vr"
   2529  1.7  mrg   [(set (match_dup 2)
   2530  1.7  mrg 	(unsigned_float:FPRX2 (match_operand:GPR 1 "register_operand" "")))
   2531  1.7  mrg    (set (match_operand:TF                        0 "register_operand" "")
   2532  1.7  mrg 	(subreg:TF (match_dup 2) 0))]
   2533  1.7  mrg   "TARGET_VXE"
   2534  1.7  mrg {
   2535  1.7  mrg   operands[2] = gen_reg_rtx (FPRX2mode);
   2536  1.7  mrg })
   2537  1.7  mrg 
   2538  1.7  mrg (define_expand "floatuns<mode>tf2"
   2539  1.7  mrg   [(match_operand:TF  0 "register_operand" "")
   2540  1.7  mrg    (match_operand:GPR 1 "register_operand" "")]
   2541  1.7  mrg   "HAVE_TF (floatuns<mode>tf2)"
   2542  1.7  mrg   { EXPAND_TF (floatuns<mode>tf2, 2); })
   2543  1.7  mrg 
   2544  1.5  mrg ; floating point to signed integer
   2545  1.5  mrg 
   2546  1.5  mrg ; op2: inexact exception not suppressed (IEEE 754 2008)
   2547  1.5  mrg ; op3: rounding mode 5 (round towards 0 C11 6.3.1.4)
   2548  1.5  mrg ; vcgdb, vcfeb
   2549  1.5  mrg (define_insn "fix_trunc<VX_VEC_CONV_BFP:mode><VX_VEC_CONV_INT:mode>2"
   2550  1.5  mrg   [(set (match_operand:VX_VEC_CONV_INT                      0 "register_operand" "=v")
   2551  1.5  mrg 	(fix:VX_VEC_CONV_INT (match_operand:VX_VEC_CONV_BFP 1 "register_operand"  "v")))]
   2552  1.5  mrg   "TARGET_VX
   2553  1.5  mrg    && GET_MODE_UNIT_SIZE (<VX_VEC_CONV_INT:MODE>mode) == GET_MODE_UNIT_SIZE (<VX_VEC_CONV_BFP:MODE>mode)"
   2554  1.5  mrg   "vc<VX_VEC_CONV_INT:bhfgq><VX_VEC_CONV_BFP:xde>b\t%v0,%v1,0,5"
   2555  1.5  mrg   [(set_attr "op_type" "VRR")])
   2556  1.5  mrg 
   2557  1.7  mrg ; There is no instruction for rounding an extended BFP operand in a VR into
   2558  1.7  mrg ; a signed integer, therefore copy it into a FPR pair first.
   2559  1.7  mrg (define_expand "fix_trunctf<mode>2_vr"
   2560  1.7  mrg   [(set (match_dup 2)
   2561  1.7  mrg 	(unspec:FPRX2 [(match_operand:TF 1 "register_operand")] UNSPEC_TF_TO_FPRX2))
   2562  1.7  mrg    (parallel [(set (match_operand:GPR 0 "register_operand" "")
   2563  1.7  mrg 		   (fix:GPR (match_dup 2)))
   2564  1.7  mrg 	      (unspec:GPR [(const_int BFP_RND_TOWARD_0)] UNSPEC_ROUND)
   2565  1.7  mrg 	      (clobber (reg:CC CC_REGNUM))])]
   2566  1.7  mrg   "TARGET_VXE"
   2567  1.7  mrg {
   2568  1.7  mrg   operands[2] = gen_reg_rtx (FPRX2mode);
   2569  1.7  mrg })
   2570  1.7  mrg 
   2571  1.7  mrg (define_expand "fix_trunctf<mode>2"
   2572  1.7  mrg   [(match_operand:GPR 0 "register_operand" "")
   2573  1.7  mrg    (match_operand:TF  1 "register_operand" "")]
   2574  1.7  mrg   "HAVE_TF (fix_trunctf<mode>2)"
   2575  1.7  mrg   { EXPAND_TF (fix_trunctf<mode>2, 2); })
   2576  1.7  mrg 
   2577  1.5  mrg ; floating point to unsigned integer
   2578  1.5  mrg 
   2579  1.5  mrg ; op2: inexact exception not suppressed (IEEE 754 2008)
   2580  1.5  mrg ; op3: rounding mode 5 (round towards 0 C11 6.3.1.4)
   2581  1.5  mrg ; vclgdb, vclfeb
   2582  1.5  mrg (define_insn "fixuns_trunc<VX_VEC_CONV_BFP:mode><VX_VEC_CONV_INT:mode>2"
   2583  1.5  mrg   [(set (match_operand:VX_VEC_CONV_INT                               0 "register_operand" "=v")
   2584  1.5  mrg 	(unsigned_fix:VX_VEC_CONV_INT (match_operand:VX_VEC_CONV_BFP 1 "register_operand"  "v")))]
   2585  1.5  mrg   "TARGET_VX
   2586  1.5  mrg    && GET_MODE_UNIT_SIZE (<VX_VEC_CONV_INT:MODE>mode) == GET_MODE_UNIT_SIZE (<VX_VEC_CONV_BFP:MODE>mode)"
   2587  1.5  mrg   "vcl<VX_VEC_CONV_INT:bhfgq><VX_VEC_CONV_BFP:xde>b\t%v0,%v1,0,5"
   2588  1.5  mrg   [(set_attr "op_type" "VRR")])
   2589  1.5  mrg 
   2590  1.7  mrg ; There is no instruction for rounding an extended BFP operand in a VR into
   2591  1.7  mrg ; an unsigned integer, therefore copy it into a FPR pair first.
   2592  1.7  mrg (define_expand "fixuns_trunctf<mode>2_vr"
   2593  1.7  mrg   [(set (match_dup 2)
   2594  1.7  mrg 	(unspec:FPRX2 [(match_operand:TF 1 "register_operand")] UNSPEC_TF_TO_FPRX2))
   2595  1.7  mrg    (parallel [(set (match_operand:GPR 0 "register_operand" "")
   2596  1.7  mrg 		   (unsigned_fix:GPR (match_dup 2)))
   2597  1.7  mrg 	      (unspec:GPR [(const_int BFP_RND_TOWARD_0)] UNSPEC_ROUND)
   2598  1.7  mrg 	      (clobber (reg:CC CC_REGNUM))])]
   2599  1.7  mrg   "TARGET_VXE"
   2600  1.7  mrg {
   2601  1.7  mrg   operands[2] = gen_reg_rtx (FPRX2mode);
   2602  1.7  mrg })
   2603  1.7  mrg 
   2604  1.7  mrg (define_expand "fixuns_trunctf<mode>2"
   2605  1.7  mrg   [(match_operand:GPR 0 "register_operand" "")
   2606  1.7  mrg    (match_operand:TF  1 "register_operand" "")]
   2607  1.7  mrg   "HAVE_TF (fixuns_trunctf<mode>2)"
   2608  1.7  mrg   { EXPAND_TF (fixuns_trunctf<mode>2, 2); })
   2609  1.7  mrg 
   2610  1.7  mrg ; load fp integer
   2611  1.7  mrg 
   2612  1.7  mrg ; vfisb, wfisb, vfidb, wfidb, wfixb; suppress inexact exceptions
   2613  1.7  mrg (define_insn "<FPINT:fpint_name><VF_HW:mode>2<VF_HW:tf_vr>"
   2614  1.7  mrg   [(set (match_operand:VF_HW                0 "register_operand" "=v")
   2615  1.7  mrg 	(unspec:VF_HW [(match_operand:VF_HW 1 "register_operand"  "v")]
   2616  1.7  mrg 		      FPINT))]
   2617  1.7  mrg   "TARGET_VX"
   2618  1.7  mrg   "<vw>fi<VF_HW:sdx>b\t%v0,%v1,4,<FPINT:fpint_roundingmode>"
   2619  1.7  mrg   [(set_attr "op_type" "VRR")])
   2620  1.7  mrg 
   2621  1.7  mrg (define_expand "<FPINT:fpint_name>tf2"
   2622  1.7  mrg   [(match_operand:TF 0 "register_operand" "")
   2623  1.7  mrg    (match_operand:TF 1 "register_operand" "")
   2624  1.7  mrg    ; recognize FPINT as an iterator
   2625  1.7  mrg    (unspec:TF [(match_dup 1)] FPINT)]
   2626  1.7  mrg   "HAVE_TF (<FPINT:fpint_name>tf2)"
   2627  1.7  mrg   { EXPAND_TF (<FPINT:fpint_name>tf2, 2); })
   2628  1.7  mrg 
   2629  1.7  mrg ; vfisb, wfisb, vfidb, wfidb, wfixb; raise inexact exceptions
   2630  1.7  mrg (define_insn "rint<mode>2<tf_vr>"
   2631  1.7  mrg   [(set (match_operand:VF_HW                0 "register_operand" "=v")
   2632  1.7  mrg 	(unspec:VF_HW [(match_operand:VF_HW 1 "register_operand"  "v")]
   2633  1.7  mrg 		      UNSPEC_FPINT_RINT))]
   2634  1.7  mrg   "TARGET_VX"
   2635  1.7  mrg   "<vw>fi<sdx>b\t%v0,%v1,0,0"
   2636  1.7  mrg   [(set_attr "op_type" "VRR")])
   2637  1.7  mrg 
   2638  1.7  mrg (define_expand "rinttf2"
   2639  1.7  mrg   [(match_operand:TF 0 "register_operand" "")
   2640  1.7  mrg    (match_operand:TF 1 "register_operand" "")]
   2641  1.7  mrg   "HAVE_TF (rinttf2)"
   2642  1.7  mrg   { EXPAND_TF (rinttf2, 2); })
   2643  1.7  mrg 
   2644  1.7  mrg ; load rounded
   2645  1.7  mrg 
   2646  1.7  mrg ; wflrx
   2647  1.7  mrg (define_insn "*trunctfdf2_vr"
   2648  1.7  mrg   [(set (match_operand:DF                    0 "register_operand" "=f")
   2649  1.7  mrg 	(float_truncate:DF (match_operand:TF 1 "register_operand"  "v")))
   2650  1.7  mrg    (unspec:DF [(match_operand                2 "const_int_operand" "")]
   2651  1.7  mrg 	       UNSPEC_ROUND)]
   2652  1.7  mrg   "TARGET_VXE"
   2653  1.7  mrg   "wflrx\t%v0,%v1,0,%2"
   2654  1.7  mrg   [(set_attr "op_type" "VRR")])
   2655  1.7  mrg 
   2656  1.7  mrg (define_expand "trunctfdf2_vr"
   2657  1.7  mrg   [(parallel [
   2658  1.7  mrg      (set (match_operand:DF                    0 "register_operand" "")
   2659  1.7  mrg 	  (float_truncate:DF (match_operand:TF 1 "register_operand" "")))
   2660  1.7  mrg      (unspec:DF [(const_int BFP_RND_CURRENT)] UNSPEC_ROUND)])]
   2661  1.7  mrg   "TARGET_VXE")
   2662  1.7  mrg 
   2663  1.7  mrg (define_expand "trunctfdf2"
   2664  1.7  mrg   [(match_operand:DF 0 "register_operand" "")
   2665  1.7  mrg    (match_operand:TF 1 "register_operand" "")]
   2666  1.7  mrg   "HAVE_TF (trunctfdf2)"
   2667  1.7  mrg   { EXPAND_TF (trunctfdf2, 2); })
   2668  1.7  mrg 
   2669  1.7  mrg ; wflrx + (ledbr|wledb)
   2670  1.7  mrg (define_expand "trunctfsf2_vr"
   2671  1.7  mrg   [(parallel [
   2672  1.7  mrg      (set (match_dup 2)
   2673  1.7  mrg 	  (float_truncate:DF (match_operand:TF 1 "register_operand" "")))
   2674  1.7  mrg      (unspec:DF [(const_int BFP_RND_PREP_FOR_SHORT_PREC)] UNSPEC_ROUND)])
   2675  1.7  mrg    (set (match_operand:SF                    0 "register_operand" "")
   2676  1.7  mrg 	(float_truncate:SF (match_dup 2)))]
   2677  1.7  mrg   "TARGET_VXE"
   2678  1.7  mrg {
   2679  1.7  mrg   operands[2] = gen_reg_rtx(DFmode);
   2680  1.7  mrg })
   2681  1.7  mrg 
   2682  1.7  mrg (define_expand "trunctfsf2"
   2683  1.7  mrg   [(match_operand:SF 0 "register_operand" "")
   2684  1.7  mrg    (match_operand:TF 1 "register_operand" "")]
   2685  1.7  mrg   "HAVE_TF (trunctfsf2)"
   2686  1.7  mrg   { EXPAND_TF (trunctfsf2, 2); })
   2687  1.7  mrg 
   2688  1.7  mrg (define_expand "trunctf<DFP_ALL:mode>2_vr"
   2689  1.7  mrg   [(match_operand:DFP_ALL 0 "nonimmediate_operand" "")
   2690  1.7  mrg    (match_operand:TF 1 "nonimmediate_operand" "")]
   2691  1.7  mrg   "TARGET_HARD_DFP
   2692  1.7  mrg    && GET_MODE_SIZE (TFmode) > GET_MODE_SIZE (<DFP_ALL:MODE>mode)
   2693  1.7  mrg    && TARGET_VXE"
   2694  1.7  mrg {
   2695  1.7  mrg   rtx fprx2 = gen_reg_rtx (FPRX2mode);
   2696  1.7  mrg   emit_insn (gen_tf_to_fprx2 (fprx2, operands[1]));
   2697  1.7  mrg   emit_insn (gen_truncfprx2<DFP_ALL:mode>2 (operands[0], fprx2));
   2698  1.7  mrg   DONE;
   2699  1.7  mrg })
   2700  1.7  mrg 
   2701  1.7  mrg (define_expand "trunctf<DFP_ALL:mode>2"
   2702  1.7  mrg   [(match_operand:DFP_ALL 0 "nonimmediate_operand" "")
   2703  1.7  mrg    (match_operand:TF 1 "nonimmediate_operand" "")]
   2704  1.7  mrg   "HAVE_TF (trunctf<DFP_ALL:mode>2)"
   2705  1.7  mrg   { EXPAND_TF (trunctf<DFP_ALL:mode>2, 2); })
   2706  1.7  mrg 
   2707  1.7  mrg (define_expand "trunctdtf2_vr"
   2708  1.7  mrg   [(match_operand:TF 0 "nonimmediate_operand" "")
   2709  1.7  mrg    (match_operand:TD 1 "nonimmediate_operand" "")]
   2710  1.7  mrg   "TARGET_HARD_DFP && TARGET_VXE"
   2711  1.7  mrg {
   2712  1.7  mrg   rtx fprx2 = gen_reg_rtx (FPRX2mode);
   2713  1.7  mrg   emit_insn (gen_trunctdfprx22 (fprx2, operands[1]));
   2714  1.7  mrg   emit_insn (gen_fprx2_to_tf (operands[0], fprx2));
   2715  1.7  mrg   DONE;
   2716  1.7  mrg })
   2717  1.7  mrg 
   2718  1.7  mrg (define_expand "trunctdtf2"
   2719  1.7  mrg   [(match_operand:TF 0 "nonimmediate_operand" "")
   2720  1.7  mrg    (match_operand:TD 1 "nonimmediate_operand" "")]
   2721  1.7  mrg   "HAVE_TF (trunctdtf2)"
   2722  1.7  mrg   { EXPAND_TF (trunctdtf2, 2); })
   2723  1.7  mrg 
   2724  1.7  mrg ; load lengthened
   2725  1.7  mrg 
   2726  1.7  mrg (define_insn "extenddftf2_vr"
   2727  1.7  mrg   [(set (match_operand:TF                  0 "register_operand" "=v")
   2728  1.7  mrg 	(float_extend:TF (match_operand:DF 1 "register_operand"  "f")))]
   2729  1.7  mrg   "TARGET_VXE"
   2730  1.7  mrg   "wflld\t%v0,%v1"
   2731  1.7  mrg   [(set_attr "op_type" "VRR")])
   2732  1.7  mrg 
   2733  1.7  mrg (define_expand "extenddftf2"
   2734  1.7  mrg   [(match_operand:TF 0 "register_operand" "")
   2735  1.7  mrg    (match_operand:DF 1 "nonimmediate_operand" "")]
   2736  1.7  mrg   "HAVE_TF (extenddftf2)"
   2737  1.7  mrg   { EXPAND_TF (extenddftf2, 2); })
   2738  1.7  mrg 
   2739  1.7  mrg (define_expand "extendsftf2_vr"
   2740  1.7  mrg   [(set (match_dup 2)
   2741  1.7  mrg 	(float_extend:DF (match_operand:SF 1 "nonimmediate_operand" "")))
   2742  1.7  mrg    (set (match_operand:TF                  0 "register_operand"     "")
   2743  1.7  mrg 	(float_extend:TF (match_dup 2)))]
   2744  1.7  mrg   "TARGET_VXE"
   2745  1.7  mrg {
   2746  1.7  mrg   operands[2] = gen_reg_rtx(DFmode);
   2747  1.7  mrg })
   2748  1.7  mrg 
   2749  1.7  mrg (define_expand "extendsftf2"
   2750  1.7  mrg   [(match_operand:TF 0 "register_operand" "")
   2751  1.7  mrg    (match_operand:SF 1 "nonimmediate_operand" "")]
   2752  1.7  mrg   "HAVE_TF (extendsftf2)"
   2753  1.7  mrg   { EXPAND_TF (extendsftf2, 2); })
   2754  1.7  mrg 
   2755  1.7  mrg (define_expand "extend<DFP_ALL:mode>tf2_vr"
   2756  1.7  mrg   [(match_operand:TF 0 "nonimmediate_operand" "")
   2757  1.7  mrg    (match_operand:DFP_ALL 1 "nonimmediate_operand" "")]
   2758  1.7  mrg   "TARGET_HARD_DFP
   2759  1.7  mrg    && GET_MODE_SIZE (<DFP_ALL:MODE>mode) < GET_MODE_SIZE (TFmode)
   2760  1.7  mrg    && TARGET_VXE"
   2761  1.7  mrg {
   2762  1.7  mrg   rtx fprx2 = gen_reg_rtx (FPRX2mode);
   2763  1.7  mrg   emit_insn (gen_extend<DFP_ALL:mode>fprx22 (fprx2, operands[1]));
   2764  1.7  mrg   emit_insn (gen_fprx2_to_tf (operands[0], fprx2));
   2765  1.7  mrg   DONE;
   2766  1.7  mrg })
   2767  1.7  mrg 
   2768  1.7  mrg (define_expand "extend<DFP_ALL:mode>tf2"
   2769  1.7  mrg   [(match_operand:TF 0 "nonimmediate_operand" "")
   2770  1.7  mrg    (match_operand:DFP_ALL 1 "nonimmediate_operand" "")]
   2771  1.7  mrg   "HAVE_TF (extend<DFP_ALL:mode>tf2)"
   2772  1.7  mrg   { EXPAND_TF (extend<DFP_ALL:mode>tf2, 2); })
   2773  1.7  mrg 
   2774  1.7  mrg (define_expand "extendtftd2_vr"
   2775  1.7  mrg   [(match_operand:TD 0 "nonimmediate_operand" "")
   2776  1.7  mrg    (match_operand:TF 1 "nonimmediate_operand" "")]
   2777  1.7  mrg   "TARGET_HARD_DFP && TARGET_VXE"
   2778  1.7  mrg {
   2779  1.7  mrg   rtx fprx2 = gen_reg_rtx (FPRX2mode);
   2780  1.7  mrg   emit_insn (gen_tf_to_fprx2 (fprx2, operands[1]));
   2781  1.7  mrg   emit_insn (gen_extendfprx2td2 (operands[0], fprx2));
   2782  1.7  mrg   DONE;
   2783  1.7  mrg })
   2784  1.7  mrg 
   2785  1.7  mrg (define_expand "extendtftd2"
   2786  1.7  mrg   [(match_operand:TD 0 "nonimmediate_operand" "")
   2787  1.7  mrg    (match_operand:TF 1 "nonimmediate_operand" "")]
   2788  1.7  mrg   "HAVE_TF (extendtftd2)"
   2789  1.7  mrg   { EXPAND_TF (extendtftd2, 2); })
   2790  1.7  mrg 
   2791  1.7  mrg ; test data class
   2792  1.7  mrg 
   2793  1.7  mrg (define_expand "signbittf2_vr"
   2794  1.7  mrg   [(parallel
   2795  1.7  mrg     [(set (reg:CCRAW CC_REGNUM)
   2796  1.7  mrg 	  (unspec:CCRAW [(match_operand:TF 1 "register_operand" "")
   2797  1.7  mrg 			 (match_dup        2)]
   2798  1.7  mrg 			UNSPEC_VEC_VFTCICC))
   2799  1.7  mrg      (clobber (scratch:V1TI))])
   2800  1.7  mrg    (set (match_operand:SI                  0 "register_operand" "")
   2801  1.7  mrg 	(const_int 0))
   2802  1.7  mrg    (set (match_dup                         0)
   2803  1.7  mrg 	(if_then_else:SI (eq (reg:CCRAW CC_REGNUM) (const_int 8))
   2804  1.7  mrg 			 (const_int 1)
   2805  1.7  mrg 			 (match_dup        0)))]
   2806  1.7  mrg   "TARGET_VXE"
   2807  1.7  mrg {
   2808  1.7  mrg   operands[2] = GEN_INT (S390_TDC_SIGNBIT_SET);
   2809  1.7  mrg })
   2810  1.7  mrg 
   2811  1.7  mrg (define_expand "signbittf2"
   2812  1.7  mrg   [(match_operand:SI 0 "register_operand" "")
   2813  1.7  mrg    (match_operand:TF 1 "register_operand" "")]
   2814  1.7  mrg   "HAVE_TF (signbittf2)"
   2815  1.7  mrg   { EXPAND_TF (signbittf2, 2); })
   2816  1.7  mrg 
   2817  1.7  mrg (define_expand "isinftf2_vr"
   2818  1.7  mrg   [(parallel
   2819  1.7  mrg     [(set (reg:CCRAW CC_REGNUM)
   2820  1.7  mrg 	  (unspec:CCRAW [(match_operand:TF 1 "register_operand" "")
   2821  1.7  mrg 			 (match_dup        2)]
   2822  1.7  mrg 			UNSPEC_VEC_VFTCICC))
   2823  1.7  mrg      (clobber (scratch:V1TI))])
   2824  1.7  mrg    (set (match_operand:SI                  0 "register_operand" "")
   2825  1.7  mrg 	(const_int 0))
   2826  1.7  mrg    (set (match_dup                         0)
   2827  1.7  mrg 	(if_then_else:SI (eq (reg:CCRAW CC_REGNUM) (const_int 8))
   2828  1.7  mrg 			 (const_int 1)
   2829  1.7  mrg 			 (match_dup        0)))]
   2830  1.7  mrg   "TARGET_VXE"
   2831  1.7  mrg {
   2832  1.7  mrg   operands[2] = GEN_INT (S390_TDC_INFINITY);
   2833  1.7  mrg })
   2834  1.7  mrg 
   2835  1.7  mrg (define_expand "isinftf2"
   2836  1.7  mrg   [(match_operand:SI 0 "register_operand" "")
   2837  1.7  mrg    (match_operand:TF 1 "register_operand" "")]
   2838  1.7  mrg   "HAVE_TF (isinftf2)"
   2839  1.7  mrg   { EXPAND_TF (isinftf2, 2); })
   2840  1.7  mrg 
   2841  1.5  mrg ;
   2842  1.5  mrg ; Vector byte swap patterns
   2843  1.5  mrg ;
   2844  1.5  mrg 
   2845  1.5  mrg ; FIXME: The bswap rtl standard name currently does not appear to be
   2846  1.5  mrg ; used for vector modes.
   2847  1.5  mrg (define_expand "bswap<mode>"
   2848  1.5  mrg   [(parallel
   2849  1.5  mrg     [(set (match_operand:VT_HW_HSDT                   0 "nonimmediate_operand" "")
   2850  1.5  mrg 	  (bswap:VT_HW_HSDT (match_operand:VT_HW_HSDT 1 "nonimmediate_operand" "")))
   2851  1.5  mrg      (use (match_dup 2))])]
   2852  1.5  mrg   "TARGET_VX"
   2853  1.5  mrg {
   2854  1.5  mrg   static char p[4][16] =
   2855  1.5  mrg     { { 1,  0,  3,  2,  5,  4,  7, 6, 9,  8,  11, 10, 13, 12, 15, 14 },   /* H */
   2856  1.5  mrg       { 3,  2,  1,  0,  7,  6,  5, 4, 11, 10, 9,  8,  15, 14, 13, 12 },   /* S */
   2857  1.5  mrg       { 7,  6,  5,  4,  3,  2,  1, 0, 15, 14, 13, 12, 11, 10, 9,  8  },   /* D */
   2858  1.5  mrg       { 15, 14, 13, 12, 11, 10, 9, 8, 7,  6,  5,  4,  3,  2,  1,  0  } }; /* T */
   2859  1.5  mrg   char *perm;
   2860  1.5  mrg   rtx perm_rtx[16];
   2861  1.5  mrg 
   2862  1.5  mrg   switch (GET_MODE_SIZE (GET_MODE_INNER (<MODE>mode)))
   2863  1.5  mrg     {
   2864  1.5  mrg     case 2: perm = p[0]; break;
   2865  1.5  mrg     case 4: perm = p[1]; break;
   2866  1.5  mrg     case 8: perm = p[2]; break;
   2867  1.5  mrg     case 16: perm = p[3]; break;
   2868  1.5  mrg     default: gcc_unreachable ();
   2869  1.5  mrg     }
   2870  1.5  mrg   for (int i = 0; i < 16; i++)
   2871  1.5  mrg     perm_rtx[i] = GEN_INT (perm[i]);
   2872  1.5  mrg 
   2873  1.5  mrg   operands[2] = gen_rtx_CONST_VECTOR (V16QImode, gen_rtvec_v (16, perm_rtx));
   2874  1.5  mrg 
   2875  1.5  mrg   /* Without vxe2 we do not have byte swap instructions dealing
   2876  1.5  mrg      directly with memory operands.  So instead of waiting until
   2877  1.5  mrg      reload to fix that up switch over to vector permute right
   2878  1.5  mrg      now.  */
   2879  1.5  mrg   if (!TARGET_VXE2)
   2880  1.5  mrg     {
   2881  1.5  mrg       rtx in = force_reg (V16QImode, simplify_gen_subreg (V16QImode, operands[1], <MODE>mode, 0));
   2882  1.5  mrg       rtx permute = force_reg (V16QImode, force_const_mem (V16QImode, operands[2]));
   2883  1.5  mrg       rtx out = gen_reg_rtx (V16QImode);
   2884  1.5  mrg 
   2885  1.5  mrg       emit_insn (gen_vec_permv16qi (out, in, in, permute));
   2886  1.5  mrg       emit_move_insn (operands[0], simplify_gen_subreg (<MODE>mode, out, V16QImode, 0));
   2887  1.5  mrg       DONE;
   2888  1.5  mrg     }
   2889  1.5  mrg })
   2890  1.5  mrg 
   2891  1.5  mrg ; Switching late to the reg-reg variant requires the vector permute
   2892  1.5  mrg ; pattern to be pushed into literal pool and allocating a vector
   2893  1.5  mrg ; register to load it into.  We rely on both being provided by LRA
   2894  1.5  mrg ; when fixing up the v constraint for operand 2.
   2895  1.5  mrg 
   2896  1.5  mrg ; permute_pattern_operand: general_operand would reject the permute
   2897  1.5  mrg ; pattern constants since these are not accepted by
   2898  1.5  mrg ; s390_legimitate_constant_p
   2899  1.5  mrg 
   2900  1.5  mrg ; ^R: Prevent these alternatives from being chosen if it would require
   2901  1.5  mrg ; pushing the operand into memory first
   2902  1.5  mrg 
   2903  1.5  mrg ; vlbrh, vlbrf, vlbrg, vlbrq, vstbrh, vstbrf, vstbrg, vstbrq
   2904  1.5  mrg (define_insn_and_split "*bswap<mode>"
   2905  1.5  mrg   [(set (match_operand:VT_HW_HSDT                   0 "nonimmediate_operand"    "=v, v,^R")
   2906  1.5  mrg 	(bswap:VT_HW_HSDT (match_operand:VT_HW_HSDT 1 "nonimmediate_operand"     "v,^R, v")))
   2907  1.5  mrg    (use (match_operand:V16QI                        2 "permute_pattern_operand"  "v, X, X"))]
   2908  1.5  mrg   "TARGET_VXE2"
   2909  1.5  mrg   "@
   2910  1.5  mrg    #
   2911  1.5  mrg    vlbr<bhfgq>\t%v0,%v1
   2912  1.5  mrg    vstbr<bhfgq>\t%v1,%v0"
   2913  1.5  mrg   "&& reload_completed
   2914  1.5  mrg    && !memory_operand (operands[0], <MODE>mode)
   2915  1.5  mrg    && !memory_operand (operands[1], <MODE>mode)"
   2916  1.5  mrg   [(set (match_dup 0)
   2917  1.5  mrg 	(subreg:VT_HW_HSDT
   2918  1.5  mrg 	 (unspec:V16QI [(subreg:V16QI (match_dup 1) 0)
   2919  1.5  mrg 			(subreg:V16QI (match_dup 1) 0)
   2920  1.5  mrg 			(match_dup 2)]
   2921  1.5  mrg 		       UNSPEC_VEC_PERM) 0))]
   2922  1.5  mrg   ""
   2923  1.5  mrg   [(set_attr "op_type"      "*,VRX,VRX")])
   2924  1.5  mrg 
   2925  1.1  mrg ; reduc_smin
   2926  1.1  mrg ; reduc_smax
   2927  1.1  mrg ; reduc_umin
   2928  1.1  mrg ; reduc_umax
   2929  1.1  mrg 
   2930  1.3  mrg ; vec_pack_sfix_trunc: convert + pack ?
   2931  1.1  mrg ; vec_pack_ufix_trunc
   2932  1.1  mrg ; vec_unpacks_float_hi
   2933  1.1  mrg ; vec_unpacks_float_lo
   2934  1.1  mrg ; vec_unpacku_float_hi
   2935  1.1  mrg ; vec_unpacku_float_lo
   2936