Changeset View
Changeset View
Standalone View
Standalone View
llvm/lib/Target/LoongArch/LoongArchFrameLowering.cpp
Show First 20 Lines • Show All 47 Lines • ▼ Show 20 Lines | void LoongArchFrameLowering::emitPrologue(MachineFunction &MF, | ||||
MachineBasicBlock &MBB) const { | MachineBasicBlock &MBB) const { | ||||
// TODO: Implement this when we have function calls | // TODO: Implement this when we have function calls | ||||
} | } | ||||
void LoongArchFrameLowering::emitEpilogue(MachineFunction &MF, | void LoongArchFrameLowering::emitEpilogue(MachineFunction &MF, | ||||
MachineBasicBlock &MBB) const { | MachineBasicBlock &MBB) const { | ||||
// TODO: Implement this when we have function calls | // TODO: Implement this when we have function calls | ||||
} | } | ||||
StackOffset LoongArchFrameLowering::getFrameIndexReference( | |||||
const MachineFunction &MF, int FI, Register &FrameReg) const { | |||||
const MachineFrameInfo &MFI = MF.getFrameInfo(); | |||||
const TargetRegisterInfo *RI = MF.getSubtarget().getRegisterInfo(); | |||||
// Callee-saved registers should be referenced relative to the stack | |||||
// pointer (positive offset), otherwise use the frame pointer (negative | |||||
// offset). | |||||
const auto &CSI = MFI.getCalleeSavedInfo(); | |||||
int MinCSFI = 0; | |||||
int MaxCSFI = -1; | |||||
StackOffset Offset = | |||||
StackOffset::getFixed(MFI.getObjectOffset(FI) - getOffsetOfLocalArea() + | |||||
xen0n: This implementation is a simplified version of RISCV's `getFrameIndexReference`, but we're… | |||||
Riscv uses stackID to handle ScalableVector, which we currently don't support, at least not currently. wangleiat: Riscv uses stackID to handle `ScalableVector`, which we currently don't support, at least not… | |||||
MFI.getOffsetAdjustment()); | |||||
if (CSI.size()) { | |||||
MinCSFI = CSI[0].getFrameIdx(); | |||||
MaxCSFI = CSI[CSI.size() - 1].getFrameIdx(); | |||||
} | |||||
FrameReg = RI->getFrameRegister(MF); | |||||
if ((FI >= MinCSFI && FI <= MaxCSFI) || !hasFP(MF)) { | |||||
FrameReg = LoongArch::R3; | |||||
Offset += StackOffset::getFixed(MFI.getStackSize()); | |||||
} | |||||
return Offset; | |||||
} |
This implementation is a simplified version of RISCV's getFrameIndexReference, but we're missing a stack ID check before this. I know we're not utilizing any non-default stack IDs so far but I don't know if such a check/assertion should be kept anyway.