Home | History | Annotate | Download | only in X86
      1 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+sse2 | FileCheck %s --check-prefix=SSE2
      2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+ssse3 | FileCheck %s --check-prefix=SSSE3
      3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE41
      4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
      5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
      6 
      7 ; AVX128 tests:
      8 
      9 define <4 x float> @vsel_float(<4 x float> %v1, <4 x float> %v2) {
     10 ; SSE2-LABEL: vsel_float:
     11 ; SSE2:       # BB#0: # %entry
     12 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,3]
     13 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]
     14 ; SSE2-NEXT:    retq
     15 ;
     16 ; SSSE3-LABEL: vsel_float:
     17 ; SSSE3:       # BB#0: # %entry
     18 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,3]
     19 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]
     20 ; SSSE3-NEXT:    retq
     21 ;
     22 ; SSE41-LABEL: vsel_float:
     23 ; SSE41:       # BB#0: # %entry
     24 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
     25 ; SSE41-NEXT:    retq
     26 ;
     27 ; AVX-LABEL: vsel_float:
     28 ; AVX:       # BB#0: # %entry
     29 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
     30 ; AVX-NEXT:    retq
     31 entry:
     32   %vsel = select <4 x i1> <i1 true, i1 false, i1 true, i1 false>, <4 x float> %v1, <4 x float> %v2
     33   ret <4 x float> %vsel
     34 }
     35 
     36 define <4 x float> @vsel_float2(<4 x float> %v1, <4 x float> %v2) {
     37 ; SSE2-LABEL: vsel_float2:
     38 ; SSE2:       # BB#0: # %entry
     39 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
     40 ; SSE2-NEXT:    movaps %xmm1, %xmm0
     41 ; SSE2-NEXT:    retq
     42 ;
     43 ; SSSE3-LABEL: vsel_float2:
     44 ; SSSE3:       # BB#0: # %entry
     45 ; SSSE3-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
     46 ; SSSE3-NEXT:    movaps %xmm1, %xmm0
     47 ; SSSE3-NEXT:    retq
     48 ;
     49 ; SSE41-LABEL: vsel_float2:
     50 ; SSE41:       # BB#0: # %entry
     51 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
     52 ; SSE41-NEXT:    retq
     53 ;
     54 ; AVX-LABEL: vsel_float2:
     55 ; AVX:       # BB#0: # %entry
     56 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
     57 ; AVX-NEXT:    retq
     58 entry:
     59   %vsel = select <4 x i1> <i1 true, i1 false, i1 false, i1 false>, <4 x float> %v1, <4 x float> %v2
     60   ret <4 x float> %vsel
     61 }
     62 
     63 define <4 x i8> @vsel_4xi8(<4 x i8> %v1, <4 x i8> %v2) {
     64 ; SSE2-LABEL: vsel_4xi8:
     65 ; SSE2:       # BB#0: # %entry
     66 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[3,0]
     67 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]
     68 ; SSE2-NEXT:    retq
     69 ;
     70 ; SSSE3-LABEL: vsel_4xi8:
     71 ; SSSE3:       # BB#0: # %entry
     72 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[3,0]
     73 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]
     74 ; SSSE3-NEXT:    retq
     75 ;
     76 ; SSE41-LABEL: vsel_4xi8:
     77 ; SSE41:       # BB#0: # %entry
     78 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5],xmm0[6,7]
     79 ; SSE41-NEXT:    retq
     80 ;
     81 ; AVX1-LABEL: vsel_4xi8:
     82 ; AVX1:       # BB#0: # %entry
     83 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5],xmm0[6,7]
     84 ; AVX1-NEXT:    retq
     85 ;
     86 ; AVX2-LABEL: vsel_4xi8:
     87 ; AVX2:       # BB#0: # %entry
     88 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2],xmm0[3]
     89 ; AVX2-NEXT:    retq
     90 entry:
     91   %vsel = select <4 x i1> <i1 true, i1 true, i1 false, i1 true>, <4 x i8> %v1, <4 x i8> %v2
     92   ret <4 x i8> %vsel
     93 }
     94 
     95 define <4 x i16> @vsel_4xi16(<4 x i16> %v1, <4 x i16> %v2) {
     96 ; SSE2-LABEL: vsel_4xi16:
     97 ; SSE2:       # BB#0: # %entry
     98 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,0],xmm0[0,0]
     99 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[2,3]
    100 ; SSE2-NEXT:    movaps %xmm1, %xmm0
    101 ; SSE2-NEXT:    retq
    102 ;
    103 ; SSSE3-LABEL: vsel_4xi16:
    104 ; SSSE3:       # BB#0: # %entry
    105 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,0],xmm0[0,0]
    106 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[2,3]
    107 ; SSSE3-NEXT:    movaps %xmm1, %xmm0
    108 ; SSSE3-NEXT:    retq
    109 ;
    110 ; SSE41-LABEL: vsel_4xi16:
    111 ; SSE41:       # BB#0: # %entry
    112 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]
    113 ; SSE41-NEXT:    retq
    114 ;
    115 ; AVX1-LABEL: vsel_4xi16:
    116 ; AVX1:       # BB#0: # %entry
    117 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7]
    118 ; AVX1-NEXT:    retq
    119 ;
    120 ; AVX2-LABEL: vsel_4xi16:
    121 ; AVX2:       # BB#0: # %entry
    122 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3]
    123 ; AVX2-NEXT:    retq
    124 entry:
    125   %vsel = select <4 x i1> <i1 true, i1 false, i1 true, i1 true>, <4 x i16> %v1, <4 x i16> %v2
    126   ret <4 x i16> %vsel
    127 }
    128 
    129 define <4 x i32> @vsel_i32(<4 x i32> %v1, <4 x i32> %v2) {
    130 ; SSE2-LABEL: vsel_i32:
    131 ; SSE2:       # BB#0: # %entry
    132 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
    133 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
    134 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
    135 ; SSE2-NEXT:    retq
    136 ;
    137 ; SSSE3-LABEL: vsel_i32:
    138 ; SSSE3:       # BB#0: # %entry
    139 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3]
    140 ; SSSE3-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
    141 ; SSSE3-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
    142 ; SSSE3-NEXT:    retq
    143 ;
    144 ; SSE41-LABEL: vsel_i32:
    145 ; SSE41:       # BB#0: # %entry
    146 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
    147 ; SSE41-NEXT:    retq
    148 ;
    149 ; AVX1-LABEL: vsel_i32:
    150 ; AVX1:       # BB#0: # %entry
    151 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
    152 ; AVX1-NEXT:    retq
    153 ;
    154 ; AVX2-LABEL: vsel_i32:
    155 ; AVX2:       # BB#0: # %entry
    156 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
    157 ; AVX2-NEXT:    retq
    158 entry:
    159   %vsel = select <4 x i1> <i1 true, i1 false, i1 true, i1 false>, <4 x i32> %v1, <4 x i32> %v2
    160   ret <4 x i32> %vsel
    161 }
    162 
    163 define <2 x double> @vsel_double(<2 x double> %v1, <2 x double> %v2) {
    164 ; SSE2-LABEL: vsel_double:
    165 ; SSE2:       # BB#0: # %entry
    166 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
    167 ; SSE2-NEXT:    movapd %xmm1, %xmm0
    168 ; SSE2-NEXT:    retq
    169 ;
    170 ; SSSE3-LABEL: vsel_double:
    171 ; SSSE3:       # BB#0: # %entry
    172 ; SSSE3-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
    173 ; SSSE3-NEXT:    movapd %xmm1, %xmm0
    174 ; SSSE3-NEXT:    retq
    175 ;
    176 ; SSE41-LABEL: vsel_double:
    177 ; SSE41:       # BB#0: # %entry
    178 ; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
    179 ; SSE41-NEXT:    retq
    180 ;
    181 ; AVX-LABEL: vsel_double:
    182 ; AVX:       # BB#0: # %entry
    183 ; AVX-NEXT:    vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1]
    184 ; AVX-NEXT:    retq
    185 entry:
    186   %vsel = select <2 x i1> <i1 true, i1 false>, <2 x double> %v1, <2 x double> %v2
    187   ret <2 x double> %vsel
    188 }
    189 
    190 define <2 x i64> @vsel_i64(<2 x i64> %v1, <2 x i64> %v2) {
    191 ; SSE2-LABEL: vsel_i64:
    192 ; SSE2:       # BB#0: # %entry
    193 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
    194 ; SSE2-NEXT:    movapd %xmm1, %xmm0
    195 ; SSE2-NEXT:    retq
    196 ;
    197 ; SSSE3-LABEL: vsel_i64:
    198 ; SSSE3:       # BB#0: # %entry
    199 ; SSSE3-NEXT:    movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1]
    200 ; SSSE3-NEXT:    movapd %xmm1, %xmm0
    201 ; SSSE3-NEXT:    retq
    202 ;
    203 ; SSE41-LABEL: vsel_i64:
    204 ; SSE41:       # BB#0: # %entry
    205 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
    206 ; SSE41-NEXT:    retq
    207 ;
    208 ; AVX1-LABEL: vsel_i64:
    209 ; AVX1:       # BB#0: # %entry
    210 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
    211 ; AVX1-NEXT:    retq
    212 ;
    213 ; AVX2-LABEL: vsel_i64:
    214 ; AVX2:       # BB#0: # %entry
    215 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3]
    216 ; AVX2-NEXT:    retq
    217 entry:
    218   %vsel = select <2 x i1> <i1 true, i1 false>, <2 x i64> %v1, <2 x i64> %v2
    219   ret <2 x i64> %vsel
    220 }
    221 
    222 define <8 x i16> @vsel_8xi16(<8 x i16> %v1, <8 x i16> %v2) {
    223 ; SSE2-LABEL: vsel_8xi16:
    224 ; SSE2:       # BB#0: # %entry
    225 ; SSE2-NEXT:    movaps {{.*#+}} xmm2 = [0,65535,65535,65535,0,65535,65535,65535]
    226 ; SSE2-NEXT:    andps %xmm2, %xmm1
    227 ; SSE2-NEXT:    andnps %xmm0, %xmm2
    228 ; SSE2-NEXT:    orps %xmm1, %xmm2
    229 ; SSE2-NEXT:    movaps %xmm2, %xmm0
    230 ; SSE2-NEXT:    retq
    231 ;
    232 ; SSSE3-LABEL: vsel_8xi16:
    233 ; SSSE3:       # BB#0: # %entry
    234 ; SSSE3-NEXT:    movaps {{.*#+}} xmm2 = [0,65535,65535,65535,0,65535,65535,65535]
    235 ; SSSE3-NEXT:    andps %xmm2, %xmm1
    236 ; SSSE3-NEXT:    andnps %xmm0, %xmm2
    237 ; SSSE3-NEXT:    orps %xmm1, %xmm2
    238 ; SSSE3-NEXT:    movaps %xmm2, %xmm0
    239 ; SSSE3-NEXT:    retq
    240 ;
    241 ; SSE41-LABEL: vsel_8xi16:
    242 ; SSE41:       # BB#0: # %entry
    243 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3],xmm0[4],xmm1[5,6,7]
    244 ; SSE41-NEXT:    retq
    245 ;
    246 ; AVX-LABEL: vsel_8xi16:
    247 ; AVX:       # BB#0: # %entry
    248 ; AVX-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3],xmm0[4],xmm1[5,6,7]
    249 ; AVX-NEXT:    retq
    250 entry:
    251   %vsel = select <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false>, <8 x i16> %v1, <8 x i16> %v2
    252   ret <8 x i16> %vsel
    253 }
    254 
    255 define <16 x i8> @vsel_i8(<16 x i8> %v1, <16 x i8> %v2) {
    256 ; SSE2-LABEL: vsel_i8:
    257 ; SSE2:       # BB#0: # %entry
    258 ; SSE2-NEXT:    movaps {{.*#+}} xmm2 = [0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255]
    259 ; SSE2-NEXT:    andps %xmm2, %xmm1
    260 ; SSE2-NEXT:    andnps %xmm0, %xmm2
    261 ; SSE2-NEXT:    orps %xmm1, %xmm2
    262 ; SSE2-NEXT:    movaps %xmm2, %xmm0
    263 ; SSE2-NEXT:    retq
    264 ;
    265 ; SSSE3-LABEL: vsel_i8:
    266 ; SSSE3:       # BB#0: # %entry
    267 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[12],zero,zero,zero
    268 ; SSSE3-NEXT:    pshufb {{.*#+}} xmm1 = zero,xmm1[1,2,3],zero,xmm1[5,6,7],zero,xmm1[9,10,11],zero,xmm1[13,14,15]
    269 ; SSSE3-NEXT:    por %xmm1, %xmm0
    270 ; SSSE3-NEXT:    retq
    271 ;
    272 ; SSE41-LABEL: vsel_i8:
    273 ; SSE41:       # BB#0: # %entry
    274 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
    275 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255]
    276 ; SSE41-NEXT:    pblendvb %xmm1, %xmm2
    277 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
    278 ; SSE41-NEXT:    retq
    279 ;
    280 ; AVX-LABEL: vsel_i8:
    281 ; AVX:       # BB#0: # %entry
    282 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm2 = [0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255]
    283 ; AVX-NEXT:    vpblendvb %xmm2, %xmm1, %xmm0, %xmm0
    284 ; AVX-NEXT:    retq
    285 entry:
    286   %vsel = select <16 x i1> <i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false>, <16 x i8> %v1, <16 x i8> %v2
    287   ret <16 x i8> %vsel
    288 }
    289 
    290 
    291 ; AVX256 tests:
    292 
    293 define <8 x float> @vsel_float8(<8 x float> %v1, <8 x float> %v2) {
    294 ; SSE2-LABEL: vsel_float8:
    295 ; SSE2:       # BB#0: # %entry
    296 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3]
    297 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = xmm1[0],xmm3[1,2,3]
    298 ; SSE2-NEXT:    movaps %xmm2, %xmm0
    299 ; SSE2-NEXT:    movaps %xmm3, %xmm1
    300 ; SSE2-NEXT:    retq
    301 ;
    302 ; SSSE3-LABEL: vsel_float8:
    303 ; SSSE3:       # BB#0: # %entry
    304 ; SSSE3-NEXT:    movss {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3]
    305 ; SSSE3-NEXT:    movss {{.*#+}} xmm3 = xmm1[0],xmm3[1,2,3]
    306 ; SSSE3-NEXT:    movaps %xmm2, %xmm0
    307 ; SSSE3-NEXT:    movaps %xmm3, %xmm1
    308 ; SSSE3-NEXT:    retq
    309 ;
    310 ; SSE41-LABEL: vsel_float8:
    311 ; SSE41:       # BB#0: # %entry
    312 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3]
    313 ; SSE41-NEXT:    blendps {{.*#+}} xmm1 = xmm1[0],xmm3[1,2,3]
    314 ; SSE41-NEXT:    retq
    315 ;
    316 ; AVX-LABEL: vsel_float8:
    317 ; AVX:       # BB#0: # %entry
    318 ; AVX-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3],ymm0[4],ymm1[5,6,7]
    319 ; AVX-NEXT:    retq
    320 entry:
    321   %vsel = select <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false>, <8 x float> %v1, <8 x float> %v2
    322   ret <8 x float> %vsel
    323 }
    324 
    325 define <8 x i32> @vsel_i328(<8 x i32> %v1, <8 x i32> %v2) {
    326 ; SSE2-LABEL: vsel_i328:
    327 ; SSE2:       # BB#0: # %entry
    328 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3]
    329 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = xmm1[0],xmm3[1,2,3]
    330 ; SSE2-NEXT:    movaps %xmm2, %xmm0
    331 ; SSE2-NEXT:    movaps %xmm3, %xmm1
    332 ; SSE2-NEXT:    retq
    333 ;
    334 ; SSSE3-LABEL: vsel_i328:
    335 ; SSSE3:       # BB#0: # %entry
    336 ; SSSE3-NEXT:    movss {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3]
    337 ; SSSE3-NEXT:    movss {{.*#+}} xmm3 = xmm1[0],xmm3[1,2,3]
    338 ; SSSE3-NEXT:    movaps %xmm2, %xmm0
    339 ; SSSE3-NEXT:    movaps %xmm3, %xmm1
    340 ; SSSE3-NEXT:    retq
    341 ;
    342 ; SSE41-LABEL: vsel_i328:
    343 ; SSE41:       # BB#0: # %entry
    344 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3,4,5,6,7]
    345 ; SSE41-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,3,4,5,6,7]
    346 ; SSE41-NEXT:    retq
    347 ;
    348 ; AVX1-LABEL: vsel_i328:
    349 ; AVX1:       # BB#0: # %entry
    350 ; AVX1-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3],ymm0[4],ymm1[5,6,7]
    351 ; AVX1-NEXT:    retq
    352 ;
    353 ; AVX2-LABEL: vsel_i328:
    354 ; AVX2:       # BB#0: # %entry
    355 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3],ymm0[4],ymm1[5,6,7]
    356 ; AVX2-NEXT:    retq
    357 entry:
    358   %vsel = select <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false>, <8 x i32> %v1, <8 x i32> %v2
    359   ret <8 x i32> %vsel
    360 }
    361 
    362 define <8 x double> @vsel_double8(<8 x double> %v1, <8 x double> %v2) {
    363 ; SSE2-LABEL: vsel_double8:
    364 ; SSE2:       # BB#0: # %entry
    365 ; SSE2-NEXT:    movsd {{.*#+}} xmm4 = xmm0[0],xmm4[1]
    366 ; SSE2-NEXT:    movsd {{.*#+}} xmm6 = xmm2[0],xmm6[1]
    367 ; SSE2-NEXT:    movapd %xmm4, %xmm0
    368 ; SSE2-NEXT:    movaps %xmm5, %xmm1
    369 ; SSE2-NEXT:    movapd %xmm6, %xmm2
    370 ; SSE2-NEXT:    movaps %xmm7, %xmm3
    371 ; SSE2-NEXT:    retq
    372 ;
    373 ; SSSE3-LABEL: vsel_double8:
    374 ; SSSE3:       # BB#0: # %entry
    375 ; SSSE3-NEXT:    movsd {{.*#+}} xmm4 = xmm0[0],xmm4[1]
    376 ; SSSE3-NEXT:    movsd {{.*#+}} xmm6 = xmm2[0],xmm6[1]
    377 ; SSSE3-NEXT:    movapd %xmm4, %xmm0
    378 ; SSSE3-NEXT:    movaps %xmm5, %xmm1
    379 ; SSSE3-NEXT:    movapd %xmm6, %xmm2
    380 ; SSSE3-NEXT:    movaps %xmm7, %xmm3
    381 ; SSSE3-NEXT:    retq
    382 ;
    383 ; SSE41-LABEL: vsel_double8:
    384 ; SSE41:       # BB#0: # %entry
    385 ; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm0[0],xmm4[1]
    386 ; SSE41-NEXT:    blendpd {{.*#+}} xmm2 = xmm2[0],xmm6[1]
    387 ; SSE41-NEXT:    movaps %xmm5, %xmm1
    388 ; SSE41-NEXT:    movaps %xmm7, %xmm3
    389 ; SSE41-NEXT:    retq
    390 ;
    391 ; AVX-LABEL: vsel_double8:
    392 ; AVX:       # BB#0: # %entry
    393 ; AVX-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm2[1,2,3]
    394 ; AVX-NEXT:    vblendpd {{.*#+}} ymm1 = ymm1[0],ymm3[1,2,3]
    395 ; AVX-NEXT:    retq
    396 entry:
    397   %vsel = select <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false>, <8 x double> %v1, <8 x double> %v2
    398   ret <8 x double> %vsel
    399 }
    400 
    401 define <8 x i64> @vsel_i648(<8 x i64> %v1, <8 x i64> %v2) {
    402 ; SSE2-LABEL: vsel_i648:
    403 ; SSE2:       # BB#0: # %entry
    404 ; SSE2-NEXT:    movsd {{.*#+}} xmm4 = xmm0[0],xmm4[1]
    405 ; SSE2-NEXT:    movsd {{.*#+}} xmm6 = xmm2[0],xmm6[1]
    406 ; SSE2-NEXT:    movapd %xmm4, %xmm0
    407 ; SSE2-NEXT:    movaps %xmm5, %xmm1
    408 ; SSE2-NEXT:    movapd %xmm6, %xmm2
    409 ; SSE2-NEXT:    movaps %xmm7, %xmm3
    410 ; SSE2-NEXT:    retq
    411 ;
    412 ; SSSE3-LABEL: vsel_i648:
    413 ; SSSE3:       # BB#0: # %entry
    414 ; SSSE3-NEXT:    movsd {{.*#+}} xmm4 = xmm0[0],xmm4[1]
    415 ; SSSE3-NEXT:    movsd {{.*#+}} xmm6 = xmm2[0],xmm6[1]
    416 ; SSSE3-NEXT:    movapd %xmm4, %xmm0
    417 ; SSSE3-NEXT:    movaps %xmm5, %xmm1
    418 ; SSSE3-NEXT:    movapd %xmm6, %xmm2
    419 ; SSSE3-NEXT:    movaps %xmm7, %xmm3
    420 ; SSSE3-NEXT:    retq
    421 ;
    422 ; SSE41-LABEL: vsel_i648:
    423 ; SSE41:       # BB#0: # %entry
    424 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm4[4,5,6,7]
    425 ; SSE41-NEXT:    pblendw {{.*#+}} xmm2 = xmm2[0,1,2,3],xmm6[4,5,6,7]
    426 ; SSE41-NEXT:    movaps %xmm5, %xmm1
    427 ; SSE41-NEXT:    movaps %xmm7, %xmm3
    428 ; SSE41-NEXT:    retq
    429 ;
    430 ; AVX1-LABEL: vsel_i648:
    431 ; AVX1:       # BB#0: # %entry
    432 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm2[1,2,3]
    433 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm1 = ymm1[0],ymm3[1,2,3]
    434 ; AVX1-NEXT:    retq
    435 ;
    436 ; AVX2-LABEL: vsel_i648:
    437 ; AVX2:       # BB#0: # %entry
    438 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm0[0,1],ymm2[2,3,4,5,6,7]
    439 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm1 = ymm1[0,1],ymm3[2,3,4,5,6,7]
    440 ; AVX2-NEXT:    retq
    441 entry:
    442   %vsel = select <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false>, <8 x i64> %v1, <8 x i64> %v2
    443   ret <8 x i64> %vsel
    444 }
    445 
    446 define <4 x double> @vsel_double4(<4 x double> %v1, <4 x double> %v2) {
    447 ; SSE2-LABEL: vsel_double4:
    448 ; SSE2:       # BB#0: # %entry
    449 ; SSE2-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
    450 ; SSE2-NEXT:    movsd {{.*#+}} xmm3 = xmm1[0],xmm3[1]
    451 ; SSE2-NEXT:    movapd %xmm2, %xmm0
    452 ; SSE2-NEXT:    movapd %xmm3, %xmm1
    453 ; SSE2-NEXT:    retq
    454 ;
    455 ; SSSE3-LABEL: vsel_double4:
    456 ; SSSE3:       # BB#0: # %entry
    457 ; SSSE3-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
    458 ; SSSE3-NEXT:    movsd {{.*#+}} xmm3 = xmm1[0],xmm3[1]
    459 ; SSSE3-NEXT:    movapd %xmm2, %xmm0
    460 ; SSSE3-NEXT:    movapd %xmm3, %xmm1
    461 ; SSSE3-NEXT:    retq
    462 ;
    463 ; SSE41-LABEL: vsel_double4:
    464 ; SSE41:       # BB#0: # %entry
    465 ; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm0[0],xmm2[1]
    466 ; SSE41-NEXT:    blendpd {{.*#+}} xmm1 = xmm1[0],xmm3[1]
    467 ; SSE41-NEXT:    retq
    468 ;
    469 ; AVX-LABEL: vsel_double4:
    470 ; AVX:       # BB#0: # %entry
    471 ; AVX-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3]
    472 ; AVX-NEXT:    retq
    473 entry:
    474   %vsel = select <4 x i1> <i1 true, i1 false, i1 true, i1 false>, <4 x double> %v1, <4 x double> %v2
    475   ret <4 x double> %vsel
    476 }
    477 
    478 define <2 x double> @testa(<2 x double> %x, <2 x double> %y) {
    479 ; SSE2-LABEL: testa:
    480 ; SSE2:       # BB#0: # %entry
    481 ; SSE2-NEXT:    movapd %xmm1, %xmm2
    482 ; SSE2-NEXT:    cmplepd %xmm0, %xmm2
    483 ; SSE2-NEXT:    andpd %xmm2, %xmm0
    484 ; SSE2-NEXT:    andnpd %xmm1, %xmm2
    485 ; SSE2-NEXT:    orpd %xmm2, %xmm0
    486 ; SSE2-NEXT:    retq
    487 ;
    488 ; SSSE3-LABEL: testa:
    489 ; SSSE3:       # BB#0: # %entry
    490 ; SSSE3-NEXT:    movapd %xmm1, %xmm2
    491 ; SSSE3-NEXT:    cmplepd %xmm0, %xmm2
    492 ; SSSE3-NEXT:    andpd %xmm2, %xmm0
    493 ; SSSE3-NEXT:    andnpd %xmm1, %xmm2
    494 ; SSSE3-NEXT:    orpd %xmm2, %xmm0
    495 ; SSSE3-NEXT:    retq
    496 ;
    497 ; SSE41-LABEL: testa:
    498 ; SSE41:       # BB#0: # %entry
    499 ; SSE41-NEXT:    movapd %xmm0, %xmm2
    500 ; SSE41-NEXT:    movapd %xmm1, %xmm0
    501 ; SSE41-NEXT:    cmplepd %xmm2, %xmm0
    502 ; SSE41-NEXT:    blendvpd %xmm2, %xmm1
    503 ; SSE41-NEXT:    movapd %xmm1, %xmm0
    504 ; SSE41-NEXT:    retq
    505 ;
    506 ; AVX-LABEL: testa:
    507 ; AVX:       # BB#0: # %entry
    508 ; AVX-NEXT:    vcmplepd %xmm0, %xmm1, %xmm2
    509 ; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
    510 ; AVX-NEXT:    retq
    511 entry:
    512   %max_is_x = fcmp oge <2 x double> %x, %y
    513   %max = select <2 x i1> %max_is_x, <2 x double> %x, <2 x double> %y
    514   ret <2 x double> %max
    515 }
    516 
    517 define <2 x double> @testb(<2 x double> %x, <2 x double> %y) {
    518 ; SSE2-LABEL: testb:
    519 ; SSE2:       # BB#0: # %entry
    520 ; SSE2-NEXT:    movapd %xmm1, %xmm2
    521 ; SSE2-NEXT:    cmpnlepd %xmm0, %xmm2
    522 ; SSE2-NEXT:    andpd %xmm2, %xmm0
    523 ; SSE2-NEXT:    andnpd %xmm1, %xmm2
    524 ; SSE2-NEXT:    orpd %xmm2, %xmm0
    525 ; SSE2-NEXT:    retq
    526 ;
    527 ; SSSE3-LABEL: testb:
    528 ; SSSE3:       # BB#0: # %entry
    529 ; SSSE3-NEXT:    movapd %xmm1, %xmm2
    530 ; SSSE3-NEXT:    cmpnlepd %xmm0, %xmm2
    531 ; SSSE3-NEXT:    andpd %xmm2, %xmm0
    532 ; SSSE3-NEXT:    andnpd %xmm1, %xmm2
    533 ; SSSE3-NEXT:    orpd %xmm2, %xmm0
    534 ; SSSE3-NEXT:    retq
    535 ;
    536 ; SSE41-LABEL: testb:
    537 ; SSE41:       # BB#0: # %entry
    538 ; SSE41-NEXT:    movapd %xmm0, %xmm2
    539 ; SSE41-NEXT:    movapd %xmm1, %xmm0
    540 ; SSE41-NEXT:    cmpnlepd %xmm2, %xmm0
    541 ; SSE41-NEXT:    blendvpd %xmm2, %xmm1
    542 ; SSE41-NEXT:    movapd %xmm1, %xmm0
    543 ; SSE41-NEXT:    retq
    544 ;
    545 ; AVX-LABEL: testb:
    546 ; AVX:       # BB#0: # %entry
    547 ; AVX-NEXT:    vcmpnlepd %xmm0, %xmm1, %xmm2
    548 ; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
    549 ; AVX-NEXT:    retq
    550 entry:
    551   %min_is_x = fcmp ult <2 x double> %x, %y
    552   %min = select <2 x i1> %min_is_x, <2 x double> %x, <2 x double> %y
    553   ret <2 x double> %min
    554 }
    555 
    556 ; If we can figure out a blend has a constant mask, we should emit the
    557 ; blend instruction with an immediate mask
    558 define <4 x double> @constant_blendvpd_avx(<4 x double> %xy, <4 x double> %ab) {
    559 ; SSE2-LABEL: constant_blendvpd_avx:
    560 ; SSE2:       # BB#0: # %entry
    561 ; SSE2-NEXT:    movsd {{.*#+}} xmm3 = xmm1[0],xmm3[1]
    562 ; SSE2-NEXT:    movaps %xmm2, %xmm0
    563 ; SSE2-NEXT:    movapd %xmm3, %xmm1
    564 ; SSE2-NEXT:    retq
    565 ;
    566 ; SSSE3-LABEL: constant_blendvpd_avx:
    567 ; SSSE3:       # BB#0: # %entry
    568 ; SSSE3-NEXT:    movsd {{.*#+}} xmm3 = xmm1[0],xmm3[1]
    569 ; SSSE3-NEXT:    movaps %xmm2, %xmm0
    570 ; SSSE3-NEXT:    movapd %xmm3, %xmm1
    571 ; SSSE3-NEXT:    retq
    572 ;
    573 ; SSE41-LABEL: constant_blendvpd_avx:
    574 ; SSE41:       # BB#0: # %entry
    575 ; SSE41-NEXT:    blendpd {{.*#+}} xmm1 = xmm1[0],xmm3[1]
    576 ; SSE41-NEXT:    movaps %xmm2, %xmm0
    577 ; SSE41-NEXT:    retq
    578 ;
    579 ; AVX-LABEL: constant_blendvpd_avx:
    580 ; AVX:       # BB#0: # %entry
    581 ; AVX-NEXT:    vblendpd {{.*#+}} ymm0 = ymm1[0,1],ymm0[2],ymm1[3]
    582 ; AVX-NEXT:    retq
    583 entry:
    584   %select = select <4 x i1> <i1 false, i1 false, i1 true, i1 false>, <4 x double> %xy, <4 x double> %ab
    585   ret <4 x double> %select
    586 }
    587 
    588 define <8 x float> @constant_blendvps_avx(<8 x float> %xyzw, <8 x float> %abcd) {
    589 ; SSE2-LABEL: constant_blendvps_avx:
    590 ; SSE2:       # BB#0: # %entry
    591 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,0],xmm2[2,0]
    592 ; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,1],xmm0[2,0]
    593 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,0],xmm3[2,0]
    594 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,1],xmm1[2,0]
    595 ; SSE2-NEXT:    movaps %xmm2, %xmm0
    596 ; SSE2-NEXT:    movaps %xmm3, %xmm1
    597 ; SSE2-NEXT:    retq
    598 ;
    599 ; SSSE3-LABEL: constant_blendvps_avx:
    600 ; SSSE3:       # BB#0: # %entry
    601 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,0],xmm2[2,0]
    602 ; SSSE3-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,1],xmm0[2,0]
    603 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[3,0],xmm3[2,0]
    604 ; SSSE3-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,1],xmm1[2,0]
    605 ; SSSE3-NEXT:    movaps %xmm2, %xmm0
    606 ; SSSE3-NEXT:    movaps %xmm3, %xmm1
    607 ; SSSE3-NEXT:    retq
    608 ;
    609 ; SSE41-LABEL: constant_blendvps_avx:
    610 ; SSE41:       # BB#0: # %entry
    611 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm2[0,1,2],xmm0[3]
    612 ; SSE41-NEXT:    blendps {{.*#+}} xmm1 = xmm3[0,1,2],xmm1[3]
    613 ; SSE41-NEXT:    retq
    614 ;
    615 ; AVX-LABEL: constant_blendvps_avx:
    616 ; AVX:       # BB#0: # %entry
    617 ; AVX-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1,2],ymm0[3],ymm1[4,5,6],ymm0[7]
    618 ; AVX-NEXT:    retq
    619 entry:
    620   %select = select <8 x i1> <i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false, i1 true>, <8 x float> %xyzw, <8 x float> %abcd
    621   ret <8 x float> %select
    622 }
    623 
    624 define <32 x i8> @constant_pblendvb_avx2(<32 x i8> %xyzw, <32 x i8> %abcd) {
    625 ; SSE2-LABEL: constant_pblendvb_avx2:
    626 ; SSE2:       # BB#0: # %entry
    627 ; SSE2-NEXT:    movaps {{.*#+}} xmm4 = [255,255,0,255,0,0,0,255,255,255,0,255,0,0,0,255]
    628 ; SSE2-NEXT:    movaps %xmm4, %xmm5
    629 ; SSE2-NEXT:    andnps %xmm0, %xmm5
    630 ; SSE2-NEXT:    andps %xmm4, %xmm2
    631 ; SSE2-NEXT:    orps %xmm2, %xmm5
    632 ; SSE2-NEXT:    andps %xmm4, %xmm3
    633 ; SSE2-NEXT:    andnps %xmm1, %xmm4
    634 ; SSE2-NEXT:    orps %xmm3, %xmm4
    635 ; SSE2-NEXT:    movaps  %xmm5, %xmm0
    636 ; SSE2-NEXT:    movaps  %xmm4, %xmm1
    637 ; SSE2-NEXT:    retq
    638 ;
    639 ; SSSE3-LABEL: constant_pblendvb_avx2:
    640 ; SSSE3:       # BB#0: # %entry
    641 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm4 = [128,128,2,128,4,5,6,128,128,128,10,128,12,13,14,128]
    642 ; SSSE3-NEXT:    pshufb %xmm4, %xmm0
    643 ; SSSE3-NEXT:    movdqa {{.*#+}} xmm5 = [0,1,128,3,128,128,128,7,8,9,128,11,128,128,128,15]
    644 ; SSSE3-NEXT:    pshufb %xmm5, %xmm2
    645 ; SSSE3-NEXT:    por %xmm2, %xmm0
    646 ; SSSE3-NEXT:    pshufb %xmm4, %xmm1
    647 ; SSSE3-NEXT:    pshufb %xmm5, %xmm3
    648 ; SSSE3-NEXT:    por %xmm3, %xmm1
    649 ; SSSE3-NEXT:    retq
    650 ;
    651 ; SSE41-LABEL: constant_pblendvb_avx2:
    652 ; SSE41:       # BB#0: # %entry
    653 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
    654 ; SSE41-NEXT:    movaps {{.*#+}} xmm0 = [255,255,0,255,0,0,0,255,255,255,0,255,0,0,0,255]
    655 ; SSE41-NEXT:    pblendvb %xmm2, %xmm4
    656 ; SSE41-NEXT:    pblendvb %xmm3, %xmm1
    657 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
    658 ; SSE41-NEXT:    retq
    659 ;
    660 ; AVX1-LABEL: constant_pblendvb_avx2:
    661 ; AVX1:       # BB#0: # %entry
    662 ; AVX1-NEXT:    vextractf128    $1, %ymm1, %xmm2
    663 ; AVX1-NEXT:    vextractf128    $1, %ymm0, %xmm3
    664 ; AVX1-NEXT:    vmovdqa .LCPI18_0(%rip), %xmm4  # xmm4 = [255,255,0,255,0,0,0,255,255,255,0,255,0,0,0,255]
    665 ; AVX1-NEXT:    vpblendvb       %xmm4, %xmm2, %xmm3, %xmm2
    666 ; AVX1-NEXT:    vpblendvb       %xmm4, %xmm1, %xmm0, %xmm0
    667 ; AVX1-NEXT:    vinsertf128     $1, %xmm2, %ymm0, %ymm0
    668 ; AVX1-NEXT:    retq
    669 ;
    670 ; AVX2-LABEL: constant_pblendvb_avx2:
    671 ; AVX2:       # BB#0: # %entry
    672 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [0,0,255,0,255,255,255,0,0,0,255,0,255,255,255,0,0,0,255,0,255,255,255,0,0,0,255,0,255,255,255,0]
    673 ; AVX2-NEXT:    vpblendvb %ymm2, %ymm0, %ymm1, %ymm0
    674 ; AVX2-NEXT:    retq
    675 entry:
    676   %select = select <32 x i1> <i1 false, i1 false, i1 true, i1 false, i1 true, i1 true, i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 true, i1 true, i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 true, i1 true, i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 true, i1 true, i1 true, i1 false>, <32 x i8> %xyzw, <32 x i8> %abcd
    677   ret <32 x i8> %select
    678 }
    679 
    680 declare <8 x float> @llvm.x86.avx.blendv.ps.256(<8 x float>, <8 x float>, <8 x float>)
    681 declare <4 x double> @llvm.x86.avx.blendv.pd.256(<4 x double>, <4 x double>, <4 x double>)
    682 
    683 ;; 4 tests for shufflevectors that optimize to blend + immediate
    684 define <4 x float> @blend_shufflevector_4xfloat(<4 x float> %a, <4 x float> %b) {
    685 ; SSE2-LABEL: blend_shufflevector_4xfloat:
    686 ; SSE2:       # BB#0: # %entry
    687 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,3]
    688 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]
    689 ; SSE2-NEXT:    retq
    690 ;
    691 ; SSSE3-LABEL: blend_shufflevector_4xfloat:
    692 ; SSSE3:       # BB#0: # %entry
    693 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,3]
    694 ; SSSE3-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,2,1,3]
    695 ; SSSE3-NEXT:    retq
    696 ;
    697 ; SSE41-LABEL: blend_shufflevector_4xfloat:
    698 ; SSE41:       # BB#0: # %entry
    699 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
    700 ; SSE41-NEXT:    retq
    701 ;
    702 ; AVX-LABEL: blend_shufflevector_4xfloat:
    703 ; AVX:       # BB#0: # %entry
    704 ; AVX-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
    705 ; AVX-NEXT:    retq
    706 entry:
    707   %select = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 5, i32 2, i32 7>
    708   ret <4 x float> %select
    709 }
    710 
    711 define <8 x float> @blend_shufflevector_8xfloat(<8 x float> %a, <8 x float> %b) {
    712 ; SSE2-LABEL: blend_shufflevector_8xfloat:
    713 ; SSE2:       # BB#0: # %entry
    714 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3]
    715 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm3[3,0]
    716 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,1],xmm1[0,2]
    717 ; SSE2-NEXT:    movaps %xmm2, %xmm0
    718 ; SSE2-NEXT:    movaps %xmm3, %xmm1
    719 ; SSE2-NEXT:    retq
    720 ;
    721 ; SSSE3-LABEL: blend_shufflevector_8xfloat:
    722 ; SSSE3:       # BB#0: # %entry
    723 ; SSSE3-NEXT:    movss {{.*#+}} xmm2 = xmm0[0],xmm2[1,2,3]
    724 ; SSSE3-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm3[3,0]
    725 ; SSSE3-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,1],xmm1[0,2]
    726 ; SSSE3-NEXT:    movaps %xmm2, %xmm0
    727 ; SSSE3-NEXT:    movaps %xmm3, %xmm1
    728 ; SSSE3-NEXT:    retq
    729 ;
    730 ; SSE41-LABEL: blend_shufflevector_8xfloat:
    731 ; SSE41:       # BB#0: # %entry
    732 ; SSE41-NEXT:    blendps {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3]
    733 ; SSE41-NEXT:    blendps {{.*#+}} xmm1 = xmm3[0,1],xmm1[2],xmm3[3]
    734 ; SSE41-NEXT:    retq
    735 ;
    736 ; AVX-LABEL: blend_shufflevector_8xfloat:
    737 ; AVX:       # BB#0: # %entry
    738 ; AVX-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3,4,5],ymm0[6],ymm1[7]
    739 ; AVX-NEXT:    retq
    740 entry:
    741   %select = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 9, i32 10, i32 11, i32 12, i32 13, i32 6, i32 15>
    742   ret <8 x float> %select
    743 }
    744 
    745 define <4 x double> @blend_shufflevector_4xdouble(<4 x double> %a, <4 x double> %b) {
    746 ; SSE2-LABEL: blend_shufflevector_4xdouble:
    747 ; SSE2:       # BB#0: # %entry
    748 ; SSE2-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
    749 ; SSE2-NEXT:    movapd %xmm2, %xmm0
    750 ; SSE2-NEXT:    retq
    751 ;
    752 ; SSSE3-LABEL: blend_shufflevector_4xdouble:
    753 ; SSSE3:       # BB#0: # %entry
    754 ; SSSE3-NEXT:    movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1]
    755 ; SSSE3-NEXT:    movapd %xmm2, %xmm0
    756 ; SSSE3-NEXT:    retq
    757 ;
    758 ; SSE41-LABEL: blend_shufflevector_4xdouble:
    759 ; SSE41:       # BB#0: # %entry
    760 ; SSE41-NEXT:    blendpd {{.*#+}} xmm0 = xmm0[0],xmm2[1]
    761 ; SSE41-NEXT:    retq
    762 ;
    763 ; AVX-LABEL: blend_shufflevector_4xdouble:
    764 ; AVX:       # BB#0: # %entry
    765 ; AVX-NEXT:    vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2,3]
    766 ; AVX-NEXT:    retq
    767 entry:
    768   %select = shufflevector <4 x double> %a, <4 x double> %b, <4 x i32> <i32 0, i32 5, i32 2, i32 3>
    769   ret <4 x double> %select
    770 }
    771 
    772 define <4 x i64> @blend_shufflevector_4xi64(<4 x i64> %a, <4 x i64> %b) {
    773 ; SSE2-LABEL: blend_shufflevector_4xi64:
    774 ; SSE2:       # BB#0: # %entry
    775 ; SSE2-NEXT:    movsd {{.*#+}} xmm0 = xmm2[0],xmm0[1]
    776 ; SSE2-NEXT:    movaps %xmm3, %xmm1
    777 ; SSE2-NEXT:    retq
    778 ;
    779 ; SSSE3-LABEL: blend_shufflevector_4xi64:
    780 ; SSSE3:       # BB#0: # %entry
    781 ; SSSE3-NEXT:    movsd {{.*#+}} xmm0 = xmm2[0],xmm0[1]
    782 ; SSSE3-NEXT:    movaps %xmm3, %xmm1
    783 ; SSSE3-NEXT:    retq
    784 ;
    785 ; SSE41-LABEL: blend_shufflevector_4xi64:
    786 ; SSE41:       # BB#0: # %entry
    787 ; SSE41-NEXT:    pblendw {{.*#+}} xmm0 = xmm2[0,1,2,3],xmm0[4,5,6,7]
    788 ; SSE41-NEXT:    movaps %xmm3, %xmm1
    789 ; SSE41-NEXT:    retq
    790 ;
    791 ; AVX1-LABEL: blend_shufflevector_4xi64:
    792 ; AVX1:       # BB#0: # %entry
    793 ; AVX1-NEXT:    vblendpd {{.*#+}} ymm0 = ymm1[0],ymm0[1],ymm1[2,3]
    794 ; AVX1-NEXT:    retq
    795 ;
    796 ; AVX2-LABEL: blend_shufflevector_4xi64:
    797 ; AVX2:       # BB#0: # %entry
    798 ; AVX2-NEXT:    vpblendd {{.*#+}} ymm0 = ymm1[0,1],ymm0[2,3],ymm1[4,5,6,7]
    799 ; AVX2-NEXT:    retq
    800 entry:
    801   %select = shufflevector <4 x i64> %a, <4 x i64> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 7>
    802   ret <4 x i64> %select
    803 }
    804