Revert " [LoongArch][ISel] Check the number of sign bits in `PatGprGpr_32` (#107432)"
[llvm-project.git] / llvm / test / CodeGen / X86 / avgflooru.ll
blob82a0796b116ee09226d173c0d10051b40a1a28fa
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 %xmm0, %xmm2
16 ; SSE-NEXT:    pand %xmm1, %xmm2
17 ; SSE-NEXT:    pxor %xmm1, %xmm0
18 ; SSE-NEXT:    psrlw $1, %xmm0
19 ; SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
20 ; SSE-NEXT:    paddb %xmm2, %xmm0
21 ; SSE-NEXT:    retq
23 ; AVX1-LABEL: test_fixed_v16i8:
24 ; AVX1:       # %bb.0:
25 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm2
26 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
27 ; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm0
28 ; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
29 ; AVX1-NEXT:    vpaddb %xmm0, %xmm2, %xmm0
30 ; AVX1-NEXT:    retq
32 ; AVX2-LABEL: test_fixed_v16i8:
33 ; AVX2:       # %bb.0:
34 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm2
35 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
36 ; AVX2-NEXT:    vpsrlw $1, %xmm0, %xmm0
37 ; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
38 ; AVX2-NEXT:    vpaddb %xmm0, %xmm2, %xmm0
39 ; AVX2-NEXT:    retq
41 ; AVX512-LABEL: test_fixed_v16i8:
42 ; AVX512:       # %bb.0:
43 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm2
44 ; AVX512-NEXT:    vpxor %xmm1, %xmm0, %xmm0
45 ; AVX512-NEXT:    vpsrlw $1, %xmm0, %xmm0
46 ; AVX512-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
47 ; AVX512-NEXT:    vpaddb %xmm0, %xmm2, %xmm0
48 ; AVX512-NEXT:    retq
49   %and = and <16 x i8> %a0, %a1
50   %xor = xor <16 x i8> %a0, %a1
51   %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>
52   %res = add <16 x i8> %and, %shift
53   ret <16 x i8> %res
56 define <16 x i8> @test_ext_v16i8(<16 x i8> %a0, <16 x i8> %a1) nounwind {
57 ; SSE-LABEL: test_ext_v16i8:
58 ; SSE:       # %bb.0:
59 ; SSE-NEXT:    movdqa %xmm0, %xmm2
60 ; SSE-NEXT:    pand %xmm1, %xmm2
61 ; SSE-NEXT:    pxor %xmm1, %xmm0
62 ; SSE-NEXT:    psrlw $1, %xmm0
63 ; SSE-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
64 ; SSE-NEXT:    paddb %xmm2, %xmm0
65 ; SSE-NEXT:    retq
67 ; AVX1-LABEL: test_ext_v16i8:
68 ; AVX1:       # %bb.0:
69 ; AVX1-NEXT:    vpand %xmm1, %xmm0, %xmm2
70 ; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
71 ; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm0
72 ; AVX1-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
73 ; AVX1-NEXT:    vpaddb %xmm0, %xmm2, %xmm0
74 ; AVX1-NEXT:    retq
76 ; AVX2-LABEL: test_ext_v16i8:
77 ; AVX2:       # %bb.0:
78 ; AVX2-NEXT:    vpand %xmm1, %xmm0, %xmm2
79 ; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
80 ; AVX2-NEXT:    vpsrlw $1, %xmm0, %xmm0
81 ; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
82 ; AVX2-NEXT:    vpaddb %xmm0, %xmm2, %xmm0
83 ; AVX2-NEXT:    retq
85 ; AVX512-LABEL: test_ext_v16i8:
86 ; AVX512:       # %bb.0:
87 ; AVX512-NEXT:    vpand %xmm1, %xmm0, %xmm2
88 ; AVX512-NEXT:    vpxor %xmm1, %xmm0, %xmm0
89 ; AVX512-NEXT:    vpsrlw $1, %xmm0, %xmm0
90 ; AVX512-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
91 ; AVX512-NEXT:    vpaddb %xmm0, %xmm2, %xmm0
92 ; AVX512-NEXT:    retq
93   %x0 = zext <16 x i8> %a0 to <16 x i16>
94   %x1 = zext <16 x i8> %a1 to <16 x i16>
95   %sum = add <16 x i16> %x0, %x1
96   %shift = lshr <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>
97   %res = trunc <16 x i16> %shift to <16 x i8>
98   ret <16 x i8> %res
101 define <8 x i16> @test_fixed_v8i16(<8 x i16> %a0, <8 x i16> %a1) nounwind {
102 ; SSE-LABEL: test_fixed_v8i16:
103 ; SSE:       # %bb.0:
104 ; SSE-NEXT:    movdqa %xmm0, %xmm2
105 ; SSE-NEXT:    pand %xmm1, %xmm2
106 ; SSE-NEXT:    pxor %xmm1, %xmm0
107 ; SSE-NEXT:    psrlw $1, %xmm0
108 ; SSE-NEXT:    paddw %xmm2, %xmm0
109 ; SSE-NEXT:    retq
111 ; AVX-LABEL: test_fixed_v8i16:
112 ; AVX:       # %bb.0:
113 ; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm2
114 ; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
115 ; AVX-NEXT:    vpsrlw $1, %xmm0, %xmm0
116 ; AVX-NEXT:    vpaddw %xmm0, %xmm2, %xmm0
117 ; AVX-NEXT:    retq
118   %and = and <8 x i16> %a0, %a1
119   %xor = xor <8 x i16> %a1, %a0
120   %shift = lshr <8 x i16> %xor, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>
121   %res = add <8 x i16> %and, %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:    pand %xmm1, %xmm2
130 ; SSE-NEXT:    pxor %xmm1, %xmm0
131 ; SSE-NEXT:    psrlw $1, %xmm0
132 ; SSE-NEXT:    paddw %xmm2, %xmm0
133 ; SSE-NEXT:    retq
135 ; AVX-LABEL: test_ext_v8i16:
136 ; AVX:       # %bb.0:
137 ; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm2
138 ; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
139 ; AVX-NEXT:    vpsrlw $1, %xmm0, %xmm0
140 ; AVX-NEXT:    vpaddw %xmm0, %xmm2, %xmm0
141 ; AVX-NEXT:    retq
142   %x0 = zext <8 x i16> %a0 to <8 x i32>
143   %x1 = zext <8 x i16> %a1 to <8 x i32>
144   %sum = add <8 x i32> %x0, %x1
145   %shift = lshr <8 x i32> %sum, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
146   %res = trunc <8 x i32> %shift to <8 x i16>
147   ret <8 x i16> %res
150 define <4 x i32> @test_fixed_v4i32(<4 x i32> %a0, <4 x i32> %a1) nounwind {
151 ; SSE-LABEL: test_fixed_v4i32:
152 ; SSE:       # %bb.0:
153 ; SSE-NEXT:    movdqa %xmm0, %xmm2
154 ; SSE-NEXT:    pand %xmm1, %xmm2
155 ; SSE-NEXT:    pxor %xmm1, %xmm0
156 ; SSE-NEXT:    psrld $1, %xmm0
157 ; SSE-NEXT:    paddd %xmm2, %xmm0
158 ; SSE-NEXT:    retq
160 ; AVX-LABEL: test_fixed_v4i32:
161 ; AVX:       # %bb.0:
162 ; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm2
163 ; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
164 ; AVX-NEXT:    vpsrld $1, %xmm0, %xmm0
165 ; AVX-NEXT:    vpaddd %xmm0, %xmm2, %xmm0
166 ; AVX-NEXT:    retq
167   %and = and <4 x i32> %a0, %a1
168   %xor = xor <4 x i32> %a1, %a0
169   %shift = lshr <4 x i32> %xor, <i32 1, i32 1, i32 1, i32 1>
170   %res = add <4 x i32> %and, %shift
171   ret <4 x i32> %res
174 define <4 x i32> @test_ext_v4i32(<4 x i32> %a0, <4 x i32> %a1) nounwind {
175 ; SSE-LABEL: test_ext_v4i32:
176 ; SSE:       # %bb.0:
177 ; SSE-NEXT:    movdqa %xmm0, %xmm2
178 ; SSE-NEXT:    pand %xmm1, %xmm2
179 ; SSE-NEXT:    pxor %xmm1, %xmm0
180 ; SSE-NEXT:    psrld $1, %xmm0
181 ; SSE-NEXT:    paddd %xmm2, %xmm0
182 ; SSE-NEXT:    retq
184 ; AVX-LABEL: test_ext_v4i32:
185 ; AVX:       # %bb.0:
186 ; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm2
187 ; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
188 ; AVX-NEXT:    vpsrld $1, %xmm0, %xmm0
189 ; AVX-NEXT:    vpaddd %xmm0, %xmm2, %xmm0
190 ; AVX-NEXT:    retq
191   %x0 = zext <4 x i32> %a0 to <4 x i64>
192   %x1 = zext <4 x i32> %a1 to <4 x i64>
193   %sum = add <4 x i64> %x0, %x1
194   %shift = lshr <4 x i64> %sum, <i64 1, i64 1, i64 1, i64 1>
195   %res = trunc <4 x i64> %shift to <4 x i32>
196   ret <4 x i32> %res
199 define <2 x i64> @test_fixed_v2i64(<2 x i64> %a0, <2 x i64> %a1) nounwind {
200 ; SSE-LABEL: test_fixed_v2i64:
201 ; SSE:       # %bb.0:
202 ; SSE-NEXT:    movdqa %xmm0, %xmm2
203 ; SSE-NEXT:    pand %xmm1, %xmm2
204 ; SSE-NEXT:    pxor %xmm1, %xmm0
205 ; SSE-NEXT:    psrlq $1, %xmm0
206 ; SSE-NEXT:    paddq %xmm2, %xmm0
207 ; SSE-NEXT:    retq
209 ; AVX-LABEL: test_fixed_v2i64:
210 ; AVX:       # %bb.0:
211 ; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm2
212 ; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
213 ; AVX-NEXT:    vpsrlq $1, %xmm0, %xmm0
214 ; AVX-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
215 ; AVX-NEXT:    retq
216   %and = and <2 x i64> %a0, %a1
217   %xor = xor <2 x i64> %a1, %a0
218   %shift = lshr <2 x i64> %xor, <i64 1, i64 1>
219   %res = add <2 x i64> %and, %shift
220   ret <2 x i64> %res
223 define <2 x i64> @test_ext_v2i64(<2 x i64> %a0, <2 x i64> %a1) nounwind {
224 ; SSE-LABEL: test_ext_v2i64:
225 ; SSE:       # %bb.0:
226 ; SSE-NEXT:    movdqa %xmm0, %xmm2
227 ; SSE-NEXT:    pand %xmm1, %xmm2
228 ; SSE-NEXT:    pxor %xmm1, %xmm0
229 ; SSE-NEXT:    psrlq $1, %xmm0
230 ; SSE-NEXT:    paddq %xmm2, %xmm0
231 ; SSE-NEXT:    retq
233 ; AVX-LABEL: test_ext_v2i64:
234 ; AVX:       # %bb.0:
235 ; AVX-NEXT:    vpand %xmm1, %xmm0, %xmm2
236 ; AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
237 ; AVX-NEXT:    vpsrlq $1, %xmm0, %xmm0
238 ; AVX-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
239 ; AVX-NEXT:    retq
240   %x0 = zext <2 x i64> %a0 to <2 x i128>
241   %x1 = zext <2 x i64> %a1 to <2 x i128>
242   %sum = add <2 x i128> %x0, %x1
243   %shift = lshr <2 x i128> %sum, <i128 1, i128 1>
244   %res = trunc <2 x i128> %shift to <2 x i64>
245   ret <2 x i64> %res
249 ; 256-bit vectors
252 define <32 x i8> @test_fixed_v32i8(<32 x i8> %a0, <32 x i8> %a1) nounwind {
253 ; SSE-LABEL: test_fixed_v32i8:
254 ; SSE:       # %bb.0:
255 ; SSE-NEXT:    movdqa %xmm0, %xmm4
256 ; SSE-NEXT:    pand %xmm2, %xmm4
257 ; SSE-NEXT:    pxor %xmm2, %xmm0
258 ; SSE-NEXT:    psrlw $1, %xmm0
259 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
260 ; SSE-NEXT:    pand %xmm2, %xmm0
261 ; SSE-NEXT:    paddb %xmm4, %xmm0
262 ; SSE-NEXT:    movdqa %xmm1, %xmm4
263 ; SSE-NEXT:    pand %xmm3, %xmm4
264 ; SSE-NEXT:    pxor %xmm3, %xmm1
265 ; SSE-NEXT:    psrlw $1, %xmm1
266 ; SSE-NEXT:    pand %xmm2, %xmm1
267 ; SSE-NEXT:    paddb %xmm4, %xmm1
268 ; SSE-NEXT:    retq
270 ; AVX1-LABEL: test_fixed_v32i8:
271 ; AVX1:       # %bb.0:
272 ; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm2
273 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
274 ; AVX1-NEXT:    vpsrlw $1, %xmm3, %xmm3
275 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm4 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
276 ; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
277 ; AVX1-NEXT:    vandps %ymm1, %ymm0, %ymm0
278 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
279 ; AVX1-NEXT:    vpaddb %xmm3, %xmm1, %xmm1
280 ; AVX1-NEXT:    vpsrlw $1, %xmm2, %xmm2
281 ; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm2
282 ; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
283 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
284 ; AVX1-NEXT:    retq
286 ; AVX2-LABEL: test_fixed_v32i8:
287 ; AVX2:       # %bb.0:
288 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2
289 ; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
290 ; AVX2-NEXT:    vpsrlw $1, %ymm0, %ymm0
291 ; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
292 ; AVX2-NEXT:    vpaddb %ymm0, %ymm2, %ymm0
293 ; AVX2-NEXT:    retq
295 ; AVX512-LABEL: test_fixed_v32i8:
296 ; AVX512:       # %bb.0:
297 ; AVX512-NEXT:    vpand %ymm1, %ymm0, %ymm2
298 ; AVX512-NEXT:    vpxor %ymm1, %ymm0, %ymm0
299 ; AVX512-NEXT:    vpsrlw $1, %ymm0, %ymm0
300 ; AVX512-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm0
301 ; AVX512-NEXT:    vpaddb %ymm0, %ymm2, %ymm0
302 ; AVX512-NEXT:    retq
303   %and = and <32 x i8> %a0, %a1
304   %xor = xor <32 x i8> %a0, %a1
305   %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>
306   %res = add <32 x i8> %and, %shift
307   ret <32 x i8> %res
310 define <32 x i8> @test_ext_v32i8(<32 x i8> %a0, <32 x i8> %a1) nounwind {
311 ; SSE-LABEL: test_ext_v32i8:
312 ; SSE:       # %bb.0:
313 ; SSE-NEXT:    movdqa %xmm0, %xmm4
314 ; SSE-NEXT:    pand %xmm2, %xmm4
315 ; SSE-NEXT:    pxor %xmm2, %xmm0
316 ; SSE-NEXT:    psrlw $1, %xmm0
317 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
318 ; SSE-NEXT:    pand %xmm2, %xmm0
319 ; SSE-NEXT:    paddb %xmm4, %xmm0
320 ; SSE-NEXT:    movdqa %xmm1, %xmm4
321 ; SSE-NEXT:    pand %xmm3, %xmm4
322 ; SSE-NEXT:    pxor %xmm3, %xmm1
323 ; SSE-NEXT:    psrlw $1, %xmm1
324 ; SSE-NEXT:    pand %xmm2, %xmm1
325 ; SSE-NEXT:    paddb %xmm4, %xmm1
326 ; SSE-NEXT:    retq
328 ; AVX1-LABEL: test_ext_v32i8:
329 ; AVX1:       # %bb.0:
330 ; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm2
331 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
332 ; AVX1-NEXT:    vpsrlw $1, %xmm3, %xmm3
333 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm4 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
334 ; AVX1-NEXT:    vpand %xmm4, %xmm3, %xmm3
335 ; AVX1-NEXT:    vandps %ymm1, %ymm0, %ymm0
336 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
337 ; AVX1-NEXT:    vpaddb %xmm3, %xmm1, %xmm1
338 ; AVX1-NEXT:    vpsrlw $1, %xmm2, %xmm2
339 ; AVX1-NEXT:    vpand %xmm4, %xmm2, %xmm2
340 ; AVX1-NEXT:    vpaddb %xmm2, %xmm0, %xmm0
341 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
342 ; AVX1-NEXT:    retq
344 ; AVX2-LABEL: test_ext_v32i8:
345 ; AVX2:       # %bb.0:
346 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2
347 ; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
348 ; AVX2-NEXT:    vpsrlw $1, %ymm0, %ymm0
349 ; AVX2-NEXT:    vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
350 ; AVX2-NEXT:    vpaddb %ymm0, %ymm2, %ymm0
351 ; AVX2-NEXT:    retq
353 ; AVX512-LABEL: test_ext_v32i8:
354 ; AVX512:       # %bb.0:
355 ; AVX512-NEXT:    vpand %ymm1, %ymm0, %ymm2
356 ; AVX512-NEXT:    vpxor %ymm1, %ymm0, %ymm0
357 ; AVX512-NEXT:    vpsrlw $1, %ymm0, %ymm0
358 ; AVX512-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm0
359 ; AVX512-NEXT:    vpaddb %ymm0, %ymm2, %ymm0
360 ; AVX512-NEXT:    retq
361   %x0 = zext <32 x i8> %a0 to <32 x i16>
362   %x1 = zext <32 x i8> %a1 to <32 x i16>
363   %sum = add <32 x i16> %x0, %x1
364   %shift = lshr <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>
365   %res = trunc <32 x i16> %shift to <32 x i8>
366   ret <32 x i8> %res
369 define <16 x i16> @test_fixed_v16i16(<16 x i16> %a0, <16 x i16> %a1) nounwind {
370 ; SSE-LABEL: test_fixed_v16i16:
371 ; SSE:       # %bb.0:
372 ; SSE-NEXT:    movdqa %xmm0, %xmm4
373 ; SSE-NEXT:    pand %xmm2, %xmm4
374 ; SSE-NEXT:    pxor %xmm2, %xmm0
375 ; SSE-NEXT:    psrlw $1, %xmm0
376 ; SSE-NEXT:    paddw %xmm4, %xmm0
377 ; SSE-NEXT:    movdqa %xmm1, %xmm2
378 ; SSE-NEXT:    pand %xmm3, %xmm2
379 ; SSE-NEXT:    pxor %xmm3, %xmm1
380 ; SSE-NEXT:    psrlw $1, %xmm1
381 ; SSE-NEXT:    paddw %xmm2, %xmm1
382 ; SSE-NEXT:    retq
384 ; AVX1-LABEL: test_fixed_v16i16:
385 ; AVX1:       # %bb.0:
386 ; AVX1-NEXT:    vandps %ymm1, %ymm0, %ymm2
387 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
388 ; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
389 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
390 ; AVX1-NEXT:    vpsrlw $1, %xmm1, %xmm1
391 ; AVX1-NEXT:    vpaddw %xmm1, %xmm3, %xmm1
392 ; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm0
393 ; AVX1-NEXT:    vpaddw %xmm0, %xmm2, %xmm0
394 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
395 ; AVX1-NEXT:    retq
397 ; AVX2-LABEL: test_fixed_v16i16:
398 ; AVX2:       # %bb.0:
399 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2
400 ; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
401 ; AVX2-NEXT:    vpsrlw $1, %ymm0, %ymm0
402 ; AVX2-NEXT:    vpaddw %ymm0, %ymm2, %ymm0
403 ; AVX2-NEXT:    retq
405 ; AVX512-LABEL: test_fixed_v16i16:
406 ; AVX512:       # %bb.0:
407 ; AVX512-NEXT:    vpand %ymm1, %ymm0, %ymm2
408 ; AVX512-NEXT:    vpxor %ymm1, %ymm0, %ymm0
409 ; AVX512-NEXT:    vpsrlw $1, %ymm0, %ymm0
410 ; AVX512-NEXT:    vpaddw %ymm0, %ymm2, %ymm0
411 ; AVX512-NEXT:    retq
412   %and = and <16 x i16> %a0, %a1
413   %xor = xor <16 x i16> %a1, %a0
414   %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>
415   %res = add <16 x i16> %and, %shift
416   ret <16 x i16> %res
419 define <16 x i16> @test_ext_v16i16(<16 x i16> %a0, <16 x i16> %a1) nounwind {
420 ; SSE-LABEL: test_ext_v16i16:
421 ; SSE:       # %bb.0:
422 ; SSE-NEXT:    movdqa %xmm0, %xmm4
423 ; SSE-NEXT:    pand %xmm2, %xmm4
424 ; SSE-NEXT:    pxor %xmm2, %xmm0
425 ; SSE-NEXT:    psrlw $1, %xmm0
426 ; SSE-NEXT:    paddw %xmm4, %xmm0
427 ; SSE-NEXT:    movdqa %xmm1, %xmm2
428 ; SSE-NEXT:    pand %xmm3, %xmm2
429 ; SSE-NEXT:    pxor %xmm3, %xmm1
430 ; SSE-NEXT:    psrlw $1, %xmm1
431 ; SSE-NEXT:    paddw %xmm2, %xmm1
432 ; SSE-NEXT:    retq
434 ; AVX1-LABEL: test_ext_v16i16:
435 ; AVX1:       # %bb.0:
436 ; AVX1-NEXT:    vandps %ymm1, %ymm0, %ymm2
437 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
438 ; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
439 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
440 ; AVX1-NEXT:    vpsrlw $1, %xmm1, %xmm1
441 ; AVX1-NEXT:    vpaddw %xmm1, %xmm3, %xmm1
442 ; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm0
443 ; AVX1-NEXT:    vpaddw %xmm0, %xmm2, %xmm0
444 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
445 ; AVX1-NEXT:    retq
447 ; AVX2-LABEL: test_ext_v16i16:
448 ; AVX2:       # %bb.0:
449 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2
450 ; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
451 ; AVX2-NEXT:    vpsrlw $1, %ymm0, %ymm0
452 ; AVX2-NEXT:    vpaddw %ymm0, %ymm2, %ymm0
453 ; AVX2-NEXT:    retq
455 ; AVX512-LABEL: test_ext_v16i16:
456 ; AVX512:       # %bb.0:
457 ; AVX512-NEXT:    vpand %ymm1, %ymm0, %ymm2
458 ; AVX512-NEXT:    vpxor %ymm1, %ymm0, %ymm0
459 ; AVX512-NEXT:    vpsrlw $1, %ymm0, %ymm0
460 ; AVX512-NEXT:    vpaddw %ymm0, %ymm2, %ymm0
461 ; AVX512-NEXT:    retq
462   %x0 = zext <16 x i16> %a0 to <16 x i32>
463   %x1 = zext <16 x i16> %a1 to <16 x i32>
464   %sum = add <16 x i32> %x0, %x1
465   %shift = lshr <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>
466   %res = trunc <16 x i32> %shift to <16 x i16>
467   ret <16 x i16> %res
470 define <8 x i32> @test_fixed_v8i32(<8 x i32> %a0, <8 x i32> %a1) nounwind {
471 ; SSE-LABEL: test_fixed_v8i32:
472 ; SSE:       # %bb.0:
473 ; SSE-NEXT:    movdqa %xmm0, %xmm4
474 ; SSE-NEXT:    pand %xmm2, %xmm4
475 ; SSE-NEXT:    pxor %xmm2, %xmm0
476 ; SSE-NEXT:    psrld $1, %xmm0
477 ; SSE-NEXT:    paddd %xmm4, %xmm0
478 ; SSE-NEXT:    movdqa %xmm1, %xmm2
479 ; SSE-NEXT:    pand %xmm3, %xmm2
480 ; SSE-NEXT:    pxor %xmm3, %xmm1
481 ; SSE-NEXT:    psrld $1, %xmm1
482 ; SSE-NEXT:    paddd %xmm2, %xmm1
483 ; SSE-NEXT:    retq
485 ; AVX1-LABEL: test_fixed_v8i32:
486 ; AVX1:       # %bb.0:
487 ; AVX1-NEXT:    vandps %ymm1, %ymm0, %ymm2
488 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
489 ; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
490 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
491 ; AVX1-NEXT:    vpsrld $1, %xmm1, %xmm1
492 ; AVX1-NEXT:    vpaddd %xmm1, %xmm3, %xmm1
493 ; AVX1-NEXT:    vpsrld $1, %xmm0, %xmm0
494 ; AVX1-NEXT:    vpaddd %xmm0, %xmm2, %xmm0
495 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
496 ; AVX1-NEXT:    retq
498 ; AVX2-LABEL: test_fixed_v8i32:
499 ; AVX2:       # %bb.0:
500 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2
501 ; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
502 ; AVX2-NEXT:    vpsrld $1, %ymm0, %ymm0
503 ; AVX2-NEXT:    vpaddd %ymm0, %ymm2, %ymm0
504 ; AVX2-NEXT:    retq
506 ; AVX512-LABEL: test_fixed_v8i32:
507 ; AVX512:       # %bb.0:
508 ; AVX512-NEXT:    vpand %ymm1, %ymm0, %ymm2
509 ; AVX512-NEXT:    vpxor %ymm1, %ymm0, %ymm0
510 ; AVX512-NEXT:    vpsrld $1, %ymm0, %ymm0
511 ; AVX512-NEXT:    vpaddd %ymm0, %ymm2, %ymm0
512 ; AVX512-NEXT:    retq
513   %and = and <8 x i32> %a0, %a1
514   %xor = xor <8 x i32> %a1, %a0
515   %shift = lshr <8 x i32> %xor, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
516   %res = add <8 x i32> %and, %shift
517   ret <8 x i32> %res
520 define <8 x i32> @test_ext_v8i32(<8 x i32> %a0, <8 x i32> %a1) nounwind {
521 ; SSE-LABEL: test_ext_v8i32:
522 ; SSE:       # %bb.0:
523 ; SSE-NEXT:    movdqa %xmm0, %xmm4
524 ; SSE-NEXT:    pand %xmm2, %xmm4
525 ; SSE-NEXT:    pxor %xmm2, %xmm0
526 ; SSE-NEXT:    psrld $1, %xmm0
527 ; SSE-NEXT:    paddd %xmm4, %xmm0
528 ; SSE-NEXT:    movdqa %xmm1, %xmm2
529 ; SSE-NEXT:    pand %xmm3, %xmm2
530 ; SSE-NEXT:    pxor %xmm3, %xmm1
531 ; SSE-NEXT:    psrld $1, %xmm1
532 ; SSE-NEXT:    paddd %xmm2, %xmm1
533 ; SSE-NEXT:    retq
535 ; AVX1-LABEL: test_ext_v8i32:
536 ; AVX1:       # %bb.0:
537 ; AVX1-NEXT:    vandps %ymm1, %ymm0, %ymm2
538 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
539 ; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
540 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
541 ; AVX1-NEXT:    vpsrld $1, %xmm1, %xmm1
542 ; AVX1-NEXT:    vpaddd %xmm1, %xmm3, %xmm1
543 ; AVX1-NEXT:    vpsrld $1, %xmm0, %xmm0
544 ; AVX1-NEXT:    vpaddd %xmm0, %xmm2, %xmm0
545 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
546 ; AVX1-NEXT:    retq
548 ; AVX2-LABEL: test_ext_v8i32:
549 ; AVX2:       # %bb.0:
550 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2
551 ; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
552 ; AVX2-NEXT:    vpsrld $1, %ymm0, %ymm0
553 ; AVX2-NEXT:    vpaddd %ymm0, %ymm2, %ymm0
554 ; AVX2-NEXT:    retq
556 ; AVX512-LABEL: test_ext_v8i32:
557 ; AVX512:       # %bb.0:
558 ; AVX512-NEXT:    vpand %ymm1, %ymm0, %ymm2
559 ; AVX512-NEXT:    vpxor %ymm1, %ymm0, %ymm0
560 ; AVX512-NEXT:    vpsrld $1, %ymm0, %ymm0
561 ; AVX512-NEXT:    vpaddd %ymm0, %ymm2, %ymm0
562 ; AVX512-NEXT:    retq
563   %x0 = zext <8 x i32> %a0 to <8 x i64>
564   %x1 = zext <8 x i32> %a1 to <8 x i64>
565   %sum = add <8 x i64> %x0, %x1
566   %shift = lshr <8 x i64> %sum, <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1>
567   %res = trunc <8 x i64> %shift to <8 x i32>
568   ret <8 x i32> %res
571 define <4 x i64> @test_fixed_v4i64(<4 x i64> %a0, <4 x i64> %a1) nounwind {
572 ; SSE-LABEL: test_fixed_v4i64:
573 ; SSE:       # %bb.0:
574 ; SSE-NEXT:    movdqa %xmm0, %xmm4
575 ; SSE-NEXT:    pand %xmm2, %xmm4
576 ; SSE-NEXT:    pxor %xmm2, %xmm0
577 ; SSE-NEXT:    psrlq $1, %xmm0
578 ; SSE-NEXT:    paddq %xmm4, %xmm0
579 ; SSE-NEXT:    movdqa %xmm1, %xmm2
580 ; SSE-NEXT:    pand %xmm3, %xmm2
581 ; SSE-NEXT:    pxor %xmm3, %xmm1
582 ; SSE-NEXT:    psrlq $1, %xmm1
583 ; SSE-NEXT:    paddq %xmm2, %xmm1
584 ; SSE-NEXT:    retq
586 ; AVX1-LABEL: test_fixed_v4i64:
587 ; AVX1:       # %bb.0:
588 ; AVX1-NEXT:    vandps %ymm1, %ymm0, %ymm2
589 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
590 ; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
591 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
592 ; AVX1-NEXT:    vpsrlq $1, %xmm1, %xmm1
593 ; AVX1-NEXT:    vpaddq %xmm1, %xmm3, %xmm1
594 ; AVX1-NEXT:    vpsrlq $1, %xmm0, %xmm0
595 ; AVX1-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
596 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
597 ; AVX1-NEXT:    retq
599 ; AVX2-LABEL: test_fixed_v4i64:
600 ; AVX2:       # %bb.0:
601 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2
602 ; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
603 ; AVX2-NEXT:    vpsrlq $1, %ymm0, %ymm0
604 ; AVX2-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
605 ; AVX2-NEXT:    retq
607 ; AVX512-LABEL: test_fixed_v4i64:
608 ; AVX512:       # %bb.0:
609 ; AVX512-NEXT:    vpand %ymm1, %ymm0, %ymm2
610 ; AVX512-NEXT:    vpxor %ymm1, %ymm0, %ymm0
611 ; AVX512-NEXT:    vpsrlq $1, %ymm0, %ymm0
612 ; AVX512-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
613 ; AVX512-NEXT:    retq
614   %and = and <4 x i64> %a0, %a1
615   %xor = xor <4 x i64> %a1, %a0
616   %shift = lshr <4 x i64> %xor, <i64 1, i64 1, i64 1, i64 1>
617   %res = add <4 x i64> %and, %shift
618   ret <4 x i64> %res
621 define <4 x i64> @test_ext_v4i64(<4 x i64> %a0, <4 x i64> %a1) nounwind {
622 ; SSE-LABEL: test_ext_v4i64:
623 ; SSE:       # %bb.0:
624 ; SSE-NEXT:    movdqa %xmm0, %xmm4
625 ; SSE-NEXT:    pand %xmm2, %xmm4
626 ; SSE-NEXT:    pxor %xmm2, %xmm0
627 ; SSE-NEXT:    psrlq $1, %xmm0
628 ; SSE-NEXT:    paddq %xmm4, %xmm0
629 ; SSE-NEXT:    movdqa %xmm1, %xmm2
630 ; SSE-NEXT:    pand %xmm3, %xmm2
631 ; SSE-NEXT:    pxor %xmm3, %xmm1
632 ; SSE-NEXT:    psrlq $1, %xmm1
633 ; SSE-NEXT:    paddq %xmm2, %xmm1
634 ; SSE-NEXT:    retq
636 ; AVX1-LABEL: test_ext_v4i64:
637 ; AVX1:       # %bb.0:
638 ; AVX1-NEXT:    vandps %ymm1, %ymm0, %ymm2
639 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
640 ; AVX1-NEXT:    vxorps %ymm1, %ymm0, %ymm0
641 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
642 ; AVX1-NEXT:    vpsrlq $1, %xmm1, %xmm1
643 ; AVX1-NEXT:    vpaddq %xmm1, %xmm3, %xmm1
644 ; AVX1-NEXT:    vpsrlq $1, %xmm0, %xmm0
645 ; AVX1-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
646 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
647 ; AVX1-NEXT:    retq
649 ; AVX2-LABEL: test_ext_v4i64:
650 ; AVX2:       # %bb.0:
651 ; AVX2-NEXT:    vpand %ymm1, %ymm0, %ymm2
652 ; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
653 ; AVX2-NEXT:    vpsrlq $1, %ymm0, %ymm0
654 ; AVX2-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
655 ; AVX2-NEXT:    retq
657 ; AVX512-LABEL: test_ext_v4i64:
658 ; AVX512:       # %bb.0:
659 ; AVX512-NEXT:    vpand %ymm1, %ymm0, %ymm2
660 ; AVX512-NEXT:    vpxor %ymm1, %ymm0, %ymm0
661 ; AVX512-NEXT:    vpsrlq $1, %ymm0, %ymm0
662 ; AVX512-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
663 ; AVX512-NEXT:    retq
664   %x0 = zext <4 x i64> %a0 to <4 x i128>
665   %x1 = zext <4 x i64> %a1 to <4 x i128>
666   %sum = add <4 x i128> %x0, %x1
667   %shift = lshr <4 x i128> %sum, <i128 1, i128 1, i128 1, i128 1>
668   %res = trunc <4 x i128> %shift to <4 x i64>
669   ret <4 x i64> %res
673 ; 512-bit vectors
676 define <64 x i8> @test_fixed_v64i8(<64 x i8> %a0, <64 x i8> %a1) nounwind {
677 ; SSE-LABEL: test_fixed_v64i8:
678 ; SSE:       # %bb.0:
679 ; SSE-NEXT:    movdqa %xmm0, %xmm8
680 ; SSE-NEXT:    pand %xmm4, %xmm8
681 ; SSE-NEXT:    pxor %xmm4, %xmm0
682 ; SSE-NEXT:    psrlw $1, %xmm0
683 ; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
684 ; SSE-NEXT:    pand %xmm4, %xmm0
685 ; SSE-NEXT:    paddb %xmm8, %xmm0
686 ; SSE-NEXT:    movdqa %xmm1, %xmm8
687 ; SSE-NEXT:    pand %xmm5, %xmm8
688 ; SSE-NEXT:    pxor %xmm5, %xmm1
689 ; SSE-NEXT:    psrlw $1, %xmm1
690 ; SSE-NEXT:    pand %xmm4, %xmm1
691 ; SSE-NEXT:    paddb %xmm8, %xmm1
692 ; SSE-NEXT:    movdqa %xmm2, %xmm5
693 ; SSE-NEXT:    pand %xmm6, %xmm5
694 ; SSE-NEXT:    pxor %xmm6, %xmm2
695 ; SSE-NEXT:    psrlw $1, %xmm2
696 ; SSE-NEXT:    pand %xmm4, %xmm2
697 ; SSE-NEXT:    paddb %xmm5, %xmm2
698 ; SSE-NEXT:    movdqa %xmm3, %xmm5
699 ; SSE-NEXT:    pand %xmm7, %xmm5
700 ; SSE-NEXT:    pxor %xmm7, %xmm3
701 ; SSE-NEXT:    psrlw $1, %xmm3
702 ; SSE-NEXT:    pand %xmm4, %xmm3
703 ; SSE-NEXT:    paddb %xmm5, %xmm3
704 ; SSE-NEXT:    retq
706 ; AVX1-LABEL: test_fixed_v64i8:
707 ; AVX1:       # %bb.0:
708 ; AVX1-NEXT:    vxorps %ymm2, %ymm0, %ymm4
709 ; AVX1-NEXT:    vextractf128 $1, %ymm4, %xmm5
710 ; AVX1-NEXT:    vpsrlw $1, %xmm5, %xmm5
711 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm6 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
712 ; AVX1-NEXT:    vpand %xmm6, %xmm5, %xmm5
713 ; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
714 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
715 ; AVX1-NEXT:    vpaddb %xmm5, %xmm2, %xmm2
716 ; AVX1-NEXT:    vpsrlw $1, %xmm4, %xmm4
717 ; AVX1-NEXT:    vpand %xmm6, %xmm4, %xmm4
718 ; AVX1-NEXT:    vpaddb %xmm4, %xmm0, %xmm0
719 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
720 ; AVX1-NEXT:    vxorps %ymm3, %ymm1, %ymm2
721 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
722 ; AVX1-NEXT:    vpsrlw $1, %xmm4, %xmm4
723 ; AVX1-NEXT:    vpand %xmm6, %xmm4, %xmm4
724 ; AVX1-NEXT:    vandps %ymm3, %ymm1, %ymm1
725 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
726 ; AVX1-NEXT:    vpaddb %xmm4, %xmm3, %xmm3
727 ; AVX1-NEXT:    vpsrlw $1, %xmm2, %xmm2
728 ; AVX1-NEXT:    vpand %xmm6, %xmm2, %xmm2
729 ; AVX1-NEXT:    vpaddb %xmm2, %xmm1, %xmm1
730 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
731 ; AVX1-NEXT:    retq
733 ; AVX2-LABEL: test_fixed_v64i8:
734 ; AVX2:       # %bb.0:
735 ; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm4
736 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
737 ; AVX2-NEXT:    vpsrlw $1, %ymm0, %ymm0
738 ; AVX2-NEXT:    vpbroadcastb {{.*#+}} ymm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
739 ; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
740 ; AVX2-NEXT:    vpaddb %ymm0, %ymm4, %ymm0
741 ; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm4
742 ; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm1
743 ; AVX2-NEXT:    vpsrlw $1, %ymm1, %ymm1
744 ; AVX2-NEXT:    vpand %ymm2, %ymm1, %ymm1
745 ; AVX2-NEXT:    vpaddb %ymm1, %ymm4, %ymm1
746 ; AVX2-NEXT:    retq
748 ; AVX512-LABEL: test_fixed_v64i8:
749 ; AVX512:       # %bb.0:
750 ; AVX512-NEXT:    vpandq %zmm1, %zmm0, %zmm2
751 ; AVX512-NEXT:    vpxorq %zmm1, %zmm0, %zmm0
752 ; AVX512-NEXT:    vpsrlw $1, %zmm0, %zmm0
753 ; AVX512-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0
754 ; AVX512-NEXT:    vpaddb %zmm0, %zmm2, %zmm0
755 ; AVX512-NEXT:    retq
756   %and = and <64 x i8> %a0, %a1
757   %xor = xor <64 x i8> %a0, %a1
758   %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>
759   %res = add <64 x i8> %and, %shift
760   ret <64 x i8> %res
763 define <64 x i8> @test_ext_v64i8(<64 x i8> %a0, <64 x i8> %a1) nounwind {
764 ; SSE-LABEL: test_ext_v64i8:
765 ; SSE:       # %bb.0:
766 ; SSE-NEXT:    movdqa %xmm0, %xmm8
767 ; SSE-NEXT:    pand %xmm4, %xmm8
768 ; SSE-NEXT:    pxor %xmm4, %xmm0
769 ; SSE-NEXT:    psrlw $1, %xmm0
770 ; SSE-NEXT:    movdqa {{.*#+}} xmm4 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
771 ; SSE-NEXT:    pand %xmm4, %xmm0
772 ; SSE-NEXT:    paddb %xmm8, %xmm0
773 ; SSE-NEXT:    movdqa %xmm1, %xmm8
774 ; SSE-NEXT:    pand %xmm5, %xmm8
775 ; SSE-NEXT:    pxor %xmm5, %xmm1
776 ; SSE-NEXT:    psrlw $1, %xmm1
777 ; SSE-NEXT:    pand %xmm4, %xmm1
778 ; SSE-NEXT:    paddb %xmm8, %xmm1
779 ; SSE-NEXT:    movdqa %xmm2, %xmm5
780 ; SSE-NEXT:    pand %xmm6, %xmm5
781 ; SSE-NEXT:    pxor %xmm6, %xmm2
782 ; SSE-NEXT:    psrlw $1, %xmm2
783 ; SSE-NEXT:    pand %xmm4, %xmm2
784 ; SSE-NEXT:    paddb %xmm5, %xmm2
785 ; SSE-NEXT:    movdqa %xmm3, %xmm5
786 ; SSE-NEXT:    pand %xmm7, %xmm5
787 ; SSE-NEXT:    pxor %xmm7, %xmm3
788 ; SSE-NEXT:    psrlw $1, %xmm3
789 ; SSE-NEXT:    pand %xmm4, %xmm3
790 ; SSE-NEXT:    paddb %xmm5, %xmm3
791 ; SSE-NEXT:    retq
793 ; AVX1-LABEL: test_ext_v64i8:
794 ; AVX1:       # %bb.0:
795 ; AVX1-NEXT:    vxorps %ymm2, %ymm0, %ymm4
796 ; AVX1-NEXT:    vextractf128 $1, %ymm4, %xmm5
797 ; AVX1-NEXT:    vpsrlw $1, %xmm5, %xmm5
798 ; AVX1-NEXT:    vbroadcastss {{.*#+}} xmm6 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
799 ; AVX1-NEXT:    vpand %xmm6, %xmm5, %xmm5
800 ; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm0
801 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
802 ; AVX1-NEXT:    vpaddb %xmm5, %xmm2, %xmm2
803 ; AVX1-NEXT:    vpsrlw $1, %xmm4, %xmm4
804 ; AVX1-NEXT:    vpand %xmm6, %xmm4, %xmm4
805 ; AVX1-NEXT:    vpaddb %xmm4, %xmm0, %xmm0
806 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
807 ; AVX1-NEXT:    vxorps %ymm3, %ymm1, %ymm2
808 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
809 ; AVX1-NEXT:    vpsrlw $1, %xmm4, %xmm4
810 ; AVX1-NEXT:    vpand %xmm6, %xmm4, %xmm4
811 ; AVX1-NEXT:    vandps %ymm3, %ymm1, %ymm1
812 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
813 ; AVX1-NEXT:    vpaddb %xmm4, %xmm3, %xmm3
814 ; AVX1-NEXT:    vpsrlw $1, %xmm2, %xmm2
815 ; AVX1-NEXT:    vpand %xmm6, %xmm2, %xmm2
816 ; AVX1-NEXT:    vpaddb %xmm2, %xmm1, %xmm1
817 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
818 ; AVX1-NEXT:    retq
820 ; AVX2-LABEL: test_ext_v64i8:
821 ; AVX2:       # %bb.0:
822 ; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm4
823 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
824 ; AVX2-NEXT:    vpsrlw $1, %ymm0, %ymm0
825 ; AVX2-NEXT:    vpbroadcastb {{.*#+}} ymm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127]
826 ; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm0
827 ; AVX2-NEXT:    vpaddb %ymm0, %ymm4, %ymm0
828 ; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm4
829 ; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm1
830 ; AVX2-NEXT:    vpsrlw $1, %ymm1, %ymm1
831 ; AVX2-NEXT:    vpand %ymm2, %ymm1, %ymm1
832 ; AVX2-NEXT:    vpaddb %ymm1, %ymm4, %ymm1
833 ; AVX2-NEXT:    retq
835 ; AVX512-LABEL: test_ext_v64i8:
836 ; AVX512:       # %bb.0:
837 ; AVX512-NEXT:    vpandq %zmm1, %zmm0, %zmm2
838 ; AVX512-NEXT:    vpxorq %zmm1, %zmm0, %zmm0
839 ; AVX512-NEXT:    vpsrlw $1, %zmm0, %zmm0
840 ; AVX512-NEXT:    vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0
841 ; AVX512-NEXT:    vpaddb %zmm0, %zmm2, %zmm0
842 ; AVX512-NEXT:    retq
843   %x0 = zext <64 x i8> %a0 to <64 x i16>
844   %x1 = zext <64 x i8> %a1 to <64 x i16>
845   %sum = add <64 x i16> %x0, %x1
846   %shift = lshr <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>
847   %res = trunc <64 x i16> %shift to <64 x i8>
848   ret <64 x i8> %res
851 define <32 x i16> @test_fixed_v32i16(<32 x i16> %a0, <32 x i16> %a1) nounwind {
852 ; SSE-LABEL: test_fixed_v32i16:
853 ; SSE:       # %bb.0:
854 ; SSE-NEXT:    movdqa %xmm0, %xmm8
855 ; SSE-NEXT:    pand %xmm4, %xmm8
856 ; SSE-NEXT:    pxor %xmm4, %xmm0
857 ; SSE-NEXT:    psrlw $1, %xmm0
858 ; SSE-NEXT:    paddw %xmm8, %xmm0
859 ; SSE-NEXT:    movdqa %xmm1, %xmm4
860 ; SSE-NEXT:    pand %xmm5, %xmm4
861 ; SSE-NEXT:    pxor %xmm5, %xmm1
862 ; SSE-NEXT:    psrlw $1, %xmm1
863 ; SSE-NEXT:    paddw %xmm4, %xmm1
864 ; SSE-NEXT:    movdqa %xmm2, %xmm4
865 ; SSE-NEXT:    pand %xmm6, %xmm4
866 ; SSE-NEXT:    pxor %xmm6, %xmm2
867 ; SSE-NEXT:    psrlw $1, %xmm2
868 ; SSE-NEXT:    paddw %xmm4, %xmm2
869 ; SSE-NEXT:    movdqa %xmm3, %xmm4
870 ; SSE-NEXT:    pand %xmm7, %xmm4
871 ; SSE-NEXT:    pxor %xmm7, %xmm3
872 ; SSE-NEXT:    psrlw $1, %xmm3
873 ; SSE-NEXT:    paddw %xmm4, %xmm3
874 ; SSE-NEXT:    retq
876 ; AVX1-LABEL: test_fixed_v32i16:
877 ; AVX1:       # %bb.0:
878 ; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm4
879 ; AVX1-NEXT:    vextractf128 $1, %ymm4, %xmm5
880 ; AVX1-NEXT:    vxorps %ymm2, %ymm0, %ymm0
881 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
882 ; AVX1-NEXT:    vpsrlw $1, %xmm2, %xmm2
883 ; AVX1-NEXT:    vpaddw %xmm2, %xmm5, %xmm2
884 ; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm0
885 ; AVX1-NEXT:    vpaddw %xmm0, %xmm4, %xmm0
886 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
887 ; AVX1-NEXT:    vandps %ymm3, %ymm1, %ymm2
888 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
889 ; AVX1-NEXT:    vxorps %ymm3, %ymm1, %ymm1
890 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
891 ; AVX1-NEXT:    vpsrlw $1, %xmm3, %xmm3
892 ; AVX1-NEXT:    vpaddw %xmm3, %xmm4, %xmm3
893 ; AVX1-NEXT:    vpsrlw $1, %xmm1, %xmm1
894 ; AVX1-NEXT:    vpaddw %xmm1, %xmm2, %xmm1
895 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
896 ; AVX1-NEXT:    retq
898 ; AVX2-LABEL: test_fixed_v32i16:
899 ; AVX2:       # %bb.0:
900 ; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm4
901 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
902 ; AVX2-NEXT:    vpsrlw $1, %ymm0, %ymm0
903 ; AVX2-NEXT:    vpaddw %ymm0, %ymm4, %ymm0
904 ; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm2
905 ; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm1
906 ; AVX2-NEXT:    vpsrlw $1, %ymm1, %ymm1
907 ; AVX2-NEXT:    vpaddw %ymm1, %ymm2, %ymm1
908 ; AVX2-NEXT:    retq
910 ; AVX512-LABEL: test_fixed_v32i16:
911 ; AVX512:       # %bb.0:
912 ; AVX512-NEXT:    vpandq %zmm1, %zmm0, %zmm2
913 ; AVX512-NEXT:    vpxorq %zmm1, %zmm0, %zmm0
914 ; AVX512-NEXT:    vpsrlw $1, %zmm0, %zmm0
915 ; AVX512-NEXT:    vpaddw %zmm0, %zmm2, %zmm0
916 ; AVX512-NEXT:    retq
917   %and = and <32 x i16> %a0, %a1
918   %xor = xor <32 x i16> %a1, %a0
919   %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>
920   %res = add <32 x i16> %and, %shift
921   ret <32 x i16> %res
924 define <32 x i16> @test_ext_v32i16(<32 x i16> %a0, <32 x i16> %a1) nounwind {
925 ; SSE-LABEL: test_ext_v32i16:
926 ; SSE:       # %bb.0:
927 ; SSE-NEXT:    movdqa %xmm0, %xmm8
928 ; SSE-NEXT:    pand %xmm4, %xmm8
929 ; SSE-NEXT:    pxor %xmm4, %xmm0
930 ; SSE-NEXT:    psrlw $1, %xmm0
931 ; SSE-NEXT:    paddw %xmm8, %xmm0
932 ; SSE-NEXT:    movdqa %xmm1, %xmm4
933 ; SSE-NEXT:    pand %xmm5, %xmm4
934 ; SSE-NEXT:    pxor %xmm5, %xmm1
935 ; SSE-NEXT:    psrlw $1, %xmm1
936 ; SSE-NEXT:    paddw %xmm4, %xmm1
937 ; SSE-NEXT:    movdqa %xmm2, %xmm4
938 ; SSE-NEXT:    pand %xmm6, %xmm4
939 ; SSE-NEXT:    pxor %xmm6, %xmm2
940 ; SSE-NEXT:    psrlw $1, %xmm2
941 ; SSE-NEXT:    paddw %xmm4, %xmm2
942 ; SSE-NEXT:    movdqa %xmm3, %xmm4
943 ; SSE-NEXT:    pand %xmm7, %xmm4
944 ; SSE-NEXT:    pxor %xmm7, %xmm3
945 ; SSE-NEXT:    psrlw $1, %xmm3
946 ; SSE-NEXT:    paddw %xmm4, %xmm3
947 ; SSE-NEXT:    retq
949 ; AVX1-LABEL: test_ext_v32i16:
950 ; AVX1:       # %bb.0:
951 ; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm4
952 ; AVX1-NEXT:    vextractf128 $1, %ymm4, %xmm5
953 ; AVX1-NEXT:    vxorps %ymm2, %ymm0, %ymm0
954 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
955 ; AVX1-NEXT:    vpsrlw $1, %xmm2, %xmm2
956 ; AVX1-NEXT:    vpaddw %xmm2, %xmm5, %xmm2
957 ; AVX1-NEXT:    vpsrlw $1, %xmm0, %xmm0
958 ; AVX1-NEXT:    vpaddw %xmm0, %xmm4, %xmm0
959 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
960 ; AVX1-NEXT:    vandps %ymm3, %ymm1, %ymm2
961 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
962 ; AVX1-NEXT:    vxorps %ymm3, %ymm1, %ymm1
963 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
964 ; AVX1-NEXT:    vpsrlw $1, %xmm3, %xmm3
965 ; AVX1-NEXT:    vpaddw %xmm3, %xmm4, %xmm3
966 ; AVX1-NEXT:    vpsrlw $1, %xmm1, %xmm1
967 ; AVX1-NEXT:    vpaddw %xmm1, %xmm2, %xmm1
968 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
969 ; AVX1-NEXT:    retq
971 ; AVX2-LABEL: test_ext_v32i16:
972 ; AVX2:       # %bb.0:
973 ; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm4
974 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
975 ; AVX2-NEXT:    vpsrlw $1, %ymm0, %ymm0
976 ; AVX2-NEXT:    vpaddw %ymm0, %ymm4, %ymm0
977 ; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm2
978 ; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm1
979 ; AVX2-NEXT:    vpsrlw $1, %ymm1, %ymm1
980 ; AVX2-NEXT:    vpaddw %ymm1, %ymm2, %ymm1
981 ; AVX2-NEXT:    retq
983 ; AVX512-LABEL: test_ext_v32i16:
984 ; AVX512:       # %bb.0:
985 ; AVX512-NEXT:    vpandq %zmm1, %zmm0, %zmm2
986 ; AVX512-NEXT:    vpxorq %zmm1, %zmm0, %zmm0
987 ; AVX512-NEXT:    vpsrlw $1, %zmm0, %zmm0
988 ; AVX512-NEXT:    vpaddw %zmm0, %zmm2, %zmm0
989 ; AVX512-NEXT:    retq
990   %x0 = zext <32 x i16> %a0 to <32 x i32>
991   %x1 = zext <32 x i16> %a1 to <32 x i32>
992   %sum = add <32 x i32> %x0, %x1
993   %shift = lshr <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>
994   %res = trunc <32 x i32> %shift to <32 x i16>
995   ret <32 x i16> %res
998 define <16 x i32> @test_fixed_v16i32(<16 x i32> %a0, <16 x i32> %a1) nounwind {
999 ; SSE-LABEL: test_fixed_v16i32:
1000 ; SSE:       # %bb.0:
1001 ; SSE-NEXT:    movdqa %xmm0, %xmm8
1002 ; SSE-NEXT:    pand %xmm4, %xmm8
1003 ; SSE-NEXT:    pxor %xmm4, %xmm0
1004 ; SSE-NEXT:    psrld $1, %xmm0
1005 ; SSE-NEXT:    paddd %xmm8, %xmm0
1006 ; SSE-NEXT:    movdqa %xmm1, %xmm4
1007 ; SSE-NEXT:    pand %xmm5, %xmm4
1008 ; SSE-NEXT:    pxor %xmm5, %xmm1
1009 ; SSE-NEXT:    psrld $1, %xmm1
1010 ; SSE-NEXT:    paddd %xmm4, %xmm1
1011 ; SSE-NEXT:    movdqa %xmm2, %xmm4
1012 ; SSE-NEXT:    pand %xmm6, %xmm4
1013 ; SSE-NEXT:    pxor %xmm6, %xmm2
1014 ; SSE-NEXT:    psrld $1, %xmm2
1015 ; SSE-NEXT:    paddd %xmm4, %xmm2
1016 ; SSE-NEXT:    movdqa %xmm3, %xmm4
1017 ; SSE-NEXT:    pand %xmm7, %xmm4
1018 ; SSE-NEXT:    pxor %xmm7, %xmm3
1019 ; SSE-NEXT:    psrld $1, %xmm3
1020 ; SSE-NEXT:    paddd %xmm4, %xmm3
1021 ; SSE-NEXT:    retq
1023 ; AVX1-LABEL: test_fixed_v16i32:
1024 ; AVX1:       # %bb.0:
1025 ; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm4
1026 ; AVX1-NEXT:    vextractf128 $1, %ymm4, %xmm5
1027 ; AVX1-NEXT:    vxorps %ymm2, %ymm0, %ymm0
1028 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1029 ; AVX1-NEXT:    vpsrld $1, %xmm2, %xmm2
1030 ; AVX1-NEXT:    vpaddd %xmm2, %xmm5, %xmm2
1031 ; AVX1-NEXT:    vpsrld $1, %xmm0, %xmm0
1032 ; AVX1-NEXT:    vpaddd %xmm0, %xmm4, %xmm0
1033 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1034 ; AVX1-NEXT:    vandps %ymm3, %ymm1, %ymm2
1035 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1036 ; AVX1-NEXT:    vxorps %ymm3, %ymm1, %ymm1
1037 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1038 ; AVX1-NEXT:    vpsrld $1, %xmm3, %xmm3
1039 ; AVX1-NEXT:    vpaddd %xmm3, %xmm4, %xmm3
1040 ; AVX1-NEXT:    vpsrld $1, %xmm1, %xmm1
1041 ; AVX1-NEXT:    vpaddd %xmm1, %xmm2, %xmm1
1042 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
1043 ; AVX1-NEXT:    retq
1045 ; AVX2-LABEL: test_fixed_v16i32:
1046 ; AVX2:       # %bb.0:
1047 ; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm4
1048 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
1049 ; AVX2-NEXT:    vpsrld $1, %ymm0, %ymm0
1050 ; AVX2-NEXT:    vpaddd %ymm0, %ymm4, %ymm0
1051 ; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm2
1052 ; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm1
1053 ; AVX2-NEXT:    vpsrld $1, %ymm1, %ymm1
1054 ; AVX2-NEXT:    vpaddd %ymm1, %ymm2, %ymm1
1055 ; AVX2-NEXT:    retq
1057 ; AVX512-LABEL: test_fixed_v16i32:
1058 ; AVX512:       # %bb.0:
1059 ; AVX512-NEXT:    vpandd %zmm1, %zmm0, %zmm2
1060 ; AVX512-NEXT:    vpxord %zmm1, %zmm0, %zmm0
1061 ; AVX512-NEXT:    vpsrld $1, %zmm0, %zmm0
1062 ; AVX512-NEXT:    vpaddd %zmm0, %zmm2, %zmm0
1063 ; AVX512-NEXT:    retq
1064   %and = and <16 x i32> %a0, %a1
1065   %xor = xor <16 x i32> %a1, %a0
1066   %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>
1067   %res = add <16 x i32> %and, %shift
1068   ret <16 x i32> %res
1071 define <16 x i32> @test_ext_v16i32(<16 x i32> %a0, <16 x i32> %a1) nounwind {
1072 ; SSE-LABEL: test_ext_v16i32:
1073 ; SSE:       # %bb.0:
1074 ; SSE-NEXT:    movdqa %xmm0, %xmm8
1075 ; SSE-NEXT:    pand %xmm4, %xmm8
1076 ; SSE-NEXT:    pxor %xmm4, %xmm0
1077 ; SSE-NEXT:    psrld $1, %xmm0
1078 ; SSE-NEXT:    paddd %xmm8, %xmm0
1079 ; SSE-NEXT:    movdqa %xmm1, %xmm4
1080 ; SSE-NEXT:    pand %xmm5, %xmm4
1081 ; SSE-NEXT:    pxor %xmm5, %xmm1
1082 ; SSE-NEXT:    psrld $1, %xmm1
1083 ; SSE-NEXT:    paddd %xmm4, %xmm1
1084 ; SSE-NEXT:    movdqa %xmm2, %xmm4
1085 ; SSE-NEXT:    pand %xmm6, %xmm4
1086 ; SSE-NEXT:    pxor %xmm6, %xmm2
1087 ; SSE-NEXT:    psrld $1, %xmm2
1088 ; SSE-NEXT:    paddd %xmm4, %xmm2
1089 ; SSE-NEXT:    movdqa %xmm3, %xmm4
1090 ; SSE-NEXT:    pand %xmm7, %xmm4
1091 ; SSE-NEXT:    pxor %xmm7, %xmm3
1092 ; SSE-NEXT:    psrld $1, %xmm3
1093 ; SSE-NEXT:    paddd %xmm4, %xmm3
1094 ; SSE-NEXT:    retq
1096 ; AVX1-LABEL: test_ext_v16i32:
1097 ; AVX1:       # %bb.0:
1098 ; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm4
1099 ; AVX1-NEXT:    vextractf128 $1, %ymm4, %xmm5
1100 ; AVX1-NEXT:    vxorps %ymm2, %ymm0, %ymm0
1101 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1102 ; AVX1-NEXT:    vpsrld $1, %xmm2, %xmm2
1103 ; AVX1-NEXT:    vpaddd %xmm2, %xmm5, %xmm2
1104 ; AVX1-NEXT:    vpsrld $1, %xmm0, %xmm0
1105 ; AVX1-NEXT:    vpaddd %xmm0, %xmm4, %xmm0
1106 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1107 ; AVX1-NEXT:    vandps %ymm3, %ymm1, %ymm2
1108 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1109 ; AVX1-NEXT:    vxorps %ymm3, %ymm1, %ymm1
1110 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1111 ; AVX1-NEXT:    vpsrld $1, %xmm3, %xmm3
1112 ; AVX1-NEXT:    vpaddd %xmm3, %xmm4, %xmm3
1113 ; AVX1-NEXT:    vpsrld $1, %xmm1, %xmm1
1114 ; AVX1-NEXT:    vpaddd %xmm1, %xmm2, %xmm1
1115 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
1116 ; AVX1-NEXT:    retq
1118 ; AVX2-LABEL: test_ext_v16i32:
1119 ; AVX2:       # %bb.0:
1120 ; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm4
1121 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
1122 ; AVX2-NEXT:    vpsrld $1, %ymm0, %ymm0
1123 ; AVX2-NEXT:    vpaddd %ymm0, %ymm4, %ymm0
1124 ; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm2
1125 ; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm1
1126 ; AVX2-NEXT:    vpsrld $1, %ymm1, %ymm1
1127 ; AVX2-NEXT:    vpaddd %ymm1, %ymm2, %ymm1
1128 ; AVX2-NEXT:    retq
1130 ; AVX512-LABEL: test_ext_v16i32:
1131 ; AVX512:       # %bb.0:
1132 ; AVX512-NEXT:    vpandd %zmm1, %zmm0, %zmm2
1133 ; AVX512-NEXT:    vpxord %zmm1, %zmm0, %zmm0
1134 ; AVX512-NEXT:    vpsrld $1, %zmm0, %zmm0
1135 ; AVX512-NEXT:    vpaddd %zmm0, %zmm2, %zmm0
1136 ; AVX512-NEXT:    retq
1137   %x0 = zext <16 x i32> %a0 to <16 x i64>
1138   %x1 = zext <16 x i32> %a1 to <16 x i64>
1139   %sum = add <16 x i64> %x0, %x1
1140   %shift = lshr <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>
1141   %res = trunc <16 x i64> %shift to <16 x i32>
1142   ret <16 x i32> %res
1145 define <8 x i64> @test_fixed_v8i64(<8 x i64> %a0, <8 x i64> %a1) nounwind {
1146 ; SSE-LABEL: test_fixed_v8i64:
1147 ; SSE:       # %bb.0:
1148 ; SSE-NEXT:    movdqa %xmm0, %xmm8
1149 ; SSE-NEXT:    pand %xmm4, %xmm8
1150 ; SSE-NEXT:    pxor %xmm4, %xmm0
1151 ; SSE-NEXT:    psrlq $1, %xmm0
1152 ; SSE-NEXT:    paddq %xmm8, %xmm0
1153 ; SSE-NEXT:    movdqa %xmm1, %xmm4
1154 ; SSE-NEXT:    pand %xmm5, %xmm4
1155 ; SSE-NEXT:    pxor %xmm5, %xmm1
1156 ; SSE-NEXT:    psrlq $1, %xmm1
1157 ; SSE-NEXT:    paddq %xmm4, %xmm1
1158 ; SSE-NEXT:    movdqa %xmm2, %xmm4
1159 ; SSE-NEXT:    pand %xmm6, %xmm4
1160 ; SSE-NEXT:    pxor %xmm6, %xmm2
1161 ; SSE-NEXT:    psrlq $1, %xmm2
1162 ; SSE-NEXT:    paddq %xmm4, %xmm2
1163 ; SSE-NEXT:    movdqa %xmm3, %xmm4
1164 ; SSE-NEXT:    pand %xmm7, %xmm4
1165 ; SSE-NEXT:    pxor %xmm7, %xmm3
1166 ; SSE-NEXT:    psrlq $1, %xmm3
1167 ; SSE-NEXT:    paddq %xmm4, %xmm3
1168 ; SSE-NEXT:    retq
1170 ; AVX1-LABEL: test_fixed_v8i64:
1171 ; AVX1:       # %bb.0:
1172 ; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm4
1173 ; AVX1-NEXT:    vextractf128 $1, %ymm4, %xmm5
1174 ; AVX1-NEXT:    vxorps %ymm2, %ymm0, %ymm0
1175 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1176 ; AVX1-NEXT:    vpsrlq $1, %xmm2, %xmm2
1177 ; AVX1-NEXT:    vpaddq %xmm2, %xmm5, %xmm2
1178 ; AVX1-NEXT:    vpsrlq $1, %xmm0, %xmm0
1179 ; AVX1-NEXT:    vpaddq %xmm0, %xmm4, %xmm0
1180 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1181 ; AVX1-NEXT:    vandps %ymm3, %ymm1, %ymm2
1182 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1183 ; AVX1-NEXT:    vxorps %ymm3, %ymm1, %ymm1
1184 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1185 ; AVX1-NEXT:    vpsrlq $1, %xmm3, %xmm3
1186 ; AVX1-NEXT:    vpaddq %xmm3, %xmm4, %xmm3
1187 ; AVX1-NEXT:    vpsrlq $1, %xmm1, %xmm1
1188 ; AVX1-NEXT:    vpaddq %xmm1, %xmm2, %xmm1
1189 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
1190 ; AVX1-NEXT:    retq
1192 ; AVX2-LABEL: test_fixed_v8i64:
1193 ; AVX2:       # %bb.0:
1194 ; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm4
1195 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
1196 ; AVX2-NEXT:    vpsrlq $1, %ymm0, %ymm0
1197 ; AVX2-NEXT:    vpaddq %ymm0, %ymm4, %ymm0
1198 ; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm2
1199 ; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm1
1200 ; AVX2-NEXT:    vpsrlq $1, %ymm1, %ymm1
1201 ; AVX2-NEXT:    vpaddq %ymm1, %ymm2, %ymm1
1202 ; AVX2-NEXT:    retq
1204 ; AVX512-LABEL: test_fixed_v8i64:
1205 ; AVX512:       # %bb.0:
1206 ; AVX512-NEXT:    vpandq %zmm1, %zmm0, %zmm2
1207 ; AVX512-NEXT:    vpxorq %zmm1, %zmm0, %zmm0
1208 ; AVX512-NEXT:    vpsrlq $1, %zmm0, %zmm0
1209 ; AVX512-NEXT:    vpaddq %zmm0, %zmm2, %zmm0
1210 ; AVX512-NEXT:    retq
1211   %and = and <8 x i64> %a0, %a1
1212   %xor = xor <8 x i64> %a1, %a0
1213   %shift = lshr <8 x i64> %xor, <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1>
1214   %res = add <8 x i64> %and, %shift
1215   ret <8 x i64> %res
1218 define <8 x i64> @test_ext_v8i64(<8 x i64> %a0, <8 x i64> %a1) nounwind {
1219 ; SSE-LABEL: test_ext_v8i64:
1220 ; SSE:       # %bb.0:
1221 ; SSE-NEXT:    movdqa %xmm0, %xmm8
1222 ; SSE-NEXT:    pand %xmm4, %xmm8
1223 ; SSE-NEXT:    pxor %xmm4, %xmm0
1224 ; SSE-NEXT:    psrlq $1, %xmm0
1225 ; SSE-NEXT:    paddq %xmm8, %xmm0
1226 ; SSE-NEXT:    movdqa %xmm1, %xmm4
1227 ; SSE-NEXT:    pand %xmm5, %xmm4
1228 ; SSE-NEXT:    pxor %xmm5, %xmm1
1229 ; SSE-NEXT:    psrlq $1, %xmm1
1230 ; SSE-NEXT:    paddq %xmm4, %xmm1
1231 ; SSE-NEXT:    movdqa %xmm2, %xmm4
1232 ; SSE-NEXT:    pand %xmm6, %xmm4
1233 ; SSE-NEXT:    pxor %xmm6, %xmm2
1234 ; SSE-NEXT:    psrlq $1, %xmm2
1235 ; SSE-NEXT:    paddq %xmm4, %xmm2
1236 ; SSE-NEXT:    movdqa %xmm3, %xmm4
1237 ; SSE-NEXT:    pand %xmm7, %xmm4
1238 ; SSE-NEXT:    pxor %xmm7, %xmm3
1239 ; SSE-NEXT:    psrlq $1, %xmm3
1240 ; SSE-NEXT:    paddq %xmm4, %xmm3
1241 ; SSE-NEXT:    retq
1243 ; AVX1-LABEL: test_ext_v8i64:
1244 ; AVX1:       # %bb.0:
1245 ; AVX1-NEXT:    vandps %ymm2, %ymm0, %ymm4
1246 ; AVX1-NEXT:    vextractf128 $1, %ymm4, %xmm5
1247 ; AVX1-NEXT:    vxorps %ymm2, %ymm0, %ymm0
1248 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
1249 ; AVX1-NEXT:    vpsrlq $1, %xmm2, %xmm2
1250 ; AVX1-NEXT:    vpaddq %xmm2, %xmm5, %xmm2
1251 ; AVX1-NEXT:    vpsrlq $1, %xmm0, %xmm0
1252 ; AVX1-NEXT:    vpaddq %xmm0, %xmm4, %xmm0
1253 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
1254 ; AVX1-NEXT:    vandps %ymm3, %ymm1, %ymm2
1255 ; AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
1256 ; AVX1-NEXT:    vxorps %ymm3, %ymm1, %ymm1
1257 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm3
1258 ; AVX1-NEXT:    vpsrlq $1, %xmm3, %xmm3
1259 ; AVX1-NEXT:    vpaddq %xmm3, %xmm4, %xmm3
1260 ; AVX1-NEXT:    vpsrlq $1, %xmm1, %xmm1
1261 ; AVX1-NEXT:    vpaddq %xmm1, %xmm2, %xmm1
1262 ; AVX1-NEXT:    vinsertf128 $1, %xmm3, %ymm1, %ymm1
1263 ; AVX1-NEXT:    retq
1265 ; AVX2-LABEL: test_ext_v8i64:
1266 ; AVX2:       # %bb.0:
1267 ; AVX2-NEXT:    vpand %ymm2, %ymm0, %ymm4
1268 ; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
1269 ; AVX2-NEXT:    vpsrlq $1, %ymm0, %ymm0
1270 ; AVX2-NEXT:    vpaddq %ymm0, %ymm4, %ymm0
1271 ; AVX2-NEXT:    vpand %ymm3, %ymm1, %ymm2
1272 ; AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm1
1273 ; AVX2-NEXT:    vpsrlq $1, %ymm1, %ymm1
1274 ; AVX2-NEXT:    vpaddq %ymm1, %ymm2, %ymm1
1275 ; AVX2-NEXT:    retq
1277 ; AVX512-LABEL: test_ext_v8i64:
1278 ; AVX512:       # %bb.0:
1279 ; AVX512-NEXT:    vpandq %zmm1, %zmm0, %zmm2
1280 ; AVX512-NEXT:    vpxorq %zmm1, %zmm0, %zmm0
1281 ; AVX512-NEXT:    vpsrlq $1, %zmm0, %zmm0
1282 ; AVX512-NEXT:    vpaddq %zmm0, %zmm2, %zmm0
1283 ; AVX512-NEXT:    retq
1284   %x0 = zext <8 x i64> %a0 to <8 x i128>
1285   %x1 = zext <8 x i64> %a1 to <8 x i128>
1286   %sum = add <8 x i128> %x0, %x1
1287   %shift = lshr <8 x i128> %sum, <i128 1, i128 1, i128 1, i128 1, i128 1, i128 1, i128 1, i128 1>
1288   %res = trunc <8 x i128> %shift to <8 x i64>
1289   ret <8 x i64> %res
1292 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
1293 ; SSE2: {{.*}}
1294 ; SSE4: {{.*}}