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: movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
16 ; SSE-NEXT: pxor %xmm2, %xmm1
17 ; SSE-NEXT: pxor %xmm2, %xmm0
18 ; SSE-NEXT: pavgb %xmm1, %xmm0
19 ; SSE-NEXT: pxor %xmm2, %xmm0
22 ; AVX1-LABEL: test_fixed_v16i8:
24 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
25 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1
26 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
27 ; AVX1-NEXT: vpavgb %xmm1, %xmm0, %xmm0
28 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
31 ; AVX2-LABEL: test_fixed_v16i8:
33 ; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
34 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1
35 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
36 ; AVX2-NEXT: vpavgb %xmm1, %xmm0, %xmm0
37 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
40 ; AVX512-LABEL: test_fixed_v16i8:
42 ; AVX512-NEXT: vpbroadcastb {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
43 ; AVX512-NEXT: vpxor %xmm2, %xmm1, %xmm1
44 ; AVX512-NEXT: vpxor %xmm2, %xmm0, %xmm0
45 ; AVX512-NEXT: vpavgb %xmm1, %xmm0, %xmm0
46 ; AVX512-NEXT: vpxor %xmm2, %xmm0, %xmm0
48 %or = or <16 x i8> %a0, %a1
49 %xor = xor <16 x i8> %a0, %a1
50 %shift = ashr <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>
51 %res = sub <16 x i8> %or, %shift
55 define <16 x i8> @test_ext_v16i8(<16 x i8> %a0, <16 x i8> %a1) nounwind {
56 ; SSE-LABEL: test_ext_v16i8:
58 ; SSE-NEXT: movdqa {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
59 ; SSE-NEXT: pxor %xmm2, %xmm1
60 ; SSE-NEXT: pxor %xmm2, %xmm0
61 ; SSE-NEXT: pavgb %xmm1, %xmm0
62 ; SSE-NEXT: pxor %xmm2, %xmm0
65 ; AVX1-LABEL: test_ext_v16i8:
67 ; AVX1-NEXT: vbroadcastss {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
68 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1
69 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
70 ; AVX1-NEXT: vpavgb %xmm1, %xmm0, %xmm0
71 ; AVX1-NEXT: vpxor %xmm2, %xmm0, %xmm0
74 ; AVX2-LABEL: test_ext_v16i8:
76 ; AVX2-NEXT: vpbroadcastb {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
77 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1
78 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
79 ; AVX2-NEXT: vpavgb %xmm1, %xmm0, %xmm0
80 ; AVX2-NEXT: vpxor %xmm2, %xmm0, %xmm0
83 ; AVX512-LABEL: test_ext_v16i8:
85 ; AVX512-NEXT: vpbroadcastb {{.*#+}} xmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
86 ; AVX512-NEXT: vpxor %xmm2, %xmm1, %xmm1
87 ; AVX512-NEXT: vpxor %xmm2, %xmm0, %xmm0
88 ; AVX512-NEXT: vpavgb %xmm1, %xmm0, %xmm0
89 ; AVX512-NEXT: vpxor %xmm2, %xmm0, %xmm0
91 %x0 = sext <16 x i8> %a0 to <16 x i16>
92 %x1 = sext <16 x i8> %a1 to <16 x i16>
93 %sum = add <16 x i16> %x0, %x1
94 %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>
95 %shift = ashr <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>
96 %res = trunc <16 x i16> %shift to <16 x i8>
100 define <8 x i16> @test_fixed_v8i16(<8 x i16> %a0, <8 x i16> %a1) nounwind {
101 ; SSE-LABEL: test_fixed_v8i16:
103 ; SSE-NEXT: movdqa %xmm0, %xmm2
104 ; SSE-NEXT: por %xmm1, %xmm2
105 ; SSE-NEXT: pxor %xmm1, %xmm0
106 ; SSE-NEXT: psraw $1, %xmm0
107 ; SSE-NEXT: psubw %xmm0, %xmm2
108 ; SSE-NEXT: movdqa %xmm2, %xmm0
111 ; AVX-LABEL: test_fixed_v8i16:
113 ; AVX-NEXT: vpor %xmm1, %xmm0, %xmm2
114 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
115 ; AVX-NEXT: vpsraw $1, %xmm0, %xmm0
116 ; AVX-NEXT: vpsubw %xmm0, %xmm2, %xmm0
118 %or = or <8 x i16> %a0, %a1
119 %xor = xor <8 x i16> %a1, %a0
120 %shift = ashr <8 x i16> %xor, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
121 %res = sub <8 x i16> %or, %shift
125 define <8 x i16> @test_ext_v8i16(<8 x i16> %a0, <8 x i16> %a1) nounwind {
126 ; SSE-LABEL: test_ext_v8i16:
128 ; SSE-NEXT: movdqa %xmm0, %xmm2
129 ; SSE-NEXT: por %xmm1, %xmm2
130 ; SSE-NEXT: pxor %xmm1, %xmm0
131 ; SSE-NEXT: psraw $1, %xmm0
132 ; SSE-NEXT: psubw %xmm0, %xmm2
133 ; SSE-NEXT: movdqa %xmm2, %xmm0
136 ; AVX-LABEL: test_ext_v8i16:
138 ; AVX-NEXT: vpor %xmm1, %xmm0, %xmm2
139 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
140 ; AVX-NEXT: vpsraw $1, %xmm0, %xmm0
141 ; AVX-NEXT: vpsubw %xmm0, %xmm2, %xmm0
143 %x0 = sext <8 x i16> %a0 to <8 x i32>
144 %x1 = sext <8 x i16> %a1 to <8 x i32>
145 %sum = add <8 x i32> %x0, %x1
146 %inc = add <8 x i32> %sum, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
147 %shift = ashr <8 x i32> %inc, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
148 %res = trunc <8 x i32> %shift to <8 x i16>
152 define <4 x i32> @test_fixed_v4i32(<4 x i32> %a0, <4 x i32> %a1) nounwind {
153 ; SSE-LABEL: test_fixed_v4i32:
155 ; SSE-NEXT: movdqa %xmm0, %xmm2
156 ; SSE-NEXT: por %xmm1, %xmm2
157 ; SSE-NEXT: pxor %xmm1, %xmm0
158 ; SSE-NEXT: psrad $1, %xmm0
159 ; SSE-NEXT: psubd %xmm0, %xmm2
160 ; SSE-NEXT: movdqa %xmm2, %xmm0
163 ; AVX-LABEL: test_fixed_v4i32:
165 ; AVX-NEXT: vpor %xmm1, %xmm0, %xmm2
166 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
167 ; AVX-NEXT: vpsrad $1, %xmm0, %xmm0
168 ; AVX-NEXT: vpsubd %xmm0, %xmm2, %xmm0
170 %or = or <4 x i32> %a0, %a1
171 %xor = xor <4 x i32> %a1, %a0
172 %shift = ashr <4 x i32> %xor, <i32 1, i32 1, i32 1, i32 1>
173 %res = sub <4 x i32> %or, %shift
177 define <4 x i32> @test_ext_v4i32(<4 x i32> %a0, <4 x i32> %a1) nounwind {
178 ; SSE-LABEL: test_ext_v4i32:
180 ; SSE-NEXT: movdqa %xmm0, %xmm2
181 ; SSE-NEXT: por %xmm1, %xmm2
182 ; SSE-NEXT: pxor %xmm1, %xmm0
183 ; SSE-NEXT: psrad $1, %xmm0
184 ; SSE-NEXT: psubd %xmm0, %xmm2
185 ; SSE-NEXT: movdqa %xmm2, %xmm0
188 ; AVX-LABEL: test_ext_v4i32:
190 ; AVX-NEXT: vpor %xmm1, %xmm0, %xmm2
191 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
192 ; AVX-NEXT: vpsrad $1, %xmm0, %xmm0
193 ; AVX-NEXT: vpsubd %xmm0, %xmm2, %xmm0
195 %x0 = sext <4 x i32> %a0 to <4 x i64>
196 %x1 = sext <4 x i32> %a1 to <4 x i64>
197 %sum = add <4 x i64> %x0, %x1
198 %inc = add <4 x i64> %sum, <i64 1, i64 1, i64 1, i64 1>
199 %shift = ashr <4 x i64> %inc, <i64 1, i64 1, i64 1, i64 1>
200 %res = trunc <4 x i64> %shift to <4 x i32>
204 define <2 x i64> @test_fixed_v2i64(<2 x i64> %a0, <2 x i64> %a1) nounwind {
205 ; SSE2-LABEL: test_fixed_v2i64:
207 ; SSE2-NEXT: movdqa %xmm0, %xmm2
208 ; SSE2-NEXT: pxor %xmm1, %xmm2
209 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,3,2,3]
210 ; SSE2-NEXT: psrad $1, %xmm3
211 ; SSE2-NEXT: psrlq $1, %xmm2
212 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
213 ; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
214 ; SSE2-NEXT: por %xmm1, %xmm0
215 ; SSE2-NEXT: psubq %xmm2, %xmm0
218 ; SSE4-LABEL: test_fixed_v2i64:
220 ; SSE4-NEXT: movdqa %xmm0, %xmm2
221 ; SSE4-NEXT: pxor %xmm1, %xmm2
222 ; SSE4-NEXT: movdqa %xmm2, %xmm3
223 ; SSE4-NEXT: psrad $1, %xmm3
224 ; SSE4-NEXT: psrlq $1, %xmm2
225 ; SSE4-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]
226 ; SSE4-NEXT: por %xmm1, %xmm0
227 ; SSE4-NEXT: psubq %xmm2, %xmm0
230 ; AVX1-LABEL: test_fixed_v2i64:
232 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm2
233 ; AVX1-NEXT: vpsrad $1, %xmm2, %xmm3
234 ; AVX1-NEXT: vpsrlq $1, %xmm2, %xmm2
235 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]
236 ; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
237 ; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm0
240 ; AVX2-LABEL: test_fixed_v2i64:
242 ; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm2
243 ; AVX2-NEXT: vpsrad $1, %xmm2, %xmm3
244 ; AVX2-NEXT: vpsrlq $1, %xmm2, %xmm2
245 ; AVX2-NEXT: vpblendd {{.*#+}} xmm2 = xmm2[0],xmm3[1],xmm2[2],xmm3[3]
246 ; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
247 ; AVX2-NEXT: vpsubq %xmm2, %xmm0, %xmm0
250 ; AVX512-LABEL: test_fixed_v2i64:
252 ; AVX512-NEXT: vpor %xmm1, %xmm0, %xmm2
253 ; AVX512-NEXT: vpxor %xmm1, %xmm0, %xmm0
254 ; AVX512-NEXT: vpsraq $1, %xmm0, %xmm0
255 ; AVX512-NEXT: vpsubq %xmm0, %xmm2, %xmm0
257 %or = or <2 x i64> %a0, %a1
258 %xor = xor <2 x i64> %a1, %a0
259 %shift = ashr <2 x i64> %xor, <i64 1, i64 1>
260 %res = sub <2 x i64> %or, %shift
264 define <2 x i64> @test_ext_v2i64(<2 x i64> %a0, <2 x i64> %a1) nounwind {
265 ; SSE2-LABEL: test_ext_v2i64:
267 ; SSE2-NEXT: movdqa %xmm0, %xmm2
268 ; SSE2-NEXT: pxor %xmm1, %xmm2
269 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,3,2,3]
270 ; SSE2-NEXT: psrad $1, %xmm3
271 ; SSE2-NEXT: psrlq $1, %xmm2
272 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
273 ; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1]
274 ; SSE2-NEXT: por %xmm1, %xmm0
275 ; SSE2-NEXT: psubq %xmm2, %xmm0
278 ; SSE4-LABEL: test_ext_v2i64:
280 ; SSE4-NEXT: movdqa %xmm0, %xmm2
281 ; SSE4-NEXT: pxor %xmm1, %xmm2
282 ; SSE4-NEXT: movdqa %xmm2, %xmm3
283 ; SSE4-NEXT: psrad $1, %xmm3
284 ; SSE4-NEXT: psrlq $1, %xmm2
285 ; SSE4-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]
286 ; SSE4-NEXT: por %xmm1, %xmm0
287 ; SSE4-NEXT: psubq %xmm2, %xmm0
290 ; AVX1-LABEL: test_ext_v2i64:
292 ; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm2
293 ; AVX1-NEXT: vpsrad $1, %xmm2, %xmm3
294 ; AVX1-NEXT: vpsrlq $1, %xmm2, %xmm2
295 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]
296 ; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
297 ; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm0
300 ; AVX2-LABEL: test_ext_v2i64:
302 ; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm2
303 ; AVX2-NEXT: vpsrad $1, %xmm2, %xmm3
304 ; AVX2-NEXT: vpsrlq $1, %xmm2, %xmm2
305 ; AVX2-NEXT: vpblendd {{.*#+}} xmm2 = xmm2[0],xmm3[1],xmm2[2],xmm3[3]
306 ; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
307 ; AVX2-NEXT: vpsubq %xmm2, %xmm0, %xmm0
310 ; AVX512-LABEL: test_ext_v2i64:
312 ; AVX512-NEXT: vpor %xmm1, %xmm0, %xmm2
313 ; AVX512-NEXT: vpxor %xmm1, %xmm0, %xmm0
314 ; AVX512-NEXT: vpsraq $1, %xmm0, %xmm0
315 ; AVX512-NEXT: vpsubq %xmm0, %xmm2, %xmm0
317 %x0 = sext <2 x i64> %a0 to <2 x i128>
318 %x1 = sext <2 x i64> %a1 to <2 x i128>
319 %sum = add <2 x i128> %x0, %x1
320 %inc = add <2 x i128> %sum, <i128 1, i128 1>
321 %shift = ashr <2 x i128> %inc, <i128 1, i128 1>
322 %res = trunc <2 x i128> %shift to <2 x i64>
330 define <32 x i8> @test_fixed_v32i8(<32 x i8> %a0, <32 x i8> %a1) nounwind {
331 ; SSE-LABEL: test_fixed_v32i8:
333 ; SSE-NEXT: movdqa {{.*#+}} xmm4 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
334 ; SSE-NEXT: pxor %xmm4, %xmm2
335 ; SSE-NEXT: pxor %xmm4, %xmm0
336 ; SSE-NEXT: pavgb %xmm2, %xmm0
337 ; SSE-NEXT: pxor %xmm4, %xmm0
338 ; SSE-NEXT: pxor %xmm4, %xmm3
339 ; SSE-NEXT: pxor %xmm4, %xmm1
340 ; SSE-NEXT: pavgb %xmm3, %xmm1
341 ; SSE-NEXT: pxor %xmm4, %xmm1
344 ; AVX1-LABEL: test_fixed_v32i8:
346 ; AVX1-NEXT: vbroadcastss {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
347 ; AVX1-NEXT: vxorps %ymm2, %ymm1, %ymm1
348 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
349 ; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
350 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
351 ; AVX1-NEXT: vpavgb %xmm3, %xmm4, %xmm3
352 ; AVX1-NEXT: vpavgb %xmm1, %xmm0, %xmm0
353 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
354 ; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
357 ; AVX2-LABEL: test_fixed_v32i8:
359 ; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
360 ; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1
361 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
362 ; AVX2-NEXT: vpavgb %ymm1, %ymm0, %ymm0
363 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
366 ; AVX512-LABEL: test_fixed_v32i8:
368 ; AVX512-NEXT: vpbroadcastb {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
369 ; AVX512-NEXT: vpxor %ymm2, %ymm1, %ymm1
370 ; AVX512-NEXT: vpxor %ymm2, %ymm0, %ymm0
371 ; AVX512-NEXT: vpavgb %ymm1, %ymm0, %ymm0
372 ; AVX512-NEXT: vpxor %ymm2, %ymm0, %ymm0
374 %or = or <32 x i8> %a0, %a1
375 %xor = xor <32 x i8> %a0, %a1
376 %shift = ashr <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>
377 %res = sub <32 x i8> %or, %shift
381 define <32 x i8> @test_ext_v32i8(<32 x i8> %a0, <32 x i8> %a1) nounwind {
382 ; SSE-LABEL: test_ext_v32i8:
384 ; SSE-NEXT: movdqa {{.*#+}} xmm4 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
385 ; SSE-NEXT: pxor %xmm4, %xmm2
386 ; SSE-NEXT: pxor %xmm4, %xmm0
387 ; SSE-NEXT: pavgb %xmm2, %xmm0
388 ; SSE-NEXT: pxor %xmm4, %xmm0
389 ; SSE-NEXT: pxor %xmm4, %xmm3
390 ; SSE-NEXT: pxor %xmm4, %xmm1
391 ; SSE-NEXT: pavgb %xmm3, %xmm1
392 ; SSE-NEXT: pxor %xmm4, %xmm1
395 ; AVX1-LABEL: test_ext_v32i8:
397 ; AVX1-NEXT: vbroadcastss {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
398 ; AVX1-NEXT: vxorps %ymm2, %ymm1, %ymm1
399 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
400 ; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
401 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
402 ; AVX1-NEXT: vpavgb %xmm3, %xmm4, %xmm3
403 ; AVX1-NEXT: vpavgb %xmm1, %xmm0, %xmm0
404 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0
405 ; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
408 ; AVX2-LABEL: test_ext_v32i8:
410 ; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
411 ; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1
412 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
413 ; AVX2-NEXT: vpavgb %ymm1, %ymm0, %ymm0
414 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
417 ; AVX512-LABEL: test_ext_v32i8:
419 ; AVX512-NEXT: vpbroadcastb {{.*#+}} ymm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
420 ; AVX512-NEXT: vpxor %ymm2, %ymm1, %ymm1
421 ; AVX512-NEXT: vpxor %ymm2, %ymm0, %ymm0
422 ; AVX512-NEXT: vpavgb %ymm1, %ymm0, %ymm0
423 ; AVX512-NEXT: vpxor %ymm2, %ymm0, %ymm0
425 %x0 = sext <32 x i8> %a0 to <32 x i16>
426 %x1 = sext <32 x i8> %a1 to <32 x i16>
427 %sum = add <32 x i16> %x0, %x1
428 %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>
429 %shift = ashr <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>
430 %res = trunc <32 x i16> %shift to <32 x i8>
434 define <16 x i16> @test_fixed_v16i16(<16 x i16> %a0, <16 x i16> %a1) nounwind {
435 ; SSE-LABEL: test_fixed_v16i16:
437 ; SSE-NEXT: movdqa %xmm0, %xmm4
438 ; SSE-NEXT: por %xmm2, %xmm4
439 ; SSE-NEXT: pxor %xmm2, %xmm0
440 ; SSE-NEXT: psraw $1, %xmm0
441 ; SSE-NEXT: psubw %xmm0, %xmm4
442 ; SSE-NEXT: movdqa %xmm1, %xmm2
443 ; SSE-NEXT: por %xmm3, %xmm2
444 ; SSE-NEXT: pxor %xmm3, %xmm1
445 ; SSE-NEXT: psraw $1, %xmm1
446 ; SSE-NEXT: psubw %xmm1, %xmm2
447 ; SSE-NEXT: movdqa %xmm4, %xmm0
448 ; SSE-NEXT: movdqa %xmm2, %xmm1
451 ; AVX1-LABEL: test_fixed_v16i16:
453 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm2
454 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
455 ; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
456 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
457 ; AVX1-NEXT: vpsraw $1, %xmm1, %xmm1
458 ; AVX1-NEXT: vpsubw %xmm1, %xmm3, %xmm1
459 ; AVX1-NEXT: vpsraw $1, %xmm0, %xmm0
460 ; AVX1-NEXT: vpsubw %xmm0, %xmm2, %xmm0
461 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
464 ; AVX2-LABEL: test_fixed_v16i16:
466 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm2
467 ; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
468 ; AVX2-NEXT: vpsraw $1, %ymm0, %ymm0
469 ; AVX2-NEXT: vpsubw %ymm0, %ymm2, %ymm0
472 ; AVX512-LABEL: test_fixed_v16i16:
474 ; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm2
475 ; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0
476 ; AVX512-NEXT: vpsraw $1, %ymm0, %ymm0
477 ; AVX512-NEXT: vpsubw %ymm0, %ymm2, %ymm0
479 %or = or <16 x i16> %a0, %a1
480 %xor = xor <16 x i16> %a1, %a0
481 %shift = ashr <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>
482 %res = sub <16 x i16> %or, %shift
486 define <16 x i16> @test_ext_v16i16(<16 x i16> %a0, <16 x i16> %a1) nounwind {
487 ; SSE-LABEL: test_ext_v16i16:
489 ; SSE-NEXT: movdqa %xmm0, %xmm4
490 ; SSE-NEXT: por %xmm2, %xmm4
491 ; SSE-NEXT: pxor %xmm2, %xmm0
492 ; SSE-NEXT: psraw $1, %xmm0
493 ; SSE-NEXT: psubw %xmm0, %xmm4
494 ; SSE-NEXT: movdqa %xmm1, %xmm2
495 ; SSE-NEXT: por %xmm3, %xmm2
496 ; SSE-NEXT: pxor %xmm3, %xmm1
497 ; SSE-NEXT: psraw $1, %xmm1
498 ; SSE-NEXT: psubw %xmm1, %xmm2
499 ; SSE-NEXT: movdqa %xmm4, %xmm0
500 ; SSE-NEXT: movdqa %xmm2, %xmm1
503 ; AVX1-LABEL: test_ext_v16i16:
505 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm2
506 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
507 ; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
508 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
509 ; AVX1-NEXT: vpsraw $1, %xmm1, %xmm1
510 ; AVX1-NEXT: vpsubw %xmm1, %xmm3, %xmm1
511 ; AVX1-NEXT: vpsraw $1, %xmm0, %xmm0
512 ; AVX1-NEXT: vpsubw %xmm0, %xmm2, %xmm0
513 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
516 ; AVX2-LABEL: test_ext_v16i16:
518 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm2
519 ; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
520 ; AVX2-NEXT: vpsraw $1, %ymm0, %ymm0
521 ; AVX2-NEXT: vpsubw %ymm0, %ymm2, %ymm0
524 ; AVX512-LABEL: test_ext_v16i16:
526 ; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm2
527 ; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0
528 ; AVX512-NEXT: vpsraw $1, %ymm0, %ymm0
529 ; AVX512-NEXT: vpsubw %ymm0, %ymm2, %ymm0
531 %x0 = sext <16 x i16> %a0 to <16 x i32>
532 %x1 = sext <16 x i16> %a1 to <16 x i32>
533 %sum = add <16 x i32> %x0, %x1
534 %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>
535 %shift = ashr <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>
536 %res = trunc <16 x i32> %shift to <16 x i16>
540 define <8 x i32> @test_fixed_v8i32(<8 x i32> %a0, <8 x i32> %a1) nounwind {
541 ; SSE-LABEL: test_fixed_v8i32:
543 ; SSE-NEXT: movdqa %xmm0, %xmm4
544 ; SSE-NEXT: por %xmm2, %xmm4
545 ; SSE-NEXT: pxor %xmm2, %xmm0
546 ; SSE-NEXT: psrad $1, %xmm0
547 ; SSE-NEXT: psubd %xmm0, %xmm4
548 ; SSE-NEXT: movdqa %xmm1, %xmm2
549 ; SSE-NEXT: por %xmm3, %xmm2
550 ; SSE-NEXT: pxor %xmm3, %xmm1
551 ; SSE-NEXT: psrad $1, %xmm1
552 ; SSE-NEXT: psubd %xmm1, %xmm2
553 ; SSE-NEXT: movdqa %xmm4, %xmm0
554 ; SSE-NEXT: movdqa %xmm2, %xmm1
557 ; AVX1-LABEL: test_fixed_v8i32:
559 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm2
560 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
561 ; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
562 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
563 ; AVX1-NEXT: vpsrad $1, %xmm1, %xmm1
564 ; AVX1-NEXT: vpsubd %xmm1, %xmm3, %xmm1
565 ; AVX1-NEXT: vpsrad $1, %xmm0, %xmm0
566 ; AVX1-NEXT: vpsubd %xmm0, %xmm2, %xmm0
567 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
570 ; AVX2-LABEL: test_fixed_v8i32:
572 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm2
573 ; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
574 ; AVX2-NEXT: vpsrad $1, %ymm0, %ymm0
575 ; AVX2-NEXT: vpsubd %ymm0, %ymm2, %ymm0
578 ; AVX512-LABEL: test_fixed_v8i32:
580 ; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm2
581 ; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0
582 ; AVX512-NEXT: vpsrad $1, %ymm0, %ymm0
583 ; AVX512-NEXT: vpsubd %ymm0, %ymm2, %ymm0
585 %or = or <8 x i32> %a0, %a1
586 %xor = xor <8 x i32> %a1, %a0
587 %shift = ashr <8 x i32> %xor, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
588 %res = sub <8 x i32> %or, %shift
592 define <8 x i32> @test_ext_v8i32(<8 x i32> %a0, <8 x i32> %a1) nounwind {
593 ; SSE-LABEL: test_ext_v8i32:
595 ; SSE-NEXT: movdqa %xmm0, %xmm4
596 ; SSE-NEXT: por %xmm2, %xmm4
597 ; SSE-NEXT: pxor %xmm2, %xmm0
598 ; SSE-NEXT: psrad $1, %xmm0
599 ; SSE-NEXT: psubd %xmm0, %xmm4
600 ; SSE-NEXT: movdqa %xmm1, %xmm2
601 ; SSE-NEXT: por %xmm3, %xmm2
602 ; SSE-NEXT: pxor %xmm3, %xmm1
603 ; SSE-NEXT: psrad $1, %xmm1
604 ; SSE-NEXT: psubd %xmm1, %xmm2
605 ; SSE-NEXT: movdqa %xmm4, %xmm0
606 ; SSE-NEXT: movdqa %xmm2, %xmm1
609 ; AVX1-LABEL: test_ext_v8i32:
611 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm2
612 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
613 ; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
614 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
615 ; AVX1-NEXT: vpsrad $1, %xmm1, %xmm1
616 ; AVX1-NEXT: vpsubd %xmm1, %xmm3, %xmm1
617 ; AVX1-NEXT: vpsrad $1, %xmm0, %xmm0
618 ; AVX1-NEXT: vpsubd %xmm0, %xmm2, %xmm0
619 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
622 ; AVX2-LABEL: test_ext_v8i32:
624 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm2
625 ; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
626 ; AVX2-NEXT: vpsrad $1, %ymm0, %ymm0
627 ; AVX2-NEXT: vpsubd %ymm0, %ymm2, %ymm0
630 ; AVX512-LABEL: test_ext_v8i32:
632 ; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm2
633 ; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0
634 ; AVX512-NEXT: vpsrad $1, %ymm0, %ymm0
635 ; AVX512-NEXT: vpsubd %ymm0, %ymm2, %ymm0
637 %x0 = sext <8 x i32> %a0 to <8 x i64>
638 %x1 = sext <8 x i32> %a1 to <8 x i64>
639 %sum = add <8 x i64> %x0, %x1
640 %inc = add <8 x i64> %sum, <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1>
641 %shift = ashr <8 x i64> %inc, <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1>
642 %res = trunc <8 x i64> %shift to <8 x i32>
646 define <4 x i64> @test_fixed_v4i64(<4 x i64> %a0, <4 x i64> %a1) nounwind {
647 ; SSE2-LABEL: test_fixed_v4i64:
649 ; SSE2-NEXT: movdqa %xmm0, %xmm4
650 ; SSE2-NEXT: pxor %xmm2, %xmm4
651 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,3,2,3]
652 ; SSE2-NEXT: psrad $1, %xmm5
653 ; SSE2-NEXT: psrlq $1, %xmm4
654 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
655 ; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1]
656 ; SSE2-NEXT: por %xmm2, %xmm0
657 ; SSE2-NEXT: psubq %xmm4, %xmm0
658 ; SSE2-NEXT: movdqa %xmm1, %xmm2
659 ; SSE2-NEXT: pxor %xmm3, %xmm2
660 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,3,2,3]
661 ; SSE2-NEXT: psrad $1, %xmm4
662 ; SSE2-NEXT: psrlq $1, %xmm2
663 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
664 ; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
665 ; SSE2-NEXT: por %xmm3, %xmm1
666 ; SSE2-NEXT: psubq %xmm2, %xmm1
669 ; SSE4-LABEL: test_fixed_v4i64:
671 ; SSE4-NEXT: movdqa %xmm0, %xmm4
672 ; SSE4-NEXT: pxor %xmm2, %xmm4
673 ; SSE4-NEXT: movdqa %xmm4, %xmm5
674 ; SSE4-NEXT: psrad $1, %xmm5
675 ; SSE4-NEXT: psrlq $1, %xmm4
676 ; SSE4-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7]
677 ; SSE4-NEXT: por %xmm2, %xmm0
678 ; SSE4-NEXT: psubq %xmm4, %xmm0
679 ; SSE4-NEXT: movdqa %xmm1, %xmm2
680 ; SSE4-NEXT: pxor %xmm3, %xmm2
681 ; SSE4-NEXT: movdqa %xmm2, %xmm4
682 ; SSE4-NEXT: psrad $1, %xmm4
683 ; SSE4-NEXT: psrlq $1, %xmm2
684 ; SSE4-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]
685 ; SSE4-NEXT: por %xmm3, %xmm1
686 ; SSE4-NEXT: psubq %xmm2, %xmm1
689 ; AVX1-LABEL: test_fixed_v4i64:
691 ; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm2
692 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
693 ; AVX1-NEXT: vpsrad $1, %xmm3, %xmm4
694 ; AVX1-NEXT: vpsrlq $1, %xmm3, %xmm3
695 ; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0,1],xmm4[2,3],xmm3[4,5],xmm4[6,7]
696 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
697 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
698 ; AVX1-NEXT: vpsubq %xmm3, %xmm1, %xmm1
699 ; AVX1-NEXT: vpsrad $1, %xmm2, %xmm3
700 ; AVX1-NEXT: vpsrlq $1, %xmm2, %xmm2
701 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]
702 ; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm0
703 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
706 ; AVX2-LABEL: test_fixed_v4i64:
708 ; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm2
709 ; AVX2-NEXT: vpsrad $1, %ymm2, %ymm3
710 ; AVX2-NEXT: vpsrlq $1, %ymm2, %ymm2
711 ; AVX2-NEXT: vpblendd {{.*#+}} ymm2 = ymm2[0],ymm3[1],ymm2[2],ymm3[3],ymm2[4],ymm3[5],ymm2[6],ymm3[7]
712 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
713 ; AVX2-NEXT: vpsubq %ymm2, %ymm0, %ymm0
716 ; AVX512-LABEL: test_fixed_v4i64:
718 ; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm2
719 ; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0
720 ; AVX512-NEXT: vpsraq $1, %ymm0, %ymm0
721 ; AVX512-NEXT: vpsubq %ymm0, %ymm2, %ymm0
723 %or = or <4 x i64> %a0, %a1
724 %xor = xor <4 x i64> %a1, %a0
725 %shift = ashr <4 x i64> %xor, <i64 1, i64 1, i64 1, i64 1>
726 %res = sub <4 x i64> %or, %shift
730 define <4 x i64> @test_ext_v4i64(<4 x i64> %a0, <4 x i64> %a1) nounwind {
731 ; SSE2-LABEL: test_ext_v4i64:
733 ; SSE2-NEXT: movdqa %xmm0, %xmm4
734 ; SSE2-NEXT: pxor %xmm2, %xmm4
735 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,3,2,3]
736 ; SSE2-NEXT: psrad $1, %xmm5
737 ; SSE2-NEXT: psrlq $1, %xmm4
738 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
739 ; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1]
740 ; SSE2-NEXT: por %xmm2, %xmm0
741 ; SSE2-NEXT: psubq %xmm4, %xmm0
742 ; SSE2-NEXT: movdqa %xmm1, %xmm2
743 ; SSE2-NEXT: pxor %xmm3, %xmm2
744 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,3,2,3]
745 ; SSE2-NEXT: psrad $1, %xmm4
746 ; SSE2-NEXT: psrlq $1, %xmm2
747 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,2,2,3]
748 ; SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm4[0],xmm2[1],xmm4[1]
749 ; SSE2-NEXT: por %xmm3, %xmm1
750 ; SSE2-NEXT: psubq %xmm2, %xmm1
753 ; SSE4-LABEL: test_ext_v4i64:
755 ; SSE4-NEXT: movdqa %xmm0, %xmm4
756 ; SSE4-NEXT: pxor %xmm2, %xmm4
757 ; SSE4-NEXT: movdqa %xmm4, %xmm5
758 ; SSE4-NEXT: psrad $1, %xmm5
759 ; SSE4-NEXT: psrlq $1, %xmm4
760 ; SSE4-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7]
761 ; SSE4-NEXT: por %xmm2, %xmm0
762 ; SSE4-NEXT: psubq %xmm4, %xmm0
763 ; SSE4-NEXT: movdqa %xmm1, %xmm2
764 ; SSE4-NEXT: pxor %xmm3, %xmm2
765 ; SSE4-NEXT: movdqa %xmm2, %xmm4
766 ; SSE4-NEXT: psrad $1, %xmm4
767 ; SSE4-NEXT: psrlq $1, %xmm2
768 ; SSE4-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]
769 ; SSE4-NEXT: por %xmm3, %xmm1
770 ; SSE4-NEXT: psubq %xmm2, %xmm1
773 ; AVX1-LABEL: test_ext_v4i64:
775 ; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm2
776 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
777 ; AVX1-NEXT: vpsrad $1, %xmm3, %xmm4
778 ; AVX1-NEXT: vpsrlq $1, %xmm3, %xmm3
779 ; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0,1],xmm4[2,3],xmm3[4,5],xmm4[6,7]
780 ; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
781 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
782 ; AVX1-NEXT: vpsubq %xmm3, %xmm1, %xmm1
783 ; AVX1-NEXT: vpsrad $1, %xmm2, %xmm3
784 ; AVX1-NEXT: vpsrlq $1, %xmm2, %xmm2
785 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm3[2,3],xmm2[4,5],xmm3[6,7]
786 ; AVX1-NEXT: vpsubq %xmm2, %xmm0, %xmm0
787 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
790 ; AVX2-LABEL: test_ext_v4i64:
792 ; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm2
793 ; AVX2-NEXT: vpsrad $1, %ymm2, %ymm3
794 ; AVX2-NEXT: vpsrlq $1, %ymm2, %ymm2
795 ; AVX2-NEXT: vpblendd {{.*#+}} ymm2 = ymm2[0],ymm3[1],ymm2[2],ymm3[3],ymm2[4],ymm3[5],ymm2[6],ymm3[7]
796 ; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
797 ; AVX2-NEXT: vpsubq %ymm2, %ymm0, %ymm0
800 ; AVX512-LABEL: test_ext_v4i64:
802 ; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm2
803 ; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0
804 ; AVX512-NEXT: vpsraq $1, %ymm0, %ymm0
805 ; AVX512-NEXT: vpsubq %ymm0, %ymm2, %ymm0
807 %x0 = sext <4 x i64> %a0 to <4 x i128>
808 %x1 = sext <4 x i64> %a1 to <4 x i128>
809 %sum = add <4 x i128> %x0, %x1
810 %inc = add <4 x i128> %sum, <i128 1, i128 1, i128 1, i128 1>
811 %shift = ashr <4 x i128> %inc, <i128 1, i128 1, i128 1, i128 1>
812 %res = trunc <4 x i128> %shift to <4 x i64>
820 define <64 x i8> @test_fixed_v64i8(<64 x i8> %a0, <64 x i8> %a1) nounwind {
821 ; SSE-LABEL: test_fixed_v64i8:
823 ; SSE-NEXT: movdqa {{.*#+}} xmm8 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
824 ; SSE-NEXT: pxor %xmm8, %xmm4
825 ; SSE-NEXT: pxor %xmm8, %xmm0
826 ; SSE-NEXT: pavgb %xmm4, %xmm0
827 ; SSE-NEXT: pxor %xmm8, %xmm0
828 ; SSE-NEXT: pxor %xmm8, %xmm5
829 ; SSE-NEXT: pxor %xmm8, %xmm1
830 ; SSE-NEXT: pavgb %xmm5, %xmm1
831 ; SSE-NEXT: pxor %xmm8, %xmm1
832 ; SSE-NEXT: pxor %xmm8, %xmm6
833 ; SSE-NEXT: pxor %xmm8, %xmm2
834 ; SSE-NEXT: pavgb %xmm6, %xmm2
835 ; SSE-NEXT: pxor %xmm8, %xmm2
836 ; SSE-NEXT: pxor %xmm8, %xmm7
837 ; SSE-NEXT: pxor %xmm8, %xmm3
838 ; SSE-NEXT: pavgb %xmm7, %xmm3
839 ; SSE-NEXT: pxor %xmm8, %xmm3
842 ; AVX1-LABEL: test_fixed_v64i8:
844 ; AVX1-NEXT: vbroadcastss {{.*#+}} ymm4 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
845 ; AVX1-NEXT: vxorps %ymm4, %ymm2, %ymm2
846 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5
847 ; AVX1-NEXT: vxorps %ymm4, %ymm0, %ymm0
848 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6
849 ; AVX1-NEXT: vpavgb %xmm5, %xmm6, %xmm5
850 ; AVX1-NEXT: vpavgb %xmm2, %xmm0, %xmm0
851 ; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm0, %ymm0
852 ; AVX1-NEXT: vxorps %ymm4, %ymm0, %ymm0
853 ; AVX1-NEXT: vxorps %ymm4, %ymm3, %ymm2
854 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
855 ; AVX1-NEXT: vxorps %ymm4, %ymm1, %ymm1
856 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
857 ; AVX1-NEXT: vpavgb %xmm3, %xmm5, %xmm3
858 ; AVX1-NEXT: vpavgb %xmm2, %xmm1, %xmm1
859 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1
860 ; AVX1-NEXT: vxorps %ymm4, %ymm1, %ymm1
863 ; AVX2-LABEL: test_fixed_v64i8:
865 ; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm4 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
866 ; AVX2-NEXT: vpxor %ymm4, %ymm2, %ymm2
867 ; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm0
868 ; AVX2-NEXT: vpavgb %ymm2, %ymm0, %ymm0
869 ; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm0
870 ; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm2
871 ; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1
872 ; AVX2-NEXT: vpavgb %ymm2, %ymm1, %ymm1
873 ; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1
876 ; AVX512-LABEL: test_fixed_v64i8:
878 ; AVX512-NEXT: vpbroadcastb {{.*#+}} zmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
879 ; AVX512-NEXT: vpxorq %zmm2, %zmm1, %zmm1
880 ; AVX512-NEXT: vpxorq %zmm2, %zmm0, %zmm0
881 ; AVX512-NEXT: vpavgb %zmm1, %zmm0, %zmm0
882 ; AVX512-NEXT: vpxorq %zmm2, %zmm0, %zmm0
884 %or = or <64 x i8> %a0, %a1
885 %xor = xor <64 x i8> %a0, %a1
886 %shift = ashr <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>
887 %res = sub <64 x i8> %or, %shift
891 define <64 x i8> @test_ext_v64i8(<64 x i8> %a0, <64 x i8> %a1) nounwind {
892 ; SSE-LABEL: test_ext_v64i8:
894 ; SSE-NEXT: movdqa {{.*#+}} xmm8 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
895 ; SSE-NEXT: pxor %xmm8, %xmm4
896 ; SSE-NEXT: pxor %xmm8, %xmm0
897 ; SSE-NEXT: pavgb %xmm4, %xmm0
898 ; SSE-NEXT: pxor %xmm8, %xmm0
899 ; SSE-NEXT: pxor %xmm8, %xmm5
900 ; SSE-NEXT: pxor %xmm8, %xmm1
901 ; SSE-NEXT: pavgb %xmm5, %xmm1
902 ; SSE-NEXT: pxor %xmm8, %xmm1
903 ; SSE-NEXT: pxor %xmm8, %xmm6
904 ; SSE-NEXT: pxor %xmm8, %xmm2
905 ; SSE-NEXT: pavgb %xmm6, %xmm2
906 ; SSE-NEXT: pxor %xmm8, %xmm2
907 ; SSE-NEXT: pxor %xmm8, %xmm7
908 ; SSE-NEXT: pxor %xmm8, %xmm3
909 ; SSE-NEXT: pavgb %xmm7, %xmm3
910 ; SSE-NEXT: pxor %xmm8, %xmm3
913 ; AVX1-LABEL: test_ext_v64i8:
915 ; AVX1-NEXT: vbroadcastss {{.*#+}} ymm4 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
916 ; AVX1-NEXT: vxorps %ymm4, %ymm2, %ymm2
917 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5
918 ; AVX1-NEXT: vxorps %ymm4, %ymm0, %ymm0
919 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6
920 ; AVX1-NEXT: vpavgb %xmm5, %xmm6, %xmm5
921 ; AVX1-NEXT: vpavgb %xmm2, %xmm0, %xmm0
922 ; AVX1-NEXT: vinsertf128 $1, %xmm5, %ymm0, %ymm0
923 ; AVX1-NEXT: vxorps %ymm4, %ymm0, %ymm0
924 ; AVX1-NEXT: vxorps %ymm4, %ymm3, %ymm2
925 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
926 ; AVX1-NEXT: vxorps %ymm4, %ymm1, %ymm1
927 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
928 ; AVX1-NEXT: vpavgb %xmm3, %xmm5, %xmm3
929 ; AVX1-NEXT: vpavgb %xmm2, %xmm1, %xmm1
930 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1
931 ; AVX1-NEXT: vxorps %ymm4, %ymm1, %ymm1
934 ; AVX2-LABEL: test_ext_v64i8:
936 ; AVX2-NEXT: vpbroadcastb {{.*#+}} ymm4 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
937 ; AVX2-NEXT: vpxor %ymm4, %ymm2, %ymm2
938 ; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm0
939 ; AVX2-NEXT: vpavgb %ymm2, %ymm0, %ymm0
940 ; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm0
941 ; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm2
942 ; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1
943 ; AVX2-NEXT: vpavgb %ymm2, %ymm1, %ymm1
944 ; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1
947 ; AVX512-LABEL: test_ext_v64i8:
949 ; AVX512-NEXT: vpbroadcastb {{.*#+}} zmm2 = [128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128]
950 ; AVX512-NEXT: vpxorq %zmm2, %zmm1, %zmm1
951 ; AVX512-NEXT: vpxorq %zmm2, %zmm0, %zmm0
952 ; AVX512-NEXT: vpavgb %zmm1, %zmm0, %zmm0
953 ; AVX512-NEXT: vpxorq %zmm2, %zmm0, %zmm0
955 %x0 = sext <64 x i8> %a0 to <64 x i16>
956 %x1 = sext <64 x i8> %a1 to <64 x i16>
957 %sum = add <64 x i16> %x0, %x1
958 %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>
959 %shift = ashr <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>
960 %res = trunc <64 x i16> %shift to <64 x i8>
964 define <32 x i16> @test_fixed_v32i16(<32 x i16> %a0, <32 x i16> %a1) nounwind {
965 ; SSE-LABEL: test_fixed_v32i16:
967 ; SSE-NEXT: movdqa %xmm0, %xmm8
968 ; SSE-NEXT: por %xmm4, %xmm8
969 ; SSE-NEXT: pxor %xmm4, %xmm0
970 ; SSE-NEXT: psraw $1, %xmm0
971 ; SSE-NEXT: psubw %xmm0, %xmm8
972 ; SSE-NEXT: movdqa %xmm1, %xmm4
973 ; SSE-NEXT: por %xmm5, %xmm4
974 ; SSE-NEXT: pxor %xmm5, %xmm1
975 ; SSE-NEXT: psraw $1, %xmm1
976 ; SSE-NEXT: psubw %xmm1, %xmm4
977 ; SSE-NEXT: movdqa %xmm2, %xmm5
978 ; SSE-NEXT: por %xmm6, %xmm5
979 ; SSE-NEXT: pxor %xmm6, %xmm2
980 ; SSE-NEXT: psraw $1, %xmm2
981 ; SSE-NEXT: psubw %xmm2, %xmm5
982 ; SSE-NEXT: movdqa %xmm3, %xmm6
983 ; SSE-NEXT: por %xmm7, %xmm6
984 ; SSE-NEXT: pxor %xmm7, %xmm3
985 ; SSE-NEXT: psraw $1, %xmm3
986 ; SSE-NEXT: psubw %xmm3, %xmm6
987 ; SSE-NEXT: movdqa %xmm8, %xmm0
988 ; SSE-NEXT: movdqa %xmm4, %xmm1
989 ; SSE-NEXT: movdqa %xmm5, %xmm2
990 ; SSE-NEXT: movdqa %xmm6, %xmm3
993 ; AVX1-LABEL: test_fixed_v32i16:
995 ; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm4
996 ; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm5
997 ; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
998 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
999 ; AVX1-NEXT: vpsraw $1, %xmm2, %xmm2
1000 ; AVX1-NEXT: vpsubw %xmm2, %xmm5, %xmm2
1001 ; AVX1-NEXT: vpsraw $1, %xmm0, %xmm0
1002 ; AVX1-NEXT: vpsubw %xmm0, %xmm4, %xmm0
1003 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1004 ; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm2
1005 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
1006 ; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1
1007 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
1008 ; AVX1-NEXT: vpsraw $1, %xmm3, %xmm3
1009 ; AVX1-NEXT: vpsubw %xmm3, %xmm4, %xmm3
1010 ; AVX1-NEXT: vpsraw $1, %xmm1, %xmm1
1011 ; AVX1-NEXT: vpsubw %xmm1, %xmm2, %xmm1
1012 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1
1015 ; AVX2-LABEL: test_fixed_v32i16:
1017 ; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm4
1018 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
1019 ; AVX2-NEXT: vpsraw $1, %ymm0, %ymm0
1020 ; AVX2-NEXT: vpsubw %ymm0, %ymm4, %ymm0
1021 ; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm2
1022 ; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1
1023 ; AVX2-NEXT: vpsraw $1, %ymm1, %ymm1
1024 ; AVX2-NEXT: vpsubw %ymm1, %ymm2, %ymm1
1027 ; AVX512-LABEL: test_fixed_v32i16:
1029 ; AVX512-NEXT: vporq %zmm1, %zmm0, %zmm2
1030 ; AVX512-NEXT: vpxorq %zmm1, %zmm0, %zmm0
1031 ; AVX512-NEXT: vpsraw $1, %zmm0, %zmm0
1032 ; AVX512-NEXT: vpsubw %zmm0, %zmm2, %zmm0
1034 %or = or <32 x i16> %a0, %a1
1035 %xor = xor <32 x i16> %a1, %a0
1036 %shift = ashr <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>
1037 %res = sub <32 x i16> %or, %shift
1041 define <32 x i16> @test_ext_v32i16(<32 x i16> %a0, <32 x i16> %a1) nounwind {
1042 ; SSE-LABEL: test_ext_v32i16:
1044 ; SSE-NEXT: movdqa %xmm0, %xmm8
1045 ; SSE-NEXT: por %xmm4, %xmm8
1046 ; SSE-NEXT: pxor %xmm4, %xmm0
1047 ; SSE-NEXT: psraw $1, %xmm0
1048 ; SSE-NEXT: psubw %xmm0, %xmm8
1049 ; SSE-NEXT: movdqa %xmm1, %xmm4
1050 ; SSE-NEXT: por %xmm5, %xmm4
1051 ; SSE-NEXT: pxor %xmm5, %xmm1
1052 ; SSE-NEXT: psraw $1, %xmm1
1053 ; SSE-NEXT: psubw %xmm1, %xmm4
1054 ; SSE-NEXT: movdqa %xmm2, %xmm5
1055 ; SSE-NEXT: por %xmm6, %xmm5
1056 ; SSE-NEXT: pxor %xmm6, %xmm2
1057 ; SSE-NEXT: psraw $1, %xmm2
1058 ; SSE-NEXT: psubw %xmm2, %xmm5
1059 ; SSE-NEXT: movdqa %xmm3, %xmm6
1060 ; SSE-NEXT: por %xmm7, %xmm6
1061 ; SSE-NEXT: pxor %xmm7, %xmm3
1062 ; SSE-NEXT: psraw $1, %xmm3
1063 ; SSE-NEXT: psubw %xmm3, %xmm6
1064 ; SSE-NEXT: movdqa %xmm8, %xmm0
1065 ; SSE-NEXT: movdqa %xmm4, %xmm1
1066 ; SSE-NEXT: movdqa %xmm5, %xmm2
1067 ; SSE-NEXT: movdqa %xmm6, %xmm3
1070 ; AVX1-LABEL: test_ext_v32i16:
1072 ; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm4
1073 ; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm5
1074 ; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
1075 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
1076 ; AVX1-NEXT: vpsraw $1, %xmm2, %xmm2
1077 ; AVX1-NEXT: vpsubw %xmm2, %xmm5, %xmm2
1078 ; AVX1-NEXT: vpsraw $1, %xmm0, %xmm0
1079 ; AVX1-NEXT: vpsubw %xmm0, %xmm4, %xmm0
1080 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1081 ; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm2
1082 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
1083 ; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1
1084 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
1085 ; AVX1-NEXT: vpsraw $1, %xmm3, %xmm3
1086 ; AVX1-NEXT: vpsubw %xmm3, %xmm4, %xmm3
1087 ; AVX1-NEXT: vpsraw $1, %xmm1, %xmm1
1088 ; AVX1-NEXT: vpsubw %xmm1, %xmm2, %xmm1
1089 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1
1092 ; AVX2-LABEL: test_ext_v32i16:
1094 ; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm4
1095 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
1096 ; AVX2-NEXT: vpsraw $1, %ymm0, %ymm0
1097 ; AVX2-NEXT: vpsubw %ymm0, %ymm4, %ymm0
1098 ; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm2
1099 ; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1
1100 ; AVX2-NEXT: vpsraw $1, %ymm1, %ymm1
1101 ; AVX2-NEXT: vpsubw %ymm1, %ymm2, %ymm1
1104 ; AVX512-LABEL: test_ext_v32i16:
1106 ; AVX512-NEXT: vporq %zmm1, %zmm0, %zmm2
1107 ; AVX512-NEXT: vpxorq %zmm1, %zmm0, %zmm0
1108 ; AVX512-NEXT: vpsraw $1, %zmm0, %zmm0
1109 ; AVX512-NEXT: vpsubw %zmm0, %zmm2, %zmm0
1111 %x0 = sext <32 x i16> %a0 to <32 x i32>
1112 %x1 = sext <32 x i16> %a1 to <32 x i32>
1113 %sum = add <32 x i32> %x0, %x1
1114 %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>
1115 %shift = ashr <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>
1116 %res = trunc <32 x i32> %shift to <32 x i16>
1120 define <16 x i32> @test_fixed_v16i32(<16 x i32> %a0, <16 x i32> %a1) nounwind {
1121 ; SSE-LABEL: test_fixed_v16i32:
1123 ; SSE-NEXT: movdqa %xmm0, %xmm8
1124 ; SSE-NEXT: por %xmm4, %xmm8
1125 ; SSE-NEXT: pxor %xmm4, %xmm0
1126 ; SSE-NEXT: psrad $1, %xmm0
1127 ; SSE-NEXT: psubd %xmm0, %xmm8
1128 ; SSE-NEXT: movdqa %xmm1, %xmm4
1129 ; SSE-NEXT: por %xmm5, %xmm4
1130 ; SSE-NEXT: pxor %xmm5, %xmm1
1131 ; SSE-NEXT: psrad $1, %xmm1
1132 ; SSE-NEXT: psubd %xmm1, %xmm4
1133 ; SSE-NEXT: movdqa %xmm2, %xmm5
1134 ; SSE-NEXT: por %xmm6, %xmm5
1135 ; SSE-NEXT: pxor %xmm6, %xmm2
1136 ; SSE-NEXT: psrad $1, %xmm2
1137 ; SSE-NEXT: psubd %xmm2, %xmm5
1138 ; SSE-NEXT: movdqa %xmm3, %xmm6
1139 ; SSE-NEXT: por %xmm7, %xmm6
1140 ; SSE-NEXT: pxor %xmm7, %xmm3
1141 ; SSE-NEXT: psrad $1, %xmm3
1142 ; SSE-NEXT: psubd %xmm3, %xmm6
1143 ; SSE-NEXT: movdqa %xmm8, %xmm0
1144 ; SSE-NEXT: movdqa %xmm4, %xmm1
1145 ; SSE-NEXT: movdqa %xmm5, %xmm2
1146 ; SSE-NEXT: movdqa %xmm6, %xmm3
1149 ; AVX1-LABEL: test_fixed_v16i32:
1151 ; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm4
1152 ; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm5
1153 ; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
1154 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
1155 ; AVX1-NEXT: vpsrad $1, %xmm2, %xmm2
1156 ; AVX1-NEXT: vpsubd %xmm2, %xmm5, %xmm2
1157 ; AVX1-NEXT: vpsrad $1, %xmm0, %xmm0
1158 ; AVX1-NEXT: vpsubd %xmm0, %xmm4, %xmm0
1159 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1160 ; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm2
1161 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
1162 ; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1
1163 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
1164 ; AVX1-NEXT: vpsrad $1, %xmm3, %xmm3
1165 ; AVX1-NEXT: vpsubd %xmm3, %xmm4, %xmm3
1166 ; AVX1-NEXT: vpsrad $1, %xmm1, %xmm1
1167 ; AVX1-NEXT: vpsubd %xmm1, %xmm2, %xmm1
1168 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1
1171 ; AVX2-LABEL: test_fixed_v16i32:
1173 ; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm4
1174 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
1175 ; AVX2-NEXT: vpsrad $1, %ymm0, %ymm0
1176 ; AVX2-NEXT: vpsubd %ymm0, %ymm4, %ymm0
1177 ; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm2
1178 ; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1
1179 ; AVX2-NEXT: vpsrad $1, %ymm1, %ymm1
1180 ; AVX2-NEXT: vpsubd %ymm1, %ymm2, %ymm1
1183 ; AVX512-LABEL: test_fixed_v16i32:
1185 ; AVX512-NEXT: vpord %zmm1, %zmm0, %zmm2
1186 ; AVX512-NEXT: vpxord %zmm1, %zmm0, %zmm0
1187 ; AVX512-NEXT: vpsrad $1, %zmm0, %zmm0
1188 ; AVX512-NEXT: vpsubd %zmm0, %zmm2, %zmm0
1190 %or = or <16 x i32> %a0, %a1
1191 %xor = xor <16 x i32> %a1, %a0
1192 %shift = ashr <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>
1193 %res = sub <16 x i32> %or, %shift
1197 define <16 x i32> @test_ext_v16i32(<16 x i32> %a0, <16 x i32> %a1) nounwind {
1198 ; SSE-LABEL: test_ext_v16i32:
1200 ; SSE-NEXT: movdqa %xmm0, %xmm8
1201 ; SSE-NEXT: por %xmm4, %xmm8
1202 ; SSE-NEXT: pxor %xmm4, %xmm0
1203 ; SSE-NEXT: psrad $1, %xmm0
1204 ; SSE-NEXT: psubd %xmm0, %xmm8
1205 ; SSE-NEXT: movdqa %xmm1, %xmm4
1206 ; SSE-NEXT: por %xmm5, %xmm4
1207 ; SSE-NEXT: pxor %xmm5, %xmm1
1208 ; SSE-NEXT: psrad $1, %xmm1
1209 ; SSE-NEXT: psubd %xmm1, %xmm4
1210 ; SSE-NEXT: movdqa %xmm2, %xmm5
1211 ; SSE-NEXT: por %xmm6, %xmm5
1212 ; SSE-NEXT: pxor %xmm6, %xmm2
1213 ; SSE-NEXT: psrad $1, %xmm2
1214 ; SSE-NEXT: psubd %xmm2, %xmm5
1215 ; SSE-NEXT: movdqa %xmm3, %xmm6
1216 ; SSE-NEXT: por %xmm7, %xmm6
1217 ; SSE-NEXT: pxor %xmm7, %xmm3
1218 ; SSE-NEXT: psrad $1, %xmm3
1219 ; SSE-NEXT: psubd %xmm3, %xmm6
1220 ; SSE-NEXT: movdqa %xmm8, %xmm0
1221 ; SSE-NEXT: movdqa %xmm4, %xmm1
1222 ; SSE-NEXT: movdqa %xmm5, %xmm2
1223 ; SSE-NEXT: movdqa %xmm6, %xmm3
1226 ; AVX1-LABEL: test_ext_v16i32:
1228 ; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm4
1229 ; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm5
1230 ; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
1231 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
1232 ; AVX1-NEXT: vpsrad $1, %xmm2, %xmm2
1233 ; AVX1-NEXT: vpsubd %xmm2, %xmm5, %xmm2
1234 ; AVX1-NEXT: vpsrad $1, %xmm0, %xmm0
1235 ; AVX1-NEXT: vpsubd %xmm0, %xmm4, %xmm0
1236 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1237 ; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm2
1238 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
1239 ; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1
1240 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
1241 ; AVX1-NEXT: vpsrad $1, %xmm3, %xmm3
1242 ; AVX1-NEXT: vpsubd %xmm3, %xmm4, %xmm3
1243 ; AVX1-NEXT: vpsrad $1, %xmm1, %xmm1
1244 ; AVX1-NEXT: vpsubd %xmm1, %xmm2, %xmm1
1245 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1
1248 ; AVX2-LABEL: test_ext_v16i32:
1250 ; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm4
1251 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
1252 ; AVX2-NEXT: vpsrad $1, %ymm0, %ymm0
1253 ; AVX2-NEXT: vpsubd %ymm0, %ymm4, %ymm0
1254 ; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm2
1255 ; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1
1256 ; AVX2-NEXT: vpsrad $1, %ymm1, %ymm1
1257 ; AVX2-NEXT: vpsubd %ymm1, %ymm2, %ymm1
1260 ; AVX512-LABEL: test_ext_v16i32:
1262 ; AVX512-NEXT: vpord %zmm1, %zmm0, %zmm2
1263 ; AVX512-NEXT: vpxord %zmm1, %zmm0, %zmm0
1264 ; AVX512-NEXT: vpsrad $1, %zmm0, %zmm0
1265 ; AVX512-NEXT: vpsubd %zmm0, %zmm2, %zmm0
1267 %x0 = sext <16 x i32> %a0 to <16 x i64>
1268 %x1 = sext <16 x i32> %a1 to <16 x i64>
1269 %sum = add <16 x i64> %x0, %x1
1270 %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>
1271 %shift = ashr <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>
1272 %res = trunc <16 x i64> %shift to <16 x i32>
1276 define <8 x i64> @test_fixed_v8i64(<8 x i64> %a0, <8 x i64> %a1) nounwind {
1277 ; SSE2-LABEL: test_fixed_v8i64:
1279 ; SSE2-NEXT: movdqa %xmm0, %xmm8
1280 ; SSE2-NEXT: pxor %xmm4, %xmm8
1281 ; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm8[1,3,2,3]
1282 ; SSE2-NEXT: psrad $1, %xmm9
1283 ; SSE2-NEXT: psrlq $1, %xmm8
1284 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm8[0,2,2,3]
1285 ; SSE2-NEXT: punpckldq {{.*#+}} xmm8 = xmm8[0],xmm9[0],xmm8[1],xmm9[1]
1286 ; SSE2-NEXT: por %xmm4, %xmm0
1287 ; SSE2-NEXT: psubq %xmm8, %xmm0
1288 ; SSE2-NEXT: movdqa %xmm1, %xmm4
1289 ; SSE2-NEXT: pxor %xmm5, %xmm4
1290 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm4[1,3,2,3]
1291 ; SSE2-NEXT: psrad $1, %xmm8
1292 ; SSE2-NEXT: psrlq $1, %xmm4
1293 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
1294 ; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm8[0],xmm4[1],xmm8[1]
1295 ; SSE2-NEXT: por %xmm5, %xmm1
1296 ; SSE2-NEXT: psubq %xmm4, %xmm1
1297 ; SSE2-NEXT: movdqa %xmm2, %xmm4
1298 ; SSE2-NEXT: pxor %xmm6, %xmm4
1299 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,3,2,3]
1300 ; SSE2-NEXT: psrad $1, %xmm5
1301 ; SSE2-NEXT: psrlq $1, %xmm4
1302 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
1303 ; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1]
1304 ; SSE2-NEXT: por %xmm6, %xmm2
1305 ; SSE2-NEXT: psubq %xmm4, %xmm2
1306 ; SSE2-NEXT: movdqa %xmm3, %xmm4
1307 ; SSE2-NEXT: pxor %xmm7, %xmm4
1308 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,3,2,3]
1309 ; SSE2-NEXT: psrad $1, %xmm5
1310 ; SSE2-NEXT: psrlq $1, %xmm4
1311 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
1312 ; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1]
1313 ; SSE2-NEXT: por %xmm7, %xmm3
1314 ; SSE2-NEXT: psubq %xmm4, %xmm3
1317 ; SSE4-LABEL: test_fixed_v8i64:
1319 ; SSE4-NEXT: movdqa %xmm0, %xmm8
1320 ; SSE4-NEXT: pxor %xmm4, %xmm8
1321 ; SSE4-NEXT: movdqa %xmm8, %xmm9
1322 ; SSE4-NEXT: psrad $1, %xmm9
1323 ; SSE4-NEXT: psrlq $1, %xmm8
1324 ; SSE4-NEXT: pblendw {{.*#+}} xmm8 = xmm8[0,1],xmm9[2,3],xmm8[4,5],xmm9[6,7]
1325 ; SSE4-NEXT: por %xmm4, %xmm0
1326 ; SSE4-NEXT: psubq %xmm8, %xmm0
1327 ; SSE4-NEXT: movdqa %xmm1, %xmm4
1328 ; SSE4-NEXT: pxor %xmm5, %xmm4
1329 ; SSE4-NEXT: movdqa %xmm4, %xmm8
1330 ; SSE4-NEXT: psrad $1, %xmm8
1331 ; SSE4-NEXT: psrlq $1, %xmm4
1332 ; SSE4-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm8[2,3],xmm4[4,5],xmm8[6,7]
1333 ; SSE4-NEXT: por %xmm5, %xmm1
1334 ; SSE4-NEXT: psubq %xmm4, %xmm1
1335 ; SSE4-NEXT: movdqa %xmm2, %xmm4
1336 ; SSE4-NEXT: pxor %xmm6, %xmm4
1337 ; SSE4-NEXT: movdqa %xmm4, %xmm5
1338 ; SSE4-NEXT: psrad $1, %xmm5
1339 ; SSE4-NEXT: psrlq $1, %xmm4
1340 ; SSE4-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7]
1341 ; SSE4-NEXT: por %xmm6, %xmm2
1342 ; SSE4-NEXT: psubq %xmm4, %xmm2
1343 ; SSE4-NEXT: movdqa %xmm3, %xmm4
1344 ; SSE4-NEXT: pxor %xmm7, %xmm4
1345 ; SSE4-NEXT: movdqa %xmm4, %xmm5
1346 ; SSE4-NEXT: psrad $1, %xmm5
1347 ; SSE4-NEXT: psrlq $1, %xmm4
1348 ; SSE4-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7]
1349 ; SSE4-NEXT: por %xmm7, %xmm3
1350 ; SSE4-NEXT: psubq %xmm4, %xmm3
1353 ; AVX1-LABEL: test_fixed_v8i64:
1355 ; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm4
1356 ; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm5
1357 ; AVX1-NEXT: vpsrad $1, %xmm5, %xmm6
1358 ; AVX1-NEXT: vpsrlq $1, %xmm5, %xmm5
1359 ; AVX1-NEXT: vpblendw {{.*#+}} xmm5 = xmm5[0,1],xmm6[2,3],xmm5[4,5],xmm6[6,7]
1360 ; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
1361 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
1362 ; AVX1-NEXT: vpsubq %xmm5, %xmm2, %xmm2
1363 ; AVX1-NEXT: vpsrad $1, %xmm4, %xmm5
1364 ; AVX1-NEXT: vpsrlq $1, %xmm4, %xmm4
1365 ; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7]
1366 ; AVX1-NEXT: vpsubq %xmm4, %xmm0, %xmm0
1367 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1368 ; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm2
1369 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
1370 ; AVX1-NEXT: vpsrad $1, %xmm4, %xmm5
1371 ; AVX1-NEXT: vpsrlq $1, %xmm4, %xmm4
1372 ; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7]
1373 ; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
1374 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
1375 ; AVX1-NEXT: vpsubq %xmm4, %xmm3, %xmm3
1376 ; AVX1-NEXT: vpsrad $1, %xmm2, %xmm4
1377 ; AVX1-NEXT: vpsrlq $1, %xmm2, %xmm2
1378 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]
1379 ; AVX1-NEXT: vpsubq %xmm2, %xmm1, %xmm1
1380 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1
1383 ; AVX2-LABEL: test_fixed_v8i64:
1385 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm4
1386 ; AVX2-NEXT: vpsrad $1, %ymm4, %ymm5
1387 ; AVX2-NEXT: vpsrlq $1, %ymm4, %ymm4
1388 ; AVX2-NEXT: vpblendd {{.*#+}} ymm4 = ymm4[0],ymm5[1],ymm4[2],ymm5[3],ymm4[4],ymm5[5],ymm4[6],ymm5[7]
1389 ; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
1390 ; AVX2-NEXT: vpsubq %ymm4, %ymm0, %ymm0
1391 ; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm2
1392 ; AVX2-NEXT: vpsrad $1, %ymm2, %ymm4
1393 ; AVX2-NEXT: vpsrlq $1, %ymm2, %ymm2
1394 ; AVX2-NEXT: vpblendd {{.*#+}} ymm2 = ymm2[0],ymm4[1],ymm2[2],ymm4[3],ymm2[4],ymm4[5],ymm2[6],ymm4[7]
1395 ; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1
1396 ; AVX2-NEXT: vpsubq %ymm2, %ymm1, %ymm1
1399 ; AVX512-LABEL: test_fixed_v8i64:
1401 ; AVX512-NEXT: vporq %zmm1, %zmm0, %zmm2
1402 ; AVX512-NEXT: vpxorq %zmm1, %zmm0, %zmm0
1403 ; AVX512-NEXT: vpsraq $1, %zmm0, %zmm0
1404 ; AVX512-NEXT: vpsubq %zmm0, %zmm2, %zmm0
1406 %or = or <8 x i64> %a0, %a1
1407 %xor = xor <8 x i64> %a1, %a0
1408 %shift = ashr <8 x i64> %xor, <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1>
1409 %res = sub <8 x i64> %or, %shift
1413 define <8 x i64> @test_ext_v8i64(<8 x i64> %a0, <8 x i64> %a1) nounwind {
1414 ; SSE2-LABEL: test_ext_v8i64:
1416 ; SSE2-NEXT: movdqa %xmm0, %xmm8
1417 ; SSE2-NEXT: pxor %xmm4, %xmm8
1418 ; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm8[1,3,2,3]
1419 ; SSE2-NEXT: psrad $1, %xmm9
1420 ; SSE2-NEXT: psrlq $1, %xmm8
1421 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm8[0,2,2,3]
1422 ; SSE2-NEXT: punpckldq {{.*#+}} xmm8 = xmm8[0],xmm9[0],xmm8[1],xmm9[1]
1423 ; SSE2-NEXT: por %xmm4, %xmm0
1424 ; SSE2-NEXT: psubq %xmm8, %xmm0
1425 ; SSE2-NEXT: movdqa %xmm1, %xmm4
1426 ; SSE2-NEXT: pxor %xmm5, %xmm4
1427 ; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm4[1,3,2,3]
1428 ; SSE2-NEXT: psrad $1, %xmm8
1429 ; SSE2-NEXT: psrlq $1, %xmm4
1430 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
1431 ; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm8[0],xmm4[1],xmm8[1]
1432 ; SSE2-NEXT: por %xmm5, %xmm1
1433 ; SSE2-NEXT: psubq %xmm4, %xmm1
1434 ; SSE2-NEXT: movdqa %xmm2, %xmm4
1435 ; SSE2-NEXT: pxor %xmm6, %xmm4
1436 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,3,2,3]
1437 ; SSE2-NEXT: psrad $1, %xmm5
1438 ; SSE2-NEXT: psrlq $1, %xmm4
1439 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
1440 ; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1]
1441 ; SSE2-NEXT: por %xmm6, %xmm2
1442 ; SSE2-NEXT: psubq %xmm4, %xmm2
1443 ; SSE2-NEXT: movdqa %xmm3, %xmm4
1444 ; SSE2-NEXT: pxor %xmm7, %xmm4
1445 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[1,3,2,3]
1446 ; SSE2-NEXT: psrad $1, %xmm5
1447 ; SSE2-NEXT: psrlq $1, %xmm4
1448 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,2,2,3]
1449 ; SSE2-NEXT: punpckldq {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1]
1450 ; SSE2-NEXT: por %xmm7, %xmm3
1451 ; SSE2-NEXT: psubq %xmm4, %xmm3
1454 ; SSE4-LABEL: test_ext_v8i64:
1456 ; SSE4-NEXT: movdqa %xmm0, %xmm8
1457 ; SSE4-NEXT: pxor %xmm4, %xmm8
1458 ; SSE4-NEXT: movdqa %xmm8, %xmm9
1459 ; SSE4-NEXT: psrad $1, %xmm9
1460 ; SSE4-NEXT: psrlq $1, %xmm8
1461 ; SSE4-NEXT: pblendw {{.*#+}} xmm8 = xmm8[0,1],xmm9[2,3],xmm8[4,5],xmm9[6,7]
1462 ; SSE4-NEXT: por %xmm4, %xmm0
1463 ; SSE4-NEXT: psubq %xmm8, %xmm0
1464 ; SSE4-NEXT: movdqa %xmm1, %xmm4
1465 ; SSE4-NEXT: pxor %xmm5, %xmm4
1466 ; SSE4-NEXT: movdqa %xmm4, %xmm8
1467 ; SSE4-NEXT: psrad $1, %xmm8
1468 ; SSE4-NEXT: psrlq $1, %xmm4
1469 ; SSE4-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm8[2,3],xmm4[4,5],xmm8[6,7]
1470 ; SSE4-NEXT: por %xmm5, %xmm1
1471 ; SSE4-NEXT: psubq %xmm4, %xmm1
1472 ; SSE4-NEXT: movdqa %xmm2, %xmm4
1473 ; SSE4-NEXT: pxor %xmm6, %xmm4
1474 ; SSE4-NEXT: movdqa %xmm4, %xmm5
1475 ; SSE4-NEXT: psrad $1, %xmm5
1476 ; SSE4-NEXT: psrlq $1, %xmm4
1477 ; SSE4-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7]
1478 ; SSE4-NEXT: por %xmm6, %xmm2
1479 ; SSE4-NEXT: psubq %xmm4, %xmm2
1480 ; SSE4-NEXT: movdqa %xmm3, %xmm4
1481 ; SSE4-NEXT: pxor %xmm7, %xmm4
1482 ; SSE4-NEXT: movdqa %xmm4, %xmm5
1483 ; SSE4-NEXT: psrad $1, %xmm5
1484 ; SSE4-NEXT: psrlq $1, %xmm4
1485 ; SSE4-NEXT: pblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7]
1486 ; SSE4-NEXT: por %xmm7, %xmm3
1487 ; SSE4-NEXT: psubq %xmm4, %xmm3
1490 ; AVX1-LABEL: test_ext_v8i64:
1492 ; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm4
1493 ; AVX1-NEXT: vextractf128 $1, %ymm4, %xmm5
1494 ; AVX1-NEXT: vpsrad $1, %xmm5, %xmm6
1495 ; AVX1-NEXT: vpsrlq $1, %xmm5, %xmm5
1496 ; AVX1-NEXT: vpblendw {{.*#+}} xmm5 = xmm5[0,1],xmm6[2,3],xmm5[4,5],xmm6[6,7]
1497 ; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
1498 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
1499 ; AVX1-NEXT: vpsubq %xmm5, %xmm2, %xmm2
1500 ; AVX1-NEXT: vpsrad $1, %xmm4, %xmm5
1501 ; AVX1-NEXT: vpsrlq $1, %xmm4, %xmm4
1502 ; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7]
1503 ; AVX1-NEXT: vpsubq %xmm4, %xmm0, %xmm0
1504 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1505 ; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm2
1506 ; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm4
1507 ; AVX1-NEXT: vpsrad $1, %xmm4, %xmm5
1508 ; AVX1-NEXT: vpsrlq $1, %xmm4, %xmm4
1509 ; AVX1-NEXT: vpblendw {{.*#+}} xmm4 = xmm4[0,1],xmm5[2,3],xmm4[4,5],xmm5[6,7]
1510 ; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
1511 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
1512 ; AVX1-NEXT: vpsubq %xmm4, %xmm3, %xmm3
1513 ; AVX1-NEXT: vpsrad $1, %xmm2, %xmm4
1514 ; AVX1-NEXT: vpsrlq $1, %xmm2, %xmm2
1515 ; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm2[0,1],xmm4[2,3],xmm2[4,5],xmm4[6,7]
1516 ; AVX1-NEXT: vpsubq %xmm2, %xmm1, %xmm1
1517 ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1
1520 ; AVX2-LABEL: test_ext_v8i64:
1522 ; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm4
1523 ; AVX2-NEXT: vpsrad $1, %ymm4, %ymm5
1524 ; AVX2-NEXT: vpsrlq $1, %ymm4, %ymm4
1525 ; AVX2-NEXT: vpblendd {{.*#+}} ymm4 = ymm4[0],ymm5[1],ymm4[2],ymm5[3],ymm4[4],ymm5[5],ymm4[6],ymm5[7]
1526 ; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
1527 ; AVX2-NEXT: vpsubq %ymm4, %ymm0, %ymm0
1528 ; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm2
1529 ; AVX2-NEXT: vpsrad $1, %ymm2, %ymm4
1530 ; AVX2-NEXT: vpsrlq $1, %ymm2, %ymm2
1531 ; AVX2-NEXT: vpblendd {{.*#+}} ymm2 = ymm2[0],ymm4[1],ymm2[2],ymm4[3],ymm2[4],ymm4[5],ymm2[6],ymm4[7]
1532 ; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1
1533 ; AVX2-NEXT: vpsubq %ymm2, %ymm1, %ymm1
1536 ; AVX512-LABEL: test_ext_v8i64:
1538 ; AVX512-NEXT: vporq %zmm1, %zmm0, %zmm2
1539 ; AVX512-NEXT: vpxorq %zmm1, %zmm0, %zmm0
1540 ; AVX512-NEXT: vpsraq $1, %zmm0, %zmm0
1541 ; AVX512-NEXT: vpsubq %zmm0, %zmm2, %zmm0
1543 %x0 = sext <8 x i64> %a0 to <8 x i128>
1544 %x1 = sext <8 x i64> %a1 to <8 x i128>
1545 %sum = add <8 x i128> %x0, %x1
1546 %inc = add <8 x i128> %sum, <i128 1, i128 1, i128 1, i128 1, i128 1, i128 1, i128 1, i128 1>
1547 %shift = ashr <8 x i128> %inc, <i128 1, i128 1, i128 1, i128 1, i128 1, i128 1, i128 1, i128 1>
1548 %res = trunc <8 x i128> %shift to <8 x i64>