Revert rL255391: [X86ISelLowering] Add additional support for multiplication-to-shift...
[oota-llvm.git] / test / CodeGen / X86 / imul.ll
1 ; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu | FileCheck %s --check-prefix=X64
2 ; RUN: llc < %s -mtriple=x86_64-pc-linux-gnux32 | FileCheck %s --check-prefix=X64
3 ; RUN: llc < %s -mtriple=i686-pc-linux | FileCheck %s --check-prefix=X86
4
5 define i32 @mul4_32(i32 %A) {
6 ; X64-LABEL: mul4_32:
7 ; X64: leal
8 ; X86-LABEL: mul4_32:
9 ; X86: shll
10     %mul = mul i32 %A, 4
11     ret i32 %mul
12 }
13
14 define i64 @mul4_64(i64 %A) {
15 ; X64-LABEL: mul4_64:
16 ; X64: leaq
17 ; X86-LABEL: mul4_64:
18 ; X86: shldl
19 ; X86: shll
20     %mul = mul i64 %A, 4
21     ret i64 %mul
22 }
23
24 define i32 @mul4096_32(i32 %A) {
25 ; X64-LABEL: mul4096_32:
26 ; X64: shll
27 ; X86-LABEL: mul4096_32:
28 ; X86: shll
29     %mul = mul i32 %A, 4096
30     ret i32 %mul
31 }
32
33 define i64 @mul4096_64(i64 %A) {
34 ; X64-LABEL: mul4096_64:
35 ; X64: shlq
36 ; X86-LABEL: mul4096_64:
37 ; X86: shldl
38 ; X86: shll
39     %mul = mul i64 %A, 4096
40     ret i64 %mul
41 }
42
43 define i32 @mulmin4096_32(i32 %A) {
44 ; X64-LABEL: mulmin4096_32:
45 ; X64: shll
46 ; X64-NEXT: negl
47 ; X86-LABEL: mulmin4096_32:
48 ; X86: shll
49 ; X86-NEXT: negl
50     %mul = mul i32 %A, -4096
51     ret i32 %mul
52 }
53
54 define i64 @mulmin4096_64(i64 %A) {
55 ; X64-LABEL: mulmin4096_64:
56 ; X64: shlq
57 ; X64-NEXT: negq
58 ; X86-LABEL: mulmin4096_64:
59 ; X86: shldl
60 ; X86-NEXT: shll
61 ; X86-NEXT: xorl
62 ; X86-NEXT: negl
63 ; X86-NEXT: sbbl
64     %mul = mul i64 %A, -4096
65     ret i64 %mul
66 }
67
68 define i32 @mul3_32(i32 %A) {
69 ; X64-LABEL: mul3_32:
70 ; X64: leal
71 ; X86-LABEL: mul3_32:
72 ; But why?!
73 ; X86: imull
74     %mul = mul i32 %A, 3
75     ret i32 %mul
76 }
77
78 define i64 @mul3_64(i64 %A) {
79 ; X64-LABEL: mul3_64:
80 ; X64: leaq
81 ; X86-LABEL: mul3_64:
82 ; X86: mull
83 ; X86-NEXT: imull
84     %mul = mul i64 %A, 3
85     ret i64 %mul
86 }
87
88 define i32 @mul40_32(i32 %A) {
89 ; X64-LABEL: mul40_32:
90 ; X64: shll
91 ; X64-NEXT: leal
92 ; X86-LABEL: mul40_32:
93 ; X86: shll
94 ; X86-NEXT: leal
95     %mul = mul i32 %A, 40
96     ret i32 %mul
97 }
98
99 define i64 @mul40_64(i64 %A) {
100 ; X64-LABEL: mul40_64:
101 ; X64: shlq
102 ; X64-NEXT: leaq
103 ; X86-LABEL: mul40_64:
104 ; X86: leal
105 ; X86-NEXT: movl
106 ; X86-NEXT: mull
107 ; X86-NEXT: leal
108     %mul = mul i64 %A, 40
109     ret i64 %mul
110 }
111
112 define i32 @mul4_32_minsize(i32 %A) minsize {
113 ; X64-LABEL: mul4_32_minsize:
114 ; X64: leal
115 ; X86-LABEL: mul4_32_minsize:
116 ; X86: shll
117     %mul = mul i32 %A, 4
118     ret i32 %mul
119 }
120
121 define i32 @mul40_32_minsize(i32 %A) minsize {
122 ; X64-LABEL: mul40_32_minsize:
123 ; X64: imull
124 ; X86-LABEL: mul40_32_minsize:
125 ; X86: imull
126     %mul = mul i32 %A, 40
127     ret i32 %mul
128 }