Home | History | Annotate | Download | only in X86
      1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
      2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2
      3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41
      4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1
      5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2
      6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW
      7 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512VL
      8 
      9 ;
     10 ; vXi64
     11 ;
     12 
     13 define i64 @test_v2i64(<2 x i64> %a0) {
     14 ; SSE-LABEL: test_v2i64:
     15 ; SSE:       # %bb.0:
     16 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
     17 ; SSE-NEXT:    paddq %xmm0, %xmm1
     18 ; SSE-NEXT:    movq %xmm1, %rax
     19 ; SSE-NEXT:    retq
     20 ;
     21 ; AVX-LABEL: test_v2i64:
     22 ; AVX:       # %bb.0:
     23 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
     24 ; AVX-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
     25 ; AVX-NEXT:    vmovq %xmm0, %rax
     26 ; AVX-NEXT:    retq
     27 ;
     28 ; AVX512-LABEL: test_v2i64:
     29 ; AVX512:       # %bb.0:
     30 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
     31 ; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
     32 ; AVX512-NEXT:    vmovq %xmm0, %rax
     33 ; AVX512-NEXT:    retq
     34   %1 = call i64 @llvm.experimental.vector.reduce.add.i64.v2i64(<2 x i64> %a0)
     35   ret i64 %1
     36 }
     37 
     38 define i64 @test_v4i64(<4 x i64> %a0) {
     39 ; SSE-LABEL: test_v4i64:
     40 ; SSE:       # %bb.0:
     41 ; SSE-NEXT:    paddq %xmm1, %xmm0
     42 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
     43 ; SSE-NEXT:    paddq %xmm0, %xmm1
     44 ; SSE-NEXT:    movq %xmm1, %rax
     45 ; SSE-NEXT:    retq
     46 ;
     47 ; AVX1-LABEL: test_v4i64:
     48 ; AVX1:       # %bb.0:
     49 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
     50 ; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
     51 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
     52 ; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
     53 ; AVX1-NEXT:    vmovq %xmm0, %rax
     54 ; AVX1-NEXT:    vzeroupper
     55 ; AVX1-NEXT:    retq
     56 ;
     57 ; AVX2-LABEL: test_v4i64:
     58 ; AVX2:       # %bb.0:
     59 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
     60 ; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
     61 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
     62 ; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
     63 ; AVX2-NEXT:    vmovq %xmm0, %rax
     64 ; AVX2-NEXT:    vzeroupper
     65 ; AVX2-NEXT:    retq
     66 ;
     67 ; AVX512-LABEL: test_v4i64:
     68 ; AVX512:       # %bb.0:
     69 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
     70 ; AVX512-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
     71 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
     72 ; AVX512-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
     73 ; AVX512-NEXT:    vmovq %xmm0, %rax
     74 ; AVX512-NEXT:    vzeroupper
     75 ; AVX512-NEXT:    retq
     76   %1 = call i64 @llvm.experimental.vector.reduce.add.i64.v4i64(<4 x i64> %a0)
     77   ret i64 %1
     78 }
     79 
     80 define i64 @test_v8i64(<8 x i64> %a0) {
     81 ; SSE-LABEL: test_v8i64:
     82 ; SSE:       # %bb.0:
     83 ; SSE-NEXT:    paddq %xmm3, %xmm1
     84 ; SSE-NEXT:    paddq %xmm2, %xmm1
     85 ; SSE-NEXT:    paddq %xmm0, %xmm1
     86 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
     87 ; SSE-NEXT:    paddq %xmm1, %xmm0
     88 ; SSE-NEXT:    movq %xmm0, %rax
     89 ; SSE-NEXT:    retq
     90 ;
     91 ; AVX1-LABEL: test_v8i64:
     92 ; AVX1:       # %bb.0:
     93 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
     94 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
     95 ; AVX1-NEXT:    vpaddq %xmm2, %xmm3, %xmm2
     96 ; AVX1-NEXT:    vpaddq %xmm2, %xmm1, %xmm1
     97 ; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
     98 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
     99 ; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
    100 ; AVX1-NEXT:    vmovq %xmm0, %rax
    101 ; AVX1-NEXT:    vzeroupper
    102 ; AVX1-NEXT:    retq
    103 ;
    104 ; AVX2-LABEL: test_v8i64:
    105 ; AVX2:       # %bb.0:
    106 ; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
    107 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
    108 ; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
    109 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    110 ; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
    111 ; AVX2-NEXT:    vmovq %xmm0, %rax
    112 ; AVX2-NEXT:    vzeroupper
    113 ; AVX2-NEXT:    retq
    114 ;
    115 ; AVX512-LABEL: test_v8i64:
    116 ; AVX512:       # %bb.0:
    117 ; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
    118 ; AVX512-NEXT:    vpaddq %zmm1, %zmm0, %zmm0
    119 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
    120 ; AVX512-NEXT:    vpaddq %zmm1, %zmm0, %zmm0
    121 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    122 ; AVX512-NEXT:    vpaddq %zmm1, %zmm0, %zmm0
    123 ; AVX512-NEXT:    vmovq %xmm0, %rax
    124 ; AVX512-NEXT:    vzeroupper
    125 ; AVX512-NEXT:    retq
    126   %1 = call i64 @llvm.experimental.vector.reduce.add.i64.v8i64(<8 x i64> %a0)
    127   ret i64 %1
    128 }
    129 
    130 define i64 @test_v16i64(<16 x i64> %a0) {
    131 ; SSE-LABEL: test_v16i64:
    132 ; SSE:       # %bb.0:
    133 ; SSE-NEXT:    paddq %xmm6, %xmm2
    134 ; SSE-NEXT:    paddq %xmm7, %xmm3
    135 ; SSE-NEXT:    paddq %xmm5, %xmm3
    136 ; SSE-NEXT:    paddq %xmm1, %xmm3
    137 ; SSE-NEXT:    paddq %xmm4, %xmm2
    138 ; SSE-NEXT:    paddq %xmm3, %xmm2
    139 ; SSE-NEXT:    paddq %xmm0, %xmm2
    140 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
    141 ; SSE-NEXT:    paddq %xmm2, %xmm0
    142 ; SSE-NEXT:    movq %xmm0, %rax
    143 ; SSE-NEXT:    retq
    144 ;
    145 ; AVX1-LABEL: test_v16i64:
    146 ; AVX1:       # %bb.0:
    147 ; AVX1-NEXT:    vpaddq %xmm3, %xmm1, %xmm4
    148 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3
    149 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
    150 ; AVX1-NEXT:    vpaddq %xmm3, %xmm1, %xmm1
    151 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
    152 ; AVX1-NEXT:    vpaddq %xmm1, %xmm3, %xmm1
    153 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
    154 ; AVX1-NEXT:    vpaddq %xmm1, %xmm3, %xmm1
    155 ; AVX1-NEXT:    vpaddq %xmm4, %xmm2, %xmm2
    156 ; AVX1-NEXT:    vpaddq %xmm1, %xmm2, %xmm1
    157 ; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
    158 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    159 ; AVX1-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
    160 ; AVX1-NEXT:    vmovq %xmm0, %rax
    161 ; AVX1-NEXT:    vzeroupper
    162 ; AVX1-NEXT:    retq
    163 ;
    164 ; AVX2-LABEL: test_v16i64:
    165 ; AVX2:       # %bb.0:
    166 ; AVX2-NEXT:    vpaddq %ymm3, %ymm1, %ymm1
    167 ; AVX2-NEXT:    vpaddq %ymm1, %ymm2, %ymm1
    168 ; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
    169 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
    170 ; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
    171 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    172 ; AVX2-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
    173 ; AVX2-NEXT:    vmovq %xmm0, %rax
    174 ; AVX2-NEXT:    vzeroupper
    175 ; AVX2-NEXT:    retq
    176 ;
    177 ; AVX512-LABEL: test_v16i64:
    178 ; AVX512:       # %bb.0:
    179 ; AVX512-NEXT:    vpaddq %zmm1, %zmm0, %zmm0
    180 ; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
    181 ; AVX512-NEXT:    vpaddq %zmm1, %zmm0, %zmm0
    182 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
    183 ; AVX512-NEXT:    vpaddq %zmm1, %zmm0, %zmm0
    184 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    185 ; AVX512-NEXT:    vpaddq %zmm1, %zmm0, %zmm0
    186 ; AVX512-NEXT:    vmovq %xmm0, %rax
    187 ; AVX512-NEXT:    vzeroupper
    188 ; AVX512-NEXT:    retq
    189   %1 = call i64 @llvm.experimental.vector.reduce.add.i64.v16i64(<16 x i64> %a0)
    190   ret i64 %1
    191 }
    192 
    193 ;
    194 ; vXi32
    195 ;
    196 
    197 define i32 @test_v4i32(<4 x i32> %a0) {
    198 ; SSE2-LABEL: test_v4i32:
    199 ; SSE2:       # %bb.0:
    200 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    201 ; SSE2-NEXT:    paddd %xmm0, %xmm1
    202 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
    203 ; SSE2-NEXT:    paddd %xmm1, %xmm0
    204 ; SSE2-NEXT:    movd %xmm0, %eax
    205 ; SSE2-NEXT:    retq
    206 ;
    207 ; SSE41-LABEL: test_v4i32:
    208 ; SSE41:       # %bb.0:
    209 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    210 ; SSE41-NEXT:    paddd %xmm0, %xmm1
    211 ; SSE41-NEXT:    phaddd %xmm1, %xmm1
    212 ; SSE41-NEXT:    movd %xmm1, %eax
    213 ; SSE41-NEXT:    retq
    214 ;
    215 ; AVX-LABEL: test_v4i32:
    216 ; AVX:       # %bb.0:
    217 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    218 ; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
    219 ; AVX-NEXT:    vphaddd %xmm0, %xmm0, %xmm0
    220 ; AVX-NEXT:    vmovd %xmm0, %eax
    221 ; AVX-NEXT:    retq
    222 ;
    223 ; AVX512-LABEL: test_v4i32:
    224 ; AVX512:       # %bb.0:
    225 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    226 ; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
    227 ; AVX512-NEXT:    vphaddd %xmm0, %xmm0, %xmm0
    228 ; AVX512-NEXT:    vmovd %xmm0, %eax
    229 ; AVX512-NEXT:    retq
    230   %1 = call i32 @llvm.experimental.vector.reduce.add.i32.v4i32(<4 x i32> %a0)
    231   ret i32 %1
    232 }
    233 
    234 define i32 @test_v8i32(<8 x i32> %a0) {
    235 ; SSE2-LABEL: test_v8i32:
    236 ; SSE2:       # %bb.0:
    237 ; SSE2-NEXT:    paddd %xmm1, %xmm0
    238 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    239 ; SSE2-NEXT:    paddd %xmm0, %xmm1
    240 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
    241 ; SSE2-NEXT:    paddd %xmm1, %xmm0
    242 ; SSE2-NEXT:    movd %xmm0, %eax
    243 ; SSE2-NEXT:    retq
    244 ;
    245 ; SSE41-LABEL: test_v8i32:
    246 ; SSE41:       # %bb.0:
    247 ; SSE41-NEXT:    paddd %xmm1, %xmm0
    248 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    249 ; SSE41-NEXT:    paddd %xmm0, %xmm1
    250 ; SSE41-NEXT:    phaddd %xmm1, %xmm1
    251 ; SSE41-NEXT:    movd %xmm1, %eax
    252 ; SSE41-NEXT:    retq
    253 ;
    254 ; AVX1-LABEL: test_v8i32:
    255 ; AVX1:       # %bb.0:
    256 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
    257 ; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
    258 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    259 ; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
    260 ; AVX1-NEXT:    vphaddd %xmm0, %xmm0, %xmm0
    261 ; AVX1-NEXT:    vmovd %xmm0, %eax
    262 ; AVX1-NEXT:    vzeroupper
    263 ; AVX1-NEXT:    retq
    264 ;
    265 ; AVX2-LABEL: test_v8i32:
    266 ; AVX2:       # %bb.0:
    267 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
    268 ; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
    269 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    270 ; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
    271 ; AVX2-NEXT:    vphaddd %ymm0, %ymm0, %ymm0
    272 ; AVX2-NEXT:    vmovd %xmm0, %eax
    273 ; AVX2-NEXT:    vzeroupper
    274 ; AVX2-NEXT:    retq
    275 ;
    276 ; AVX512-LABEL: test_v8i32:
    277 ; AVX512:       # %bb.0:
    278 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
    279 ; AVX512-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
    280 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    281 ; AVX512-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
    282 ; AVX512-NEXT:    vphaddd %ymm0, %ymm0, %ymm0
    283 ; AVX512-NEXT:    vmovd %xmm0, %eax
    284 ; AVX512-NEXT:    vzeroupper
    285 ; AVX512-NEXT:    retq
    286   %1 = call i32 @llvm.experimental.vector.reduce.add.i32.v8i32(<8 x i32> %a0)
    287   ret i32 %1
    288 }
    289 
    290 define i32 @test_v16i32(<16 x i32> %a0) {
    291 ; SSE2-LABEL: test_v16i32:
    292 ; SSE2:       # %bb.0:
    293 ; SSE2-NEXT:    paddd %xmm3, %xmm1
    294 ; SSE2-NEXT:    paddd %xmm2, %xmm1
    295 ; SSE2-NEXT:    paddd %xmm0, %xmm1
    296 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
    297 ; SSE2-NEXT:    paddd %xmm1, %xmm0
    298 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    299 ; SSE2-NEXT:    paddd %xmm0, %xmm1
    300 ; SSE2-NEXT:    movd %xmm1, %eax
    301 ; SSE2-NEXT:    retq
    302 ;
    303 ; SSE41-LABEL: test_v16i32:
    304 ; SSE41:       # %bb.0:
    305 ; SSE41-NEXT:    paddd %xmm3, %xmm1
    306 ; SSE41-NEXT:    paddd %xmm2, %xmm1
    307 ; SSE41-NEXT:    paddd %xmm0, %xmm1
    308 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
    309 ; SSE41-NEXT:    paddd %xmm1, %xmm0
    310 ; SSE41-NEXT:    phaddd %xmm0, %xmm0
    311 ; SSE41-NEXT:    movd %xmm0, %eax
    312 ; SSE41-NEXT:    retq
    313 ;
    314 ; AVX1-LABEL: test_v16i32:
    315 ; AVX1:       # %bb.0:
    316 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
    317 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
    318 ; AVX1-NEXT:    vpaddd %xmm2, %xmm3, %xmm2
    319 ; AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
    320 ; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
    321 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    322 ; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
    323 ; AVX1-NEXT:    vphaddd %xmm0, %xmm0, %xmm0
    324 ; AVX1-NEXT:    vmovd %xmm0, %eax
    325 ; AVX1-NEXT:    vzeroupper
    326 ; AVX1-NEXT:    retq
    327 ;
    328 ; AVX2-LABEL: test_v16i32:
    329 ; AVX2:       # %bb.0:
    330 ; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
    331 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
    332 ; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
    333 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    334 ; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
    335 ; AVX2-NEXT:    vphaddd %ymm0, %ymm0, %ymm0
    336 ; AVX2-NEXT:    vmovd %xmm0, %eax
    337 ; AVX2-NEXT:    vzeroupper
    338 ; AVX2-NEXT:    retq
    339 ;
    340 ; AVX512-LABEL: test_v16i32:
    341 ; AVX512:       # %bb.0:
    342 ; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
    343 ; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
    344 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
    345 ; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
    346 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    347 ; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
    348 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    349 ; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
    350 ; AVX512-NEXT:    vmovd %xmm0, %eax
    351 ; AVX512-NEXT:    vzeroupper
    352 ; AVX512-NEXT:    retq
    353   %1 = call i32 @llvm.experimental.vector.reduce.add.i32.v16i32(<16 x i32> %a0)
    354   ret i32 %1
    355 }
    356 
    357 define i32 @test_v32i32(<32 x i32> %a0) {
    358 ; SSE2-LABEL: test_v32i32:
    359 ; SSE2:       # %bb.0:
    360 ; SSE2-NEXT:    paddd %xmm6, %xmm2
    361 ; SSE2-NEXT:    paddd %xmm7, %xmm3
    362 ; SSE2-NEXT:    paddd %xmm5, %xmm3
    363 ; SSE2-NEXT:    paddd %xmm1, %xmm3
    364 ; SSE2-NEXT:    paddd %xmm4, %xmm2
    365 ; SSE2-NEXT:    paddd %xmm3, %xmm2
    366 ; SSE2-NEXT:    paddd %xmm0, %xmm2
    367 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
    368 ; SSE2-NEXT:    paddd %xmm2, %xmm0
    369 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    370 ; SSE2-NEXT:    paddd %xmm0, %xmm1
    371 ; SSE2-NEXT:    movd %xmm1, %eax
    372 ; SSE2-NEXT:    retq
    373 ;
    374 ; SSE41-LABEL: test_v32i32:
    375 ; SSE41:       # %bb.0:
    376 ; SSE41-NEXT:    paddd %xmm6, %xmm2
    377 ; SSE41-NEXT:    paddd %xmm7, %xmm3
    378 ; SSE41-NEXT:    paddd %xmm5, %xmm3
    379 ; SSE41-NEXT:    paddd %xmm1, %xmm3
    380 ; SSE41-NEXT:    paddd %xmm4, %xmm2
    381 ; SSE41-NEXT:    paddd %xmm3, %xmm2
    382 ; SSE41-NEXT:    paddd %xmm0, %xmm2
    383 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
    384 ; SSE41-NEXT:    paddd %xmm2, %xmm0
    385 ; SSE41-NEXT:    phaddd %xmm0, %xmm0
    386 ; SSE41-NEXT:    movd %xmm0, %eax
    387 ; SSE41-NEXT:    retq
    388 ;
    389 ; AVX1-LABEL: test_v32i32:
    390 ; AVX1:       # %bb.0:
    391 ; AVX1-NEXT:    vpaddd %xmm3, %xmm1, %xmm4
    392 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3
    393 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
    394 ; AVX1-NEXT:    vpaddd %xmm3, %xmm1, %xmm1
    395 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
    396 ; AVX1-NEXT:    vpaddd %xmm1, %xmm3, %xmm1
    397 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
    398 ; AVX1-NEXT:    vpaddd %xmm1, %xmm3, %xmm1
    399 ; AVX1-NEXT:    vpaddd %xmm4, %xmm2, %xmm2
    400 ; AVX1-NEXT:    vpaddd %xmm1, %xmm2, %xmm1
    401 ; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
    402 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    403 ; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
    404 ; AVX1-NEXT:    vphaddd %xmm0, %xmm0, %xmm0
    405 ; AVX1-NEXT:    vmovd %xmm0, %eax
    406 ; AVX1-NEXT:    vzeroupper
    407 ; AVX1-NEXT:    retq
    408 ;
    409 ; AVX2-LABEL: test_v32i32:
    410 ; AVX2:       # %bb.0:
    411 ; AVX2-NEXT:    vpaddd %ymm3, %ymm1, %ymm1
    412 ; AVX2-NEXT:    vpaddd %ymm1, %ymm2, %ymm1
    413 ; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
    414 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
    415 ; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
    416 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    417 ; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
    418 ; AVX2-NEXT:    vphaddd %ymm0, %ymm0, %ymm0
    419 ; AVX2-NEXT:    vmovd %xmm0, %eax
    420 ; AVX2-NEXT:    vzeroupper
    421 ; AVX2-NEXT:    retq
    422 ;
    423 ; AVX512-LABEL: test_v32i32:
    424 ; AVX512:       # %bb.0:
    425 ; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
    426 ; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
    427 ; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
    428 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
    429 ; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
    430 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    431 ; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
    432 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    433 ; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
    434 ; AVX512-NEXT:    vmovd %xmm0, %eax
    435 ; AVX512-NEXT:    vzeroupper
    436 ; AVX512-NEXT:    retq
    437   %1 = call i32 @llvm.experimental.vector.reduce.add.i32.v32i32(<32 x i32> %a0)
    438   ret i32 %1
    439 }
    440 
    441 ;
    442 ; vXi16
    443 ;
    444 
    445 define i16 @test_v8i16(<8 x i16> %a0) {
    446 ; SSE2-LABEL: test_v8i16:
    447 ; SSE2:       # %bb.0:
    448 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    449 ; SSE2-NEXT:    paddw %xmm0, %xmm1
    450 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
    451 ; SSE2-NEXT:    paddw %xmm1, %xmm0
    452 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
    453 ; SSE2-NEXT:    psrld $16, %xmm1
    454 ; SSE2-NEXT:    paddw %xmm0, %xmm1
    455 ; SSE2-NEXT:    movd %xmm1, %eax
    456 ; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
    457 ; SSE2-NEXT:    retq
    458 ;
    459 ; SSE41-LABEL: test_v8i16:
    460 ; SSE41:       # %bb.0:
    461 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    462 ; SSE41-NEXT:    paddw %xmm0, %xmm1
    463 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
    464 ; SSE41-NEXT:    paddw %xmm1, %xmm0
    465 ; SSE41-NEXT:    phaddw %xmm0, %xmm0
    466 ; SSE41-NEXT:    movd %xmm0, %eax
    467 ; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax
    468 ; SSE41-NEXT:    retq
    469 ;
    470 ; AVX-LABEL: test_v8i16:
    471 ; AVX:       # %bb.0:
    472 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    473 ; AVX-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
    474 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    475 ; AVX-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
    476 ; AVX-NEXT:    vphaddw %xmm0, %xmm0, %xmm0
    477 ; AVX-NEXT:    vmovd %xmm0, %eax
    478 ; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
    479 ; AVX-NEXT:    retq
    480 ;
    481 ; AVX512-LABEL: test_v8i16:
    482 ; AVX512:       # %bb.0:
    483 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    484 ; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
    485 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    486 ; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
    487 ; AVX512-NEXT:    vphaddw %xmm0, %xmm0, %xmm0
    488 ; AVX512-NEXT:    vmovd %xmm0, %eax
    489 ; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
    490 ; AVX512-NEXT:    retq
    491   %1 = call i16 @llvm.experimental.vector.reduce.add.i16.v8i16(<8 x i16> %a0)
    492   ret i16 %1
    493 }
    494 
    495 define i16 @test_v16i16(<16 x i16> %a0) {
    496 ; SSE2-LABEL: test_v16i16:
    497 ; SSE2:       # %bb.0:
    498 ; SSE2-NEXT:    paddw %xmm1, %xmm0
    499 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    500 ; SSE2-NEXT:    paddw %xmm0, %xmm1
    501 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
    502 ; SSE2-NEXT:    paddw %xmm1, %xmm0
    503 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
    504 ; SSE2-NEXT:    psrld $16, %xmm1
    505 ; SSE2-NEXT:    paddw %xmm0, %xmm1
    506 ; SSE2-NEXT:    movd %xmm1, %eax
    507 ; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
    508 ; SSE2-NEXT:    retq
    509 ;
    510 ; SSE41-LABEL: test_v16i16:
    511 ; SSE41:       # %bb.0:
    512 ; SSE41-NEXT:    paddw %xmm1, %xmm0
    513 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    514 ; SSE41-NEXT:    paddw %xmm0, %xmm1
    515 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
    516 ; SSE41-NEXT:    paddw %xmm1, %xmm0
    517 ; SSE41-NEXT:    phaddw %xmm0, %xmm0
    518 ; SSE41-NEXT:    movd %xmm0, %eax
    519 ; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax
    520 ; SSE41-NEXT:    retq
    521 ;
    522 ; AVX1-LABEL: test_v16i16:
    523 ; AVX1:       # %bb.0:
    524 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
    525 ; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
    526 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    527 ; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
    528 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    529 ; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
    530 ; AVX1-NEXT:    vphaddw %xmm0, %xmm0, %xmm0
    531 ; AVX1-NEXT:    vmovd %xmm0, %eax
    532 ; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
    533 ; AVX1-NEXT:    vzeroupper
    534 ; AVX1-NEXT:    retq
    535 ;
    536 ; AVX2-LABEL: test_v16i16:
    537 ; AVX2:       # %bb.0:
    538 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
    539 ; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
    540 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    541 ; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
    542 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    543 ; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
    544 ; AVX2-NEXT:    vphaddw %ymm0, %ymm0, %ymm0
    545 ; AVX2-NEXT:    vmovd %xmm0, %eax
    546 ; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
    547 ; AVX2-NEXT:    vzeroupper
    548 ; AVX2-NEXT:    retq
    549 ;
    550 ; AVX512-LABEL: test_v16i16:
    551 ; AVX512:       # %bb.0:
    552 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
    553 ; AVX512-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
    554 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    555 ; AVX512-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
    556 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    557 ; AVX512-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
    558 ; AVX512-NEXT:    vphaddw %ymm0, %ymm0, %ymm0
    559 ; AVX512-NEXT:    vmovd %xmm0, %eax
    560 ; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
    561 ; AVX512-NEXT:    vzeroupper
    562 ; AVX512-NEXT:    retq
    563   %1 = call i16 @llvm.experimental.vector.reduce.add.i16.v16i16(<16 x i16> %a0)
    564   ret i16 %1
    565 }
    566 
    567 define i16 @test_v32i16(<32 x i16> %a0) {
    568 ; SSE2-LABEL: test_v32i16:
    569 ; SSE2:       # %bb.0:
    570 ; SSE2-NEXT:    paddw %xmm3, %xmm1
    571 ; SSE2-NEXT:    paddw %xmm2, %xmm1
    572 ; SSE2-NEXT:    paddw %xmm0, %xmm1
    573 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
    574 ; SSE2-NEXT:    paddw %xmm1, %xmm0
    575 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    576 ; SSE2-NEXT:    paddw %xmm0, %xmm1
    577 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
    578 ; SSE2-NEXT:    psrld $16, %xmm0
    579 ; SSE2-NEXT:    paddw %xmm1, %xmm0
    580 ; SSE2-NEXT:    movd %xmm0, %eax
    581 ; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
    582 ; SSE2-NEXT:    retq
    583 ;
    584 ; SSE41-LABEL: test_v32i16:
    585 ; SSE41:       # %bb.0:
    586 ; SSE41-NEXT:    paddw %xmm3, %xmm1
    587 ; SSE41-NEXT:    paddw %xmm2, %xmm1
    588 ; SSE41-NEXT:    paddw %xmm0, %xmm1
    589 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
    590 ; SSE41-NEXT:    paddw %xmm1, %xmm0
    591 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    592 ; SSE41-NEXT:    paddw %xmm0, %xmm1
    593 ; SSE41-NEXT:    phaddw %xmm1, %xmm1
    594 ; SSE41-NEXT:    movd %xmm1, %eax
    595 ; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax
    596 ; SSE41-NEXT:    retq
    597 ;
    598 ; AVX1-LABEL: test_v32i16:
    599 ; AVX1:       # %bb.0:
    600 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
    601 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
    602 ; AVX1-NEXT:    vpaddw %xmm2, %xmm3, %xmm2
    603 ; AVX1-NEXT:    vpaddw %xmm2, %xmm1, %xmm1
    604 ; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
    605 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    606 ; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
    607 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    608 ; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
    609 ; AVX1-NEXT:    vphaddw %xmm0, %xmm0, %xmm0
    610 ; AVX1-NEXT:    vmovd %xmm0, %eax
    611 ; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
    612 ; AVX1-NEXT:    vzeroupper
    613 ; AVX1-NEXT:    retq
    614 ;
    615 ; AVX2-LABEL: test_v32i16:
    616 ; AVX2:       # %bb.0:
    617 ; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
    618 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
    619 ; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
    620 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    621 ; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
    622 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    623 ; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
    624 ; AVX2-NEXT:    vphaddw %ymm0, %ymm0, %ymm0
    625 ; AVX2-NEXT:    vmovd %xmm0, %eax
    626 ; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
    627 ; AVX2-NEXT:    vzeroupper
    628 ; AVX2-NEXT:    retq
    629 ;
    630 ; AVX512-LABEL: test_v32i16:
    631 ; AVX512:       # %bb.0:
    632 ; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
    633 ; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm0
    634 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
    635 ; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm0
    636 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    637 ; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm0
    638 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    639 ; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm0
    640 ; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
    641 ; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm0
    642 ; AVX512-NEXT:    vmovd %xmm0, %eax
    643 ; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
    644 ; AVX512-NEXT:    vzeroupper
    645 ; AVX512-NEXT:    retq
    646   %1 = call i16 @llvm.experimental.vector.reduce.add.i16.v32i16(<32 x i16> %a0)
    647   ret i16 %1
    648 }
    649 
    650 define i16 @test_v64i16(<64 x i16> %a0) {
    651 ; SSE2-LABEL: test_v64i16:
    652 ; SSE2:       # %bb.0:
    653 ; SSE2-NEXT:    paddw %xmm6, %xmm2
    654 ; SSE2-NEXT:    paddw %xmm7, %xmm3
    655 ; SSE2-NEXT:    paddw %xmm5, %xmm3
    656 ; SSE2-NEXT:    paddw %xmm1, %xmm3
    657 ; SSE2-NEXT:    paddw %xmm4, %xmm2
    658 ; SSE2-NEXT:    paddw %xmm3, %xmm2
    659 ; SSE2-NEXT:    paddw %xmm0, %xmm2
    660 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
    661 ; SSE2-NEXT:    paddw %xmm2, %xmm0
    662 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    663 ; SSE2-NEXT:    paddw %xmm0, %xmm1
    664 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
    665 ; SSE2-NEXT:    psrld $16, %xmm0
    666 ; SSE2-NEXT:    paddw %xmm1, %xmm0
    667 ; SSE2-NEXT:    movd %xmm0, %eax
    668 ; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
    669 ; SSE2-NEXT:    retq
    670 ;
    671 ; SSE41-LABEL: test_v64i16:
    672 ; SSE41:       # %bb.0:
    673 ; SSE41-NEXT:    paddw %xmm6, %xmm2
    674 ; SSE41-NEXT:    paddw %xmm7, %xmm3
    675 ; SSE41-NEXT:    paddw %xmm5, %xmm3
    676 ; SSE41-NEXT:    paddw %xmm1, %xmm3
    677 ; SSE41-NEXT:    paddw %xmm4, %xmm2
    678 ; SSE41-NEXT:    paddw %xmm3, %xmm2
    679 ; SSE41-NEXT:    paddw %xmm0, %xmm2
    680 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
    681 ; SSE41-NEXT:    paddw %xmm2, %xmm0
    682 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    683 ; SSE41-NEXT:    paddw %xmm0, %xmm1
    684 ; SSE41-NEXT:    phaddw %xmm1, %xmm1
    685 ; SSE41-NEXT:    movd %xmm1, %eax
    686 ; SSE41-NEXT:    # kill: def $ax killed $ax killed $eax
    687 ; SSE41-NEXT:    retq
    688 ;
    689 ; AVX1-LABEL: test_v64i16:
    690 ; AVX1:       # %bb.0:
    691 ; AVX1-NEXT:    vpaddw %xmm3, %xmm1, %xmm4
    692 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3
    693 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
    694 ; AVX1-NEXT:    vpaddw %xmm3, %xmm1, %xmm1
    695 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
    696 ; AVX1-NEXT:    vpaddw %xmm1, %xmm3, %xmm1
    697 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
    698 ; AVX1-NEXT:    vpaddw %xmm1, %xmm3, %xmm1
    699 ; AVX1-NEXT:    vpaddw %xmm4, %xmm2, %xmm2
    700 ; AVX1-NEXT:    vpaddw %xmm1, %xmm2, %xmm1
    701 ; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
    702 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    703 ; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
    704 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    705 ; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
    706 ; AVX1-NEXT:    vphaddw %xmm0, %xmm0, %xmm0
    707 ; AVX1-NEXT:    vmovd %xmm0, %eax
    708 ; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
    709 ; AVX1-NEXT:    vzeroupper
    710 ; AVX1-NEXT:    retq
    711 ;
    712 ; AVX2-LABEL: test_v64i16:
    713 ; AVX2:       # %bb.0:
    714 ; AVX2-NEXT:    vpaddw %ymm3, %ymm1, %ymm1
    715 ; AVX2-NEXT:    vpaddw %ymm1, %ymm2, %ymm1
    716 ; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
    717 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
    718 ; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
    719 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    720 ; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
    721 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    722 ; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
    723 ; AVX2-NEXT:    vphaddw %ymm0, %ymm0, %ymm0
    724 ; AVX2-NEXT:    vmovd %xmm0, %eax
    725 ; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
    726 ; AVX2-NEXT:    vzeroupper
    727 ; AVX2-NEXT:    retq
    728 ;
    729 ; AVX512-LABEL: test_v64i16:
    730 ; AVX512:       # %bb.0:
    731 ; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm0
    732 ; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
    733 ; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm0
    734 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
    735 ; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm0
    736 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    737 ; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm0
    738 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    739 ; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm0
    740 ; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
    741 ; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm0
    742 ; AVX512-NEXT:    vmovd %xmm0, %eax
    743 ; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
    744 ; AVX512-NEXT:    vzeroupper
    745 ; AVX512-NEXT:    retq
    746   %1 = call i16 @llvm.experimental.vector.reduce.add.i16.v64i16(<64 x i16> %a0)
    747   ret i16 %1
    748 }
    749 
    750 ;
    751 ; vXi8
    752 ;
    753 
    754 define i8 @test_v16i8(<16 x i8> %a0) {
    755 ; SSE2-LABEL: test_v16i8:
    756 ; SSE2:       # %bb.0:
    757 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    758 ; SSE2-NEXT:    paddb %xmm0, %xmm1
    759 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
    760 ; SSE2-NEXT:    paddb %xmm1, %xmm0
    761 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
    762 ; SSE2-NEXT:    psrld $16, %xmm1
    763 ; SSE2-NEXT:    paddb %xmm0, %xmm1
    764 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
    765 ; SSE2-NEXT:    psrlw $8, %xmm0
    766 ; SSE2-NEXT:    paddb %xmm1, %xmm0
    767 ; SSE2-NEXT:    movd %xmm0, %eax
    768 ; SSE2-NEXT:    # kill: def $al killed $al killed $eax
    769 ; SSE2-NEXT:    retq
    770 ;
    771 ; SSE41-LABEL: test_v16i8:
    772 ; SSE41:       # %bb.0:
    773 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    774 ; SSE41-NEXT:    paddb %xmm0, %xmm1
    775 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
    776 ; SSE41-NEXT:    paddb %xmm1, %xmm0
    777 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
    778 ; SSE41-NEXT:    psrld $16, %xmm1
    779 ; SSE41-NEXT:    paddb %xmm0, %xmm1
    780 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
    781 ; SSE41-NEXT:    psrlw $8, %xmm0
    782 ; SSE41-NEXT:    paddb %xmm1, %xmm0
    783 ; SSE41-NEXT:    pextrb $0, %xmm0, %eax
    784 ; SSE41-NEXT:    # kill: def $al killed $al killed $eax
    785 ; SSE41-NEXT:    retq
    786 ;
    787 ; AVX-LABEL: test_v16i8:
    788 ; AVX:       # %bb.0:
    789 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    790 ; AVX-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
    791 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    792 ; AVX-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
    793 ; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
    794 ; AVX-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
    795 ; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
    796 ; AVX-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
    797 ; AVX-NEXT:    vpextrb $0, %xmm0, %eax
    798 ; AVX-NEXT:    # kill: def $al killed $al killed $eax
    799 ; AVX-NEXT:    retq
    800 ;
    801 ; AVX512-LABEL: test_v16i8:
    802 ; AVX512:       # %bb.0:
    803 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    804 ; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
    805 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    806 ; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
    807 ; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
    808 ; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
    809 ; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
    810 ; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
    811 ; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
    812 ; AVX512-NEXT:    # kill: def $al killed $al killed $eax
    813 ; AVX512-NEXT:    retq
    814   %1 = call i8 @llvm.experimental.vector.reduce.add.i8.v16i8(<16 x i8> %a0)
    815   ret i8 %1
    816 }
    817 
    818 define i8 @test_v32i8(<32 x i8> %a0) {
    819 ; SSE2-LABEL: test_v32i8:
    820 ; SSE2:       # %bb.0:
    821 ; SSE2-NEXT:    paddb %xmm1, %xmm0
    822 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    823 ; SSE2-NEXT:    paddb %xmm0, %xmm1
    824 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
    825 ; SSE2-NEXT:    paddb %xmm1, %xmm0
    826 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
    827 ; SSE2-NEXT:    psrld $16, %xmm1
    828 ; SSE2-NEXT:    paddb %xmm0, %xmm1
    829 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
    830 ; SSE2-NEXT:    psrlw $8, %xmm0
    831 ; SSE2-NEXT:    paddb %xmm1, %xmm0
    832 ; SSE2-NEXT:    movd %xmm0, %eax
    833 ; SSE2-NEXT:    # kill: def $al killed $al killed $eax
    834 ; SSE2-NEXT:    retq
    835 ;
    836 ; SSE41-LABEL: test_v32i8:
    837 ; SSE41:       # %bb.0:
    838 ; SSE41-NEXT:    paddb %xmm1, %xmm0
    839 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    840 ; SSE41-NEXT:    paddb %xmm0, %xmm1
    841 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
    842 ; SSE41-NEXT:    paddb %xmm1, %xmm0
    843 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
    844 ; SSE41-NEXT:    psrld $16, %xmm1
    845 ; SSE41-NEXT:    paddb %xmm0, %xmm1
    846 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
    847 ; SSE41-NEXT:    psrlw $8, %xmm0
    848 ; SSE41-NEXT:    paddb %xmm1, %xmm0
    849 ; SSE41-NEXT:    pextrb $0, %xmm0, %eax
    850 ; SSE41-NEXT:    # kill: def $al killed $al killed $eax
    851 ; SSE41-NEXT:    retq
    852 ;
    853 ; AVX1-LABEL: test_v32i8:
    854 ; AVX1:       # %bb.0:
    855 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
    856 ; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
    857 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    858 ; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
    859 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    860 ; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
    861 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
    862 ; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
    863 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
    864 ; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
    865 ; AVX1-NEXT:    vpextrb $0, %xmm0, %eax
    866 ; AVX1-NEXT:    # kill: def $al killed $al killed $eax
    867 ; AVX1-NEXT:    vzeroupper
    868 ; AVX1-NEXT:    retq
    869 ;
    870 ; AVX2-LABEL: test_v32i8:
    871 ; AVX2:       # %bb.0:
    872 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
    873 ; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
    874 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    875 ; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
    876 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    877 ; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
    878 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
    879 ; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
    880 ; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
    881 ; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
    882 ; AVX2-NEXT:    vpextrb $0, %xmm0, %eax
    883 ; AVX2-NEXT:    # kill: def $al killed $al killed $eax
    884 ; AVX2-NEXT:    vzeroupper
    885 ; AVX2-NEXT:    retq
    886 ;
    887 ; AVX512-LABEL: test_v32i8:
    888 ; AVX512:       # %bb.0:
    889 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
    890 ; AVX512-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
    891 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    892 ; AVX512-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
    893 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    894 ; AVX512-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
    895 ; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
    896 ; AVX512-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
    897 ; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
    898 ; AVX512-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
    899 ; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
    900 ; AVX512-NEXT:    # kill: def $al killed $al killed $eax
    901 ; AVX512-NEXT:    vzeroupper
    902 ; AVX512-NEXT:    retq
    903   %1 = call i8 @llvm.experimental.vector.reduce.add.i8.v32i8(<32 x i8> %a0)
    904   ret i8 %1
    905 }
    906 
    907 define i8 @test_v64i8(<64 x i8> %a0) {
    908 ; SSE2-LABEL: test_v64i8:
    909 ; SSE2:       # %bb.0:
    910 ; SSE2-NEXT:    paddb %xmm3, %xmm1
    911 ; SSE2-NEXT:    paddb %xmm2, %xmm1
    912 ; SSE2-NEXT:    paddb %xmm0, %xmm1
    913 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
    914 ; SSE2-NEXT:    paddb %xmm1, %xmm0
    915 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    916 ; SSE2-NEXT:    paddb %xmm0, %xmm1
    917 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
    918 ; SSE2-NEXT:    psrld $16, %xmm0
    919 ; SSE2-NEXT:    paddb %xmm1, %xmm0
    920 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
    921 ; SSE2-NEXT:    psrlw $8, %xmm1
    922 ; SSE2-NEXT:    paddb %xmm0, %xmm1
    923 ; SSE2-NEXT:    movd %xmm1, %eax
    924 ; SSE2-NEXT:    # kill: def $al killed $al killed $eax
    925 ; SSE2-NEXT:    retq
    926 ;
    927 ; SSE41-LABEL: test_v64i8:
    928 ; SSE41:       # %bb.0:
    929 ; SSE41-NEXT:    paddb %xmm3, %xmm1
    930 ; SSE41-NEXT:    paddb %xmm2, %xmm1
    931 ; SSE41-NEXT:    paddb %xmm0, %xmm1
    932 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
    933 ; SSE41-NEXT:    paddb %xmm1, %xmm0
    934 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    935 ; SSE41-NEXT:    paddb %xmm0, %xmm1
    936 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
    937 ; SSE41-NEXT:    psrld $16, %xmm0
    938 ; SSE41-NEXT:    paddb %xmm1, %xmm0
    939 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
    940 ; SSE41-NEXT:    psrlw $8, %xmm1
    941 ; SSE41-NEXT:    paddb %xmm0, %xmm1
    942 ; SSE41-NEXT:    pextrb $0, %xmm1, %eax
    943 ; SSE41-NEXT:    # kill: def $al killed $al killed $eax
    944 ; SSE41-NEXT:    retq
    945 ;
    946 ; AVX1-LABEL: test_v64i8:
    947 ; AVX1:       # %bb.0:
    948 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
    949 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
    950 ; AVX1-NEXT:    vpaddb %xmm2, %xmm3, %xmm2
    951 ; AVX1-NEXT:    vpaddb %xmm2, %xmm1, %xmm1
    952 ; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
    953 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    954 ; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
    955 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    956 ; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
    957 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
    958 ; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
    959 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
    960 ; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
    961 ; AVX1-NEXT:    vpextrb $0, %xmm0, %eax
    962 ; AVX1-NEXT:    # kill: def $al killed $al killed $eax
    963 ; AVX1-NEXT:    vzeroupper
    964 ; AVX1-NEXT:    retq
    965 ;
    966 ; AVX2-LABEL: test_v64i8:
    967 ; AVX2:       # %bb.0:
    968 ; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
    969 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
    970 ; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
    971 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    972 ; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
    973 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    974 ; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
    975 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
    976 ; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
    977 ; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
    978 ; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
    979 ; AVX2-NEXT:    vpextrb $0, %xmm0, %eax
    980 ; AVX2-NEXT:    # kill: def $al killed $al killed $eax
    981 ; AVX2-NEXT:    vzeroupper
    982 ; AVX2-NEXT:    retq
    983 ;
    984 ; AVX512-LABEL: test_v64i8:
    985 ; AVX512:       # %bb.0:
    986 ; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
    987 ; AVX512-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
    988 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
    989 ; AVX512-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
    990 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
    991 ; AVX512-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
    992 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
    993 ; AVX512-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
    994 ; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
    995 ; AVX512-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
    996 ; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
    997 ; AVX512-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
    998 ; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
    999 ; AVX512-NEXT:    # kill: def $al killed $al killed $eax
   1000 ; AVX512-NEXT:    vzeroupper
   1001 ; AVX512-NEXT:    retq
   1002   %1 = call i8 @llvm.experimental.vector.reduce.add.i8.v64i8(<64 x i8> %a0)
   1003   ret i8 %1
   1004 }
   1005 
   1006 define i8 @test_v128i8(<128 x i8> %a0) {
   1007 ; SSE2-LABEL: test_v128i8:
   1008 ; SSE2:       # %bb.0:
   1009 ; SSE2-NEXT:    paddb %xmm6, %xmm2
   1010 ; SSE2-NEXT:    paddb %xmm7, %xmm3
   1011 ; SSE2-NEXT:    paddb %xmm5, %xmm3
   1012 ; SSE2-NEXT:    paddb %xmm1, %xmm3
   1013 ; SSE2-NEXT:    paddb %xmm4, %xmm2
   1014 ; SSE2-NEXT:    paddb %xmm3, %xmm2
   1015 ; SSE2-NEXT:    paddb %xmm0, %xmm2
   1016 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
   1017 ; SSE2-NEXT:    paddb %xmm2, %xmm0
   1018 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
   1019 ; SSE2-NEXT:    paddb %xmm0, %xmm1
   1020 ; SSE2-NEXT:    movdqa %xmm1, %xmm0
   1021 ; SSE2-NEXT:    psrld $16, %xmm0
   1022 ; SSE2-NEXT:    paddb %xmm1, %xmm0
   1023 ; SSE2-NEXT:    movdqa %xmm0, %xmm1
   1024 ; SSE2-NEXT:    psrlw $8, %xmm1
   1025 ; SSE2-NEXT:    paddb %xmm0, %xmm1
   1026 ; SSE2-NEXT:    movd %xmm1, %eax
   1027 ; SSE2-NEXT:    # kill: def $al killed $al killed $eax
   1028 ; SSE2-NEXT:    retq
   1029 ;
   1030 ; SSE41-LABEL: test_v128i8:
   1031 ; SSE41:       # %bb.0:
   1032 ; SSE41-NEXT:    paddb %xmm6, %xmm2
   1033 ; SSE41-NEXT:    paddb %xmm7, %xmm3
   1034 ; SSE41-NEXT:    paddb %xmm5, %xmm3
   1035 ; SSE41-NEXT:    paddb %xmm1, %xmm3
   1036 ; SSE41-NEXT:    paddb %xmm4, %xmm2
   1037 ; SSE41-NEXT:    paddb %xmm3, %xmm2
   1038 ; SSE41-NEXT:    paddb %xmm0, %xmm2
   1039 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
   1040 ; SSE41-NEXT:    paddb %xmm2, %xmm0
   1041 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
   1042 ; SSE41-NEXT:    paddb %xmm0, %xmm1
   1043 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
   1044 ; SSE41-NEXT:    psrld $16, %xmm0
   1045 ; SSE41-NEXT:    paddb %xmm1, %xmm0
   1046 ; SSE41-NEXT:    movdqa %xmm0, %xmm1
   1047 ; SSE41-NEXT:    psrlw $8, %xmm1
   1048 ; SSE41-NEXT:    paddb %xmm0, %xmm1
   1049 ; SSE41-NEXT:    pextrb $0, %xmm1, %eax
   1050 ; SSE41-NEXT:    # kill: def $al killed $al killed $eax
   1051 ; SSE41-NEXT:    retq
   1052 ;
   1053 ; AVX1-LABEL: test_v128i8:
   1054 ; AVX1:       # %bb.0:
   1055 ; AVX1-NEXT:    vpaddb %xmm3, %xmm1, %xmm4
   1056 ; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3
   1057 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
   1058 ; AVX1-NEXT:    vpaddb %xmm3, %xmm1, %xmm1
   1059 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
   1060 ; AVX1-NEXT:    vpaddb %xmm1, %xmm3, %xmm1
   1061 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
   1062 ; AVX1-NEXT:    vpaddb %xmm1, %xmm3, %xmm1
   1063 ; AVX1-NEXT:    vpaddb %xmm4, %xmm2, %xmm2
   1064 ; AVX1-NEXT:    vpaddb %xmm1, %xmm2, %xmm1
   1065 ; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
   1066 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
   1067 ; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
   1068 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
   1069 ; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
   1070 ; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
   1071 ; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
   1072 ; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
   1073 ; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
   1074 ; AVX1-NEXT:    vpextrb $0, %xmm0, %eax
   1075 ; AVX1-NEXT:    # kill: def $al killed $al killed $eax
   1076 ; AVX1-NEXT:    vzeroupper
   1077 ; AVX1-NEXT:    retq
   1078 ;
   1079 ; AVX2-LABEL: test_v128i8:
   1080 ; AVX2:       # %bb.0:
   1081 ; AVX2-NEXT:    vpaddb %ymm3, %ymm1, %ymm1
   1082 ; AVX2-NEXT:    vpaddb %ymm1, %ymm2, %ymm1
   1083 ; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
   1084 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
   1085 ; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
   1086 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
   1087 ; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
   1088 ; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
   1089 ; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
   1090 ; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
   1091 ; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
   1092 ; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
   1093 ; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
   1094 ; AVX2-NEXT:    vpextrb $0, %xmm0, %eax
   1095 ; AVX2-NEXT:    # kill: def $al killed $al killed $eax
   1096 ; AVX2-NEXT:    vzeroupper
   1097 ; AVX2-NEXT:    retq
   1098 ;
   1099 ; AVX512-LABEL: test_v128i8:
   1100 ; AVX512:       # %bb.0:
   1101 ; AVX512-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
   1102 ; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
   1103 ; AVX512-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
   1104 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
   1105 ; AVX512-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
   1106 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
   1107 ; AVX512-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
   1108 ; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
   1109 ; AVX512-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
   1110 ; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
   1111 ; AVX512-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
   1112 ; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
   1113 ; AVX512-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
   1114 ; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
   1115 ; AVX512-NEXT:    # kill: def $al killed $al killed $eax
   1116 ; AVX512-NEXT:    vzeroupper
   1117 ; AVX512-NEXT:    retq
   1118   %1 = call i8 @llvm.experimental.vector.reduce.add.i8.v128i8(<128 x i8> %a0)
   1119   ret i8 %1
   1120 }
   1121 
   1122 declare i64 @llvm.experimental.vector.reduce.add.i64.v2i64(<2 x i64>)
   1123 declare i64 @llvm.experimental.vector.reduce.add.i64.v4i64(<4 x i64>)
   1124 declare i64 @llvm.experimental.vector.reduce.add.i64.v8i64(<8 x i64>)
   1125 declare i64 @llvm.experimental.vector.reduce.add.i64.v16i64(<16 x i64>)
   1126 
   1127 declare i32 @llvm.experimental.vector.reduce.add.i32.v4i32(<4 x i32>)
   1128 declare i32 @llvm.experimental.vector.reduce.add.i32.v8i32(<8 x i32>)
   1129 declare i32 @llvm.experimental.vector.reduce.add.i32.v16i32(<16 x i32>)
   1130 declare i32 @llvm.experimental.vector.reduce.add.i32.v32i32(<32 x i32>)
   1131 
   1132 declare i16 @llvm.experimental.vector.reduce.add.i16.v8i16(<8 x i16>)
   1133 declare i16 @llvm.experimental.vector.reduce.add.i16.v16i16(<16 x i16>)
   1134 declare i16 @llvm.experimental.vector.reduce.add.i16.v32i16(<32 x i16>)
   1135 declare i16 @llvm.experimental.vector.reduce.add.i16.v64i16(<64 x i16>)
   1136 
   1137 declare i8 @llvm.experimental.vector.reduce.add.i8.v16i8(<16 x i8>)
   1138 declare i8 @llvm.experimental.vector.reduce.add.i8.v32i8(<32 x i8>)
   1139 declare i8 @llvm.experimental.vector.reduce.add.i8.v64i8(<64 x i8>)
   1140 declare i8 @llvm.experimental.vector.reduce.add.i8.v128i8(<128 x i8>)
   1141