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