27 #define GET_INSTRINFO_CTOR_DTOR
28 #include "SparcGenInstrInfo.inc"
34 void SparcInstrInfo::anchor() {}
38 RI(ST), Subtarget(ST) {
129 bool AllowModify)
const
134 while (I != MBB.
begin()) {
137 if (I->isDebugValue())
141 if (!isUnpredicatedTerminator(I))
149 if (I->getOpcode() == SP::BA) {
153 TBB = I->getOperand(0).getMBB();
167 UnCondBrIter = MBB.
end();
171 TBB = I->getOperand(0).getMBB();
175 unsigned Opcode = I->getOpcode();
176 if (Opcode != SP::BCOND && Opcode != SP::FBCOND)
183 if (AllowModify && UnCondBrIter != MBB.
end() &&
204 .
addMBB(UnCondBrIter->getOperand(0).getMBB()).addImm(BranchCode);
209 UnCondBrIter->eraseFromParent();
211 UnCondBrIter = MBB.
end();
216 TBB = I->getOperand(0).getMBB();
232 assert(TBB &&
"InsertBranch must not be told to insert a fallthrough");
233 assert((Cond.
size() == 1 || Cond.
size() == 0) &&
234 "Sparc branch conditions should have one component!");
237 assert(!FBB &&
"Unconditional branch with multiple successors!");
243 unsigned CC = Cond[0].getImm();
260 while (I != MBB.
begin()) {
263 if (I->isDebugValue())
266 if (I->getOpcode() != SP::BA
267 && I->getOpcode() != SP::BCOND
268 && I->getOpcode() != SP::FBCOND)
271 I->eraseFromParent();
280 unsigned DestReg,
unsigned SrcReg,
281 bool KillSrc)
const {
282 unsigned numSubRegs = 0;
284 const unsigned *subRegIdx = 0;
286 const unsigned DFP_FP_SubRegsIdx[] = { SP::sub_even, SP::sub_odd };
287 const unsigned QFP_DFP_SubRegsIdx[] = { SP::sub_even64, SP::sub_odd64 };
288 const unsigned QFP_FP_SubRegsIdx[] = { SP::sub_even, SP::sub_odd,
289 SP::sub_odd64_then_sub_even,
290 SP::sub_odd64_then_sub_odd };
292 if (SP::IntRegsRegClass.contains(DestReg, SrcReg))
295 else if (SP::FPRegsRegClass.contains(DestReg, SrcReg))
296 BuildMI(MBB, I, DL,
get(SP::FMOVS), DestReg)
298 else if (SP::DFPRegsRegClass.contains(DestReg, SrcReg)) {
299 if (Subtarget.
isV9()) {
300 BuildMI(MBB, I, DL,
get(SP::FMOVD), DestReg)
304 subRegIdx = DFP_FP_SubRegsIdx;
308 }
else if (SP::QFPRegsRegClass.contains(DestReg, SrcReg)) {
309 if (Subtarget.
isV9()) {
311 BuildMI(MBB, I, DL,
get(SP::FMOVQ), DestReg)
315 subRegIdx = QFP_DFP_SubRegsIdx;
321 subRegIdx = QFP_FP_SubRegsIdx;
328 if (numSubRegs == 0 || subRegIdx == 0 || movOpc == 0)
334 for (
unsigned i = 0; i != numSubRegs; ++i) {
335 unsigned Dst = TRI->
getSubReg(DestReg, subRegIdx[i]);
336 unsigned Src = TRI->
getSubReg(SrcReg, subRegIdx[i]);
337 assert(Dst && Src &&
"Bad sub-register");
349 unsigned SrcReg,
bool isKill,
int FI,
353 if (I != MBB.
end()) DL = I->getDebugLoc();
364 if (RC == &SP::I64RegsRegClass)
367 else if (RC == &SP::IntRegsRegClass)
370 else if (RC == &SP::FPRegsRegClass)
373 else if (SP::DFPRegsRegClass.hasSubClassEq(RC))
376 else if (SP::QFPRegsRegClass.hasSubClassEq(RC))
387 unsigned DestReg,
int FI,
391 if (I != MBB.
end()) DL = I->getDebugLoc();
401 if (RC == &SP::I64RegsRegClass)
404 else if (RC == &SP::IntRegsRegClass)
407 else if (RC == &SP::FPRegsRegClass)
410 else if (SP::DFPRegsRegClass.hasSubClassEq(RC))
413 else if (SP::QFPRegsRegClass.hasSubClassEq(RC))
426 if (GlobalBaseReg != 0)
439 BuildMI(FirstMBB, MBBI, dl,
get(SP::GETPCX), GlobalBaseReg);
void push_back(const T &Elt)
The memory access reads data.
const MachineFunction * getParent() const
The memory access writes data.
unsigned getGlobalBaseReg(MachineFunction *MF) const
virtual void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, DebugLoc DL, unsigned DestReg, unsigned SrcReg, bool KillSrc) const
unsigned createVirtualRegister(const TargetRegisterClass *RegClass)
virtual void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, unsigned DestReg, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI) const
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, unsigned f, uint64_t s, unsigned base_alignment, const MDNode *TBAAInfo=0, const MDNode *Ranges=0)
virtual const SparcRegisterInfo & getRegisterInfo() const
virtual unsigned RemoveBranch(MachineBasicBlock &MBB) const
static MachinePointerInfo getFixedStack(int FI, int64_t offset=0)
virtual bool AnalyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify=false) const
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
#define llvm_unreachable(msg)
Abstract Stack Frame Information.
const MachineInstrBuilder & addImm(int64_t Val) const
static bool IsIntegerCC(unsigned CC)
const MachineBasicBlock & front() const
bool isFI() const
isFI - Tests if this is a MO_FrameIndex operand.
bool LLVM_ATTRIBUTE_UNUSED_RESULT empty() const
virtual void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, unsigned SrcReg, bool isKill, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI) const
unsigned getKillRegState(bool B)
bundle_iterator< MachineInstr, instr_iterator > iterator
const MachineOperand & getOperand(unsigned i) const
unsigned getSubReg(unsigned Reg, unsigned Idx) const
Returns the physical register number of sub-register "Index" for physical register RegNo...
virtual unsigned isStoreToStackSlot(const MachineInstr *MI, int &FrameIndex) const
ItTy next(ItTy it, Dist n)
virtual unsigned isLoadFromStackSlot(const MachineInstr *MI, int &FrameIndex) const
MachineInstrBuilder BuildMI(MachineFunction &MF, DebugLoc DL, const MCInstrDesc &MCID)
DebugLoc findDebugLoc(instr_iterator MBBI)
unsigned getObjectAlignment(int ObjectIdx) const
getObjectAlignment - Return the alignment of the specified stack object.
void setGlobalBaseReg(unsigned Reg)
MachineFrameInfo * getFrameInfo()
const MachineInstrBuilder & addFrameIndex(int Idx) const
unsigned getGlobalBaseReg() const
static SPCC::CondCodes GetOppositeBranchCondition(SPCC::CondCodes CC)
MachineRegisterInfo & getRegInfo()
SparcInstrInfo(SparcSubtarget &ST)
const MachineInstrBuilder & addMemOperand(MachineMemOperand *MMO) const
static MachineOperand CreateImm(int64_t Val)
unsigned getReg() const
getReg - Returns the register number.
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned char TargetFlags=0) const
virtual unsigned InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, const SmallVectorImpl< MachineOperand > &Cond, DebugLoc DL) const
void addRegisterDefined(unsigned Reg, const TargetRegisterInfo *RegInfo=0)
bool addRegisterKilled(unsigned IncomingReg, const TargetRegisterInfo *RegInfo, bool AddIfNotFound=false)
bool isLayoutSuccessor(const MachineBasicBlock *MBB) const
const MachineInstrBuilder & addReg(unsigned RegNo, unsigned flags=0, unsigned SubReg=0) const
int64_t getObjectSize(int ObjectIdx) const