Home | History | Annotate | Download | only in X86
      1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
      2 ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=corei7 | FileCheck %s
      3 
      4 ; Test that we correctly fold a shuffle that performs a swizzle of another
      5 ; shuffle node according to the rule
      6 ;  shuffle (shuffle (x, undef, M0), undef, M1) -> shuffle(x, undef, M2)
      7 ;
      8 ; We only do this if the resulting mask is legal to avoid introducing an
      9 ; illegal shuffle that is expanded into a sub-optimal sequence of instructions
     10 ; during lowering stage.
     11 
     12 define <4 x i32> @swizzle_1(<4 x i32> %v) {
     13 ; CHECK-LABEL: swizzle_1:
     14 ; CHECK:       # BB#0:
     15 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,0,3,2]
     16 ; CHECK-NEXT:    retq
     17   %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 3, i32 2, i32 0, i32 1>
     18   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 3, i32 2, i32 0, i32 1>
     19   ret <4 x i32> %2
     20 }
     21 
     22 define <4 x i32> @swizzle_2(<4 x i32> %v) {
     23 ; CHECK-LABEL: swizzle_2:
     24 ; CHECK:       # BB#0:
     25 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,1,3,0]
     26 ; CHECK-NEXT:    retq
     27   %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 3, i32 1, i32 0, i32 2>
     28   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 3, i32 1, i32 0, i32 2>
     29   ret <4 x i32> %2
     30 }
     31 
     32 define <4 x i32> @swizzle_3(<4 x i32> %v) {
     33 ; CHECK-LABEL: swizzle_3:
     34 ; CHECK:       # BB#0:
     35 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,0,3,2]
     36 ; CHECK-NEXT:    retq
     37   %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 1, i32 0>
     38   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 1, i32 0>
     39   ret <4 x i32> %2
     40 }
     41 
     42 define <4 x i32> @swizzle_4(<4 x i32> %v) {
     43 ; CHECK-LABEL: swizzle_4:
     44 ; CHECK:       # BB#0:
     45 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,1,0,2]
     46 ; CHECK-NEXT:    retq
     47   %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 2, i32 1, i32 3, i32 0>
     48   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 1, i32 3, i32 0>
     49   ret <4 x i32> %2
     50 }
     51 
     52 define <4 x i32> @swizzle_5(<4 x i32> %v) {
     53 ; CHECK-LABEL: swizzle_5:
     54 ; CHECK:       # BB#0:
     55 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
     56 ; CHECK-NEXT:    retq
     57   %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 1, i32 2, i32 3, i32 0>
     58   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 1, i32 2, i32 3, i32 0>
     59   ret <4 x i32> %2
     60 }
     61 
     62 define <4 x i32> @swizzle_6(<4 x i32> %v) {
     63 ; CHECK-LABEL: swizzle_6:
     64 ; CHECK:       # BB#0:
     65 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,0,1,3]
     66 ; CHECK-NEXT:    retq
     67   %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 1, i32 2, i32 0, i32 3>
     68   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 1, i32 2, i32 0, i32 3>
     69   ret <4 x i32> %2
     70 }
     71 
     72 define <4 x i32> @swizzle_7(<4 x i32> %v) {
     73 ; CHECK-LABEL: swizzle_7:
     74 ; CHECK:       # BB#0:
     75 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,3,1]
     76 ; CHECK-NEXT:    retq
     77   %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 0, i32 3, i32 1, i32 2>
     78   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 0, i32 3, i32 1, i32 2>
     79   ret <4 x i32> %2
     80 }
     81 
     82 define <4 x i32> @swizzle_8(<4 x i32> %v) {
     83 ; CHECK-LABEL: swizzle_8:
     84 ; CHECK:       # BB#0:
     85 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,3,2,0]
     86 ; CHECK-NEXT:    retq
     87   %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 3, i32 0, i32 2, i32 1>
     88   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 3, i32 0, i32 2, i32 1>
     89   ret <4 x i32> %2
     90 }
     91 
     92 define <4 x i32> @swizzle_9(<4 x i32> %v) {
     93 ; CHECK-LABEL: swizzle_9:
     94 ; CHECK:       # BB#0:
     95 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
     96 ; CHECK-NEXT:    retq
     97   %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 3, i32 0, i32 1, i32 2>
     98   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 3, i32 0, i32 1, i32 2>
     99   ret <4 x i32> %2
    100 }
    101 
    102 define <4 x i32> @swizzle_10(<4 x i32> %v) {
    103 ; CHECK-LABEL: swizzle_10:
    104 ; CHECK:       # BB#0:
    105 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,2,0,3]
    106 ; CHECK-NEXT:    retq
    107   %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 2, i32 0, i32 1, i32 3>
    108   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 0, i32 1, i32 3>
    109   ret <4 x i32> %2
    110 }
    111 
    112 define <4 x i32> @swizzle_11(<4 x i32> %v) {
    113 ; CHECK-LABEL: swizzle_11:
    114 ; CHECK:       # BB#0:
    115 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]
    116 ; CHECK-NEXT:    retq
    117   %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 2, i32 0, i32 3, i32 1>
    118   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 0, i32 3, i32 1>
    119   ret <4 x i32> %2
    120 }
    121 
    122 define <4 x i32> @swizzle_12(<4 x i32> %v) {
    123 ; CHECK-LABEL: swizzle_12:
    124 ; CHECK:       # BB#0:
    125 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,3,1,2]
    126 ; CHECK-NEXT:    retq
    127   %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 0, i32 2, i32 3, i32 1>
    128   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 0, i32 2, i32 3, i32 1>
    129   ret <4 x i32> %2
    130 }
    131 
    132 define <4 x i32> @swizzle_13(<4 x i32> %v) {
    133 ; CHECK-LABEL: swizzle_13:
    134 ; CHECK:       # BB#0:
    135 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,2,1,0]
    136 ; CHECK-NEXT:    retq
    137   %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 1, i32 3, i32 0, i32 2>
    138   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 1, i32 3, i32 0, i32 2>
    139   ret <4 x i32> %2
    140 }
    141 
    142 define <4 x i32> @swizzle_14(<4 x i32> %v) {
    143 ; CHECK-LABEL: swizzle_14:
    144 ; CHECK:       # BB#0:
    145 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[3,0,2,1]
    146 ; CHECK-NEXT:    retq
    147   %1 = shufflevector <4 x i32> %v, <4 x i32> undef, <4 x i32> <i32 1, i32 3, i32 2, i32 0>
    148   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 1, i32 3, i32 2, i32 0>
    149   ret <4 x i32> %2
    150 }
    151 
    152 define <4 x float> @swizzle_15(<4 x float> %v) {
    153 ; CHECK-LABEL: swizzle_15:
    154 ; CHECK:       # BB#0:
    155 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,0,3,2]
    156 ; CHECK-NEXT:    retq
    157   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 3, i32 2, i32 0, i32 1>
    158   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 3, i32 2, i32 0, i32 1>
    159   ret <4 x float> %2
    160 }
    161 
    162 define <4 x float> @swizzle_16(<4 x float> %v) {
    163 ; CHECK-LABEL: swizzle_16:
    164 ; CHECK:       # BB#0:
    165 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,1,3,0]
    166 ; CHECK-NEXT:    retq
    167   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 3, i32 1, i32 0, i32 2>
    168   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 3, i32 1, i32 0, i32 2>
    169   ret <4 x float> %2
    170 }
    171 
    172 define <4 x float> @swizzle_17(<4 x float> %v) {
    173 ; CHECK-LABEL: swizzle_17:
    174 ; CHECK:       # BB#0:
    175 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,0,3,2]
    176 ; CHECK-NEXT:    retq
    177   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 2, i32 3, i32 1, i32 0>
    178   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 2, i32 3, i32 1, i32 0>
    179   ret <4 x float> %2
    180 }
    181 
    182 define <4 x float> @swizzle_18(<4 x float> %v) {
    183 ; CHECK-LABEL: swizzle_18:
    184 ; CHECK:       # BB#0:
    185 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,1,0,2]
    186 ; CHECK-NEXT:    retq
    187   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 2, i32 1, i32 3, i32 0>
    188   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 2, i32 1, i32 3, i32 0>
    189   ret <4 x float> %2
    190 }
    191 
    192 define <4 x float> @swizzle_19(<4 x float> %v) {
    193 ; CHECK-LABEL: swizzle_19:
    194 ; CHECK:       # BB#0:
    195 ; CHECK-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1,0]
    196 ; CHECK-NEXT:    retq
    197   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 1, i32 2, i32 3, i32 0>
    198   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 1, i32 2, i32 3, i32 0>
    199   ret <4 x float> %2
    200 }
    201 
    202 define <4 x float> @swizzle_20(<4 x float> %v) {
    203 ; CHECK-LABEL: swizzle_20:
    204 ; CHECK:       # BB#0:
    205 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0,1,3]
    206 ; CHECK-NEXT:    retq
    207   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 1, i32 2, i32 0, i32 3>
    208   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 1, i32 2, i32 0, i32 3>
    209   ret <4 x float> %2
    210 }
    211 
    212 define <4 x float> @swizzle_21(<4 x float> %v) {
    213 ; CHECK-LABEL: swizzle_21:
    214 ; CHECK:       # BB#0:
    215 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,3,1]
    216 ; CHECK-NEXT:    retq
    217   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 0, i32 3, i32 1, i32 2>
    218   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 0, i32 3, i32 1, i32 2>
    219   ret <4 x float> %2
    220 }
    221 
    222 define <4 x float> @swizzle_22(<4 x float> %v) {
    223 ; CHECK-LABEL: swizzle_22:
    224 ; CHECK:       # BB#0:
    225 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,3,2,0]
    226 ; CHECK-NEXT:    retq
    227   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 3, i32 0, i32 2, i32 1>
    228   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 3, i32 0, i32 2, i32 1>
    229   ret <4 x float> %2
    230 }
    231 
    232 define <4 x float> @swizzle_23(<4 x float> %v) {
    233 ; CHECK-LABEL: swizzle_23:
    234 ; CHECK:       # BB#0:
    235 ; CHECK-NEXT:    shufpd {{.*#+}} xmm0 = xmm0[1,0]
    236 ; CHECK-NEXT:    retq
    237   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 3, i32 0, i32 1, i32 2>
    238   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 3, i32 0, i32 1, i32 2>
    239   ret <4 x float> %2
    240 }
    241 
    242 define <4 x float> @swizzle_24(<4 x float> %v) {
    243 ; CHECK-LABEL: swizzle_24:
    244 ; CHECK:       # BB#0:
    245 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,2,0,3]
    246 ; CHECK-NEXT:    retq
    247   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 2, i32 0, i32 1, i32 3>
    248   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 2, i32 0, i32 1, i32 3>
    249   ret <4 x float> %2
    250 }
    251 
    252 define <4 x float> @swizzle_25(<4 x float> %v) {
    253 ; CHECK-LABEL: swizzle_25:
    254 ; CHECK:       # BB#0:
    255 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,2,1,0]
    256 ; CHECK-NEXT:    retq
    257   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 2, i32 0, i32 3, i32 1>
    258   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 2, i32 0, i32 3, i32 1>
    259   ret <4 x float> %2
    260 }
    261 
    262 define <4 x float> @swizzle_26(<4 x float> %v) {
    263 ; CHECK-LABEL: swizzle_26:
    264 ; CHECK:       # BB#0:
    265 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,3,1,2]
    266 ; CHECK-NEXT:    retq
    267   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 0, i32 2, i32 3, i32 1>
    268   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 0, i32 2, i32 3, i32 1>
    269   ret <4 x float> %2
    270 }
    271 
    272 define <4 x float> @swizzle_27(<4 x float> %v) {
    273 ; CHECK-LABEL: swizzle_27:
    274 ; CHECK:       # BB#0:
    275 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,2,1,0]
    276 ; CHECK-NEXT:    retq
    277   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 1, i32 3, i32 0, i32 2>
    278   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 1, i32 3, i32 0, i32 2>
    279   ret <4 x float> %2
    280 }
    281 
    282 define <4 x float> @swizzle_28(<4 x float> %v) {
    283 ; CHECK-LABEL: swizzle_28:
    284 ; CHECK:       # BB#0:
    285 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,0,2,1]
    286 ; CHECK-NEXT:    retq
    287   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 1, i32 3, i32 2, i32 0>
    288   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 1, i32 3, i32 2, i32 0>
    289   ret <4 x float> %2
    290 }
    291 
    292 define <4 x float> @swizzle_29(<4 x float> %v) {
    293 ; CHECK-LABEL: swizzle_29:
    294 ; CHECK:       # BB#0:
    295 ; CHECK-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,3,2,0]
    296 ; CHECK-NEXT:    retq
    297   %1 = shufflevector <4 x float> %v, <4 x float> undef, <4 x i32> <i32 3, i32 1, i32 2, i32 0>
    298   %2 = shufflevector <4 x float> %1, <4 x float> undef, <4 x i32> <i32 1, i32 0, i32 2, i32 3>
    299   ret <4 x float> %2
    300 }
    301 
    302 ; Make sure that we combine the shuffles from each function below into a single
    303 ; legal shuffle (either pshuflw or pshufb depending on the masks).
    304 
    305 define <8 x i16> @swizzle_30(<8 x i16> %v) {
    306 ; CHECK-LABEL: swizzle_30:
    307 ; CHECK:       # BB#0:
    308 ; CHECK-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,3,2,0,4,5,6,7]
    309 ; CHECK-NEXT:    retq
    310   %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 3, i32 1, i32 2, i32 0, i32 7, i32 5, i32 6, i32 4>
    311   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 1, i32 0, i32 2, i32 3, i32 7, i32 5, i32 6, i32 4>
    312   ret <8 x i16> %2
    313 }
    314 
    315 define <8 x i16> @swizzle_31(<8 x i16> %v) {
    316 ; CHECK-LABEL: swizzle_31:
    317 ; CHECK:       # BB#0:
    318 ; CHECK-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,3,2,0,4,5,6,7]
    319 ; CHECK-NEXT:    retq
    320   %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 3, i32 0, i32 2, i32 1, i32 7, i32 5, i32 6, i32 4>
    321   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 3, i32 0, i32 2, i32 1, i32 7, i32 5, i32 6, i32 4>
    322   ret <8 x i16> %2
    323 }
    324 
    325 define <8 x i16> @swizzle_32(<8 x i16> %v) {
    326 ; CHECK-LABEL: swizzle_32:
    327 ; CHECK:       # BB#0:
    328 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,0,2,3]
    329 ; CHECK-NEXT:    retq
    330   %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 1, i32 2, i32 3, i32 0, i32 7, i32 5, i32 6, i32 4>
    331   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 1, i32 2, i32 3, i32 0, i32 7, i32 5, i32 6, i32 4>
    332   ret <8 x i16> %2
    333 }
    334 
    335 define <8 x i16> @swizzle_33(<8 x i16> %v) {
    336 ; CHECK-LABEL: swizzle_33:
    337 ; CHECK:       # BB#0:
    338 ; CHECK-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[2,1,3,0,4,5,6,7]
    339 ; CHECK-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,7,6,4]
    340 ; CHECK-NEXT:    retq
    341   %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 4, i32 6, i32 5, i32 7, i32 2, i32 3, i32 1, i32 0>
    342   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 4, i32 6, i32 5, i32 7, i32 2, i32 3, i32 1, i32 0>
    343   ret <8 x i16> %2
    344 }
    345 
    346 define <8 x i16> @swizzle_34(<8 x i16> %v) {
    347 ; CHECK-LABEL: swizzle_34:
    348 ; CHECK:       # BB#0:
    349 ; CHECK-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[1,3,0,2,4,5,6,7]
    350 ; CHECK-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,4,5]
    351 ; CHECK-NEXT:    retq
    352   %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 4, i32 7, i32 6, i32 5, i32 1, i32 2, i32 0, i32 3>
    353   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 4, i32 7, i32 6, i32 5, i32 1, i32 2, i32 0, i32 3>
    354   ret <8 x i16> %2
    355 }
    356 
    357 define <8 x i16> @swizzle_35(<8 x i16> %v) {
    358 ; CHECK-LABEL: swizzle_35:
    359 ; CHECK:       # BB#0:
    360 ; CHECK-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[2,1,0,3,4,5,6,7]
    361 ; CHECK-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,7,6]
    362 ; CHECK-NEXT:    retq
    363   %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 7, i32 4, i32 6, i32 5, i32 1, i32 3, i32 0, i32 2>
    364   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 7, i32 4, i32 6, i32 5, i32 1, i32 3, i32 0, i32 2>
    365   ret <8 x i16> %2
    366 }
    367 
    368 define <8 x i16> @swizzle_36(<8 x i16> %v) {
    369 ; CHECK-LABEL: swizzle_36:
    370 ; CHECK:       # BB#0:
    371 ; CHECK-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,3,2,1,4,5,6,7]
    372 ; CHECK-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,5,7]
    373 ; CHECK-NEXT:    retq
    374   %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 4, i32 6, i32 7, i32 5, i32 0, i32 1, i32 3, i32 2>
    375   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 4, i32 6, i32 7, i32 5, i32 0, i32 1, i32 3, i32 2>
    376   ret <8 x i16> %2
    377 }
    378 
    379 define <8 x i16> @swizzle_37(<8 x i16> %v) {
    380 ; CHECK-LABEL: swizzle_37:
    381 ; CHECK:       # BB#0:
    382 ; CHECK-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,7,6,5]
    383 ; CHECK-NEXT:    retq
    384   %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 7, i32 5, i32 6, i32 4>
    385   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 1, i32 0, i32 3, i32 2, i32 7, i32 4, i32 6, i32 5>
    386   ret <8 x i16> %2
    387 }
    388 
    389 define <8 x i16> @swizzle_38(<8 x i16> %v) {
    390 ; CHECK-LABEL: swizzle_38:
    391 ; CHECK:       # BB#0:
    392 ; CHECK-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[2,1,0,3,4,5,6,7]
    393 ; CHECK-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,4,6,7]
    394 ; CHECK-NEXT:    retq
    395   %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 5, i32 6, i32 4, i32 7, i32 0, i32 2, i32 1, i32 3>
    396   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 5, i32 6, i32 4, i32 7, i32 0, i32 2, i32 1, i32 3>
    397   ret <8 x i16> %2
    398 }
    399 
    400 define <8 x i16> @swizzle_39(<8 x i16> %v) {
    401 ; CHECK-LABEL: swizzle_39:
    402 ; CHECK:       # BB#0:
    403 ; CHECK-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[2,3,1,0,4,5,6,7]
    404 ; CHECK-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,4,5]
    405 ; CHECK-NEXT:    retq
    406   %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 5, i32 4, i32 6, i32 7, i32 3, i32 2, i32 1, i32 0>
    407   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 5, i32 4, i32 6, i32 7, i32 3, i32 2, i32 1, i32 0>
    408   ret <8 x i16> %2
    409 }
    410 
    411 define <8 x i16> @swizzle_40(<8 x i16> %v) {
    412 ; CHECK-LABEL: swizzle_40:
    413 ; CHECK:       # BB#0:
    414 ; CHECK-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,1,2,0,4,5,6,7]
    415 ; CHECK-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,5,7]
    416 ; CHECK-NEXT:    retq
    417   %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 6, i32 4, i32 7, i32 5, i32 1, i32 0, i32 3, i32 2>
    418   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 6, i32 4, i32 7, i32 5, i32 1, i32 0, i32 3, i32 2>
    419   ret <8 x i16> %2
    420 }
    421 
    422 define <8 x i16> @swizzle_41(<8 x i16> %v) {
    423 ; CHECK-LABEL: swizzle_41:
    424 ; CHECK:       # BB#0:
    425 ; CHECK-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7]
    426 ; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,3,2]
    427 ; CHECK-NEXT:    retq
    428   %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 6, i32 7, i32 5, i32 4, i32 0, i32 1, i32 3, i32 2>
    429   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 6, i32 7, i32 5, i32 4, i32 0, i32 1, i32 3, i32 2>
    430   ret <8 x i16> %2
    431 }
    432 
    433 define <8 x i16> @swizzle_42(<8 x i16> %v) {
    434 ; CHECK-LABEL: swizzle_42:
    435 ; CHECK:       # BB#0:
    436 ; CHECK-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,4,7,6]
    437 ; CHECK-NEXT:    retq
    438   %1 = shufflevector <8 x i16> %v, <8 x i16> undef, <8 x i32> <i32 0, i32 1, i32 3, i32 2, i32 7, i32 6, i32 4, i32 5>
    439   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <8 x i32> <i32 0, i32 1, i32 3, i32 2, i32 7, i32 6, i32 4, i32 5>
    440   ret <8 x i16> %2
    441 }
    442