[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / X86 / vector-mul.ll
blob805ff9f69ed5e8556e93a034a54afda6717c8ddf
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
9 ; PowOf2 (uniform)
12 define <2 x i64> @mul_v2i64_8(<2 x i64> %a0) nounwind {
13 ; X86-LABEL: mul_v2i64_8:
14 ; X86:       # %bb.0:
15 ; X86-NEXT:    psllq $3, %xmm0
16 ; X86-NEXT:    retl
18 ; X64-LABEL: mul_v2i64_8:
19 ; X64:       # %bb.0:
20 ; X64-NEXT:    psllq $3, %xmm0
21 ; X64-NEXT:    retq
23 ; X64-AVX-LABEL: mul_v2i64_8:
24 ; X64-AVX:       # %bb.0:
25 ; X64-AVX-NEXT:    vpsllq $3, %xmm0, %xmm0
26 ; X64-AVX-NEXT:    retq
27   %1 = mul <2 x i64> %a0, <i64 8, i64 8>
28   ret <2 x i64> %1
31 define <4 x i32> @mul_v4i32_8(<4 x i32> %a0) nounwind {
32 ; X86-LABEL: mul_v4i32_8:
33 ; X86:       # %bb.0:
34 ; X86-NEXT:    pslld $3, %xmm0
35 ; X86-NEXT:    retl
37 ; X64-LABEL: mul_v4i32_8:
38 ; X64:       # %bb.0:
39 ; X64-NEXT:    pslld $3, %xmm0
40 ; X64-NEXT:    retq
42 ; X64-AVX-LABEL: mul_v4i32_8:
43 ; X64-AVX:       # %bb.0:
44 ; X64-AVX-NEXT:    vpslld $3, %xmm0, %xmm0
45 ; X64-AVX-NEXT:    retq
46   %1 = mul <4 x i32> %a0, <i32 8, i32 8, i32 8, i32 8>
47   ret <4 x i32> %1
50 define <8 x i16> @mul_v8i16_8(<8 x i16> %a0) nounwind {
51 ; X86-LABEL: mul_v8i16_8:
52 ; X86:       # %bb.0:
53 ; X86-NEXT:    psllw $3, %xmm0
54 ; X86-NEXT:    retl
56 ; X64-LABEL: mul_v8i16_8:
57 ; X64:       # %bb.0:
58 ; X64-NEXT:    psllw $3, %xmm0
59 ; X64-NEXT:    retq
61 ; X64-AVX-LABEL: mul_v8i16_8:
62 ; X64-AVX:       # %bb.0:
63 ; X64-AVX-NEXT:    vpsllw $3, %xmm0, %xmm0
64 ; X64-AVX-NEXT:    retq
65   %1 = mul <8 x i16> %a0, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
66   ret <8 x i16> %1
69 define <16 x i8> @mul_v16i8_32(<16 x i8> %a0) nounwind {
70 ; X86-LABEL: mul_v16i8_32:
71 ; X86:       # %bb.0:
72 ; X86-NEXT:    psllw $5, %xmm0
73 ; X86-NEXT:    pand {{\.LCPI.*}}, %xmm0
74 ; X86-NEXT:    retl
76 ; X64-LABEL: mul_v16i8_32:
77 ; X64:       # %bb.0:
78 ; X64-NEXT:    psllw $5, %xmm0
79 ; X64-NEXT:    pand {{.*}}(%rip), %xmm0
80 ; X64-NEXT:    retq
82 ; X64-XOP-LABEL: mul_v16i8_32:
83 ; X64-XOP:       # %bb.0:
84 ; X64-XOP-NEXT:    vpshlb {{.*}}(%rip), %xmm0, %xmm0
85 ; X64-XOP-NEXT:    retq
87 ; X64-AVX2-LABEL: mul_v16i8_32:
88 ; X64-AVX2:       # %bb.0:
89 ; X64-AVX2-NEXT:    vpsllw $5, %xmm0, %xmm0
90 ; X64-AVX2-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
91 ; X64-AVX2-NEXT:    retq
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>
99   ret <16 x i8> %1
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:
108 ; X86:       # %bb.0:
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]
113 ; X86-NEXT:    retl
115 ; X64-LABEL: mul_v2i64_32_8:
116 ; X64:       # %bb.0:
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]
121 ; X64-NEXT:    retq
123 ; X64-XOP-LABEL: mul_v2i64_32_8:
124 ; X64-XOP:       # %bb.0:
125 ; X64-XOP-NEXT:    vpshlq {{.*}}(%rip), %xmm0, %xmm0
126 ; X64-XOP-NEXT:    retq
128 ; X64-AVX2-LABEL: mul_v2i64_32_8:
129 ; X64-AVX2:       # %bb.0:
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>
138   ret <2 x i64> %1
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:
143 ; X86:       # %bb.0:
144 ; X86-NEXT:    pmulld {{\.LCPI.*}}, %xmm0
145 ; X86-NEXT:    retl
147 ; X64-LABEL: mul_v4i32_1_2_4_8:
148 ; X64:       # %bb.0:
149 ; X64-NEXT:    pmulld {{.*}}(%rip), %xmm0
150 ; X64-NEXT:    retq
152 ; X64-XOP-LABEL: mul_v4i32_1_2_4_8:
153 ; X64-XOP:       # %bb.0:
154 ; X64-XOP-NEXT:    vpshld {{.*}}(%rip), %xmm0, %xmm0
155 ; X64-XOP-NEXT:    retq
157 ; X64-AVX2-LABEL: mul_v4i32_1_2_4_8:
158 ; X64-AVX2:       # %bb.0:
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>
167   ret <4 x i32> %1
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:
172 ; X86:       # %bb.0:
173 ; X86-NEXT:    pmullw {{\.LCPI.*}}, %xmm0
174 ; X86-NEXT:    retl
176 ; X64-LABEL: mul_v8i16_1_2_4_8_16_32_64_128:
177 ; X64:       # %bb.0:
178 ; X64-NEXT:    pmullw {{.*}}(%rip), %xmm0
179 ; X64-NEXT:    retq
181 ; X64-XOP-LABEL: mul_v8i16_1_2_4_8_16_32_64_128:
182 ; X64-XOP:       # %bb.0:
183 ; X64-XOP-NEXT:    vpshlw {{.*}}(%rip), %xmm0, %xmm0
184 ; X64-XOP-NEXT:    retq
186 ; X64-AVX2-LABEL: mul_v8i16_1_2_4_8_16_32_64_128:
187 ; X64-AVX2:       # %bb.0:
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>
196   ret <8 x i16> %1
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:
201 ; X86:       # %bb.0:
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
212 ; X86-NEXT:    retl
214 ; X64-LABEL: mul_v16i8_1_2_4_8_1_2_4_8_1_2_4_8_1_2_4_8:
215 ; X64:       # %bb.0:
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
226 ; X64-NEXT:    retq
228 ; X64-XOP-LABEL: mul_v16i8_1_2_4_8_1_2_4_8_1_2_4_8_1_2_4_8:
229 ; X64-XOP:       # %bb.0:
230 ; X64-XOP-NEXT:    vpshlb {{.*}}(%rip), %xmm0, %xmm0
231 ; X64-XOP-NEXT:    retq
233 ; X64-AVX2-LABEL: mul_v16i8_1_2_4_8_1_2_4_8_1_2_4_8_1_2_4_8:
234 ; X64-AVX2:       # %bb.0:
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>
251   ret <16 x i8> %1
255 ; PowOf2 + 1 (uniform)
258 define <2 x i64> @mul_v2i64_17(<2 x i64> %a0) nounwind {
259 ; X86-LABEL: mul_v2i64_17:
260 ; X86:       # %bb.0:
261 ; X86-NEXT:    movdqa %xmm0, %xmm1
262 ; X86-NEXT:    psllq $4, %xmm1
263 ; X86-NEXT:    paddq %xmm0, %xmm1
264 ; X86-NEXT:    movdqa %xmm1, %xmm0
265 ; X86-NEXT:    retl
267 ; X64-LABEL: mul_v2i64_17:
268 ; X64:       # %bb.0:
269 ; X64-NEXT:    movdqa %xmm0, %xmm1
270 ; X64-NEXT:    psllq $4, %xmm1
271 ; X64-NEXT:    paddq %xmm0, %xmm1
272 ; X64-NEXT:    movdqa %xmm1, %xmm0
273 ; X64-NEXT:    retq
275 ; X64-XOP-LABEL: mul_v2i64_17:
276 ; X64-XOP:       # %bb.0:
277 ; X64-XOP-NEXT:    vpsllq $4, %xmm0, %xmm1
278 ; X64-XOP-NEXT:    vpaddq %xmm0, %xmm1, %xmm0
279 ; X64-XOP-NEXT:    retq
281 ; X64-AVX2-LABEL: mul_v2i64_17:
282 ; X64-AVX2:       # %bb.0:
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>
292   ret <2 x i64> %1
295 define <4 x i32> @mul_v4i32_17(<4 x i32> %a0) nounwind {
296 ; X86-LABEL: mul_v4i32_17:
297 ; X86:       # %bb.0:
298 ; X86-NEXT:    pmulld {{\.LCPI.*}}, %xmm0
299 ; X86-NEXT:    retl
301 ; X64-LABEL: mul_v4i32_17:
302 ; X64:       # %bb.0:
303 ; X64-NEXT:    pmulld {{.*}}(%rip), %xmm0
304 ; X64-NEXT:    retq
306 ; X64-XOP-LABEL: mul_v4i32_17:
307 ; X64-XOP:       # %bb.0:
308 ; X64-XOP-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm0
309 ; X64-XOP-NEXT:    retq
311 ; X64-AVX2-LABEL: mul_v4i32_17:
312 ; X64-AVX2:       # %bb.0:
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>
322   ret <4 x i32> %1
325 define <8 x i16> @mul_v8i16_17(<8 x i16> %a0) nounwind {
326 ; X86-LABEL: mul_v8i16_17:
327 ; X86:       # %bb.0:
328 ; X86-NEXT:    pmullw {{\.LCPI.*}}, %xmm0
329 ; X86-NEXT:    retl
331 ; X64-LABEL: mul_v8i16_17:
332 ; X64:       # %bb.0:
333 ; X64-NEXT:    pmullw {{.*}}(%rip), %xmm0
334 ; X64-NEXT:    retq
336 ; X64-AVX-LABEL: mul_v8i16_17:
337 ; X64-AVX:       # %bb.0:
338 ; X64-AVX-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm0
339 ; X64-AVX-NEXT:    retq
340   %1 = mul <8 x i16> %a0, <i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17, i16 17>
341   ret <8 x i16> %1
344 define <16 x i8> @mul_v16i8_17(<16 x i8> %a0) nounwind {
345 ; X86-LABEL: mul_v16i8_17:
346 ; X86:       # %bb.0:
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
352 ; X86-NEXT:    retl
354 ; X64-LABEL: mul_v16i8_17:
355 ; X64:       # %bb.0:
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
361 ; X64-NEXT:    retq
363 ; X64-XOP-LABEL: mul_v16i8_17:
364 ; X64-XOP:       # %bb.0:
365 ; X64-XOP-NEXT:    vpshlb {{.*}}(%rip), %xmm0, %xmm1
366 ; X64-XOP-NEXT:    vpaddb %xmm0, %xmm1, %xmm0
367 ; X64-XOP-NEXT:    retq
369 ; X64-AVX2-LABEL: mul_v16i8_17:
370 ; X64-AVX2:       # %bb.0:
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>
383   ret <16 x i8> %1
386 define <4 x i64> @mul_v4i64_17(<4 x i64> %a0) nounwind {
387 ; X86-LABEL: mul_v4i64_17:
388 ; X86:       # %bb.0:
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
397 ; X86-NEXT:    retl
399 ; X64-LABEL: mul_v4i64_17:
400 ; X64:       # %bb.0:
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
409 ; X64-NEXT:    retq
411 ; X64-XOP-LABEL: mul_v4i64_17:
412 ; X64-XOP:       # %bb.0:
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
419 ; X64-XOP-NEXT:    retq
421 ; X64-AVX2-LABEL: mul_v4i64_17:
422 ; X64-AVX2:       # %bb.0:
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>
432   ret <4 x i64> %1
435 define <8 x i32> @mul_v8i32_17(<8 x i32> %a0) nounwind {
436 ; X86-LABEL: mul_v8i32_17:
437 ; X86:       # %bb.0:
438 ; X86-NEXT:    movdqa {{.*#+}} xmm2 = [17,17,17,17]
439 ; X86-NEXT:    pmulld %xmm2, %xmm0
440 ; X86-NEXT:    pmulld %xmm2, %xmm1
441 ; X86-NEXT:    retl
443 ; X64-LABEL: mul_v8i32_17:
444 ; X64:       # %bb.0:
445 ; X64-NEXT:    movdqa {{.*#+}} xmm2 = [17,17,17,17]
446 ; X64-NEXT:    pmulld %xmm2, %xmm0
447 ; X64-NEXT:    pmulld %xmm2, %xmm1
448 ; X64-NEXT:    retq
450 ; X64-XOP-LABEL: mul_v8i32_17:
451 ; X64-XOP:       # %bb.0:
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
458 ; X64-XOP-NEXT:    retq
460 ; X64-AVX2-LABEL: mul_v8i32_17:
461 ; X64-AVX2:       # %bb.0:
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>
471   ret <8 x i32> %1
474 define <16 x i16> @mul_v16i16_17(<16 x i16> %a0) nounwind {
475 ; X86-LABEL: mul_v16i16_17:
476 ; X86:       # %bb.0:
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
480 ; X86-NEXT:    retl
482 ; X64-LABEL: mul_v16i16_17:
483 ; X64:       # %bb.0:
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
487 ; X64-NEXT:    retq
489 ; X64-XOP-LABEL: mul_v16i16_17:
490 ; X64-XOP:       # %bb.0:
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
497 ; X64-XOP-NEXT:    retq
499 ; X64-AVX2-LABEL: mul_v16i16_17:
500 ; X64-AVX2:       # %bb.0:
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>
509   ret <16 x i16> %1
512 define <32 x i8> @mul_v32i8_17(<32 x i8> %a0) nounwind {
513 ; X86-LABEL: mul_v32i8_17:
514 ; X86:       # %bb.0:
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
526 ; X86-NEXT:    retl
528 ; X64-LABEL: mul_v32i8_17:
529 ; X64:       # %bb.0:
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
541 ; X64-NEXT:    retq
543 ; X64-XOP-LABEL: mul_v32i8_17:
544 ; X64-XOP:       # %bb.0:
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
552 ; X64-XOP-NEXT:    retq
554 ; X64-AVX2-LABEL: mul_v32i8_17:
555 ; X64-AVX2:       # %bb.0:
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>
568   ret <32 x i8> %1
572 ; -(PowOf2 + 1) (uniform)
575 define <2 x i64> @mul_v2i64_neg1025(<2 x i64> %a0) nounwind {
576 ; X86-LABEL: mul_v2i64_neg1025:
577 ; X86:       # %bb.0:
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
583 ; X86-NEXT:    retl
585 ; X64-LABEL: mul_v2i64_neg1025:
586 ; X64:       # %bb.0:
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
592 ; X64-NEXT:    retq
594 ; X64-XOP-LABEL: mul_v2i64_neg1025:
595 ; X64-XOP:       # %bb.0:
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
600 ; X64-XOP-NEXT:    retq
602 ; X64-AVX2-LABEL: mul_v2i64_neg1025:
603 ; X64-AVX2:       # %bb.0:
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>
615   ret <2 x i64> %1
618 define <4 x i32> @mul_v4i32_neg33(<4 x i32> %a0) nounwind {
619 ; X86-LABEL: mul_v4i32_neg33:
620 ; X86:       # %bb.0:
621 ; X86-NEXT:    pmulld {{\.LCPI.*}}, %xmm0
622 ; X86-NEXT:    retl
624 ; X64-LABEL: mul_v4i32_neg33:
625 ; X64:       # %bb.0:
626 ; X64-NEXT:    pmulld {{.*}}(%rip), %xmm0
627 ; X64-NEXT:    retq
629 ; X64-XOP-LABEL: mul_v4i32_neg33:
630 ; X64-XOP:       # %bb.0:
631 ; X64-XOP-NEXT:    vpmulld {{.*}}(%rip), %xmm0, %xmm0
632 ; X64-XOP-NEXT:    retq
634 ; X64-AVX2-LABEL: mul_v4i32_neg33:
635 ; X64-AVX2:       # %bb.0:
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>
645   ret <4 x i32> %1
648 define <8 x i16> @mul_v8i16_neg9(<8 x i16> %a0) nounwind {
649 ; X86-LABEL: mul_v8i16_neg9:
650 ; X86:       # %bb.0:
651 ; X86-NEXT:    pmullw {{\.LCPI.*}}, %xmm0
652 ; X86-NEXT:    retl
654 ; X64-LABEL: mul_v8i16_neg9:
655 ; X64:       # %bb.0:
656 ; X64-NEXT:    pmullw {{.*}}(%rip), %xmm0
657 ; X64-NEXT:    retq
659 ; X64-AVX-LABEL: mul_v8i16_neg9:
660 ; X64-AVX:       # %bb.0:
661 ; X64-AVX-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm0
662 ; X64-AVX-NEXT:    retq
663   %1 = mul <8 x i16> %a0, <i16 -9, i16 -9, i16 -9, i16 -9, i16 -9, i16 -9, i16 -9, i16 -9>
664   ret <8 x i16> %1
667 define <16 x i8> @mul_v16i8_neg5(<16 x i8> %a0) nounwind {
668 ; X86-LABEL: mul_v16i8_neg5:
669 ; X86:       # %bb.0:
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
676 ; X86-NEXT:    retl
678 ; X64-LABEL: mul_v16i8_neg5:
679 ; X64:       # %bb.0:
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
686 ; X64-NEXT:    retq
688 ; X64-XOP-LABEL: mul_v16i8_neg5:
689 ; X64-XOP:       # %bb.0:
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
694 ; X64-XOP-NEXT:    retq
696 ; X64-AVX2-LABEL: mul_v16i8_neg5:
697 ; X64-AVX2:       # %bb.0:
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>
714   ret <16 x i8> %1
717 define <4 x i64> @mul_v4i64_neg1025(<4 x i64> %a0) nounwind {
718 ; X86-LABEL: mul_v4i64_neg1025:
719 ; X86:       # %bb.0:
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
731 ; X86-NEXT:    retl
733 ; X64-LABEL: mul_v4i64_neg1025:
734 ; X64:       # %bb.0:
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
746 ; X64-NEXT:    retq
748 ; X64-XOP-LABEL: mul_v4i64_neg1025:
749 ; X64-XOP:       # %bb.0:
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
759 ; X64-XOP-NEXT:    retq
761 ; X64-AVX2-LABEL: mul_v4i64_neg1025:
762 ; X64-AVX2:       # %bb.0:
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>
774   ret <4 x i64> %1
777 define <8 x i32> @mul_v8i32_neg33(<8 x i32> %a0) nounwind {
778 ; X86-LABEL: mul_v8i32_neg33:
779 ; X86:       # %bb.0:
780 ; X86-NEXT:    movdqa {{.*#+}} xmm2 = [4294967263,4294967263,4294967263,4294967263]
781 ; X86-NEXT:    pmulld %xmm2, %xmm0
782 ; X86-NEXT:    pmulld %xmm2, %xmm1
783 ; X86-NEXT:    retl
785 ; X64-LABEL: mul_v8i32_neg33:
786 ; X64:       # %bb.0:
787 ; X64-NEXT:    movdqa {{.*#+}} xmm2 = [4294967263,4294967263,4294967263,4294967263]
788 ; X64-NEXT:    pmulld %xmm2, %xmm0
789 ; X64-NEXT:    pmulld %xmm2, %xmm1
790 ; X64-NEXT:    retq
792 ; X64-XOP-LABEL: mul_v8i32_neg33:
793 ; X64-XOP:       # %bb.0:
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
803 ; X64-XOP-NEXT:    retq
805 ; X64-AVX2-LABEL: mul_v8i32_neg33:
806 ; X64-AVX2:       # %bb.0:
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>
816   ret <8 x i32> %1
819 define <16 x i16> @mul_v16i16_neg9(<16 x i16> %a0) nounwind {
820 ; X86-LABEL: mul_v16i16_neg9:
821 ; X86:       # %bb.0:
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
825 ; X86-NEXT:    retl
827 ; X64-LABEL: mul_v16i16_neg9:
828 ; X64:       # %bb.0:
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
832 ; X64-NEXT:    retq
834 ; X64-XOP-LABEL: mul_v16i16_neg9:
835 ; X64-XOP:       # %bb.0:
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
845 ; X64-XOP-NEXT:    retq
847 ; X64-AVX2-LABEL: mul_v16i16_neg9:
848 ; X64-AVX2:       # %bb.0:
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>
857   ret <16 x i16> %1
860 define <32 x i8> @mul_v32i8_neg5(<32 x i8> %a0) nounwind {
861 ; X86-LABEL: mul_v32i8_neg5:
862 ; X86:       # %bb.0:
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
877 ; X86-NEXT:    retl
879 ; X64-LABEL: mul_v32i8_neg5:
880 ; X64:       # %bb.0:
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
895 ; X64-NEXT:    retq
897 ; X64-XOP-LABEL: mul_v32i8_neg5:
898 ; X64-XOP:       # %bb.0:
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
909 ; X64-XOP-NEXT:    retq
911 ; X64-AVX2-LABEL: mul_v32i8_neg5:
912 ; X64-AVX2:       # %bb.0:
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>
929   ret <32 x i8> %1
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:
938 ; X86:       # %bb.0:
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
946 ; X86-NEXT:    retl
948 ; X64-LABEL: mul_v2i64_17_65:
949 ; X64:       # %bb.0:
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
957 ; X64-NEXT:    retq
959 ; X64-XOP-LABEL: mul_v2i64_17_65:
960 ; X64-XOP:       # %bb.0:
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
967 ; X64-XOP-NEXT:    retq
969 ; X64-AVX2-LABEL: mul_v2i64_17_65:
970 ; X64-AVX2:       # %bb.0:
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>
984   ret <2 x i64> %1
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:
989 ; X86:       # %bb.0:
990 ; X86-NEXT:    pmulld {{\.LCPI.*}}, %xmm0
991 ; X86-NEXT:    retl
993 ; X64-LABEL: mul_v4i32_5_17_33_65:
994 ; X64:       # %bb.0:
995 ; X64-NEXT:    pmulld {{.*}}(%rip), %xmm0
996 ; X64-NEXT:    retq
998 ; X64-AVX-LABEL: mul_v4i32_5_17_33_65:
999 ; X64-AVX:       # %bb.0:
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>
1003   ret <4 x i32> %1
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:
1008 ; X86:       # %bb.0:
1009 ; X86-NEXT:    pmullw {{\.LCPI.*}}, %xmm0
1010 ; X86-NEXT:    retl
1012 ; X64-LABEL: mul_v8i16_2_3_9_17_33_65_129_257:
1013 ; X64:       # %bb.0:
1014 ; X64-NEXT:    pmullw {{.*}}(%rip), %xmm0
1015 ; X64-NEXT:    retq
1017 ; X64-AVX-LABEL: mul_v8i16_2_3_9_17_33_65_129_257:
1018 ; X64-AVX:       # %bb.0:
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>
1022   ret <8 x i16> %1
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:
1027 ; X86:       # %bb.0:
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
1037 ; X86-NEXT:    retl
1039 ; X64-LABEL: mul_v16i8_2_3_9_17_33_65_129_2_3_9_17_33_65_129_2_3:
1040 ; X64:       # %bb.0:
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
1050 ; X64-NEXT:    retq
1052 ; X64-XOP-LABEL: mul_v16i8_2_3_9_17_33_65_129_2_3_9_17_33_65_129_2_3:
1053 ; X64-XOP:       # %bb.0:
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>
1080   ret <16 x i8> %1
1084 ; PowOf2 - 1 (uniform)
1087 define <2 x i64> @mul_v2i64_7(<2 x i64> %a0) nounwind {
1088 ; X86-LABEL: mul_v2i64_7:
1089 ; X86:       # %bb.0:
1090 ; X86-NEXT:    movdqa %xmm0, %xmm1
1091 ; X86-NEXT:    psllq $3, %xmm1
1092 ; X86-NEXT:    psubq %xmm0, %xmm1
1093 ; X86-NEXT:    movdqa %xmm1, %xmm0
1094 ; X86-NEXT:    retl
1096 ; X64-LABEL: mul_v2i64_7:
1097 ; X64:       # %bb.0:
1098 ; X64-NEXT:    movdqa %xmm0, %xmm1
1099 ; X64-NEXT:    psllq $3, %xmm1
1100 ; X64-NEXT:    psubq %xmm0, %xmm1
1101 ; X64-NEXT:    movdqa %xmm1, %xmm0
1102 ; X64-NEXT:    retq
1104 ; X64-XOP-LABEL: mul_v2i64_7:
1105 ; X64-XOP:       # %bb.0:
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>
1121   ret <2 x i64> %1
1124 define <4 x i32> @mul_v4i32_7(<4 x i32> %a0) nounwind {
1125 ; X86-LABEL: mul_v4i32_7:
1126 ; X86:       # %bb.0:
1127 ; X86-NEXT:    pmulld {{\.LCPI.*}}, %xmm0
1128 ; X86-NEXT:    retl
1130 ; X64-LABEL: mul_v4i32_7:
1131 ; X64:       # %bb.0:
1132 ; X64-NEXT:    pmulld {{.*}}(%rip), %xmm0
1133 ; X64-NEXT:    retq
1135 ; X64-XOP-LABEL: mul_v4i32_7:
1136 ; X64-XOP:       # %bb.0:
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>
1151   ret <4 x i32> %1
1154 define <8 x i16> @mul_v8i16_7(<8 x i16> %a0) nounwind {
1155 ; X86-LABEL: mul_v8i16_7:
1156 ; X86:       # %bb.0:
1157 ; X86-NEXT:    pmullw {{\.LCPI.*}}, %xmm0
1158 ; X86-NEXT:    retl
1160 ; X64-LABEL: mul_v8i16_7:
1161 ; X64:       # %bb.0:
1162 ; X64-NEXT:    pmullw {{.*}}(%rip), %xmm0
1163 ; X64-NEXT:    retq
1165 ; X64-AVX-LABEL: mul_v8i16_7:
1166 ; X64-AVX:       # %bb.0:
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>
1170   ret <8 x i16> %1
1173 define <16 x i8> @mul_v16i8_31(<16 x i8> %a0) nounwind {
1174 ; X86-LABEL: mul_v16i8_31:
1175 ; X86:       # %bb.0:
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
1181 ; X86-NEXT:    retl
1183 ; X64-LABEL: mul_v16i8_31:
1184 ; X64:       # %bb.0:
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
1190 ; X64-NEXT:    retq
1192 ; X64-XOP-LABEL: mul_v16i8_31:
1193 ; X64-XOP:       # %bb.0:
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>
1212   ret <16 x i8> %1
1216 ; -(PowOf2 - 1) (uniform)
1219 define <2 x i64> @mul_v2i64_neg7(<2 x i64> %a0) nounwind {
1220 ; X86-LABEL: mul_v2i64_neg7:
1221 ; X86:       # %bb.0:
1222 ; X86-NEXT:    movdqa %xmm0, %xmm1
1223 ; X86-NEXT:    psllq $3, %xmm1
1224 ; X86-NEXT:    psubq %xmm1, %xmm0
1225 ; X86-NEXT:    retl
1227 ; X64-LABEL: mul_v2i64_neg7:
1228 ; X64:       # %bb.0:
1229 ; X64-NEXT:    movdqa %xmm0, %xmm1
1230 ; X64-NEXT:    psllq $3, %xmm1
1231 ; X64-NEXT:    psubq %xmm1, %xmm0
1232 ; X64-NEXT:    retq
1234 ; X64-XOP-LABEL: mul_v2i64_neg7:
1235 ; X64-XOP:       # %bb.0:
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>
1251   ret <2 x i64> %1
1254 define <4 x i32> @mul_v4i32_neg63(<4 x i32> %a0) nounwind {
1255 ; X86-LABEL: mul_v4i32_neg63:
1256 ; X86:       # %bb.0:
1257 ; X86-NEXT:    pmulld {{\.LCPI.*}}, %xmm0
1258 ; X86-NEXT:    retl
1260 ; X64-LABEL: mul_v4i32_neg63:
1261 ; X64:       # %bb.0:
1262 ; X64-NEXT:    pmulld {{.*}}(%rip), %xmm0
1263 ; X64-NEXT:    retq
1265 ; X64-XOP-LABEL: mul_v4i32_neg63:
1266 ; X64-XOP:       # %bb.0:
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>
1281   ret <4 x i32> %1
1284 define <8 x i16> @mul_v8i16_neg31(<8 x i16> %a0) nounwind {
1285 ; X86-LABEL: mul_v8i16_neg31:
1286 ; X86:       # %bb.0:
1287 ; X86-NEXT:    pmullw {{\.LCPI.*}}, %xmm0
1288 ; X86-NEXT:    retl
1290 ; X64-LABEL: mul_v8i16_neg31:
1291 ; X64:       # %bb.0:
1292 ; X64-NEXT:    pmullw {{.*}}(%rip), %xmm0
1293 ; X64-NEXT:    retq
1295 ; X64-AVX-LABEL: mul_v8i16_neg31:
1296 ; X64-AVX:       # %bb.0:
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>
1300   ret <8 x i16> %1
1303 define <16 x i8> @mul_v16i8_neg15(<16 x i8> %a0) nounwind {
1304 ; X86-LABEL: mul_v16i8_neg15:
1305 ; X86:       # %bb.0:
1306 ; X86-NEXT:    movdqa %xmm0, %xmm1
1307 ; X86-NEXT:    psllw $4, %xmm1
1308 ; X86-NEXT:    pand {{\.LCPI.*}}, %xmm1
1309 ; X86-NEXT:    psubb %xmm1, %xmm0
1310 ; X86-NEXT:    retl
1312 ; X64-LABEL: mul_v16i8_neg15:
1313 ; X64:       # %bb.0:
1314 ; X64-NEXT:    movdqa %xmm0, %xmm1
1315 ; X64-NEXT:    psllw $4, %xmm1
1316 ; X64-NEXT:    pand {{.*}}(%rip), %xmm1
1317 ; X64-NEXT:    psubb %xmm1, %xmm0
1318 ; X64-NEXT:    retq
1320 ; X64-XOP-LABEL: mul_v16i8_neg15:
1321 ; X64-XOP:       # %bb.0:
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>
1340   ret <16 x i8> %1
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:
1349 ; X86:       # %bb.0:
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
1357 ; X86-NEXT:    retl
1359 ; X64-LABEL: mul_v2i64_15_63:
1360 ; X64:       # %bb.0:
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
1368 ; X64-NEXT:    retq
1370 ; X64-XOP-LABEL: mul_v2i64_15_63:
1371 ; X64-XOP:       # %bb.0:
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>
1395   ret <2 x i64> %1
1398 define <2 x i64> @mul_v2i64_neg_15_63(<2 x i64> %a0) nounwind {
1399 ; X86-LABEL: mul_v2i64_neg_15_63:
1400 ; X86:       # %bb.0:
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
1411 ; X86-NEXT:    retl
1413 ; X64-LABEL: mul_v2i64_neg_15_63:
1414 ; X64:       # %bb.0:
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
1425 ; X64-NEXT:    retq
1427 ; X64-XOP-LABEL: mul_v2i64_neg_15_63:
1428 ; X64-XOP:       # %bb.0:
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>
1456   ret <2 x i64> %1
1459 define <2 x i64> @mul_v2i64_neg_17_65(<2 x i64> %a0) nounwind {
1460 ; X86-LABEL: mul_v2i64_neg_17_65:
1461 ; X86:       # %bb.0:
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
1472 ; X86-NEXT:    retl
1474 ; X64-LABEL: mul_v2i64_neg_17_65:
1475 ; X64:       # %bb.0:
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
1486 ; X64-NEXT:    retq
1488 ; X64-XOP-LABEL: mul_v2i64_neg_17_65:
1489 ; X64-XOP:       # %bb.0:
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>
1517   ret <2 x i64> %1
1520 define <2 x i64> @mul_v2i64_0_1(<2 x i64> %a0) nounwind {
1521 ; X86-LABEL: mul_v2i64_0_1:
1522 ; X86:       # %bb.0:
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
1530 ; X86-NEXT:    retl
1532 ; X64-LABEL: mul_v2i64_0_1:
1533 ; X64:       # %bb.0:
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
1541 ; X64-NEXT:    retq
1543 ; X64-XOP-LABEL: mul_v2i64_0_1:
1544 ; X64-XOP:       # %bb.0:
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>
1568   ret <2 x 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:
1573 ; X86:       # %bb.0:
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
1585 ; X86-NEXT:    retl
1587 ; X64-LABEL: mul_v2i64_neg_0_1:
1588 ; X64:       # %bb.0:
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
1599 ; X64-NEXT:    retq
1601 ; X64-XOP-LABEL: mul_v2i64_neg_0_1:
1602 ; X64-XOP:       # %bb.0:
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>
1630   ret <2 x 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:
1635 ; X86:       # %bb.0:
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
1647 ; X86-NEXT:    retl
1649 ; X64-LABEL: mul_v2i64_15_neg_63:
1650 ; X64:       # %bb.0:
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
1661 ; X64-NEXT:    retq
1663 ; X64-XOP-LABEL: mul_v2i64_15_neg_63:
1664 ; X64-XOP:       # %bb.0:
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>
1692   ret <2 x i64> %1
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:
1697 ; X86:       # %bb.0:
1698 ; X86-NEXT:    pmulld {{\.LCPI.*}}, %xmm0
1699 ; X86-NEXT:    retl
1701 ; X64-LABEL: mul_v4i32_0_15_31_7:
1702 ; X64:       # %bb.0:
1703 ; X64-NEXT:    pmulld {{.*}}(%rip), %xmm0
1704 ; X64-NEXT:    retq
1706 ; X64-AVX-LABEL: mul_v4i32_0_15_31_7:
1707 ; X64-AVX:       # %bb.0:
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>
1711   ret <4 x i32> %1
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:
1716 ; X86:       # %bb.0:
1717 ; X86-NEXT:    pmullw {{\.LCPI.*}}, %xmm0
1718 ; X86-NEXT:    retl
1720 ; X64-LABEL: mul_v8i16_0_1_7_15_31_63_127_255:
1721 ; X64:       # %bb.0:
1722 ; X64-NEXT:    pmullw {{.*}}(%rip), %xmm0
1723 ; X64-NEXT:    retq
1725 ; X64-AVX-LABEL: mul_v8i16_0_1_7_15_31_63_127_255:
1726 ; X64-AVX:       # %bb.0:
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>
1730   ret <8 x i16> %1
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:
1735 ; X86:       # %bb.0:
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
1746 ; X86-NEXT:    retl
1748 ; X64-LABEL: mul_v16i8_0_1_3_7_15_31_63_127_0_1_3_7_15_31_63_127:
1749 ; X64:       # %bb.0:
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
1760 ; X64-NEXT:    retq
1762 ; X64-XOP-LABEL: mul_v16i8_0_1_3_7_15_31_63_127_0_1_3_7_15_31_63_127:
1763 ; X64-XOP:       # %bb.0:
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>
1791   ret <16 x i8> %1
1794 define <2 x i64> @mul_v2i64_68_132(<2 x i64> %x) nounwind {
1795 ; X86-LABEL: mul_v2i64_68_132:
1796 ; X86:       # %bb.0:
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
1804 ; X86-NEXT:    retl
1806 ; X64-LABEL: mul_v2i64_68_132:
1807 ; X64:       # %bb.0:
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
1815 ; X64-NEXT:    retq
1817 ; X64-XOP-LABEL: mul_v2i64_68_132:
1818 ; X64-XOP:       # %bb.0:
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>
1842   ret <2 x i64> %mul
1845 define <2 x i64> @mul_v2i64_60_120(<2 x i64> %x) nounwind {
1846 ; X86-LABEL: mul_v2i64_60_120:
1847 ; X86:       # %bb.0:
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
1855 ; X86-NEXT:    retl
1857 ; X64-LABEL: mul_v2i64_60_120:
1858 ; X64:       # %bb.0:
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
1866 ; X64-NEXT:    retq
1868 ; X64-XOP-LABEL: mul_v2i64_60_120:
1869 ; X64-XOP:       # %bb.0:
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>
1893   ret <2 x i64> %mul
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:
1903 ; X86:       # %bb.0:
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
1909 ; X86-NEXT:    retl
1911 ; X64-LABEL: mul_v2i64_zext_cross_bb:
1912 ; X64:       # %bb.0:
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
1916 ; X64-NEXT:    retq
1918 ; X64-AVX-LABEL: mul_v2i64_zext_cross_bb:
1919 ; X64-AVX:       # %bb.0:
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>
1926   br label %foo
1928 foo:
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
1932   ret <2 x i64> %e
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:
1937 ; X86:       # %bb.0:
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
1946 ; X86-NEXT:    retl
1948 ; X64-LABEL: mul_v4i64_zext_cross_bb:
1949 ; X64:       # %bb.0:
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
1956 ; X64-NEXT:    retq
1958 ; X64-XOP-LABEL: mul_v4i64_zext_cross_bb:
1959 ; X64-XOP:       # %bb.0:
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>
1986   br label %foo
1988 foo:
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
1992   ret <4 x i64> %e