xref: /llvm-project/llvm/test/CodeGen/X86/avgceilu.ll (revision ea2ee5dc2f14a17ff4486b41c9475c0b261412a4)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2
3; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE4
4; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1
5; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2
6; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v4 | FileCheck %s --check-prefixes=AVX,AVX512
7
8;
9; 128-bit vectors
10;
11
12define <16 x i8> @test_fixed_v16i8(<16 x i8> %a0, <16 x i8> %a1) nounwind {
13; SSE-LABEL: test_fixed_v16i8:
14; SSE:       # %bb.0:
15; SSE-NEXT:    pavgb %xmm1, %xmm0
16; SSE-NEXT:    retq
17;
18; AVX-LABEL: test_fixed_v16i8:
19; AVX:       # %bb.0:
20; AVX-NEXT:    vpavgb %xmm1, %xmm0, %xmm0
21; AVX-NEXT:    retq
22  %or = or <16 x i8> %a0, %a1
23  %xor = xor <16 x i8> %a0, %a1
24  %shift = lshr <16 x i8> %xor, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
25  %res = sub <16 x i8> %or, %shift
26  ret <16 x i8> %res
27}
28
29define <16 x i8> @test_ext_v16i8(<16 x i8> %a0, <16 x i8> %a1) nounwind {
30; SSE-LABEL: test_ext_v16i8:
31; SSE:       # %bb.0:
32; SSE-NEXT:    pavgb %xmm1, %xmm0
33; SSE-NEXT:    retq
34;
35; AVX-LABEL: test_ext_v16i8:
36; AVX:       # %bb.0:
37; AVX-NEXT:    vpavgb %xmm1, %xmm0, %xmm0
38; AVX-NEXT:    retq
39  %x0 = zext <16 x i8> %a0 to <16 x i16>
40  %x1 = zext <16 x i8> %a1 to <16 x i16>
41  %sum = add <16 x i16> %x0, %x1
42  %inc = add <16 x i16> %sum, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
43  %shift = lshr <16 x i16> %inc, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
44  %res = trunc <16 x i16> %shift to <16 x i8>
45  ret <16 x i8> %res
46}
47
48define <8 x i16> @test_fixed_v8i16(<8 x i16> %a0, <8 x i16> %a1) nounwind {
49; SSE-LABEL: test_fixed_v8i16:
50; SSE:       # %bb.0:
51; SSE-NEXT:    pavgw %xmm1, %xmm0
52; SSE-NEXT:    retq
53;
54; AVX-LABEL: test_fixed_v8i16:
55; AVX:       # %bb.0:
56; AVX-NEXT:    vpavgw %xmm1, %xmm0, %xmm0
57; AVX-NEXT:    retq
58  %or = or <8 x i16> %a0, %a1
59  %xor = xor <8 x i16> %a1, %a0
60  %shift = lshr <8 x i16> %xor, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
61  %res = sub <8 x i16> %or, %shift
62  ret <8 x i16> %res
63}
64
65define <8 x i16> @test_ext_v8i16(<8 x i16> %a0, <8 x i16> %a1) nounwind {
66; SSE-LABEL: test_ext_v8i16:
67; SSE:       # %bb.0:
68; SSE-NEXT:    pavgw %xmm1, %xmm0
69; SSE-NEXT:    retq
70;
71; AVX-LABEL: test_ext_v8i16:
72; AVX:       # %bb.0:
73; AVX-NEXT:    vpavgw %xmm1, %xmm0, %xmm0
74; AVX-NEXT:    retq
75  %x0 = zext <8 x i16> %a0 to <8 x i32>
76  %x1 = zext <8 x i16> %a1 to <8 x i32>
77  %sum = add <8 x i32> %x0, %x1
78  %inc = add <8 x i32> %sum, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
79  %shift = lshr <8 x i32> %inc, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
80  %res = trunc <8 x i32> %shift to <8 x i16>
81  ret <8 x i16> %res
82}
83
84define <4 x i32> @test_fixed_v4i32(<4 x i32> %a0, <4 x i32> %a1) nounwind {
85; SSE-LABEL: test_fixed_v4i32:
86; SSE:       # %bb.0:
87; SSE-NEXT:    movdqa %xmm0, %xmm2
88; SSE-NEXT:    por %xmm1, %xmm2
89; SSE-NEXT:    pxor %xmm1, %xmm0
90; SSE-NEXT:    psrld $1, %xmm0
91; SSE-NEXT:    psubd %xmm0, %xmm2
92; SSE-NEXT:    movdqa %xmm2, %xmm0
93; SSE-NEXT:    retq
94;
95; AVX-LABEL: test_fixed_v4i32:
96; AVX:       # %bb.0:
97; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm2
98; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
99; AVX-NEXT:    vpsrld $1, %xmm0, %xmm0
100; AVX-NEXT:    vpsubd %xmm0, %xmm2, %xmm0
101; AVX-NEXT:    retq
102  %or = or <4 x i32> %a0, %a1
103  %xor = xor <4 x i32> %a1, %a0
104  %shift = lshr <4 x i32> %xor, <i32 1, i32 1, i32 1, i32 1>
105  %res = sub <4 x i32> %or, %shift
106  ret <4 x i32> %res
107}
108
109define <4 x i32> @test_ext_v4i32(<4 x i32> %a0, <4 x i32> %a1) nounwind {
110; SSE-LABEL: test_ext_v4i32:
111; SSE:       # %bb.0:
112; SSE-NEXT:    movdqa %xmm0, %xmm2
113; SSE-NEXT:    por %xmm1, %xmm2
114; SSE-NEXT:    pxor %xmm1, %xmm0
115; SSE-NEXT:    psrld $1, %xmm0
116; SSE-NEXT:    psubd %xmm0, %xmm2
117; SSE-NEXT:    movdqa %xmm2, %xmm0
118; SSE-NEXT:    retq
119;
120; AVX-LABEL: test_ext_v4i32:
121; AVX:       # %bb.0:
122; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm2
123; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
124; AVX-NEXT:    vpsrld $1, %xmm0, %xmm0
125; AVX-NEXT:    vpsubd %xmm0, %xmm2, %xmm0
126; AVX-NEXT:    retq
127  %x0 = zext <4 x i32> %a0 to <4 x i64>
128  %x1 = zext <4 x i32> %a1 to <4 x i64>
129  %sum = add <4 x i64> %x0, %x1
130  %inc = add <4 x i64> %sum, <i64 1, i64 1, i64 1, i64 1>
131  %shift = lshr <4 x i64> %inc, <i64 1, i64 1, i64 1, i64 1>
132  %res = trunc <4 x i64> %shift to <4 x i32>
133  ret <4 x i32> %res
134}
135
136define <2 x i64> @test_fixed_v2i64(<2 x i64> %a0, <2 x i64> %a1) nounwind {
137; SSE-LABEL: test_fixed_v2i64:
138; SSE:       # %bb.0:
139; SSE-NEXT:    movdqa %xmm0, %xmm2
140; SSE-NEXT:    por %xmm1, %xmm2
141; SSE-NEXT:    pxor %xmm1, %xmm0
142; SSE-NEXT:    psrlq $1, %xmm0
143; SSE-NEXT:    psubq %xmm0, %xmm2
144; SSE-NEXT:    movdqa %xmm2, %xmm0
145; SSE-NEXT:    retq
146;
147; AVX-LABEL: test_fixed_v2i64:
148; AVX:       # %bb.0:
149; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm2
150; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
151; AVX-NEXT:    vpsrlq $1, %xmm0, %xmm0
152; AVX-NEXT:    vpsubq %xmm0, %xmm2, %xmm0
153; AVX-NEXT:    retq
154  %or = or <2 x i64> %a0, %a1
155  %xor = xor <2 x i64> %a1, %a0
156  %shift = lshr <2 x i64> %xor, <i64 1, i64 1>
157  %res = sub <2 x i64> %or, %shift
158  ret <2 x i64> %res
159}
160
161define <2 x i64> @test_ext_v2i64(<2 x i64> %a0, <2 x i64> %a1) nounwind {
162; SSE-LABEL: test_ext_v2i64:
163; SSE:       # %bb.0:
164; SSE-NEXT:    movdqa %xmm0, %xmm2
165; SSE-NEXT:    por %xmm1, %xmm2
166; SSE-NEXT:    pxor %xmm1, %xmm0
167; SSE-NEXT:    psrlq $1, %xmm0
168; SSE-NEXT:    psubq %xmm0, %xmm2
169; SSE-NEXT:    movdqa %xmm2, %xmm0
170; SSE-NEXT:    retq
171;
172; AVX-LABEL: test_ext_v2i64:
173; AVX:       # %bb.0:
174; AVX-NEXT:    vpor %xmm1, %xmm0, %xmm2
175; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
176; AVX-NEXT:    vpsrlq $1, %xmm0, %xmm0
177; AVX-NEXT:    vpsubq %xmm0, %xmm2, %xmm0
178; AVX-NEXT:    retq
179  %x0 = zext <2 x i64> %a0 to <2 x i128>
180  %x1 = zext <2 x i64> %a1 to <2 x i128>
181  %sum = add <2 x i128> %x0, %x1
182  %inc = add <2 x i128> %sum, <i128 1, i128 1>
183  %shift = lshr <2 x i128> %inc, <i128 1, i128 1>
184  %res = trunc <2 x i128> %shift to <2 x i64>
185  ret <2 x i64> %res
186}
187
188;
189; 256-bit vectors
190;
191
192define <32 x i8> @test_fixed_v32i8(<32 x i8> %a0, <32 x i8> %a1) nounwind {
193; SSE-LABEL: test_fixed_v32i8:
194; SSE:       # %bb.0:
195; SSE-NEXT:    pavgb %xmm2, %xmm0
196; SSE-NEXT:    pavgb %xmm3, %xmm1
197; SSE-NEXT:    retq
198;
199; AVX1-LABEL: test_fixed_v32i8:
200; AVX1:       # %bb.0:
201; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
202; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
203; AVX1-NEXT:    vpavgb %xmm2, %xmm3, %xmm2
204; AVX1-NEXT:    vpavgb %xmm1, %xmm0, %xmm0
205; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
206; AVX1-NEXT:    retq
207;
208; AVX2-LABEL: test_fixed_v32i8:
209; AVX2:       # %bb.0:
210; AVX2-NEXT:    vpavgb %ymm1, %ymm0, %ymm0
211; AVX2-NEXT:    retq
212;
213; AVX512-LABEL: test_fixed_v32i8:
214; AVX512:       # %bb.0:
215; AVX512-NEXT:    vpavgb %ymm1, %ymm0, %ymm0
216; AVX512-NEXT:    retq
217  %or = or <32 x i8> %a0, %a1
218  %xor = xor <32 x i8> %a0, %a1
219  %shift = lshr <32 x i8> %xor, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
220  %res = sub <32 x i8> %or, %shift
221  ret <32 x i8> %res
222}
223
224define <32 x i8> @test_ext_v32i8(<32 x i8> %a0, <32 x i8> %a1) nounwind {
225; SSE-LABEL: test_ext_v32i8:
226; SSE:       # %bb.0:
227; SSE-NEXT:    pavgb %xmm2, %xmm0
228; SSE-NEXT:    pavgb %xmm3, %xmm1
229; SSE-NEXT:    retq
230;
231; AVX1-LABEL: test_ext_v32i8:
232; AVX1:       # %bb.0:
233; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
234; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
235; AVX1-NEXT:    vpavgb %xmm2, %xmm3, %xmm2
236; AVX1-NEXT:    vpavgb %xmm1, %xmm0, %xmm0
237; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
238; AVX1-NEXT:    retq
239;
240; AVX2-LABEL: test_ext_v32i8:
241; AVX2:       # %bb.0:
242; AVX2-NEXT:    vpavgb %ymm1, %ymm0, %ymm0
243; AVX2-NEXT:    retq
244;
245; AVX512-LABEL: test_ext_v32i8:
246; AVX512:       # %bb.0:
247; AVX512-NEXT:    vpavgb %ymm1, %ymm0, %ymm0
248; AVX512-NEXT:    retq
249  %x0 = zext <32 x i8> %a0 to <32 x i16>
250  %x1 = zext <32 x i8> %a1 to <32 x i16>
251  %sum = add <32 x i16> %x0, %x1
252  %inc = add <32 x i16> %sum, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
253  %shift = lshr <32 x i16> %inc, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
254  %res = trunc <32 x i16> %shift to <32 x i8>
255  ret <32 x i8> %res
256}
257
258define <16 x i16> @test_fixed_v16i16(<16 x i16> %a0, <16 x i16> %a1) nounwind {
259; SSE-LABEL: test_fixed_v16i16:
260; SSE:       # %bb.0:
261; SSE-NEXT:    pavgw %xmm2, %xmm0
262; SSE-NEXT:    pavgw %xmm3, %xmm1
263; SSE-NEXT:    retq
264;
265; AVX1-LABEL: test_fixed_v16i16:
266; AVX1:       # %bb.0:
267; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
268; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
269; AVX1-NEXT:    vpavgw %xmm2, %xmm3, %xmm2
270; AVX1-NEXT:    vpavgw %xmm1, %xmm0, %xmm0
271; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
272; AVX1-NEXT:    retq
273;
274; AVX2-LABEL: test_fixed_v16i16:
275; AVX2:       # %bb.0:
276; AVX2-NEXT:    vpavgw %ymm1, %ymm0, %ymm0
277; AVX2-NEXT:    retq
278;
279; AVX512-LABEL: test_fixed_v16i16:
280; AVX512:       # %bb.0:
281; AVX512-NEXT:    vpavgw %ymm1, %ymm0, %ymm0
282; AVX512-NEXT:    retq
283  %or = or <16 x i16> %a0, %a1
284  %xor = xor <16 x i16> %a1, %a0
285  %shift = lshr <16 x i16> %xor, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
286  %res = sub <16 x i16> %or, %shift
287  ret <16 x i16> %res
288}
289
290define <16 x i16> @test_ext_v16i16(<16 x i16> %a0, <16 x i16> %a1) nounwind {
291; SSE-LABEL: test_ext_v16i16:
292; SSE:       # %bb.0:
293; SSE-NEXT:    pavgw %xmm2, %xmm0
294; SSE-NEXT:    pavgw %xmm3, %xmm1
295; SSE-NEXT:    retq
296;
297; AVX1-LABEL: test_ext_v16i16:
298; AVX1:       # %bb.0:
299; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
300; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
301; AVX1-NEXT:    vpavgw %xmm2, %xmm3, %xmm2
302; AVX1-NEXT:    vpavgw %xmm1, %xmm0, %xmm0
303; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
304; AVX1-NEXT:    retq
305;
306; AVX2-LABEL: test_ext_v16i16:
307; AVX2:       # %bb.0:
308; AVX2-NEXT:    vpavgw %ymm1, %ymm0, %ymm0
309; AVX2-NEXT:    retq
310;
311; AVX512-LABEL: test_ext_v16i16:
312; AVX512:       # %bb.0:
313; AVX512-NEXT:    vpavgw %ymm1, %ymm0, %ymm0
314; AVX512-NEXT:    retq
315  %x0 = zext <16 x i16> %a0 to <16 x i32>
316  %x1 = zext <16 x i16> %a1 to <16 x i32>
317  %sum = add <16 x i32> %x0, %x1
318  %inc = add <16 x i32> %sum, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
319  %shift = lshr <16 x i32> %inc, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
320  %res = trunc <16 x i32> %shift to <16 x i16>
321  ret <16 x i16> %res
322}
323
324define <8 x i32> @test_fixed_v8i32(<8 x i32> %a0, <8 x i32> %a1) nounwind {
325; SSE-LABEL: test_fixed_v8i32:
326; SSE:       # %bb.0:
327; SSE-NEXT:    movdqa %xmm0, %xmm4
328; SSE-NEXT:    por %xmm2, %xmm4
329; SSE-NEXT:    pxor %xmm2, %xmm0
330; SSE-NEXT:    psrld $1, %xmm0
331; SSE-NEXT:    psubd %xmm0, %xmm4
332; SSE-NEXT:    movdqa %xmm1, %xmm2
333; SSE-NEXT:    por %xmm3, %xmm2
334; SSE-NEXT:    pxor %xmm3, %xmm1
335; SSE-NEXT:    psrld $1, %xmm1
336; SSE-NEXT:    psubd %xmm1, %xmm2
337; SSE-NEXT:    movdqa %xmm4, %xmm0
338; SSE-NEXT:    movdqa %xmm2, %xmm1
339; SSE-NEXT:    retq
340;
341; AVX1-LABEL: test_fixed_v8i32:
342; AVX1:       # %bb.0:
343; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm2
344; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
345; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
346; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
347; AVX1-NEXT:    vpsrld $1, %xmm1, %xmm1
348; AVX1-NEXT:    vpsubd %xmm1, %xmm3, %xmm1
349; AVX1-NEXT:    vpsrld $1, %xmm0, %xmm0
350; AVX1-NEXT:    vpsubd %xmm0, %xmm2, %xmm0
351; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
352; AVX1-NEXT:    retq
353;
354; AVX2-LABEL: test_fixed_v8i32:
355; AVX2:       # %bb.0:
356; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm2
357; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
358; AVX2-NEXT:    vpsrld $1, %ymm0, %ymm0
359; AVX2-NEXT:    vpsubd %ymm0, %ymm2, %ymm0
360; AVX2-NEXT:    retq
361;
362; AVX512-LABEL: test_fixed_v8i32:
363; AVX512:       # %bb.0:
364; AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm2
365; AVX512-NEXT:    vpxor %ymm1, %ymm0, %ymm0
366; AVX512-NEXT:    vpsrld $1, %ymm0, %ymm0
367; AVX512-NEXT:    vpsubd %ymm0, %ymm2, %ymm0
368; AVX512-NEXT:    retq
369  %or = or <8 x i32> %a0, %a1
370  %xor = xor <8 x i32> %a1, %a0
371  %shift = lshr <8 x i32> %xor, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
372  %res = sub <8 x i32> %or, %shift
373  ret <8 x i32> %res
374}
375
376define <8 x i32> @test_ext_v8i32(<8 x i32> %a0, <8 x i32> %a1) nounwind {
377; SSE-LABEL: test_ext_v8i32:
378; SSE:       # %bb.0:
379; SSE-NEXT:    movdqa %xmm0, %xmm4
380; SSE-NEXT:    por %xmm2, %xmm4
381; SSE-NEXT:    pxor %xmm2, %xmm0
382; SSE-NEXT:    psrld $1, %xmm0
383; SSE-NEXT:    psubd %xmm0, %xmm4
384; SSE-NEXT:    movdqa %xmm1, %xmm2
385; SSE-NEXT:    por %xmm3, %xmm2
386; SSE-NEXT:    pxor %xmm3, %xmm1
387; SSE-NEXT:    psrld $1, %xmm1
388; SSE-NEXT:    psubd %xmm1, %xmm2
389; SSE-NEXT:    movdqa %xmm4, %xmm0
390; SSE-NEXT:    movdqa %xmm2, %xmm1
391; SSE-NEXT:    retq
392;
393; AVX1-LABEL: test_ext_v8i32:
394; AVX1:       # %bb.0:
395; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm2
396; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
397; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
398; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
399; AVX1-NEXT:    vpsrld $1, %xmm1, %xmm1
400; AVX1-NEXT:    vpsubd %xmm1, %xmm3, %xmm1
401; AVX1-NEXT:    vpsrld $1, %xmm0, %xmm0
402; AVX1-NEXT:    vpsubd %xmm0, %xmm2, %xmm0
403; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
404; AVX1-NEXT:    retq
405;
406; AVX2-LABEL: test_ext_v8i32:
407; AVX2:       # %bb.0:
408; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm2
409; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
410; AVX2-NEXT:    vpsrld $1, %ymm0, %ymm0
411; AVX2-NEXT:    vpsubd %ymm0, %ymm2, %ymm0
412; AVX2-NEXT:    retq
413;
414; AVX512-LABEL: test_ext_v8i32:
415; AVX512:       # %bb.0:
416; AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm2
417; AVX512-NEXT:    vpxor %ymm1, %ymm0, %ymm0
418; AVX512-NEXT:    vpsrld $1, %ymm0, %ymm0
419; AVX512-NEXT:    vpsubd %ymm0, %ymm2, %ymm0
420; AVX512-NEXT:    retq
421  %x0 = zext <8 x i32> %a0 to <8 x i64>
422  %x1 = zext <8 x i32> %a1 to <8 x i64>
423  %sum = add <8 x i64> %x0, %x1
424  %inc = add <8 x i64> %sum, <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1>
425  %shift = lshr <8 x i64> %inc, <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1>
426  %res = trunc <8 x i64> %shift to <8 x i32>
427  ret <8 x i32> %res
428}
429
430define <4 x i64> @test_fixed_v4i64(<4 x i64> %a0, <4 x i64> %a1) nounwind {
431; SSE-LABEL: test_fixed_v4i64:
432; SSE:       # %bb.0:
433; SSE-NEXT:    movdqa %xmm0, %xmm4
434; SSE-NEXT:    por %xmm2, %xmm4
435; SSE-NEXT:    pxor %xmm2, %xmm0
436; SSE-NEXT:    psrlq $1, %xmm0
437; SSE-NEXT:    psubq %xmm0, %xmm4
438; SSE-NEXT:    movdqa %xmm1, %xmm2
439; SSE-NEXT:    por %xmm3, %xmm2
440; SSE-NEXT:    pxor %xmm3, %xmm1
441; SSE-NEXT:    psrlq $1, %xmm1
442; SSE-NEXT:    psubq %xmm1, %xmm2
443; SSE-NEXT:    movdqa %xmm4, %xmm0
444; SSE-NEXT:    movdqa %xmm2, %xmm1
445; SSE-NEXT:    retq
446;
447; AVX1-LABEL: test_fixed_v4i64:
448; AVX1:       # %bb.0:
449; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm2
450; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
451; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
452; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
453; AVX1-NEXT:    vpsrlq $1, %xmm1, %xmm1
454; AVX1-NEXT:    vpsubq %xmm1, %xmm3, %xmm1
455; AVX1-NEXT:    vpsrlq $1, %xmm0, %xmm0
456; AVX1-NEXT:    vpsubq %xmm0, %xmm2, %xmm0
457; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
458; AVX1-NEXT:    retq
459;
460; AVX2-LABEL: test_fixed_v4i64:
461; AVX2:       # %bb.0:
462; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm2
463; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
464; AVX2-NEXT:    vpsrlq $1, %ymm0, %ymm0
465; AVX2-NEXT:    vpsubq %ymm0, %ymm2, %ymm0
466; AVX2-NEXT:    retq
467;
468; AVX512-LABEL: test_fixed_v4i64:
469; AVX512:       # %bb.0:
470; AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm2
471; AVX512-NEXT:    vpxor %ymm1, %ymm0, %ymm0
472; AVX512-NEXT:    vpsrlq $1, %ymm0, %ymm0
473; AVX512-NEXT:    vpsubq %ymm0, %ymm2, %ymm0
474; AVX512-NEXT:    retq
475  %or = or <4 x i64> %a0, %a1
476  %xor = xor <4 x i64> %a1, %a0
477  %shift = lshr <4 x i64> %xor, <i64 1, i64 1, i64 1, i64 1>
478  %res = sub <4 x i64> %or, %shift
479  ret <4 x i64> %res
480}
481
482define <4 x i64> @test_ext_v4i64(<4 x i64> %a0, <4 x i64> %a1) nounwind {
483; SSE-LABEL: test_ext_v4i64:
484; SSE:       # %bb.0:
485; SSE-NEXT:    movdqa %xmm0, %xmm4
486; SSE-NEXT:    por %xmm2, %xmm4
487; SSE-NEXT:    pxor %xmm2, %xmm0
488; SSE-NEXT:    psrlq $1, %xmm0
489; SSE-NEXT:    psubq %xmm0, %xmm4
490; SSE-NEXT:    movdqa %xmm1, %xmm2
491; SSE-NEXT:    por %xmm3, %xmm2
492; SSE-NEXT:    pxor %xmm3, %xmm1
493; SSE-NEXT:    psrlq $1, %xmm1
494; SSE-NEXT:    psubq %xmm1, %xmm2
495; SSE-NEXT:    movdqa %xmm4, %xmm0
496; SSE-NEXT:    movdqa %xmm2, %xmm1
497; SSE-NEXT:    retq
498;
499; AVX1-LABEL: test_ext_v4i64:
500; AVX1:       # %bb.0:
501; AVX1-NEXT:    vorps %ymm1, %ymm0, %ymm2
502; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
503; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
504; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
505; AVX1-NEXT:    vpsrlq $1, %xmm1, %xmm1
506; AVX1-NEXT:    vpsubq %xmm1, %xmm3, %xmm1
507; AVX1-NEXT:    vpsrlq $1, %xmm0, %xmm0
508; AVX1-NEXT:    vpsubq %xmm0, %xmm2, %xmm0
509; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
510; AVX1-NEXT:    retq
511;
512; AVX2-LABEL: test_ext_v4i64:
513; AVX2:       # %bb.0:
514; AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm2
515; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
516; AVX2-NEXT:    vpsrlq $1, %ymm0, %ymm0
517; AVX2-NEXT:    vpsubq %ymm0, %ymm2, %ymm0
518; AVX2-NEXT:    retq
519;
520; AVX512-LABEL: test_ext_v4i64:
521; AVX512:       # %bb.0:
522; AVX512-NEXT:    vpor %ymm1, %ymm0, %ymm2
523; AVX512-NEXT:    vpxor %ymm1, %ymm0, %ymm0
524; AVX512-NEXT:    vpsrlq $1, %ymm0, %ymm0
525; AVX512-NEXT:    vpsubq %ymm0, %ymm2, %ymm0
526; AVX512-NEXT:    retq
527  %x0 = zext <4 x i64> %a0 to <4 x i128>
528  %x1 = zext <4 x i64> %a1 to <4 x i128>
529  %sum = add <4 x i128> %x0, %x1
530  %inc = add <4 x i128> %sum, <i128 1, i128 1, i128 1, i128 1>
531  %shift = lshr <4 x i128> %inc, <i128 1, i128 1, i128 1, i128 1>
532  %res = trunc <4 x i128> %shift to <4 x i64>
533  ret <4 x i64> %res
534}
535
536;
537; 512-bit vectors
538;
539
540define <64 x i8> @test_fixed_v64i8(<64 x i8> %a0, <64 x i8> %a1) nounwind {
541; SSE-LABEL: test_fixed_v64i8:
542; SSE:       # %bb.0:
543; SSE-NEXT:    pavgb %xmm4, %xmm0
544; SSE-NEXT:    pavgb %xmm5, %xmm1
545; SSE-NEXT:    pavgb %xmm6, %xmm2
546; SSE-NEXT:    pavgb %xmm7, %xmm3
547; SSE-NEXT:    retq
548;
549; AVX1-LABEL: test_fixed_v64i8:
550; AVX1:       # %bb.0:
551; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
552; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
553; AVX1-NEXT:    vpavgb %xmm4, %xmm5, %xmm4
554; AVX1-NEXT:    vpavgb %xmm2, %xmm0, %xmm0
555; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
556; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
557; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
558; AVX1-NEXT:    vpavgb %xmm2, %xmm4, %xmm2
559; AVX1-NEXT:    vpavgb %xmm3, %xmm1, %xmm1
560; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
561; AVX1-NEXT:    retq
562;
563; AVX2-LABEL: test_fixed_v64i8:
564; AVX2:       # %bb.0:
565; AVX2-NEXT:    vpavgb %ymm2, %ymm0, %ymm0
566; AVX2-NEXT:    vpavgb %ymm3, %ymm1, %ymm1
567; AVX2-NEXT:    retq
568;
569; AVX512-LABEL: test_fixed_v64i8:
570; AVX512:       # %bb.0:
571; AVX512-NEXT:    vpavgb %zmm1, %zmm0, %zmm0
572; AVX512-NEXT:    retq
573  %or = or <64 x i8> %a0, %a1
574  %xor = xor <64 x i8> %a0, %a1
575  %shift = lshr <64 x i8> %xor, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1>
576  %res = sub <64 x i8> %or, %shift
577  ret <64 x i8> %res
578}
579
580define <64 x i8> @test_ext_v64i8(<64 x i8> %a0, <64 x i8> %a1) nounwind {
581; SSE-LABEL: test_ext_v64i8:
582; SSE:       # %bb.0:
583; SSE-NEXT:    pavgb %xmm4, %xmm0
584; SSE-NEXT:    pavgb %xmm5, %xmm1
585; SSE-NEXT:    pavgb %xmm6, %xmm2
586; SSE-NEXT:    pavgb %xmm7, %xmm3
587; SSE-NEXT:    retq
588;
589; AVX1-LABEL: test_ext_v64i8:
590; AVX1:       # %bb.0:
591; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
592; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
593; AVX1-NEXT:    vpavgb %xmm4, %xmm5, %xmm4
594; AVX1-NEXT:    vpavgb %xmm2, %xmm0, %xmm0
595; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
596; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
597; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
598; AVX1-NEXT:    vpavgb %xmm2, %xmm4, %xmm2
599; AVX1-NEXT:    vpavgb %xmm3, %xmm1, %xmm1
600; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
601; AVX1-NEXT:    retq
602;
603; AVX2-LABEL: test_ext_v64i8:
604; AVX2:       # %bb.0:
605; AVX2-NEXT:    vpavgb %ymm2, %ymm0, %ymm0
606; AVX2-NEXT:    vpavgb %ymm3, %ymm1, %ymm1
607; AVX2-NEXT:    retq
608;
609; AVX512-LABEL: test_ext_v64i8:
610; AVX512:       # %bb.0:
611; AVX512-NEXT:    vpavgb %zmm1, %zmm0, %zmm0
612; AVX512-NEXT:    retq
613  %x0 = zext <64 x i8> %a0 to <64 x i16>
614  %x1 = zext <64 x i8> %a1 to <64 x i16>
615  %sum = add <64 x i16> %x0, %x1
616  %inc = add <64 x i16> %sum, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
617  %shift = lshr <64 x i16> %inc, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
618  %res = trunc <64 x i16> %shift to <64 x i8>
619  ret <64 x i8> %res
620}
621
622define <32 x i16> @test_fixed_v32i16(<32 x i16> %a0, <32 x i16> %a1) nounwind {
623; SSE-LABEL: test_fixed_v32i16:
624; SSE:       # %bb.0:
625; SSE-NEXT:    pavgw %xmm4, %xmm0
626; SSE-NEXT:    pavgw %xmm5, %xmm1
627; SSE-NEXT:    pavgw %xmm6, %xmm2
628; SSE-NEXT:    pavgw %xmm7, %xmm3
629; SSE-NEXT:    retq
630;
631; AVX1-LABEL: test_fixed_v32i16:
632; AVX1:       # %bb.0:
633; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
634; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
635; AVX1-NEXT:    vpavgw %xmm4, %xmm5, %xmm4
636; AVX1-NEXT:    vpavgw %xmm2, %xmm0, %xmm0
637; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
638; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
639; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
640; AVX1-NEXT:    vpavgw %xmm2, %xmm4, %xmm2
641; AVX1-NEXT:    vpavgw %xmm3, %xmm1, %xmm1
642; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
643; AVX1-NEXT:    retq
644;
645; AVX2-LABEL: test_fixed_v32i16:
646; AVX2:       # %bb.0:
647; AVX2-NEXT:    vpavgw %ymm2, %ymm0, %ymm0
648; AVX2-NEXT:    vpavgw %ymm3, %ymm1, %ymm1
649; AVX2-NEXT:    retq
650;
651; AVX512-LABEL: test_fixed_v32i16:
652; AVX512:       # %bb.0:
653; AVX512-NEXT:    vpavgw %zmm1, %zmm0, %zmm0
654; AVX512-NEXT:    retq
655  %or = or <32 x i16> %a0, %a1
656  %xor = xor <32 x i16> %a1, %a0
657  %shift = lshr <32 x i16> %xor, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
658  %res = sub <32 x i16> %or, %shift
659  ret <32 x i16> %res
660}
661
662define <32 x i16> @test_ext_v32i16(<32 x i16> %a0, <32 x i16> %a1) nounwind {
663; SSE-LABEL: test_ext_v32i16:
664; SSE:       # %bb.0:
665; SSE-NEXT:    pavgw %xmm4, %xmm0
666; SSE-NEXT:    pavgw %xmm5, %xmm1
667; SSE-NEXT:    pavgw %xmm6, %xmm2
668; SSE-NEXT:    pavgw %xmm7, %xmm3
669; SSE-NEXT:    retq
670;
671; AVX1-LABEL: test_ext_v32i16:
672; AVX1:       # %bb.0:
673; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
674; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
675; AVX1-NEXT:    vpavgw %xmm4, %xmm5, %xmm4
676; AVX1-NEXT:    vpavgw %xmm2, %xmm0, %xmm0
677; AVX1-NEXT:    vinsertf128 $1, %xmm4, %ymm0, %ymm0
678; AVX1-NEXT:    vextractf128 $1, %ymm3, %xmm2
679; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
680; AVX1-NEXT:    vpavgw %xmm2, %xmm4, %xmm2
681; AVX1-NEXT:    vpavgw %xmm3, %xmm1, %xmm1
682; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
683; AVX1-NEXT:    retq
684;
685; AVX2-LABEL: test_ext_v32i16:
686; AVX2:       # %bb.0:
687; AVX2-NEXT:    vpavgw %ymm2, %ymm0, %ymm0
688; AVX2-NEXT:    vpavgw %ymm3, %ymm1, %ymm1
689; AVX2-NEXT:    retq
690;
691; AVX512-LABEL: test_ext_v32i16:
692; AVX512:       # %bb.0:
693; AVX512-NEXT:    vpavgw %zmm1, %zmm0, %zmm0
694; AVX512-NEXT:    retq
695  %x0 = zext <32 x i16> %a0 to <32 x i32>
696  %x1 = zext <32 x i16> %a1 to <32 x i32>
697  %sum = add <32 x i32> %x0, %x1
698  %inc = add <32 x i32> %sum, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
699  %shift = lshr <32 x i32> %inc, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
700  %res = trunc <32 x i32> %shift to <32 x i16>
701  ret <32 x i16> %res
702}
703
704define <16 x i32> @test_fixed_v16i32(<16 x i32> %a0, <16 x i32> %a1) nounwind {
705; SSE-LABEL: test_fixed_v16i32:
706; SSE:       # %bb.0:
707; SSE-NEXT:    movdqa %xmm0, %xmm8
708; SSE-NEXT:    por %xmm4, %xmm8
709; SSE-NEXT:    pxor %xmm4, %xmm0
710; SSE-NEXT:    psrld $1, %xmm0
711; SSE-NEXT:    psubd %xmm0, %xmm8
712; SSE-NEXT:    movdqa %xmm1, %xmm4
713; SSE-NEXT:    por %xmm5, %xmm4
714; SSE-NEXT:    pxor %xmm5, %xmm1
715; SSE-NEXT:    psrld $1, %xmm1
716; SSE-NEXT:    psubd %xmm1, %xmm4
717; SSE-NEXT:    movdqa %xmm2, %xmm5
718; SSE-NEXT:    por %xmm6, %xmm5
719; SSE-NEXT:    pxor %xmm6, %xmm2
720; SSE-NEXT:    psrld $1, %xmm2
721; SSE-NEXT:    psubd %xmm2, %xmm5
722; SSE-NEXT:    movdqa %xmm3, %xmm6
723; SSE-NEXT:    por %xmm7, %xmm6
724; SSE-NEXT:    pxor %xmm7, %xmm3
725; SSE-NEXT:    psrld $1, %xmm3
726; SSE-NEXT:    psubd %xmm3, %xmm6
727; SSE-NEXT:    movdqa %xmm8, %xmm0
728; SSE-NEXT:    movdqa %xmm4, %xmm1
729; SSE-NEXT:    movdqa %xmm5, %xmm2
730; SSE-NEXT:    movdqa %xmm6, %xmm3
731; SSE-NEXT:    retq
732;
733; AVX1-LABEL: test_fixed_v16i32:
734; AVX1:       # %bb.0:
735; AVX1-NEXT:    vorps %ymm2, %ymm0, %ymm4
736; AVX1-NEXT:    vextractf128 $1, %ymm4, %xmm5
737; AVX1-NEXT:    vxorps %ymm2, %ymm0, %ymm0
738; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
739; AVX1-NEXT:    vpsrld $1, %xmm2, %xmm2
740; AVX1-NEXT:    vpsubd %xmm2, %xmm5, %xmm2
741; AVX1-NEXT:    vpsrld $1, %xmm0, %xmm0
742; AVX1-NEXT:    vpsubd %xmm0, %xmm4, %xmm0
743; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
744; AVX1-NEXT:    vorps %ymm3, %ymm1, %ymm2
745; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
746; AVX1-NEXT:    vxorps %ymm3, %ymm1, %ymm1
747; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
748; AVX1-NEXT:    vpsrld $1, %xmm3, %xmm3
749; AVX1-NEXT:    vpsubd %xmm3, %xmm4, %xmm3
750; AVX1-NEXT:    vpsrld $1, %xmm1, %xmm1
751; AVX1-NEXT:    vpsubd %xmm1, %xmm2, %xmm1
752; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
753; AVX1-NEXT:    retq
754;
755; AVX2-LABEL: test_fixed_v16i32:
756; AVX2:       # %bb.0:
757; AVX2-NEXT:    vpor %ymm2, %ymm0, %ymm4
758; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
759; AVX2-NEXT:    vpsrld $1, %ymm0, %ymm0
760; AVX2-NEXT:    vpsubd %ymm0, %ymm4, %ymm0
761; AVX2-NEXT:    vpor %ymm3, %ymm1, %ymm2
762; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm1
763; AVX2-NEXT:    vpsrld $1, %ymm1, %ymm1
764; AVX2-NEXT:    vpsubd %ymm1, %ymm2, %ymm1
765; AVX2-NEXT:    retq
766;
767; AVX512-LABEL: test_fixed_v16i32:
768; AVX512:       # %bb.0:
769; AVX512-NEXT:    vpord %zmm1, %zmm0, %zmm2
770; AVX512-NEXT:    vpxord %zmm1, %zmm0, %zmm0
771; AVX512-NEXT:    vpsrld $1, %zmm0, %zmm0
772; AVX512-NEXT:    vpsubd %zmm0, %zmm2, %zmm0
773; AVX512-NEXT:    retq
774  %or = or <16 x i32> %a0, %a1
775  %xor = xor <16 x i32> %a1, %a0
776  %shift = lshr <16 x i32> %xor, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
777  %res = sub <16 x i32> %or, %shift
778  ret <16 x i32> %res
779}
780
781define <16 x i32> @test_ext_v16i32(<16 x i32> %a0, <16 x i32> %a1) nounwind {
782; SSE-LABEL: test_ext_v16i32:
783; SSE:       # %bb.0:
784; SSE-NEXT:    movdqa %xmm0, %xmm8
785; SSE-NEXT:    por %xmm4, %xmm8
786; SSE-NEXT:    pxor %xmm4, %xmm0
787; SSE-NEXT:    psrld $1, %xmm0
788; SSE-NEXT:    psubd %xmm0, %xmm8
789; SSE-NEXT:    movdqa %xmm1, %xmm4
790; SSE-NEXT:    por %xmm5, %xmm4
791; SSE-NEXT:    pxor %xmm5, %xmm1
792; SSE-NEXT:    psrld $1, %xmm1
793; SSE-NEXT:    psubd %xmm1, %xmm4
794; SSE-NEXT:    movdqa %xmm2, %xmm5
795; SSE-NEXT:    por %xmm6, %xmm5
796; SSE-NEXT:    pxor %xmm6, %xmm2
797; SSE-NEXT:    psrld $1, %xmm2
798; SSE-NEXT:    psubd %xmm2, %xmm5
799; SSE-NEXT:    movdqa %xmm3, %xmm6
800; SSE-NEXT:    por %xmm7, %xmm6
801; SSE-NEXT:    pxor %xmm7, %xmm3
802; SSE-NEXT:    psrld $1, %xmm3
803; SSE-NEXT:    psubd %xmm3, %xmm6
804; SSE-NEXT:    movdqa %xmm8, %xmm0
805; SSE-NEXT:    movdqa %xmm4, %xmm1
806; SSE-NEXT:    movdqa %xmm5, %xmm2
807; SSE-NEXT:    movdqa %xmm6, %xmm3
808; SSE-NEXT:    retq
809;
810; AVX1-LABEL: test_ext_v16i32:
811; AVX1:       # %bb.0:
812; AVX1-NEXT:    vorps %ymm2, %ymm0, %ymm4
813; AVX1-NEXT:    vextractf128 $1, %ymm4, %xmm5
814; AVX1-NEXT:    vxorps %ymm2, %ymm0, %ymm0
815; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
816; AVX1-NEXT:    vpsrld $1, %xmm2, %xmm2
817; AVX1-NEXT:    vpsubd %xmm2, %xmm5, %xmm2
818; AVX1-NEXT:    vpsrld $1, %xmm0, %xmm0
819; AVX1-NEXT:    vpsubd %xmm0, %xmm4, %xmm0
820; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
821; AVX1-NEXT:    vorps %ymm3, %ymm1, %ymm2
822; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
823; AVX1-NEXT:    vxorps %ymm3, %ymm1, %ymm1
824; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
825; AVX1-NEXT:    vpsrld $1, %xmm3, %xmm3
826; AVX1-NEXT:    vpsubd %xmm3, %xmm4, %xmm3
827; AVX1-NEXT:    vpsrld $1, %xmm1, %xmm1
828; AVX1-NEXT:    vpsubd %xmm1, %xmm2, %xmm1
829; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
830; AVX1-NEXT:    retq
831;
832; AVX2-LABEL: test_ext_v16i32:
833; AVX2:       # %bb.0:
834; AVX2-NEXT:    vpor %ymm2, %ymm0, %ymm4
835; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
836; AVX2-NEXT:    vpsrld $1, %ymm0, %ymm0
837; AVX2-NEXT:    vpsubd %ymm0, %ymm4, %ymm0
838; AVX2-NEXT:    vpor %ymm3, %ymm1, %ymm2
839; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm1
840; AVX2-NEXT:    vpsrld $1, %ymm1, %ymm1
841; AVX2-NEXT:    vpsubd %ymm1, %ymm2, %ymm1
842; AVX2-NEXT:    retq
843;
844; AVX512-LABEL: test_ext_v16i32:
845; AVX512:       # %bb.0:
846; AVX512-NEXT:    vpord %zmm1, %zmm0, %zmm2
847; AVX512-NEXT:    vpxord %zmm1, %zmm0, %zmm0
848; AVX512-NEXT:    vpsrld $1, %zmm0, %zmm0
849; AVX512-NEXT:    vpsubd %zmm0, %zmm2, %zmm0
850; AVX512-NEXT:    retq
851  %x0 = zext <16 x i32> %a0 to <16 x i64>
852  %x1 = zext <16 x i32> %a1 to <16 x i64>
853  %sum = add <16 x i64> %x0, %x1
854  %inc = add <16 x i64> %sum, <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1>
855  %shift = lshr <16 x i64> %inc, <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1>
856  %res = trunc <16 x i64> %shift to <16 x i32>
857  ret <16 x i32> %res
858}
859
860define <8 x i64> @test_fixed_v8i64(<8 x i64> %a0, <8 x i64> %a1) nounwind {
861; SSE-LABEL: test_fixed_v8i64:
862; SSE:       # %bb.0:
863; SSE-NEXT:    movdqa %xmm0, %xmm8
864; SSE-NEXT:    por %xmm4, %xmm8
865; SSE-NEXT:    pxor %xmm4, %xmm0
866; SSE-NEXT:    psrlq $1, %xmm0
867; SSE-NEXT:    psubq %xmm0, %xmm8
868; SSE-NEXT:    movdqa %xmm1, %xmm4
869; SSE-NEXT:    por %xmm5, %xmm4
870; SSE-NEXT:    pxor %xmm5, %xmm1
871; SSE-NEXT:    psrlq $1, %xmm1
872; SSE-NEXT:    psubq %xmm1, %xmm4
873; SSE-NEXT:    movdqa %xmm2, %xmm5
874; SSE-NEXT:    por %xmm6, %xmm5
875; SSE-NEXT:    pxor %xmm6, %xmm2
876; SSE-NEXT:    psrlq $1, %xmm2
877; SSE-NEXT:    psubq %xmm2, %xmm5
878; SSE-NEXT:    movdqa %xmm3, %xmm6
879; SSE-NEXT:    por %xmm7, %xmm6
880; SSE-NEXT:    pxor %xmm7, %xmm3
881; SSE-NEXT:    psrlq $1, %xmm3
882; SSE-NEXT:    psubq %xmm3, %xmm6
883; SSE-NEXT:    movdqa %xmm8, %xmm0
884; SSE-NEXT:    movdqa %xmm4, %xmm1
885; SSE-NEXT:    movdqa %xmm5, %xmm2
886; SSE-NEXT:    movdqa %xmm6, %xmm3
887; SSE-NEXT:    retq
888;
889; AVX1-LABEL: test_fixed_v8i64:
890; AVX1:       # %bb.0:
891; AVX1-NEXT:    vorps %ymm2, %ymm0, %ymm4
892; AVX1-NEXT:    vextractf128 $1, %ymm4, %xmm5
893; AVX1-NEXT:    vxorps %ymm2, %ymm0, %ymm0
894; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
895; AVX1-NEXT:    vpsrlq $1, %xmm2, %xmm2
896; AVX1-NEXT:    vpsubq %xmm2, %xmm5, %xmm2
897; AVX1-NEXT:    vpsrlq $1, %xmm0, %xmm0
898; AVX1-NEXT:    vpsubq %xmm0, %xmm4, %xmm0
899; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
900; AVX1-NEXT:    vorps %ymm3, %ymm1, %ymm2
901; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
902; AVX1-NEXT:    vxorps %ymm3, %ymm1, %ymm1
903; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
904; AVX1-NEXT:    vpsrlq $1, %xmm3, %xmm3
905; AVX1-NEXT:    vpsubq %xmm3, %xmm4, %xmm3
906; AVX1-NEXT:    vpsrlq $1, %xmm1, %xmm1
907; AVX1-NEXT:    vpsubq %xmm1, %xmm2, %xmm1
908; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
909; AVX1-NEXT:    retq
910;
911; AVX2-LABEL: test_fixed_v8i64:
912; AVX2:       # %bb.0:
913; AVX2-NEXT:    vpor %ymm2, %ymm0, %ymm4
914; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
915; AVX2-NEXT:    vpsrlq $1, %ymm0, %ymm0
916; AVX2-NEXT:    vpsubq %ymm0, %ymm4, %ymm0
917; AVX2-NEXT:    vpor %ymm3, %ymm1, %ymm2
918; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm1
919; AVX2-NEXT:    vpsrlq $1, %ymm1, %ymm1
920; AVX2-NEXT:    vpsubq %ymm1, %ymm2, %ymm1
921; AVX2-NEXT:    retq
922;
923; AVX512-LABEL: test_fixed_v8i64:
924; AVX512:       # %bb.0:
925; AVX512-NEXT:    vporq %zmm1, %zmm0, %zmm2
926; AVX512-NEXT:    vpxorq %zmm1, %zmm0, %zmm0
927; AVX512-NEXT:    vpsrlq $1, %zmm0, %zmm0
928; AVX512-NEXT:    vpsubq %zmm0, %zmm2, %zmm0
929; AVX512-NEXT:    retq
930  %or = or <8 x i64> %a0, %a1
931  %xor = xor <8 x i64> %a1, %a0
932  %shift = lshr <8 x i64> %xor, <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1>
933  %res = sub <8 x i64> %or, %shift
934  ret <8 x i64> %res
935}
936
937define <8 x i64> @test_ext_v8i64(<8 x i64> %a0, <8 x i64> %a1) nounwind {
938; SSE-LABEL: test_ext_v8i64:
939; SSE:       # %bb.0:
940; SSE-NEXT:    movdqa %xmm0, %xmm8
941; SSE-NEXT:    por %xmm4, %xmm8
942; SSE-NEXT:    pxor %xmm4, %xmm0
943; SSE-NEXT:    psrlq $1, %xmm0
944; SSE-NEXT:    psubq %xmm0, %xmm8
945; SSE-NEXT:    movdqa %xmm1, %xmm4
946; SSE-NEXT:    por %xmm5, %xmm4
947; SSE-NEXT:    pxor %xmm5, %xmm1
948; SSE-NEXT:    psrlq $1, %xmm1
949; SSE-NEXT:    psubq %xmm1, %xmm4
950; SSE-NEXT:    movdqa %xmm2, %xmm5
951; SSE-NEXT:    por %xmm6, %xmm5
952; SSE-NEXT:    pxor %xmm6, %xmm2
953; SSE-NEXT:    psrlq $1, %xmm2
954; SSE-NEXT:    psubq %xmm2, %xmm5
955; SSE-NEXT:    movdqa %xmm3, %xmm6
956; SSE-NEXT:    por %xmm7, %xmm6
957; SSE-NEXT:    pxor %xmm7, %xmm3
958; SSE-NEXT:    psrlq $1, %xmm3
959; SSE-NEXT:    psubq %xmm3, %xmm6
960; SSE-NEXT:    movdqa %xmm8, %xmm0
961; SSE-NEXT:    movdqa %xmm4, %xmm1
962; SSE-NEXT:    movdqa %xmm5, %xmm2
963; SSE-NEXT:    movdqa %xmm6, %xmm3
964; SSE-NEXT:    retq
965;
966; AVX1-LABEL: test_ext_v8i64:
967; AVX1:       # %bb.0:
968; AVX1-NEXT:    vorps %ymm2, %ymm0, %ymm4
969; AVX1-NEXT:    vextractf128 $1, %ymm4, %xmm5
970; AVX1-NEXT:    vxorps %ymm2, %ymm0, %ymm0
971; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
972; AVX1-NEXT:    vpsrlq $1, %xmm2, %xmm2
973; AVX1-NEXT:    vpsubq %xmm2, %xmm5, %xmm2
974; AVX1-NEXT:    vpsrlq $1, %xmm0, %xmm0
975; AVX1-NEXT:    vpsubq %xmm0, %xmm4, %xmm0
976; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
977; AVX1-NEXT:    vorps %ymm3, %ymm1, %ymm2
978; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
979; AVX1-NEXT:    vxorps %ymm3, %ymm1, %ymm1
980; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
981; AVX1-NEXT:    vpsrlq $1, %xmm3, %xmm3
982; AVX1-NEXT:    vpsubq %xmm3, %xmm4, %xmm3
983; AVX1-NEXT:    vpsrlq $1, %xmm1, %xmm1
984; AVX1-NEXT:    vpsubq %xmm1, %xmm2, %xmm1
985; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
986; AVX1-NEXT:    retq
987;
988; AVX2-LABEL: test_ext_v8i64:
989; AVX2:       # %bb.0:
990; AVX2-NEXT:    vpor %ymm2, %ymm0, %ymm4
991; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
992; AVX2-NEXT:    vpsrlq $1, %ymm0, %ymm0
993; AVX2-NEXT:    vpsubq %ymm0, %ymm4, %ymm0
994; AVX2-NEXT:    vpor %ymm3, %ymm1, %ymm2
995; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm1
996; AVX2-NEXT:    vpsrlq $1, %ymm1, %ymm1
997; AVX2-NEXT:    vpsubq %ymm1, %ymm2, %ymm1
998; AVX2-NEXT:    retq
999;
1000; AVX512-LABEL: test_ext_v8i64:
1001; AVX512:       # %bb.0:
1002; AVX512-NEXT:    vporq %zmm1, %zmm0, %zmm2
1003; AVX512-NEXT:    vpxorq %zmm1, %zmm0, %zmm0
1004; AVX512-NEXT:    vpsrlq $1, %zmm0, %zmm0
1005; AVX512-NEXT:    vpsubq %zmm0, %zmm2, %zmm0
1006; AVX512-NEXT:    retq
1007  %x0 = zext <8 x i64> %a0 to <8 x i128>
1008  %x1 = zext <8 x i64> %a1 to <8 x i128>
1009  %sum = add <8 x i128> %x0, %x1
1010  %inc = add <8 x i128> %sum, <i128 1, i128 1, i128 1, i128 1, i128 1, i128 1, i128 1, i128 1>
1011  %shift = lshr <8 x i128> %inc, <i128 1, i128 1, i128 1, i128 1, i128 1, i128 1, i128 1, i128 1>
1012  %res = trunc <8 x i128> %shift to <8 x i64>
1013  ret <8 x i64> %res
1014}
1015
1016;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
1017; SSE2: {{.*}}
1018; SSE4: {{.*}}
1019