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