xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/imul.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu | FileCheck %s --check-prefix=X64
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-pc-linux-gnux32 | FileCheck %s --check-prefix=X64
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i686-pc-linux | FileCheck %s --check-prefix=X86
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdefine i32 @mul4_32(i32 %A) {
6*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul4_32:
7*9880d681SAndroid Build Coastguard Worker; X64: leal
8*9880d681SAndroid Build Coastguard Worker; X86-LABEL: mul4_32:
9*9880d681SAndroid Build Coastguard Worker; X86: shll
10*9880d681SAndroid Build Coastguard Worker    %mul = mul i32 %A, 4
11*9880d681SAndroid Build Coastguard Worker    ret i32 %mul
12*9880d681SAndroid Build Coastguard Worker}
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Workerdefine i64 @mul4_64(i64 %A) {
15*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul4_64:
16*9880d681SAndroid Build Coastguard Worker; X64: leaq
17*9880d681SAndroid Build Coastguard Worker; X86-LABEL: mul4_64:
18*9880d681SAndroid Build Coastguard Worker; X86: shldl
19*9880d681SAndroid Build Coastguard Worker; X86: shll
20*9880d681SAndroid Build Coastguard Worker    %mul = mul i64 %A, 4
21*9880d681SAndroid Build Coastguard Worker    ret i64 %mul
22*9880d681SAndroid Build Coastguard Worker}
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Workerdefine i32 @mul4096_32(i32 %A) {
25*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul4096_32:
26*9880d681SAndroid Build Coastguard Worker; X64: shll
27*9880d681SAndroid Build Coastguard Worker; X86-LABEL: mul4096_32:
28*9880d681SAndroid Build Coastguard Worker; X86: shll
29*9880d681SAndroid Build Coastguard Worker    %mul = mul i32 %A, 4096
30*9880d681SAndroid Build Coastguard Worker    ret i32 %mul
31*9880d681SAndroid Build Coastguard Worker}
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Workerdefine i64 @mul4096_64(i64 %A) {
34*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul4096_64:
35*9880d681SAndroid Build Coastguard Worker; X64: shlq
36*9880d681SAndroid Build Coastguard Worker; X86-LABEL: mul4096_64:
37*9880d681SAndroid Build Coastguard Worker; X86: shldl
38*9880d681SAndroid Build Coastguard Worker; X86: shll
39*9880d681SAndroid Build Coastguard Worker    %mul = mul i64 %A, 4096
40*9880d681SAndroid Build Coastguard Worker    ret i64 %mul
41*9880d681SAndroid Build Coastguard Worker}
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Workerdefine i32 @mulmin4096_32(i32 %A) {
44*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mulmin4096_32:
45*9880d681SAndroid Build Coastguard Worker; X64: shll
46*9880d681SAndroid Build Coastguard Worker; X64-NEXT: negl
47*9880d681SAndroid Build Coastguard Worker; X86-LABEL: mulmin4096_32:
48*9880d681SAndroid Build Coastguard Worker; X86: shll
49*9880d681SAndroid Build Coastguard Worker; X86-NEXT: negl
50*9880d681SAndroid Build Coastguard Worker    %mul = mul i32 %A, -4096
51*9880d681SAndroid Build Coastguard Worker    ret i32 %mul
52*9880d681SAndroid Build Coastguard Worker}
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Workerdefine i64 @mulmin4096_64(i64 %A) {
55*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mulmin4096_64:
56*9880d681SAndroid Build Coastguard Worker; X64: shlq
57*9880d681SAndroid Build Coastguard Worker; X64-NEXT: negq
58*9880d681SAndroid Build Coastguard Worker; X86-LABEL: mulmin4096_64:
59*9880d681SAndroid Build Coastguard Worker; X86: shldl
60*9880d681SAndroid Build Coastguard Worker; X86-NEXT: shll
61*9880d681SAndroid Build Coastguard Worker; X86-NEXT: xorl
62*9880d681SAndroid Build Coastguard Worker; X86-NEXT: negl
63*9880d681SAndroid Build Coastguard Worker; X86-NEXT: sbbl
64*9880d681SAndroid Build Coastguard Worker    %mul = mul i64 %A, -4096
65*9880d681SAndroid Build Coastguard Worker    ret i64 %mul
66*9880d681SAndroid Build Coastguard Worker}
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Workerdefine i32 @mul3_32(i32 %A) {
69*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul3_32:
70*9880d681SAndroid Build Coastguard Worker; X64: leal
71*9880d681SAndroid Build Coastguard Worker; X86-LABEL: mul3_32:
72*9880d681SAndroid Build Coastguard Worker; But why?!
73*9880d681SAndroid Build Coastguard Worker; X86: imull
74*9880d681SAndroid Build Coastguard Worker    %mul = mul i32 %A, 3
75*9880d681SAndroid Build Coastguard Worker    ret i32 %mul
76*9880d681SAndroid Build Coastguard Worker}
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Workerdefine i64 @mul3_64(i64 %A) {
79*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul3_64:
80*9880d681SAndroid Build Coastguard Worker; X64: leaq
81*9880d681SAndroid Build Coastguard Worker; X86-LABEL: mul3_64:
82*9880d681SAndroid Build Coastguard Worker; X86: mull
83*9880d681SAndroid Build Coastguard Worker; X86-NEXT: imull
84*9880d681SAndroid Build Coastguard Worker    %mul = mul i64 %A, 3
85*9880d681SAndroid Build Coastguard Worker    ret i64 %mul
86*9880d681SAndroid Build Coastguard Worker}
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Workerdefine i32 @mul40_32(i32 %A) {
89*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul40_32:
90*9880d681SAndroid Build Coastguard Worker; X64: shll
91*9880d681SAndroid Build Coastguard Worker; X64-NEXT: leal
92*9880d681SAndroid Build Coastguard Worker; X86-LABEL: mul40_32:
93*9880d681SAndroid Build Coastguard Worker; X86: shll
94*9880d681SAndroid Build Coastguard Worker; X86-NEXT: leal
95*9880d681SAndroid Build Coastguard Worker    %mul = mul i32 %A, 40
96*9880d681SAndroid Build Coastguard Worker    ret i32 %mul
97*9880d681SAndroid Build Coastguard Worker}
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Workerdefine i64 @mul40_64(i64 %A) {
100*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul40_64:
101*9880d681SAndroid Build Coastguard Worker; X64: shlq
102*9880d681SAndroid Build Coastguard Worker; X64-NEXT: leaq
103*9880d681SAndroid Build Coastguard Worker; X86-LABEL: mul40_64:
104*9880d681SAndroid Build Coastguard Worker; X86: leal
105*9880d681SAndroid Build Coastguard Worker; X86-NEXT: movl
106*9880d681SAndroid Build Coastguard Worker; X86-NEXT: mull
107*9880d681SAndroid Build Coastguard Worker; X86-NEXT: leal
108*9880d681SAndroid Build Coastguard Worker    %mul = mul i64 %A, 40
109*9880d681SAndroid Build Coastguard Worker    ret i64 %mul
110*9880d681SAndroid Build Coastguard Worker}
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Workerdefine i32 @mul4_32_minsize(i32 %A) minsize {
113*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul4_32_minsize:
114*9880d681SAndroid Build Coastguard Worker; X64: leal
115*9880d681SAndroid Build Coastguard Worker; X86-LABEL: mul4_32_minsize:
116*9880d681SAndroid Build Coastguard Worker; X86: shll
117*9880d681SAndroid Build Coastguard Worker    %mul = mul i32 %A, 4
118*9880d681SAndroid Build Coastguard Worker    ret i32 %mul
119*9880d681SAndroid Build Coastguard Worker}
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Workerdefine i32 @mul40_32_minsize(i32 %A) minsize {
122*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul40_32_minsize:
123*9880d681SAndroid Build Coastguard Worker; X64: imull
124*9880d681SAndroid Build Coastguard Worker; X86-LABEL: mul40_32_minsize:
125*9880d681SAndroid Build Coastguard Worker; X86: imull
126*9880d681SAndroid Build Coastguard Worker    %mul = mul i32 %A, 40
127*9880d681SAndroid Build Coastguard Worker    ret i32 %mul
128*9880d681SAndroid Build Coastguard Worker}
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Workerdefine i32 @mul33_32(i32 %A) {
131*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul33_32:
132*9880d681SAndroid Build Coastguard Worker; X64: shll
133*9880d681SAndroid Build Coastguard Worker; X64-NEXT: leal
134*9880d681SAndroid Build Coastguard Worker; X86-LABEL: mul33_32:
135*9880d681SAndroid Build Coastguard Worker; X86: shll
136*9880d681SAndroid Build Coastguard Worker; X86-NEXT: addl
137*9880d681SAndroid Build Coastguard Worker    %mul = mul i32 %A, 33
138*9880d681SAndroid Build Coastguard Worker    ret i32 %mul
139*9880d681SAndroid Build Coastguard Worker}
140*9880d681SAndroid Build Coastguard Worker
141*9880d681SAndroid Build Coastguard Workerdefine i32 @mul31_32(i32 %A) {
142*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul31_32:
143*9880d681SAndroid Build Coastguard Worker; X64: shll
144*9880d681SAndroid Build Coastguard Worker; X64-NEXT: subl
145*9880d681SAndroid Build Coastguard Worker; X86-LABEL: mul31_32:
146*9880d681SAndroid Build Coastguard Worker; X86: shll
147*9880d681SAndroid Build Coastguard Worker; X86-NEXT: subl
148*9880d681SAndroid Build Coastguard Worker    %mul = mul i32 %A, 31
149*9880d681SAndroid Build Coastguard Worker    ret i32 %mul
150*9880d681SAndroid Build Coastguard Worker}
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Workerdefine i32 @mul0_32(i32 %A) {
153*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul0_32:
154*9880d681SAndroid Build Coastguard Worker; X64: xorl	%eax, %eax
155*9880d681SAndroid Build Coastguard Worker    %mul = mul i32 %A, 0
156*9880d681SAndroid Build Coastguard Worker    ret i32 %mul
157*9880d681SAndroid Build Coastguard Worker}
158*9880d681SAndroid Build Coastguard Worker
159*9880d681SAndroid Build Coastguard Workerdefine i32 @mul4294967295_32(i32 %A) {
160*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul4294967295_32:
161*9880d681SAndroid Build Coastguard Worker; X64: negl	%edi
162*9880d681SAndroid Build Coastguard Worker; X64-NEXT:	movl	%edi, %eax
163*9880d681SAndroid Build Coastguard Worker    %mul = mul i32 %A, 4294967295
164*9880d681SAndroid Build Coastguard Worker    ret i32 %mul
165*9880d681SAndroid Build Coastguard Worker}
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Workerdefine i64 @mul18446744073709551615_64(i64 %A) {
168*9880d681SAndroid Build Coastguard Worker; X64-LABEL: mul18446744073709551615_64:
169*9880d681SAndroid Build Coastguard Worker; X64: negq	%rdi
170*9880d681SAndroid Build Coastguard Worker; X64-NEXT:	movq	%rdi, %rax
171*9880d681SAndroid Build Coastguard Worker    %mul = mul i64 %A, 18446744073709551615
172*9880d681SAndroid Build Coastguard Worker    ret i64 %mul
173*9880d681SAndroid Build Coastguard Worker}
174