[Alignment][NFC] Use Align with TargetLowering::setMinFunctionAlignment
[llvm-core.git] / test / CodeGen / X86 / imul.ll
blobe3f94c9b9a4ea0bc9eb455880c3ae07936c2cb1b
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu | FileCheck %s --check-prefix=X64
3 ; RUN: llc < %s -mtriple=x86_64-pc-linux-gnux32 | FileCheck %s --check-prefix=X64
4 ; RUN: llc < %s -mtriple=i686-pc-linux | FileCheck %s --check-prefix=X86
5 ; At least one of the test cases in here crashed when linearizing the DAG.
6 ; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu -pre-RA-sched=linearize | FileCheck %s --check-prefix=X64
8 define i32 @mul4_32(i32 %A) {
9 ; X64-LABEL: mul4_32:
10 ; X64:       # %bb.0:
11 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
12 ; X64-NEXT:    leal (,%rdi,4), %eax
13 ; X64-NEXT:    retq
15 ; X86-LABEL: mul4_32:
16 ; X86:       # %bb.0:
17 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
18 ; X86-NEXT:    shll $2, %eax
19 ; X86-NEXT:    retl
20     %mul = mul i32 %A, 4
21     ret i32 %mul
24 define i64 @mul4_64(i64 %A) {
25 ; X64-LABEL: mul4_64:
26 ; X64:       # %bb.0:
27 ; X64-NEXT:    leaq (,%rdi,4), %rax
28 ; X64-NEXT:    retq
30 ; X86-LABEL: mul4_64:
31 ; X86:       # %bb.0:
32 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
33 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
34 ; X86-NEXT:    shldl $2, %eax, %edx
35 ; X86-NEXT:    shll $2, %eax
36 ; X86-NEXT:    retl
37     %mul = mul i64 %A, 4
38     ret i64 %mul
41 define i32 @mul4096_32(i32 %A) {
42 ; X64-LABEL: mul4096_32:
43 ; X64:       # %bb.0:
44 ; X64-NEXT:    movl %edi, %eax
45 ; X64-NEXT:    shll $12, %eax
46 ; X64-NEXT:    retq
48 ; X86-LABEL: mul4096_32:
49 ; X86:       # %bb.0:
50 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
51 ; X86-NEXT:    shll $12, %eax
52 ; X86-NEXT:    retl
53     %mul = mul i32 %A, 4096
54     ret i32 %mul
57 define i64 @mul4096_64(i64 %A) {
58 ; X64-LABEL: mul4096_64:
59 ; X64:       # %bb.0:
60 ; X64-NEXT:    movq %rdi, %rax
61 ; X64-NEXT:    shlq $12, %rax
62 ; X64-NEXT:    retq
64 ; X86-LABEL: mul4096_64:
65 ; X86:       # %bb.0:
66 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
67 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
68 ; X86-NEXT:    shldl $12, %eax, %edx
69 ; X86-NEXT:    shll $12, %eax
70 ; X86-NEXT:    retl
71     %mul = mul i64 %A, 4096
72     ret i64 %mul
75 define i32 @mulmin4096_32(i32 %A) {
76 ; X64-LABEL: mulmin4096_32:
77 ; X64:       # %bb.0:
78 ; X64-NEXT:    movl %edi, %eax
79 ; X64-NEXT:    shll $12, %eax
80 ; X64-NEXT:    negl %eax
81 ; X64-NEXT:    retq
83 ; X86-LABEL: mulmin4096_32:
84 ; X86:       # %bb.0:
85 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
86 ; X86-NEXT:    shll $12, %eax
87 ; X86-NEXT:    negl %eax
88 ; X86-NEXT:    retl
89     %mul = mul i32 %A, -4096
90     ret i32 %mul
93 define i64 @mulmin4096_64(i64 %A) {
94 ; X64-LABEL: mulmin4096_64:
95 ; X64:       # %bb.0:
96 ; X64-NEXT:    movq %rdi, %rax
97 ; X64-NEXT:    shlq $12, %rax
98 ; X64-NEXT:    negq %rax
99 ; X64-NEXT:    retq
101 ; X86-LABEL: mulmin4096_64:
102 ; X86:       # %bb.0:
103 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
104 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
105 ; X86-NEXT:    shldl $12, %eax, %ecx
106 ; X86-NEXT:    shll $12, %eax
107 ; X86-NEXT:    xorl %edx, %edx
108 ; X86-NEXT:    negl %eax
109 ; X86-NEXT:    sbbl %ecx, %edx
110 ; X86-NEXT:    retl
111     %mul = mul i64 %A, -4096
112     ret i64 %mul
115 define i32 @mul3_32(i32 %A) {
116 ; X64-LABEL: mul3_32:
117 ; X64:       # %bb.0:
118 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
119 ; X64-NEXT:    leal (%rdi,%rdi,2), %eax
120 ; X64-NEXT:    retq
122 ; X86-LABEL: mul3_32:
123 ; X86:       # %bb.0:
124 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
125 ; X86-NEXT:    leal (%eax,%eax,2), %eax
126 ; X86-NEXT:    retl
127 ; But why?!
128     %mul = mul i32 %A, 3
129     ret i32 %mul
132 define i64 @mul3_64(i64 %A) {
133 ; X64-LABEL: mul3_64:
134 ; X64:       # %bb.0:
135 ; X64-NEXT:    leaq (%rdi,%rdi,2), %rax
136 ; X64-NEXT:    retq
138 ; X86-LABEL: mul3_64:
139 ; X86:       # %bb.0:
140 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
141 ; X86-NEXT:    leal (%eax,%eax,2), %ecx
142 ; X86-NEXT:    movl $3, %eax
143 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
144 ; X86-NEXT:    addl %ecx, %edx
145 ; X86-NEXT:    retl
146     %mul = mul i64 %A, 3
147     ret i64 %mul
150 define i32 @mul40_32(i32 %A) {
151 ; X64-LABEL: mul40_32:
152 ; X64:       # %bb.0:
153 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
154 ; X64-NEXT:    shll $3, %edi
155 ; X64-NEXT:    leal (%rdi,%rdi,4), %eax
156 ; X64-NEXT:    retq
158 ; X86-LABEL: mul40_32:
159 ; X86:       # %bb.0:
160 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
161 ; X86-NEXT:    shll $3, %eax
162 ; X86-NEXT:    leal (%eax,%eax,4), %eax
163 ; X86-NEXT:    retl
164     %mul = mul i32 %A, 40
165     ret i32 %mul
168 define i64 @mul40_64(i64 %A) {
169 ; X64-LABEL: mul40_64:
170 ; X64:       # %bb.0:
171 ; X64-NEXT:    shlq $3, %rdi
172 ; X64-NEXT:    leaq (%rdi,%rdi,4), %rax
173 ; X64-NEXT:    retq
175 ; X86-LABEL: mul40_64:
176 ; X86:       # %bb.0:
177 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
178 ; X86-NEXT:    leal (%eax,%eax,4), %ecx
179 ; X86-NEXT:    movl $40, %eax
180 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
181 ; X86-NEXT:    leal (%edx,%ecx,8), %edx
182 ; X86-NEXT:    retl
183     %mul = mul i64 %A, 40
184     ret i64 %mul
187 define i32 @mul4_32_minsize(i32 %A) minsize {
188 ; X64-LABEL: mul4_32_minsize:
189 ; X64:       # %bb.0:
190 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
191 ; X64-NEXT:    leal (,%rdi,4), %eax
192 ; X64-NEXT:    retq
194 ; X86-LABEL: mul4_32_minsize:
195 ; X86:       # %bb.0:
196 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
197 ; X86-NEXT:    shll $2, %eax
198 ; X86-NEXT:    retl
199     %mul = mul i32 %A, 4
200     ret i32 %mul
203 define i32 @mul40_32_minsize(i32 %A) minsize {
204 ; X64-LABEL: mul40_32_minsize:
205 ; X64:       # %bb.0:
206 ; X64-NEXT:    imull $40, %edi, %eax
207 ; X64-NEXT:    retq
209 ; X86-LABEL: mul40_32_minsize:
210 ; X86:       # %bb.0:
211 ; X86-NEXT:    imull $40, {{[0-9]+}}(%esp), %eax
212 ; X86-NEXT:    retl
213     %mul = mul i32 %A, 40
214     ret i32 %mul
217 define i32 @mul33_32(i32 %A) {
218 ; X64-LABEL: mul33_32:
219 ; X64:       # %bb.0:
220 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
221 ; X64-NEXT:    movl %edi, %eax
222 ; X64-NEXT:    shll $5, %eax
223 ; X64-NEXT:    addl %edi, %eax
224 ; X64-NEXT:    retq
226 ; X86-LABEL: mul33_32:
227 ; X86:       # %bb.0:
228 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
229 ; X86-NEXT:    movl %ecx, %eax
230 ; X86-NEXT:    shll $5, %eax
231 ; X86-NEXT:    addl %ecx, %eax
232 ; X86-NEXT:    retl
233     %mul = mul i32 %A, 33
234     ret i32 %mul
237 define i32 @mul31_32(i32 %A) {
238 ; X64-LABEL: mul31_32:
239 ; X64:       # %bb.0:
240 ; X64-NEXT:    movl %edi, %eax
241 ; X64-NEXT:    shll $5, %eax
242 ; X64-NEXT:    subl %edi, %eax
243 ; X64-NEXT:    retq
245 ; X86-LABEL: mul31_32:
246 ; X86:       # %bb.0:
247 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
248 ; X86-NEXT:    movl %ecx, %eax
249 ; X86-NEXT:    shll $5, %eax
250 ; X86-NEXT:    subl %ecx, %eax
251 ; X86-NEXT:    retl
252     %mul = mul i32 %A, 31
253     ret i32 %mul
256 define i32 @mul0_32(i32 %A) {
257 ; X64-LABEL: mul0_32:
258 ; X64:       # %bb.0:
259 ; X64-NEXT:    xorl %eax, %eax
260 ; X64-NEXT:    retq
262 ; X86-LABEL: mul0_32:
263 ; X86:       # %bb.0:
264 ; X86-NEXT:    xorl %eax, %eax
265 ; X86-NEXT:    retl
266     %mul = mul i32 %A, 0
267     ret i32 %mul
270 define i32 @mul4294967295_32(i32 %A) {
271 ; X64-LABEL: mul4294967295_32:
272 ; X64:       # %bb.0:
273 ; X64-NEXT:    movl %edi, %eax
274 ; X64-NEXT:    negl %eax
275 ; X64-NEXT:    retq
277 ; X86-LABEL: mul4294967295_32:
278 ; X86:       # %bb.0:
279 ; X86-NEXT:    xorl %eax, %eax
280 ; X86-NEXT:    subl {{[0-9]+}}(%esp), %eax
281 ; X86-NEXT:    retl
282     %mul = mul i32 %A, 4294967295
283     ret i32 %mul
286 define i64 @mul18446744073709551615_64(i64 %A) {
287 ; X64-LABEL: mul18446744073709551615_64:
288 ; X64:       # %bb.0:
289 ; X64-NEXT:    movq %rdi, %rax
290 ; X64-NEXT:    negq %rax
291 ; X64-NEXT:    retq
293 ; X86-LABEL: mul18446744073709551615_64:
294 ; X86:       # %bb.0:
295 ; X86-NEXT:    xorl %edx, %edx
296 ; X86-NEXT:    xorl %eax, %eax
297 ; X86-NEXT:    subl {{[0-9]+}}(%esp), %eax
298 ; X86-NEXT:    sbbl {{[0-9]+}}(%esp), %edx
299 ; X86-NEXT:    retl
300     %mul = mul i64 %A, 18446744073709551615
301     ret i64 %mul
304 define i32 @test(i32 %a) {
305 ; X64-LABEL: test:
306 ; X64:       # %bb.0: # %entry
307 ; X64-NEXT:    movl %edi, %eax
308 ; X64-NEXT:    shll $5, %eax
309 ; X64-NEXT:    subl %edi, %eax
310 ; X64-NEXT:    retq
312 ; X86-LABEL: test:
313 ; X86:       # %bb.0: # %entry
314 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
315 ; X86-NEXT:    movl %ecx, %eax
316 ; X86-NEXT:    shll $5, %eax
317 ; X86-NEXT:    subl %ecx, %eax
318 ; X86-NEXT:    retl
319 entry:
320         %tmp3 = mul i32 %a, 31
321         ret i32 %tmp3
324 define i32 @test1(i32 %a) {
325 ; X64-LABEL: test1:
326 ; X64:       # %bb.0: # %entry
327 ; X64-NEXT:    movl %edi, %eax
328 ; X64-NEXT:    movl %edi, %ecx
329 ; X64-NEXT:    shll $5, %ecx
330 ; X64-NEXT:    subl %ecx, %eax
331 ; X64-NEXT:    retq
333 ; X86-LABEL: test1:
334 ; X86:       # %bb.0: # %entry
335 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
336 ; X86-NEXT:    movl %eax, %ecx
337 ; X86-NEXT:    shll $5, %ecx
338 ; X86-NEXT:    subl %ecx, %eax
339 ; X86-NEXT:    retl
340 entry:
341         %tmp3 = mul i32 %a, -31
342         ret i32 %tmp3
346 define i32 @test2(i32 %a) {
347 ; X64-LABEL: test2:
348 ; X64:       # %bb.0: # %entry
349 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
350 ; X64-NEXT:    movl %edi, %eax
351 ; X64-NEXT:    shll $5, %eax
352 ; X64-NEXT:    addl %edi, %eax
353 ; X64-NEXT:    retq
355 ; X86-LABEL: test2:
356 ; X86:       # %bb.0: # %entry
357 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
358 ; X86-NEXT:    movl %ecx, %eax
359 ; X86-NEXT:    shll $5, %eax
360 ; X86-NEXT:    addl %ecx, %eax
361 ; X86-NEXT:    retl
362 entry:
363         %tmp3 = mul i32 %a, 33
364         ret i32 %tmp3
367 define i32 @test3(i32 %a) {
368 ; X64-LABEL: test3:
369 ; X64:       # %bb.0: # %entry
370 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
371 ; X64-NEXT:    movl %edi, %eax
372 ; X64-NEXT:    shll $5, %eax
373 ; X64-NEXT:    addl %edi, %eax
374 ; X64-NEXT:    negl %eax
375 ; X64-NEXT:    retq
377 ; X86-LABEL: test3:
378 ; X86:       # %bb.0: # %entry
379 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
380 ; X86-NEXT:    movl %ecx, %eax
381 ; X86-NEXT:    shll $5, %eax
382 ; X86-NEXT:    addl %ecx, %eax
383 ; X86-NEXT:    negl %eax
384 ; X86-NEXT:    retl
385 entry:
386         %tmp3 = mul i32 %a, -33
387         ret i32 %tmp3
390 define i64 @test4(i64 %a) {
391 ; X64-LABEL: test4:
392 ; X64:       # %bb.0: # %entry
393 ; X64-NEXT:    movq %rdi, %rax
394 ; X64-NEXT:    shlq $5, %rax
395 ; X64-NEXT:    subq %rdi, %rax
396 ; X64-NEXT:    retq
398 ; X86-LABEL: test4:
399 ; X86:       # %bb.0: # %entry
400 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
401 ; X86-NEXT:    movl %eax, %ecx
402 ; X86-NEXT:    shll $5, %ecx
403 ; X86-NEXT:    subl %eax, %ecx
404 ; X86-NEXT:    movl $31, %eax
405 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
406 ; X86-NEXT:    addl %ecx, %edx
407 ; X86-NEXT:    retl
408 entry:
409         %tmp3 = mul i64 %a, 31
410         ret i64 %tmp3
413 define i64 @test5(i64 %a) {
414 ; X64-LABEL: test5:
415 ; X64:       # %bb.0: # %entry
416 ; X64-NEXT:    movq %rdi, %rax
417 ; X64-NEXT:    movq %rdi, %rcx
418 ; X64-NEXT:    shlq $5, %rcx
419 ; X64-NEXT:    subq %rcx, %rax
420 ; X64-NEXT:    retq
422 ; X86-LABEL: test5:
423 ; X86:       # %bb.0: # %entry
424 ; X86-NEXT:    pushl %esi
425 ; X86-NEXT:    .cfi_def_cfa_offset 8
426 ; X86-NEXT:    .cfi_offset %esi, -8
427 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
428 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi
429 ; X86-NEXT:    movl %esi, %eax
430 ; X86-NEXT:    shll $5, %eax
431 ; X86-NEXT:    subl %eax, %esi
432 ; X86-NEXT:    movl $-31, %edx
433 ; X86-NEXT:    movl %ecx, %eax
434 ; X86-NEXT:    mull %edx
435 ; X86-NEXT:    subl %ecx, %edx
436 ; X86-NEXT:    addl %esi, %edx
437 ; X86-NEXT:    popl %esi
438 ; X86-NEXT:    .cfi_def_cfa_offset 4
439 ; X86-NEXT:    retl
440 entry:
441         %tmp3 = mul i64 %a, -31
442         ret i64 %tmp3
446 define i64 @test6(i64 %a) {
447 ; X64-LABEL: test6:
448 ; X64:       # %bb.0: # %entry
449 ; X64-NEXT:    movq %rdi, %rax
450 ; X64-NEXT:    shlq $5, %rax
451 ; X64-NEXT:    addq %rdi, %rax
452 ; X64-NEXT:    retq
454 ; X86-LABEL: test6:
455 ; X86:       # %bb.0: # %entry
456 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
457 ; X86-NEXT:    movl %eax, %ecx
458 ; X86-NEXT:    shll $5, %ecx
459 ; X86-NEXT:    addl %eax, %ecx
460 ; X86-NEXT:    movl $33, %eax
461 ; X86-NEXT:    mull {{[0-9]+}}(%esp)
462 ; X86-NEXT:    addl %ecx, %edx
463 ; X86-NEXT:    retl
464 entry:
465         %tmp3 = mul i64 %a, 33
466         ret i64 %tmp3
469 define i64 @test7(i64 %a) {
470 ; X64-LABEL: test7:
471 ; X64:       # %bb.0: # %entry
472 ; X64-NEXT:    movq %rdi, %rax
473 ; X64-NEXT:    shlq $5, %rax
474 ; X64-NEXT:    addq %rdi, %rax
475 ; X64-NEXT:    negq %rax
476 ; X64-NEXT:    retq
478 ; X86-LABEL: test7:
479 ; X86:       # %bb.0: # %entry
480 ; X86-NEXT:    pushl %esi
481 ; X86-NEXT:    .cfi_def_cfa_offset 8
482 ; X86-NEXT:    .cfi_offset %esi, -8
483 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
484 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
485 ; X86-NEXT:    movl %eax, %esi
486 ; X86-NEXT:    shll $5, %esi
487 ; X86-NEXT:    addl %eax, %esi
488 ; X86-NEXT:    movl $-33, %edx
489 ; X86-NEXT:    movl %ecx, %eax
490 ; X86-NEXT:    mull %edx
491 ; X86-NEXT:    subl %ecx, %edx
492 ; X86-NEXT:    subl %esi, %edx
493 ; X86-NEXT:    popl %esi
494 ; X86-NEXT:    .cfi_def_cfa_offset 4
495 ; X86-NEXT:    retl
496 entry:
497         %tmp3 = mul i64 %a, -33
498         ret i64 %tmp3
501 define i64 @testOverflow(i64 %a) {
502 ; X64-LABEL: testOverflow:
503 ; X64:       # %bb.0: # %entry
504 ; X64-NEXT:    movq %rdi, %rax
505 ; X64-NEXT:    shlq $63, %rax
506 ; X64-NEXT:    subq %rdi, %rax
507 ; X64-NEXT:    retq
509 ; X86-LABEL: testOverflow:
510 ; X86:       # %bb.0: # %entry
511 ; X86-NEXT:    pushl %esi
512 ; X86-NEXT:    .cfi_def_cfa_offset 8
513 ; X86-NEXT:    .cfi_offset %esi, -8
514 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
515 ; X86-NEXT:    movl $-1, %edx
516 ; X86-NEXT:    movl %ecx, %eax
517 ; X86-NEXT:    mull %edx
518 ; X86-NEXT:    movl %ecx, %esi
519 ; X86-NEXT:    shll $31, %esi
520 ; X86-NEXT:    subl %ecx, %esi
521 ; X86-NEXT:    addl %esi, %edx
522 ; X86-NEXT:    subl {{[0-9]+}}(%esp), %edx
523 ; X86-NEXT:    popl %esi
524 ; X86-NEXT:    .cfi_def_cfa_offset 4
525 ; X86-NEXT:    retl
526 entry:
527         %tmp3 = mul i64 %a, 9223372036854775807
528         ret i64 %tmp3
531 define i64 @testNegOverflow(i64 %a) {
532 ; X64-LABEL: testNegOverflow:
533 ; X64:       # %bb.0: # %entry
534 ; X64-NEXT:    movq %rdi, %rax
535 ; X64-NEXT:    movq %rdi, %rcx
536 ; X64-NEXT:    shlq $63, %rcx
537 ; X64-NEXT:    subq %rcx, %rax
538 ; X64-NEXT:    retq
540 ; X86-LABEL: testNegOverflow:
541 ; X86:       # %bb.0: # %entry
542 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
543 ; X86-NEXT:    movl %eax, %edx
544 ; X86-NEXT:    shll $31, %edx
545 ; X86-NEXT:    addl {{[0-9]+}}(%esp), %edx
546 ; X86-NEXT:    retl
547 entry:
548         %tmp3 = mul i64 %a, -9223372036854775807
549         ret i64 %tmp3