[X86][SSE] Regenerate PMUL tests
[oota-llvm.git] / test / CodeGen / X86 / pmul.ll
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefix=SSE --check-prefix=SSE2
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41
4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX2
5
6 define <16 x i8> @mul8c(<16 x i8> %i) nounwind  {
7 ; SSE2-LABEL: mul8c:
8 ; SSE2:       # BB#0: # %entry
9 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [117,117,117,117,117,117,117,117,117,117,117,117,117,117,117,117]
10 ; SSE2-NEXT:    psraw $8, %xmm1
11 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
12 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
13 ; SSE2-NEXT:    psraw $8, %xmm2
14 ; SSE2-NEXT:    pmullw %xmm1, %xmm2
15 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
16 ; SSE2-NEXT:    pand %xmm3, %xmm2
17 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
18 ; SSE2-NEXT:    psraw $8, %xmm0
19 ; SSE2-NEXT:    pmullw %xmm1, %xmm0
20 ; SSE2-NEXT:    pand %xmm3, %xmm0
21 ; SSE2-NEXT:    packuswb %xmm2, %xmm0
22 ; SSE2-NEXT:    retq
23 ;
24 ; SSE41-LABEL: mul8c:
25 ; SSE41:       # BB#0: # %entry
26 ; SSE41-NEXT:    pmovsxbw %xmm0, %xmm1
27 ; SSE41-NEXT:    pmovsxbw {{.*}}(%rip), %xmm2
28 ; SSE41-NEXT:    pmullw %xmm2, %xmm1
29 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
30 ; SSE41-NEXT:    pand %xmm3, %xmm1
31 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
32 ; SSE41-NEXT:    pmovsxbw %xmm0, %xmm0
33 ; SSE41-NEXT:    pmullw %xmm2, %xmm0
34 ; SSE41-NEXT:    pand %xmm3, %xmm0
35 ; SSE41-NEXT:    packuswb %xmm0, %xmm1
36 ; SSE41-NEXT:    movdqa %xmm1, %xmm0
37 ; SSE41-NEXT:    retq
38 ;
39 ; AVX2-LABEL: mul8c:
40 ; AVX2:       # BB#0: # %entry
41 ; AVX2-NEXT:    vpmovsxbw %xmm0, %ymm0
42 ; AVX2-NEXT:    vpmovsxbw {{.*}}(%rip), %ymm1
43 ; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
44 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
45 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
46 ; AVX2-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
47 ; AVX2-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
48 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
49 ; AVX2-NEXT:    vzeroupper
50 ; AVX2-NEXT:    retq
51 entry:
52   %A = mul <16 x i8> %i, < i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117, i8 117 >
53   ret <16 x i8> %A
54 }
55
56 define <8 x i16> @mul16c(<8 x i16> %i) nounwind  {
57 ; SSE-LABEL: mul16c:
58 ; SSE:       # BB#0: # %entry
59 ; SSE-NEXT:    pmullw {{.*}}(%rip), %xmm0
60 ; SSE-NEXT:    retq
61 ;
62 ; AVX2-LABEL: mul16c:
63 ; AVX2:       # BB#0: # %entry
64 ; AVX2-NEXT:    vpmullw {{.*}}(%rip), %xmm0, %xmm0
65 ; AVX2-NEXT:    retq
66 entry:
67   %A = mul <8 x i16> %i, < i16 117, i16 117, i16 117, i16 117, i16 117, i16 117, i16 117, i16 117 >
68   ret <8 x i16> %A
69 }
70
71 define <4 x i32> @a(<4 x i32> %i) nounwind  {
72 ; SSE2-LABEL: a:
73 ; SSE2:       # BB#0: # %entry
74 ; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [117,117,117,117]
75 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
76 ; SSE2-NEXT:    pmuludq %xmm1, %xmm0
77 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
78 ; SSE2-NEXT:    pmuludq %xmm1, %xmm2
79 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]
80 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
81 ; SSE2-NEXT:    retq
82 ;
83 ; SSE41-LABEL: a:
84 ; SSE41:       # BB#0: # %entry
85 ; SSE41-NEXT:    pmulld {{.*}}(%rip), %xmm0
86 ; SSE41-NEXT:    retq
87 ;
88 ; AVX2-LABEL: a:
89 ; AVX2:       # BB#0: # %entry
90 ; AVX2-NEXT:    vpbroadcastd {{.*}}(%rip), %xmm1
91 ; AVX2-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
92 ; AVX2-NEXT:    retq
93 entry:
94   %A = mul <4 x i32> %i, < i32 117, i32 117, i32 117, i32 117 >
95   ret <4 x i32> %A
96 }
97
98 define <2 x i64> @b(<2 x i64> %i) nounwind  {
99 ; SSE-LABEL: b:
100 ; SSE:       # BB#0: # %entry
101 ; SSE-NEXT:    movdqa {{.*#+}} xmm1 = [117,117]
102 ; SSE-NEXT:    movdqa %xmm0, %xmm2
103 ; SSE-NEXT:    pmuludq %xmm1, %xmm2
104 ; SSE-NEXT:    psrlq $32, %xmm0
105 ; SSE-NEXT:    pmuludq %xmm1, %xmm0
106 ; SSE-NEXT:    psllq $32, %xmm0
107 ; SSE-NEXT:    paddq %xmm2, %xmm0
108 ; SSE-NEXT:    retq
109 ;
110 ; AVX2-LABEL: b:
111 ; AVX2:       # BB#0: # %entry
112 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm1 = [117,117]
113 ; AVX2-NEXT:    vpmuludq %xmm1, %xmm0, %xmm2
114 ; AVX2-NEXT:    vpsrlq $32, %xmm0, %xmm0
115 ; AVX2-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
116 ; AVX2-NEXT:    vpsllq $32, %xmm0, %xmm0
117 ; AVX2-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
118 ; AVX2-NEXT:    retq
119 entry:
120   %A = mul <2 x i64> %i, < i64 117, i64 117 >
121   ret <2 x i64> %A
122 }
123
124 define <16 x i8> @mul8(<16 x i8> %i, <16 x i8> %j) nounwind  {
125 ; SSE2-LABEL: mul8:
126 ; SSE2:       # BB#0: # %entry
127 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
128 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm2 = xmm2[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
129 ; SSE2-NEXT:    psraw $8, %xmm2
130 ; SSE2-NEXT:    movdqa %xmm0, %xmm3
131 ; SSE2-NEXT:    punpckhbw {{.*#+}} xmm3 = xmm3[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15]
132 ; SSE2-NEXT:    psraw $8, %xmm3
133 ; SSE2-NEXT:    pmullw %xmm2, %xmm3
134 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
135 ; SSE2-NEXT:    pand %xmm2, %xmm3
136 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm1 = xmm1[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
137 ; SSE2-NEXT:    psraw $8, %xmm1
138 ; SSE2-NEXT:    punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7]
139 ; SSE2-NEXT:    psraw $8, %xmm0
140 ; SSE2-NEXT:    pmullw %xmm1, %xmm0
141 ; SSE2-NEXT:    pand %xmm2, %xmm0
142 ; SSE2-NEXT:    packuswb %xmm3, %xmm0
143 ; SSE2-NEXT:    retq
144 ;
145 ; SSE41-LABEL: mul8:
146 ; SSE41:       # BB#0: # %entry
147 ; SSE41-NEXT:    pmovsxbw %xmm1, %xmm3
148 ; SSE41-NEXT:    pmovsxbw %xmm0, %xmm2
149 ; SSE41-NEXT:    pmullw %xmm3, %xmm2
150 ; SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
151 ; SSE41-NEXT:    pand %xmm3, %xmm2
152 ; SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,0,1]
153 ; SSE41-NEXT:    pmovsxbw %xmm1, %xmm1
154 ; SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
155 ; SSE41-NEXT:    pmovsxbw %xmm0, %xmm0
156 ; SSE41-NEXT:    pmullw %xmm1, %xmm0
157 ; SSE41-NEXT:    pand %xmm3, %xmm0
158 ; SSE41-NEXT:    packuswb %xmm0, %xmm2
159 ; SSE41-NEXT:    movdqa %xmm2, %xmm0
160 ; SSE41-NEXT:    retq
161 ;
162 ; AVX2-LABEL: mul8:
163 ; AVX2:       # BB#0: # %entry
164 ; AVX2-NEXT:    vpmovsxbw %xmm1, %ymm1
165 ; AVX2-NEXT:    vpmovsxbw %xmm0, %ymm0
166 ; AVX2-NEXT:    vpmullw %ymm1, %ymm0, %ymm0
167 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
168 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm2 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u>
169 ; AVX2-NEXT:    vpshufb %xmm2, %xmm1, %xmm1
170 ; AVX2-NEXT:    vpshufb %xmm2, %xmm0, %xmm0
171 ; AVX2-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
172 ; AVX2-NEXT:    vzeroupper
173 ; AVX2-NEXT:    retq
174 entry:
175   %A = mul <16 x i8> %i, %j
176   ret <16 x i8> %A
177 }
178
179 define <8 x i16> @mul16(<8 x i16> %i, <8 x i16> %j) nounwind  {
180 ; SSE-LABEL: mul16:
181 ; SSE:       # BB#0: # %entry
182 ; SSE-NEXT:    pmullw %xmm1, %xmm0
183 ; SSE-NEXT:    retq
184 ;
185 ; AVX2-LABEL: mul16:
186 ; AVX2:       # BB#0: # %entry
187 ; AVX2-NEXT:    vpmullw %xmm1, %xmm0, %xmm0
188 ; AVX2-NEXT:    retq
189 entry:
190   %A = mul <8 x i16> %i, %j
191   ret <8 x i16> %A
192 }
193
194 define <4 x i32> @c(<4 x i32> %i, <4 x i32> %j) nounwind  {
195 ; SSE2-LABEL: c:
196 ; SSE2:       # BB#0: # %entry
197 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
198 ; SSE2-NEXT:    pmuludq %xmm1, %xmm0
199 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
200 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
201 ; SSE2-NEXT:    pmuludq %xmm2, %xmm1
202 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]
203 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
204 ; SSE2-NEXT:    retq
205 ;
206 ; SSE41-LABEL: c:
207 ; SSE41:       # BB#0: # %entry
208 ; SSE41-NEXT:    pmulld %xmm1, %xmm0
209 ; SSE41-NEXT:    retq
210 ;
211 ; AVX2-LABEL: c:
212 ; AVX2:       # BB#0: # %entry
213 ; AVX2-NEXT:    vpmulld %xmm1, %xmm0, %xmm0
214 ; AVX2-NEXT:    retq
215 entry:
216   %A = mul <4 x i32> %i, %j
217   ret <4 x i32> %A
218 }
219
220 define <2 x i64> @d(<2 x i64> %i, <2 x i64> %j) nounwind  {
221 ; SSE-LABEL: d:
222 ; SSE:       # BB#0: # %entry
223 ; SSE-NEXT:    movdqa %xmm0, %xmm2
224 ; SSE-NEXT:    pmuludq %xmm1, %xmm2
225 ; SSE-NEXT:    movdqa %xmm1, %xmm3
226 ; SSE-NEXT:    psrlq $32, %xmm3
227 ; SSE-NEXT:    pmuludq %xmm0, %xmm3
228 ; SSE-NEXT:    psllq $32, %xmm3
229 ; SSE-NEXT:    paddq %xmm3, %xmm2
230 ; SSE-NEXT:    psrlq $32, %xmm0
231 ; SSE-NEXT:    pmuludq %xmm1, %xmm0
232 ; SSE-NEXT:    psllq $32, %xmm0
233 ; SSE-NEXT:    paddq %xmm2, %xmm0
234 ; SSE-NEXT:    retq
235 ;
236 ; AVX2-LABEL: d:
237 ; AVX2:       # BB#0: # %entry
238 ; AVX2-NEXT:    vpmuludq %xmm1, %xmm0, %xmm2
239 ; AVX2-NEXT:    vpsrlq $32, %xmm1, %xmm3
240 ; AVX2-NEXT:    vpmuludq %xmm3, %xmm0, %xmm3
241 ; AVX2-NEXT:    vpsllq $32, %xmm3, %xmm3
242 ; AVX2-NEXT:    vpaddq %xmm3, %xmm2, %xmm2
243 ; AVX2-NEXT:    vpsrlq $32, %xmm0, %xmm0
244 ; AVX2-NEXT:    vpmuludq %xmm1, %xmm0, %xmm0
245 ; AVX2-NEXT:    vpsllq $32, %xmm0, %xmm0
246 ; AVX2-NEXT:    vpaddq %xmm0, %xmm2, %xmm0
247 ; AVX2-NEXT:    retq
248 entry:
249   %A = mul <2 x i64> %i, %j
250   ret <2 x i64> %A
251 }
252
253 declare void @foo()
254
255 define <4 x i32> @e(<4 x i32> %i, <4 x i32> %j) nounwind  {
256 ; SSE2-LABEL: e:
257 ; SSE2:       # BB#0: # %entry
258 ; SSE2-NEXT:    subq $40, %rsp
259 ; SSE2-NEXT:    movaps %xmm1, {{[0-9]+}}(%rsp) # 16-byte Spill
260 ; SSE2-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
261 ; SSE2-NEXT:    callq foo
262 ; SSE2-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload
263 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
264 ; SSE2-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm2 # 16-byte Reload
265 ; SSE2-NEXT:    pmuludq %xmm2, %xmm0
266 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
267 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
268 ; SSE2-NEXT:    pmuludq %xmm1, %xmm2
269 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[0,2,2,3]
270 ; SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
271 ; SSE2-NEXT:    addq $40, %rsp
272 ; SSE2-NEXT:    retq
273 ;
274 ; SSE41-LABEL: e:
275 ; SSE41:       # BB#0: # %entry
276 ; SSE41-NEXT:    subq $40, %rsp
277 ; SSE41-NEXT:    movaps %xmm1, {{[0-9]+}}(%rsp) # 16-byte Spill
278 ; SSE41-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
279 ; SSE41-NEXT:    callq foo
280 ; SSE41-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload
281 ; SSE41-NEXT:    pmulld {{[0-9]+}}(%rsp), %xmm0 # 16-byte Folded Reload
282 ; SSE41-NEXT:    addq $40, %rsp
283 ; SSE41-NEXT:    retq
284 ;
285 ; AVX2-LABEL: e:
286 ; AVX2:       # BB#0: # %entry
287 ; AVX2-NEXT:    subq $40, %rsp
288 ; AVX2-NEXT:    vmovaps %xmm1, {{[0-9]+}}(%rsp) # 16-byte Spill
289 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
290 ; AVX2-NEXT:    callq foo
291 ; AVX2-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload
292 ; AVX2-NEXT:    vpmulld {{[0-9]+}}(%rsp), %xmm0, %xmm0 # 16-byte Folded Reload
293 ; AVX2-NEXT:    addq $40, %rsp
294 ; AVX2-NEXT:    retq
295 entry:
296   ; Use a call to force spills.
297   call void @foo()
298   %A = mul <4 x i32> %i, %j
299   ret <4 x i32> %A
300 }
301
302 define <2 x i64> @f(<2 x i64> %i, <2 x i64> %j) nounwind  {
303 ; SSE-LABEL: f:
304 ; SSE:       # BB#0: # %entry
305 ; SSE-NEXT:    subq $40, %rsp
306 ; SSE-NEXT:    movaps %xmm1, {{[0-9]+}}(%rsp) # 16-byte Spill
307 ; SSE-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
308 ; SSE-NEXT:    callq foo
309 ; SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload
310 ; SSE-NEXT:    movdqa %xmm0, %xmm2
311 ; SSE-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm3 # 16-byte Reload
312 ; SSE-NEXT:    pmuludq %xmm3, %xmm2
313 ; SSE-NEXT:    movdqa %xmm3, %xmm1
314 ; SSE-NEXT:    psrlq $32, %xmm1
315 ; SSE-NEXT:    pmuludq %xmm0, %xmm1
316 ; SSE-NEXT:    psllq $32, %xmm1
317 ; SSE-NEXT:    paddq %xmm1, %xmm2
318 ; SSE-NEXT:    psrlq $32, %xmm0
319 ; SSE-NEXT:    pmuludq %xmm3, %xmm0
320 ; SSE-NEXT:    psllq $32, %xmm0
321 ; SSE-NEXT:    paddq %xmm2, %xmm0
322 ; SSE-NEXT:    addq $40, %rsp
323 ; SSE-NEXT:    retq
324 ;
325 ; AVX2-LABEL: f:
326 ; AVX2:       # BB#0: # %entry
327 ; AVX2-NEXT:    subq $40, %rsp
328 ; AVX2-NEXT:    vmovaps %xmm1, {{[0-9]+}}(%rsp) # 16-byte Spill
329 ; AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
330 ; AVX2-NEXT:    callq foo
331 ; AVX2-NEXT:    vmovdqa {{[0-9]+}}(%rsp), %xmm2 # 16-byte Reload
332 ; AVX2-NEXT:    vmovdqa (%rsp), %xmm3 # 16-byte Reload
333 ; AVX2-NEXT:    vpmuludq %xmm2, %xmm3, %xmm0
334 ; AVX2-NEXT:    vpsrlq $32, %xmm2, %xmm1
335 ; AVX2-NEXT:    vpmuludq %xmm1, %xmm3, %xmm1
336 ; AVX2-NEXT:    vpsllq $32, %xmm1, %xmm1
337 ; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
338 ; AVX2-NEXT:    vpsrlq $32, %xmm3, %xmm1
339 ; AVX2-NEXT:    vpmuludq %xmm2, %xmm1, %xmm1
340 ; AVX2-NEXT:    vpsllq $32, %xmm1, %xmm1
341 ; AVX2-NEXT:    vpaddq %xmm1, %xmm0, %xmm0
342 ; AVX2-NEXT:    addq $40, %rsp
343 ; AVX2-NEXT:    retq
344 entry:
345   ; Use a call to force spills.
346   call void @foo()
347   %A = mul <2 x i64> %i, %j
348   ret <2 x i64> %A
349 }
350
351 define <4 x i64> @b1(<4 x i64> %i) nounwind  {
352 ; SSE-LABEL: b1:
353 ; SSE:       # BB#0: # %entry
354 ; SSE-NEXT:    movdqa {{.*#+}} xmm2 = [117,117]
355 ; SSE-NEXT:    movdqa %xmm0, %xmm3
356 ; SSE-NEXT:    pmuludq %xmm2, %xmm3
357 ; SSE-NEXT:    psrlq $32, %xmm0
358 ; SSE-NEXT:    pmuludq %xmm2, %xmm0
359 ; SSE-NEXT:    psllq $32, %xmm0
360 ; SSE-NEXT:    paddq %xmm3, %xmm0
361 ; SSE-NEXT:    movdqa %xmm1, %xmm3
362 ; SSE-NEXT:    pmuludq %xmm2, %xmm3
363 ; SSE-NEXT:    psrlq $32, %xmm1
364 ; SSE-NEXT:    pmuludq %xmm2, %xmm1
365 ; SSE-NEXT:    psllq $32, %xmm1
366 ; SSE-NEXT:    paddq %xmm3, %xmm1
367 ; SSE-NEXT:    retq
368 ;
369 ; AVX2-LABEL: b1:
370 ; AVX2:       # BB#0: # %entry
371 ; AVX2-NEXT:    vpbroadcastq {{.*}}(%rip), %ymm1
372 ; AVX2-NEXT:    vpmuludq %ymm1, %ymm0, %ymm2
373 ; AVX2-NEXT:    vpsrlq $32, %ymm0, %ymm0
374 ; AVX2-NEXT:    vpmuludq %ymm1, %ymm0, %ymm0
375 ; AVX2-NEXT:    vpsllq $32, %ymm0, %ymm0
376 ; AVX2-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
377 ; AVX2-NEXT:    retq
378 entry:
379   %A = mul <4 x i64> %i, < i64 117, i64 117, i64 117, i64 117 >
380   ret <4 x i64> %A
381 }
382
383 define <4 x i64> @b2(<4 x i64> %i, <4 x i64> %j) nounwind  {
384 ; SSE-LABEL: b2:
385 ; SSE:       # BB#0: # %entry
386 ; SSE-NEXT:    movdqa %xmm0, %xmm4
387 ; SSE-NEXT:    pmuludq %xmm2, %xmm4
388 ; SSE-NEXT:    movdqa %xmm2, %xmm5
389 ; SSE-NEXT:    psrlq $32, %xmm5
390 ; SSE-NEXT:    pmuludq %xmm0, %xmm5
391 ; SSE-NEXT:    psllq $32, %xmm5
392 ; SSE-NEXT:    paddq %xmm5, %xmm4
393 ; SSE-NEXT:    psrlq $32, %xmm0
394 ; SSE-NEXT:    pmuludq %xmm2, %xmm0
395 ; SSE-NEXT:    psllq $32, %xmm0
396 ; SSE-NEXT:    paddq %xmm4, %xmm0
397 ; SSE-NEXT:    movdqa %xmm1, %xmm2
398 ; SSE-NEXT:    pmuludq %xmm3, %xmm2
399 ; SSE-NEXT:    movdqa %xmm3, %xmm4
400 ; SSE-NEXT:    psrlq $32, %xmm4
401 ; SSE-NEXT:    pmuludq %xmm1, %xmm4
402 ; SSE-NEXT:    psllq $32, %xmm4
403 ; SSE-NEXT:    paddq %xmm4, %xmm2
404 ; SSE-NEXT:    psrlq $32, %xmm1
405 ; SSE-NEXT:    pmuludq %xmm3, %xmm1
406 ; SSE-NEXT:    psllq $32, %xmm1
407 ; SSE-NEXT:    paddq %xmm2, %xmm1
408 ; SSE-NEXT:    retq
409 ;
410 ; AVX2-LABEL: b2:
411 ; AVX2:       # BB#0: # %entry
412 ; AVX2-NEXT:    vpmuludq %ymm1, %ymm0, %ymm2
413 ; AVX2-NEXT:    vpsrlq $32, %ymm1, %ymm3
414 ; AVX2-NEXT:    vpmuludq %ymm3, %ymm0, %ymm3
415 ; AVX2-NEXT:    vpsllq $32, %ymm3, %ymm3
416 ; AVX2-NEXT:    vpaddq %ymm3, %ymm2, %ymm2
417 ; AVX2-NEXT:    vpsrlq $32, %ymm0, %ymm0
418 ; AVX2-NEXT:    vpmuludq %ymm1, %ymm0, %ymm0
419 ; AVX2-NEXT:    vpsllq $32, %ymm0, %ymm0
420 ; AVX2-NEXT:    vpaddq %ymm0, %ymm2, %ymm0
421 ; AVX2-NEXT:    retq
422 entry:
423   %A = mul <4 x i64> %i, %j
424   ret <4 x i64> %A
425 }
426