1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefix=X86
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s --check-prefix=X64
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xop | FileCheck %s --check-prefix=X64-AVX --check-prefix=X64-XOP
5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=X64-AVX --check-prefix=X64-AVX2
6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq,+avx512vl | FileCheck %s --check-prefix=X64-AVX --check-prefix=X64-AVX512DQ
12 define <2 x i64> @mul_v2i64_8(<2 x i64> %a0) nounwind {
13 ; X86-LABEL: mul_v2i64_8:
15 ; X86-NEXT: psllq $3, %xmm0
18 ; X64-LABEL: mul_v2i64_8:
20 ; X64-NEXT: psllq $3, %xmm0
23 ; X64-AVX-LABEL: mul_v2i64_8:
25 ; X64-AVX-NEXT: vpsllq $3, %xmm0, %xmm0
27 %1 = mul <2 x i64> %a0, <i64 8, i64 8>
31 define <4 x i32> @mul_v4i32_8(<4 x i32> %a0) nounwind {
32 ; X86-LABEL: mul_v4i32_8:
34 ; X86-NEXT: pslld $3, %xmm0
37 ; X64-LABEL: mul_v4i32_8:
39 ; X64-NEXT: pslld $3, %xmm0
42 ; X64-AVX-LABEL: mul_v4i32_8:
44 ; X64-AVX-NEXT: vpslld $3, %xmm0, %xmm0
46 %1 = mul <4 x i32> %a0, <i32 8, i32 8, i32 8, i32 8>
50 define <8 x i16> @mul_v8i16_8(<8 x i16> %a0) nounwind {
51 ; X86-LABEL: mul_v8i16_8:
53 ; X86-NEXT: psllw $3, %xmm0
56 ; X64-LABEL: mul_v8i16_8:
58 ; X64-NEXT: psllw $3, %xmm0
61 ; X64-AVX-LABEL: mul_v8i16_8:
63 ; X64-AVX-NEXT: vpsllw $3, %xmm0, %xmm0
65 %1 = mul <8 x i16> %a0, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
69 define <16 x i8> @mul_v16i8_32(<16 x i8> %a0) nounwind {
70 ; X86-LABEL: mul_v16i8_32:
72 ; X86-NEXT: psllw $5, %xmm0
73 ; X86-NEXT: pand {{\.LCPI.*}}, %xmm0
76 ; X64-LABEL: mul_v16i8_32:
78 ; X64-NEXT: psllw $5, %xmm0
79 ; X64-NEXT: pand {{.*}}(%rip), %xmm0
82 ; X64-XOP-LABEL: mul_v16i8_32:
84 ; X64-XOP-NEXT: vpshlb {{.*}}(%rip), %xmm0, %xmm0
87 ; X64-AVX2-LABEL: mul_v16i8_32:
89 ; X64-AVX2-NEXT: vpsllw $5, %xmm0, %xmm0
90 ; X64-AVX2-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0
93 ; X64-AVX512DQ-LABEL: mul_v16i8_32:
94 ; X64-AVX512DQ: # %bb.0:
95 ; X64-AVX512DQ-NEXT: vpsllw $5, %xmm0, %xmm0
96 ; X64-AVX512DQ-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0
97 ; X64-AVX512DQ-NEXT: retq
98 %1 = mul <16 x i8> %a0, <i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32>
103 ; PowOf2 (non-uniform)
106 define <2 x i64> @mul_v2i64_32_8(<2 x i64> %a0) nounwind {
107 ; X86-LABEL: mul_v2i64_32_8:
109 ; X86-NEXT: movdqa %xmm0, %xmm1
110 ; X86-NEXT: psllq $3, %xmm1
111 ; X86-NEXT: psllq $5, %xmm0
112 ; X86-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
115 ; X64-LABEL: mul_v2i64_32_8:
117 ; X64-NEXT: movdqa %xmm0, %xmm1
118 ; X64-NEXT: psllq $3, %xmm1
119 ; X64-NEXT: psllq $5, %xmm0
120 ; X64-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7]
123 ; X64-XOP-LABEL: mul_v2i64_32_8:
125 ; X64-XOP-NEXT: vpshlq {{.*}}(%rip), %xmm0, %xmm0
128 ; X64-AVX2-LABEL: mul_v2i64_32_8:
130 ; X64-AVX2-NEXT: vpsllvq {{.*}}(%rip), %xmm0, %xmm0
131 ; X64-AVX2-NEXT: retq
133 ; X64-AVX512DQ-LABEL: mul_v2i64_32_8:
134 ; X64-AVX512DQ: # %bb.0:
135 ; X64-AVX512DQ-NEXT: vpsllvq {{.*}}(%rip), %xmm0, %xmm0
136 ; X64-AVX512DQ-NEXT: retq
137 %1 = mul <2 x i64> %a0, <i64 32, i64 8>
141 define <4 x i32> @mul_v4i32_1_2_4_8(<4 x i32> %a0) nounwind {
142 ; X86-LABEL: mul_v4i32_1_2_4_8:
144 ; X86-NEXT: pmulld {{\.LCPI.*}}, %xmm0
147 ; X64-LABEL: mul_v4i32_1_2_4_8:
149 ; X64-NEXT: pmulld {{.*}}(%rip), %xmm0
152 ; X64-XOP-LABEL: mul_v4i32_1_2_4_8:
154 ; X64-XOP-NEXT: vpshld {{.*}}(%rip), %xmm0, %xmm0
157 ; X64-AVX2-LABEL: mul_v4i32_1_2_4_8:
159 ; X64-AVX2-NEXT: vpsllvd {{.*}}(%rip), %xmm0, %xmm0
160 ; X64-AVX2-NEXT: retq
162 ; X64-AVX512DQ-LABEL: mul_v4i32_1_2_4_8:
163 ; X64-AVX512DQ: # %bb.0:
164 ; X64-AVX512DQ-NEXT: vpsllvd {{.*}}(%rip), %xmm0, %xmm0
165 ; X64-AVX512DQ-NEXT: retq
166 %1 = mul <4 x i32> %a0, <i32 1, i32 2, i32 4, i32 8>
170 define <8 x i16> @mul_v8i16_1_2_4_8_16_32_64_128(<8 x i16> %a0) nounwind {
171 ; X86-LABEL: mul_v8i16_1_2_4_8_16_32_64_128:
173 ; X86-NEXT: pmullw {{\.LCPI.*}}, %xmm0
176 ; X64-LABEL: mul_v8i16_1_2_4_8_16_32_64_128:
178 ; X64-NEXT: pmullw {{.*}}(%rip), %xmm0
181 ; X64-XOP-LABEL: mul_v8i16_1_2_4_8_16_32_64_128:
183 ; X64-XOP-NEXT: vpshlw {{.*}}(%rip), %xmm0, %xmm0
186 ; X64-AVX2-LABEL: mul_v8i16_1_2_4_8_16_32_64_128:
188 ; X64-AVX2-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm0
189 ; X64-AVX2-NEXT: retq
191 ; X64-AVX512DQ-LABEL: mul_v8i16_1_2_4_8_16_32_64_128:
192 ; X64-AVX512DQ: # %bb.0:
193 ; X64-AVX512DQ-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm0
194 ; X64-AVX512DQ-NEXT: retq
195 %1 = mul <8 x i16> %a0, <i16 1, i16 2, i16 4, i16 8, i16 16, i16 32, i16 64, i16 128>
199 define <16 x i8> @mul_v16i8_1_2_4_8_1_2_4_8_1_2_4_8_1_2_4_8(<16 x i8> %a0) nounwind {
200 ; X86-LABEL: mul_v16i8_1_2_4_8_1_2_4_8_1_2_4_8_1_2_4_8:
202 ; X86-NEXT: pmovzxbw {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
203 ; X86-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
204 ; X86-NEXT: movdqa {{.*#+}} xmm2 = [1,2,4,8,1,2,4,8]
205 ; X86-NEXT: pmullw %xmm2, %xmm0
206 ; X86-NEXT: movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
207 ; X86-NEXT: pand %xmm3, %xmm0
208 ; X86-NEXT: pmullw %xmm2, %xmm1
209 ; X86-NEXT: pand %xmm3, %xmm1
210 ; X86-NEXT: packuswb %xmm0, %xmm1
211 ; X86-NEXT: movdqa %xmm1, %xmm0
214 ; X64-LABEL: mul_v16i8_1_2_4_8_1_2_4_8_1_2_4_8_1_2_4_8:
216 ; X64-NEXT: pmovzxbw {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
217 ; X64-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
218 ; X64-NEXT: movdqa {{.*#+}} xmm2 = [1,2,4,8,1,2,4,8]
219 ; X64-NEXT: pmullw %xmm2, %xmm0
220 ; X64-NEXT: movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
221 ; X64-NEXT: pand %xmm3, %xmm0
222 ; X64-NEXT: pmullw %xmm2, %xmm1
223 ; X64-NEXT: pand %xmm3, %xmm1
224 ; X64-NEXT: packuswb %xmm0, %xmm1
225 ; X64-NEXT: movdqa %xmm1, %xmm0
228 ; X64-XOP-LABEL: mul_v16i8_1_2_4_8_1_2_4_8_1_2_4_8_1_2_4_8:
230 ; X64-XOP-NEXT: vpshlb {{.*}}(%rip), %xmm0, %xmm0
233 ; X64-AVX2-LABEL: mul_v16i8_1_2_4_8_1_2_4_8_1_2_4_8_1_2_4_8:
235 ; X64-AVX2-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
236 ; X64-AVX2-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0
237 ; X64-AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
238 ; X64-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
239 ; X64-AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
240 ; X64-AVX2-NEXT: vzeroupper
241 ; X64-AVX2-NEXT: retq
243 ; X64-AVX512DQ-LABEL: mul_v16i8_1_2_4_8_1_2_4_8_1_2_4_8_1_2_4_8:
244 ; X64-AVX512DQ: # %bb.0:
245 ; X64-AVX512DQ-NEXT: vpmovzxbd {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero,xmm0[8],zero,zero,zero,xmm0[9],zero,zero,zero,xmm0[10],zero,zero,zero,xmm0[11],zero,zero,zero,xmm0[12],zero,zero,zero,xmm0[13],zero,zero,zero,xmm0[14],zero,zero,zero,xmm0[15],zero,zero,zero
246 ; X64-AVX512DQ-NEXT: vpsllvd {{.*}}(%rip), %zmm0, %zmm0
247 ; X64-AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0
248 ; X64-AVX512DQ-NEXT: vzeroupper
249 ; X64-AVX512DQ-NEXT: retq
250 %1 = mul <16 x i8> %a0, <i8 1, i8 2, i8 4, i8 8, i8 1, i8 2, i8 4, i8 8, i8 1, i8 2, i8 4, i8 8, i8 1, i8 2, i8 4, i8 8>
255 ; PowOf2 + 1 (uniform)
258 define <2 x i64> @mul_v2i64_17(<2 x i64> %a0) nounwind {
259 ; X86-LABEL: mul_v2i64_17:
261 ; X86-NEXT: movdqa %xmm0, %xmm1
262 ; X86-NEXT: psllq $4, %xmm1
263 ; X86-NEXT: paddq %xmm0, %xmm1
264 ; X86-NEXT: movdqa %xmm1, %xmm0
267 ; X64-LABEL: mul_v2i64_17:
269 ; X64-NEXT: movdqa %xmm0, %xmm1
270 ; X64-NEXT: psllq $4, %xmm1
271 ; X64-NEXT: paddq %xmm0, %xmm1
272 ; X64-NEXT: movdqa %xmm1, %xmm0
275 ; X64-XOP-LABEL: mul_v2i64_17:
277 ; X64-XOP-NEXT: vpsllq $4, %xmm0, %xmm1
278 ; X64-XOP-NEXT: vpaddq %xmm0, %xmm1, %xmm0
281 ; X64-AVX2-LABEL: mul_v2i64_17:
283 ; X64-AVX2-NEXT: vpsllq $4, %xmm0, %xmm1
284 ; X64-AVX2-NEXT: vpaddq %xmm0, %xmm1, %xmm0
285 ; X64-AVX2-NEXT: retq
287 ; X64-AVX512DQ-LABEL: mul_v2i64_17:
288 ; X64-AVX512DQ: # %bb.0:
289 ; X64-AVX512DQ-NEXT: vpmullq {{.*}}(%rip), %xmm0, %xmm0
290 ; X64-AVX512DQ-NEXT: retq
291 %1 = mul <2 x i64> %a0, <i64 17, i64 17>
295 define <4 x i32> @mul_v4i32_17(<4 x i32> %a0) nounwind {
296 ; X86-LABEL: mul_v4i32_17:
298 ; X86-NEXT: pmulld {{\.LCPI.*}}, %xmm0
301 ; X64-LABEL: mul_v4i32_17:
303 ; X64-NEXT: pmulld {{.*}}(%rip), %xmm0
306 ; X64-XOP-LABEL: mul_v4i32_17:
308 ; X64-XOP-NEXT: vpmulld {{.*}}(%rip), %xmm0, %xmm0
311 ; X64-AVX2-LABEL: mul_v4i32_17:
313 ; X64-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [17,17,17,17]
314 ; X64-AVX2-NEXT: vpmulld %xmm1, %xmm0, %xmm0
315 ; X64-AVX2-NEXT: retq
317 ; X64-AVX512DQ-LABEL: mul_v4i32_17:
318 ; X64-AVX512DQ: # %bb.0:
319 ; X64-AVX512DQ-NEXT: vpmulld {{.*}}(%rip){1to4}, %xmm0, %xmm0
320 ; X64-AVX512DQ-NEXT: retq
321 %1 = mul <4 x i32> %a0, <i32 17, i32 17, i32 17, i32 17>
325 define <8 x i16> @mul_v8i16_17(<8 x i16> %a0) nounwind {
326 ; X86-LABEL: mul_v8i16_17:
328 ; X86-NEXT: pmullw {{\.LCPI.*}}, %xmm0
331 ; X64-LABEL: mul_v8i16_17:
333 ; X64-NEXT: pmullw {{.*}}(%rip), %xmm0
336 ; X64-AVX-LABEL: mul_v8i16_17:
338 ; X64-AVX-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm0
340 %1 = mul <8 x i16> %a0, <i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17>
344 define <16 x i8> @mul_v16i8_17(<16 x i8> %a0) nounwind {
345 ; X86-LABEL: mul_v16i8_17:
347 ; X86-NEXT: movdqa %xmm0, %xmm1
348 ; X86-NEXT: psllw $4, %xmm1
349 ; X86-NEXT: pand {{\.LCPI.*}}, %xmm1
350 ; X86-NEXT: paddb %xmm0, %xmm1
351 ; X86-NEXT: movdqa %xmm1, %xmm0
354 ; X64-LABEL: mul_v16i8_17:
356 ; X64-NEXT: movdqa %xmm0, %xmm1
357 ; X64-NEXT: psllw $4, %xmm1
358 ; X64-NEXT: pand {{.*}}(%rip), %xmm1
359 ; X64-NEXT: paddb %xmm0, %xmm1
360 ; X64-NEXT: movdqa %xmm1, %xmm0
363 ; X64-XOP-LABEL: mul_v16i8_17:
365 ; X64-XOP-NEXT: vpshlb {{.*}}(%rip), %xmm0, %xmm1
366 ; X64-XOP-NEXT: vpaddb %xmm0, %xmm1, %xmm0
369 ; X64-AVX2-LABEL: mul_v16i8_17:
371 ; X64-AVX2-NEXT: vpsllw $4, %xmm0, %xmm1
372 ; X64-AVX2-NEXT: vpand {{.*}}(%rip), %xmm1, %xmm1
373 ; X64-AVX2-NEXT: vpaddb %xmm0, %xmm1, %xmm0
374 ; X64-AVX2-NEXT: retq
376 ; X64-AVX512DQ-LABEL: mul_v16i8_17:
377 ; X64-AVX512DQ: # %bb.0:
378 ; X64-AVX512DQ-NEXT: vpsllw $4, %xmm0, %xmm1
379 ; X64-AVX512DQ-NEXT: vpand {{.*}}(%rip), %xmm1, %xmm1
380 ; X64-AVX512DQ-NEXT: vpaddb %xmm0, %xmm1, %xmm0
381 ; X64-AVX512DQ-NEXT: retq
382 %1 = mul <16 x i8> %a0, <i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17>
386 define <4 x i64> @mul_v4i64_17(<4 x i64> %a0) nounwind {
387 ; X86-LABEL: mul_v4i64_17:
389 ; X86-NEXT: movdqa %xmm0, %xmm2
390 ; X86-NEXT: psllq $4, %xmm2
391 ; X86-NEXT: paddq %xmm0, %xmm2
392 ; X86-NEXT: movdqa %xmm1, %xmm3
393 ; X86-NEXT: psllq $4, %xmm3
394 ; X86-NEXT: paddq %xmm1, %xmm3
395 ; X86-NEXT: movdqa %xmm2, %xmm0
396 ; X86-NEXT: movdqa %xmm3, %xmm1
399 ; X64-LABEL: mul_v4i64_17:
401 ; X64-NEXT: movdqa %xmm0, %xmm2
402 ; X64-NEXT: psllq $4, %xmm2
403 ; X64-NEXT: paddq %xmm0, %xmm2
404 ; X64-NEXT: movdqa %xmm1, %xmm3
405 ; X64-NEXT: psllq $4, %xmm3
406 ; X64-NEXT: paddq %xmm1, %xmm3
407 ; X64-NEXT: movdqa %xmm2, %xmm0
408 ; X64-NEXT: movdqa %xmm3, %xmm1
411 ; X64-XOP-LABEL: mul_v4i64_17:
413 ; X64-XOP-NEXT: vextractf128 $1, %ymm0, %xmm1
414 ; X64-XOP-NEXT: vpsllq $4, %xmm1, %xmm2
415 ; X64-XOP-NEXT: vpaddq %xmm1, %xmm2, %xmm1
416 ; X64-XOP-NEXT: vpsllq $4, %xmm0, %xmm2
417 ; X64-XOP-NEXT: vpaddq %xmm0, %xmm2, %xmm0
418 ; X64-XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
421 ; X64-AVX2-LABEL: mul_v4i64_17:
423 ; X64-AVX2-NEXT: vpsllq $4, %ymm0, %ymm1
424 ; X64-AVX2-NEXT: vpaddq %ymm0, %ymm1, %ymm0
425 ; X64-AVX2-NEXT: retq
427 ; X64-AVX512DQ-LABEL: mul_v4i64_17:
428 ; X64-AVX512DQ: # %bb.0:
429 ; X64-AVX512DQ-NEXT: vpmullq {{.*}}(%rip){1to4}, %ymm0, %ymm0
430 ; X64-AVX512DQ-NEXT: retq
431 %1 = mul <4 x i64> %a0, <i64 17, i64 17, i64 17, i64 17>
435 define <8 x i32> @mul_v8i32_17(<8 x i32> %a0) nounwind {
436 ; X86-LABEL: mul_v8i32_17:
438 ; X86-NEXT: movdqa {{.*#+}} xmm2 = [17,17,17,17]
439 ; X86-NEXT: pmulld %xmm2, %xmm0
440 ; X86-NEXT: pmulld %xmm2, %xmm1
443 ; X64-LABEL: mul_v8i32_17:
445 ; X64-NEXT: movdqa {{.*#+}} xmm2 = [17,17,17,17]
446 ; X64-NEXT: pmulld %xmm2, %xmm0
447 ; X64-NEXT: pmulld %xmm2, %xmm1
450 ; X64-XOP-LABEL: mul_v8i32_17:
452 ; X64-XOP-NEXT: vextractf128 $1, %ymm0, %xmm1
453 ; X64-XOP-NEXT: vpslld $4, %xmm1, %xmm2
454 ; X64-XOP-NEXT: vpaddd %xmm1, %xmm2, %xmm1
455 ; X64-XOP-NEXT: vpslld $4, %xmm0, %xmm2
456 ; X64-XOP-NEXT: vpaddd %xmm0, %xmm2, %xmm0
457 ; X64-XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
460 ; X64-AVX2-LABEL: mul_v8i32_17:
462 ; X64-AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [17,17,17,17,17,17,17,17]
463 ; X64-AVX2-NEXT: vpmulld %ymm1, %ymm0, %ymm0
464 ; X64-AVX2-NEXT: retq
466 ; X64-AVX512DQ-LABEL: mul_v8i32_17:
467 ; X64-AVX512DQ: # %bb.0:
468 ; X64-AVX512DQ-NEXT: vpmulld {{.*}}(%rip){1to8}, %ymm0, %ymm0
469 ; X64-AVX512DQ-NEXT: retq
470 %1 = mul <8 x i32> %a0, <i32 17, i32 17, i32 17, i32 17, i32 17, i32 17, i32 17, i32 17>
474 define <16 x i16> @mul_v16i16_17(<16 x i16> %a0) nounwind {
475 ; X86-LABEL: mul_v16i16_17:
477 ; X86-NEXT: movdqa {{.*#+}} xmm2 = [17,17,17,17,17,17,17,17]
478 ; X86-NEXT: pmullw %xmm2, %xmm0
479 ; X86-NEXT: pmullw %xmm2, %xmm1
482 ; X64-LABEL: mul_v16i16_17:
484 ; X64-NEXT: movdqa {{.*#+}} xmm2 = [17,17,17,17,17,17,17,17]
485 ; X64-NEXT: pmullw %xmm2, %xmm0
486 ; X64-NEXT: pmullw %xmm2, %xmm1
489 ; X64-XOP-LABEL: mul_v16i16_17:
491 ; X64-XOP-NEXT: vextractf128 $1, %ymm0, %xmm1
492 ; X64-XOP-NEXT: vpsllw $4, %xmm1, %xmm2
493 ; X64-XOP-NEXT: vpaddw %xmm1, %xmm2, %xmm1
494 ; X64-XOP-NEXT: vpsllw $4, %xmm0, %xmm2
495 ; X64-XOP-NEXT: vpaddw %xmm0, %xmm2, %xmm0
496 ; X64-XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
499 ; X64-AVX2-LABEL: mul_v16i16_17:
501 ; X64-AVX2-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0
502 ; X64-AVX2-NEXT: retq
504 ; X64-AVX512DQ-LABEL: mul_v16i16_17:
505 ; X64-AVX512DQ: # %bb.0:
506 ; X64-AVX512DQ-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0
507 ; X64-AVX512DQ-NEXT: retq
508 %1 = mul <16 x i16> %a0, <i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17>
512 define <32 x i8> @mul_v32i8_17(<32 x i8> %a0) nounwind {
513 ; X86-LABEL: mul_v32i8_17:
515 ; X86-NEXT: movdqa %xmm0, %xmm2
516 ; X86-NEXT: psllw $4, %xmm2
517 ; X86-NEXT: movdqa {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
518 ; X86-NEXT: pand %xmm4, %xmm2
519 ; X86-NEXT: paddb %xmm0, %xmm2
520 ; X86-NEXT: movdqa %xmm1, %xmm3
521 ; X86-NEXT: psllw $4, %xmm3
522 ; X86-NEXT: pand %xmm4, %xmm3
523 ; X86-NEXT: paddb %xmm1, %xmm3
524 ; X86-NEXT: movdqa %xmm2, %xmm0
525 ; X86-NEXT: movdqa %xmm3, %xmm1
528 ; X64-LABEL: mul_v32i8_17:
530 ; X64-NEXT: movdqa %xmm0, %xmm2
531 ; X64-NEXT: psllw $4, %xmm2
532 ; X64-NEXT: movdqa {{.*#+}} xmm4 = [240,240,240,240,240,240,240,240,240,240,240,240,240,240,240,240]
533 ; X64-NEXT: pand %xmm4, %xmm2
534 ; X64-NEXT: paddb %xmm0, %xmm2
535 ; X64-NEXT: movdqa %xmm1, %xmm3
536 ; X64-NEXT: psllw $4, %xmm3
537 ; X64-NEXT: pand %xmm4, %xmm3
538 ; X64-NEXT: paddb %xmm1, %xmm3
539 ; X64-NEXT: movdqa %xmm2, %xmm0
540 ; X64-NEXT: movdqa %xmm3, %xmm1
543 ; X64-XOP-LABEL: mul_v32i8_17:
545 ; X64-XOP-NEXT: vextractf128 $1, %ymm0, %xmm1
546 ; X64-XOP-NEXT: vmovdqa {{.*#+}} xmm2 = [4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4]
547 ; X64-XOP-NEXT: vpshlb %xmm2, %xmm1, %xmm3
548 ; X64-XOP-NEXT: vpaddb %xmm1, %xmm3, %xmm1
549 ; X64-XOP-NEXT: vpshlb %xmm2, %xmm0, %xmm2
550 ; X64-XOP-NEXT: vpaddb %xmm0, %xmm2, %xmm0
551 ; X64-XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
554 ; X64-AVX2-LABEL: mul_v32i8_17:
556 ; X64-AVX2-NEXT: vpsllw $4, %ymm0, %ymm1
557 ; X64-AVX2-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
558 ; X64-AVX2-NEXT: vpaddb %ymm0, %ymm1, %ymm0
559 ; X64-AVX2-NEXT: retq
561 ; X64-AVX512DQ-LABEL: mul_v32i8_17:
562 ; X64-AVX512DQ: # %bb.0:
563 ; X64-AVX512DQ-NEXT: vpsllw $4, %ymm0, %ymm1
564 ; X64-AVX512DQ-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
565 ; X64-AVX512DQ-NEXT: vpaddb %ymm0, %ymm1, %ymm0
566 ; X64-AVX512DQ-NEXT: retq
567 %1 = mul <32 x i8> %a0, <i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17, i8 17>
572 ; -(PowOf2 + 1) (uniform)
575 define <2 x i64> @mul_v2i64_neg1025(<2 x i64> %a0) nounwind {
576 ; X86-LABEL: mul_v2i64_neg1025:
578 ; X86-NEXT: movdqa %xmm0, %xmm1
579 ; X86-NEXT: psllq $10, %xmm1
580 ; X86-NEXT: paddq %xmm0, %xmm1
581 ; X86-NEXT: pxor %xmm0, %xmm0
582 ; X86-NEXT: psubq %xmm1, %xmm0
585 ; X64-LABEL: mul_v2i64_neg1025:
587 ; X64-NEXT: movdqa %xmm0, %xmm1
588 ; X64-NEXT: psllq $10, %xmm1
589 ; X64-NEXT: paddq %xmm0, %xmm1
590 ; X64-NEXT: pxor %xmm0, %xmm0
591 ; X64-NEXT: psubq %xmm1, %xmm0
594 ; X64-XOP-LABEL: mul_v2i64_neg1025:
596 ; X64-XOP-NEXT: vpsllq $10, %xmm0, %xmm1
597 ; X64-XOP-NEXT: vpaddq %xmm0, %xmm1, %xmm0
598 ; X64-XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1
599 ; X64-XOP-NEXT: vpsubq %xmm0, %xmm1, %xmm0
602 ; X64-AVX2-LABEL: mul_v2i64_neg1025:
604 ; X64-AVX2-NEXT: vpsllq $10, %xmm0, %xmm1
605 ; X64-AVX2-NEXT: vpaddq %xmm0, %xmm1, %xmm0
606 ; X64-AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
607 ; X64-AVX2-NEXT: vpsubq %xmm0, %xmm1, %xmm0
608 ; X64-AVX2-NEXT: retq
610 ; X64-AVX512DQ-LABEL: mul_v2i64_neg1025:
611 ; X64-AVX512DQ: # %bb.0:
612 ; X64-AVX512DQ-NEXT: vpmullq {{.*}}(%rip), %xmm0, %xmm0
613 ; X64-AVX512DQ-NEXT: retq
614 %1 = mul <2 x i64> %a0, <i64 -1025, i64 -1025>
618 define <4 x i32> @mul_v4i32_neg33(<4 x i32> %a0) nounwind {
619 ; X86-LABEL: mul_v4i32_neg33:
621 ; X86-NEXT: pmulld {{\.LCPI.*}}, %xmm0
624 ; X64-LABEL: mul_v4i32_neg33:
626 ; X64-NEXT: pmulld {{.*}}(%rip), %xmm0
629 ; X64-XOP-LABEL: mul_v4i32_neg33:
631 ; X64-XOP-NEXT: vpmulld {{.*}}(%rip), %xmm0, %xmm0
634 ; X64-AVX2-LABEL: mul_v4i32_neg33:
636 ; X64-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [4294967263,4294967263,4294967263,4294967263]
637 ; X64-AVX2-NEXT: vpmulld %xmm1, %xmm0, %xmm0
638 ; X64-AVX2-NEXT: retq
640 ; X64-AVX512DQ-LABEL: mul_v4i32_neg33:
641 ; X64-AVX512DQ: # %bb.0:
642 ; X64-AVX512DQ-NEXT: vpmulld {{.*}}(%rip){1to4}, %xmm0, %xmm0
643 ; X64-AVX512DQ-NEXT: retq
644 %1 = mul <4 x i32> %a0, <i32 -33, i32 -33, i32 -33, i32 -33>
648 define <8 x i16> @mul_v8i16_neg9(<8 x i16> %a0) nounwind {
649 ; X86-LABEL: mul_v8i16_neg9:
651 ; X86-NEXT: pmullw {{\.LCPI.*}}, %xmm0
654 ; X64-LABEL: mul_v8i16_neg9:
656 ; X64-NEXT: pmullw {{.*}}(%rip), %xmm0
659 ; X64-AVX-LABEL: mul_v8i16_neg9:
661 ; X64-AVX-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm0
663 %1 = mul <8 x i16> %a0, <i16 -9, i16 -9, i16 -9, i16 -9, i16 -9, i16 -9, i16 -9, i16 -9>
667 define <16 x i8> @mul_v16i8_neg5(<16 x i8> %a0) nounwind {
668 ; X86-LABEL: mul_v16i8_neg5:
670 ; X86-NEXT: movdqa %xmm0, %xmm1
671 ; X86-NEXT: psllw $2, %xmm1
672 ; X86-NEXT: pand {{\.LCPI.*}}, %xmm1
673 ; X86-NEXT: paddb %xmm0, %xmm1
674 ; X86-NEXT: pxor %xmm0, %xmm0
675 ; X86-NEXT: psubb %xmm1, %xmm0
678 ; X64-LABEL: mul_v16i8_neg5:
680 ; X64-NEXT: movdqa %xmm0, %xmm1
681 ; X64-NEXT: psllw $2, %xmm1
682 ; X64-NEXT: pand {{.*}}(%rip), %xmm1
683 ; X64-NEXT: paddb %xmm0, %xmm1
684 ; X64-NEXT: pxor %xmm0, %xmm0
685 ; X64-NEXT: psubb %xmm1, %xmm0
688 ; X64-XOP-LABEL: mul_v16i8_neg5:
690 ; X64-XOP-NEXT: vpshlb {{.*}}(%rip), %xmm0, %xmm1
691 ; X64-XOP-NEXT: vpaddb %xmm0, %xmm1, %xmm0
692 ; X64-XOP-NEXT: vpxor %xmm1, %xmm1, %xmm1
693 ; X64-XOP-NEXT: vpsubb %xmm0, %xmm1, %xmm0
696 ; X64-AVX2-LABEL: mul_v16i8_neg5:
698 ; X64-AVX2-NEXT: vpsllw $2, %xmm0, %xmm1
699 ; X64-AVX2-NEXT: vpand {{.*}}(%rip), %xmm1, %xmm1
700 ; X64-AVX2-NEXT: vpaddb %xmm0, %xmm1, %xmm0
701 ; X64-AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
702 ; X64-AVX2-NEXT: vpsubb %xmm0, %xmm1, %xmm0
703 ; X64-AVX2-NEXT: retq
705 ; X64-AVX512DQ-LABEL: mul_v16i8_neg5:
706 ; X64-AVX512DQ: # %bb.0:
707 ; X64-AVX512DQ-NEXT: vpsllw $2, %xmm0, %xmm1
708 ; X64-AVX512DQ-NEXT: vpand {{.*}}(%rip), %xmm1, %xmm1
709 ; X64-AVX512DQ-NEXT: vpaddb %xmm0, %xmm1, %xmm0
710 ; X64-AVX512DQ-NEXT: vpxor %xmm1, %xmm1, %xmm1
711 ; X64-AVX512DQ-NEXT: vpsubb %xmm0, %xmm1, %xmm0
712 ; X64-AVX512DQ-NEXT: retq
713 %1 = mul <16 x i8> %a0, <i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5>
717 define <4 x i64> @mul_v4i64_neg1025(<4 x i64> %a0) nounwind {
718 ; X86-LABEL: mul_v4i64_neg1025:
720 ; X86-NEXT: movdqa %xmm0, %xmm3
721 ; X86-NEXT: psllq $10, %xmm3
722 ; X86-NEXT: paddq %xmm0, %xmm3
723 ; X86-NEXT: pxor %xmm2, %xmm2
724 ; X86-NEXT: pxor %xmm0, %xmm0
725 ; X86-NEXT: psubq %xmm3, %xmm0
726 ; X86-NEXT: movdqa %xmm1, %xmm3
727 ; X86-NEXT: psllq $10, %xmm3
728 ; X86-NEXT: paddq %xmm1, %xmm3
729 ; X86-NEXT: psubq %xmm3, %xmm2
730 ; X86-NEXT: movdqa %xmm2, %xmm1
733 ; X64-LABEL: mul_v4i64_neg1025:
735 ; X64-NEXT: movdqa %xmm0, %xmm3
736 ; X64-NEXT: psllq $10, %xmm3
737 ; X64-NEXT: paddq %xmm0, %xmm3
738 ; X64-NEXT: pxor %xmm2, %xmm2
739 ; X64-NEXT: pxor %xmm0, %xmm0
740 ; X64-NEXT: psubq %xmm3, %xmm0
741 ; X64-NEXT: movdqa %xmm1, %xmm3
742 ; X64-NEXT: psllq $10, %xmm3
743 ; X64-NEXT: paddq %xmm1, %xmm3
744 ; X64-NEXT: psubq %xmm3, %xmm2
745 ; X64-NEXT: movdqa %xmm2, %xmm1
748 ; X64-XOP-LABEL: mul_v4i64_neg1025:
750 ; X64-XOP-NEXT: vextractf128 $1, %ymm0, %xmm1
751 ; X64-XOP-NEXT: vpsllq $10, %xmm1, %xmm2
752 ; X64-XOP-NEXT: vpaddq %xmm1, %xmm2, %xmm1
753 ; X64-XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2
754 ; X64-XOP-NEXT: vpsubq %xmm1, %xmm2, %xmm1
755 ; X64-XOP-NEXT: vpsllq $10, %xmm0, %xmm3
756 ; X64-XOP-NEXT: vpaddq %xmm0, %xmm3, %xmm0
757 ; X64-XOP-NEXT: vpsubq %xmm0, %xmm2, %xmm0
758 ; X64-XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
761 ; X64-AVX2-LABEL: mul_v4i64_neg1025:
763 ; X64-AVX2-NEXT: vpsllq $10, %ymm0, %ymm1
764 ; X64-AVX2-NEXT: vpaddq %ymm0, %ymm1, %ymm0
765 ; X64-AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
766 ; X64-AVX2-NEXT: vpsubq %ymm0, %ymm1, %ymm0
767 ; X64-AVX2-NEXT: retq
769 ; X64-AVX512DQ-LABEL: mul_v4i64_neg1025:
770 ; X64-AVX512DQ: # %bb.0:
771 ; X64-AVX512DQ-NEXT: vpmullq {{.*}}(%rip){1to4}, %ymm0, %ymm0
772 ; X64-AVX512DQ-NEXT: retq
773 %1 = mul <4 x i64> %a0, <i64 -1025, i64 -1025, i64 -1025, i64 -1025>
777 define <8 x i32> @mul_v8i32_neg33(<8 x i32> %a0) nounwind {
778 ; X86-LABEL: mul_v8i32_neg33:
780 ; X86-NEXT: movdqa {{.*#+}} xmm2 = [4294967263,4294967263,4294967263,4294967263]
781 ; X86-NEXT: pmulld %xmm2, %xmm0
782 ; X86-NEXT: pmulld %xmm2, %xmm1
785 ; X64-LABEL: mul_v8i32_neg33:
787 ; X64-NEXT: movdqa {{.*#+}} xmm2 = [4294967263,4294967263,4294967263,4294967263]
788 ; X64-NEXT: pmulld %xmm2, %xmm0
789 ; X64-NEXT: pmulld %xmm2, %xmm1
792 ; X64-XOP-LABEL: mul_v8i32_neg33:
794 ; X64-XOP-NEXT: vextractf128 $1, %ymm0, %xmm1
795 ; X64-XOP-NEXT: vpslld $5, %xmm1, %xmm2
796 ; X64-XOP-NEXT: vpaddd %xmm1, %xmm2, %xmm1
797 ; X64-XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2
798 ; X64-XOP-NEXT: vpsubd %xmm1, %xmm2, %xmm1
799 ; X64-XOP-NEXT: vpslld $5, %xmm0, %xmm3
800 ; X64-XOP-NEXT: vpaddd %xmm0, %xmm3, %xmm0
801 ; X64-XOP-NEXT: vpsubd %xmm0, %xmm2, %xmm0
802 ; X64-XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
805 ; X64-AVX2-LABEL: mul_v8i32_neg33:
807 ; X64-AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [4294967263,4294967263,4294967263,4294967263,4294967263,4294967263,4294967263,4294967263]
808 ; X64-AVX2-NEXT: vpmulld %ymm1, %ymm0, %ymm0
809 ; X64-AVX2-NEXT: retq
811 ; X64-AVX512DQ-LABEL: mul_v8i32_neg33:
812 ; X64-AVX512DQ: # %bb.0:
813 ; X64-AVX512DQ-NEXT: vpmulld {{.*}}(%rip){1to8}, %ymm0, %ymm0
814 ; X64-AVX512DQ-NEXT: retq
815 %1 = mul <8 x i32> %a0, <i32 -33, i32 -33, i32 -33, i32 -33, i32 -33, i32 -33, i32 -33, i32 -33>
819 define <16 x i16> @mul_v16i16_neg9(<16 x i16> %a0) nounwind {
820 ; X86-LABEL: mul_v16i16_neg9:
822 ; X86-NEXT: movdqa {{.*#+}} xmm2 = [65527,65527,65527,65527,65527,65527,65527,65527]
823 ; X86-NEXT: pmullw %xmm2, %xmm0
824 ; X86-NEXT: pmullw %xmm2, %xmm1
827 ; X64-LABEL: mul_v16i16_neg9:
829 ; X64-NEXT: movdqa {{.*#+}} xmm2 = [65527,65527,65527,65527,65527,65527,65527,65527]
830 ; X64-NEXT: pmullw %xmm2, %xmm0
831 ; X64-NEXT: pmullw %xmm2, %xmm1
834 ; X64-XOP-LABEL: mul_v16i16_neg9:
836 ; X64-XOP-NEXT: vextractf128 $1, %ymm0, %xmm1
837 ; X64-XOP-NEXT: vpsllw $3, %xmm1, %xmm2
838 ; X64-XOP-NEXT: vpaddw %xmm1, %xmm2, %xmm1
839 ; X64-XOP-NEXT: vpxor %xmm2, %xmm2, %xmm2
840 ; X64-XOP-NEXT: vpsubw %xmm1, %xmm2, %xmm1
841 ; X64-XOP-NEXT: vpsllw $3, %xmm0, %xmm3
842 ; X64-XOP-NEXT: vpaddw %xmm0, %xmm3, %xmm0
843 ; X64-XOP-NEXT: vpsubw %xmm0, %xmm2, %xmm0
844 ; X64-XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
847 ; X64-AVX2-LABEL: mul_v16i16_neg9:
849 ; X64-AVX2-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0
850 ; X64-AVX2-NEXT: retq
852 ; X64-AVX512DQ-LABEL: mul_v16i16_neg9:
853 ; X64-AVX512DQ: # %bb.0:
854 ; X64-AVX512DQ-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0
855 ; X64-AVX512DQ-NEXT: retq
856 %1 = mul <16 x i16> %a0, <i16 -9, i16 -9, i16 -9, i16 -9, i16 -9, i16 -9, i16 -9, i16 -9, i16 -9, i16 -9, i16 -9, i16 -9, i16 -9, i16 -9, i16 -9, i16 -9>
860 define <32 x i8> @mul_v32i8_neg5(<32 x i8> %a0) nounwind {
861 ; X86-LABEL: mul_v32i8_neg5:
863 ; X86-NEXT: movdqa %xmm0, %xmm3
864 ; X86-NEXT: psllw $2, %xmm3
865 ; X86-NEXT: movdqa {{.*#+}} xmm4 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
866 ; X86-NEXT: pand %xmm4, %xmm3
867 ; X86-NEXT: paddb %xmm0, %xmm3
868 ; X86-NEXT: pxor %xmm2, %xmm2
869 ; X86-NEXT: pxor %xmm0, %xmm0
870 ; X86-NEXT: psubb %xmm3, %xmm0
871 ; X86-NEXT: movdqa %xmm1, %xmm3
872 ; X86-NEXT: psllw $2, %xmm3
873 ; X86-NEXT: pand %xmm4, %xmm3
874 ; X86-NEXT: paddb %xmm1, %xmm3
875 ; X86-NEXT: psubb %xmm3, %xmm2
876 ; X86-NEXT: movdqa %xmm2, %xmm1
879 ; X64-LABEL: mul_v32i8_neg5:
881 ; X64-NEXT: movdqa %xmm0, %xmm3
882 ; X64-NEXT: psllw $2, %xmm3
883 ; X64-NEXT: movdqa {{.*#+}} xmm4 = [252,252,252,252,252,252,252,252,252,252,252,252,252,252,252,252]
884 ; X64-NEXT: pand %xmm4, %xmm3
885 ; X64-NEXT: paddb %xmm0, %xmm3
886 ; X64-NEXT: pxor %xmm2, %xmm2
887 ; X64-NEXT: pxor %xmm0, %xmm0
888 ; X64-NEXT: psubb %xmm3, %xmm0
889 ; X64-NEXT: movdqa %xmm1, %xmm3
890 ; X64-NEXT: psllw $2, %xmm3
891 ; X64-NEXT: pand %xmm4, %xmm3
892 ; X64-NEXT: paddb %xmm1, %xmm3
893 ; X64-NEXT: psubb %xmm3, %xmm2
894 ; X64-NEXT: movdqa %xmm2, %xmm1
897 ; X64-XOP-LABEL: mul_v32i8_neg5:
899 ; X64-XOP-NEXT: vextractf128 $1, %ymm0, %xmm1
900 ; X64-XOP-NEXT: vmovdqa {{.*#+}} xmm2 = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
901 ; X64-XOP-NEXT: vpshlb %xmm2, %xmm1, %xmm3
902 ; X64-XOP-NEXT: vpaddb %xmm1, %xmm3, %xmm1
903 ; X64-XOP-NEXT: vpxor %xmm3, %xmm3, %xmm3
904 ; X64-XOP-NEXT: vpsubb %xmm1, %xmm3, %xmm1
905 ; X64-XOP-NEXT: vpshlb %xmm2, %xmm0, %xmm2
906 ; X64-XOP-NEXT: vpaddb %xmm0, %xmm2, %xmm0
907 ; X64-XOP-NEXT: vpsubb %xmm0, %xmm3, %xmm0
908 ; X64-XOP-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
911 ; X64-AVX2-LABEL: mul_v32i8_neg5:
913 ; X64-AVX2-NEXT: vpsllw $2, %ymm0, %ymm1
914 ; X64-AVX2-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
915 ; X64-AVX2-NEXT: vpaddb %ymm0, %ymm1, %ymm0
916 ; X64-AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1
917 ; X64-AVX2-NEXT: vpsubb %ymm0, %ymm1, %ymm0
918 ; X64-AVX2-NEXT: retq
920 ; X64-AVX512DQ-LABEL: mul_v32i8_neg5:
921 ; X64-AVX512DQ: # %bb.0:
922 ; X64-AVX512DQ-NEXT: vpsllw $2, %ymm0, %ymm1
923 ; X64-AVX512DQ-NEXT: vpand {{.*}}(%rip), %ymm1, %ymm1
924 ; X64-AVX512DQ-NEXT: vpaddb %ymm0, %ymm1, %ymm0
925 ; X64-AVX512DQ-NEXT: vpxor %xmm1, %xmm1, %xmm1
926 ; X64-AVX512DQ-NEXT: vpsubb %ymm0, %ymm1, %ymm0
927 ; X64-AVX512DQ-NEXT: retq
928 %1 = mul <32 x i8> %a0, <i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5, i8 -5>
933 ; PowOf2 + 1 (non-uniform)
936 define <2 x i64> @mul_v2i64_17_65(<2 x i64> %a0) nounwind {
937 ; X86-LABEL: mul_v2i64_17_65:
939 ; X86-NEXT: movdqa {{.*#+}} xmm1 = [17,0,65,0]
940 ; X86-NEXT: movdqa %xmm0, %xmm2
941 ; X86-NEXT: pmuludq %xmm1, %xmm2
942 ; X86-NEXT: psrlq $32, %xmm0
943 ; X86-NEXT: pmuludq %xmm1, %xmm0
944 ; X86-NEXT: psllq $32, %xmm0
945 ; X86-NEXT: paddq %xmm2, %xmm0
948 ; X64-LABEL: mul_v2i64_17_65:
950 ; X64-NEXT: movdqa {{.*#+}} xmm1 = [17,65]
951 ; X64-NEXT: movdqa %xmm0, %xmm2
952 ; X64-NEXT: pmuludq %xmm1, %xmm2
953 ; X64-NEXT: psrlq $32, %xmm0
954 ; X64-NEXT: pmuludq %xmm1, %xmm0
955 ; X64-NEXT: psllq $32, %xmm0
956 ; X64-NEXT: paddq %xmm2, %xmm0
959 ; X64-XOP-LABEL: mul_v2i64_17_65:
961 ; X64-XOP-NEXT: vmovdqa {{.*#+}} xmm1 = [17,65]
962 ; X64-XOP-NEXT: vpmuludq %xmm1, %xmm0, %xmm2
963 ; X64-XOP-NEXT: vpsrlq $32, %xmm0, %xmm0
964 ; X64-XOP-NEXT: vpmuludq %xmm1, %xmm0, %xmm0
965 ; X64-XOP-NEXT: vpsllq $32, %xmm0, %xmm0
966 ; X64-XOP-NEXT: vpaddq %xmm0, %xmm2, %xmm0
969 ; X64-AVX2-LABEL: mul_v2i64_17_65:
971 ; X64-AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [17,65]
972 ; X64-AVX2-NEXT: vpmuludq %xmm1, %xmm0, %xmm2
973 ; X64-AVX2-NEXT: vpsrlq $32, %xmm0, %xmm0
974 ; X64-AVX2-NEXT: vpmuludq %xmm1, %xmm0, %xmm0
975 ; X64-AVX2-NEXT: vpsllq $32, %xmm0, %xmm0
976 ; X64-AVX2-NEXT: vpaddq %xmm0, %xmm2, %xmm0
977 ; X64-AVX2-NEXT: retq
979 ; X64-AVX512DQ-LABEL: mul_v2i64_17_65:
980 ; X64-AVX512DQ: # %bb.0:
981 ; X64-AVX512DQ-NEXT: vpmullq {{.*}}(%rip), %xmm0, %xmm0
982 ; X64-AVX512DQ-NEXT: retq
983 %1 = mul <2 x i64> %a0, <i64 17, i64 65>
987 define <4 x i32> @mul_v4i32_5_17_33_65(<4 x i32> %a0) nounwind {
988 ; X86-LABEL: mul_v4i32_5_17_33_65:
990 ; X86-NEXT: pmulld {{\.LCPI.*}}, %xmm0
993 ; X64-LABEL: mul_v4i32_5_17_33_65:
995 ; X64-NEXT: pmulld {{.*}}(%rip), %xmm0
998 ; X64-AVX-LABEL: mul_v4i32_5_17_33_65:
1000 ; X64-AVX-NEXT: vpmulld {{.*}}(%rip), %xmm0, %xmm0
1001 ; X64-AVX-NEXT: retq
1002 %1 = mul <4 x i32> %a0, <i32 5, i32 17, i32 33, i32 65>
1006 define <8 x i16> @mul_v8i16_2_3_9_17_33_65_129_257(<8 x i16> %a0) nounwind {
1007 ; X86-LABEL: mul_v8i16_2_3_9_17_33_65_129_257:
1009 ; X86-NEXT: pmullw {{\.LCPI.*}}, %xmm0
1012 ; X64-LABEL: mul_v8i16_2_3_9_17_33_65_129_257:
1014 ; X64-NEXT: pmullw {{.*}}(%rip), %xmm0
1017 ; X64-AVX-LABEL: mul_v8i16_2_3_9_17_33_65_129_257:
1019 ; X64-AVX-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm0
1020 ; X64-AVX-NEXT: retq
1021 %1 = mul <8 x i16> %a0, <i16 2, i16 3, i16 9, i16 17, i16 33, i16 65, i16 129, i16 257>
1025 define <16 x i8> @mul_v16i8_2_3_9_17_33_65_129_2_3_9_17_33_65_129_2_3(<16 x i8> %a0) nounwind {
1026 ; X86-LABEL: mul_v16i8_2_3_9_17_33_65_129_2_3_9_17_33_65_129_2_3:
1028 ; X86-NEXT: pmovzxbw {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1029 ; X86-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1030 ; X86-NEXT: pmullw {{\.LCPI.*}}, %xmm0
1031 ; X86-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
1032 ; X86-NEXT: pand %xmm2, %xmm0
1033 ; X86-NEXT: pmullw {{\.LCPI.*}}, %xmm1
1034 ; X86-NEXT: pand %xmm2, %xmm1
1035 ; X86-NEXT: packuswb %xmm0, %xmm1
1036 ; X86-NEXT: movdqa %xmm1, %xmm0
1039 ; X64-LABEL: mul_v16i8_2_3_9_17_33_65_129_2_3_9_17_33_65_129_2_3:
1041 ; X64-NEXT: pmovzxbw {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1042 ; X64-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1043 ; X64-NEXT: pmullw {{.*}}(%rip), %xmm0
1044 ; X64-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
1045 ; X64-NEXT: pand %xmm2, %xmm0
1046 ; X64-NEXT: pmullw {{.*}}(%rip), %xmm1
1047 ; X64-NEXT: pand %xmm2, %xmm1
1048 ; X64-NEXT: packuswb %xmm0, %xmm1
1049 ; X64-NEXT: movdqa %xmm1, %xmm0
1052 ; X64-XOP-LABEL: mul_v16i8_2_3_9_17_33_65_129_2_3_9_17_33_65_129_2_3:
1054 ; X64-XOP-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1055 ; X64-XOP-NEXT: vpmullw {{.*}}(%rip), %xmm1, %xmm1
1056 ; X64-XOP-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1057 ; X64-XOP-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm0
1058 ; X64-XOP-NEXT: vpperm {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],xmm1[0,2,4,6,8,10,12,14]
1059 ; X64-XOP-NEXT: retq
1061 ; X64-AVX2-LABEL: mul_v16i8_2_3_9_17_33_65_129_2_3_9_17_33_65_129_2_3:
1062 ; X64-AVX2: # %bb.0:
1063 ; X64-AVX2-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
1064 ; X64-AVX2-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0
1065 ; X64-AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1066 ; X64-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1067 ; X64-AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
1068 ; X64-AVX2-NEXT: vzeroupper
1069 ; X64-AVX2-NEXT: retq
1071 ; X64-AVX512DQ-LABEL: mul_v16i8_2_3_9_17_33_65_129_2_3_9_17_33_65_129_2_3:
1072 ; X64-AVX512DQ: # %bb.0:
1073 ; X64-AVX512DQ-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
1074 ; X64-AVX512DQ-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0
1075 ; X64-AVX512DQ-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1076 ; X64-AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0
1077 ; X64-AVX512DQ-NEXT: vzeroupper
1078 ; X64-AVX512DQ-NEXT: retq
1079 %1 = mul <16 x i8> %a0, <i8 2, i8 3, i8 9, i8 17, i8 33, i8 65, i8 129, i8 2, i8 3, i8 9, i8 17, i8 33, i8 65, i8 129, i8 2, i8 3>
1084 ; PowOf2 - 1 (uniform)
1087 define <2 x i64> @mul_v2i64_7(<2 x i64> %a0) nounwind {
1088 ; X86-LABEL: mul_v2i64_7:
1090 ; X86-NEXT: movdqa %xmm0, %xmm1
1091 ; X86-NEXT: psllq $3, %xmm1
1092 ; X86-NEXT: psubq %xmm0, %xmm1
1093 ; X86-NEXT: movdqa %xmm1, %xmm0
1096 ; X64-LABEL: mul_v2i64_7:
1098 ; X64-NEXT: movdqa %xmm0, %xmm1
1099 ; X64-NEXT: psllq $3, %xmm1
1100 ; X64-NEXT: psubq %xmm0, %xmm1
1101 ; X64-NEXT: movdqa %xmm1, %xmm0
1104 ; X64-XOP-LABEL: mul_v2i64_7:
1106 ; X64-XOP-NEXT: vpsllq $3, %xmm0, %xmm1
1107 ; X64-XOP-NEXT: vpsubq %xmm0, %xmm1, %xmm0
1108 ; X64-XOP-NEXT: retq
1110 ; X64-AVX2-LABEL: mul_v2i64_7:
1111 ; X64-AVX2: # %bb.0:
1112 ; X64-AVX2-NEXT: vpsllq $3, %xmm0, %xmm1
1113 ; X64-AVX2-NEXT: vpsubq %xmm0, %xmm1, %xmm0
1114 ; X64-AVX2-NEXT: retq
1116 ; X64-AVX512DQ-LABEL: mul_v2i64_7:
1117 ; X64-AVX512DQ: # %bb.0:
1118 ; X64-AVX512DQ-NEXT: vpmullq {{.*}}(%rip), %xmm0, %xmm0
1119 ; X64-AVX512DQ-NEXT: retq
1120 %1 = mul <2 x i64> %a0, <i64 7, i64 7>
1124 define <4 x i32> @mul_v4i32_7(<4 x i32> %a0) nounwind {
1125 ; X86-LABEL: mul_v4i32_7:
1127 ; X86-NEXT: pmulld {{\.LCPI.*}}, %xmm0
1130 ; X64-LABEL: mul_v4i32_7:
1132 ; X64-NEXT: pmulld {{.*}}(%rip), %xmm0
1135 ; X64-XOP-LABEL: mul_v4i32_7:
1137 ; X64-XOP-NEXT: vpmulld {{.*}}(%rip), %xmm0, %xmm0
1138 ; X64-XOP-NEXT: retq
1140 ; X64-AVX2-LABEL: mul_v4i32_7:
1141 ; X64-AVX2: # %bb.0:
1142 ; X64-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [7,7,7,7]
1143 ; X64-AVX2-NEXT: vpmulld %xmm1, %xmm0, %xmm0
1144 ; X64-AVX2-NEXT: retq
1146 ; X64-AVX512DQ-LABEL: mul_v4i32_7:
1147 ; X64-AVX512DQ: # %bb.0:
1148 ; X64-AVX512DQ-NEXT: vpmulld {{.*}}(%rip){1to4}, %xmm0, %xmm0
1149 ; X64-AVX512DQ-NEXT: retq
1150 %1 = mul <4 x i32> %a0, <i32 7, i32 7, i32 7, i32 7>
1154 define <8 x i16> @mul_v8i16_7(<8 x i16> %a0) nounwind {
1155 ; X86-LABEL: mul_v8i16_7:
1157 ; X86-NEXT: pmullw {{\.LCPI.*}}, %xmm0
1160 ; X64-LABEL: mul_v8i16_7:
1162 ; X64-NEXT: pmullw {{.*}}(%rip), %xmm0
1165 ; X64-AVX-LABEL: mul_v8i16_7:
1167 ; X64-AVX-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm0
1168 ; X64-AVX-NEXT: retq
1169 %1 = mul <8 x i16> %a0, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
1173 define <16 x i8> @mul_v16i8_31(<16 x i8> %a0) nounwind {
1174 ; X86-LABEL: mul_v16i8_31:
1176 ; X86-NEXT: movdqa %xmm0, %xmm1
1177 ; X86-NEXT: psllw $5, %xmm1
1178 ; X86-NEXT: pand {{\.LCPI.*}}, %xmm1
1179 ; X86-NEXT: psubb %xmm0, %xmm1
1180 ; X86-NEXT: movdqa %xmm1, %xmm0
1183 ; X64-LABEL: mul_v16i8_31:
1185 ; X64-NEXT: movdqa %xmm0, %xmm1
1186 ; X64-NEXT: psllw $5, %xmm1
1187 ; X64-NEXT: pand {{.*}}(%rip), %xmm1
1188 ; X64-NEXT: psubb %xmm0, %xmm1
1189 ; X64-NEXT: movdqa %xmm1, %xmm0
1192 ; X64-XOP-LABEL: mul_v16i8_31:
1194 ; X64-XOP-NEXT: vpshlb {{.*}}(%rip), %xmm0, %xmm1
1195 ; X64-XOP-NEXT: vpsubb %xmm0, %xmm1, %xmm0
1196 ; X64-XOP-NEXT: retq
1198 ; X64-AVX2-LABEL: mul_v16i8_31:
1199 ; X64-AVX2: # %bb.0:
1200 ; X64-AVX2-NEXT: vpsllw $5, %xmm0, %xmm1
1201 ; X64-AVX2-NEXT: vpand {{.*}}(%rip), %xmm1, %xmm1
1202 ; X64-AVX2-NEXT: vpsubb %xmm0, %xmm1, %xmm0
1203 ; X64-AVX2-NEXT: retq
1205 ; X64-AVX512DQ-LABEL: mul_v16i8_31:
1206 ; X64-AVX512DQ: # %bb.0:
1207 ; X64-AVX512DQ-NEXT: vpsllw $5, %xmm0, %xmm1
1208 ; X64-AVX512DQ-NEXT: vpand {{.*}}(%rip), %xmm1, %xmm1
1209 ; X64-AVX512DQ-NEXT: vpsubb %xmm0, %xmm1, %xmm0
1210 ; X64-AVX512DQ-NEXT: retq
1211 %1 = mul <16 x i8> %a0, <i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31, i8 31>
1216 ; -(PowOf2 - 1) (uniform)
1219 define <2 x i64> @mul_v2i64_neg7(<2 x i64> %a0) nounwind {
1220 ; X86-LABEL: mul_v2i64_neg7:
1222 ; X86-NEXT: movdqa %xmm0, %xmm1
1223 ; X86-NEXT: psllq $3, %xmm1
1224 ; X86-NEXT: psubq %xmm1, %xmm0
1227 ; X64-LABEL: mul_v2i64_neg7:
1229 ; X64-NEXT: movdqa %xmm0, %xmm1
1230 ; X64-NEXT: psllq $3, %xmm1
1231 ; X64-NEXT: psubq %xmm1, %xmm0
1234 ; X64-XOP-LABEL: mul_v2i64_neg7:
1236 ; X64-XOP-NEXT: vpsllq $3, %xmm0, %xmm1
1237 ; X64-XOP-NEXT: vpsubq %xmm1, %xmm0, %xmm0
1238 ; X64-XOP-NEXT: retq
1240 ; X64-AVX2-LABEL: mul_v2i64_neg7:
1241 ; X64-AVX2: # %bb.0:
1242 ; X64-AVX2-NEXT: vpsllq $3, %xmm0, %xmm1
1243 ; X64-AVX2-NEXT: vpsubq %xmm1, %xmm0, %xmm0
1244 ; X64-AVX2-NEXT: retq
1246 ; X64-AVX512DQ-LABEL: mul_v2i64_neg7:
1247 ; X64-AVX512DQ: # %bb.0:
1248 ; X64-AVX512DQ-NEXT: vpmullq {{.*}}(%rip), %xmm0, %xmm0
1249 ; X64-AVX512DQ-NEXT: retq
1250 %1 = mul <2 x i64> %a0, <i64 -7, i64 -7>
1254 define <4 x i32> @mul_v4i32_neg63(<4 x i32> %a0) nounwind {
1255 ; X86-LABEL: mul_v4i32_neg63:
1257 ; X86-NEXT: pmulld {{\.LCPI.*}}, %xmm0
1260 ; X64-LABEL: mul_v4i32_neg63:
1262 ; X64-NEXT: pmulld {{.*}}(%rip), %xmm0
1265 ; X64-XOP-LABEL: mul_v4i32_neg63:
1267 ; X64-XOP-NEXT: vpmulld {{.*}}(%rip), %xmm0, %xmm0
1268 ; X64-XOP-NEXT: retq
1270 ; X64-AVX2-LABEL: mul_v4i32_neg63:
1271 ; X64-AVX2: # %bb.0:
1272 ; X64-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [4294967233,4294967233,4294967233,4294967233]
1273 ; X64-AVX2-NEXT: vpmulld %xmm1, %xmm0, %xmm0
1274 ; X64-AVX2-NEXT: retq
1276 ; X64-AVX512DQ-LABEL: mul_v4i32_neg63:
1277 ; X64-AVX512DQ: # %bb.0:
1278 ; X64-AVX512DQ-NEXT: vpmulld {{.*}}(%rip){1to4}, %xmm0, %xmm0
1279 ; X64-AVX512DQ-NEXT: retq
1280 %1 = mul <4 x i32> %a0, <i32 -63, i32 -63, i32 -63, i32 -63>
1284 define <8 x i16> @mul_v8i16_neg31(<8 x i16> %a0) nounwind {
1285 ; X86-LABEL: mul_v8i16_neg31:
1287 ; X86-NEXT: pmullw {{\.LCPI.*}}, %xmm0
1290 ; X64-LABEL: mul_v8i16_neg31:
1292 ; X64-NEXT: pmullw {{.*}}(%rip), %xmm0
1295 ; X64-AVX-LABEL: mul_v8i16_neg31:
1297 ; X64-AVX-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm0
1298 ; X64-AVX-NEXT: retq
1299 %1 = mul <8 x i16> %a0, <i16 -31, i16 -31, i16 -31, i16 -31, i16 -31, i16 -31, i16 -31, i16 -31>
1303 define <16 x i8> @mul_v16i8_neg15(<16 x i8> %a0) nounwind {
1304 ; X86-LABEL: mul_v16i8_neg15:
1306 ; X86-NEXT: movdqa %xmm0, %xmm1
1307 ; X86-NEXT: psllw $4, %xmm1
1308 ; X86-NEXT: pand {{\.LCPI.*}}, %xmm1
1309 ; X86-NEXT: psubb %xmm1, %xmm0
1312 ; X64-LABEL: mul_v16i8_neg15:
1314 ; X64-NEXT: movdqa %xmm0, %xmm1
1315 ; X64-NEXT: psllw $4, %xmm1
1316 ; X64-NEXT: pand {{.*}}(%rip), %xmm1
1317 ; X64-NEXT: psubb %xmm1, %xmm0
1320 ; X64-XOP-LABEL: mul_v16i8_neg15:
1322 ; X64-XOP-NEXT: vpshlb {{.*}}(%rip), %xmm0, %xmm1
1323 ; X64-XOP-NEXT: vpsubb %xmm1, %xmm0, %xmm0
1324 ; X64-XOP-NEXT: retq
1326 ; X64-AVX2-LABEL: mul_v16i8_neg15:
1327 ; X64-AVX2: # %bb.0:
1328 ; X64-AVX2-NEXT: vpsllw $4, %xmm0, %xmm1
1329 ; X64-AVX2-NEXT: vpand {{.*}}(%rip), %xmm1, %xmm1
1330 ; X64-AVX2-NEXT: vpsubb %xmm1, %xmm0, %xmm0
1331 ; X64-AVX2-NEXT: retq
1333 ; X64-AVX512DQ-LABEL: mul_v16i8_neg15:
1334 ; X64-AVX512DQ: # %bb.0:
1335 ; X64-AVX512DQ-NEXT: vpsllw $4, %xmm0, %xmm1
1336 ; X64-AVX512DQ-NEXT: vpand {{.*}}(%rip), %xmm1, %xmm1
1337 ; X64-AVX512DQ-NEXT: vpsubb %xmm1, %xmm0, %xmm0
1338 ; X64-AVX512DQ-NEXT: retq
1339 %1 = mul <16 x i8> %a0, <i8 -15, i8 -15, i8 -15, i8 -15, i8 -15, i8 -15, i8 -15, i8 -15, i8 -15, i8 -15, i8 -15, i8 -15, i8 -15, i8 -15, i8 -15, i8 -15>
1344 ; PowOf2 - 1 (non-uniform)
1347 define <2 x i64> @mul_v2i64_15_63(<2 x i64> %a0) nounwind {
1348 ; X86-LABEL: mul_v2i64_15_63:
1350 ; X86-NEXT: movdqa {{.*#+}} xmm1 = [15,0,63,0]
1351 ; X86-NEXT: movdqa %xmm0, %xmm2
1352 ; X86-NEXT: pmuludq %xmm1, %xmm2
1353 ; X86-NEXT: psrlq $32, %xmm0
1354 ; X86-NEXT: pmuludq %xmm1, %xmm0
1355 ; X86-NEXT: psllq $32, %xmm0
1356 ; X86-NEXT: paddq %xmm2, %xmm0
1359 ; X64-LABEL: mul_v2i64_15_63:
1361 ; X64-NEXT: movdqa {{.*#+}} xmm1 = [15,63]
1362 ; X64-NEXT: movdqa %xmm0, %xmm2
1363 ; X64-NEXT: pmuludq %xmm1, %xmm2
1364 ; X64-NEXT: psrlq $32, %xmm0
1365 ; X64-NEXT: pmuludq %xmm1, %xmm0
1366 ; X64-NEXT: psllq $32, %xmm0
1367 ; X64-NEXT: paddq %xmm2, %xmm0
1370 ; X64-XOP-LABEL: mul_v2i64_15_63:
1372 ; X64-XOP-NEXT: vmovdqa {{.*#+}} xmm1 = [15,63]
1373 ; X64-XOP-NEXT: vpmuludq %xmm1, %xmm0, %xmm2
1374 ; X64-XOP-NEXT: vpsrlq $32, %xmm0, %xmm0
1375 ; X64-XOP-NEXT: vpmuludq %xmm1, %xmm0, %xmm0
1376 ; X64-XOP-NEXT: vpsllq $32, %xmm0, %xmm0
1377 ; X64-XOP-NEXT: vpaddq %xmm0, %xmm2, %xmm0
1378 ; X64-XOP-NEXT: retq
1380 ; X64-AVX2-LABEL: mul_v2i64_15_63:
1381 ; X64-AVX2: # %bb.0:
1382 ; X64-AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [15,63]
1383 ; X64-AVX2-NEXT: vpmuludq %xmm1, %xmm0, %xmm2
1384 ; X64-AVX2-NEXT: vpsrlq $32, %xmm0, %xmm0
1385 ; X64-AVX2-NEXT: vpmuludq %xmm1, %xmm0, %xmm0
1386 ; X64-AVX2-NEXT: vpsllq $32, %xmm0, %xmm0
1387 ; X64-AVX2-NEXT: vpaddq %xmm0, %xmm2, %xmm0
1388 ; X64-AVX2-NEXT: retq
1390 ; X64-AVX512DQ-LABEL: mul_v2i64_15_63:
1391 ; X64-AVX512DQ: # %bb.0:
1392 ; X64-AVX512DQ-NEXT: vpmullq {{.*}}(%rip), %xmm0, %xmm0
1393 ; X64-AVX512DQ-NEXT: retq
1394 %1 = mul <2 x i64> %a0, <i64 15, i64 63>
1398 define <2 x i64> @mul_v2i64_neg_15_63(<2 x i64> %a0) nounwind {
1399 ; X86-LABEL: mul_v2i64_neg_15_63:
1401 ; X86-NEXT: pcmpeqd %xmm1, %xmm1
1402 ; X86-NEXT: pmuludq %xmm0, %xmm1
1403 ; X86-NEXT: movdqa %xmm0, %xmm2
1404 ; X86-NEXT: psrlq $32, %xmm2
1405 ; X86-NEXT: movdqa {{.*#+}} xmm3 = [4294967281,4294967295,4294967233,4294967295]
1406 ; X86-NEXT: pmuludq %xmm3, %xmm2
1407 ; X86-NEXT: paddq %xmm1, %xmm2
1408 ; X86-NEXT: psllq $32, %xmm2
1409 ; X86-NEXT: pmuludq %xmm3, %xmm0
1410 ; X86-NEXT: paddq %xmm2, %xmm0
1413 ; X64-LABEL: mul_v2i64_neg_15_63:
1415 ; X64-NEXT: movdqa {{.*#+}} xmm1 = [18446744073709551601,18446744073709551553]
1416 ; X64-NEXT: movdqa %xmm0, %xmm2
1417 ; X64-NEXT: pmuludq %xmm1, %xmm2
1418 ; X64-NEXT: movdqa %xmm0, %xmm3
1419 ; X64-NEXT: psrlq $32, %xmm3
1420 ; X64-NEXT: pmuludq %xmm1, %xmm3
1421 ; X64-NEXT: pmuludq {{.*}}(%rip), %xmm0
1422 ; X64-NEXT: paddq %xmm3, %xmm0
1423 ; X64-NEXT: psllq $32, %xmm0
1424 ; X64-NEXT: paddq %xmm2, %xmm0
1427 ; X64-XOP-LABEL: mul_v2i64_neg_15_63:
1429 ; X64-XOP-NEXT: vmovdqa {{.*#+}} xmm1 = [18446744073709551601,18446744073709551553]
1430 ; X64-XOP-NEXT: vpmuludq %xmm1, %xmm0, %xmm2
1431 ; X64-XOP-NEXT: vpsrlq $32, %xmm0, %xmm3
1432 ; X64-XOP-NEXT: vpmuludq %xmm1, %xmm3, %xmm1
1433 ; X64-XOP-NEXT: vpmuludq {{.*}}(%rip), %xmm0, %xmm0
1434 ; X64-XOP-NEXT: vpaddq %xmm1, %xmm0, %xmm0
1435 ; X64-XOP-NEXT: vpsllq $32, %xmm0, %xmm0
1436 ; X64-XOP-NEXT: vpaddq %xmm0, %xmm2, %xmm0
1437 ; X64-XOP-NEXT: retq
1439 ; X64-AVX2-LABEL: mul_v2i64_neg_15_63:
1440 ; X64-AVX2: # %bb.0:
1441 ; X64-AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [18446744073709551601,18446744073709551553]
1442 ; X64-AVX2-NEXT: vpmuludq %xmm1, %xmm0, %xmm2
1443 ; X64-AVX2-NEXT: vpsrlq $32, %xmm0, %xmm3
1444 ; X64-AVX2-NEXT: vpmuludq %xmm1, %xmm3, %xmm1
1445 ; X64-AVX2-NEXT: vpmuludq {{.*}}(%rip), %xmm0, %xmm0
1446 ; X64-AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm0
1447 ; X64-AVX2-NEXT: vpsllq $32, %xmm0, %xmm0
1448 ; X64-AVX2-NEXT: vpaddq %xmm0, %xmm2, %xmm0
1449 ; X64-AVX2-NEXT: retq
1451 ; X64-AVX512DQ-LABEL: mul_v2i64_neg_15_63:
1452 ; X64-AVX512DQ: # %bb.0:
1453 ; X64-AVX512DQ-NEXT: vpmullq {{.*}}(%rip), %xmm0, %xmm0
1454 ; X64-AVX512DQ-NEXT: retq
1455 %1 = mul <2 x i64> %a0, <i64 -15, i64 -63>
1459 define <2 x i64> @mul_v2i64_neg_17_65(<2 x i64> %a0) nounwind {
1460 ; X86-LABEL: mul_v2i64_neg_17_65:
1462 ; X86-NEXT: pcmpeqd %xmm1, %xmm1
1463 ; X86-NEXT: pmuludq %xmm0, %xmm1
1464 ; X86-NEXT: movdqa %xmm0, %xmm2
1465 ; X86-NEXT: psrlq $32, %xmm2
1466 ; X86-NEXT: movdqa {{.*#+}} xmm3 = [4294967279,4294967295,4294967231,4294967295]
1467 ; X86-NEXT: pmuludq %xmm3, %xmm2
1468 ; X86-NEXT: paddq %xmm1, %xmm2
1469 ; X86-NEXT: psllq $32, %xmm2
1470 ; X86-NEXT: pmuludq %xmm3, %xmm0
1471 ; X86-NEXT: paddq %xmm2, %xmm0
1474 ; X64-LABEL: mul_v2i64_neg_17_65:
1476 ; X64-NEXT: movdqa {{.*#+}} xmm1 = [18446744073709551599,18446744073709551551]
1477 ; X64-NEXT: movdqa %xmm0, %xmm2
1478 ; X64-NEXT: pmuludq %xmm1, %xmm2
1479 ; X64-NEXT: movdqa %xmm0, %xmm3
1480 ; X64-NEXT: psrlq $32, %xmm3
1481 ; X64-NEXT: pmuludq %xmm1, %xmm3
1482 ; X64-NEXT: pmuludq {{.*}}(%rip), %xmm0
1483 ; X64-NEXT: paddq %xmm3, %xmm0
1484 ; X64-NEXT: psllq $32, %xmm0
1485 ; X64-NEXT: paddq %xmm2, %xmm0
1488 ; X64-XOP-LABEL: mul_v2i64_neg_17_65:
1490 ; X64-XOP-NEXT: vmovdqa {{.*#+}} xmm1 = [18446744073709551599,18446744073709551551]
1491 ; X64-XOP-NEXT: vpmuludq %xmm1, %xmm0, %xmm2
1492 ; X64-XOP-NEXT: vpsrlq $32, %xmm0, %xmm3
1493 ; X64-XOP-NEXT: vpmuludq %xmm1, %xmm3, %xmm1
1494 ; X64-XOP-NEXT: vpmuludq {{.*}}(%rip), %xmm0, %xmm0
1495 ; X64-XOP-NEXT: vpaddq %xmm1, %xmm0, %xmm0
1496 ; X64-XOP-NEXT: vpsllq $32, %xmm0, %xmm0
1497 ; X64-XOP-NEXT: vpaddq %xmm0, %xmm2, %xmm0
1498 ; X64-XOP-NEXT: retq
1500 ; X64-AVX2-LABEL: mul_v2i64_neg_17_65:
1501 ; X64-AVX2: # %bb.0:
1502 ; X64-AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [18446744073709551599,18446744073709551551]
1503 ; X64-AVX2-NEXT: vpmuludq %xmm1, %xmm0, %xmm2
1504 ; X64-AVX2-NEXT: vpsrlq $32, %xmm0, %xmm3
1505 ; X64-AVX2-NEXT: vpmuludq %xmm1, %xmm3, %xmm1
1506 ; X64-AVX2-NEXT: vpmuludq {{.*}}(%rip), %xmm0, %xmm0
1507 ; X64-AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm0
1508 ; X64-AVX2-NEXT: vpsllq $32, %xmm0, %xmm0
1509 ; X64-AVX2-NEXT: vpaddq %xmm0, %xmm2, %xmm0
1510 ; X64-AVX2-NEXT: retq
1512 ; X64-AVX512DQ-LABEL: mul_v2i64_neg_17_65:
1513 ; X64-AVX512DQ: # %bb.0:
1514 ; X64-AVX512DQ-NEXT: vpmullq {{.*}}(%rip), %xmm0, %xmm0
1515 ; X64-AVX512DQ-NEXT: retq
1516 %1 = mul <2 x i64> %a0, <i64 -17, i64 -65>
1520 define <2 x i64> @mul_v2i64_0_1(<2 x i64> %a0) nounwind {
1521 ; X86-LABEL: mul_v2i64_0_1:
1523 ; X86-NEXT: movdqa {{.*#+}} xmm1 = [0,0,1,0]
1524 ; X86-NEXT: movdqa %xmm0, %xmm2
1525 ; X86-NEXT: pmuludq %xmm1, %xmm2
1526 ; X86-NEXT: psrlq $32, %xmm0
1527 ; X86-NEXT: pmuludq %xmm1, %xmm0
1528 ; X86-NEXT: psllq $32, %xmm0
1529 ; X86-NEXT: paddq %xmm2, %xmm0
1532 ; X64-LABEL: mul_v2i64_0_1:
1534 ; X64-NEXT: movdqa {{.*#+}} xmm1 = [0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0]
1535 ; X64-NEXT: movdqa %xmm0, %xmm2
1536 ; X64-NEXT: pmuludq %xmm1, %xmm2
1537 ; X64-NEXT: psrlq $32, %xmm0
1538 ; X64-NEXT: pmuludq %xmm1, %xmm0
1539 ; X64-NEXT: psllq $32, %xmm0
1540 ; X64-NEXT: paddq %xmm2, %xmm0
1543 ; X64-XOP-LABEL: mul_v2i64_0_1:
1545 ; X64-XOP-NEXT: vmovdqa {{.*#+}} xmm1 = [0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0]
1546 ; X64-XOP-NEXT: vpmuludq %xmm1, %xmm0, %xmm2
1547 ; X64-XOP-NEXT: vpsrlq $32, %xmm0, %xmm0
1548 ; X64-XOP-NEXT: vpmuludq %xmm1, %xmm0, %xmm0
1549 ; X64-XOP-NEXT: vpsllq $32, %xmm0, %xmm0
1550 ; X64-XOP-NEXT: vpaddq %xmm0, %xmm2, %xmm0
1551 ; X64-XOP-NEXT: retq
1553 ; X64-AVX2-LABEL: mul_v2i64_0_1:
1554 ; X64-AVX2: # %bb.0:
1555 ; X64-AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0]
1556 ; X64-AVX2-NEXT: vpmuludq %xmm1, %xmm0, %xmm2
1557 ; X64-AVX2-NEXT: vpsrlq $32, %xmm0, %xmm0
1558 ; X64-AVX2-NEXT: vpmuludq %xmm1, %xmm0, %xmm0
1559 ; X64-AVX2-NEXT: vpsllq $32, %xmm0, %xmm0
1560 ; X64-AVX2-NEXT: vpaddq %xmm0, %xmm2, %xmm0
1561 ; X64-AVX2-NEXT: retq
1563 ; X64-AVX512DQ-LABEL: mul_v2i64_0_1:
1564 ; X64-AVX512DQ: # %bb.0:
1565 ; X64-AVX512DQ-NEXT: vpmullq {{.*}}(%rip), %xmm0, %xmm0
1566 ; X64-AVX512DQ-NEXT: retq
1567 %1 = mul <2 x i64> %a0, <i64 0, i64 1>
1571 define <2 x i64> @mul_v2i64_neg_0_1(<2 x i64> %a0) nounwind {
1572 ; X86-LABEL: mul_v2i64_neg_0_1:
1574 ; X86-NEXT: movdqa %xmm0, %xmm1
1575 ; X86-NEXT: psrlq $32, %xmm1
1576 ; X86-NEXT: movdqa {{.*#+}} xmm2 = [0,0,4294967295,4294967295]
1577 ; X86-NEXT: pmuludq %xmm2, %xmm1
1578 ; X86-NEXT: movdqa %xmm2, %xmm3
1579 ; X86-NEXT: psrlq $32, %xmm3
1580 ; X86-NEXT: pmuludq %xmm0, %xmm3
1581 ; X86-NEXT: paddq %xmm1, %xmm3
1582 ; X86-NEXT: psllq $32, %xmm3
1583 ; X86-NEXT: pmuludq %xmm2, %xmm0
1584 ; X86-NEXT: paddq %xmm3, %xmm0
1587 ; X64-LABEL: mul_v2i64_neg_0_1:
1589 ; X64-NEXT: movdqa {{.*#+}} xmm1 = [0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255]
1590 ; X64-NEXT: movdqa %xmm0, %xmm2
1591 ; X64-NEXT: pmuludq %xmm1, %xmm2
1592 ; X64-NEXT: movdqa %xmm0, %xmm3
1593 ; X64-NEXT: psrlq $32, %xmm3
1594 ; X64-NEXT: pmuludq %xmm1, %xmm3
1595 ; X64-NEXT: pmuludq {{.*}}(%rip), %xmm0
1596 ; X64-NEXT: paddq %xmm3, %xmm0
1597 ; X64-NEXT: psllq $32, %xmm0
1598 ; X64-NEXT: paddq %xmm2, %xmm0
1601 ; X64-XOP-LABEL: mul_v2i64_neg_0_1:
1603 ; X64-XOP-NEXT: vmovdqa {{.*#+}} xmm1 = [0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255]
1604 ; X64-XOP-NEXT: vpmuludq %xmm1, %xmm0, %xmm2
1605 ; X64-XOP-NEXT: vpsrlq $32, %xmm0, %xmm3
1606 ; X64-XOP-NEXT: vpmuludq %xmm1, %xmm3, %xmm1
1607 ; X64-XOP-NEXT: vpmuludq {{.*}}(%rip), %xmm0, %xmm0
1608 ; X64-XOP-NEXT: vpaddq %xmm1, %xmm0, %xmm0
1609 ; X64-XOP-NEXT: vpsllq $32, %xmm0, %xmm0
1610 ; X64-XOP-NEXT: vpaddq %xmm0, %xmm2, %xmm0
1611 ; X64-XOP-NEXT: retq
1613 ; X64-AVX2-LABEL: mul_v2i64_neg_0_1:
1614 ; X64-AVX2: # %bb.0:
1615 ; X64-AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255]
1616 ; X64-AVX2-NEXT: vpmuludq %xmm1, %xmm0, %xmm2
1617 ; X64-AVX2-NEXT: vpsrlq $32, %xmm0, %xmm3
1618 ; X64-AVX2-NEXT: vpmuludq %xmm1, %xmm3, %xmm1
1619 ; X64-AVX2-NEXT: vpmuludq {{.*}}(%rip), %xmm0, %xmm0
1620 ; X64-AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm0
1621 ; X64-AVX2-NEXT: vpsllq $32, %xmm0, %xmm0
1622 ; X64-AVX2-NEXT: vpaddq %xmm0, %xmm2, %xmm0
1623 ; X64-AVX2-NEXT: retq
1625 ; X64-AVX512DQ-LABEL: mul_v2i64_neg_0_1:
1626 ; X64-AVX512DQ: # %bb.0:
1627 ; X64-AVX512DQ-NEXT: vpmullq {{.*}}(%rip), %xmm0, %xmm0
1628 ; X64-AVX512DQ-NEXT: retq
1629 %1 = mul <2 x i64> %a0, <i64 0, i64 -1>
1633 define <2 x i64> @mul_v2i64_15_neg_63(<2 x i64> %a0) nounwind {
1634 ; X86-LABEL: mul_v2i64_15_neg_63:
1636 ; X86-NEXT: movdqa %xmm0, %xmm1
1637 ; X86-NEXT: psrlq $32, %xmm1
1638 ; X86-NEXT: movdqa {{.*#+}} xmm2 = [15,0,4294967233,4294967295]
1639 ; X86-NEXT: pmuludq %xmm2, %xmm1
1640 ; X86-NEXT: movdqa %xmm2, %xmm3
1641 ; X86-NEXT: psrlq $32, %xmm3
1642 ; X86-NEXT: pmuludq %xmm0, %xmm3
1643 ; X86-NEXT: paddq %xmm1, %xmm3
1644 ; X86-NEXT: psllq $32, %xmm3
1645 ; X86-NEXT: pmuludq %xmm2, %xmm0
1646 ; X86-NEXT: paddq %xmm3, %xmm0
1649 ; X64-LABEL: mul_v2i64_15_neg_63:
1651 ; X64-NEXT: movdqa {{.*#+}} xmm1 = [15,18446744073709551553]
1652 ; X64-NEXT: movdqa %xmm0, %xmm2
1653 ; X64-NEXT: pmuludq %xmm1, %xmm2
1654 ; X64-NEXT: movdqa %xmm0, %xmm3
1655 ; X64-NEXT: psrlq $32, %xmm3
1656 ; X64-NEXT: pmuludq %xmm1, %xmm3
1657 ; X64-NEXT: pmuludq {{.*}}(%rip), %xmm0
1658 ; X64-NEXT: paddq %xmm3, %xmm0
1659 ; X64-NEXT: psllq $32, %xmm0
1660 ; X64-NEXT: paddq %xmm2, %xmm0
1663 ; X64-XOP-LABEL: mul_v2i64_15_neg_63:
1665 ; X64-XOP-NEXT: vmovdqa {{.*#+}} xmm1 = [15,18446744073709551553]
1666 ; X64-XOP-NEXT: vpmuludq %xmm1, %xmm0, %xmm2
1667 ; X64-XOP-NEXT: vpsrlq $32, %xmm0, %xmm3
1668 ; X64-XOP-NEXT: vpmuludq %xmm1, %xmm3, %xmm1
1669 ; X64-XOP-NEXT: vpmuludq {{.*}}(%rip), %xmm0, %xmm0
1670 ; X64-XOP-NEXT: vpaddq %xmm1, %xmm0, %xmm0
1671 ; X64-XOP-NEXT: vpsllq $32, %xmm0, %xmm0
1672 ; X64-XOP-NEXT: vpaddq %xmm0, %xmm2, %xmm0
1673 ; X64-XOP-NEXT: retq
1675 ; X64-AVX2-LABEL: mul_v2i64_15_neg_63:
1676 ; X64-AVX2: # %bb.0:
1677 ; X64-AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [15,18446744073709551553]
1678 ; X64-AVX2-NEXT: vpmuludq %xmm1, %xmm0, %xmm2
1679 ; X64-AVX2-NEXT: vpsrlq $32, %xmm0, %xmm3
1680 ; X64-AVX2-NEXT: vpmuludq %xmm1, %xmm3, %xmm1
1681 ; X64-AVX2-NEXT: vpmuludq {{.*}}(%rip), %xmm0, %xmm0
1682 ; X64-AVX2-NEXT: vpaddq %xmm1, %xmm0, %xmm0
1683 ; X64-AVX2-NEXT: vpsllq $32, %xmm0, %xmm0
1684 ; X64-AVX2-NEXT: vpaddq %xmm0, %xmm2, %xmm0
1685 ; X64-AVX2-NEXT: retq
1687 ; X64-AVX512DQ-LABEL: mul_v2i64_15_neg_63:
1688 ; X64-AVX512DQ: # %bb.0:
1689 ; X64-AVX512DQ-NEXT: vpmullq {{.*}}(%rip), %xmm0, %xmm0
1690 ; X64-AVX512DQ-NEXT: retq
1691 %1 = mul <2 x i64> %a0, <i64 15, i64 -63>
1695 define <4 x i32> @mul_v4i32_0_15_31_7(<4 x i32> %a0) nounwind {
1696 ; X86-LABEL: mul_v4i32_0_15_31_7:
1698 ; X86-NEXT: pmulld {{\.LCPI.*}}, %xmm0
1701 ; X64-LABEL: mul_v4i32_0_15_31_7:
1703 ; X64-NEXT: pmulld {{.*}}(%rip), %xmm0
1706 ; X64-AVX-LABEL: mul_v4i32_0_15_31_7:
1708 ; X64-AVX-NEXT: vpmulld {{.*}}(%rip), %xmm0, %xmm0
1709 ; X64-AVX-NEXT: retq
1710 %1 = mul <4 x i32> %a0, <i32 0, i32 15, i32 31, i32 7>
1714 define <8 x i16> @mul_v8i16_0_1_7_15_31_63_127_255(<8 x i16> %a0) nounwind {
1715 ; X86-LABEL: mul_v8i16_0_1_7_15_31_63_127_255:
1717 ; X86-NEXT: pmullw {{\.LCPI.*}}, %xmm0
1720 ; X64-LABEL: mul_v8i16_0_1_7_15_31_63_127_255:
1722 ; X64-NEXT: pmullw {{.*}}(%rip), %xmm0
1725 ; X64-AVX-LABEL: mul_v8i16_0_1_7_15_31_63_127_255:
1727 ; X64-AVX-NEXT: vpmullw {{.*}}(%rip), %xmm0, %xmm0
1728 ; X64-AVX-NEXT: retq
1729 %1 = mul <8 x i16> %a0, <i16 0, i16 1, i16 7, i16 15, i16 31, i16 63, i16 127, i16 255>
1733 define <16 x i8> @mul_v16i8_0_1_3_7_15_31_63_127_0_1_3_7_15_31_63_127(<16 x i8> %a0) nounwind {
1734 ; X86-LABEL: mul_v16i8_0_1_3_7_15_31_63_127_0_1_3_7_15_31_63_127:
1736 ; X86-NEXT: pmovzxbw {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1737 ; X86-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1738 ; X86-NEXT: movdqa {{.*#+}} xmm2 = [0,1,3,7,15,31,63,127]
1739 ; X86-NEXT: pmullw %xmm2, %xmm0
1740 ; X86-NEXT: movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
1741 ; X86-NEXT: pand %xmm3, %xmm0
1742 ; X86-NEXT: pmullw %xmm2, %xmm1
1743 ; X86-NEXT: pand %xmm3, %xmm1
1744 ; X86-NEXT: packuswb %xmm0, %xmm1
1745 ; X86-NEXT: movdqa %xmm1, %xmm0
1748 ; X64-LABEL: mul_v16i8_0_1_3_7_15_31_63_127_0_1_3_7_15_31_63_127:
1750 ; X64-NEXT: pmovzxbw {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1751 ; X64-NEXT: punpckhbw {{.*#+}} xmm0 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1752 ; X64-NEXT: movdqa {{.*#+}} xmm2 = [0,1,3,7,15,31,63,127]
1753 ; X64-NEXT: pmullw %xmm2, %xmm0
1754 ; X64-NEXT: movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
1755 ; X64-NEXT: pand %xmm3, %xmm0
1756 ; X64-NEXT: pmullw %xmm2, %xmm1
1757 ; X64-NEXT: pand %xmm3, %xmm1
1758 ; X64-NEXT: packuswb %xmm0, %xmm1
1759 ; X64-NEXT: movdqa %xmm1, %xmm0
1762 ; X64-XOP-LABEL: mul_v16i8_0_1_3_7_15_31_63_127_0_1_3_7_15_31_63_127:
1764 ; X64-XOP-NEXT: vpunpckhbw {{.*#+}} xmm1 = xmm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
1765 ; X64-XOP-NEXT: vmovdqa {{.*#+}} xmm2 = [0,1,3,7,15,31,63,127]
1766 ; X64-XOP-NEXT: vpmullw %xmm2, %xmm1, %xmm1
1767 ; X64-XOP-NEXT: vpmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1768 ; X64-XOP-NEXT: vpmullw %xmm2, %xmm0, %xmm0
1769 ; X64-XOP-NEXT: vpperm {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14],xmm1[0,2,4,6,8,10,12,14]
1770 ; X64-XOP-NEXT: retq
1772 ; X64-AVX2-LABEL: mul_v16i8_0_1_3_7_15_31_63_127_0_1_3_7_15_31_63_127:
1773 ; X64-AVX2: # %bb.0:
1774 ; X64-AVX2-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
1775 ; X64-AVX2-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0
1776 ; X64-AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0
1777 ; X64-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
1778 ; X64-AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
1779 ; X64-AVX2-NEXT: vzeroupper
1780 ; X64-AVX2-NEXT: retq
1782 ; X64-AVX512DQ-LABEL: mul_v16i8_0_1_3_7_15_31_63_127_0_1_3_7_15_31_63_127:
1783 ; X64-AVX512DQ: # %bb.0:
1784 ; X64-AVX512DQ-NEXT: vpmovzxbw {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero,xmm0[8],zero,xmm0[9],zero,xmm0[10],zero,xmm0[11],zero,xmm0[12],zero,xmm0[13],zero,xmm0[14],zero,xmm0[15],zero
1785 ; X64-AVX512DQ-NEXT: vpmullw {{.*}}(%rip), %ymm0, %ymm0
1786 ; X64-AVX512DQ-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
1787 ; X64-AVX512DQ-NEXT: vpmovdb %zmm0, %xmm0
1788 ; X64-AVX512DQ-NEXT: vzeroupper
1789 ; X64-AVX512DQ-NEXT: retq
1790 %1 = mul <16 x i8> %a0, <i8 0, i8 1, i8 3, i8 7, i8 15, i8 31, i8 63, i8 127, i8 0, i8 1, i8 3, i8 7, i8 15, i8 31, i8 63, i8 127>
1794 define <2 x i64> @mul_v2i64_68_132(<2 x i64> %x) nounwind {
1795 ; X86-LABEL: mul_v2i64_68_132:
1797 ; X86-NEXT: movdqa {{.*#+}} xmm1 = [68,0,132,0]
1798 ; X86-NEXT: movdqa %xmm0, %xmm2
1799 ; X86-NEXT: pmuludq %xmm1, %xmm2
1800 ; X86-NEXT: psrlq $32, %xmm0
1801 ; X86-NEXT: pmuludq %xmm1, %xmm0
1802 ; X86-NEXT: psllq $32, %xmm0
1803 ; X86-NEXT: paddq %xmm2, %xmm0
1806 ; X64-LABEL: mul_v2i64_68_132:
1808 ; X64-NEXT: movdqa {{.*#+}} xmm1 = [68,132]
1809 ; X64-NEXT: movdqa %xmm0, %xmm2
1810 ; X64-NEXT: pmuludq %xmm1, %xmm2
1811 ; X64-NEXT: psrlq $32, %xmm0
1812 ; X64-NEXT: pmuludq %xmm1, %xmm0
1813 ; X64-NEXT: psllq $32, %xmm0
1814 ; X64-NEXT: paddq %xmm2, %xmm0
1817 ; X64-XOP-LABEL: mul_v2i64_68_132:
1819 ; X64-XOP-NEXT: vmovdqa {{.*#+}} xmm1 = [68,132]
1820 ; X64-XOP-NEXT: vpmuludq %xmm1, %xmm0, %xmm2
1821 ; X64-XOP-NEXT: vpsrlq $32, %xmm0, %xmm0
1822 ; X64-XOP-NEXT: vpmuludq %xmm1, %xmm0, %xmm0
1823 ; X64-XOP-NEXT: vpsllq $32, %xmm0, %xmm0
1824 ; X64-XOP-NEXT: vpaddq %xmm0, %xmm2, %xmm0
1825 ; X64-XOP-NEXT: retq
1827 ; X64-AVX2-LABEL: mul_v2i64_68_132:
1828 ; X64-AVX2: # %bb.0:
1829 ; X64-AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [68,132]
1830 ; X64-AVX2-NEXT: vpmuludq %xmm1, %xmm0, %xmm2
1831 ; X64-AVX2-NEXT: vpsrlq $32, %xmm0, %xmm0
1832 ; X64-AVX2-NEXT: vpmuludq %xmm1, %xmm0, %xmm0
1833 ; X64-AVX2-NEXT: vpsllq $32, %xmm0, %xmm0
1834 ; X64-AVX2-NEXT: vpaddq %xmm0, %xmm2, %xmm0
1835 ; X64-AVX2-NEXT: retq
1837 ; X64-AVX512DQ-LABEL: mul_v2i64_68_132:
1838 ; X64-AVX512DQ: # %bb.0:
1839 ; X64-AVX512DQ-NEXT: vpmullq {{.*}}(%rip), %xmm0, %xmm0
1840 ; X64-AVX512DQ-NEXT: retq
1841 %mul = mul <2 x i64> %x, <i64 68, i64 132>
1845 define <2 x i64> @mul_v2i64_60_120(<2 x i64> %x) nounwind {
1846 ; X86-LABEL: mul_v2i64_60_120:
1848 ; X86-NEXT: movdqa {{.*#+}} xmm1 = [60,0,124,0]
1849 ; X86-NEXT: movdqa %xmm0, %xmm2
1850 ; X86-NEXT: pmuludq %xmm1, %xmm2
1851 ; X86-NEXT: psrlq $32, %xmm0
1852 ; X86-NEXT: pmuludq %xmm1, %xmm0
1853 ; X86-NEXT: psllq $32, %xmm0
1854 ; X86-NEXT: paddq %xmm2, %xmm0
1857 ; X64-LABEL: mul_v2i64_60_120:
1859 ; X64-NEXT: movdqa {{.*#+}} xmm1 = [60,124]
1860 ; X64-NEXT: movdqa %xmm0, %xmm2
1861 ; X64-NEXT: pmuludq %xmm1, %xmm2
1862 ; X64-NEXT: psrlq $32, %xmm0
1863 ; X64-NEXT: pmuludq %xmm1, %xmm0
1864 ; X64-NEXT: psllq $32, %xmm0
1865 ; X64-NEXT: paddq %xmm2, %xmm0
1868 ; X64-XOP-LABEL: mul_v2i64_60_120:
1870 ; X64-XOP-NEXT: vmovdqa {{.*#+}} xmm1 = [60,124]
1871 ; X64-XOP-NEXT: vpmuludq %xmm1, %xmm0, %xmm2
1872 ; X64-XOP-NEXT: vpsrlq $32, %xmm0, %xmm0
1873 ; X64-XOP-NEXT: vpmuludq %xmm1, %xmm0, %xmm0
1874 ; X64-XOP-NEXT: vpsllq $32, %xmm0, %xmm0
1875 ; X64-XOP-NEXT: vpaddq %xmm0, %xmm2, %xmm0
1876 ; X64-XOP-NEXT: retq
1878 ; X64-AVX2-LABEL: mul_v2i64_60_120:
1879 ; X64-AVX2: # %bb.0:
1880 ; X64-AVX2-NEXT: vmovdqa {{.*#+}} xmm1 = [60,124]
1881 ; X64-AVX2-NEXT: vpmuludq %xmm1, %xmm0, %xmm2
1882 ; X64-AVX2-NEXT: vpsrlq $32, %xmm0, %xmm0
1883 ; X64-AVX2-NEXT: vpmuludq %xmm1, %xmm0, %xmm0
1884 ; X64-AVX2-NEXT: vpsllq $32, %xmm0, %xmm0
1885 ; X64-AVX2-NEXT: vpaddq %xmm0, %xmm2, %xmm0
1886 ; X64-AVX2-NEXT: retq
1888 ; X64-AVX512DQ-LABEL: mul_v2i64_60_120:
1889 ; X64-AVX512DQ: # %bb.0:
1890 ; X64-AVX512DQ-NEXT: vpmullq {{.*}}(%rip), %xmm0, %xmm0
1891 ; X64-AVX512DQ-NEXT: retq
1892 %mul = mul <2 x i64> %x, <i64 60, i64 124>
1896 ; We unfortunately can't see the zext that lives in the other basic block so we
1897 ; don't know that we only need one pmuludq to compute the full 64 bits. This
1898 ; sort of issue is more likely to occur when there is a loop and one of the
1899 ; multiply inputs is loop invariant.
1900 ; FIXME: We should be able to insert an AssertZExt for this.
1901 define <2 x i64> @mul_v2i64_zext_cross_bb(<2 x i32>* %in, <2 x i32>* %y) {
1902 ; X86-LABEL: mul_v2i64_zext_cross_bb:
1904 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
1905 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
1906 ; X86-NEXT: pmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero
1907 ; X86-NEXT: pmovzxdq {{.*#+}} xmm1 = mem[0],zero,mem[1],zero
1908 ; X86-NEXT: pmuludq %xmm1, %xmm0
1911 ; X64-LABEL: mul_v2i64_zext_cross_bb:
1913 ; X64-NEXT: pmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero
1914 ; X64-NEXT: pmovzxdq {{.*#+}} xmm1 = mem[0],zero,mem[1],zero
1915 ; X64-NEXT: pmuludq %xmm1, %xmm0
1918 ; X64-AVX-LABEL: mul_v2i64_zext_cross_bb:
1920 ; X64-AVX-NEXT: vpmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero
1921 ; X64-AVX-NEXT: vpmovzxdq {{.*#+}} xmm1 = mem[0],zero,mem[1],zero
1922 ; X64-AVX-NEXT: vpmuludq %xmm1, %xmm0, %xmm0
1923 ; X64-AVX-NEXT: retq
1924 %a = load <2 x i32>, <2 x i32>* %in
1925 %b = zext <2 x i32> %a to <2 x i64>
1929 %c = load <2 x i32>, <2 x i32>* %y
1930 %d = zext <2 x i32> %c to <2 x i64>
1931 %e = mul <2 x i64> %b, %d
1935 define <4 x i64> @mul_v4i64_zext_cross_bb(<4 x i32>* %in, <4 x i32>* %y) {
1936 ; X86-LABEL: mul_v4i64_zext_cross_bb:
1938 ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax
1939 ; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
1940 ; X86-NEXT: pmovzxdq {{.*#+}} xmm1 = mem[0],zero,mem[1],zero
1941 ; X86-NEXT: pmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero
1942 ; X86-NEXT: pmovzxdq {{.*#+}} xmm2 = mem[0],zero,mem[1],zero
1943 ; X86-NEXT: pmuludq %xmm2, %xmm1
1944 ; X86-NEXT: pmovzxdq {{.*#+}} xmm2 = mem[0],zero,mem[1],zero
1945 ; X86-NEXT: pmuludq %xmm2, %xmm0
1948 ; X64-LABEL: mul_v4i64_zext_cross_bb:
1950 ; X64-NEXT: pmovzxdq {{.*#+}} xmm1 = mem[0],zero,mem[1],zero
1951 ; X64-NEXT: pmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero
1952 ; X64-NEXT: pmovzxdq {{.*#+}} xmm2 = mem[0],zero,mem[1],zero
1953 ; X64-NEXT: pmuludq %xmm2, %xmm1
1954 ; X64-NEXT: pmovzxdq {{.*#+}} xmm2 = mem[0],zero,mem[1],zero
1955 ; X64-NEXT: pmuludq %xmm2, %xmm0
1958 ; X64-XOP-LABEL: mul_v4i64_zext_cross_bb:
1960 ; X64-XOP-NEXT: vpmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero
1961 ; X64-XOP-NEXT: vpmovzxdq {{.*#+}} xmm1 = mem[0],zero,mem[1],zero
1962 ; X64-XOP-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0
1963 ; X64-XOP-NEXT: vpmovzxdq {{.*#+}} xmm1 = mem[0],zero,mem[1],zero
1964 ; X64-XOP-NEXT: vpmovzxdq {{.*#+}} xmm2 = mem[0],zero,mem[1],zero
1965 ; X64-XOP-NEXT: vextractf128 $1, %ymm0, %xmm3
1966 ; X64-XOP-NEXT: vpmuludq %xmm2, %xmm3, %xmm2
1967 ; X64-XOP-NEXT: vpmuludq %xmm1, %xmm0, %xmm0
1968 ; X64-XOP-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
1969 ; X64-XOP-NEXT: retq
1971 ; X64-AVX2-LABEL: mul_v4i64_zext_cross_bb:
1972 ; X64-AVX2: # %bb.0:
1973 ; X64-AVX2-NEXT: vpmovzxdq {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
1974 ; X64-AVX2-NEXT: vpmovzxdq {{.*#+}} ymm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
1975 ; X64-AVX2-NEXT: vpmuludq %ymm1, %ymm0, %ymm0
1976 ; X64-AVX2-NEXT: retq
1978 ; X64-AVX512DQ-LABEL: mul_v4i64_zext_cross_bb:
1979 ; X64-AVX512DQ: # %bb.0:
1980 ; X64-AVX512DQ-NEXT: vpmovzxdq {{.*#+}} ymm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
1981 ; X64-AVX512DQ-NEXT: vpmovzxdq {{.*#+}} ymm1 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
1982 ; X64-AVX512DQ-NEXT: vpmuludq %ymm1, %ymm0, %ymm0
1983 ; X64-AVX512DQ-NEXT: retq
1984 %a = load <4 x i32>, <4 x i32>* %in
1985 %b = zext <4 x i32> %a to <4 x i64>
1989 %c = load <4 x i32>, <4 x i32>* %y
1990 %d = zext <4 x i32> %c to <4 x i64>
1991 %e = mul <4 x i64> %b, %d