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