Skip to content

Commit 0437f08

Browse files
authored
[LoongArch] Support PreserveMost calling convention (#154898)
This introduces the simplest implementation of the `PreserveMost` calling convention, under which registers `r4-r31` are preserved, with the exception of `r12-r15` (used by the PLT) and `r20-r21` (`r20` used by the tail calls). Related rust-lang/rust#145692
1 parent 6b200e2 commit 0437f08

File tree

5 files changed

+332
-0
lines changed

5 files changed

+332
-0
lines changed

llvm/docs/LangRef.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,8 @@ added in the future:
415415

416416
- On RISC-V the callee preserves x5-x31 except x6, x7 and x28 registers.
417417

418+
- On LoongArch the callee preserves r4-r31 except r12-r15 and r20-r21 registers.
419+
418420
The idea behind this convention is to support calls to runtime functions
419421
that have a hot path and a cold path. The hot path is usually a small piece
420422
of code that doesn't use many registers. The cold path might need to call out to

llvm/lib/Target/LoongArch/LoongArchCallingConv.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,7 @@ def CSR_ILP32D_LP64D
2121

2222
// Needed for implementation of LoongArchRegisterInfo::getNoPreservedMask()
2323
def CSR_NoRegs : CalleeSavedRegs<(add)>;
24+
25+
def CSR_MostRegs : CalleeSavedRegs<(add CSR_ILP32S_LP64S,
26+
(sequence "R%u", 4, 11),
27+
(sequence "R%u", 16, 19))>;

llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7187,6 +7187,7 @@ SDValue LoongArchTargetLowering::LowerFormalArguments(
71877187
llvm_unreachable("Unsupported calling convention");
71887188
case CallingConv::C:
71897189
case CallingConv::Fast:
7190+
case CallingConv::PreserveMost:
71907191
break;
71917192
case CallingConv::GHC:
71927193
if (!MF.getSubtarget().hasFeature(LoongArch::FeatureBasicF) ||

llvm/lib/Target/LoongArch/LoongArchRegisterInfo.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ LoongArchRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
4141

4242
if (MF->getFunction().getCallingConv() == CallingConv::GHC)
4343
return CSR_NoRegs_SaveList;
44+
if (MF->getFunction().getCallingConv() == CallingConv::PreserveMost)
45+
return CSR_MostRegs_SaveList;
4446
switch (Subtarget.getTargetABI()) {
4547
default:
4648
llvm_unreachable("Unrecognized ABI");
@@ -63,6 +65,8 @@ LoongArchRegisterInfo::getCallPreservedMask(const MachineFunction &MF,
6365

6466
if (CC == CallingConv::GHC)
6567
return CSR_NoRegs_RegMask;
68+
if (CC == CallingConv::PreserveMost)
69+
return CSR_MostRegs_RegMask;
6670
switch (Subtarget.getTargetABI()) {
6771
default:
6872
llvm_unreachable("Unrecognized ABI");
Lines changed: 321 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,321 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -mtriple=loongarch32 < %s | FileCheck %s -check-prefix=LA32
3+
; RUN: llc -mtriple=loongarch64 < %s | FileCheck %s -check-prefix=LA64
4+
5+
; Check the PreserveMost calling convention works.
6+
7+
declare void @standard_cc_func()
8+
declare preserve_mostcc void @preserve_mostcc_func()
9+
10+
define preserve_mostcc void @preserve_mostcc1() nounwind {
11+
; LA32-LABEL: preserve_mostcc1:
12+
; LA32: # %bb.0: # %entry
13+
; LA32-NEXT: addi.w $sp, $sp, -64
14+
; LA32-NEXT: st.w $ra, $sp, 60 # 4-byte Folded Spill
15+
; LA32-NEXT: st.w $a0, $sp, 56 # 4-byte Folded Spill
16+
; LA32-NEXT: st.w $a1, $sp, 52 # 4-byte Folded Spill
17+
; LA32-NEXT: st.w $a2, $sp, 48 # 4-byte Folded Spill
18+
; LA32-NEXT: st.w $a3, $sp, 44 # 4-byte Folded Spill
19+
; LA32-NEXT: st.w $a4, $sp, 40 # 4-byte Folded Spill
20+
; LA32-NEXT: st.w $a5, $sp, 36 # 4-byte Folded Spill
21+
; LA32-NEXT: st.w $a6, $sp, 32 # 4-byte Folded Spill
22+
; LA32-NEXT: st.w $a7, $sp, 28 # 4-byte Folded Spill
23+
; LA32-NEXT: st.w $t4, $sp, 24 # 4-byte Folded Spill
24+
; LA32-NEXT: st.w $t5, $sp, 20 # 4-byte Folded Spill
25+
; LA32-NEXT: st.w $t6, $sp, 16 # 4-byte Folded Spill
26+
; LA32-NEXT: st.w $t7, $sp, 12 # 4-byte Folded Spill
27+
; LA32-NEXT: bl standard_cc_func
28+
; LA32-NEXT: ld.w $t7, $sp, 12 # 4-byte Folded Reload
29+
; LA32-NEXT: ld.w $t6, $sp, 16 # 4-byte Folded Reload
30+
; LA32-NEXT: ld.w $t5, $sp, 20 # 4-byte Folded Reload
31+
; LA32-NEXT: ld.w $t4, $sp, 24 # 4-byte Folded Reload
32+
; LA32-NEXT: ld.w $a7, $sp, 28 # 4-byte Folded Reload
33+
; LA32-NEXT: ld.w $a6, $sp, 32 # 4-byte Folded Reload
34+
; LA32-NEXT: ld.w $a5, $sp, 36 # 4-byte Folded Reload
35+
; LA32-NEXT: ld.w $a4, $sp, 40 # 4-byte Folded Reload
36+
; LA32-NEXT: ld.w $a3, $sp, 44 # 4-byte Folded Reload
37+
; LA32-NEXT: ld.w $a2, $sp, 48 # 4-byte Folded Reload
38+
; LA32-NEXT: ld.w $a1, $sp, 52 # 4-byte Folded Reload
39+
; LA32-NEXT: ld.w $a0, $sp, 56 # 4-byte Folded Reload
40+
; LA32-NEXT: ld.w $ra, $sp, 60 # 4-byte Folded Reload
41+
; LA32-NEXT: addi.w $sp, $sp, 64
42+
; LA32-NEXT: ret
43+
;
44+
; LA64-LABEL: preserve_mostcc1:
45+
; LA64: # %bb.0: # %entry
46+
; LA64-NEXT: addi.d $sp, $sp, -112
47+
; LA64-NEXT: st.d $ra, $sp, 104 # 8-byte Folded Spill
48+
; LA64-NEXT: st.d $a0, $sp, 96 # 8-byte Folded Spill
49+
; LA64-NEXT: st.d $a1, $sp, 88 # 8-byte Folded Spill
50+
; LA64-NEXT: st.d $a2, $sp, 80 # 8-byte Folded Spill
51+
; LA64-NEXT: st.d $a3, $sp, 72 # 8-byte Folded Spill
52+
; LA64-NEXT: st.d $a4, $sp, 64 # 8-byte Folded Spill
53+
; LA64-NEXT: st.d $a5, $sp, 56 # 8-byte Folded Spill
54+
; LA64-NEXT: st.d $a6, $sp, 48 # 8-byte Folded Spill
55+
; LA64-NEXT: st.d $a7, $sp, 40 # 8-byte Folded Spill
56+
; LA64-NEXT: st.d $t4, $sp, 32 # 8-byte Folded Spill
57+
; LA64-NEXT: st.d $t5, $sp, 24 # 8-byte Folded Spill
58+
; LA64-NEXT: st.d $t6, $sp, 16 # 8-byte Folded Spill
59+
; LA64-NEXT: st.d $t7, $sp, 8 # 8-byte Folded Spill
60+
; LA64-NEXT: pcaddu18i $ra, %call36(standard_cc_func)
61+
; LA64-NEXT: jirl $ra, $ra, 0
62+
; LA64-NEXT: ld.d $t7, $sp, 8 # 8-byte Folded Reload
63+
; LA64-NEXT: ld.d $t6, $sp, 16 # 8-byte Folded Reload
64+
; LA64-NEXT: ld.d $t5, $sp, 24 # 8-byte Folded Reload
65+
; LA64-NEXT: ld.d $t4, $sp, 32 # 8-byte Folded Reload
66+
; LA64-NEXT: ld.d $a7, $sp, 40 # 8-byte Folded Reload
67+
; LA64-NEXT: ld.d $a6, $sp, 48 # 8-byte Folded Reload
68+
; LA64-NEXT: ld.d $a5, $sp, 56 # 8-byte Folded Reload
69+
; LA64-NEXT: ld.d $a4, $sp, 64 # 8-byte Folded Reload
70+
; LA64-NEXT: ld.d $a3, $sp, 72 # 8-byte Folded Reload
71+
; LA64-NEXT: ld.d $a2, $sp, 80 # 8-byte Folded Reload
72+
; LA64-NEXT: ld.d $a1, $sp, 88 # 8-byte Folded Reload
73+
; LA64-NEXT: ld.d $a0, $sp, 96 # 8-byte Folded Reload
74+
; LA64-NEXT: ld.d $ra, $sp, 104 # 8-byte Folded Reload
75+
; LA64-NEXT: addi.d $sp, $sp, 112
76+
; LA64-NEXT: ret
77+
entry:
78+
call void @standard_cc_func()
79+
ret void
80+
}
81+
82+
define preserve_mostcc void @preserve_mostcc2() nounwind {
83+
; LA32-LABEL: preserve_mostcc2:
84+
; LA32: # %bb.0:
85+
; LA32-NEXT: addi.w $sp, $sp, -16
86+
; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
87+
; LA32-NEXT: bl preserve_mostcc_func
88+
; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
89+
; LA32-NEXT: addi.w $sp, $sp, 16
90+
; LA32-NEXT: ret
91+
;
92+
; LA64-LABEL: preserve_mostcc2:
93+
; LA64: # %bb.0:
94+
; LA64-NEXT: addi.d $sp, $sp, -16
95+
; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
96+
; LA64-NEXT: pcaddu18i $ra, %call36(preserve_mostcc_func)
97+
; LA64-NEXT: jirl $ra, $ra, 0
98+
; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
99+
; LA64-NEXT: addi.d $sp, $sp, 16
100+
; LA64-NEXT: ret
101+
call preserve_mostcc void @preserve_mostcc_func()
102+
ret void
103+
}
104+
105+
define void @preserve_mostcc3() nounwind {
106+
; LA32-LABEL: preserve_mostcc3:
107+
; LA32: # %bb.0:
108+
; LA32-NEXT: addi.w $sp, $sp, -16
109+
; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
110+
; LA32-NEXT: st.w $s0, $sp, 8 # 4-byte Folded Spill
111+
; LA32-NEXT: st.w $s1, $sp, 4 # 4-byte Folded Spill
112+
; LA32-NEXT: #APP
113+
; LA32-NEXT: #NO_APP
114+
; LA32-NEXT: move $a0, $t0
115+
; LA32-NEXT: #APP
116+
; LA32-NEXT: #NO_APP
117+
; LA32-NEXT: move $a1, $t1
118+
; LA32-NEXT: #APP
119+
; LA32-NEXT: #NO_APP
120+
; LA32-NEXT: move $a2, $t2
121+
; LA32-NEXT: #APP
122+
; LA32-NEXT: #NO_APP
123+
; LA32-NEXT: move $a3, $t3
124+
; LA32-NEXT: #APP
125+
; LA32-NEXT: #NO_APP
126+
; LA32-NEXT: move $a4, $t8
127+
; LA32-NEXT: #APP
128+
; LA32-NEXT: #NO_APP
129+
; LA32-NEXT: #APP
130+
; LA32-NEXT: #NO_APP
131+
; LA32-NEXT: bl preserve_mostcc_func
132+
; LA32-NEXT: move $t0, $a0
133+
; LA32-NEXT: move $t1, $a1
134+
; LA32-NEXT: move $t2, $a2
135+
; LA32-NEXT: move $t3, $a3
136+
; LA32-NEXT: move $t8, $a4
137+
; LA32-NEXT: #APP
138+
; LA32-NEXT: #NO_APP
139+
; LA32-NEXT: ld.w $s1, $sp, 4 # 4-byte Folded Reload
140+
; LA32-NEXT: ld.w $s0, $sp, 8 # 4-byte Folded Reload
141+
; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
142+
; LA32-NEXT: addi.w $sp, $sp, 16
143+
; LA32-NEXT: ret
144+
;
145+
; LA64-LABEL: preserve_mostcc3:
146+
; LA64: # %bb.0:
147+
; LA64-NEXT: addi.d $sp, $sp, -96
148+
; LA64-NEXT: st.d $ra, $sp, 88 # 8-byte Folded Spill
149+
; LA64-NEXT: st.d $s0, $sp, 80 # 8-byte Folded Spill
150+
; LA64-NEXT: st.d $s1, $sp, 72 # 8-byte Folded Spill
151+
; LA64-NEXT: fst.d $fs0, $sp, 64 # 8-byte Folded Spill
152+
; LA64-NEXT: fst.d $fs1, $sp, 56 # 8-byte Folded Spill
153+
; LA64-NEXT: fst.d $fs2, $sp, 48 # 8-byte Folded Spill
154+
; LA64-NEXT: fst.d $fs3, $sp, 40 # 8-byte Folded Spill
155+
; LA64-NEXT: fst.d $fs4, $sp, 32 # 8-byte Folded Spill
156+
; LA64-NEXT: fst.d $fs5, $sp, 24 # 8-byte Folded Spill
157+
; LA64-NEXT: fst.d $fs6, $sp, 16 # 8-byte Folded Spill
158+
; LA64-NEXT: fst.d $fs7, $sp, 8 # 8-byte Folded Spill
159+
; LA64-NEXT: #APP
160+
; LA64-NEXT: #NO_APP
161+
; LA64-NEXT: move $a0, $t0
162+
; LA64-NEXT: #APP
163+
; LA64-NEXT: #NO_APP
164+
; LA64-NEXT: move $a1, $t1
165+
; LA64-NEXT: #APP
166+
; LA64-NEXT: #NO_APP
167+
; LA64-NEXT: move $a2, $t2
168+
; LA64-NEXT: #APP
169+
; LA64-NEXT: #NO_APP
170+
; LA64-NEXT: move $a3, $t3
171+
; LA64-NEXT: #APP
172+
; LA64-NEXT: #NO_APP
173+
; LA64-NEXT: move $a4, $t8
174+
; LA64-NEXT: #APP
175+
; LA64-NEXT: #NO_APP
176+
; LA64-NEXT: #APP
177+
; LA64-NEXT: #NO_APP
178+
; LA64-NEXT: pcaddu18i $ra, %call36(preserve_mostcc_func)
179+
; LA64-NEXT: jirl $ra, $ra, 0
180+
; LA64-NEXT: move $t0, $a0
181+
; LA64-NEXT: move $t1, $a1
182+
; LA64-NEXT: move $t2, $a2
183+
; LA64-NEXT: move $t3, $a3
184+
; LA64-NEXT: move $t8, $a4
185+
; LA64-NEXT: #APP
186+
; LA64-NEXT: #NO_APP
187+
; LA64-NEXT: fld.d $fs7, $sp, 8 # 8-byte Folded Reload
188+
; LA64-NEXT: fld.d $fs6, $sp, 16 # 8-byte Folded Reload
189+
; LA64-NEXT: fld.d $fs5, $sp, 24 # 8-byte Folded Reload
190+
; LA64-NEXT: fld.d $fs4, $sp, 32 # 8-byte Folded Reload
191+
; LA64-NEXT: fld.d $fs3, $sp, 40 # 8-byte Folded Reload
192+
; LA64-NEXT: fld.d $fs2, $sp, 48 # 8-byte Folded Reload
193+
; LA64-NEXT: fld.d $fs1, $sp, 56 # 8-byte Folded Reload
194+
; LA64-NEXT: fld.d $fs0, $sp, 64 # 8-byte Folded Reload
195+
; LA64-NEXT: ld.d $s1, $sp, 72 # 8-byte Folded Reload
196+
; LA64-NEXT: ld.d $s0, $sp, 80 # 8-byte Folded Reload
197+
; LA64-NEXT: ld.d $ra, $sp, 88 # 8-byte Folded Reload
198+
; LA64-NEXT: addi.d $sp, $sp, 96
199+
; LA64-NEXT: ret
200+
%1 = call i32 asm sideeffect "", "={r12}"() nounwind
201+
%2 = call i32 asm sideeffect "", "={r13}"() nounwind
202+
%3 = call i32 asm sideeffect "", "={r14}"() nounwind
203+
%4 = call i32 asm sideeffect "", "={r15}"() nounwind
204+
%5 = call i32 asm sideeffect "", "={r20}"() nounwind
205+
%6 = call i32 asm sideeffect "", "={r23}"() nounwind
206+
%7 = call i32 asm sideeffect "", "={r24}"() nounwind
207+
call preserve_mostcc void @preserve_mostcc_func()
208+
call void asm sideeffect "", "{r12},{r13},{r14},{r15},{r20},{r23},{r24}"(i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7)
209+
ret void
210+
}
211+
212+
define void @preserve_mostcc4() nounwind {
213+
; LA32-LABEL: preserve_mostcc4:
214+
; LA32: # %bb.0:
215+
; LA32-NEXT: addi.w $sp, $sp, -32
216+
; LA32-NEXT: st.w $ra, $sp, 28 # 4-byte Folded Spill
217+
; LA32-NEXT: st.w $fp, $sp, 24 # 4-byte Folded Spill
218+
; LA32-NEXT: st.w $s0, $sp, 20 # 4-byte Folded Spill
219+
; LA32-NEXT: st.w $s1, $sp, 16 # 4-byte Folded Spill
220+
; LA32-NEXT: st.w $s2, $sp, 12 # 4-byte Folded Spill
221+
; LA32-NEXT: st.w $s3, $sp, 8 # 4-byte Folded Spill
222+
; LA32-NEXT: st.w $s4, $sp, 4 # 4-byte Folded Spill
223+
; LA32-NEXT: st.w $s5, $sp, 0 # 4-byte Folded Spill
224+
; LA32-NEXT: #APP
225+
; LA32-NEXT: #NO_APP
226+
; LA32-NEXT: move $fp, $t0
227+
; LA32-NEXT: #APP
228+
; LA32-NEXT: #NO_APP
229+
; LA32-NEXT: move $s2, $t1
230+
; LA32-NEXT: #APP
231+
; LA32-NEXT: #NO_APP
232+
; LA32-NEXT: move $s3, $t2
233+
; LA32-NEXT: #APP
234+
; LA32-NEXT: #NO_APP
235+
; LA32-NEXT: move $s4, $t3
236+
; LA32-NEXT: #APP
237+
; LA32-NEXT: #NO_APP
238+
; LA32-NEXT: move $s5, $t8
239+
; LA32-NEXT: #APP
240+
; LA32-NEXT: #NO_APP
241+
; LA32-NEXT: #APP
242+
; LA32-NEXT: #NO_APP
243+
; LA32-NEXT: bl standard_cc_func
244+
; LA32-NEXT: move $t0, $fp
245+
; LA32-NEXT: move $t1, $s2
246+
; LA32-NEXT: move $t2, $s3
247+
; LA32-NEXT: move $t3, $s4
248+
; LA32-NEXT: move $t8, $s5
249+
; LA32-NEXT: #APP
250+
; LA32-NEXT: #NO_APP
251+
; LA32-NEXT: ld.w $s5, $sp, 0 # 4-byte Folded Reload
252+
; LA32-NEXT: ld.w $s4, $sp, 4 # 4-byte Folded Reload
253+
; LA32-NEXT: ld.w $s3, $sp, 8 # 4-byte Folded Reload
254+
; LA32-NEXT: ld.w $s2, $sp, 12 # 4-byte Folded Reload
255+
; LA32-NEXT: ld.w $s1, $sp, 16 # 4-byte Folded Reload
256+
; LA32-NEXT: ld.w $s0, $sp, 20 # 4-byte Folded Reload
257+
; LA32-NEXT: ld.w $fp, $sp, 24 # 4-byte Folded Reload
258+
; LA32-NEXT: ld.w $ra, $sp, 28 # 4-byte Folded Reload
259+
; LA32-NEXT: addi.w $sp, $sp, 32
260+
; LA32-NEXT: ret
261+
;
262+
; LA64-LABEL: preserve_mostcc4:
263+
; LA64: # %bb.0:
264+
; LA64-NEXT: addi.d $sp, $sp, -80
265+
; LA64-NEXT: st.d $ra, $sp, 72 # 8-byte Folded Spill
266+
; LA64-NEXT: st.d $fp, $sp, 64 # 8-byte Folded Spill
267+
; LA64-NEXT: st.d $s0, $sp, 56 # 8-byte Folded Spill
268+
; LA64-NEXT: st.d $s1, $sp, 48 # 8-byte Folded Spill
269+
; LA64-NEXT: st.d $s2, $sp, 40 # 8-byte Folded Spill
270+
; LA64-NEXT: st.d $s3, $sp, 32 # 8-byte Folded Spill
271+
; LA64-NEXT: st.d $s4, $sp, 24 # 8-byte Folded Spill
272+
; LA64-NEXT: st.d $s5, $sp, 16 # 8-byte Folded Spill
273+
; LA64-NEXT: #APP
274+
; LA64-NEXT: #NO_APP
275+
; LA64-NEXT: move $fp, $t0
276+
; LA64-NEXT: #APP
277+
; LA64-NEXT: #NO_APP
278+
; LA64-NEXT: move $s2, $t1
279+
; LA64-NEXT: #APP
280+
; LA64-NEXT: #NO_APP
281+
; LA64-NEXT: move $s3, $t2
282+
; LA64-NEXT: #APP
283+
; LA64-NEXT: #NO_APP
284+
; LA64-NEXT: move $s4, $t3
285+
; LA64-NEXT: #APP
286+
; LA64-NEXT: #NO_APP
287+
; LA64-NEXT: move $s5, $t8
288+
; LA64-NEXT: #APP
289+
; LA64-NEXT: #NO_APP
290+
; LA64-NEXT: #APP
291+
; LA64-NEXT: #NO_APP
292+
; LA64-NEXT: pcaddu18i $ra, %call36(standard_cc_func)
293+
; LA64-NEXT: jirl $ra, $ra, 0
294+
; LA64-NEXT: move $t0, $fp
295+
; LA64-NEXT: move $t1, $s2
296+
; LA64-NEXT: move $t2, $s3
297+
; LA64-NEXT: move $t3, $s4
298+
; LA64-NEXT: move $t8, $s5
299+
; LA64-NEXT: #APP
300+
; LA64-NEXT: #NO_APP
301+
; LA64-NEXT: ld.d $s5, $sp, 16 # 8-byte Folded Reload
302+
; LA64-NEXT: ld.d $s4, $sp, 24 # 8-byte Folded Reload
303+
; LA64-NEXT: ld.d $s3, $sp, 32 # 8-byte Folded Reload
304+
; LA64-NEXT: ld.d $s2, $sp, 40 # 8-byte Folded Reload
305+
; LA64-NEXT: ld.d $s1, $sp, 48 # 8-byte Folded Reload
306+
; LA64-NEXT: ld.d $s0, $sp, 56 # 8-byte Folded Reload
307+
; LA64-NEXT: ld.d $fp, $sp, 64 # 8-byte Folded Reload
308+
; LA64-NEXT: ld.d $ra, $sp, 72 # 8-byte Folded Reload
309+
; LA64-NEXT: addi.d $sp, $sp, 80
310+
; LA64-NEXT: ret
311+
%1 = call i32 asm sideeffect "", "={r12}"() nounwind
312+
%2 = call i32 asm sideeffect "", "={r13}"() nounwind
313+
%3 = call i32 asm sideeffect "", "={r14}"() nounwind
314+
%4 = call i32 asm sideeffect "", "={r15}"() nounwind
315+
%5 = call i32 asm sideeffect "", "={r20}"() nounwind
316+
%6 = call i32 asm sideeffect "", "={r23}"() nounwind
317+
%7 = call i32 asm sideeffect "", "={r24}"() nounwind
318+
call void @standard_cc_func()
319+
call void asm sideeffect "", "{r12},{r13},{r14},{r15},{r20},{r23},{r24}"(i32 %1, i32 %2, i32 %3, i32 %4, i32 %5, i32 %6, i32 %7)
320+
ret void
321+
}

0 commit comments

Comments
 (0)