@@ -18402,7 +18402,8 @@ ArrayRef<MCPhysReg> RISCV::getArgGPRs(const RISCVABI::ABI ABI) {
18402
18402
return ArrayRef(ArgIGPRs);
18403
18403
}
18404
18404
18405
- static ArrayRef<MCPhysReg> getFastCCArgGPRs(const RISCVABI::ABI ABI) {
18405
+ static ArrayRef<MCPhysReg> getFastCCArgGPRs(const RISCVABI::ABI ABI,
18406
+ bool HasZicfilp) {
18406
18407
// The GPRs used for passing arguments in the FastCC, X5 and X6 might be used
18407
18408
// for save-restore libcall, so we don't use them.
18408
18409
static const MCPhysReg FastCCIGPRs[] = {
@@ -18415,10 +18416,18 @@ static ArrayRef<MCPhysReg> getFastCCArgGPRs(const RISCVABI::ABI ABI) {
18415
18416
RISCV::X13, RISCV::X14, RISCV::X15,
18416
18417
RISCV::X7};
18417
18418
18419
+ // Zicfilp needs needs x7(t2) as the landing pad label register.
18420
+ static const MCPhysReg FastCCIGPRsNonX7[] = {
18421
+ RISCV::X10, RISCV::X11, RISCV::X12, RISCV::X13, RISCV::X14, RISCV::X15,
18422
+ RISCV::X16, RISCV::X17, RISCV::X28, RISCV::X29, RISCV::X30, RISCV::X31};
18423
+
18424
+ static const MCPhysReg FastCCEGPRsNonX7[] = {
18425
+ RISCV::X10, RISCV::X11, RISCV::X12, RISCV::X13, RISCV::X14, RISCV::X15};
18426
+
18418
18427
if (ABI == RISCVABI::ABI_ILP32E || ABI == RISCVABI::ABI_LP64E)
18419
- return ArrayRef(FastCCEGPRs);
18428
+ return HasZicfilp ? ArrayRef(FastCCEGPRsNonX7) : ArrayRef(FastCCEGPRs);
18420
18429
18421
- return ArrayRef(FastCCIGPRs);
18430
+ return HasZicfilp ? ArrayRef(FastCCIGPRsNonX7) : ArrayRef(FastCCIGPRs);
18422
18431
}
18423
18432
18424
18433
// Pass a 2*XLEN argument that has been split into two XLEN values through
@@ -18962,15 +18971,16 @@ bool RISCV::CC_RISCV_FastCC(const DataLayout &DL, RISCVABI::ABI ABI,
18962
18971
bool IsFixed, bool IsRet, Type *OrigTy,
18963
18972
const RISCVTargetLowering &TLI,
18964
18973
RVVArgDispatcher &RVVDispatcher) {
18974
+ const RISCVSubtarget &Subtarget = TLI.getSubtarget();
18975
+ bool HasZicfilp = Subtarget.hasStdExtZicfilp();
18976
+
18965
18977
if (LocVT == MVT::i32 || LocVT == MVT::i64) {
18966
- if (unsigned Reg = State.AllocateReg(getFastCCArgGPRs(ABI))) {
18978
+ if (unsigned Reg = State.AllocateReg(getFastCCArgGPRs(ABI, HasZicfilp ))) {
18967
18979
State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo));
18968
18980
return false;
18969
18981
}
18970
18982
}
18971
18983
18972
- const RISCVSubtarget &Subtarget = TLI.getSubtarget();
18973
-
18974
18984
if (LocVT == MVT::f16 &&
18975
18985
(Subtarget.hasStdExtZfh() || Subtarget.hasStdExtZfhmin())) {
18976
18986
static const MCPhysReg FPR16List[] = {
@@ -19014,7 +19024,7 @@ bool RISCV::CC_RISCV_FastCC(const DataLayout &DL, RISCVABI::ABI ABI,
19014
19024
(LocVT == MVT::f32 && Subtarget.hasStdExtZfinx()) ||
19015
19025
(LocVT == MVT::f64 && Subtarget.is64Bit() &&
19016
19026
Subtarget.hasStdExtZdinx())) {
19017
- if (unsigned Reg = State.AllocateReg(getFastCCArgGPRs(ABI))) {
19027
+ if (unsigned Reg = State.AllocateReg(getFastCCArgGPRs(ABI, HasZicfilp ))) {
19018
19028
State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo));
19019
19029
return false;
19020
19030
}
@@ -19049,7 +19059,8 @@ bool RISCV::CC_RISCV_FastCC(const DataLayout &DL, RISCVABI::ABI ABI,
19049
19059
CCValAssign::getReg(ValNo, ValVT, AllocatedVReg, LocVT, LocInfo));
19050
19060
} else {
19051
19061
// Try and pass the address via a "fast" GPR.
19052
- if (unsigned GPRReg = State.AllocateReg(getFastCCArgGPRs(ABI))) {
19062
+ if (unsigned GPRReg =
19063
+ State.AllocateReg(getFastCCArgGPRs(ABI, HasZicfilp))) {
19053
19064
LocInfo = CCValAssign::Indirect;
19054
19065
LocVT = TLI.getSubtarget().getXLenVT();
19055
19066
State.addLoc(CCValAssign::getReg(ValNo, ValVT, GPRReg, LocVT, LocInfo));
0 commit comments