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-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
      3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
      4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
      5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
      6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW
      7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512VL
      8 
      9 ;
     10 ; vXi64
     11 ;
     12 
     13 define i64 @test_v2i64(<2 x i64> %a0) {
     14 ; SSE2-LABEL: test_v2i64:
     15 ; SSE2:       # %bb.0:
     16 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
     17 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
     18 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
     19 ; SSE2-NEXT:    pxor %xmm2, %xmm3
     20 ; SSE2-NEXT:    pxor %xmm1, %xmm2
     21 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
     22 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
     23 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
     24 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
     25 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
     26 ; SSE2-NEXT:    pand %xmm5, %xmm2
     27 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
     28 ; SSE2-NEXT:    por %xmm2, %xmm3
     29 ; SSE2-NEXT:    pand %xmm3, %xmm0
     30 ; SSE2-NEXT:    pandn %xmm1, %xmm3
     31 ; SSE2-NEXT:    por %xmm0, %xmm3
     32 ; SSE2-NEXT:    movq %xmm3, %rax
     33 ; SSE2-NEXT:    retq
     34 ;
     35 ; SSE41-LABEL: test_v2i64:
     36 ; SSE41:       # %bb.0:
     37 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
     38 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
     39 ; SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,0,2147483648,0]
     40 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
     41 ; SSE41-NEXT:    pxor %xmm0, %xmm3
     42 ; SSE41-NEXT:    pxor %xmm2, %xmm0
     43 ; SSE41-NEXT:    movdqa %xmm3, %xmm4
     44 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
     45 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
     46 ; SSE41-NEXT:    pcmpeqd %xmm3, %xmm0
     47 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
     48 ; SSE41-NEXT:    pand %xmm5, %xmm3
     49 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
     50 ; SSE41-NEXT:    por %xmm3, %xmm0
     51 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
     52 ; SSE41-NEXT:    movq %xmm2, %rax
     53 ; SSE41-NEXT:    retq
     54 ;
     55 ; AVX-LABEL: test_v2i64:
     56 ; AVX:       # %bb.0:
     57 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
     58 ; AVX-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
     59 ; AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
     60 ; AVX-NEXT:    vmovq %xmm0, %rax
     61 ; AVX-NEXT:    retq
     62 ;
     63 ; AVX512BW-LABEL: test_v2i64:
     64 ; AVX512BW:       # %bb.0:
     65 ; AVX512BW-NEXT:    # kill: def $xmm0 killed $xmm0 def $zmm0
     66 ; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
     67 ; AVX512BW-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
     68 ; AVX512BW-NEXT:    vmovq %xmm0, %rax
     69 ; AVX512BW-NEXT:    vzeroupper
     70 ; AVX512BW-NEXT:    retq
     71 ;
     72 ; AVX512VL-LABEL: test_v2i64:
     73 ; AVX512VL:       # %bb.0:
     74 ; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
     75 ; AVX512VL-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm0
     76 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
     77 ; AVX512VL-NEXT:    retq
     78   %1 = call i64 @llvm.experimental.vector.reduce.smax.i64.v2i64(<2 x i64> %a0)
     79   ret i64 %1
     80 }
     81 
     82 define i64 @test_v4i64(<4 x i64> %a0) {
     83 ; SSE2-LABEL: test_v4i64:
     84 ; SSE2:       # %bb.0:
     85 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
     86 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
     87 ; SSE2-NEXT:    pxor %xmm2, %xmm3
     88 ; SSE2-NEXT:    movdqa %xmm0, %xmm4
     89 ; SSE2-NEXT:    pxor %xmm2, %xmm4
     90 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
     91 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
     92 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
     93 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm4
     94 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
     95 ; SSE2-NEXT:    pand %xmm6, %xmm3
     96 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
     97 ; SSE2-NEXT:    por %xmm3, %xmm4
     98 ; SSE2-NEXT:    pand %xmm4, %xmm0
     99 ; SSE2-NEXT:    pandn %xmm1, %xmm4
    100 ; SSE2-NEXT:    por %xmm0, %xmm4
    101 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[2,3,0,1]
    102 ; SSE2-NEXT:    movdqa %xmm4, %xmm1
    103 ; SSE2-NEXT:    pxor %xmm2, %xmm1
    104 ; SSE2-NEXT:    pxor %xmm0, %xmm2
    105 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
    106 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
    107 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
    108 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm2
    109 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
    110 ; SSE2-NEXT:    pand %xmm5, %xmm1
    111 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
    112 ; SSE2-NEXT:    por %xmm1, %xmm2
    113 ; SSE2-NEXT:    pand %xmm2, %xmm4
    114 ; SSE2-NEXT:    pandn %xmm0, %xmm2
    115 ; SSE2-NEXT:    por %xmm4, %xmm2
    116 ; SSE2-NEXT:    movq %xmm2, %rax
    117 ; SSE2-NEXT:    retq
    118 ;
    119 ; SSE41-LABEL: test_v4i64:
    120 ; SSE41:       # %bb.0:
    121 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
    122 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,0,2147483648,0]
    123 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
    124 ; SSE41-NEXT:    pxor %xmm3, %xmm0
    125 ; SSE41-NEXT:    movdqa %xmm2, %xmm4
    126 ; SSE41-NEXT:    pxor %xmm3, %xmm4
    127 ; SSE41-NEXT:    movdqa %xmm4, %xmm5
    128 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
    129 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
    130 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
    131 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
    132 ; SSE41-NEXT:    pand %xmm6, %xmm4
    133 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
    134 ; SSE41-NEXT:    por %xmm4, %xmm0
    135 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
    136 ; SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,0,1]
    137 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
    138 ; SSE41-NEXT:    pxor %xmm3, %xmm0
    139 ; SSE41-NEXT:    pxor %xmm2, %xmm3
    140 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
    141 ; SSE41-NEXT:    pcmpgtd %xmm3, %xmm4
    142 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
    143 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
    144 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
    145 ; SSE41-NEXT:    pand %xmm5, %xmm3
    146 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
    147 ; SSE41-NEXT:    por %xmm3, %xmm0
    148 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
    149 ; SSE41-NEXT:    movq %xmm2, %rax
    150 ; SSE41-NEXT:    retq
    151 ;
    152 ; AVX1-LABEL: test_v4i64:
    153 ; AVX1:       # %bb.0:
    154 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
    155 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
    156 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm3
    157 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
    158 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
    159 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
    160 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
    161 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
    162 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm3, %xmm3
    163 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
    164 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
    165 ; AVX1-NEXT:    vmovq %xmm0, %rax
    166 ; AVX1-NEXT:    vzeroupper
    167 ; AVX1-NEXT:    retq
    168 ;
    169 ; AVX2-LABEL: test_v4i64:
    170 ; AVX2:       # %bb.0:
    171 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
    172 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
    173 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
    174 ; AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
    175 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
    176 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
    177 ; AVX2-NEXT:    vmovq %xmm0, %rax
    178 ; AVX2-NEXT:    vzeroupper
    179 ; AVX2-NEXT:    retq
    180 ;
    181 ; AVX512BW-LABEL: test_v4i64:
    182 ; AVX512BW:       # %bb.0:
    183 ; AVX512BW-NEXT:    # kill: def $ymm0 killed $ymm0 def $zmm0
    184 ; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
    185 ; AVX512BW-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
    186 ; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    187 ; AVX512BW-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
    188 ; AVX512BW-NEXT:    vmovq %xmm0, %rax
    189 ; AVX512BW-NEXT:    vzeroupper
    190 ; AVX512BW-NEXT:    retq
    191 ;
    192 ; AVX512VL-LABEL: test_v4i64:
    193 ; AVX512VL:       # %bb.0:
    194 ; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
    195 ; AVX512VL-NEXT:    vpmaxsq %ymm1, %ymm0, %ymm0
    196 ; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    197 ; AVX512VL-NEXT:    vpmaxsq %ymm1, %ymm0, %ymm0
    198 ; AVX512VL-NEXT:    vmovq %xmm0, %rax
    199 ; AVX512VL-NEXT:    vzeroupper
    200 ; AVX512VL-NEXT:    retq
    201   %1 = call i64 @llvm.experimental.vector.reduce.smax.i64.v4i64(<4 x i64> %a0)
    202   ret i64 %1
    203 }
    204 
    205 define i64 @test_v8i64(<8 x i64> %a0) {
    206 ; SSE2-LABEL: test_v8i64:
    207 ; SSE2:       # %bb.0:
    208 ; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,0,2147483648,0]
    209 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
    210 ; SSE2-NEXT:    pxor %xmm4, %xmm5
    211 ; SSE2-NEXT:    movdqa %xmm0, %xmm6
    212 ; SSE2-NEXT:    pxor %xmm4, %xmm6
    213 ; SSE2-NEXT:    movdqa %xmm6, %xmm7
    214 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
    215 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
    216 ; SSE2-NEXT:    pcmpeqd %xmm5, %xmm6
    217 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
    218 ; SSE2-NEXT:    pand %xmm8, %xmm6
    219 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
    220 ; SSE2-NEXT:    por %xmm6, %xmm5
    221 ; SSE2-NEXT:    pand %xmm5, %xmm0
    222 ; SSE2-NEXT:    pandn %xmm2, %xmm5
    223 ; SSE2-NEXT:    por %xmm0, %xmm5
    224 ; SSE2-NEXT:    movdqa %xmm3, %xmm0
    225 ; SSE2-NEXT:    pxor %xmm4, %xmm0
    226 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
    227 ; SSE2-NEXT:    pxor %xmm4, %xmm2
    228 ; SSE2-NEXT:    movdqa %xmm2, %xmm6
    229 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm6
    230 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
    231 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
    232 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
    233 ; SSE2-NEXT:    pand %xmm7, %xmm0
    234 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
    235 ; SSE2-NEXT:    por %xmm0, %xmm2
    236 ; SSE2-NEXT:    pand %xmm2, %xmm1
    237 ; SSE2-NEXT:    pandn %xmm3, %xmm2
    238 ; SSE2-NEXT:    por %xmm1, %xmm2
    239 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
    240 ; SSE2-NEXT:    pxor %xmm4, %xmm0
    241 ; SSE2-NEXT:    movdqa %xmm5, %xmm1
    242 ; SSE2-NEXT:    pxor %xmm4, %xmm1
    243 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
    244 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
    245 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
    246 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
    247 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
    248 ; SSE2-NEXT:    pand %xmm6, %xmm0
    249 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
    250 ; SSE2-NEXT:    por %xmm0, %xmm1
    251 ; SSE2-NEXT:    pand %xmm1, %xmm5
    252 ; SSE2-NEXT:    pandn %xmm2, %xmm1
    253 ; SSE2-NEXT:    por %xmm5, %xmm1
    254 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
    255 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
    256 ; SSE2-NEXT:    pxor %xmm4, %xmm2
    257 ; SSE2-NEXT:    pxor %xmm0, %xmm4
    258 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
    259 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm3
    260 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
    261 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm4
    262 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
    263 ; SSE2-NEXT:    pand %xmm5, %xmm2
    264 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
    265 ; SSE2-NEXT:    por %xmm2, %xmm3
    266 ; SSE2-NEXT:    pand %xmm3, %xmm1
    267 ; SSE2-NEXT:    pandn %xmm0, %xmm3
    268 ; SSE2-NEXT:    por %xmm1, %xmm3
    269 ; SSE2-NEXT:    movq %xmm3, %rax
    270 ; SSE2-NEXT:    retq
    271 ;
    272 ; SSE41-LABEL: test_v8i64:
    273 ; SSE41:       # %bb.0:
    274 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
    275 ; SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,0,2147483648,0]
    276 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
    277 ; SSE41-NEXT:    pxor %xmm5, %xmm0
    278 ; SSE41-NEXT:    movdqa %xmm4, %xmm6
    279 ; SSE41-NEXT:    pxor %xmm5, %xmm6
    280 ; SSE41-NEXT:    movdqa %xmm6, %xmm7
    281 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
    282 ; SSE41-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
    283 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm6
    284 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
    285 ; SSE41-NEXT:    pand %xmm8, %xmm6
    286 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
    287 ; SSE41-NEXT:    por %xmm6, %xmm0
    288 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
    289 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
    290 ; SSE41-NEXT:    pxor %xmm5, %xmm0
    291 ; SSE41-NEXT:    movdqa %xmm1, %xmm4
    292 ; SSE41-NEXT:    pxor %xmm5, %xmm4
    293 ; SSE41-NEXT:    movdqa %xmm4, %xmm6
    294 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
    295 ; SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
    296 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
    297 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
    298 ; SSE41-NEXT:    pand %xmm7, %xmm4
    299 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
    300 ; SSE41-NEXT:    por %xmm4, %xmm0
    301 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
    302 ; SSE41-NEXT:    movapd %xmm3, %xmm0
    303 ; SSE41-NEXT:    xorpd %xmm5, %xmm0
    304 ; SSE41-NEXT:    movapd %xmm2, %xmm1
    305 ; SSE41-NEXT:    xorpd %xmm5, %xmm1
    306 ; SSE41-NEXT:    movapd %xmm1, %xmm4
    307 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
    308 ; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
    309 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
    310 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
    311 ; SSE41-NEXT:    pand %xmm6, %xmm1
    312 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
    313 ; SSE41-NEXT:    por %xmm1, %xmm0
    314 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm3
    315 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[2,3,0,1]
    316 ; SSE41-NEXT:    movdqa %xmm3, %xmm0
    317 ; SSE41-NEXT:    pxor %xmm5, %xmm0
    318 ; SSE41-NEXT:    pxor %xmm1, %xmm5
    319 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
    320 ; SSE41-NEXT:    pcmpgtd %xmm5, %xmm2
    321 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
    322 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
    323 ; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
    324 ; SSE41-NEXT:    pand %xmm4, %xmm5
    325 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
    326 ; SSE41-NEXT:    por %xmm5, %xmm0
    327 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm1
    328 ; SSE41-NEXT:    movq %xmm1, %rax
    329 ; SSE41-NEXT:    retq
    330 ;
    331 ; AVX1-LABEL: test_v8i64:
    332 ; AVX1:       # %bb.0:
    333 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
    334 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
    335 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
    336 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm3
    337 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
    338 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
    339 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
    340 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
    341 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm3
    342 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
    343 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
    344 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
    345 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
    346 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
    347 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm3, %xmm3
    348 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
    349 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
    350 ; AVX1-NEXT:    vmovq %xmm0, %rax
    351 ; AVX1-NEXT:    vzeroupper
    352 ; AVX1-NEXT:    retq
    353 ;
    354 ; AVX2-LABEL: test_v8i64:
    355 ; AVX2:       # %bb.0:
    356 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
    357 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
    358 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
    359 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
    360 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
    361 ; AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
    362 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
    363 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
    364 ; AVX2-NEXT:    vmovq %xmm0, %rax
    365 ; AVX2-NEXT:    vzeroupper
    366 ; AVX2-NEXT:    retq
    367 ;
    368 ; AVX512-LABEL: test_v8i64:
    369 ; AVX512:       # %bb.0:
    370 ; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
    371 ; AVX512-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
    372 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
    373 ; AVX512-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
    374 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    375 ; AVX512-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
    376 ; AVX512-NEXT:    vmovq %xmm0, %rax
    377 ; AVX512-NEXT:    vzeroupper
    378 ; AVX512-NEXT:    retq
    379   %1 = call i64 @llvm.experimental.vector.reduce.smax.i64.v8i64(<8 x i64> %a0)
    380   ret i64 %1
    381 }
    382 
    383 define i64 @test_v16i64(<16 x i64> %a0) {
    384 ; SSE2-LABEL: test_v16i64:
    385 ; SSE2:       # %bb.0:
    386 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [2147483648,0,2147483648,0]
    387 ; SSE2-NEXT:    movdqa %xmm5, %xmm9
    388 ; SSE2-NEXT:    pxor %xmm8, %xmm9
    389 ; SSE2-NEXT:    movdqa %xmm1, %xmm10
    390 ; SSE2-NEXT:    pxor %xmm8, %xmm10
    391 ; SSE2-NEXT:    movdqa %xmm10, %xmm11
    392 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm11
    393 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
    394 ; SSE2-NEXT:    pcmpeqd %xmm9, %xmm10
    395 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm10[1,1,3,3]
    396 ; SSE2-NEXT:    pand %xmm12, %xmm10
    397 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm11[1,1,3,3]
    398 ; SSE2-NEXT:    por %xmm10, %xmm9
    399 ; SSE2-NEXT:    pand %xmm9, %xmm1
    400 ; SSE2-NEXT:    pandn %xmm5, %xmm9
    401 ; SSE2-NEXT:    por %xmm1, %xmm9
    402 ; SSE2-NEXT:    movdqa %xmm7, %xmm1
    403 ; SSE2-NEXT:    pxor %xmm8, %xmm1
    404 ; SSE2-NEXT:    movdqa %xmm3, %xmm5
    405 ; SSE2-NEXT:    pxor %xmm8, %xmm5
    406 ; SSE2-NEXT:    movdqa %xmm5, %xmm10
    407 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm10
    408 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
    409 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm5
    410 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
    411 ; SSE2-NEXT:    pand %xmm11, %xmm5
    412 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm10[1,1,3,3]
    413 ; SSE2-NEXT:    por %xmm5, %xmm1
    414 ; SSE2-NEXT:    pand %xmm1, %xmm3
    415 ; SSE2-NEXT:    pandn %xmm7, %xmm1
    416 ; SSE2-NEXT:    por %xmm3, %xmm1
    417 ; SSE2-NEXT:    movdqa %xmm4, %xmm3
    418 ; SSE2-NEXT:    pxor %xmm8, %xmm3
    419 ; SSE2-NEXT:    movdqa %xmm0, %xmm5
    420 ; SSE2-NEXT:    pxor %xmm8, %xmm5
    421 ; SSE2-NEXT:    movdqa %xmm5, %xmm7
    422 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm7
    423 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2]
    424 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm5
    425 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
    426 ; SSE2-NEXT:    pand %xmm10, %xmm5
    427 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm7[1,1,3,3]
    428 ; SSE2-NEXT:    por %xmm5, %xmm3
    429 ; SSE2-NEXT:    pand %xmm3, %xmm0
    430 ; SSE2-NEXT:    pandn %xmm4, %xmm3
    431 ; SSE2-NEXT:    por %xmm0, %xmm3
    432 ; SSE2-NEXT:    movdqa %xmm6, %xmm0
    433 ; SSE2-NEXT:    pxor %xmm8, %xmm0
    434 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
    435 ; SSE2-NEXT:    pxor %xmm8, %xmm4
    436 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
    437 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm5
    438 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2]
    439 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm4
    440 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
    441 ; SSE2-NEXT:    pand %xmm7, %xmm0
    442 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
    443 ; SSE2-NEXT:    por %xmm0, %xmm4
    444 ; SSE2-NEXT:    pand %xmm4, %xmm2
    445 ; SSE2-NEXT:    pandn %xmm6, %xmm4
    446 ; SSE2-NEXT:    por %xmm2, %xmm4
    447 ; SSE2-NEXT:    movdqa %xmm4, %xmm0
    448 ; SSE2-NEXT:    pxor %xmm8, %xmm0
    449 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
    450 ; SSE2-NEXT:    pxor %xmm8, %xmm2
    451 ; SSE2-NEXT:    movdqa %xmm2, %xmm5
    452 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm5
    453 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
    454 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
    455 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
    456 ; SSE2-NEXT:    pand %xmm6, %xmm2
    457 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
    458 ; SSE2-NEXT:    por %xmm2, %xmm0
    459 ; SSE2-NEXT:    pand %xmm0, %xmm3
    460 ; SSE2-NEXT:    pandn %xmm4, %xmm0
    461 ; SSE2-NEXT:    por %xmm3, %xmm0
    462 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
    463 ; SSE2-NEXT:    pxor %xmm8, %xmm2
    464 ; SSE2-NEXT:    movdqa %xmm9, %xmm3
    465 ; SSE2-NEXT:    pxor %xmm8, %xmm3
    466 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
    467 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
    468 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
    469 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm3
    470 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
    471 ; SSE2-NEXT:    pand %xmm5, %xmm2
    472 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
    473 ; SSE2-NEXT:    por %xmm2, %xmm3
    474 ; SSE2-NEXT:    pand %xmm3, %xmm9
    475 ; SSE2-NEXT:    pandn %xmm1, %xmm3
    476 ; SSE2-NEXT:    por %xmm9, %xmm3
    477 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
    478 ; SSE2-NEXT:    pxor %xmm8, %xmm1
    479 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
    480 ; SSE2-NEXT:    pxor %xmm8, %xmm2
    481 ; SSE2-NEXT:    movdqa %xmm2, %xmm4
    482 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
    483 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
    484 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm2
    485 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
    486 ; SSE2-NEXT:    pand %xmm5, %xmm1
    487 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
    488 ; SSE2-NEXT:    por %xmm1, %xmm2
    489 ; SSE2-NEXT:    pand %xmm2, %xmm0
    490 ; SSE2-NEXT:    pandn %xmm3, %xmm2
    491 ; SSE2-NEXT:    por %xmm0, %xmm2
    492 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
    493 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
    494 ; SSE2-NEXT:    pxor %xmm8, %xmm1
    495 ; SSE2-NEXT:    pxor %xmm0, %xmm8
    496 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
    497 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm3
    498 ; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
    499 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm8
    500 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm8[1,1,3,3]
    501 ; SSE2-NEXT:    pand %xmm4, %xmm1
    502 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
    503 ; SSE2-NEXT:    por %xmm1, %xmm3
    504 ; SSE2-NEXT:    pand %xmm3, %xmm2
    505 ; SSE2-NEXT:    pandn %xmm0, %xmm3
    506 ; SSE2-NEXT:    por %xmm2, %xmm3
    507 ; SSE2-NEXT:    movq %xmm3, %rax
    508 ; SSE2-NEXT:    retq
    509 ;
    510 ; SSE41-LABEL: test_v16i64:
    511 ; SSE41:       # %bb.0:
    512 ; SSE41-NEXT:    movdqa %xmm0, %xmm8
    513 ; SSE41-NEXT:    movdqa {{.*#+}} xmm9 = [2147483648,0,2147483648,0]
    514 ; SSE41-NEXT:    movdqa %xmm5, %xmm10
    515 ; SSE41-NEXT:    pxor %xmm9, %xmm10
    516 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
    517 ; SSE41-NEXT:    pxor %xmm9, %xmm0
    518 ; SSE41-NEXT:    movdqa %xmm0, %xmm11
    519 ; SSE41-NEXT:    pcmpgtd %xmm10, %xmm11
    520 ; SSE41-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
    521 ; SSE41-NEXT:    pcmpeqd %xmm10, %xmm0
    522 ; SSE41-NEXT:    pshufd {{.*#+}} xmm10 = xmm0[1,1,3,3]
    523 ; SSE41-NEXT:    pand %xmm12, %xmm10
    524 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm11[1,1,3,3]
    525 ; SSE41-NEXT:    por %xmm10, %xmm0
    526 ; SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
    527 ; SSE41-NEXT:    movdqa %xmm7, %xmm0
    528 ; SSE41-NEXT:    pxor %xmm9, %xmm0
    529 ; SSE41-NEXT:    movdqa %xmm3, %xmm1
    530 ; SSE41-NEXT:    pxor %xmm9, %xmm1
    531 ; SSE41-NEXT:    movdqa %xmm1, %xmm10
    532 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm10
    533 ; SSE41-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
    534 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
    535 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
    536 ; SSE41-NEXT:    pand %xmm11, %xmm1
    537 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm10[1,1,3,3]
    538 ; SSE41-NEXT:    por %xmm1, %xmm0
    539 ; SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm7
    540 ; SSE41-NEXT:    movdqa %xmm4, %xmm0
    541 ; SSE41-NEXT:    pxor %xmm9, %xmm0
    542 ; SSE41-NEXT:    movdqa %xmm8, %xmm1
    543 ; SSE41-NEXT:    pxor %xmm9, %xmm1
    544 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
    545 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
    546 ; SSE41-NEXT:    pshufd {{.*#+}} xmm10 = xmm3[0,0,2,2]
    547 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
    548 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
    549 ; SSE41-NEXT:    pand %xmm10, %xmm1
    550 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
    551 ; SSE41-NEXT:    por %xmm1, %xmm0
    552 ; SSE41-NEXT:    blendvpd %xmm0, %xmm8, %xmm4
    553 ; SSE41-NEXT:    movdqa %xmm6, %xmm0
    554 ; SSE41-NEXT:    pxor %xmm9, %xmm0
    555 ; SSE41-NEXT:    movdqa %xmm2, %xmm1
    556 ; SSE41-NEXT:    pxor %xmm9, %xmm1
    557 ; SSE41-NEXT:    movdqa %xmm1, %xmm3
    558 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
    559 ; SSE41-NEXT:    pshufd {{.*#+}} xmm8 = xmm3[0,0,2,2]
    560 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
    561 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
    562 ; SSE41-NEXT:    pand %xmm8, %xmm1
    563 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
    564 ; SSE41-NEXT:    por %xmm1, %xmm0
    565 ; SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm6
    566 ; SSE41-NEXT:    movapd %xmm6, %xmm0
    567 ; SSE41-NEXT:    xorpd %xmm9, %xmm0
    568 ; SSE41-NEXT:    movapd %xmm4, %xmm1
    569 ; SSE41-NEXT:    xorpd %xmm9, %xmm1
    570 ; SSE41-NEXT:    movapd %xmm1, %xmm2
    571 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
    572 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
    573 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
    574 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
    575 ; SSE41-NEXT:    pand %xmm3, %xmm1
    576 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
    577 ; SSE41-NEXT:    por %xmm1, %xmm0
    578 ; SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm6
    579 ; SSE41-NEXT:    movapd %xmm7, %xmm0
    580 ; SSE41-NEXT:    xorpd %xmm9, %xmm0
    581 ; SSE41-NEXT:    movapd %xmm5, %xmm1
    582 ; SSE41-NEXT:    xorpd %xmm9, %xmm1
    583 ; SSE41-NEXT:    movapd %xmm1, %xmm2
    584 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
    585 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
    586 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
    587 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
    588 ; SSE41-NEXT:    pand %xmm3, %xmm1
    589 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
    590 ; SSE41-NEXT:    por %xmm1, %xmm0
    591 ; SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm7
    592 ; SSE41-NEXT:    movapd %xmm7, %xmm0
    593 ; SSE41-NEXT:    xorpd %xmm9, %xmm0
    594 ; SSE41-NEXT:    movapd %xmm6, %xmm1
    595 ; SSE41-NEXT:    xorpd %xmm9, %xmm1
    596 ; SSE41-NEXT:    movapd %xmm1, %xmm2
    597 ; SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
    598 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
    599 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
    600 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
    601 ; SSE41-NEXT:    pand %xmm3, %xmm1
    602 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
    603 ; SSE41-NEXT:    por %xmm1, %xmm0
    604 ; SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm7
    605 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm7[2,3,0,1]
    606 ; SSE41-NEXT:    movdqa %xmm7, %xmm0
    607 ; SSE41-NEXT:    pxor %xmm9, %xmm0
    608 ; SSE41-NEXT:    pxor %xmm1, %xmm9
    609 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
    610 ; SSE41-NEXT:    pcmpgtd %xmm9, %xmm2
    611 ; SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
    612 ; SSE41-NEXT:    pcmpeqd %xmm0, %xmm9
    613 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm9[1,1,3,3]
    614 ; SSE41-NEXT:    pand %xmm3, %xmm4
    615 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
    616 ; SSE41-NEXT:    por %xmm4, %xmm0
    617 ; SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm1
    618 ; SSE41-NEXT:    movq %xmm1, %rax
    619 ; SSE41-NEXT:    retq
    620 ;
    621 ; AVX1-LABEL: test_v16i64:
    622 ; AVX1:       # %bb.0:
    623 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
    624 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
    625 ; AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
    626 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm5
    627 ; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm5, %ymm4
    628 ; AVX1-NEXT:    vblendvpd %ymm4, %ymm0, %ymm2, %ymm0
    629 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
    630 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
    631 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm2
    632 ; AVX1-NEXT:    vpcmpgtq %xmm3, %xmm1, %xmm4
    633 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm4, %ymm2
    634 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm1, %ymm3, %ymm1
    635 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
    636 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
    637 ; AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
    638 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm3
    639 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm3, %ymm2
    640 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
    641 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
    642 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
    643 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm3
    644 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
    645 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
    646 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
    647 ; AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
    648 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
    649 ; AVX1-NEXT:    vpcmpgtq %xmm0, %xmm3, %xmm3
    650 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm2, %ymm2
    651 ; AVX1-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
    652 ; AVX1-NEXT:    vmovq %xmm0, %rax
    653 ; AVX1-NEXT:    vzeroupper
    654 ; AVX1-NEXT:    retq
    655 ;
    656 ; AVX2-LABEL: test_v16i64:
    657 ; AVX2:       # %bb.0:
    658 ; AVX2-NEXT:    vpcmpgtq %ymm3, %ymm1, %ymm4
    659 ; AVX2-NEXT:    vblendvpd %ymm4, %ymm1, %ymm3, %ymm1
    660 ; AVX2-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm3
    661 ; AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
    662 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
    663 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
    664 ; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
    665 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
    666 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
    667 ; AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm0[2,3,0,1]
    668 ; AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
    669 ; AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
    670 ; AVX2-NEXT:    vmovq %xmm0, %rax
    671 ; AVX2-NEXT:    vzeroupper
    672 ; AVX2-NEXT:    retq
    673 ;
    674 ; AVX512-LABEL: test_v16i64:
    675 ; AVX512:       # %bb.0:
    676 ; AVX512-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
    677 ; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
    678 ; AVX512-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
    679 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
    680 ; AVX512-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
    681 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    682 ; AVX512-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
    683 ; AVX512-NEXT:    vmovq %xmm0, %rax
    684 ; AVX512-NEXT:    vzeroupper
    685 ; AVX512-NEXT:    retq
    686   %1 = call i64 @llvm.experimental.vector.reduce.smax.i64.v16i64(<16 x i64> %a0)
    687   ret i64 %1
    688 }
    689 
    690 ;
    691 ; vXi32
    692 ;
    693 
    694 define i32 @test_v4i32(<4 x i32> %a0) {
    695 ; SSE2-LABEL: test_v4i32:
    696 ; SSE2:       # %bb.0:
    697 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    698 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
    699 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
    700 ; SSE2-NEXT:    pand %xmm2, %xmm0
    701 ; SSE2-NEXT:    pandn %xmm1, %xmm2
    702 ; SSE2-NEXT:    por %xmm0, %xmm2
    703 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
    704 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
    705 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
    706 ; SSE2-NEXT:    pand %xmm1, %xmm2
    707 ; SSE2-NEXT:    pandn %xmm0, %xmm1
    708 ; SSE2-NEXT:    por %xmm2, %xmm1
    709 ; SSE2-NEXT:    movd %xmm1, %eax
    710 ; SSE2-NEXT:    retq
    711 ;
    712 ; SSE41-LABEL: test_v4i32:
    713 ; SSE41:       # %bb.0:
    714 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    715 ; SSE41-NEXT:    pmaxsd %xmm0, %xmm1
    716 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
    717 ; SSE41-NEXT:    pmaxsd %xmm1, %xmm0
    718 ; SSE41-NEXT:    movd %xmm0, %eax
    719 ; SSE41-NEXT:    retq
    720 ;
    721 ; AVX-LABEL: test_v4i32:
    722 ; AVX:       # %bb.0:
    723 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    724 ; AVX-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
    725 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    726 ; AVX-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
    727 ; AVX-NEXT:    vmovd %xmm0, %eax
    728 ; AVX-NEXT:    retq
    729 ;
    730 ; AVX512-LABEL: test_v4i32:
    731 ; AVX512:       # %bb.0:
    732 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    733 ; AVX512-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
    734 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    735 ; AVX512-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
    736 ; AVX512-NEXT:    vmovd %xmm0, %eax
    737 ; AVX512-NEXT:    retq
    738   %1 = call i32 @llvm.experimental.vector.reduce.smax.i32.v4i32(<4 x i32> %a0)
    739   ret i32 %1
    740 }
    741 
    742 define i32 @test_v8i32(<8 x i32> %a0) {
    743 ; SSE2-LABEL: test_v8i32:
    744 ; SSE2:       # %bb.0:
    745 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
    746 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
    747 ; SSE2-NEXT:    pand %xmm2, %xmm0
    748 ; SSE2-NEXT:    pandn %xmm1, %xmm2
    749 ; SSE2-NEXT:    por %xmm0, %xmm2
    750 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
    751 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
    752 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
    753 ; SSE2-NEXT:    pand %xmm1, %xmm2
    754 ; SSE2-NEXT:    pandn %xmm0, %xmm1
    755 ; SSE2-NEXT:    por %xmm2, %xmm1
    756 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
    757 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
    758 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
    759 ; SSE2-NEXT:    pand %xmm2, %xmm1
    760 ; SSE2-NEXT:    pandn %xmm0, %xmm2
    761 ; SSE2-NEXT:    por %xmm1, %xmm2
    762 ; SSE2-NEXT:    movd %xmm2, %eax
    763 ; SSE2-NEXT:    retq
    764 ;
    765 ; SSE41-LABEL: test_v8i32:
    766 ; SSE41:       # %bb.0:
    767 ; SSE41-NEXT:    pmaxsd %xmm1, %xmm0
    768 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    769 ; SSE41-NEXT:    pmaxsd %xmm0, %xmm1
    770 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
    771 ; SSE41-NEXT:    pmaxsd %xmm1, %xmm0
    772 ; SSE41-NEXT:    movd %xmm0, %eax
    773 ; SSE41-NEXT:    retq
    774 ;
    775 ; AVX1-LABEL: test_v8i32:
    776 ; AVX1:       # %bb.0:
    777 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
    778 ; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
    779 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    780 ; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
    781 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    782 ; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
    783 ; AVX1-NEXT:    vmovd %xmm0, %eax
    784 ; AVX1-NEXT:    vzeroupper
    785 ; AVX1-NEXT:    retq
    786 ;
    787 ; AVX2-LABEL: test_v8i32:
    788 ; AVX2:       # %bb.0:
    789 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
    790 ; AVX2-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
    791 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    792 ; AVX2-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
    793 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    794 ; AVX2-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
    795 ; AVX2-NEXT:    vmovd %xmm0, %eax
    796 ; AVX2-NEXT:    vzeroupper
    797 ; AVX2-NEXT:    retq
    798 ;
    799 ; AVX512-LABEL: test_v8i32:
    800 ; AVX512:       # %bb.0:
    801 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
    802 ; AVX512-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
    803 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    804 ; AVX512-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
    805 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    806 ; AVX512-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
    807 ; AVX512-NEXT:    vmovd %xmm0, %eax
    808 ; AVX512-NEXT:    vzeroupper
    809 ; AVX512-NEXT:    retq
    810   %1 = call i32 @llvm.experimental.vector.reduce.smax.i32.v8i32(<8 x i32> %a0)
    811   ret i32 %1
    812 }
    813 
    814 define i32 @test_v16i32(<16 x i32> %a0) {
    815 ; SSE2-LABEL: test_v16i32:
    816 ; SSE2:       # %bb.0:
    817 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
    818 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
    819 ; SSE2-NEXT:    pand %xmm4, %xmm1
    820 ; SSE2-NEXT:    pandn %xmm3, %xmm4
    821 ; SSE2-NEXT:    por %xmm1, %xmm4
    822 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
    823 ; SSE2-NEXT:    pcmpgtd %xmm2, %xmm1
    824 ; SSE2-NEXT:    pand %xmm1, %xmm0
    825 ; SSE2-NEXT:    pandn %xmm2, %xmm1
    826 ; SSE2-NEXT:    por %xmm0, %xmm1
    827 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
    828 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm0
    829 ; SSE2-NEXT:    pand %xmm0, %xmm1
    830 ; SSE2-NEXT:    pandn %xmm4, %xmm0
    831 ; SSE2-NEXT:    por %xmm1, %xmm0
    832 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    833 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
    834 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
    835 ; SSE2-NEXT:    pand %xmm2, %xmm0
    836 ; SSE2-NEXT:    pandn %xmm1, %xmm2
    837 ; SSE2-NEXT:    por %xmm0, %xmm2
    838 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
    839 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
    840 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
    841 ; SSE2-NEXT:    pand %xmm1, %xmm2
    842 ; SSE2-NEXT:    pandn %xmm0, %xmm1
    843 ; SSE2-NEXT:    por %xmm2, %xmm1
    844 ; SSE2-NEXT:    movd %xmm1, %eax
    845 ; SSE2-NEXT:    retq
    846 ;
    847 ; SSE41-LABEL: test_v16i32:
    848 ; SSE41:       # %bb.0:
    849 ; SSE41-NEXT:    pmaxsd %xmm3, %xmm1
    850 ; SSE41-NEXT:    pmaxsd %xmm2, %xmm0
    851 ; SSE41-NEXT:    pmaxsd %xmm1, %xmm0
    852 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    853 ; SSE41-NEXT:    pmaxsd %xmm0, %xmm1
    854 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
    855 ; SSE41-NEXT:    pmaxsd %xmm1, %xmm0
    856 ; SSE41-NEXT:    movd %xmm0, %eax
    857 ; SSE41-NEXT:    retq
    858 ;
    859 ; AVX1-LABEL: test_v16i32:
    860 ; AVX1:       # %bb.0:
    861 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
    862 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
    863 ; AVX1-NEXT:    vpmaxsd %xmm2, %xmm3, %xmm2
    864 ; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
    865 ; AVX1-NEXT:    vpmaxsd %xmm2, %xmm0, %xmm0
    866 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    867 ; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
    868 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    869 ; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
    870 ; AVX1-NEXT:    vmovd %xmm0, %eax
    871 ; AVX1-NEXT:    vzeroupper
    872 ; AVX1-NEXT:    retq
    873 ;
    874 ; AVX2-LABEL: test_v16i32:
    875 ; AVX2:       # %bb.0:
    876 ; AVX2-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
    877 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
    878 ; AVX2-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
    879 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    880 ; AVX2-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
    881 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    882 ; AVX2-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
    883 ; AVX2-NEXT:    vmovd %xmm0, %eax
    884 ; AVX2-NEXT:    vzeroupper
    885 ; AVX2-NEXT:    retq
    886 ;
    887 ; AVX512-LABEL: test_v16i32:
    888 ; AVX512:       # %bb.0:
    889 ; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
    890 ; AVX512-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
    891 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
    892 ; AVX512-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
    893 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    894 ; AVX512-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
    895 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    896 ; AVX512-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
    897 ; AVX512-NEXT:    vmovd %xmm0, %eax
    898 ; AVX512-NEXT:    vzeroupper
    899 ; AVX512-NEXT:    retq
    900   %1 = call i32 @llvm.experimental.vector.reduce.smax.i32.v16i32(<16 x i32> %a0)
    901   ret i32 %1
    902 }
    903 
    904 define i32 @test_v32i32(<32 x i32> %a0) {
    905 ; SSE2-LABEL: test_v32i32:
    906 ; SSE2:       # %bb.0:
    907 ; SSE2-NEXT:    movdqa %xmm2, %xmm8
    908 ; SSE2-NEXT:    pcmpgtd %xmm6, %xmm8
    909 ; SSE2-NEXT:    pand %xmm8, %xmm2
    910 ; SSE2-NEXT:    pandn %xmm6, %xmm8
    911 ; SSE2-NEXT:    por %xmm2, %xmm8
    912 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
    913 ; SSE2-NEXT:    pcmpgtd %xmm4, %xmm2
    914 ; SSE2-NEXT:    pand %xmm2, %xmm0
    915 ; SSE2-NEXT:    pandn %xmm4, %xmm2
    916 ; SSE2-NEXT:    por %xmm0, %xmm2
    917 ; SSE2-NEXT:    movdqa %xmm3, %xmm0
    918 ; SSE2-NEXT:    pcmpgtd %xmm7, %xmm0
    919 ; SSE2-NEXT:    pand %xmm0, %xmm3
    920 ; SSE2-NEXT:    pandn %xmm7, %xmm0
    921 ; SSE2-NEXT:    por %xmm3, %xmm0
    922 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
    923 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm3
    924 ; SSE2-NEXT:    pand %xmm3, %xmm1
    925 ; SSE2-NEXT:    pandn %xmm5, %xmm3
    926 ; SSE2-NEXT:    por %xmm1, %xmm3
    927 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
    928 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
    929 ; SSE2-NEXT:    pand %xmm1, %xmm3
    930 ; SSE2-NEXT:    pandn %xmm0, %xmm1
    931 ; SSE2-NEXT:    por %xmm3, %xmm1
    932 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
    933 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm0
    934 ; SSE2-NEXT:    pand %xmm0, %xmm2
    935 ; SSE2-NEXT:    pandn %xmm8, %xmm0
    936 ; SSE2-NEXT:    por %xmm2, %xmm0
    937 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
    938 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
    939 ; SSE2-NEXT:    pand %xmm2, %xmm0
    940 ; SSE2-NEXT:    pandn %xmm1, %xmm2
    941 ; SSE2-NEXT:    por %xmm0, %xmm2
    942 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
    943 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
    944 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
    945 ; SSE2-NEXT:    pand %xmm1, %xmm2
    946 ; SSE2-NEXT:    pandn %xmm0, %xmm1
    947 ; SSE2-NEXT:    por %xmm2, %xmm1
    948 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
    949 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
    950 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
    951 ; SSE2-NEXT:    pand %xmm2, %xmm1
    952 ; SSE2-NEXT:    pandn %xmm0, %xmm2
    953 ; SSE2-NEXT:    por %xmm1, %xmm2
    954 ; SSE2-NEXT:    movd %xmm2, %eax
    955 ; SSE2-NEXT:    retq
    956 ;
    957 ; SSE41-LABEL: test_v32i32:
    958 ; SSE41:       # %bb.0:
    959 ; SSE41-NEXT:    pmaxsd %xmm6, %xmm2
    960 ; SSE41-NEXT:    pmaxsd %xmm4, %xmm0
    961 ; SSE41-NEXT:    pmaxsd %xmm2, %xmm0
    962 ; SSE41-NEXT:    pmaxsd %xmm7, %xmm3
    963 ; SSE41-NEXT:    pmaxsd %xmm5, %xmm1
    964 ; SSE41-NEXT:    pmaxsd %xmm3, %xmm1
    965 ; SSE41-NEXT:    pmaxsd %xmm0, %xmm1
    966 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
    967 ; SSE41-NEXT:    pmaxsd %xmm1, %xmm0
    968 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    969 ; SSE41-NEXT:    pmaxsd %xmm0, %xmm1
    970 ; SSE41-NEXT:    movd %xmm1, %eax
    971 ; SSE41-NEXT:    retq
    972 ;
    973 ; AVX1-LABEL: test_v32i32:
    974 ; AVX1:       # %bb.0:
    975 ; AVX1-NEXT:    vpmaxsd %xmm3, %xmm1, %xmm4
    976 ; AVX1-NEXT:    vpmaxsd %xmm2, %xmm0, %xmm5
    977 ; AVX1-NEXT:    vpmaxsd %xmm4, %xmm5, %xmm4
    978 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3
    979 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
    980 ; AVX1-NEXT:    vpmaxsd %xmm3, %xmm1, %xmm1
    981 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm2
    982 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
    983 ; AVX1-NEXT:    vpmaxsd %xmm2, %xmm0, %xmm0
    984 ; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
    985 ; AVX1-NEXT:    vpmaxsd %xmm0, %xmm4, %xmm0
    986 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    987 ; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
    988 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    989 ; AVX1-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
    990 ; AVX1-NEXT:    vmovd %xmm0, %eax
    991 ; AVX1-NEXT:    vzeroupper
    992 ; AVX1-NEXT:    retq
    993 ;
    994 ; AVX2-LABEL: test_v32i32:
    995 ; AVX2:       # %bb.0:
    996 ; AVX2-NEXT:    vpmaxsd %ymm3, %ymm1, %ymm1
    997 ; AVX2-NEXT:    vpmaxsd %ymm2, %ymm0, %ymm0
    998 ; AVX2-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
    999 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
   1000 ; AVX2-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
   1001 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
   1002 ; AVX2-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
   1003 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
   1004 ; AVX2-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
   1005 ; AVX2-NEXT:    vmovd %xmm0, %eax
   1006 ; AVX2-NEXT:    vzeroupper
   1007 ; AVX2-NEXT:    retq
   1008 ;
   1009 ; AVX512-LABEL: test_v32i32:
   1010 ; AVX512:       # %bb.0:
   1011 ; AVX512-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
   1012 ; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
   1013 ; AVX512-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
   1014 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
   1015 ; AVX512-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
   1016 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
   1017 ; AVX512-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
   1018 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
   1019 ; AVX512-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
   1020 ; AVX512-NEXT:    vmovd %xmm0, %eax
   1021 ; AVX512-NEXT:    vzeroupper
   1022 ; AVX512-NEXT:    retq
   1023   %1 = call i32 @llvm.experimental.vector.reduce.smax.i32.v32i32(<32 x i32> %a0)
   1024   ret i32 %1
   1025 }
   1026 
   1027 ;
   1028 ; vXi16
   1029 ;
   1030 
   1031 define i16 @test_v8i16(<8 x i16> %a0) {
   1032 ; SSE2-LABEL: test_v8i16:
   1033 ; SSE2:       # %bb.0:
   1034 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
   1035 ; SSE2-NEXT:    pmaxsw %xmm0, %xmm1
   1036 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
   1037 ; SSE2-NEXT:    pmaxsw %xmm1, %xmm0
   1038 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
   1039 ; SSE2-NEXT:    psrld $16, %xmm1
   1040 ; SSE2-NEXT:    pmaxsw %xmm0, %xmm1
   1041 ; SSE2-NEXT:    movd %xmm1, %eax
   1042 ; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
   1043 ; SSE2-NEXT:    retq
   1044 ;
   1045 ; SSE41-LABEL: test_v8i16:
   1046 ; SSE41:       # %bb.0:
   1047 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [32767,32767,32767,32767,32767,32767,32767,32767]
   1048 ; SSE41-NEXT:    pxor %xmm1, %xmm0
   1049 ; SSE41-NEXT:    phminposuw %xmm0, %xmm0
   1050 ; SSE41-NEXT:    pxor %xmm1, %xmm0
   1051 ; SSE41-NEXT:    movd %xmm0, %eax
   1052 ; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax
   1053 ; SSE41-NEXT:    retq
   1054 ;
   1055 ; AVX-LABEL: test_v8i16:
   1056 ; AVX:       # %bb.0:
   1057 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [32767,32767,32767,32767,32767,32767,32767,32767]
   1058 ; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1059 ; AVX-NEXT:    vphminposuw %xmm0, %xmm0
   1060 ; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1061 ; AVX-NEXT:    vmovd %xmm0, %eax
   1062 ; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
   1063 ; AVX-NEXT:    retq
   1064 ;
   1065 ; AVX512-LABEL: test_v8i16:
   1066 ; AVX512:       # %bb.0:
   1067 ; AVX512-NEXT:    vmovdqa {{.*#+}} xmm1 = [32767,32767,32767,32767,32767,32767,32767,32767]
   1068 ; AVX512-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1069 ; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
   1070 ; AVX512-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1071 ; AVX512-NEXT:    vmovd %xmm0, %eax
   1072 ; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
   1073 ; AVX512-NEXT:    retq
   1074   %1 = call i16 @llvm.experimental.vector.reduce.smax.i16.v8i16(<8 x i16> %a0)
   1075   ret i16 %1
   1076 }
   1077 
   1078 define i16 @test_v16i16(<16 x i16> %a0) {
   1079 ; SSE2-LABEL: test_v16i16:
   1080 ; SSE2:       # %bb.0:
   1081 ; SSE2-NEXT:    pmaxsw %xmm1, %xmm0
   1082 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
   1083 ; SSE2-NEXT:    pmaxsw %xmm0, %xmm1
   1084 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
   1085 ; SSE2-NEXT:    pmaxsw %xmm1, %xmm0
   1086 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
   1087 ; SSE2-NEXT:    psrld $16, %xmm1
   1088 ; SSE2-NEXT:    pmaxsw %xmm0, %xmm1
   1089 ; SSE2-NEXT:    movd %xmm1, %eax
   1090 ; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
   1091 ; SSE2-NEXT:    retq
   1092 ;
   1093 ; SSE41-LABEL: test_v16i16:
   1094 ; SSE41:       # %bb.0:
   1095 ; SSE41-NEXT:    pmaxsw %xmm1, %xmm0
   1096 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [32767,32767,32767,32767,32767,32767,32767,32767]
   1097 ; SSE41-NEXT:    pxor %xmm1, %xmm0
   1098 ; SSE41-NEXT:    phminposuw %xmm0, %xmm0
   1099 ; SSE41-NEXT:    pxor %xmm1, %xmm0
   1100 ; SSE41-NEXT:    movd %xmm0, %eax
   1101 ; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax
   1102 ; SSE41-NEXT:    retq
   1103 ;
   1104 ; AVX1-LABEL: test_v16i16:
   1105 ; AVX1:       # %bb.0:
   1106 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
   1107 ; AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
   1108 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [32767,32767,32767,32767,32767,32767,32767,32767]
   1109 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1110 ; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
   1111 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1112 ; AVX1-NEXT:    vmovd %xmm0, %eax
   1113 ; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
   1114 ; AVX1-NEXT:    vzeroupper
   1115 ; AVX1-NEXT:    retq
   1116 ;
   1117 ; AVX2-LABEL: test_v16i16:
   1118 ; AVX2:       # %bb.0:
   1119 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
   1120 ; AVX2-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
   1121 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm1 = [32767,32767,32767,32767,32767,32767,32767,32767]
   1122 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1123 ; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
   1124 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1125 ; AVX2-NEXT:    vmovd %xmm0, %eax
   1126 ; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
   1127 ; AVX2-NEXT:    vzeroupper
   1128 ; AVX2-NEXT:    retq
   1129 ;
   1130 ; AVX512-LABEL: test_v16i16:
   1131 ; AVX512:       # %bb.0:
   1132 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
   1133 ; AVX512-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
   1134 ; AVX512-NEXT:    vmovdqa {{.*#+}} xmm1 = [32767,32767,32767,32767,32767,32767,32767,32767]
   1135 ; AVX512-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1136 ; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
   1137 ; AVX512-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1138 ; AVX512-NEXT:    vmovd %xmm0, %eax
   1139 ; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
   1140 ; AVX512-NEXT:    vzeroupper
   1141 ; AVX512-NEXT:    retq
   1142   %1 = call i16 @llvm.experimental.vector.reduce.smax.i16.v16i16(<16 x i16> %a0)
   1143   ret i16 %1
   1144 }
   1145 
   1146 define i16 @test_v32i16(<32 x i16> %a0) {
   1147 ; SSE2-LABEL: test_v32i16:
   1148 ; SSE2:       # %bb.0:
   1149 ; SSE2-NEXT:    pmaxsw %xmm3, %xmm1
   1150 ; SSE2-NEXT:    pmaxsw %xmm2, %xmm0
   1151 ; SSE2-NEXT:    pmaxsw %xmm1, %xmm0
   1152 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
   1153 ; SSE2-NEXT:    pmaxsw %xmm0, %xmm1
   1154 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
   1155 ; SSE2-NEXT:    pmaxsw %xmm1, %xmm0
   1156 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
   1157 ; SSE2-NEXT:    psrld $16, %xmm1
   1158 ; SSE2-NEXT:    pmaxsw %xmm0, %xmm1
   1159 ; SSE2-NEXT:    movd %xmm1, %eax
   1160 ; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
   1161 ; SSE2-NEXT:    retq
   1162 ;
   1163 ; SSE41-LABEL: test_v32i16:
   1164 ; SSE41:       # %bb.0:
   1165 ; SSE41-NEXT:    pmaxsw %xmm3, %xmm1
   1166 ; SSE41-NEXT:    pmaxsw %xmm2, %xmm0
   1167 ; SSE41-NEXT:    pmaxsw %xmm1, %xmm0
   1168 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [32767,32767,32767,32767,32767,32767,32767,32767]
   1169 ; SSE41-NEXT:    pxor %xmm1, %xmm0
   1170 ; SSE41-NEXT:    phminposuw %xmm0, %xmm0
   1171 ; SSE41-NEXT:    pxor %xmm1, %xmm0
   1172 ; SSE41-NEXT:    movd %xmm0, %eax
   1173 ; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax
   1174 ; SSE41-NEXT:    retq
   1175 ;
   1176 ; AVX1-LABEL: test_v32i16:
   1177 ; AVX1:       # %bb.0:
   1178 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
   1179 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
   1180 ; AVX1-NEXT:    vpmaxsw %xmm2, %xmm3, %xmm2
   1181 ; AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
   1182 ; AVX1-NEXT:    vpmaxsw %xmm2, %xmm0, %xmm0
   1183 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [32767,32767,32767,32767,32767,32767,32767,32767]
   1184 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1185 ; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
   1186 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1187 ; AVX1-NEXT:    vmovd %xmm0, %eax
   1188 ; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
   1189 ; AVX1-NEXT:    vzeroupper
   1190 ; AVX1-NEXT:    retq
   1191 ;
   1192 ; AVX2-LABEL: test_v32i16:
   1193 ; AVX2:       # %bb.0:
   1194 ; AVX2-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
   1195 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
   1196 ; AVX2-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
   1197 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm1 = [32767,32767,32767,32767,32767,32767,32767,32767]
   1198 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1199 ; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
   1200 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1201 ; AVX2-NEXT:    vmovd %xmm0, %eax
   1202 ; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
   1203 ; AVX2-NEXT:    vzeroupper
   1204 ; AVX2-NEXT:    retq
   1205 ;
   1206 ; AVX512-LABEL: test_v32i16:
   1207 ; AVX512:       # %bb.0:
   1208 ; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
   1209 ; AVX512-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
   1210 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
   1211 ; AVX512-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
   1212 ; AVX512-NEXT:    vmovdqa {{.*#+}} xmm1 = [32767,32767,32767,32767,32767,32767,32767,32767]
   1213 ; AVX512-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1214 ; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
   1215 ; AVX512-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1216 ; AVX512-NEXT:    vmovd %xmm0, %eax
   1217 ; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
   1218 ; AVX512-NEXT:    vzeroupper
   1219 ; AVX512-NEXT:    retq
   1220   %1 = call i16 @llvm.experimental.vector.reduce.smax.i16.v32i16(<32 x i16> %a0)
   1221   ret i16 %1
   1222 }
   1223 
   1224 define i16 @test_v64i16(<64 x i16> %a0) {
   1225 ; SSE2-LABEL: test_v64i16:
   1226 ; SSE2:       # %bb.0:
   1227 ; SSE2-NEXT:    pmaxsw %xmm6, %xmm2
   1228 ; SSE2-NEXT:    pmaxsw %xmm4, %xmm0
   1229 ; SSE2-NEXT:    pmaxsw %xmm2, %xmm0
   1230 ; SSE2-NEXT:    pmaxsw %xmm7, %xmm3
   1231 ; SSE2-NEXT:    pmaxsw %xmm5, %xmm1
   1232 ; SSE2-NEXT:    pmaxsw %xmm3, %xmm1
   1233 ; SSE2-NEXT:    pmaxsw %xmm0, %xmm1
   1234 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
   1235 ; SSE2-NEXT:    pmaxsw %xmm1, %xmm0
   1236 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
   1237 ; SSE2-NEXT:    pmaxsw %xmm0, %xmm1
   1238 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
   1239 ; SSE2-NEXT:    psrld $16, %xmm0
   1240 ; SSE2-NEXT:    pmaxsw %xmm1, %xmm0
   1241 ; SSE2-NEXT:    movd %xmm0, %eax
   1242 ; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
   1243 ; SSE2-NEXT:    retq
   1244 ;
   1245 ; SSE41-LABEL: test_v64i16:
   1246 ; SSE41:       # %bb.0:
   1247 ; SSE41-NEXT:    pmaxsw %xmm7, %xmm3
   1248 ; SSE41-NEXT:    pmaxsw %xmm5, %xmm1
   1249 ; SSE41-NEXT:    pmaxsw %xmm3, %xmm1
   1250 ; SSE41-NEXT:    pmaxsw %xmm6, %xmm2
   1251 ; SSE41-NEXT:    pmaxsw %xmm4, %xmm0
   1252 ; SSE41-NEXT:    pmaxsw %xmm2, %xmm0
   1253 ; SSE41-NEXT:    pmaxsw %xmm1, %xmm0
   1254 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [32767,32767,32767,32767,32767,32767,32767,32767]
   1255 ; SSE41-NEXT:    pxor %xmm1, %xmm0
   1256 ; SSE41-NEXT:    phminposuw %xmm0, %xmm0
   1257 ; SSE41-NEXT:    pxor %xmm1, %xmm0
   1258 ; SSE41-NEXT:    movd %xmm0, %eax
   1259 ; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax
   1260 ; SSE41-NEXT:    retq
   1261 ;
   1262 ; AVX1-LABEL: test_v64i16:
   1263 ; AVX1:       # %bb.0:
   1264 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
   1265 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
   1266 ; AVX1-NEXT:    vpmaxsw %xmm4, %xmm5, %xmm4
   1267 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
   1268 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
   1269 ; AVX1-NEXT:    vpmaxsw %xmm5, %xmm6, %xmm5
   1270 ; AVX1-NEXT:    vpmaxsw %xmm4, %xmm5, %xmm4
   1271 ; AVX1-NEXT:    vpmaxsw %xmm3, %xmm1, %xmm1
   1272 ; AVX1-NEXT:    vpmaxsw %xmm2, %xmm0, %xmm0
   1273 ; AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
   1274 ; AVX1-NEXT:    vpmaxsw %xmm4, %xmm0, %xmm0
   1275 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [32767,32767,32767,32767,32767,32767,32767,32767]
   1276 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1277 ; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
   1278 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1279 ; AVX1-NEXT:    vmovd %xmm0, %eax
   1280 ; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
   1281 ; AVX1-NEXT:    vzeroupper
   1282 ; AVX1-NEXT:    retq
   1283 ;
   1284 ; AVX2-LABEL: test_v64i16:
   1285 ; AVX2:       # %bb.0:
   1286 ; AVX2-NEXT:    vpmaxsw %ymm3, %ymm1, %ymm1
   1287 ; AVX2-NEXT:    vpmaxsw %ymm2, %ymm0, %ymm0
   1288 ; AVX2-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
   1289 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
   1290 ; AVX2-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
   1291 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm1 = [32767,32767,32767,32767,32767,32767,32767,32767]
   1292 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1293 ; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
   1294 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1295 ; AVX2-NEXT:    vmovd %xmm0, %eax
   1296 ; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
   1297 ; AVX2-NEXT:    vzeroupper
   1298 ; AVX2-NEXT:    retq
   1299 ;
   1300 ; AVX512-LABEL: test_v64i16:
   1301 ; AVX512:       # %bb.0:
   1302 ; AVX512-NEXT:    vpmaxsw %zmm1, %zmm0, %zmm0
   1303 ; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
   1304 ; AVX512-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
   1305 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
   1306 ; AVX512-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
   1307 ; AVX512-NEXT:    vmovdqa {{.*#+}} xmm1 = [32767,32767,32767,32767,32767,32767,32767,32767]
   1308 ; AVX512-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1309 ; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
   1310 ; AVX512-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1311 ; AVX512-NEXT:    vmovd %xmm0, %eax
   1312 ; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
   1313 ; AVX512-NEXT:    vzeroupper
   1314 ; AVX512-NEXT:    retq
   1315   %1 = call i16 @llvm.experimental.vector.reduce.smax.i16.v64i16(<64 x i16> %a0)
   1316   ret i16 %1
   1317 }
   1318 
   1319 ;
   1320 ; vXi8
   1321 ;
   1322 
   1323 define i8 @test_v16i8(<16 x i8> %a0) {
   1324 ; SSE2-LABEL: test_v16i8:
   1325 ; SSE2:       # %bb.0:
   1326 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
   1327 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
   1328 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
   1329 ; SSE2-NEXT:    pand %xmm2, %xmm0
   1330 ; SSE2-NEXT:    pandn %xmm1, %xmm2
   1331 ; SSE2-NEXT:    por %xmm0, %xmm2
   1332 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
   1333 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
   1334 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
   1335 ; SSE2-NEXT:    pand %xmm1, %xmm2
   1336 ; SSE2-NEXT:    pandn %xmm0, %xmm1
   1337 ; SSE2-NEXT:    por %xmm2, %xmm1
   1338 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
   1339 ; SSE2-NEXT:    psrld $16, %xmm0
   1340 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
   1341 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
   1342 ; SSE2-NEXT:    pand %xmm2, %xmm1
   1343 ; SSE2-NEXT:    pandn %xmm0, %xmm2
   1344 ; SSE2-NEXT:    por %xmm1, %xmm2
   1345 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
   1346 ; SSE2-NEXT:    psrlw $8, %xmm0
   1347 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
   1348 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
   1349 ; SSE2-NEXT:    pand %xmm1, %xmm2
   1350 ; SSE2-NEXT:    pandn %xmm0, %xmm1
   1351 ; SSE2-NEXT:    por %xmm2, %xmm1
   1352 ; SSE2-NEXT:    movd %xmm1, %eax
   1353 ; SSE2-NEXT:    # kill: def $al killed $al killed $eax
   1354 ; SSE2-NEXT:    retq
   1355 ;
   1356 ; SSE41-LABEL: test_v16i8:
   1357 ; SSE41:       # %bb.0:
   1358 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
   1359 ; SSE41-NEXT:    pxor %xmm1, %xmm0
   1360 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
   1361 ; SSE41-NEXT:    psrlw $8, %xmm2
   1362 ; SSE41-NEXT:    pminub %xmm0, %xmm2
   1363 ; SSE41-NEXT:    phminposuw %xmm2, %xmm0
   1364 ; SSE41-NEXT:    pxor %xmm1, %xmm0
   1365 ; SSE41-NEXT:    pextrb $0, %xmm0, %eax
   1366 ; SSE41-NEXT:    # kill: def $al killed $al killed $eax
   1367 ; SSE41-NEXT:    retq
   1368 ;
   1369 ; AVX-LABEL: test_v16i8:
   1370 ; AVX:       # %bb.0:
   1371 ; AVX-NEXT:    vmovdqa {{.*#+}} xmm1 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
   1372 ; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1373 ; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm2
   1374 ; AVX-NEXT:    vpminub %xmm2, %xmm0, %xmm0
   1375 ; AVX-NEXT:    vphminposuw %xmm0, %xmm0
   1376 ; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1377 ; AVX-NEXT:    vpextrb $0, %xmm0, %eax
   1378 ; AVX-NEXT:    # kill: def $al killed $al killed $eax
   1379 ; AVX-NEXT:    retq
   1380 ;
   1381 ; AVX512-LABEL: test_v16i8:
   1382 ; AVX512:       # %bb.0:
   1383 ; AVX512-NEXT:    vmovdqa {{.*#+}} xmm1 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
   1384 ; AVX512-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1385 ; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm2
   1386 ; AVX512-NEXT:    vpminub %xmm2, %xmm0, %xmm0
   1387 ; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
   1388 ; AVX512-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1389 ; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
   1390 ; AVX512-NEXT:    # kill: def $al killed $al killed $eax
   1391 ; AVX512-NEXT:    retq
   1392   %1 = call i8 @llvm.experimental.vector.reduce.smax.i8.v16i8(<16 x i8> %a0)
   1393   ret i8 %1
   1394 }
   1395 
   1396 define i8 @test_v32i8(<32 x i8> %a0) {
   1397 ; SSE2-LABEL: test_v32i8:
   1398 ; SSE2:       # %bb.0:
   1399 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
   1400 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
   1401 ; SSE2-NEXT:    pand %xmm2, %xmm0
   1402 ; SSE2-NEXT:    pandn %xmm1, %xmm2
   1403 ; SSE2-NEXT:    por %xmm0, %xmm2
   1404 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
   1405 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
   1406 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
   1407 ; SSE2-NEXT:    pand %xmm1, %xmm2
   1408 ; SSE2-NEXT:    pandn %xmm0, %xmm1
   1409 ; SSE2-NEXT:    por %xmm2, %xmm1
   1410 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
   1411 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
   1412 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
   1413 ; SSE2-NEXT:    pand %xmm2, %xmm1
   1414 ; SSE2-NEXT:    pandn %xmm0, %xmm2
   1415 ; SSE2-NEXT:    por %xmm1, %xmm2
   1416 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
   1417 ; SSE2-NEXT:    psrld $16, %xmm0
   1418 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
   1419 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
   1420 ; SSE2-NEXT:    pand %xmm1, %xmm2
   1421 ; SSE2-NEXT:    pandn %xmm0, %xmm1
   1422 ; SSE2-NEXT:    por %xmm2, %xmm1
   1423 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
   1424 ; SSE2-NEXT:    psrlw $8, %xmm0
   1425 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
   1426 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
   1427 ; SSE2-NEXT:    pand %xmm2, %xmm1
   1428 ; SSE2-NEXT:    pandn %xmm0, %xmm2
   1429 ; SSE2-NEXT:    por %xmm1, %xmm2
   1430 ; SSE2-NEXT:    movd %xmm2, %eax
   1431 ; SSE2-NEXT:    # kill: def $al killed $al killed $eax
   1432 ; SSE2-NEXT:    retq
   1433 ;
   1434 ; SSE41-LABEL: test_v32i8:
   1435 ; SSE41:       # %bb.0:
   1436 ; SSE41-NEXT:    pmaxsb %xmm1, %xmm0
   1437 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
   1438 ; SSE41-NEXT:    pxor %xmm1, %xmm0
   1439 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
   1440 ; SSE41-NEXT:    psrlw $8, %xmm2
   1441 ; SSE41-NEXT:    pminub %xmm0, %xmm2
   1442 ; SSE41-NEXT:    phminposuw %xmm2, %xmm0
   1443 ; SSE41-NEXT:    pxor %xmm1, %xmm0
   1444 ; SSE41-NEXT:    pextrb $0, %xmm0, %eax
   1445 ; SSE41-NEXT:    # kill: def $al killed $al killed $eax
   1446 ; SSE41-NEXT:    retq
   1447 ;
   1448 ; AVX1-LABEL: test_v32i8:
   1449 ; AVX1:       # %bb.0:
   1450 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
   1451 ; AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
   1452 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
   1453 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1454 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm2
   1455 ; AVX1-NEXT:    vpminub %xmm2, %xmm0, %xmm0
   1456 ; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
   1457 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1458 ; AVX1-NEXT:    vpextrb $0, %xmm0, %eax
   1459 ; AVX1-NEXT:    # kill: def $al killed $al killed $eax
   1460 ; AVX1-NEXT:    vzeroupper
   1461 ; AVX1-NEXT:    retq
   1462 ;
   1463 ; AVX2-LABEL: test_v32i8:
   1464 ; AVX2:       # %bb.0:
   1465 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
   1466 ; AVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
   1467 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm1 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
   1468 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1469 ; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm2
   1470 ; AVX2-NEXT:    vpminub %xmm2, %xmm0, %xmm0
   1471 ; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
   1472 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1473 ; AVX2-NEXT:    vpextrb $0, %xmm0, %eax
   1474 ; AVX2-NEXT:    # kill: def $al killed $al killed $eax
   1475 ; AVX2-NEXT:    vzeroupper
   1476 ; AVX2-NEXT:    retq
   1477 ;
   1478 ; AVX512-LABEL: test_v32i8:
   1479 ; AVX512:       # %bb.0:
   1480 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
   1481 ; AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
   1482 ; AVX512-NEXT:    vmovdqa {{.*#+}} xmm1 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
   1483 ; AVX512-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1484 ; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm2
   1485 ; AVX512-NEXT:    vpminub %xmm2, %xmm0, %xmm0
   1486 ; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
   1487 ; AVX512-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1488 ; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
   1489 ; AVX512-NEXT:    # kill: def $al killed $al killed $eax
   1490 ; AVX512-NEXT:    vzeroupper
   1491 ; AVX512-NEXT:    retq
   1492   %1 = call i8 @llvm.experimental.vector.reduce.smax.i8.v32i8(<32 x i8> %a0)
   1493   ret i8 %1
   1494 }
   1495 
   1496 define i8 @test_v64i8(<64 x i8> %a0) {
   1497 ; SSE2-LABEL: test_v64i8:
   1498 ; SSE2:       # %bb.0:
   1499 ; SSE2-NEXT:    movdqa %xmm1, %xmm4
   1500 ; SSE2-NEXT:    pcmpgtb %xmm3, %xmm4
   1501 ; SSE2-NEXT:    pand %xmm4, %xmm1
   1502 ; SSE2-NEXT:    pandn %xmm3, %xmm4
   1503 ; SSE2-NEXT:    por %xmm1, %xmm4
   1504 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
   1505 ; SSE2-NEXT:    pcmpgtb %xmm2, %xmm1
   1506 ; SSE2-NEXT:    pand %xmm1, %xmm0
   1507 ; SSE2-NEXT:    pandn %xmm2, %xmm1
   1508 ; SSE2-NEXT:    por %xmm0, %xmm1
   1509 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
   1510 ; SSE2-NEXT:    pcmpgtb %xmm4, %xmm0
   1511 ; SSE2-NEXT:    pand %xmm0, %xmm1
   1512 ; SSE2-NEXT:    pandn %xmm4, %xmm0
   1513 ; SSE2-NEXT:    por %xmm1, %xmm0
   1514 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
   1515 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
   1516 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
   1517 ; SSE2-NEXT:    pand %xmm2, %xmm0
   1518 ; SSE2-NEXT:    pandn %xmm1, %xmm2
   1519 ; SSE2-NEXT:    por %xmm0, %xmm2
   1520 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
   1521 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
   1522 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
   1523 ; SSE2-NEXT:    pand %xmm1, %xmm2
   1524 ; SSE2-NEXT:    pandn %xmm0, %xmm1
   1525 ; SSE2-NEXT:    por %xmm2, %xmm1
   1526 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
   1527 ; SSE2-NEXT:    psrld $16, %xmm0
   1528 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
   1529 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
   1530 ; SSE2-NEXT:    pand %xmm2, %xmm1
   1531 ; SSE2-NEXT:    pandn %xmm0, %xmm2
   1532 ; SSE2-NEXT:    por %xmm1, %xmm2
   1533 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
   1534 ; SSE2-NEXT:    psrlw $8, %xmm0
   1535 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
   1536 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
   1537 ; SSE2-NEXT:    pand %xmm1, %xmm2
   1538 ; SSE2-NEXT:    pandn %xmm0, %xmm1
   1539 ; SSE2-NEXT:    por %xmm2, %xmm1
   1540 ; SSE2-NEXT:    movd %xmm1, %eax
   1541 ; SSE2-NEXT:    # kill: def $al killed $al killed $eax
   1542 ; SSE2-NEXT:    retq
   1543 ;
   1544 ; SSE41-LABEL: test_v64i8:
   1545 ; SSE41:       # %bb.0:
   1546 ; SSE41-NEXT:    pmaxsb %xmm3, %xmm1
   1547 ; SSE41-NEXT:    pmaxsb %xmm2, %xmm0
   1548 ; SSE41-NEXT:    pmaxsb %xmm1, %xmm0
   1549 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
   1550 ; SSE41-NEXT:    pxor %xmm1, %xmm0
   1551 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
   1552 ; SSE41-NEXT:    psrlw $8, %xmm2
   1553 ; SSE41-NEXT:    pminub %xmm0, %xmm2
   1554 ; SSE41-NEXT:    phminposuw %xmm2, %xmm0
   1555 ; SSE41-NEXT:    pxor %xmm1, %xmm0
   1556 ; SSE41-NEXT:    pextrb $0, %xmm0, %eax
   1557 ; SSE41-NEXT:    # kill: def $al killed $al killed $eax
   1558 ; SSE41-NEXT:    retq
   1559 ;
   1560 ; AVX1-LABEL: test_v64i8:
   1561 ; AVX1:       # %bb.0:
   1562 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
   1563 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
   1564 ; AVX1-NEXT:    vpmaxsb %xmm2, %xmm3, %xmm2
   1565 ; AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
   1566 ; AVX1-NEXT:    vpmaxsb %xmm2, %xmm0, %xmm0
   1567 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
   1568 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1569 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm2
   1570 ; AVX1-NEXT:    vpminub %xmm2, %xmm0, %xmm0
   1571 ; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
   1572 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1573 ; AVX1-NEXT:    vpextrb $0, %xmm0, %eax
   1574 ; AVX1-NEXT:    # kill: def $al killed $al killed $eax
   1575 ; AVX1-NEXT:    vzeroupper
   1576 ; AVX1-NEXT:    retq
   1577 ;
   1578 ; AVX2-LABEL: test_v64i8:
   1579 ; AVX2:       # %bb.0:
   1580 ; AVX2-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm0
   1581 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
   1582 ; AVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
   1583 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm1 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
   1584 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1585 ; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm2
   1586 ; AVX2-NEXT:    vpminub %xmm2, %xmm0, %xmm0
   1587 ; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
   1588 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1589 ; AVX2-NEXT:    vpextrb $0, %xmm0, %eax
   1590 ; AVX2-NEXT:    # kill: def $al killed $al killed $eax
   1591 ; AVX2-NEXT:    vzeroupper
   1592 ; AVX2-NEXT:    retq
   1593 ;
   1594 ; AVX512-LABEL: test_v64i8:
   1595 ; AVX512:       # %bb.0:
   1596 ; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
   1597 ; AVX512-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm0
   1598 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
   1599 ; AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
   1600 ; AVX512-NEXT:    vmovdqa {{.*#+}} xmm1 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
   1601 ; AVX512-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1602 ; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm2
   1603 ; AVX512-NEXT:    vpminub %xmm2, %xmm0, %xmm0
   1604 ; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
   1605 ; AVX512-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1606 ; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
   1607 ; AVX512-NEXT:    # kill: def $al killed $al killed $eax
   1608 ; AVX512-NEXT:    vzeroupper
   1609 ; AVX512-NEXT:    retq
   1610   %1 = call i8 @llvm.experimental.vector.reduce.smax.i8.v64i8(<64 x i8> %a0)
   1611   ret i8 %1
   1612 }
   1613 
   1614 define i8 @test_v128i8(<128 x i8> %a0) {
   1615 ; SSE2-LABEL: test_v128i8:
   1616 ; SSE2:       # %bb.0:
   1617 ; SSE2-NEXT:    movdqa %xmm2, %xmm8
   1618 ; SSE2-NEXT:    pcmpgtb %xmm6, %xmm8
   1619 ; SSE2-NEXT:    pand %xmm8, %xmm2
   1620 ; SSE2-NEXT:    pandn %xmm6, %xmm8
   1621 ; SSE2-NEXT:    por %xmm2, %xmm8
   1622 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
   1623 ; SSE2-NEXT:    pcmpgtb %xmm4, %xmm2
   1624 ; SSE2-NEXT:    pand %xmm2, %xmm0
   1625 ; SSE2-NEXT:    pandn %xmm4, %xmm2
   1626 ; SSE2-NEXT:    por %xmm0, %xmm2
   1627 ; SSE2-NEXT:    movdqa %xmm3, %xmm0
   1628 ; SSE2-NEXT:    pcmpgtb %xmm7, %xmm0
   1629 ; SSE2-NEXT:    pand %xmm0, %xmm3
   1630 ; SSE2-NEXT:    pandn %xmm7, %xmm0
   1631 ; SSE2-NEXT:    por %xmm3, %xmm0
   1632 ; SSE2-NEXT:    movdqa %xmm1, %xmm3
   1633 ; SSE2-NEXT:    pcmpgtb %xmm5, %xmm3
   1634 ; SSE2-NEXT:    pand %xmm3, %xmm1
   1635 ; SSE2-NEXT:    pandn %xmm5, %xmm3
   1636 ; SSE2-NEXT:    por %xmm1, %xmm3
   1637 ; SSE2-NEXT:    movdqa %xmm3, %xmm1
   1638 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
   1639 ; SSE2-NEXT:    pand %xmm1, %xmm3
   1640 ; SSE2-NEXT:    pandn %xmm0, %xmm1
   1641 ; SSE2-NEXT:    por %xmm3, %xmm1
   1642 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
   1643 ; SSE2-NEXT:    pcmpgtb %xmm8, %xmm0
   1644 ; SSE2-NEXT:    pand %xmm0, %xmm2
   1645 ; SSE2-NEXT:    pandn %xmm8, %xmm0
   1646 ; SSE2-NEXT:    por %xmm2, %xmm0
   1647 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
   1648 ; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
   1649 ; SSE2-NEXT:    pand %xmm2, %xmm0
   1650 ; SSE2-NEXT:    pandn %xmm1, %xmm2
   1651 ; SSE2-NEXT:    por %xmm0, %xmm2
   1652 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
   1653 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
   1654 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
   1655 ; SSE2-NEXT:    pand %xmm1, %xmm2
   1656 ; SSE2-NEXT:    pandn %xmm0, %xmm1
   1657 ; SSE2-NEXT:    por %xmm2, %xmm1
   1658 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
   1659 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
   1660 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
   1661 ; SSE2-NEXT:    pand %xmm2, %xmm1
   1662 ; SSE2-NEXT:    pandn %xmm0, %xmm2
   1663 ; SSE2-NEXT:    por %xmm1, %xmm2
   1664 ; SSE2-NEXT:    movdqa %xmm2, %xmm0
   1665 ; SSE2-NEXT:    psrld $16, %xmm0
   1666 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
   1667 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
   1668 ; SSE2-NEXT:    pand %xmm1, %xmm2
   1669 ; SSE2-NEXT:    pandn %xmm0, %xmm1
   1670 ; SSE2-NEXT:    por %xmm2, %xmm1
   1671 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
   1672 ; SSE2-NEXT:    psrlw $8, %xmm0
   1673 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
   1674 ; SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
   1675 ; SSE2-NEXT:    pand %xmm2, %xmm1
   1676 ; SSE2-NEXT:    pandn %xmm0, %xmm2
   1677 ; SSE2-NEXT:    por %xmm1, %xmm2
   1678 ; SSE2-NEXT:    movd %xmm2, %eax
   1679 ; SSE2-NEXT:    # kill: def $al killed $al killed $eax
   1680 ; SSE2-NEXT:    retq
   1681 ;
   1682 ; SSE41-LABEL: test_v128i8:
   1683 ; SSE41:       # %bb.0:
   1684 ; SSE41-NEXT:    pmaxsb %xmm7, %xmm3
   1685 ; SSE41-NEXT:    pmaxsb %xmm5, %xmm1
   1686 ; SSE41-NEXT:    pmaxsb %xmm3, %xmm1
   1687 ; SSE41-NEXT:    pmaxsb %xmm6, %xmm2
   1688 ; SSE41-NEXT:    pmaxsb %xmm4, %xmm0
   1689 ; SSE41-NEXT:    pmaxsb %xmm2, %xmm0
   1690 ; SSE41-NEXT:    pmaxsb %xmm1, %xmm0
   1691 ; SSE41-NEXT:    movdqa {{.*#+}} xmm1 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
   1692 ; SSE41-NEXT:    pxor %xmm1, %xmm0
   1693 ; SSE41-NEXT:    movdqa %xmm0, %xmm2
   1694 ; SSE41-NEXT:    psrlw $8, %xmm2
   1695 ; SSE41-NEXT:    pminub %xmm0, %xmm2
   1696 ; SSE41-NEXT:    phminposuw %xmm2, %xmm0
   1697 ; SSE41-NEXT:    pxor %xmm1, %xmm0
   1698 ; SSE41-NEXT:    pextrb $0, %xmm0, %eax
   1699 ; SSE41-NEXT:    # kill: def $al killed $al killed $eax
   1700 ; SSE41-NEXT:    retq
   1701 ;
   1702 ; AVX1-LABEL: test_v128i8:
   1703 ; AVX1:       # %bb.0:
   1704 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm4
   1705 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
   1706 ; AVX1-NEXT:    vpmaxsb %xmm4, %xmm5, %xmm4
   1707 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm5
   1708 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
   1709 ; AVX1-NEXT:    vpmaxsb %xmm5, %xmm6, %xmm5
   1710 ; AVX1-NEXT:    vpmaxsb %xmm4, %xmm5, %xmm4
   1711 ; AVX1-NEXT:    vpmaxsb %xmm3, %xmm1, %xmm1
   1712 ; AVX1-NEXT:    vpmaxsb %xmm2, %xmm0, %xmm0
   1713 ; AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
   1714 ; AVX1-NEXT:    vpmaxsb %xmm4, %xmm0, %xmm0
   1715 ; AVX1-NEXT:    vmovdqa {{.*#+}} xmm1 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
   1716 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1717 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm2
   1718 ; AVX1-NEXT:    vpminub %xmm2, %xmm0, %xmm0
   1719 ; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
   1720 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1721 ; AVX1-NEXT:    vpextrb $0, %xmm0, %eax
   1722 ; AVX1-NEXT:    # kill: def $al killed $al killed $eax
   1723 ; AVX1-NEXT:    vzeroupper
   1724 ; AVX1-NEXT:    retq
   1725 ;
   1726 ; AVX2-LABEL: test_v128i8:
   1727 ; AVX2:       # %bb.0:
   1728 ; AVX2-NEXT:    vpmaxsb %ymm3, %ymm1, %ymm1
   1729 ; AVX2-NEXT:    vpmaxsb %ymm2, %ymm0, %ymm0
   1730 ; AVX2-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm0
   1731 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
   1732 ; AVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
   1733 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm1 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
   1734 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1735 ; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm2
   1736 ; AVX2-NEXT:    vpminub %xmm2, %xmm0, %xmm0
   1737 ; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
   1738 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1739 ; AVX2-NEXT:    vpextrb $0, %xmm0, %eax
   1740 ; AVX2-NEXT:    # kill: def $al killed $al killed $eax
   1741 ; AVX2-NEXT:    vzeroupper
   1742 ; AVX2-NEXT:    retq
   1743 ;
   1744 ; AVX512-LABEL: test_v128i8:
   1745 ; AVX512:       # %bb.0:
   1746 ; AVX512-NEXT:    vpmaxsb %zmm1, %zmm0, %zmm0
   1747 ; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
   1748 ; AVX512-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm0
   1749 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
   1750 ; AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
   1751 ; AVX512-NEXT:    vmovdqa {{.*#+}} xmm1 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
   1752 ; AVX512-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1753 ; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm2
   1754 ; AVX512-NEXT:    vpminub %xmm2, %xmm0, %xmm0
   1755 ; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
   1756 ; AVX512-NEXT:    vpxor %xmm1, %xmm0, %xmm0
   1757 ; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
   1758 ; AVX512-NEXT:    # kill: def $al killed $al killed $eax
   1759 ; AVX512-NEXT:    vzeroupper
   1760 ; AVX512-NEXT:    retq
   1761   %1 = call i8 @llvm.experimental.vector.reduce.smax.i8.v128i8(<128 x i8> %a0)
   1762   ret i8 %1
   1763 }
   1764 
   1765 declare i64 @llvm.experimental.vector.reduce.smax.i64.v2i64(<2 x i64>)
   1766 declare i64 @llvm.experimental.vector.reduce.smax.i64.v4i64(<4 x i64>)
   1767 declare i64 @llvm.experimental.vector.reduce.smax.i64.v8i64(<8 x i64>)
   1768 declare i64 @llvm.experimental.vector.reduce.smax.i64.v16i64(<16 x i64>)
   1769 
   1770 declare i32 @llvm.experimental.vector.reduce.smax.i32.v4i32(<4 x i32>)
   1771 declare i32 @llvm.experimental.vector.reduce.smax.i32.v8i32(<8 x i32>)
   1772 declare i32 @llvm.experimental.vector.reduce.smax.i32.v16i32(<16 x i32>)
   1773 declare i32 @llvm.experimental.vector.reduce.smax.i32.v32i32(<32 x i32>)
   1774 
   1775 declare i16 @llvm.experimental.vector.reduce.smax.i16.v8i16(<8 x i16>)
   1776 declare i16 @llvm.experimental.vector.reduce.smax.i16.v16i16(<16 x i16>)
   1777 declare i16 @llvm.experimental.vector.reduce.smax.i16.v32i16(<32 x i16>)
   1778 declare i16 @llvm.experimental.vector.reduce.smax.i16.v64i16(<64 x i16>)
   1779 
   1780 declare i8 @llvm.experimental.vector.reduce.smax.i8.v16i8(<16 x i8>)
   1781 declare i8 @llvm.experimental.vector.reduce.smax.i8.v32i8(<32 x i8>)
   1782 declare i8 @llvm.experimental.vector.reduce.smax.i8.v64i8(<64 x i8>)
   1783 declare i8 @llvm.experimental.vector.reduce.smax.i8.v128i8(<128 x i8>)
   1784