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