[RISCV] Add shrinkwrap test cases showing gaps in current impl
[llvm-project.git] / llvm / test / CodeGen / X86 / avgceils.ll
blobbb6f3fc9f588a054d2d268cf7ca3cd23c8f8eef4
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:    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
20 ; SSE-NEXT:    retq
22 ; AVX1-LABEL: test_fixed_v16i8:
23 ; AVX1:       # %bb.0:
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
29 ; AVX1-NEXT:    retq
31 ; AVX2-LABEL: test_fixed_v16i8:
32 ; AVX2:       # %bb.0:
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
38 ; AVX2-NEXT:    retq
40 ; AVX512-LABEL: test_fixed_v16i8:
41 ; AVX512:       # %bb.0:
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
47 ; AVX512-NEXT:    retq
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
52   ret <16 x i8> %res
55 define <16 x i8> @test_ext_v16i8(<16 x i8> %a0, <16 x i8> %a1) nounwind {
56 ; SSE-LABEL: test_ext_v16i8:
57 ; SSE:       # %bb.0:
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
63 ; SSE-NEXT:    retq
65 ; AVX1-LABEL: test_ext_v16i8:
66 ; AVX1:       # %bb.0:
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
72 ; AVX1-NEXT:    retq
74 ; AVX2-LABEL: test_ext_v16i8:
75 ; AVX2:       # %bb.0:
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
81 ; AVX2-NEXT:    retq
83 ; AVX512-LABEL: test_ext_v16i8:
84 ; AVX512:       # %bb.0:
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
90 ; AVX512-NEXT:    retq
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>
97   ret <16 x i8> %res
100 define <8 x i16> @test_fixed_v8i16(<8 x i16> %a0, <8 x i16> %a1) nounwind {
101 ; SSE-LABEL: test_fixed_v8i16:
102 ; SSE:       # %bb.0:
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
109 ; SSE-NEXT:    retq
111 ; AVX-LABEL: test_fixed_v8i16:
112 ; AVX:       # %bb.0:
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
117 ; AVX-NEXT:    retq
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
122   ret <8 x i16> %res
125 define <8 x i16> @test_ext_v8i16(<8 x i16> %a0, <8 x i16> %a1) nounwind {
126 ; SSE-LABEL: test_ext_v8i16:
127 ; SSE:       # %bb.0:
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
134 ; SSE-NEXT:    retq
136 ; AVX-LABEL: test_ext_v8i16:
137 ; AVX:       # %bb.0:
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
142 ; AVX-NEXT:    retq
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>
149   ret <8 x i16> %res
152 define <4 x i32> @test_fixed_v4i32(<4 x i32> %a0, <4 x i32> %a1) nounwind {
153 ; SSE-LABEL: test_fixed_v4i32:
154 ; SSE:       # %bb.0:
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
161 ; SSE-NEXT:    retq
163 ; AVX-LABEL: test_fixed_v4i32:
164 ; AVX:       # %bb.0:
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
169 ; AVX-NEXT:    retq
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
174   ret <4 x i32> %res
177 define <4 x i32> @test_ext_v4i32(<4 x i32> %a0, <4 x i32> %a1) nounwind {
178 ; SSE-LABEL: test_ext_v4i32:
179 ; SSE:       # %bb.0:
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
186 ; SSE-NEXT:    retq
188 ; AVX-LABEL: test_ext_v4i32:
189 ; AVX:       # %bb.0:
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
194 ; AVX-NEXT:    retq
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>
201   ret <4 x i32> %res
204 define <2 x i64> @test_fixed_v2i64(<2 x i64> %a0, <2 x i64> %a1) nounwind {
205 ; SSE2-LABEL: test_fixed_v2i64:
206 ; SSE2:       # %bb.0:
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
216 ; SSE2-NEXT:    retq
218 ; SSE4-LABEL: test_fixed_v2i64:
219 ; SSE4:       # %bb.0:
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
228 ; SSE4-NEXT:    retq
230 ; AVX1-LABEL: test_fixed_v2i64:
231 ; AVX1:       # %bb.0:
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
238 ; AVX1-NEXT:    retq
240 ; AVX2-LABEL: test_fixed_v2i64:
241 ; AVX2:       # %bb.0:
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
248 ; AVX2-NEXT:    retq
250 ; AVX512-LABEL: test_fixed_v2i64:
251 ; AVX512:       # %bb.0:
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
256 ; AVX512-NEXT:    retq
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
261   ret <2 x i64> %res
264 define <2 x i64> @test_ext_v2i64(<2 x i64> %a0, <2 x i64> %a1) nounwind {
265 ; SSE2-LABEL: test_ext_v2i64:
266 ; SSE2:       # %bb.0:
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
276 ; SSE2-NEXT:    retq
278 ; SSE4-LABEL: test_ext_v2i64:
279 ; SSE4:       # %bb.0:
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
288 ; SSE4-NEXT:    retq
290 ; AVX1-LABEL: test_ext_v2i64:
291 ; AVX1:       # %bb.0:
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
298 ; AVX1-NEXT:    retq
300 ; AVX2-LABEL: test_ext_v2i64:
301 ; AVX2:       # %bb.0:
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
308 ; AVX2-NEXT:    retq
310 ; AVX512-LABEL: test_ext_v2i64:
311 ; AVX512:       # %bb.0:
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
316 ; AVX512-NEXT:    retq
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>
323   ret <2 x i64> %res
327 ; 256-bit vectors
330 define <32 x i8> @test_fixed_v32i8(<32 x i8> %a0, <32 x i8> %a1) nounwind {
331 ; SSE-LABEL: test_fixed_v32i8:
332 ; SSE:       # %bb.0:
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
342 ; SSE-NEXT:    retq
344 ; AVX1-LABEL: test_fixed_v32i8:
345 ; AVX1:       # %bb.0:
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
355 ; AVX1-NEXT:    retq
357 ; AVX2-LABEL: test_fixed_v32i8:
358 ; AVX2:       # %bb.0:
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
364 ; AVX2-NEXT:    retq
366 ; AVX512-LABEL: test_fixed_v32i8:
367 ; AVX512:       # %bb.0:
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
373 ; AVX512-NEXT:    retq
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
378   ret <32 x i8> %res
381 define <32 x i8> @test_ext_v32i8(<32 x i8> %a0, <32 x i8> %a1) nounwind {
382 ; SSE-LABEL: test_ext_v32i8:
383 ; SSE:       # %bb.0:
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
393 ; SSE-NEXT:    retq
395 ; AVX1-LABEL: test_ext_v32i8:
396 ; AVX1:       # %bb.0:
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
406 ; AVX1-NEXT:    retq
408 ; AVX2-LABEL: test_ext_v32i8:
409 ; AVX2:       # %bb.0:
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
415 ; AVX2-NEXT:    retq
417 ; AVX512-LABEL: test_ext_v32i8:
418 ; AVX512:       # %bb.0:
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
424 ; AVX512-NEXT:    retq
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>
431   ret <32 x i8> %res
434 define <16 x i16> @test_fixed_v16i16(<16 x i16> %a0, <16 x i16> %a1) nounwind {
435 ; SSE-LABEL: test_fixed_v16i16:
436 ; SSE:       # %bb.0:
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
449 ; SSE-NEXT:    retq
451 ; AVX1-LABEL: test_fixed_v16i16:
452 ; AVX1:       # %bb.0:
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
462 ; AVX1-NEXT:    retq
464 ; AVX2-LABEL: test_fixed_v16i16:
465 ; AVX2:       # %bb.0:
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
470 ; AVX2-NEXT:    retq
472 ; AVX512-LABEL: test_fixed_v16i16:
473 ; AVX512:       # %bb.0:
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
478 ; AVX512-NEXT:    retq
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
483   ret <16 x i16> %res
486 define <16 x i16> @test_ext_v16i16(<16 x i16> %a0, <16 x i16> %a1) nounwind {
487 ; SSE-LABEL: test_ext_v16i16:
488 ; SSE:       # %bb.0:
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
501 ; SSE-NEXT:    retq
503 ; AVX1-LABEL: test_ext_v16i16:
504 ; AVX1:       # %bb.0:
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
514 ; AVX1-NEXT:    retq
516 ; AVX2-LABEL: test_ext_v16i16:
517 ; AVX2:       # %bb.0:
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
522 ; AVX2-NEXT:    retq
524 ; AVX512-LABEL: test_ext_v16i16:
525 ; AVX512:       # %bb.0:
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
530 ; AVX512-NEXT:    retq
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>
537   ret <16 x i16> %res
540 define <8 x i32> @test_fixed_v8i32(<8 x i32> %a0, <8 x i32> %a1) nounwind {
541 ; SSE-LABEL: test_fixed_v8i32:
542 ; SSE:       # %bb.0:
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
555 ; SSE-NEXT:    retq
557 ; AVX1-LABEL: test_fixed_v8i32:
558 ; AVX1:       # %bb.0:
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
568 ; AVX1-NEXT:    retq
570 ; AVX2-LABEL: test_fixed_v8i32:
571 ; AVX2:       # %bb.0:
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
576 ; AVX2-NEXT:    retq
578 ; AVX512-LABEL: test_fixed_v8i32:
579 ; AVX512:       # %bb.0:
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
584 ; AVX512-NEXT:    retq
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
589   ret <8 x i32> %res
592 define <8 x i32> @test_ext_v8i32(<8 x i32> %a0, <8 x i32> %a1) nounwind {
593 ; SSE-LABEL: test_ext_v8i32:
594 ; SSE:       # %bb.0:
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
607 ; SSE-NEXT:    retq
609 ; AVX1-LABEL: test_ext_v8i32:
610 ; AVX1:       # %bb.0:
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
620 ; AVX1-NEXT:    retq
622 ; AVX2-LABEL: test_ext_v8i32:
623 ; AVX2:       # %bb.0:
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
628 ; AVX2-NEXT:    retq
630 ; AVX512-LABEL: test_ext_v8i32:
631 ; AVX512:       # %bb.0:
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
636 ; AVX512-NEXT:    retq
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>
643   ret <8 x i32> %res
646 define <4 x i64> @test_fixed_v4i64(<4 x i64> %a0, <4 x i64> %a1) nounwind {
647 ; SSE2-LABEL: test_fixed_v4i64:
648 ; SSE2:       # %bb.0:
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
667 ; SSE2-NEXT:    retq
669 ; SSE4-LABEL: test_fixed_v4i64:
670 ; SSE4:       # %bb.0:
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
687 ; SSE4-NEXT:    retq
689 ; AVX1-LABEL: test_fixed_v4i64:
690 ; AVX1:       # %bb.0:
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
704 ; AVX1-NEXT:    retq
706 ; AVX2-LABEL: test_fixed_v4i64:
707 ; AVX2:       # %bb.0:
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
714 ; AVX2-NEXT:    retq
716 ; AVX512-LABEL: test_fixed_v4i64:
717 ; AVX512:       # %bb.0:
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
722 ; AVX512-NEXT:    retq
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
727   ret <4 x i64> %res
730 define <4 x i64> @test_ext_v4i64(<4 x i64> %a0, <4 x i64> %a1) nounwind {
731 ; SSE2-LABEL: test_ext_v4i64:
732 ; SSE2:       # %bb.0:
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
751 ; SSE2-NEXT:    retq
753 ; SSE4-LABEL: test_ext_v4i64:
754 ; SSE4:       # %bb.0:
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
771 ; SSE4-NEXT:    retq
773 ; AVX1-LABEL: test_ext_v4i64:
774 ; AVX1:       # %bb.0:
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
788 ; AVX1-NEXT:    retq
790 ; AVX2-LABEL: test_ext_v4i64:
791 ; AVX2:       # %bb.0:
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
798 ; AVX2-NEXT:    retq
800 ; AVX512-LABEL: test_ext_v4i64:
801 ; AVX512:       # %bb.0:
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
806 ; AVX512-NEXT:    retq
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>
813   ret <4 x i64> %res
817 ; 512-bit vectors
820 define <64 x i8> @test_fixed_v64i8(<64 x i8> %a0, <64 x i8> %a1) nounwind {
821 ; SSE-LABEL: test_fixed_v64i8:
822 ; SSE:       # %bb.0:
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
840 ; SSE-NEXT:    retq
842 ; AVX1-LABEL: test_fixed_v64i8:
843 ; AVX1:       # %bb.0:
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
861 ; AVX1-NEXT:    retq
863 ; AVX2-LABEL: test_fixed_v64i8:
864 ; AVX2:       # %bb.0:
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
874 ; AVX2-NEXT:    retq
876 ; AVX512-LABEL: test_fixed_v64i8:
877 ; AVX512:       # %bb.0:
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
883 ; AVX512-NEXT:    retq
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
888   ret <64 x i8> %res
891 define <64 x i8> @test_ext_v64i8(<64 x i8> %a0, <64 x i8> %a1) nounwind {
892 ; SSE-LABEL: test_ext_v64i8:
893 ; SSE:       # %bb.0:
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
911 ; SSE-NEXT:    retq
913 ; AVX1-LABEL: test_ext_v64i8:
914 ; AVX1:       # %bb.0:
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
932 ; AVX1-NEXT:    retq
934 ; AVX2-LABEL: test_ext_v64i8:
935 ; AVX2:       # %bb.0:
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
945 ; AVX2-NEXT:    retq
947 ; AVX512-LABEL: test_ext_v64i8:
948 ; AVX512:       # %bb.0:
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
954 ; AVX512-NEXT:    retq
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>
961   ret <64 x i8> %res
964 define <32 x i16> @test_fixed_v32i16(<32 x i16> %a0, <32 x i16> %a1) nounwind {
965 ; SSE-LABEL: test_fixed_v32i16:
966 ; SSE:       # %bb.0:
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
991 ; SSE-NEXT:    retq
993 ; AVX1-LABEL: test_fixed_v32i16:
994 ; AVX1:       # %bb.0:
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
1013 ; AVX1-NEXT:    retq
1015 ; AVX2-LABEL: test_fixed_v32i16:
1016 ; AVX2:       # %bb.0:
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
1025 ; AVX2-NEXT:    retq
1027 ; AVX512-LABEL: test_fixed_v32i16:
1028 ; AVX512:       # %bb.0:
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
1033 ; AVX512-NEXT:    retq
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
1038   ret <32 x i16> %res
1041 define <32 x i16> @test_ext_v32i16(<32 x i16> %a0, <32 x i16> %a1) nounwind {
1042 ; SSE-LABEL: test_ext_v32i16:
1043 ; SSE:       # %bb.0:
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
1068 ; SSE-NEXT:    retq
1070 ; AVX1-LABEL: test_ext_v32i16:
1071 ; AVX1:       # %bb.0:
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
1090 ; AVX1-NEXT:    retq
1092 ; AVX2-LABEL: test_ext_v32i16:
1093 ; AVX2:       # %bb.0:
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
1102 ; AVX2-NEXT:    retq
1104 ; AVX512-LABEL: test_ext_v32i16:
1105 ; AVX512:       # %bb.0:
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
1110 ; AVX512-NEXT:    retq
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>
1117   ret <32 x i16> %res
1120 define <16 x i32> @test_fixed_v16i32(<16 x i32> %a0, <16 x i32> %a1) nounwind {
1121 ; SSE-LABEL: test_fixed_v16i32:
1122 ; SSE:       # %bb.0:
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
1147 ; SSE-NEXT:    retq
1149 ; AVX1-LABEL: test_fixed_v16i32:
1150 ; AVX1:       # %bb.0:
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
1169 ; AVX1-NEXT:    retq
1171 ; AVX2-LABEL: test_fixed_v16i32:
1172 ; AVX2:       # %bb.0:
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
1181 ; AVX2-NEXT:    retq
1183 ; AVX512-LABEL: test_fixed_v16i32:
1184 ; AVX512:       # %bb.0:
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
1189 ; AVX512-NEXT:    retq
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
1194   ret <16 x i32> %res
1197 define <16 x i32> @test_ext_v16i32(<16 x i32> %a0, <16 x i32> %a1) nounwind {
1198 ; SSE-LABEL: test_ext_v16i32:
1199 ; SSE:       # %bb.0:
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
1224 ; SSE-NEXT:    retq
1226 ; AVX1-LABEL: test_ext_v16i32:
1227 ; AVX1:       # %bb.0:
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
1246 ; AVX1-NEXT:    retq
1248 ; AVX2-LABEL: test_ext_v16i32:
1249 ; AVX2:       # %bb.0:
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
1258 ; AVX2-NEXT:    retq
1260 ; AVX512-LABEL: test_ext_v16i32:
1261 ; AVX512:       # %bb.0:
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
1266 ; AVX512-NEXT:    retq
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>
1273   ret <16 x i32> %res
1276 define <8 x i64> @test_fixed_v8i64(<8 x i64> %a0, <8 x i64> %a1) nounwind {
1277 ; SSE2-LABEL: test_fixed_v8i64:
1278 ; SSE2:       # %bb.0:
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
1315 ; SSE2-NEXT:    retq
1317 ; SSE4-LABEL: test_fixed_v8i64:
1318 ; SSE4:       # %bb.0:
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
1351 ; SSE4-NEXT:    retq
1353 ; AVX1-LABEL: test_fixed_v8i64:
1354 ; AVX1:       # %bb.0:
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
1381 ; AVX1-NEXT:    retq
1383 ; AVX2-LABEL: test_fixed_v8i64:
1384 ; AVX2:       # %bb.0:
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
1397 ; AVX2-NEXT:    retq
1399 ; AVX512-LABEL: test_fixed_v8i64:
1400 ; AVX512:       # %bb.0:
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
1405 ; AVX512-NEXT:    retq
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
1410   ret <8 x i64> %res
1413 define <8 x i64> @test_ext_v8i64(<8 x i64> %a0, <8 x i64> %a1) nounwind {
1414 ; SSE2-LABEL: test_ext_v8i64:
1415 ; SSE2:       # %bb.0:
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
1452 ; SSE2-NEXT:    retq
1454 ; SSE4-LABEL: test_ext_v8i64:
1455 ; SSE4:       # %bb.0:
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
1488 ; SSE4-NEXT:    retq
1490 ; AVX1-LABEL: test_ext_v8i64:
1491 ; AVX1:       # %bb.0:
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
1518 ; AVX1-NEXT:    retq
1520 ; AVX2-LABEL: test_ext_v8i64:
1521 ; AVX2:       # %bb.0:
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
1534 ; AVX2-NEXT:    retq
1536 ; AVX512-LABEL: test_ext_v8i64:
1537 ; AVX512:       # %bb.0:
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
1542 ; AVX512-NEXT:    retq
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>
1549   ret <8 x i64> %res