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
13define 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
38define 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 %xmm1, %xmm0, %xmm0
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 %xmm1, %xmm0, %xmm0
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
80define 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 %xmm1, %xmm0, %xmm0
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 %xmm1, %xmm0, %xmm0
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
130define 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 %xmm1, %xmm0, %xmm0
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 %xmm1, %xmm0, %xmm0
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
197define i32 @test_v2i32(<2 x i32> %a0) {
198; SSE-LABEL: test_v2i32:
199; SSE:       # %bb.0:
200; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
201; SSE-NEXT:    paddq %xmm0, %xmm1
202; SSE-NEXT:    movd %xmm1, %eax
203; SSE-NEXT:    retq
204;
205; AVX-LABEL: test_v2i32:
206; AVX:       # %bb.0:
207; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
208; AVX-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
209; AVX-NEXT:    vmovd %xmm0, %eax
210; AVX-NEXT:    retq
211;
212; AVX512-LABEL: test_v2i32:
213; AVX512:       # %bb.0:
214; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
215; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
216; AVX512-NEXT:    vmovd %xmm0, %eax
217; AVX512-NEXT:    retq
218  %1 = call i32 @llvm.experimental.vector.reduce.add.i32.v2i32(<2 x i32> %a0)
219  ret i32 %1
220}
221
222define i32 @test_v4i32(<4 x i32> %a0) {
223; SSE-LABEL: test_v4i32:
224; SSE:       # %bb.0:
225; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
226; SSE-NEXT:    paddd %xmm0, %xmm1
227; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
228; SSE-NEXT:    paddd %xmm1, %xmm0
229; SSE-NEXT:    movd %xmm0, %eax
230; SSE-NEXT:    retq
231;
232; AVX-LABEL: test_v4i32:
233; AVX:       # %bb.0:
234; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
235; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
236; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
237; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
238; AVX-NEXT:    vmovd %xmm0, %eax
239; AVX-NEXT:    retq
240;
241; AVX512-LABEL: test_v4i32:
242; AVX512:       # %bb.0:
243; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
244; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
245; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
246; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
247; AVX512-NEXT:    vmovd %xmm0, %eax
248; AVX512-NEXT:    retq
249  %1 = call i32 @llvm.experimental.vector.reduce.add.i32.v4i32(<4 x i32> %a0)
250  ret i32 %1
251}
252
253define i32 @test_v8i32(<8 x i32> %a0) {
254; SSE-LABEL: test_v8i32:
255; SSE:       # %bb.0:
256; SSE-NEXT:    paddd %xmm1, %xmm0
257; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
258; SSE-NEXT:    paddd %xmm0, %xmm1
259; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
260; SSE-NEXT:    paddd %xmm1, %xmm0
261; SSE-NEXT:    movd %xmm0, %eax
262; SSE-NEXT:    retq
263;
264; AVX1-LABEL: test_v8i32:
265; AVX1:       # %bb.0:
266; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
267; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
268; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
269; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
270; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
271; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
272; AVX1-NEXT:    vmovd %xmm0, %eax
273; AVX1-NEXT:    vzeroupper
274; AVX1-NEXT:    retq
275;
276; AVX2-LABEL: test_v8i32:
277; AVX2:       # %bb.0:
278; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
279; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
280; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
281; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
282; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
283; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
284; AVX2-NEXT:    vmovd %xmm0, %eax
285; AVX2-NEXT:    vzeroupper
286; AVX2-NEXT:    retq
287;
288; AVX512-LABEL: test_v8i32:
289; AVX512:       # %bb.0:
290; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
291; AVX512-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
292; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
293; AVX512-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
294; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
295; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
296; AVX512-NEXT:    vmovd %xmm0, %eax
297; AVX512-NEXT:    vzeroupper
298; AVX512-NEXT:    retq
299  %1 = call i32 @llvm.experimental.vector.reduce.add.i32.v8i32(<8 x i32> %a0)
300  ret i32 %1
301}
302
303define i32 @test_v16i32(<16 x i32> %a0) {
304; SSE-LABEL: test_v16i32:
305; SSE:       # %bb.0:
306; SSE-NEXT:    paddd %xmm3, %xmm1
307; SSE-NEXT:    paddd %xmm2, %xmm1
308; SSE-NEXT:    paddd %xmm0, %xmm1
309; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
310; SSE-NEXT:    paddd %xmm1, %xmm0
311; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
312; SSE-NEXT:    paddd %xmm0, %xmm1
313; SSE-NEXT:    movd %xmm1, %eax
314; SSE-NEXT:    retq
315;
316; AVX1-LABEL: test_v16i32:
317; AVX1:       # %bb.0:
318; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
319; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
320; AVX1-NEXT:    vpaddd %xmm2, %xmm3, %xmm2
321; AVX1-NEXT:    vpaddd %xmm2, %xmm1, %xmm1
322; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
323; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
324; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
325; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
326; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
327; AVX1-NEXT:    vmovd %xmm0, %eax
328; AVX1-NEXT:    vzeroupper
329; AVX1-NEXT:    retq
330;
331; AVX2-LABEL: test_v16i32:
332; AVX2:       # %bb.0:
333; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
334; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
335; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
336; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
337; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
338; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
339; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
340; AVX2-NEXT:    vmovd %xmm0, %eax
341; AVX2-NEXT:    vzeroupper
342; AVX2-NEXT:    retq
343;
344; AVX512-LABEL: test_v16i32:
345; AVX512:       # %bb.0:
346; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
347; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
348; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
349; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
350; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
351; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
352; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
353; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
354; AVX512-NEXT:    vmovd %xmm0, %eax
355; AVX512-NEXT:    vzeroupper
356; AVX512-NEXT:    retq
357  %1 = call i32 @llvm.experimental.vector.reduce.add.i32.v16i32(<16 x i32> %a0)
358  ret i32 %1
359}
360
361define i32 @test_v32i32(<32 x i32> %a0) {
362; SSE-LABEL: test_v32i32:
363; SSE:       # %bb.0:
364; SSE-NEXT:    paddd %xmm6, %xmm2
365; SSE-NEXT:    paddd %xmm7, %xmm3
366; SSE-NEXT:    paddd %xmm5, %xmm3
367; SSE-NEXT:    paddd %xmm1, %xmm3
368; SSE-NEXT:    paddd %xmm4, %xmm2
369; SSE-NEXT:    paddd %xmm3, %xmm2
370; SSE-NEXT:    paddd %xmm0, %xmm2
371; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
372; SSE-NEXT:    paddd %xmm2, %xmm0
373; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
374; SSE-NEXT:    paddd %xmm0, %xmm1
375; SSE-NEXT:    movd %xmm1, %eax
376; SSE-NEXT:    retq
377;
378; AVX1-LABEL: test_v32i32:
379; AVX1:       # %bb.0:
380; AVX1-NEXT:    vpaddd %xmm3, %xmm1, %xmm4
381; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3
382; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
383; AVX1-NEXT:    vpaddd %xmm3, %xmm1, %xmm1
384; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
385; AVX1-NEXT:    vpaddd %xmm1, %xmm3, %xmm1
386; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
387; AVX1-NEXT:    vpaddd %xmm1, %xmm3, %xmm1
388; AVX1-NEXT:    vpaddd %xmm4, %xmm2, %xmm2
389; AVX1-NEXT:    vpaddd %xmm1, %xmm2, %xmm1
390; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
391; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
392; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
393; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
394; AVX1-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
395; AVX1-NEXT:    vmovd %xmm0, %eax
396; AVX1-NEXT:    vzeroupper
397; AVX1-NEXT:    retq
398;
399; AVX2-LABEL: test_v32i32:
400; AVX2:       # %bb.0:
401; AVX2-NEXT:    vpaddd %ymm3, %ymm1, %ymm1
402; AVX2-NEXT:    vpaddd %ymm1, %ymm2, %ymm1
403; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
404; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
405; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
406; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
407; AVX2-NEXT:    vpaddd %ymm1, %ymm0, %ymm0
408; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
409; AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
410; AVX2-NEXT:    vmovd %xmm0, %eax
411; AVX2-NEXT:    vzeroupper
412; AVX2-NEXT:    retq
413;
414; AVX512-LABEL: test_v32i32:
415; AVX512:       # %bb.0:
416; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
417; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
418; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
419; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
420; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
421; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
422; AVX512-NEXT:    vpaddd %zmm1, %zmm0, %zmm0
423; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
424; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
425; AVX512-NEXT:    vmovd %xmm0, %eax
426; AVX512-NEXT:    vzeroupper
427; AVX512-NEXT:    retq
428  %1 = call i32 @llvm.experimental.vector.reduce.add.i32.v32i32(<32 x i32> %a0)
429  ret i32 %1
430}
431
432;
433; vXi16
434;
435
436define i16 @test_v2i16(<2 x i16> %a0) {
437; SSE-LABEL: test_v2i16:
438; SSE:       # %bb.0:
439; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
440; SSE-NEXT:    paddq %xmm0, %xmm1
441; SSE-NEXT:    movd %xmm1, %eax
442; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
443; SSE-NEXT:    retq
444;
445; AVX-LABEL: test_v2i16:
446; AVX:       # %bb.0:
447; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
448; AVX-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
449; AVX-NEXT:    vmovd %xmm0, %eax
450; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
451; AVX-NEXT:    retq
452;
453; AVX512-LABEL: test_v2i16:
454; AVX512:       # %bb.0:
455; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
456; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
457; AVX512-NEXT:    vmovd %xmm0, %eax
458; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
459; AVX512-NEXT:    retq
460  %1 = call i16 @llvm.experimental.vector.reduce.add.i16.v2i16(<2 x i16> %a0)
461  ret i16 %1
462}
463
464define i16 @test_v4i16(<4 x i16> %a0) {
465; SSE-LABEL: test_v4i16:
466; SSE:       # %bb.0:
467; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
468; SSE-NEXT:    paddd %xmm0, %xmm1
469; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
470; SSE-NEXT:    paddd %xmm1, %xmm0
471; SSE-NEXT:    movd %xmm0, %eax
472; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
473; SSE-NEXT:    retq
474;
475; AVX-LABEL: test_v4i16:
476; AVX:       # %bb.0:
477; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
478; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
479; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
480; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
481; AVX-NEXT:    vmovd %xmm0, %eax
482; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
483; AVX-NEXT:    retq
484;
485; AVX512-LABEL: test_v4i16:
486; AVX512:       # %bb.0:
487; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
488; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
489; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
490; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
491; AVX512-NEXT:    vmovd %xmm0, %eax
492; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
493; AVX512-NEXT:    retq
494  %1 = call i16 @llvm.experimental.vector.reduce.add.i16.v4i16(<4 x i16> %a0)
495  ret i16 %1
496}
497
498define i16 @test_v8i16(<8 x i16> %a0) {
499; SSE-LABEL: test_v8i16:
500; SSE:       # %bb.0:
501; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
502; SSE-NEXT:    paddw %xmm0, %xmm1
503; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
504; SSE-NEXT:    paddw %xmm1, %xmm0
505; SSE-NEXT:    movdqa %xmm0, %xmm1
506; SSE-NEXT:    psrld $16, %xmm1
507; SSE-NEXT:    paddw %xmm0, %xmm1
508; SSE-NEXT:    movd %xmm1, %eax
509; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
510; SSE-NEXT:    retq
511;
512; AVX-LABEL: test_v8i16:
513; AVX:       # %bb.0:
514; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
515; AVX-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
516; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
517; AVX-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
518; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
519; AVX-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
520; AVX-NEXT:    vmovd %xmm0, %eax
521; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
522; AVX-NEXT:    retq
523;
524; AVX512-LABEL: test_v8i16:
525; AVX512:       # %bb.0:
526; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
527; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
528; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
529; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
530; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
531; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
532; AVX512-NEXT:    vmovd %xmm0, %eax
533; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
534; AVX512-NEXT:    retq
535  %1 = call i16 @llvm.experimental.vector.reduce.add.i16.v8i16(<8 x i16> %a0)
536  ret i16 %1
537}
538
539define i16 @test_v16i16(<16 x i16> %a0) {
540; SSE-LABEL: test_v16i16:
541; SSE:       # %bb.0:
542; SSE-NEXT:    paddw %xmm1, %xmm0
543; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
544; SSE-NEXT:    paddw %xmm0, %xmm1
545; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
546; SSE-NEXT:    paddw %xmm1, %xmm0
547; SSE-NEXT:    movdqa %xmm0, %xmm1
548; SSE-NEXT:    psrld $16, %xmm1
549; SSE-NEXT:    paddw %xmm0, %xmm1
550; SSE-NEXT:    movd %xmm1, %eax
551; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
552; SSE-NEXT:    retq
553;
554; AVX1-LABEL: test_v16i16:
555; AVX1:       # %bb.0:
556; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
557; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
558; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
559; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
560; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
561; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
562; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
563; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
564; AVX1-NEXT:    vmovd %xmm0, %eax
565; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
566; AVX1-NEXT:    vzeroupper
567; AVX1-NEXT:    retq
568;
569; AVX2-LABEL: test_v16i16:
570; AVX2:       # %bb.0:
571; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
572; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
573; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
574; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
575; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
576; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
577; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
578; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
579; AVX2-NEXT:    vmovd %xmm0, %eax
580; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
581; AVX2-NEXT:    vzeroupper
582; AVX2-NEXT:    retq
583;
584; AVX512-LABEL: test_v16i16:
585; AVX512:       # %bb.0:
586; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
587; AVX512-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
588; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
589; AVX512-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
590; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
591; AVX512-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
592; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
593; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
594; AVX512-NEXT:    vmovd %xmm0, %eax
595; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
596; AVX512-NEXT:    vzeroupper
597; AVX512-NEXT:    retq
598  %1 = call i16 @llvm.experimental.vector.reduce.add.i16.v16i16(<16 x i16> %a0)
599  ret i16 %1
600}
601
602define i16 @test_v32i16(<32 x i16> %a0) {
603; SSE-LABEL: test_v32i16:
604; SSE:       # %bb.0:
605; SSE-NEXT:    paddw %xmm3, %xmm1
606; SSE-NEXT:    paddw %xmm2, %xmm1
607; SSE-NEXT:    paddw %xmm0, %xmm1
608; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
609; SSE-NEXT:    paddw %xmm1, %xmm0
610; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
611; SSE-NEXT:    paddw %xmm0, %xmm1
612; SSE-NEXT:    movdqa %xmm1, %xmm0
613; SSE-NEXT:    psrld $16, %xmm0
614; SSE-NEXT:    paddw %xmm1, %xmm0
615; SSE-NEXT:    movd %xmm0, %eax
616; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
617; SSE-NEXT:    retq
618;
619; AVX1-LABEL: test_v32i16:
620; AVX1:       # %bb.0:
621; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
622; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
623; AVX1-NEXT:    vpaddw %xmm2, %xmm3, %xmm2
624; AVX1-NEXT:    vpaddw %xmm2, %xmm1, %xmm1
625; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
626; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
627; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
628; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
629; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
630; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
631; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
632; AVX1-NEXT:    vmovd %xmm0, %eax
633; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
634; AVX1-NEXT:    vzeroupper
635; AVX1-NEXT:    retq
636;
637; AVX2-LABEL: test_v32i16:
638; AVX2:       # %bb.0:
639; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
640; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
641; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
642; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
643; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
644; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
645; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
646; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
647; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
648; AVX2-NEXT:    vmovd %xmm0, %eax
649; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
650; AVX2-NEXT:    vzeroupper
651; AVX2-NEXT:    retq
652;
653; AVX512-LABEL: test_v32i16:
654; AVX512:       # %bb.0:
655; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
656; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm0
657; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
658; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm0
659; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
660; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm0
661; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
662; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm0
663; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
664; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
665; AVX512-NEXT:    vmovd %xmm0, %eax
666; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
667; AVX512-NEXT:    vzeroupper
668; AVX512-NEXT:    retq
669  %1 = call i16 @llvm.experimental.vector.reduce.add.i16.v32i16(<32 x i16> %a0)
670  ret i16 %1
671}
672
673define i16 @test_v64i16(<64 x i16> %a0) {
674; SSE-LABEL: test_v64i16:
675; SSE:       # %bb.0:
676; SSE-NEXT:    paddw %xmm6, %xmm2
677; SSE-NEXT:    paddw %xmm7, %xmm3
678; SSE-NEXT:    paddw %xmm5, %xmm3
679; SSE-NEXT:    paddw %xmm1, %xmm3
680; SSE-NEXT:    paddw %xmm4, %xmm2
681; SSE-NEXT:    paddw %xmm3, %xmm2
682; SSE-NEXT:    paddw %xmm0, %xmm2
683; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
684; SSE-NEXT:    paddw %xmm2, %xmm0
685; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
686; SSE-NEXT:    paddw %xmm0, %xmm1
687; SSE-NEXT:    movdqa %xmm1, %xmm0
688; SSE-NEXT:    psrld $16, %xmm0
689; SSE-NEXT:    paddw %xmm1, %xmm0
690; SSE-NEXT:    movd %xmm0, %eax
691; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
692; SSE-NEXT:    retq
693;
694; AVX1-LABEL: test_v64i16:
695; AVX1:       # %bb.0:
696; AVX1-NEXT:    vpaddw %xmm3, %xmm1, %xmm4
697; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3
698; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
699; AVX1-NEXT:    vpaddw %xmm3, %xmm1, %xmm1
700; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
701; AVX1-NEXT:    vpaddw %xmm1, %xmm3, %xmm1
702; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
703; AVX1-NEXT:    vpaddw %xmm1, %xmm3, %xmm1
704; AVX1-NEXT:    vpaddw %xmm4, %xmm2, %xmm2
705; AVX1-NEXT:    vpaddw %xmm1, %xmm2, %xmm1
706; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
707; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
708; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
709; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
710; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
711; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
712; AVX1-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
713; AVX1-NEXT:    vmovd %xmm0, %eax
714; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
715; AVX1-NEXT:    vzeroupper
716; AVX1-NEXT:    retq
717;
718; AVX2-LABEL: test_v64i16:
719; AVX2:       # %bb.0:
720; AVX2-NEXT:    vpaddw %ymm3, %ymm1, %ymm1
721; AVX2-NEXT:    vpaddw %ymm1, %ymm2, %ymm1
722; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
723; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
724; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
725; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
726; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
727; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
728; AVX2-NEXT:    vpaddw %ymm1, %ymm0, %ymm0
729; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
730; AVX2-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
731; AVX2-NEXT:    vmovd %xmm0, %eax
732; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
733; AVX2-NEXT:    vzeroupper
734; AVX2-NEXT:    retq
735;
736; AVX512-LABEL: test_v64i16:
737; AVX512:       # %bb.0:
738; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm0
739; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
740; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm0
741; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
742; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm0
743; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
744; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm0
745; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
746; AVX512-NEXT:    vpaddw %zmm1, %zmm0, %zmm0
747; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
748; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
749; AVX512-NEXT:    vmovd %xmm0, %eax
750; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
751; AVX512-NEXT:    vzeroupper
752; AVX512-NEXT:    retq
753  %1 = call i16 @llvm.experimental.vector.reduce.add.i16.v64i16(<64 x i16> %a0)
754  ret i16 %1
755}
756
757;
758; vXi8
759;
760
761define i8 @test_v2i8(<2 x i8> %a0) {
762; SSE2-LABEL: test_v2i8:
763; SSE2:       # %bb.0:
764; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
765; SSE2-NEXT:    paddq %xmm0, %xmm1
766; SSE2-NEXT:    movd %xmm1, %eax
767; SSE2-NEXT:    # kill: def $al killed $al killed $eax
768; SSE2-NEXT:    retq
769;
770; SSE41-LABEL: test_v2i8:
771; SSE41:       # %bb.0:
772; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
773; SSE41-NEXT:    paddq %xmm0, %xmm1
774; SSE41-NEXT:    pextrb $0, %xmm1, %eax
775; SSE41-NEXT:    # kill: def $al killed $al killed $eax
776; SSE41-NEXT:    retq
777;
778; AVX-LABEL: test_v2i8:
779; AVX:       # %bb.0:
780; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
781; AVX-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
782; AVX-NEXT:    vpextrb $0, %xmm0, %eax
783; AVX-NEXT:    # kill: def $al killed $al killed $eax
784; AVX-NEXT:    retq
785;
786; AVX512-LABEL: test_v2i8:
787; AVX512:       # %bb.0:
788; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
789; AVX512-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
790; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
791; AVX512-NEXT:    # kill: def $al killed $al killed $eax
792; AVX512-NEXT:    retq
793  %1 = call i8 @llvm.experimental.vector.reduce.add.i8.v2i8(<2 x i8> %a0)
794  ret i8 %1
795}
796
797define i8 @test_v4i8(<4 x i8> %a0) {
798; SSE2-LABEL: test_v4i8:
799; SSE2:       # %bb.0:
800; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
801; SSE2-NEXT:    paddd %xmm0, %xmm1
802; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
803; SSE2-NEXT:    paddd %xmm1, %xmm0
804; SSE2-NEXT:    movd %xmm0, %eax
805; SSE2-NEXT:    # kill: def $al killed $al killed $eax
806; SSE2-NEXT:    retq
807;
808; SSE41-LABEL: test_v4i8:
809; SSE41:       # %bb.0:
810; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
811; SSE41-NEXT:    paddd %xmm0, %xmm1
812; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
813; SSE41-NEXT:    paddd %xmm1, %xmm0
814; SSE41-NEXT:    pextrb $0, %xmm0, %eax
815; SSE41-NEXT:    # kill: def $al killed $al killed $eax
816; SSE41-NEXT:    retq
817;
818; AVX-LABEL: test_v4i8:
819; AVX:       # %bb.0:
820; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
821; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
822; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
823; AVX-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
824; AVX-NEXT:    vpextrb $0, %xmm0, %eax
825; AVX-NEXT:    # kill: def $al killed $al killed $eax
826; AVX-NEXT:    retq
827;
828; AVX512-LABEL: test_v4i8:
829; AVX512:       # %bb.0:
830; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
831; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
832; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
833; AVX512-NEXT:    vpaddd %xmm1, %xmm0, %xmm0
834; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
835; AVX512-NEXT:    # kill: def $al killed $al killed $eax
836; AVX512-NEXT:    retq
837  %1 = call i8 @llvm.experimental.vector.reduce.add.i8.v4i8(<4 x i8> %a0)
838  ret i8 %1
839}
840
841define i8 @test_v8i8(<8 x i8> %a0) {
842; SSE2-LABEL: test_v8i8:
843; SSE2:       # %bb.0:
844; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
845; SSE2-NEXT:    paddw %xmm0, %xmm1
846; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
847; SSE2-NEXT:    paddw %xmm1, %xmm0
848; SSE2-NEXT:    movdqa %xmm0, %xmm1
849; SSE2-NEXT:    psrld $16, %xmm1
850; SSE2-NEXT:    paddw %xmm0, %xmm1
851; SSE2-NEXT:    movd %xmm1, %eax
852; SSE2-NEXT:    # kill: def $al killed $al killed $eax
853; SSE2-NEXT:    retq
854;
855; SSE41-LABEL: test_v8i8:
856; SSE41:       # %bb.0:
857; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
858; SSE41-NEXT:    paddw %xmm0, %xmm1
859; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
860; SSE41-NEXT:    paddw %xmm1, %xmm0
861; SSE41-NEXT:    movdqa %xmm0, %xmm1
862; SSE41-NEXT:    psrld $16, %xmm1
863; SSE41-NEXT:    paddw %xmm0, %xmm1
864; SSE41-NEXT:    pextrb $0, %xmm1, %eax
865; SSE41-NEXT:    # kill: def $al killed $al killed $eax
866; SSE41-NEXT:    retq
867;
868; AVX-LABEL: test_v8i8:
869; AVX:       # %bb.0:
870; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
871; AVX-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
872; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
873; AVX-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
874; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
875; AVX-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
876; AVX-NEXT:    vpextrb $0, %xmm0, %eax
877; AVX-NEXT:    # kill: def $al killed $al killed $eax
878; AVX-NEXT:    retq
879;
880; AVX512-LABEL: test_v8i8:
881; AVX512:       # %bb.0:
882; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
883; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
884; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
885; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
886; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
887; AVX512-NEXT:    vpaddw %xmm1, %xmm0, %xmm0
888; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
889; AVX512-NEXT:    # kill: def $al killed $al killed $eax
890; AVX512-NEXT:    retq
891  %1 = call i8 @llvm.experimental.vector.reduce.add.i8.v8i8(<8 x i8> %a0)
892  ret i8 %1
893}
894
895define i8 @test_v16i8(<16 x i8> %a0) {
896; SSE2-LABEL: test_v16i8:
897; SSE2:       # %bb.0:
898; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
899; SSE2-NEXT:    paddb %xmm0, %xmm1
900; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
901; SSE2-NEXT:    paddb %xmm1, %xmm0
902; SSE2-NEXT:    movdqa %xmm0, %xmm1
903; SSE2-NEXT:    psrld $16, %xmm1
904; SSE2-NEXT:    paddb %xmm0, %xmm1
905; SSE2-NEXT:    movdqa %xmm1, %xmm0
906; SSE2-NEXT:    psrlw $8, %xmm0
907; SSE2-NEXT:    paddb %xmm1, %xmm0
908; SSE2-NEXT:    movd %xmm0, %eax
909; SSE2-NEXT:    # kill: def $al killed $al killed $eax
910; SSE2-NEXT:    retq
911;
912; SSE41-LABEL: test_v16i8:
913; SSE41:       # %bb.0:
914; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
915; SSE41-NEXT:    paddb %xmm0, %xmm1
916; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
917; SSE41-NEXT:    paddb %xmm1, %xmm0
918; SSE41-NEXT:    movdqa %xmm0, %xmm1
919; SSE41-NEXT:    psrld $16, %xmm1
920; SSE41-NEXT:    paddb %xmm0, %xmm1
921; SSE41-NEXT:    movdqa %xmm1, %xmm0
922; SSE41-NEXT:    psrlw $8, %xmm0
923; SSE41-NEXT:    paddb %xmm1, %xmm0
924; SSE41-NEXT:    pextrb $0, %xmm0, %eax
925; SSE41-NEXT:    # kill: def $al killed $al killed $eax
926; SSE41-NEXT:    retq
927;
928; AVX-LABEL: test_v16i8:
929; AVX:       # %bb.0:
930; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
931; AVX-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
932; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
933; AVX-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
934; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
935; AVX-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
936; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
937; AVX-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
938; AVX-NEXT:    vpextrb $0, %xmm0, %eax
939; AVX-NEXT:    # kill: def $al killed $al killed $eax
940; AVX-NEXT:    retq
941;
942; AVX512-LABEL: test_v16i8:
943; AVX512:       # %bb.0:
944; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
945; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
946; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
947; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
948; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
949; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
950; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
951; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
952; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
953; AVX512-NEXT:    # kill: def $al killed $al killed $eax
954; AVX512-NEXT:    retq
955  %1 = call i8 @llvm.experimental.vector.reduce.add.i8.v16i8(<16 x i8> %a0)
956  ret i8 %1
957}
958
959define i8 @test_v32i8(<32 x i8> %a0) {
960; SSE2-LABEL: test_v32i8:
961; SSE2:       # %bb.0:
962; SSE2-NEXT:    paddb %xmm1, %xmm0
963; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
964; SSE2-NEXT:    paddb %xmm0, %xmm1
965; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
966; SSE2-NEXT:    paddb %xmm1, %xmm0
967; SSE2-NEXT:    movdqa %xmm0, %xmm1
968; SSE2-NEXT:    psrld $16, %xmm1
969; SSE2-NEXT:    paddb %xmm0, %xmm1
970; SSE2-NEXT:    movdqa %xmm1, %xmm0
971; SSE2-NEXT:    psrlw $8, %xmm0
972; SSE2-NEXT:    paddb %xmm1, %xmm0
973; SSE2-NEXT:    movd %xmm0, %eax
974; SSE2-NEXT:    # kill: def $al killed $al killed $eax
975; SSE2-NEXT:    retq
976;
977; SSE41-LABEL: test_v32i8:
978; SSE41:       # %bb.0:
979; SSE41-NEXT:    paddb %xmm1, %xmm0
980; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
981; SSE41-NEXT:    paddb %xmm0, %xmm1
982; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
983; SSE41-NEXT:    paddb %xmm1, %xmm0
984; SSE41-NEXT:    movdqa %xmm0, %xmm1
985; SSE41-NEXT:    psrld $16, %xmm1
986; SSE41-NEXT:    paddb %xmm0, %xmm1
987; SSE41-NEXT:    movdqa %xmm1, %xmm0
988; SSE41-NEXT:    psrlw $8, %xmm0
989; SSE41-NEXT:    paddb %xmm1, %xmm0
990; SSE41-NEXT:    pextrb $0, %xmm0, %eax
991; SSE41-NEXT:    # kill: def $al killed $al killed $eax
992; SSE41-NEXT:    retq
993;
994; AVX1-LABEL: test_v32i8:
995; AVX1:       # %bb.0:
996; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
997; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
998; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
999; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
1000; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1001; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
1002; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
1003; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
1004; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
1005; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
1006; AVX1-NEXT:    vpextrb $0, %xmm0, %eax
1007; AVX1-NEXT:    # kill: def $al killed $al killed $eax
1008; AVX1-NEXT:    vzeroupper
1009; AVX1-NEXT:    retq
1010;
1011; AVX2-LABEL: test_v32i8:
1012; AVX2:       # %bb.0:
1013; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1014; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
1015; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1016; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
1017; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1018; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
1019; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
1020; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
1021; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
1022; AVX2-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
1023; AVX2-NEXT:    vpextrb $0, %xmm0, %eax
1024; AVX2-NEXT:    # kill: def $al killed $al killed $eax
1025; AVX2-NEXT:    vzeroupper
1026; AVX2-NEXT:    retq
1027;
1028; AVX512-LABEL: test_v32i8:
1029; AVX512:       # %bb.0:
1030; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1031; AVX512-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
1032; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1033; AVX512-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
1034; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1035; AVX512-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
1036; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
1037; AVX512-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
1038; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
1039; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
1040; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
1041; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1042; AVX512-NEXT:    vzeroupper
1043; AVX512-NEXT:    retq
1044  %1 = call i8 @llvm.experimental.vector.reduce.add.i8.v32i8(<32 x i8> %a0)
1045  ret i8 %1
1046}
1047
1048define i8 @test_v64i8(<64 x i8> %a0) {
1049; SSE2-LABEL: test_v64i8:
1050; SSE2:       # %bb.0:
1051; SSE2-NEXT:    paddb %xmm3, %xmm1
1052; SSE2-NEXT:    paddb %xmm2, %xmm1
1053; SSE2-NEXT:    paddb %xmm0, %xmm1
1054; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
1055; SSE2-NEXT:    paddb %xmm1, %xmm0
1056; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1057; SSE2-NEXT:    paddb %xmm0, %xmm1
1058; SSE2-NEXT:    movdqa %xmm1, %xmm0
1059; SSE2-NEXT:    psrld $16, %xmm0
1060; SSE2-NEXT:    paddb %xmm1, %xmm0
1061; SSE2-NEXT:    movdqa %xmm0, %xmm1
1062; SSE2-NEXT:    psrlw $8, %xmm1
1063; SSE2-NEXT:    paddb %xmm0, %xmm1
1064; SSE2-NEXT:    movd %xmm1, %eax
1065; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1066; SSE2-NEXT:    retq
1067;
1068; SSE41-LABEL: test_v64i8:
1069; SSE41:       # %bb.0:
1070; SSE41-NEXT:    paddb %xmm3, %xmm1
1071; SSE41-NEXT:    paddb %xmm2, %xmm1
1072; SSE41-NEXT:    paddb %xmm0, %xmm1
1073; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
1074; SSE41-NEXT:    paddb %xmm1, %xmm0
1075; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1076; SSE41-NEXT:    paddb %xmm0, %xmm1
1077; SSE41-NEXT:    movdqa %xmm1, %xmm0
1078; SSE41-NEXT:    psrld $16, %xmm0
1079; SSE41-NEXT:    paddb %xmm1, %xmm0
1080; SSE41-NEXT:    movdqa %xmm0, %xmm1
1081; SSE41-NEXT:    psrlw $8, %xmm1
1082; SSE41-NEXT:    paddb %xmm0, %xmm1
1083; SSE41-NEXT:    pextrb $0, %xmm1, %eax
1084; SSE41-NEXT:    # kill: def $al killed $al killed $eax
1085; SSE41-NEXT:    retq
1086;
1087; AVX1-LABEL: test_v64i8:
1088; AVX1:       # %bb.0:
1089; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
1090; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1091; AVX1-NEXT:    vpaddb %xmm2, %xmm3, %xmm2
1092; AVX1-NEXT:    vpaddb %xmm2, %xmm1, %xmm1
1093; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
1094; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1095; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
1096; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1097; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
1098; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
1099; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
1100; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
1101; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
1102; AVX1-NEXT:    vpextrb $0, %xmm0, %eax
1103; AVX1-NEXT:    # kill: def $al killed $al killed $eax
1104; AVX1-NEXT:    vzeroupper
1105; AVX1-NEXT:    retq
1106;
1107; AVX2-LABEL: test_v64i8:
1108; AVX2:       # %bb.0:
1109; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
1110; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1111; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
1112; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1113; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
1114; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1115; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
1116; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
1117; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
1118; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
1119; AVX2-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
1120; AVX2-NEXT:    vpextrb $0, %xmm0, %eax
1121; AVX2-NEXT:    # kill: def $al killed $al killed $eax
1122; AVX2-NEXT:    vzeroupper
1123; AVX2-NEXT:    retq
1124;
1125; AVX512-LABEL: test_v64i8:
1126; AVX512:       # %bb.0:
1127; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1128; AVX512-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
1129; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1130; AVX512-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
1131; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1132; AVX512-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
1133; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1134; AVX512-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
1135; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
1136; AVX512-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
1137; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
1138; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
1139; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
1140; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1141; AVX512-NEXT:    vzeroupper
1142; AVX512-NEXT:    retq
1143  %1 = call i8 @llvm.experimental.vector.reduce.add.i8.v64i8(<64 x i8> %a0)
1144  ret i8 %1
1145}
1146
1147define i8 @test_v128i8(<128 x i8> %a0) {
1148; SSE2-LABEL: test_v128i8:
1149; SSE2:       # %bb.0:
1150; SSE2-NEXT:    paddb %xmm6, %xmm2
1151; SSE2-NEXT:    paddb %xmm7, %xmm3
1152; SSE2-NEXT:    paddb %xmm5, %xmm3
1153; SSE2-NEXT:    paddb %xmm1, %xmm3
1154; SSE2-NEXT:    paddb %xmm4, %xmm2
1155; SSE2-NEXT:    paddb %xmm3, %xmm2
1156; SSE2-NEXT:    paddb %xmm0, %xmm2
1157; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
1158; SSE2-NEXT:    paddb %xmm2, %xmm0
1159; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1160; SSE2-NEXT:    paddb %xmm0, %xmm1
1161; SSE2-NEXT:    movdqa %xmm1, %xmm0
1162; SSE2-NEXT:    psrld $16, %xmm0
1163; SSE2-NEXT:    paddb %xmm1, %xmm0
1164; SSE2-NEXT:    movdqa %xmm0, %xmm1
1165; SSE2-NEXT:    psrlw $8, %xmm1
1166; SSE2-NEXT:    paddb %xmm0, %xmm1
1167; SSE2-NEXT:    movd %xmm1, %eax
1168; SSE2-NEXT:    # kill: def $al killed $al killed $eax
1169; SSE2-NEXT:    retq
1170;
1171; SSE41-LABEL: test_v128i8:
1172; SSE41:       # %bb.0:
1173; SSE41-NEXT:    paddb %xmm6, %xmm2
1174; SSE41-NEXT:    paddb %xmm7, %xmm3
1175; SSE41-NEXT:    paddb %xmm5, %xmm3
1176; SSE41-NEXT:    paddb %xmm1, %xmm3
1177; SSE41-NEXT:    paddb %xmm4, %xmm2
1178; SSE41-NEXT:    paddb %xmm3, %xmm2
1179; SSE41-NEXT:    paddb %xmm0, %xmm2
1180; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
1181; SSE41-NEXT:    paddb %xmm2, %xmm0
1182; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1183; SSE41-NEXT:    paddb %xmm0, %xmm1
1184; SSE41-NEXT:    movdqa %xmm1, %xmm0
1185; SSE41-NEXT:    psrld $16, %xmm0
1186; SSE41-NEXT:    paddb %xmm1, %xmm0
1187; SSE41-NEXT:    movdqa %xmm0, %xmm1
1188; SSE41-NEXT:    psrlw $8, %xmm1
1189; SSE41-NEXT:    paddb %xmm0, %xmm1
1190; SSE41-NEXT:    pextrb $0, %xmm1, %eax
1191; SSE41-NEXT:    # kill: def $al killed $al killed $eax
1192; SSE41-NEXT:    retq
1193;
1194; AVX1-LABEL: test_v128i8:
1195; AVX1:       # %bb.0:
1196; AVX1-NEXT:    vpaddb %xmm3, %xmm1, %xmm4
1197; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm3
1198; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
1199; AVX1-NEXT:    vpaddb %xmm3, %xmm1, %xmm1
1200; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
1201; AVX1-NEXT:    vpaddb %xmm1, %xmm3, %xmm1
1202; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
1203; AVX1-NEXT:    vpaddb %xmm1, %xmm3, %xmm1
1204; AVX1-NEXT:    vpaddb %xmm4, %xmm2, %xmm2
1205; AVX1-NEXT:    vpaddb %xmm1, %xmm2, %xmm1
1206; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
1207; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1208; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
1209; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1210; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
1211; AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
1212; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
1213; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
1214; AVX1-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
1215; AVX1-NEXT:    vpextrb $0, %xmm0, %eax
1216; AVX1-NEXT:    # kill: def $al killed $al killed $eax
1217; AVX1-NEXT:    vzeroupper
1218; AVX1-NEXT:    retq
1219;
1220; AVX2-LABEL: test_v128i8:
1221; AVX2:       # %bb.0:
1222; AVX2-NEXT:    vpaddb %ymm3, %ymm1, %ymm1
1223; AVX2-NEXT:    vpaddb %ymm1, %ymm2, %ymm1
1224; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
1225; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
1226; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
1227; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1228; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
1229; AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1230; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
1231; AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
1232; AVX2-NEXT:    vpaddb %ymm1, %ymm0, %ymm0
1233; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
1234; AVX2-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
1235; AVX2-NEXT:    vpextrb $0, %xmm0, %eax
1236; AVX2-NEXT:    # kill: def $al killed $al killed $eax
1237; AVX2-NEXT:    vzeroupper
1238; AVX2-NEXT:    retq
1239;
1240; AVX512-LABEL: test_v128i8:
1241; AVX512:       # %bb.0:
1242; AVX512-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
1243; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
1244; AVX512-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
1245; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
1246; AVX512-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
1247; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
1248; AVX512-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
1249; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
1250; AVX512-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
1251; AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
1252; AVX512-NEXT:    vpaddb %zmm1, %zmm0, %zmm0
1253; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
1254; AVX512-NEXT:    vpaddb %xmm1, %xmm0, %xmm0
1255; AVX512-NEXT:    vpextrb $0, %xmm0, %eax
1256; AVX512-NEXT:    # kill: def $al killed $al killed $eax
1257; AVX512-NEXT:    vzeroupper
1258; AVX512-NEXT:    retq
1259  %1 = call i8 @llvm.experimental.vector.reduce.add.i8.v128i8(<128 x i8> %a0)
1260  ret i8 %1
1261}
1262
1263declare i64 @llvm.experimental.vector.reduce.add.i64.v2i64(<2 x i64>)
1264declare i64 @llvm.experimental.vector.reduce.add.i64.v4i64(<4 x i64>)
1265declare i64 @llvm.experimental.vector.reduce.add.i64.v8i64(<8 x i64>)
1266declare i64 @llvm.experimental.vector.reduce.add.i64.v16i64(<16 x i64>)
1267
1268declare i32 @llvm.experimental.vector.reduce.add.i32.v2i32(<2 x i32>)
1269declare i32 @llvm.experimental.vector.reduce.add.i32.v4i32(<4 x i32>)
1270declare i32 @llvm.experimental.vector.reduce.add.i32.v8i32(<8 x i32>)
1271declare i32 @llvm.experimental.vector.reduce.add.i32.v16i32(<16 x i32>)
1272declare i32 @llvm.experimental.vector.reduce.add.i32.v32i32(<32 x i32>)
1273
1274declare i16 @llvm.experimental.vector.reduce.add.i16.v2i16(<2 x i16>)
1275declare i16 @llvm.experimental.vector.reduce.add.i16.v4i16(<4 x i16>)
1276declare i16 @llvm.experimental.vector.reduce.add.i16.v8i16(<8 x i16>)
1277declare i16 @llvm.experimental.vector.reduce.add.i16.v16i16(<16 x i16>)
1278declare i16 @llvm.experimental.vector.reduce.add.i16.v32i16(<32 x i16>)
1279declare i16 @llvm.experimental.vector.reduce.add.i16.v64i16(<64 x i16>)
1280
1281declare i8 @llvm.experimental.vector.reduce.add.i8.v2i8(<2 x i8>)
1282declare i8 @llvm.experimental.vector.reduce.add.i8.v4i8(<4 x i8>)
1283declare i8 @llvm.experimental.vector.reduce.add.i8.v8i8(<8 x i8>)
1284declare i8 @llvm.experimental.vector.reduce.add.i8.v16i8(<16 x i8>)
1285declare i8 @llvm.experimental.vector.reduce.add.i8.v32i8(<32 x i8>)
1286declare i8 @llvm.experimental.vector.reduce.add.i8.v64i8(<64 x i8>)
1287declare i8 @llvm.experimental.vector.reduce.add.i8.v128i8(<128 x i8>)
1288