29#define GET_REGINFO_TARGET_DESC
30#include "SparcGenRegisterInfo.inc"
34 cl::desc(
"Reserve application registers (%g2-%g4)"));
90 if (!Subtarget.isV9()) {
91 for (
unsigned n = 0; n != 16; ++n) {
98 for (
unsigned n = 0; n < 31; n++)
106 unsigned Kind)
const {
108 return Subtarget.
is64Bit() ? &SP::I64RegsRegClass : &SP::IntRegsRegClass;
118 MI.getOperand(FIOperandNum).ChangeToRegister(
FramePtr,
false);
119 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(
Offset);
132 BuildMI(*
MI.getParent(), II, dl,
TII.get(SP::SETHIi), SP::G1)
140 MI.getOperand(FIOperandNum).ChangeToRegister(SP::G1,
false);
141 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(
LO10(
Offset));
150 BuildMI(*
MI.getParent(), II, dl,
TII.get(SP::SETHIi), SP::G1)
152 BuildMI(*
MI.getParent(), II, dl,
TII.get(SP::XORri), SP::G1)
158 MI.getOperand(FIOperandNum).ChangeToRegister(SP::G1,
false);
159 MI.getOperand(FIOperandNum + 1).ChangeToImmediate(0);
165 int SPAdj,
unsigned FIOperandNum,
167 assert(SPAdj == 0 &&
"Unexpected");
171 int FrameIndex =
MI.getOperand(FIOperandNum).getIndex();
178 Offset = TFI->getFrameIndexReference(MF, FrameIndex, FrameReg).getFixed();
180 Offset +=
MI.getOperand(FIOperandNum + 1).getImm();
182 if (!Subtarget.isV9() || !Subtarget.hasHardQuad()) {
183 if (
MI.getOpcode() == SP::STQFri) {
186 Register SrcEvenReg = getSubReg(SrcReg, SP::sub_even64);
187 Register SrcOddReg = getSubReg(SrcReg, SP::sub_odd64);
192 MI.setDesc(
TII.get(SP::STDFri));
193 MI.getOperand(2).setReg(SrcOddReg);
195 }
else if (
MI.getOpcode() == SP::LDQFri) {
198 Register DestEvenReg = getSubReg(DestReg, SP::sub_even64);
199 Register DestOddReg = getSubReg(DestReg, SP::sub_odd64);
201 BuildMI(*
MI.getParent(), II, dl,
TII.get(SP::LDDFri), DestEvenReg)
205 MI.setDesc(
TII.get(SP::LDDFri));
206 MI.getOperand(0).setReg(DestOddReg);
234 if (getFrameLowering(MF)->hasReservedCallFrame(MF))
This file implements the BitVector class.
const HexagonInstrInfo * TII
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static void replaceFI(MachineFunction &MF, MachineBasicBlock::iterator II, MachineInstr &MI, const DebugLoc &dl, unsigned FIOperandNum, int Offset, unsigned FramePtr)
static cl::opt< bool > ReserveAppRegisters("sparc-reserve-app-registers", cl::Hidden, cl::init(false), cl::desc("Reserve application registers (%g2-%g4)"))
static const unsigned FramePtr
MCRegAliasIterator enumerates all registers aliasing Reg.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
Representation of each machine instruction.
Wrapper class representing virtual and physical registers.
const SparcInstrInfo * getInstrInfo() const override
TargetInstrInfo - Interface to description of machine instruction set.
virtual bool canRealignStack(const MachineFunction &MF) const
True if the stack can be realigned for the target.
virtual const TargetInstrInfo * getInstrInfo() const
initializer< Ty > init(const Ty &Val)
This is an optimization pass for GlobalISel generic memory operations.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
static unsigned HI22(int64_t imm)
static unsigned HIX22(int64_t imm)
static unsigned LOX10(int64_t imm)
static unsigned LO10(int64_t imm)
const MCPhysReg * getCalleeSavedRegs(const MachineFunction *MF) const override
Code Generation virtual methods...
bool canRealignStack(const MachineFunction &MF) const override
bool eliminateFrameIndex(MachineBasicBlock::iterator II, int SPAdj, unsigned FIOperandNum, RegScavenger *RS=nullptr) const override
const TargetRegisterClass * getPointerRegClass(const MachineFunction &MF, unsigned Kind) const override
BitVector getReservedRegs(const MachineFunction &MF) const override
const uint32_t * getCallPreservedMask(const MachineFunction &MF, CallingConv::ID CC) const override
Register getFrameRegister(const MachineFunction &MF) const override
const uint32_t * getRTCallPreservedMask(CallingConv::ID CC) const