xref: /aosp_15_r20/external/llvm/test/CodeGen/Mips/mips64instrs.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64el -mcpu=mips4 -verify-machineinstrs < %s | FileCheck -check-prefixes=ALL,MIPS4,ACCMULDIV %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64el -mcpu=mips64 -verify-machineinstrs < %s | FileCheck -check-prefixes=ALL,HAS-DCLO,ACCMULDIV %s
3*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64el -mcpu=mips64r2 -verify-machineinstrs < %s | FileCheck -check-prefixes=ALL,HAS-DCLO,ACCMULDIV %s
4*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=mips64el -mcpu=mips64r6 -verify-machineinstrs < %s | FileCheck -check-prefixes=ALL,HAS-DCLO,GPRMULDIV %s
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker@gll0 = common global i64 0, align 8
7*9880d681SAndroid Build Coastguard Worker@gll1 = common global i64 0, align 8
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Workerdefine i64 @f0(i64 %a0, i64 %a1) nounwind readnone {
10*9880d681SAndroid Build Coastguard Workerentry:
11*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: f0:
12*9880d681SAndroid Build Coastguard Worker; ALL:           daddu $2, ${{[45]}}, ${{[45]}}
13*9880d681SAndroid Build Coastguard Worker  %add = add nsw i64 %a1, %a0
14*9880d681SAndroid Build Coastguard Worker  ret i64 %add
15*9880d681SAndroid Build Coastguard Worker}
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Workerdefine i64 @f1(i64 %a0, i64 %a1) nounwind readnone {
18*9880d681SAndroid Build Coastguard Workerentry:
19*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: f1:
20*9880d681SAndroid Build Coastguard Worker; ALL:           dsubu $2, $4, $5
21*9880d681SAndroid Build Coastguard Worker  %sub = sub nsw i64 %a0, %a1
22*9880d681SAndroid Build Coastguard Worker  ret i64 %sub
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerdefine i64 @f4(i64 %a0, i64 %a1) nounwind readnone {
26*9880d681SAndroid Build Coastguard Workerentry:
27*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: f4:
28*9880d681SAndroid Build Coastguard Worker; ALL:           and $2, ${{[45]}}, ${{[45]}}
29*9880d681SAndroid Build Coastguard Worker  %and = and i64 %a1, %a0
30*9880d681SAndroid Build Coastguard Worker  ret i64 %and
31*9880d681SAndroid Build Coastguard Worker}
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Workerdefine i64 @f5(i64 %a0, i64 %a1) nounwind readnone {
34*9880d681SAndroid Build Coastguard Workerentry:
35*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: f5:
36*9880d681SAndroid Build Coastguard Worker; ALL:           or $2, ${{[45]}}, ${{[45]}}
37*9880d681SAndroid Build Coastguard Worker  %or = or i64 %a1, %a0
38*9880d681SAndroid Build Coastguard Worker  ret i64 %or
39*9880d681SAndroid Build Coastguard Worker}
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Workerdefine i64 @f6(i64 %a0, i64 %a1) nounwind readnone {
42*9880d681SAndroid Build Coastguard Workerentry:
43*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: f6:
44*9880d681SAndroid Build Coastguard Worker; ALL:           xor $2, ${{[45]}}, ${{[45]}}
45*9880d681SAndroid Build Coastguard Worker  %xor = xor i64 %a1, %a0
46*9880d681SAndroid Build Coastguard Worker  ret i64 %xor
47*9880d681SAndroid Build Coastguard Worker}
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Workerdefine i64 @f7(i64 %a0) nounwind readnone {
50*9880d681SAndroid Build Coastguard Workerentry:
51*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: f7:
52*9880d681SAndroid Build Coastguard Worker; ALL:           daddiu $2, $4, 20
53*9880d681SAndroid Build Coastguard Worker  %add = add nsw i64 %a0, 20
54*9880d681SAndroid Build Coastguard Worker  ret i64 %add
55*9880d681SAndroid Build Coastguard Worker}
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Workerdefine i64 @f8(i64 %a0) nounwind readnone {
58*9880d681SAndroid Build Coastguard Workerentry:
59*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: f8:
60*9880d681SAndroid Build Coastguard Worker; ALL:           daddiu $2, $4, -20
61*9880d681SAndroid Build Coastguard Worker  %sub = add nsw i64 %a0, -20
62*9880d681SAndroid Build Coastguard Worker  ret i64 %sub
63*9880d681SAndroid Build Coastguard Worker}
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Workerdefine i64 @f9(i64 %a0) nounwind readnone {
66*9880d681SAndroid Build Coastguard Workerentry:
67*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: f9:
68*9880d681SAndroid Build Coastguard Worker; ALL:           andi $2, $4, 20
69*9880d681SAndroid Build Coastguard Worker  %and = and i64 %a0, 20
70*9880d681SAndroid Build Coastguard Worker  ret i64 %and
71*9880d681SAndroid Build Coastguard Worker}
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Workerdefine i64 @f10(i64 %a0) nounwind readnone {
74*9880d681SAndroid Build Coastguard Workerentry:
75*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: f10:
76*9880d681SAndroid Build Coastguard Worker; ALL:           ori $2, $4, 20
77*9880d681SAndroid Build Coastguard Worker  %or = or i64 %a0, 20
78*9880d681SAndroid Build Coastguard Worker  ret i64 %or
79*9880d681SAndroid Build Coastguard Worker}
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Workerdefine i64 @f11(i64 %a0) nounwind readnone {
82*9880d681SAndroid Build Coastguard Workerentry:
83*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: f11:
84*9880d681SAndroid Build Coastguard Worker; ALL:           xori $2, $4, 20
85*9880d681SAndroid Build Coastguard Worker  %xor = xor i64 %a0, 20
86*9880d681SAndroid Build Coastguard Worker  ret i64 %xor
87*9880d681SAndroid Build Coastguard Worker}
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Workerdefine i64 @f12(i64 %a, i64 %b) nounwind readnone {
90*9880d681SAndroid Build Coastguard Workerentry:
91*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: f12:
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Worker; ACCMULDIV:     mult ${{[45]}}, ${{[45]}}
94*9880d681SAndroid Build Coastguard Worker; GPRMULDIV:     dmul $2, ${{[45]}}, ${{[45]}}
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Worker  %mul = mul nsw i64 %b, %a
97*9880d681SAndroid Build Coastguard Worker  ret i64 %mul
98*9880d681SAndroid Build Coastguard Worker}
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Workerdefine i64 @f13(i64 %a, i64 %b) nounwind readnone {
101*9880d681SAndroid Build Coastguard Workerentry:
102*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: f13:
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Worker; ACCMULDIV:     mult ${{[45]}}, ${{[45]}}
105*9880d681SAndroid Build Coastguard Worker; GPRMULDIV:     dmul $2, ${{[45]}}, ${{[45]}}
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Worker  %mul = mul i64 %b, %a
108*9880d681SAndroid Build Coastguard Worker  ret i64 %mul
109*9880d681SAndroid Build Coastguard Worker}
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Workerdefine i64 @f14(i64 %a, i64 %b) nounwind readnone {
112*9880d681SAndroid Build Coastguard Workerentry:
113*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: f14:
114*9880d681SAndroid Build Coastguard Worker; ALL-DAG:       ld $[[P0:[0-9]+]], %got_disp(gll0)(
115*9880d681SAndroid Build Coastguard Worker; ALL-DAG:       ld $[[P1:[0-9]+]], %got_disp(gll1)(
116*9880d681SAndroid Build Coastguard Worker; ALL-DAG:       ld $[[T0:[0-9]+]], 0($[[P0]])
117*9880d681SAndroid Build Coastguard Worker; ALL-DAG:       ld $[[T1:[0-9]+]], 0($[[P1]])
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Worker; ACCMULDIV:     ddiv $zero, $[[T0]], $[[T1]]
120*9880d681SAndroid Build Coastguard Worker; ACCMULDIV:     teq $[[T1]], $zero, 7
121*9880d681SAndroid Build Coastguard Worker; ACCMULDIV:     mflo $2
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Worker; GPRMULDIV:     ddiv $2, $[[T0]], $[[T1]]
124*9880d681SAndroid Build Coastguard Worker; GPRMULDIV:     teq $[[T1]], $zero, 7
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Worker  %0 = load i64, i64* @gll0, align 8
127*9880d681SAndroid Build Coastguard Worker  %1 = load i64, i64* @gll1, align 8
128*9880d681SAndroid Build Coastguard Worker  %div = sdiv i64 %0, %1
129*9880d681SAndroid Build Coastguard Worker  ret i64 %div
130*9880d681SAndroid Build Coastguard Worker}
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Workerdefine i64 @f15() nounwind readnone {
133*9880d681SAndroid Build Coastguard Workerentry:
134*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: f15:
135*9880d681SAndroid Build Coastguard Worker; ALL-DAG:       ld $[[P0:[0-9]+]], %got_disp(gll0)(
136*9880d681SAndroid Build Coastguard Worker; ALL-DAG:       ld $[[P1:[0-9]+]], %got_disp(gll1)(
137*9880d681SAndroid Build Coastguard Worker; ALL-DAG:       ld $[[T0:[0-9]+]], 0($[[P0]])
138*9880d681SAndroid Build Coastguard Worker; ALL-DAG:       ld $[[T1:[0-9]+]], 0($[[P1]])
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Worker; ACCMULDIV:     ddivu $zero, $[[T0]], $[[T1]]
141*9880d681SAndroid Build Coastguard Worker; ACCMULDIV:     teq $[[T1]], $zero, 7
142*9880d681SAndroid Build Coastguard Worker; ACCMULDIV:     mflo $2
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Worker; GPRMULDIV:     ddivu $2, $[[T0]], $[[T1]]
145*9880d681SAndroid Build Coastguard Worker; GPRMULDIV:     teq $[[T1]], $zero, 7
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker  %0 = load i64, i64* @gll0, align 8
148*9880d681SAndroid Build Coastguard Worker  %1 = load i64, i64* @gll1, align 8
149*9880d681SAndroid Build Coastguard Worker  %div = udiv i64 %0, %1
150*9880d681SAndroid Build Coastguard Worker  ret i64 %div
151*9880d681SAndroid Build Coastguard Worker}
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Workerdefine i64 @f16(i64 %a, i64 %b) nounwind readnone {
154*9880d681SAndroid Build Coastguard Workerentry:
155*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: f16:
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Worker; ACCMULDIV:     ddiv $zero, $4, $5
158*9880d681SAndroid Build Coastguard Worker; ACCMULDIV:     teq $5, $zero, 7
159*9880d681SAndroid Build Coastguard Worker; ACCMULDIV:     mfhi $2
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Worker; GPRMULDIV:     dmod $2, $4, $5
162*9880d681SAndroid Build Coastguard Worker; GPRMULDIV:     teq $5, $zero, 7
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Worker  %rem = srem i64 %a, %b
165*9880d681SAndroid Build Coastguard Worker  ret i64 %rem
166*9880d681SAndroid Build Coastguard Worker}
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Workerdefine i64 @f17(i64 %a, i64 %b) nounwind readnone {
169*9880d681SAndroid Build Coastguard Workerentry:
170*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: f17:
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Worker; ACCMULDIV:     ddivu $zero, $4, $5
173*9880d681SAndroid Build Coastguard Worker; ACCMULDIV:     teq $5, $zero, 7
174*9880d681SAndroid Build Coastguard Worker; ACCMULDIV:     mfhi $2
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Worker; GPRMULDIV:     dmodu $2, $4, $5
177*9880d681SAndroid Build Coastguard Worker; GPRMULDIV:     teq $5, $zero, 7
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Worker  %rem = urem i64 %a, %b
180*9880d681SAndroid Build Coastguard Worker  ret i64 %rem
181*9880d681SAndroid Build Coastguard Worker}
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.ctlz.i64(i64, i1) nounwind readnone
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Workerdefine i64 @f18(i64 %X) nounwind readnone {
186*9880d681SAndroid Build Coastguard Workerentry:
187*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: f18:
188*9880d681SAndroid Build Coastguard Worker
189*9880d681SAndroid Build Coastguard Worker; The MIPS4 version is too long to reasonably test. At least check we don't get dclz
190*9880d681SAndroid Build Coastguard Worker; MIPS4-NOT:     dclz
191*9880d681SAndroid Build Coastguard Worker
192*9880d681SAndroid Build Coastguard Worker; HAS-DCLO:      dclz $2, $4
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Worker  %tmp1 = tail call i64 @llvm.ctlz.i64(i64 %X, i1 true)
195*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp1
196*9880d681SAndroid Build Coastguard Worker}
197*9880d681SAndroid Build Coastguard Worker
198*9880d681SAndroid Build Coastguard Workerdefine i64 @f19(i64 %X) nounwind readnone {
199*9880d681SAndroid Build Coastguard Workerentry:
200*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: f19:
201*9880d681SAndroid Build Coastguard Worker
202*9880d681SAndroid Build Coastguard Worker; The MIPS4 version is too long to reasonably test. At least check we don't get dclo
203*9880d681SAndroid Build Coastguard Worker; MIPS4-NOT:     dclo
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Worker; HAS-DCLO:      dclo $2, $4
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard Worker  %neg = xor i64 %X, -1
208*9880d681SAndroid Build Coastguard Worker  %tmp1 = tail call i64 @llvm.ctlz.i64(i64 %neg, i1 true)
209*9880d681SAndroid Build Coastguard Worker  ret i64 %tmp1
210*9880d681SAndroid Build Coastguard Worker}
211*9880d681SAndroid Build Coastguard Worker
212*9880d681SAndroid Build Coastguard Workerdefine i64 @f20(i64 %a, i64 %b) nounwind readnone {
213*9880d681SAndroid Build Coastguard Workerentry:
214*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: f20:
215*9880d681SAndroid Build Coastguard Worker; ALL:           nor $2, ${{[45]}}, ${{[45]}}
216*9880d681SAndroid Build Coastguard Worker  %or = or i64 %b, %a
217*9880d681SAndroid Build Coastguard Worker  %neg = xor i64 %or, -1
218*9880d681SAndroid Build Coastguard Worker  ret i64 %neg
219*9880d681SAndroid Build Coastguard Worker}
220