Skip to content

Commit 20ffba3

Browse files
committed
Save x16-x31 when ilp32e/lp64e are used with non-E ISA
1 parent b8f68b1 commit 20ffba3

File tree

3 files changed

+262
-6
lines changed

3 files changed

+262
-6
lines changed

clang/lib/CodeGen/CodeGenModule.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ createTargetCodeGenInfo(CodeGenModule &CGM) {
229229
ABIFLen = 32;
230230
else if (ABIStr.ends_with("d"))
231231
ABIFLen = 64;
232-
bool EABI = ABIStr.endswith("e");
232+
bool EABI = ABIStr.ends_with("e");
233233
return createRISCVTargetCodeGenInfo(CGM, XLen, ABIFLen, EABI);
234234
}
235235

llvm/lib/Target/RISCV/RISCVFrameLowering.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -1003,9 +1003,19 @@ void RISCVFrameLowering::determineCalleeSaves(MachineFunction &MF,
10031003
};
10041004

10051005
for (auto Reg : CSRegs)
1006+
// Only save x0-x15 for RVE.
10061007
if (Reg < RISCV::X16 || !Subtarget.isRVE())
10071008
SavedRegs.set(Reg);
10081009

1010+
// According to psABI, if ilp32e/lp64e ABIs are used with an ISA that
1011+
// has any of the registers x16-x31 and f0-f31, then these registers are
1012+
// considered temporaries, so we should also save x16-x31 here.
1013+
if (STI.getTargetABI() == RISCVABI::ABI_ILP32E ||
1014+
STI.getTargetABI() == RISCVABI::ABI_LP64E) {
1015+
for (MCPhysReg Reg = RISCV::X16; Reg <= RISCV::X31; Reg++)
1016+
SavedRegs.set(Reg);
1017+
}
1018+
10091019
if (Subtarget.hasStdExtF()) {
10101020

10111021
// If interrupt is enabled, this list contains all FP registers.

llvm/test/CodeGen/RISCV/interrupt-attr.ll

+251-5
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@
66
; RUN: llc -mtriple riscv32-unknown-elf -mattr=+f,+d -o - %s \
77
; RUN: 2>&1 | FileCheck %s -check-prefix CHECK -check-prefix CHECK-RV32-FD
88
;
9+
; RUN: llc -mtriple riscv32-unknown-elf -mattr=+i -target-abi ilp32e -o - %s \
10+
; RUN: 2>&1 | FileCheck %s -check-prefixes=CHECK,CHECK-RV32I-ILP32E
911
; RUN: llc -mtriple riscv32-unknown-elf -mattr=+e -o - %s \
10-
; RUN: 2>&1 | FileCheck %s -check-prefix CHECK -check-prefix CHECK-RV32E
12+
; RUN: 2>&1 | FileCheck %s -check-prefixes=CHECK,CHECK-RV32E
1113
; RUN: llc -mtriple riscv32-unknown-elf -mattr=+e,+f -o - %s \
12-
; RUN: 2>&1 | FileCheck %s -check-prefix CHECK -check-prefix CHECK-RV32E-F
14+
; RUN: 2>&1 | FileCheck %s -check-prefixes=CHECK,CHECK-RV32E-F
1315
;
1416
; RUN: llc -mtriple riscv64-unknown-elf -o - %s \
1517
; RUN: 2>&1 | FileCheck %s -check-prefix CHECK -check-prefix CHECK-RV64
@@ -18,12 +20,14 @@
1820
; RUN: llc -mtriple riscv64-unknown-elf -mattr=+f,+d -o - %s \
1921
; RUN: 2>&1 | FileCheck %s -check-prefix CHECK -check-prefix CHECK-RV64-FD
2022
;
23+
; RUN: llc -mtriple riscv64-unknown-elf -mattr=+i -target-abi lp64e -o - %s \
24+
; RUN: 2>&1 | FileCheck %s -check-prefixes=CHECK,CHECK-RV64I-LP64E
2125
; RUN: llc -mtriple riscv64-unknown-elf -mattr=+e -o - %s \
22-
; RUN: 2>&1 | FileCheck %s -check-prefix CHECK -check-prefix CHECK-RV64E
26+
; RUN: 2>&1 | FileCheck %s -check-prefixes=CHECK,CHECK-RV64E
2327
; RUN: llc -mtriple riscv64-unknown-elf -mattr=+e,+f -o - %s \
24-
; RUN: 2>&1 | FileCheck %s -check-prefix CHECK -check-prefix CHECK-RV64E-F
28+
; RUN: 2>&1 | FileCheck %s -check-prefixes=CHECK,CHECK-RV64E-F
2529
; RUN: llc -mtriple riscv64-unknown-elf -mattr=+e,+f,+d -o - %s \
26-
; RUN: 2>&1 | FileCheck %s -check-prefix CHECK -check-prefix CHECK-RV64E-FD
30+
; RUN: 2>&1 | FileCheck %s -check-prefixes=CHECK,CHECK-RV64E-FD
2731

2832
;
2933
; Checking for special return instructions (sret, mret).
@@ -301,6 +305,65 @@ define void @foo_with_call() #1 {
301305
; CHECK-RV32-FD-NEXT: addi sp, sp, 320
302306
; CHECK-RV32-FD-NEXT: mret
303307
;
308+
; CHECK-RV32I-ILP32E-LABEL: foo_with_call:
309+
; CHECK-RV32I-ILP32E: # %bb.0:
310+
; CHECK-RV32I-ILP32E-NEXT: addi sp, sp, -104
311+
; CHECK-RV32I-ILP32E-NEXT: sw ra, 100(sp) # 4-byte Folded Spill
312+
; CHECK-RV32I-ILP32E-NEXT: sw t0, 96(sp) # 4-byte Folded Spill
313+
; CHECK-RV32I-ILP32E-NEXT: sw t1, 92(sp) # 4-byte Folded Spill
314+
; CHECK-RV32I-ILP32E-NEXT: sw t2, 88(sp) # 4-byte Folded Spill
315+
; CHECK-RV32I-ILP32E-NEXT: sw a0, 84(sp) # 4-byte Folded Spill
316+
; CHECK-RV32I-ILP32E-NEXT: sw a1, 80(sp) # 4-byte Folded Spill
317+
; CHECK-RV32I-ILP32E-NEXT: sw a2, 76(sp) # 4-byte Folded Spill
318+
; CHECK-RV32I-ILP32E-NEXT: sw a3, 72(sp) # 4-byte Folded Spill
319+
; CHECK-RV32I-ILP32E-NEXT: sw a4, 68(sp) # 4-byte Folded Spill
320+
; CHECK-RV32I-ILP32E-NEXT: sw a5, 64(sp) # 4-byte Folded Spill
321+
; CHECK-RV32I-ILP32E-NEXT: sw a6, 60(sp) # 4-byte Folded Spill
322+
; CHECK-RV32I-ILP32E-NEXT: sw a7, 56(sp) # 4-byte Folded Spill
323+
; CHECK-RV32I-ILP32E-NEXT: sw s2, 52(sp) # 4-byte Folded Spill
324+
; CHECK-RV32I-ILP32E-NEXT: sw s3, 48(sp) # 4-byte Folded Spill
325+
; CHECK-RV32I-ILP32E-NEXT: sw s4, 44(sp) # 4-byte Folded Spill
326+
; CHECK-RV32I-ILP32E-NEXT: sw s5, 40(sp) # 4-byte Folded Spill
327+
; CHECK-RV32I-ILP32E-NEXT: sw s6, 36(sp) # 4-byte Folded Spill
328+
; CHECK-RV32I-ILP32E-NEXT: sw s7, 32(sp) # 4-byte Folded Spill
329+
; CHECK-RV32I-ILP32E-NEXT: sw s8, 28(sp) # 4-byte Folded Spill
330+
; CHECK-RV32I-ILP32E-NEXT: sw s9, 24(sp) # 4-byte Folded Spill
331+
; CHECK-RV32I-ILP32E-NEXT: sw s10, 20(sp) # 4-byte Folded Spill
332+
; CHECK-RV32I-ILP32E-NEXT: sw s11, 16(sp) # 4-byte Folded Spill
333+
; CHECK-RV32I-ILP32E-NEXT: sw t3, 12(sp) # 4-byte Folded Spill
334+
; CHECK-RV32I-ILP32E-NEXT: sw t4, 8(sp) # 4-byte Folded Spill
335+
; CHECK-RV32I-ILP32E-NEXT: sw t5, 4(sp) # 4-byte Folded Spill
336+
; CHECK-RV32I-ILP32E-NEXT: sw t6, 0(sp) # 4-byte Folded Spill
337+
; CHECK-RV32I-ILP32E-NEXT: call otherfoo@plt
338+
; CHECK-RV32I-ILP32E-NEXT: lw ra, 100(sp) # 4-byte Folded Reload
339+
; CHECK-RV32I-ILP32E-NEXT: lw t0, 96(sp) # 4-byte Folded Reload
340+
; CHECK-RV32I-ILP32E-NEXT: lw t1, 92(sp) # 4-byte Folded Reload
341+
; CHECK-RV32I-ILP32E-NEXT: lw t2, 88(sp) # 4-byte Folded Reload
342+
; CHECK-RV32I-ILP32E-NEXT: lw a0, 84(sp) # 4-byte Folded Reload
343+
; CHECK-RV32I-ILP32E-NEXT: lw a1, 80(sp) # 4-byte Folded Reload
344+
; CHECK-RV32I-ILP32E-NEXT: lw a2, 76(sp) # 4-byte Folded Reload
345+
; CHECK-RV32I-ILP32E-NEXT: lw a3, 72(sp) # 4-byte Folded Reload
346+
; CHECK-RV32I-ILP32E-NEXT: lw a4, 68(sp) # 4-byte Folded Reload
347+
; CHECK-RV32I-ILP32E-NEXT: lw a5, 64(sp) # 4-byte Folded Reload
348+
; CHECK-RV32I-ILP32E-NEXT: lw a6, 60(sp) # 4-byte Folded Reload
349+
; CHECK-RV32I-ILP32E-NEXT: lw a7, 56(sp) # 4-byte Folded Reload
350+
; CHECK-RV32I-ILP32E-NEXT: lw s2, 52(sp) # 4-byte Folded Reload
351+
; CHECK-RV32I-ILP32E-NEXT: lw s3, 48(sp) # 4-byte Folded Reload
352+
; CHECK-RV32I-ILP32E-NEXT: lw s4, 44(sp) # 4-byte Folded Reload
353+
; CHECK-RV32I-ILP32E-NEXT: lw s5, 40(sp) # 4-byte Folded Reload
354+
; CHECK-RV32I-ILP32E-NEXT: lw s6, 36(sp) # 4-byte Folded Reload
355+
; CHECK-RV32I-ILP32E-NEXT: lw s7, 32(sp) # 4-byte Folded Reload
356+
; CHECK-RV32I-ILP32E-NEXT: lw s8, 28(sp) # 4-byte Folded Reload
357+
; CHECK-RV32I-ILP32E-NEXT: lw s9, 24(sp) # 4-byte Folded Reload
358+
; CHECK-RV32I-ILP32E-NEXT: lw s10, 20(sp) # 4-byte Folded Reload
359+
; CHECK-RV32I-ILP32E-NEXT: lw s11, 16(sp) # 4-byte Folded Reload
360+
; CHECK-RV32I-ILP32E-NEXT: lw t3, 12(sp) # 4-byte Folded Reload
361+
; CHECK-RV32I-ILP32E-NEXT: lw t4, 8(sp) # 4-byte Folded Reload
362+
; CHECK-RV32I-ILP32E-NEXT: lw t5, 4(sp) # 4-byte Folded Reload
363+
; CHECK-RV32I-ILP32E-NEXT: lw t6, 0(sp) # 4-byte Folded Reload
364+
; CHECK-RV32I-ILP32E-NEXT: addi sp, sp, 104
365+
; CHECK-RV32I-ILP32E-NEXT: mret
366+
;
304367
; CHECK-RV32E-LABEL: foo_with_call:
305368
; CHECK-RV32E: # %bb.0:
306369
; CHECK-RV32E-NEXT: addi sp, sp, -40
@@ -664,6 +727,65 @@ define void @foo_with_call() #1 {
664727
; CHECK-RV64-FD-NEXT: addi sp, sp, 384
665728
; CHECK-RV64-FD-NEXT: mret
666729
;
730+
; CHECK-RV64I-LP64E-LABEL: foo_with_call:
731+
; CHECK-RV64I-LP64E: # %bb.0:
732+
; CHECK-RV64I-LP64E-NEXT: addi sp, sp, -208
733+
; CHECK-RV64I-LP64E-NEXT: sd ra, 200(sp) # 8-byte Folded Spill
734+
; CHECK-RV64I-LP64E-NEXT: sd t0, 192(sp) # 8-byte Folded Spill
735+
; CHECK-RV64I-LP64E-NEXT: sd t1, 184(sp) # 8-byte Folded Spill
736+
; CHECK-RV64I-LP64E-NEXT: sd t2, 176(sp) # 8-byte Folded Spill
737+
; CHECK-RV64I-LP64E-NEXT: sd a0, 168(sp) # 8-byte Folded Spill
738+
; CHECK-RV64I-LP64E-NEXT: sd a1, 160(sp) # 8-byte Folded Spill
739+
; CHECK-RV64I-LP64E-NEXT: sd a2, 152(sp) # 8-byte Folded Spill
740+
; CHECK-RV64I-LP64E-NEXT: sd a3, 144(sp) # 8-byte Folded Spill
741+
; CHECK-RV64I-LP64E-NEXT: sd a4, 136(sp) # 8-byte Folded Spill
742+
; CHECK-RV64I-LP64E-NEXT: sd a5, 128(sp) # 8-byte Folded Spill
743+
; CHECK-RV64I-LP64E-NEXT: sd a6, 120(sp) # 8-byte Folded Spill
744+
; CHECK-RV64I-LP64E-NEXT: sd a7, 112(sp) # 8-byte Folded Spill
745+
; CHECK-RV64I-LP64E-NEXT: sd s2, 104(sp) # 8-byte Folded Spill
746+
; CHECK-RV64I-LP64E-NEXT: sd s3, 96(sp) # 8-byte Folded Spill
747+
; CHECK-RV64I-LP64E-NEXT: sd s4, 88(sp) # 8-byte Folded Spill
748+
; CHECK-RV64I-LP64E-NEXT: sd s5, 80(sp) # 8-byte Folded Spill
749+
; CHECK-RV64I-LP64E-NEXT: sd s6, 72(sp) # 8-byte Folded Spill
750+
; CHECK-RV64I-LP64E-NEXT: sd s7, 64(sp) # 8-byte Folded Spill
751+
; CHECK-RV64I-LP64E-NEXT: sd s8, 56(sp) # 8-byte Folded Spill
752+
; CHECK-RV64I-LP64E-NEXT: sd s9, 48(sp) # 8-byte Folded Spill
753+
; CHECK-RV64I-LP64E-NEXT: sd s10, 40(sp) # 8-byte Folded Spill
754+
; CHECK-RV64I-LP64E-NEXT: sd s11, 32(sp) # 8-byte Folded Spill
755+
; CHECK-RV64I-LP64E-NEXT: sd t3, 24(sp) # 8-byte Folded Spill
756+
; CHECK-RV64I-LP64E-NEXT: sd t4, 16(sp) # 8-byte Folded Spill
757+
; CHECK-RV64I-LP64E-NEXT: sd t5, 8(sp) # 8-byte Folded Spill
758+
; CHECK-RV64I-LP64E-NEXT: sd t6, 0(sp) # 8-byte Folded Spill
759+
; CHECK-RV64I-LP64E-NEXT: call otherfoo@plt
760+
; CHECK-RV64I-LP64E-NEXT: ld ra, 200(sp) # 8-byte Folded Reload
761+
; CHECK-RV64I-LP64E-NEXT: ld t0, 192(sp) # 8-byte Folded Reload
762+
; CHECK-RV64I-LP64E-NEXT: ld t1, 184(sp) # 8-byte Folded Reload
763+
; CHECK-RV64I-LP64E-NEXT: ld t2, 176(sp) # 8-byte Folded Reload
764+
; CHECK-RV64I-LP64E-NEXT: ld a0, 168(sp) # 8-byte Folded Reload
765+
; CHECK-RV64I-LP64E-NEXT: ld a1, 160(sp) # 8-byte Folded Reload
766+
; CHECK-RV64I-LP64E-NEXT: ld a2, 152(sp) # 8-byte Folded Reload
767+
; CHECK-RV64I-LP64E-NEXT: ld a3, 144(sp) # 8-byte Folded Reload
768+
; CHECK-RV64I-LP64E-NEXT: ld a4, 136(sp) # 8-byte Folded Reload
769+
; CHECK-RV64I-LP64E-NEXT: ld a5, 128(sp) # 8-byte Folded Reload
770+
; CHECK-RV64I-LP64E-NEXT: ld a6, 120(sp) # 8-byte Folded Reload
771+
; CHECK-RV64I-LP64E-NEXT: ld a7, 112(sp) # 8-byte Folded Reload
772+
; CHECK-RV64I-LP64E-NEXT: ld s2, 104(sp) # 8-byte Folded Reload
773+
; CHECK-RV64I-LP64E-NEXT: ld s3, 96(sp) # 8-byte Folded Reload
774+
; CHECK-RV64I-LP64E-NEXT: ld s4, 88(sp) # 8-byte Folded Reload
775+
; CHECK-RV64I-LP64E-NEXT: ld s5, 80(sp) # 8-byte Folded Reload
776+
; CHECK-RV64I-LP64E-NEXT: ld s6, 72(sp) # 8-byte Folded Reload
777+
; CHECK-RV64I-LP64E-NEXT: ld s7, 64(sp) # 8-byte Folded Reload
778+
; CHECK-RV64I-LP64E-NEXT: ld s8, 56(sp) # 8-byte Folded Reload
779+
; CHECK-RV64I-LP64E-NEXT: ld s9, 48(sp) # 8-byte Folded Reload
780+
; CHECK-RV64I-LP64E-NEXT: ld s10, 40(sp) # 8-byte Folded Reload
781+
; CHECK-RV64I-LP64E-NEXT: ld s11, 32(sp) # 8-byte Folded Reload
782+
; CHECK-RV64I-LP64E-NEXT: ld t3, 24(sp) # 8-byte Folded Reload
783+
; CHECK-RV64I-LP64E-NEXT: ld t4, 16(sp) # 8-byte Folded Reload
784+
; CHECK-RV64I-LP64E-NEXT: ld t5, 8(sp) # 8-byte Folded Reload
785+
; CHECK-RV64I-LP64E-NEXT: ld t6, 0(sp) # 8-byte Folded Reload
786+
; CHECK-RV64I-LP64E-NEXT: addi sp, sp, 208
787+
; CHECK-RV64I-LP64E-NEXT: mret
788+
;
667789
; CHECK-RV64E-LABEL: foo_with_call:
668790
; CHECK-RV64E: # %bb.0:
669791
; CHECK-RV64E-NEXT: addi sp, sp, -80
@@ -1167,6 +1289,68 @@ define void @foo_fp_with_call() #2 {
11671289
; CHECK-RV32-FD-NEXT: addi sp, sp, 336
11681290
; CHECK-RV32-FD-NEXT: mret
11691291
;
1292+
; CHECK-RV32I-ILP32E-LABEL: foo_fp_with_call:
1293+
; CHECK-RV32I-ILP32E: # %bb.0:
1294+
; CHECK-RV32I-ILP32E-NEXT: addi sp, sp, -108
1295+
; CHECK-RV32I-ILP32E-NEXT: sw ra, 104(sp) # 4-byte Folded Spill
1296+
; CHECK-RV32I-ILP32E-NEXT: sw t0, 100(sp) # 4-byte Folded Spill
1297+
; CHECK-RV32I-ILP32E-NEXT: sw t1, 96(sp) # 4-byte Folded Spill
1298+
; CHECK-RV32I-ILP32E-NEXT: sw t2, 92(sp) # 4-byte Folded Spill
1299+
; CHECK-RV32I-ILP32E-NEXT: sw s0, 88(sp) # 4-byte Folded Spill
1300+
; CHECK-RV32I-ILP32E-NEXT: sw a0, 84(sp) # 4-byte Folded Spill
1301+
; CHECK-RV32I-ILP32E-NEXT: sw a1, 80(sp) # 4-byte Folded Spill
1302+
; CHECK-RV32I-ILP32E-NEXT: sw a2, 76(sp) # 4-byte Folded Spill
1303+
; CHECK-RV32I-ILP32E-NEXT: sw a3, 72(sp) # 4-byte Folded Spill
1304+
; CHECK-RV32I-ILP32E-NEXT: sw a4, 68(sp) # 4-byte Folded Spill
1305+
; CHECK-RV32I-ILP32E-NEXT: sw a5, 64(sp) # 4-byte Folded Spill
1306+
; CHECK-RV32I-ILP32E-NEXT: sw a6, 60(sp) # 4-byte Folded Spill
1307+
; CHECK-RV32I-ILP32E-NEXT: sw a7, 56(sp) # 4-byte Folded Spill
1308+
; CHECK-RV32I-ILP32E-NEXT: sw s2, 52(sp) # 4-byte Folded Spill
1309+
; CHECK-RV32I-ILP32E-NEXT: sw s3, 48(sp) # 4-byte Folded Spill
1310+
; CHECK-RV32I-ILP32E-NEXT: sw s4, 44(sp) # 4-byte Folded Spill
1311+
; CHECK-RV32I-ILP32E-NEXT: sw s5, 40(sp) # 4-byte Folded Spill
1312+
; CHECK-RV32I-ILP32E-NEXT: sw s6, 36(sp) # 4-byte Folded Spill
1313+
; CHECK-RV32I-ILP32E-NEXT: sw s7, 32(sp) # 4-byte Folded Spill
1314+
; CHECK-RV32I-ILP32E-NEXT: sw s8, 28(sp) # 4-byte Folded Spill
1315+
; CHECK-RV32I-ILP32E-NEXT: sw s9, 24(sp) # 4-byte Folded Spill
1316+
; CHECK-RV32I-ILP32E-NEXT: sw s10, 20(sp) # 4-byte Folded Spill
1317+
; CHECK-RV32I-ILP32E-NEXT: sw s11, 16(sp) # 4-byte Folded Spill
1318+
; CHECK-RV32I-ILP32E-NEXT: sw t3, 12(sp) # 4-byte Folded Spill
1319+
; CHECK-RV32I-ILP32E-NEXT: sw t4, 8(sp) # 4-byte Folded Spill
1320+
; CHECK-RV32I-ILP32E-NEXT: sw t5, 4(sp) # 4-byte Folded Spill
1321+
; CHECK-RV32I-ILP32E-NEXT: sw t6, 0(sp) # 4-byte Folded Spill
1322+
; CHECK-RV32I-ILP32E-NEXT: addi s0, sp, 108
1323+
; CHECK-RV32I-ILP32E-NEXT: call otherfoo@plt
1324+
; CHECK-RV32I-ILP32E-NEXT: lw ra, 104(sp) # 4-byte Folded Reload
1325+
; CHECK-RV32I-ILP32E-NEXT: lw t0, 100(sp) # 4-byte Folded Reload
1326+
; CHECK-RV32I-ILP32E-NEXT: lw t1, 96(sp) # 4-byte Folded Reload
1327+
; CHECK-RV32I-ILP32E-NEXT: lw t2, 92(sp) # 4-byte Folded Reload
1328+
; CHECK-RV32I-ILP32E-NEXT: lw s0, 88(sp) # 4-byte Folded Reload
1329+
; CHECK-RV32I-ILP32E-NEXT: lw a0, 84(sp) # 4-byte Folded Reload
1330+
; CHECK-RV32I-ILP32E-NEXT: lw a1, 80(sp) # 4-byte Folded Reload
1331+
; CHECK-RV32I-ILP32E-NEXT: lw a2, 76(sp) # 4-byte Folded Reload
1332+
; CHECK-RV32I-ILP32E-NEXT: lw a3, 72(sp) # 4-byte Folded Reload
1333+
; CHECK-RV32I-ILP32E-NEXT: lw a4, 68(sp) # 4-byte Folded Reload
1334+
; CHECK-RV32I-ILP32E-NEXT: lw a5, 64(sp) # 4-byte Folded Reload
1335+
; CHECK-RV32I-ILP32E-NEXT: lw a6, 60(sp) # 4-byte Folded Reload
1336+
; CHECK-RV32I-ILP32E-NEXT: lw a7, 56(sp) # 4-byte Folded Reload
1337+
; CHECK-RV32I-ILP32E-NEXT: lw s2, 52(sp) # 4-byte Folded Reload
1338+
; CHECK-RV32I-ILP32E-NEXT: lw s3, 48(sp) # 4-byte Folded Reload
1339+
; CHECK-RV32I-ILP32E-NEXT: lw s4, 44(sp) # 4-byte Folded Reload
1340+
; CHECK-RV32I-ILP32E-NEXT: lw s5, 40(sp) # 4-byte Folded Reload
1341+
; CHECK-RV32I-ILP32E-NEXT: lw s6, 36(sp) # 4-byte Folded Reload
1342+
; CHECK-RV32I-ILP32E-NEXT: lw s7, 32(sp) # 4-byte Folded Reload
1343+
; CHECK-RV32I-ILP32E-NEXT: lw s8, 28(sp) # 4-byte Folded Reload
1344+
; CHECK-RV32I-ILP32E-NEXT: lw s9, 24(sp) # 4-byte Folded Reload
1345+
; CHECK-RV32I-ILP32E-NEXT: lw s10, 20(sp) # 4-byte Folded Reload
1346+
; CHECK-RV32I-ILP32E-NEXT: lw s11, 16(sp) # 4-byte Folded Reload
1347+
; CHECK-RV32I-ILP32E-NEXT: lw t3, 12(sp) # 4-byte Folded Reload
1348+
; CHECK-RV32I-ILP32E-NEXT: lw t4, 8(sp) # 4-byte Folded Reload
1349+
; CHECK-RV32I-ILP32E-NEXT: lw t5, 4(sp) # 4-byte Folded Reload
1350+
; CHECK-RV32I-ILP32E-NEXT: lw t6, 0(sp) # 4-byte Folded Reload
1351+
; CHECK-RV32I-ILP32E-NEXT: addi sp, sp, 108
1352+
; CHECK-RV32I-ILP32E-NEXT: mret
1353+
;
11701354
; CHECK-RV32E-LABEL: foo_fp_with_call:
11711355
; CHECK-RV32E: # %bb.0:
11721356
; CHECK-RV32E-NEXT: addi sp, sp, -44
@@ -1545,6 +1729,68 @@ define void @foo_fp_with_call() #2 {
15451729
; CHECK-RV64-FD-NEXT: addi sp, sp, 400
15461730
; CHECK-RV64-FD-NEXT: mret
15471731
;
1732+
; CHECK-RV64I-LP64E-LABEL: foo_fp_with_call:
1733+
; CHECK-RV64I-LP64E: # %bb.0:
1734+
; CHECK-RV64I-LP64E-NEXT: addi sp, sp, -216
1735+
; CHECK-RV64I-LP64E-NEXT: sd ra, 208(sp) # 8-byte Folded Spill
1736+
; CHECK-RV64I-LP64E-NEXT: sd t0, 200(sp) # 8-byte Folded Spill
1737+
; CHECK-RV64I-LP64E-NEXT: sd t1, 192(sp) # 8-byte Folded Spill
1738+
; CHECK-RV64I-LP64E-NEXT: sd t2, 184(sp) # 8-byte Folded Spill
1739+
; CHECK-RV64I-LP64E-NEXT: sd s0, 176(sp) # 8-byte Folded Spill
1740+
; CHECK-RV64I-LP64E-NEXT: sd a0, 168(sp) # 8-byte Folded Spill
1741+
; CHECK-RV64I-LP64E-NEXT: sd a1, 160(sp) # 8-byte Folded Spill
1742+
; CHECK-RV64I-LP64E-NEXT: sd a2, 152(sp) # 8-byte Folded Spill
1743+
; CHECK-RV64I-LP64E-NEXT: sd a3, 144(sp) # 8-byte Folded Spill
1744+
; CHECK-RV64I-LP64E-NEXT: sd a4, 136(sp) # 8-byte Folded Spill
1745+
; CHECK-RV64I-LP64E-NEXT: sd a5, 128(sp) # 8-byte Folded Spill
1746+
; CHECK-RV64I-LP64E-NEXT: sd a6, 120(sp) # 8-byte Folded Spill
1747+
; CHECK-RV64I-LP64E-NEXT: sd a7, 112(sp) # 8-byte Folded Spill
1748+
; CHECK-RV64I-LP64E-NEXT: sd s2, 104(sp) # 8-byte Folded Spill
1749+
; CHECK-RV64I-LP64E-NEXT: sd s3, 96(sp) # 8-byte Folded Spill
1750+
; CHECK-RV64I-LP64E-NEXT: sd s4, 88(sp) # 8-byte Folded Spill
1751+
; CHECK-RV64I-LP64E-NEXT: sd s5, 80(sp) # 8-byte Folded Spill
1752+
; CHECK-RV64I-LP64E-NEXT: sd s6, 72(sp) # 8-byte Folded Spill
1753+
; CHECK-RV64I-LP64E-NEXT: sd s7, 64(sp) # 8-byte Folded Spill
1754+
; CHECK-RV64I-LP64E-NEXT: sd s8, 56(sp) # 8-byte Folded Spill
1755+
; CHECK-RV64I-LP64E-NEXT: sd s9, 48(sp) # 8-byte Folded Spill
1756+
; CHECK-RV64I-LP64E-NEXT: sd s10, 40(sp) # 8-byte Folded Spill
1757+
; CHECK-RV64I-LP64E-NEXT: sd s11, 32(sp) # 8-byte Folded Spill
1758+
; CHECK-RV64I-LP64E-NEXT: sd t3, 24(sp) # 8-byte Folded Spill
1759+
; CHECK-RV64I-LP64E-NEXT: sd t4, 16(sp) # 8-byte Folded Spill
1760+
; CHECK-RV64I-LP64E-NEXT: sd t5, 8(sp) # 8-byte Folded Spill
1761+
; CHECK-RV64I-LP64E-NEXT: sd t6, 0(sp) # 8-byte Folded Spill
1762+
; CHECK-RV64I-LP64E-NEXT: addi s0, sp, 216
1763+
; CHECK-RV64I-LP64E-NEXT: call otherfoo@plt
1764+
; CHECK-RV64I-LP64E-NEXT: ld ra, 208(sp) # 8-byte Folded Reload
1765+
; CHECK-RV64I-LP64E-NEXT: ld t0, 200(sp) # 8-byte Folded Reload
1766+
; CHECK-RV64I-LP64E-NEXT: ld t1, 192(sp) # 8-byte Folded Reload
1767+
; CHECK-RV64I-LP64E-NEXT: ld t2, 184(sp) # 8-byte Folded Reload
1768+
; CHECK-RV64I-LP64E-NEXT: ld s0, 176(sp) # 8-byte Folded Reload
1769+
; CHECK-RV64I-LP64E-NEXT: ld a0, 168(sp) # 8-byte Folded Reload
1770+
; CHECK-RV64I-LP64E-NEXT: ld a1, 160(sp) # 8-byte Folded Reload
1771+
; CHECK-RV64I-LP64E-NEXT: ld a2, 152(sp) # 8-byte Folded Reload
1772+
; CHECK-RV64I-LP64E-NEXT: ld a3, 144(sp) # 8-byte Folded Reload
1773+
; CHECK-RV64I-LP64E-NEXT: ld a4, 136(sp) # 8-byte Folded Reload
1774+
; CHECK-RV64I-LP64E-NEXT: ld a5, 128(sp) # 8-byte Folded Reload
1775+
; CHECK-RV64I-LP64E-NEXT: ld a6, 120(sp) # 8-byte Folded Reload
1776+
; CHECK-RV64I-LP64E-NEXT: ld a7, 112(sp) # 8-byte Folded Reload
1777+
; CHECK-RV64I-LP64E-NEXT: ld s2, 104(sp) # 8-byte Folded Reload
1778+
; CHECK-RV64I-LP64E-NEXT: ld s3, 96(sp) # 8-byte Folded Reload
1779+
; CHECK-RV64I-LP64E-NEXT: ld s4, 88(sp) # 8-byte Folded Reload
1780+
; CHECK-RV64I-LP64E-NEXT: ld s5, 80(sp) # 8-byte Folded Reload
1781+
; CHECK-RV64I-LP64E-NEXT: ld s6, 72(sp) # 8-byte Folded Reload
1782+
; CHECK-RV64I-LP64E-NEXT: ld s7, 64(sp) # 8-byte Folded Reload
1783+
; CHECK-RV64I-LP64E-NEXT: ld s8, 56(sp) # 8-byte Folded Reload
1784+
; CHECK-RV64I-LP64E-NEXT: ld s9, 48(sp) # 8-byte Folded Reload
1785+
; CHECK-RV64I-LP64E-NEXT: ld s10, 40(sp) # 8-byte Folded Reload
1786+
; CHECK-RV64I-LP64E-NEXT: ld s11, 32(sp) # 8-byte Folded Reload
1787+
; CHECK-RV64I-LP64E-NEXT: ld t3, 24(sp) # 8-byte Folded Reload
1788+
; CHECK-RV64I-LP64E-NEXT: ld t4, 16(sp) # 8-byte Folded Reload
1789+
; CHECK-RV64I-LP64E-NEXT: ld t5, 8(sp) # 8-byte Folded Reload
1790+
; CHECK-RV64I-LP64E-NEXT: ld t6, 0(sp) # 8-byte Folded Reload
1791+
; CHECK-RV64I-LP64E-NEXT: addi sp, sp, 216
1792+
; CHECK-RV64I-LP64E-NEXT: mret
1793+
;
15481794
; CHECK-RV64E-LABEL: foo_fp_with_call:
15491795
; CHECK-RV64E: # %bb.0:
15501796
; CHECK-RV64E-NEXT: addi sp, sp, -88

0 commit comments

Comments
 (0)