xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/arm64-mul.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=arm64 | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; rdar://9296808
4*9880d681SAndroid Build Coastguard Worker; rdar://9349137
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Workerdefine i128 @t1(i64 %a, i64 %b) nounwind readnone ssp {
7*9880d681SAndroid Build Coastguard Workerentry:
8*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t1:
9*9880d681SAndroid Build Coastguard Worker; CHECK: mul {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
10*9880d681SAndroid Build Coastguard Worker; CHECK: umulh {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
11*9880d681SAndroid Build Coastguard Worker  %tmp1 = zext i64 %a to i128
12*9880d681SAndroid Build Coastguard Worker  %tmp2 = zext i64 %b to i128
13*9880d681SAndroid Build Coastguard Worker  %tmp3 = mul i128 %tmp1, %tmp2
14*9880d681SAndroid Build Coastguard Worker  ret i128 %tmp3
15*9880d681SAndroid Build Coastguard Worker}
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Workerdefine i128 @t2(i64 %a, i64 %b) nounwind readnone ssp {
18*9880d681SAndroid Build Coastguard Workerentry:
19*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t2:
20*9880d681SAndroid Build Coastguard Worker; CHECK: mul {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
21*9880d681SAndroid Build Coastguard Worker; CHECK: smulh {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
22*9880d681SAndroid Build Coastguard Worker  %tmp1 = sext i64 %a to i128
23*9880d681SAndroid Build Coastguard Worker  %tmp2 = sext i64 %b to i128
24*9880d681SAndroid Build Coastguard Worker  %tmp3 = mul i128 %tmp1, %tmp2
25*9880d681SAndroid Build Coastguard Worker  ret i128 %tmp3
26*9880d681SAndroid Build Coastguard Worker}
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workerdefine i64 @t3(i32 %a, i32 %b) nounwind {
29*9880d681SAndroid Build Coastguard Workerentry:
30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t3:
31*9880d681SAndroid Build Coastguard Worker; CHECK: umull {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
32*9880d681SAndroid Build Coastguard Worker  %tmp1 = zext i32 %a to i64
33*9880d681SAndroid Build Coastguard Worker  %tmp2 = zext i32 %b to i64
34*9880d681SAndroid Build Coastguard Worker  %tmp3 = mul i64 %tmp1, %tmp2
35*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp3
36*9880d681SAndroid Build Coastguard Worker}
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Workerdefine i64 @t4(i32 %a, i32 %b) nounwind {
39*9880d681SAndroid Build Coastguard Workerentry:
40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t4:
41*9880d681SAndroid Build Coastguard Worker; CHECK: smull {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
42*9880d681SAndroid Build Coastguard Worker  %tmp1 = sext i32 %a to i64
43*9880d681SAndroid Build Coastguard Worker  %tmp2 = sext i32 %b to i64
44*9880d681SAndroid Build Coastguard Worker  %tmp3 = mul i64 %tmp1, %tmp2
45*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp3
46*9880d681SAndroid Build Coastguard Worker}
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Workerdefine i64 @t5(i32 %a, i32 %b, i64 %c) nounwind {
49*9880d681SAndroid Build Coastguard Workerentry:
50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t5:
51*9880d681SAndroid Build Coastguard Worker; CHECK: umaddl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{x[0-9]+}}
52*9880d681SAndroid Build Coastguard Worker  %tmp1 = zext i32 %a to i64
53*9880d681SAndroid Build Coastguard Worker  %tmp2 = zext i32 %b to i64
54*9880d681SAndroid Build Coastguard Worker  %tmp3 = mul i64 %tmp1, %tmp2
55*9880d681SAndroid Build Coastguard Worker  %tmp4 = add i64 %c, %tmp3
56*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp4
57*9880d681SAndroid Build Coastguard Worker}
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerdefine i64 @t6(i32 %a, i32 %b, i64 %c) nounwind {
60*9880d681SAndroid Build Coastguard Workerentry:
61*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t6:
62*9880d681SAndroid Build Coastguard Worker; CHECK: smsubl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{x[0-9]+}}
63*9880d681SAndroid Build Coastguard Worker  %tmp1 = sext i32 %a to i64
64*9880d681SAndroid Build Coastguard Worker  %tmp2 = sext i32 %b to i64
65*9880d681SAndroid Build Coastguard Worker  %tmp3 = mul i64 %tmp1, %tmp2
66*9880d681SAndroid Build Coastguard Worker  %tmp4 = sub i64 %c, %tmp3
67*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp4
68*9880d681SAndroid Build Coastguard Worker}
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Workerdefine i64 @t7(i32 %a, i32 %b) nounwind {
71*9880d681SAndroid Build Coastguard Workerentry:
72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t7:
73*9880d681SAndroid Build Coastguard Worker; CHECK: umnegl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
74*9880d681SAndroid Build Coastguard Worker  %tmp1 = zext i32 %a to i64
75*9880d681SAndroid Build Coastguard Worker  %tmp2 = zext i32 %b to i64
76*9880d681SAndroid Build Coastguard Worker  %tmp3 = mul i64 %tmp1, %tmp2
77*9880d681SAndroid Build Coastguard Worker  %tmp4 = sub i64 0, %tmp3
78*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp4
79*9880d681SAndroid Build Coastguard Worker}
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Workerdefine i64 @t8(i32 %a, i32 %b) nounwind {
82*9880d681SAndroid Build Coastguard Workerentry:
83*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t8:
84*9880d681SAndroid Build Coastguard Worker; CHECK: smnegl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
85*9880d681SAndroid Build Coastguard Worker  %tmp1 = sext i32 %a to i64
86*9880d681SAndroid Build Coastguard Worker  %tmp2 = sext i32 %b to i64
87*9880d681SAndroid Build Coastguard Worker  %tmp3 = mul i64 %tmp1, %tmp2
88*9880d681SAndroid Build Coastguard Worker  %tmp4 = sub i64 0, %tmp3
89*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp4
90*9880d681SAndroid Build Coastguard Worker}
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Workerdefine i64 @t9(i32 %a) nounwind {
93*9880d681SAndroid Build Coastguard Workerentry:
94*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t9:
95*9880d681SAndroid Build Coastguard Worker; CHECK: umull {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
96*9880d681SAndroid Build Coastguard Worker  %tmp1 = zext i32 %a to i64
97*9880d681SAndroid Build Coastguard Worker  %tmp2 = mul i64 %tmp1, 139968
98*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp2
99*9880d681SAndroid Build Coastguard Worker}
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Worker; Check 64-bit multiplication is used for constants > 32 bits.
102*9880d681SAndroid Build Coastguard Workerdefine i64 @t10(i32 %a) nounwind {
103*9880d681SAndroid Build Coastguard Workerentry:
104*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t10:
105*9880d681SAndroid Build Coastguard Worker; CHECK: mul {{x[0-9]+}}, {{x[0-9]+}}, {{x[0-9]+}}
106*9880d681SAndroid Build Coastguard Worker  %tmp1 = sext i32 %a to i64
107*9880d681SAndroid Build Coastguard Worker  %tmp2 = mul i64 %tmp1, 2147483650 ; = 2^31 + 2
108*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp2
109*9880d681SAndroid Build Coastguard Worker}
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Worker; Check the sext_inreg case.
112*9880d681SAndroid Build Coastguard Workerdefine i64 @t11(i64 %a) nounwind {
113*9880d681SAndroid Build Coastguard Workerentry:
114*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t11:
115*9880d681SAndroid Build Coastguard Worker; CHECK: smnegl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}
116*9880d681SAndroid Build Coastguard Worker  %tmp1 = trunc i64 %a to i32
117*9880d681SAndroid Build Coastguard Worker  %tmp2 = sext i32 %tmp1 to i64
118*9880d681SAndroid Build Coastguard Worker  %tmp3 = mul i64 %tmp2, -2395238
119*9880d681SAndroid Build Coastguard Worker  %tmp4 = sub i64 0, %tmp3
120*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp4
121*9880d681SAndroid Build Coastguard Worker}
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Workerdefine i64 @t12(i64 %a, i64 %b) nounwind {
124*9880d681SAndroid Build Coastguard Workerentry:
125*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t12:
126*9880d681SAndroid Build Coastguard Worker; CHECK: smaddl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{x[0-9]+}}
127*9880d681SAndroid Build Coastguard Worker  %tmp1 = trunc i64 %a to i32
128*9880d681SAndroid Build Coastguard Worker  %tmp2 = sext i32 %tmp1 to i64
129*9880d681SAndroid Build Coastguard Worker  %tmp3 = mul i64 %tmp2, -34567890
130*9880d681SAndroid Build Coastguard Worker  %tmp4 = add i64 %b, %tmp3
131*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp4
132*9880d681SAndroid Build Coastguard Worker}
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Workerdefine i64 @t13(i32 %a, i64 %b) nounwind {
135*9880d681SAndroid Build Coastguard Workerentry:
136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t13:
137*9880d681SAndroid Build Coastguard Worker; CHECK: umsubl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{x[0-9]+}}
138*9880d681SAndroid Build Coastguard Worker  %tmp1 = zext i32 %a to i64
139*9880d681SAndroid Build Coastguard Worker  %tmp3 = mul i64 %tmp1, 12345678
140*9880d681SAndroid Build Coastguard Worker  %tmp4 = sub i64 %b, %tmp3
141*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp4
142*9880d681SAndroid Build Coastguard Worker}
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Workerdefine i64 @t14(i32 %a, i64 %b) nounwind {
145*9880d681SAndroid Build Coastguard Workerentry:
146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: t14:
147*9880d681SAndroid Build Coastguard Worker; CHECK: smsubl {{x[0-9]+}}, {{w[0-9]+}}, {{w[0-9]+}}, {{x[0-9]+}}
148*9880d681SAndroid Build Coastguard Worker  %tmp1 = sext i32 %a to i64
149*9880d681SAndroid Build Coastguard Worker  %tmp3 = mul i64 %tmp1, -12345678
150*9880d681SAndroid Build Coastguard Worker  %tmp4 = sub i64 %b, %tmp3
151*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp4
152*9880d681SAndroid Build Coastguard Worker}
153