llvm-project/llvm/lib/Target/Foot/FootFrameLowering.cpp
2025-11-11 13:14:20 -05:00

129 lines
4.1 KiB
C++

#include "FootFrameLowering.h"
#include "FootMachineFunctionInfo.h"
#include "MCTargetDesc/FootMCTargetDesc.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/TargetInstrInfo.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
using namespace llvm;
bool FootFrameLowering::hasFPImpl(const MachineFunction& MF) const {
return false;
}
void FootFrameLowering::emitPrologue(MachineFunction &MF,
MachineBasicBlock &MBB) const {
MachineFrameInfo &MFI = MF.getFrameInfo();
const TargetInstrInfo *TII = MF.getSubtarget().getInstrInfo();
int FI = MF.getInfo<FootMachineFunctionInfo>()->getReturnAddressFrameIndex();
BuildMI(MBB, MBB.begin(), DebugLoc(), TII->get(Foot::BWOR_I_D_M_A))
.addFrameIndex(FI)
.addReg(Foot::RRA)
.addImm(0);
unsigned NumBytes = MFI.getStackSize();
if (NumBytes > 0) {
const TargetInstrInfo *TII = MF.getSubtarget().getInstrInfo();
if (NumBytes < (1 << 5)) {
BuildMI(MBB, MBB.begin(), DebugLoc(), TII->get(Foot::SUBT_D_D_M_A), Foot::RSP)
.addReg(Foot::RSP)
.addImm(NumBytes);
}
else {
BuildMI(MBB, MBB.begin(), DebugLoc(), TII->get(Foot::SUBT_D_D_D_A), Foot::RSP)
.addReg(Foot::RSP)
.addReg(Foot::R27);
BuildMI(MBB, MBB.begin(), DebugLoc(), TII->get(Foot::CNST_D_A), Foot::R27)
.addImm(NumBytes);
}
}
}
void FootFrameLowering::emitEpilogue(MachineFunction &MF,
MachineBasicBlock &MBB) const {
MachineFrameInfo &MFI = MF.getFrameInfo();
const TargetInstrInfo *TII = MF.getSubtarget().getInstrInfo();
unsigned NumBytes = MFI.getStackSize();
int FI = MF.getInfo<FootMachineFunctionInfo>()->getReturnAddressFrameIndex();
BuildMI(MBB, MBB.getFirstTerminator(), DebugLoc(), TII->get(Foot::BWOR_D_I_M_A))
.addReg(Foot::RRA)
.addFrameIndex(FI)
.addImm(0);
if (NumBytes > 0) {
const TargetInstrInfo *TII = MF.getSubtarget().getInstrInfo();
if (NumBytes < (1 << 5)) {
BuildMI(MBB, MBB.getFirstTerminator(), DebugLoc(), TII->get(Foot::ADDI_D_D_M_A), Foot::RSP)
.addReg(Foot::RSP)
.addImm(NumBytes);
}
else {
BuildMI(MBB, MBB.getFirstTerminator(), DebugLoc(), TII->get(Foot::ADDI_D_D_D_A), Foot::RSP)
.addReg(Foot::RSP)
.addReg(Foot::R27);
BuildMI(MBB, MBB.getFirstTerminator(), DebugLoc(), TII->get(Foot::CNST_D_A), Foot::R27)
.addImm(NumBytes);
}
}
const auto& I = MBB.getFirstTerminator();
BuildMI(MBB, MBB.getFirstTerminator(), I->getDebugLoc(), TII->get(Foot::COPY_D_D_A))
.addReg(Foot::RPC)
.addReg(Foot::RRA);
MBB.erase(I);
}
MachineBasicBlock::iterator FootFrameLowering::eliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB,
MachineBasicBlock::iterator MI) const {
const TargetInstrInfo *TII = MF.getSubtarget().getInstrInfo();
unsigned Opc = MI->getOpcode();
assert(hasReservedCallFrame(MF) && "Foot doesn't have an FP register");
if (Opc != TII->getCallFrameSetupOpcode() &&
Opc != TII->getCallFrameDestroyOpcode()) {
report_fatal_error("Unexpected frame psuedo instruction");
}
if (MI->getOperand(1).getImm() != 0) {
report_fatal_error("callee pop count not supported");
}
return MBB.erase(MI);
}
StackOffset FootFrameLowering::getFrameIndexReference(const MachineFunction &MF, int FrameIndex,
Register &FrameReg) const {
const MachineFrameInfo &MFI = MF.getFrameInfo();
int Offset = MFI.getObjectSize(FrameIndex) + getOffsetOfLocalArea() +
MFI.getStackSize();
if (hasFP(MF)) {
llvm_unreachable("foot has no frame pointer");
}
FrameReg = Foot::RSP;
return StackOffset::getFixed(Offset);
}
void FootFrameLowering::determineCalleeSaves(MachineFunction &MF, BitVector &SavedRegs,
RegScavenger *RS) const {
TargetFrameLowering::determineCalleeSaves(MF, SavedRegs, RS);
MachineFrameInfo &MFI = MF.getFrameInfo();
int RetAddrFI = MFI.CreateStackObject(4, Align(4), false);
MF.getInfo<FootMachineFunctionInfo>()->setReturnAddressFrameIndex(RetAddrFI);
}