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
12 define <16 x i8> @test_fixed_v16i8(<16 x i8> %a0, <16 x i8> %a1) nounwind {
13 ; SSE-LABEL: test_fixed_v16i8:
15 ; SSE-NEXT: pavgb %xmm1, %xmm0
18 ; AVX-LABEL: test_fixed_v16i8:
20 ; AVX-NEXT: vpavgb %xmm1, %xmm0, %xmm0
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
29 define <16 x i8> @test_ext_v16i8(<16 x i8> %a0, <16 x i8> %a1) nounwind {
30 ; SSE-LABEL: test_ext_v16i8:
32 ; SSE-NEXT: pavgb %xmm1, %xmm0
35 ; AVX-LABEL: test_ext_v16i8:
37 ; AVX-NEXT: vpavgb %xmm1, %xmm0, %xmm0
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>
48 define <8 x i16> @test_fixed_v8i16(<8 x i16> %a0, <8 x i16> %a1) nounwind {
49 ; SSE-LABEL: test_fixed_v8i16:
51 ; SSE-NEXT: pavgw %xmm1, %xmm0
54 ; AVX-LABEL: test_fixed_v8i16:
56 ; AVX-NEXT: vpavgw %xmm1, %xmm0, %xmm0
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
65 define <8 x i16> @test_ext_v8i16(<8 x i16> %a0, <8 x i16> %a1) nounwind {
66 ; SSE-LABEL: test_ext_v8i16:
68 ; SSE-NEXT: pavgw %xmm1, %xmm0
71 ; AVX-LABEL: test_ext_v8i16:
73 ; AVX-NEXT: vpavgw %xmm1, %xmm0, %xmm0
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>
84 define <4 x i32> @test_fixed_v4i32(<4 x i32> %a0, <4 x i32> %a1) nounwind {
85 ; SSE-LABEL: test_fixed_v4i32:
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
95 ; AVX-LABEL: test_fixed_v4i32:
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
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
109 define <4 x i32> @test_ext_v4i32(<4 x i32> %a0, <4 x i32> %a1) nounwind {
110 ; SSE-LABEL: test_ext_v4i32:
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
120 ; AVX-LABEL: test_ext_v4i32:
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
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>
136 define <2 x i64> @test_fixed_v2i64(<2 x i64> %a0, <2 x i64> %a1) nounwind {
137 ; SSE-LABEL: test_fixed_v2i64:
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
147 ; AVX-LABEL: test_fixed_v2i64:
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
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
161 define <2 x i64> @test_ext_v2i64(<2 x i64> %a0, <2 x i64> %a1) nounwind {
162 ; SSE-LABEL: test_ext_v2i64:
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
172 ; AVX-LABEL: test_ext_v2i64:
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
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>
192 define <32 x i8> @test_fixed_v32i8(<32 x i8> %a0, <32 x i8> %a1) nounwind {
193 ; SSE-LABEL: test_fixed_v32i8:
195 ; SSE-NEXT: pavgb %xmm2, %xmm0
196 ; SSE-NEXT: pavgb %xmm3, %xmm1
199 ; AVX1-LABEL: test_fixed_v32i8:
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
208 ; AVX2-LABEL: test_fixed_v32i8:
210 ; AVX2-NEXT: vpavgb %ymm1, %ymm0, %ymm0
213 ; AVX512-LABEL: test_fixed_v32i8:
215 ; AVX512-NEXT: vpavgb %ymm1, %ymm0, %ymm0
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
224 define <32 x i8> @test_ext_v32i8(<32 x i8> %a0, <32 x i8> %a1) nounwind {
225 ; SSE-LABEL: test_ext_v32i8:
227 ; SSE-NEXT: pavgb %xmm2, %xmm0
228 ; SSE-NEXT: pavgb %xmm3, %xmm1
231 ; AVX1-LABEL: test_ext_v32i8:
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
240 ; AVX2-LABEL: test_ext_v32i8:
242 ; AVX2-NEXT: vpavgb %ymm1, %ymm0, %ymm0
245 ; AVX512-LABEL: test_ext_v32i8:
247 ; AVX512-NEXT: vpavgb %ymm1, %ymm0, %ymm0
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>
258 define <16 x i16> @test_fixed_v16i16(<16 x i16> %a0, <16 x i16> %a1) nounwind {
259 ; SSE-LABEL: test_fixed_v16i16:
261 ; SSE-NEXT: pavgw %xmm2, %xmm0
262 ; SSE-NEXT: pavgw %xmm3, %xmm1
265 ; AVX1-LABEL: test_fixed_v16i16:
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
274 ; AVX2-LABEL: test_fixed_v16i16:
276 ; AVX2-NEXT: vpavgw %ymm1, %ymm0, %ymm0
279 ; AVX512-LABEL: test_fixed_v16i16:
281 ; AVX512-NEXT: vpavgw %ymm1, %ymm0, %ymm0
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
290 define <16 x i16> @test_ext_v16i16(<16 x i16> %a0, <16 x i16> %a1) nounwind {
291 ; SSE-LABEL: test_ext_v16i16:
293 ; SSE-NEXT: pavgw %xmm2, %xmm0
294 ; SSE-NEXT: pavgw %xmm3, %xmm1
297 ; AVX1-LABEL: test_ext_v16i16:
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
306 ; AVX2-LABEL: test_ext_v16i16:
308 ; AVX2-NEXT: vpavgw %ymm1, %ymm0, %ymm0
311 ; AVX512-LABEL: test_ext_v16i16:
313 ; AVX512-NEXT: vpavgw %ymm1, %ymm0, %ymm0
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>
324 define <8 x i32> @test_fixed_v8i32(<8 x i32> %a0, <8 x i32> %a1) nounwind {
325 ; SSE-LABEL: test_fixed_v8i32:
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
341 ; AVX1-LABEL: test_fixed_v8i32:
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
354 ; AVX2-LABEL: test_fixed_v8i32:
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
362 ; AVX512-LABEL: test_fixed_v8i32:
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
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
376 define <8 x i32> @test_ext_v8i32(<8 x i32> %a0, <8 x i32> %a1) nounwind {
377 ; SSE-LABEL: test_ext_v8i32:
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
393 ; AVX1-LABEL: test_ext_v8i32:
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
406 ; AVX2-LABEL: test_ext_v8i32:
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
414 ; AVX512-LABEL: test_ext_v8i32:
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
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>
430 define <4 x i64> @test_fixed_v4i64(<4 x i64> %a0, <4 x i64> %a1) nounwind {
431 ; SSE-LABEL: test_fixed_v4i64:
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
447 ; AVX1-LABEL: test_fixed_v4i64:
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
460 ; AVX2-LABEL: test_fixed_v4i64:
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
468 ; AVX512-LABEL: test_fixed_v4i64:
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
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
482 define <4 x i64> @test_ext_v4i64(<4 x i64> %a0, <4 x i64> %a1) nounwind {
483 ; SSE-LABEL: test_ext_v4i64:
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
499 ; AVX1-LABEL: test_ext_v4i64:
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
512 ; AVX2-LABEL: test_ext_v4i64:
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
520 ; AVX512-LABEL: test_ext_v4i64:
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
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>
540 define <64 x i8> @test_fixed_v64i8(<64 x i8> %a0, <64 x i8> %a1) nounwind {
541 ; SSE-LABEL: test_fixed_v64i8:
543 ; SSE-NEXT: pavgb %xmm4, %xmm0
544 ; SSE-NEXT: pavgb %xmm5, %xmm1
545 ; SSE-NEXT: pavgb %xmm6, %xmm2
546 ; SSE-NEXT: pavgb %xmm7, %xmm3
549 ; AVX1-LABEL: test_fixed_v64i8:
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
563 ; AVX2-LABEL: test_fixed_v64i8:
565 ; AVX2-NEXT: vpavgb %ymm2, %ymm0, %ymm0
566 ; AVX2-NEXT: vpavgb %ymm3, %ymm1, %ymm1
569 ; AVX512-LABEL: test_fixed_v64i8:
571 ; AVX512-NEXT: vpavgb %zmm1, %zmm0, %zmm0
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
580 define <64 x i8> @test_ext_v64i8(<64 x i8> %a0, <64 x i8> %a1) nounwind {
581 ; SSE-LABEL: test_ext_v64i8:
583 ; SSE-NEXT: pavgb %xmm4, %xmm0
584 ; SSE-NEXT: pavgb %xmm5, %xmm1
585 ; SSE-NEXT: pavgb %xmm6, %xmm2
586 ; SSE-NEXT: pavgb %xmm7, %xmm3
589 ; AVX1-LABEL: test_ext_v64i8:
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
603 ; AVX2-LABEL: test_ext_v64i8:
605 ; AVX2-NEXT: vpavgb %ymm2, %ymm0, %ymm0
606 ; AVX2-NEXT: vpavgb %ymm3, %ymm1, %ymm1
609 ; AVX512-LABEL: test_ext_v64i8:
611 ; AVX512-NEXT: vpavgb %zmm1, %zmm0, %zmm0
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>
622 define <32 x i16> @test_fixed_v32i16(<32 x i16> %a0, <32 x i16> %a1) nounwind {
623 ; SSE-LABEL: test_fixed_v32i16:
625 ; SSE-NEXT: pavgw %xmm4, %xmm0
626 ; SSE-NEXT: pavgw %xmm5, %xmm1
627 ; SSE-NEXT: pavgw %xmm6, %xmm2
628 ; SSE-NEXT: pavgw %xmm7, %xmm3
631 ; AVX1-LABEL: test_fixed_v32i16:
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
645 ; AVX2-LABEL: test_fixed_v32i16:
647 ; AVX2-NEXT: vpavgw %ymm2, %ymm0, %ymm0
648 ; AVX2-NEXT: vpavgw %ymm3, %ymm1, %ymm1
651 ; AVX512-LABEL: test_fixed_v32i16:
653 ; AVX512-NEXT: vpavgw %zmm1, %zmm0, %zmm0
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
662 define <32 x i16> @test_ext_v32i16(<32 x i16> %a0, <32 x i16> %a1) nounwind {
663 ; SSE-LABEL: test_ext_v32i16:
665 ; SSE-NEXT: pavgw %xmm4, %xmm0
666 ; SSE-NEXT: pavgw %xmm5, %xmm1
667 ; SSE-NEXT: pavgw %xmm6, %xmm2
668 ; SSE-NEXT: pavgw %xmm7, %xmm3
671 ; AVX1-LABEL: test_ext_v32i16:
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
685 ; AVX2-LABEL: test_ext_v32i16:
687 ; AVX2-NEXT: vpavgw %ymm2, %ymm0, %ymm0
688 ; AVX2-NEXT: vpavgw %ymm3, %ymm1, %ymm1
691 ; AVX512-LABEL: test_ext_v32i16:
693 ; AVX512-NEXT: vpavgw %zmm1, %zmm0, %zmm0
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>
704 define <16 x i32> @test_fixed_v16i32(<16 x i32> %a0, <16 x i32> %a1) nounwind {
705 ; SSE-LABEL: test_fixed_v16i32:
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
733 ; AVX1-LABEL: test_fixed_v16i32:
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
755 ; AVX2-LABEL: test_fixed_v16i32:
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
767 ; AVX512-LABEL: test_fixed_v16i32:
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
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
781 define <16 x i32> @test_ext_v16i32(<16 x i32> %a0, <16 x i32> %a1) nounwind {
782 ; SSE-LABEL: test_ext_v16i32:
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
810 ; AVX1-LABEL: test_ext_v16i32:
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
832 ; AVX2-LABEL: test_ext_v16i32:
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
844 ; AVX512-LABEL: test_ext_v16i32:
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
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>
860 define <8 x i64> @test_fixed_v8i64(<8 x i64> %a0, <8 x i64> %a1) nounwind {
861 ; SSE-LABEL: test_fixed_v8i64:
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
889 ; AVX1-LABEL: test_fixed_v8i64:
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
911 ; AVX2-LABEL: test_fixed_v8i64:
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
923 ; AVX512-LABEL: test_fixed_v8i64:
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
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
937 define <8 x i64> @test_ext_v8i64(<8 x i64> %a0, <8 x i64> %a1) nounwind {
938 ; SSE-LABEL: test_ext_v8i64:
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
966 ; AVX1-LABEL: test_ext_v8i64:
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
988 ; AVX2-LABEL: test_ext_v8i64:
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
1000 ; AVX512-LABEL: test_ext_v8i64:
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
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>
1016 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: