25 #define GET_INSTRINFO_CTOR_DTOR
26 #include "MSP430GenInstrInfo.inc"
31 void MSP430InstrInfo::anchor() {}
39 unsigned SrcReg,
bool isKill,
int FrameIdx,
43 if (MI != MBB.
end()) DL = MI->getDebugLoc();
53 if (RC == &MSP430::GR16RegClass)
54 BuildMI(MBB, MI, DL,
get(MSP430::MOV16mr))
57 else if (RC == &MSP430::GR8RegClass)
58 BuildMI(MBB, MI, DL,
get(MSP430::MOV8mr))
67 unsigned DestReg,
int FrameIdx,
71 if (MI != MBB.
end()) DL = MI->getDebugLoc();
81 if (RC == &MSP430::GR16RegClass)
82 BuildMI(MBB, MI, DL,
get(MSP430::MOV16rm))
84 else if (RC == &MSP430::GR8RegClass)
85 BuildMI(MBB, MI, DL,
get(MSP430::MOV8rm))
93 unsigned DestReg,
unsigned SrcReg,
96 if (MSP430::GR16RegClass.contains(DestReg, SrcReg))
97 Opc = MSP430::MOV16rr;
98 else if (MSP430::GR8RegClass.contains(DestReg, SrcReg))
103 BuildMI(MBB, I, DL,
get(Opc), DestReg)
111 while (I != MBB.
begin()) {
113 if (I->isDebugValue())
115 if (I->getOpcode() != MSP430::JMP &&
116 I->getOpcode() != MSP430::JCC &&
117 I->getOpcode() != MSP430::Br &&
118 I->getOpcode() != MSP430::Bm)
121 I->eraseFromParent();
131 assert(Cond.
size() == 1 &&
"Invalid Xbranch condition!");
169 return !isPredicated(MI);
176 bool AllowModify)
const {
180 while (I != MBB.
begin()) {
182 if (I->isDebugValue())
196 if (I->getOpcode() == MSP430::Br ||
197 I->getOpcode() == MSP430::Bm)
201 if (I->getOpcode() == MSP430::JMP) {
203 TBB = I->getOperand(0).getMBB();
222 TBB = I->getOperand(0).getMBB();
227 assert(I->getOpcode() == MSP430::JCC &&
"Invalid conditional branch");
236 TBB = I->getOperand(0).getMBB();
243 assert(Cond.
size() == 1);
248 if (TBB != I->getOperand(0).getMBB())
253 if (OldBranchCode == BranchCode)
268 assert(TBB &&
"InsertBranch must not be told to insert a fallthrough");
269 assert((Cond.
size() == 1 || Cond.
size() == 0) &&
270 "MSP430 branch conditions have one component!");
274 assert(!FBB &&
"Unconditional branch with multiple successors!");
318 case MSP430::SAR8r1c:
319 case MSP430::SAR16r1c:
void push_back(const T &Elt)
The memory access reads data.
const MachineFunction * getParent() const
The memory access writes data.
bool isBranch(QueryType Type=AnyInBundle) const
virtual void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, unsigned SrcReg, bool isKill, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI) const
bool isUnpredicatedTerminator(const MachineInstr *MI) const
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, unsigned f, uint64_t s, unsigned base_alignment, const MDNode *TBAAInfo=0, const MDNode *Ranges=0)
unsigned RemoveBranch(MachineBasicBlock &MBB) const
bool isPredicable(QueryType Type=AllInBundle) const
MSP430InstrInfo(MSP430TargetMachine &TM)
const MCInstrDesc & getDesc() const
const char * getSymbolName() const
bool isTerminator(QueryType Type=AnyInBundle) const
static MachinePointerInfo getFixedStack(int FI, int64_t offset=0)
const HexagonInstrInfo * TII
const MCAsmInfo * getMCAsmInfo() const
#define llvm_unreachable(msg)
Abstract Stack Frame Information.
const MachineInstrBuilder & addImm(int64_t Val) const
bool LLVM_ATTRIBUTE_UNUSED_RESULT empty() const
bool ReverseBranchCondition(SmallVectorImpl< MachineOperand > &Cond) const
unsigned getKillRegState(bool B)
virtual void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, unsigned DestReg, int FrameIdx, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI) const
const MachineBasicBlock * getParent() const
bundle_iterator< MachineInstr, instr_iterator > iterator
unsigned GetInstSizeInBytes(const MachineInstr *MI) const
void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, DebugLoc DL, unsigned DestReg, unsigned SrcReg, bool KillSrc) const
const MachineOperand & getOperand(unsigned i) const
ItTy next(ItTy it, Dist n)
MachineInstrBuilder BuildMI(MachineFunction &MF, DebugLoc DL, const MCInstrDesc &MCID)
unsigned getOpcode() const
Return the opcode number for this descriptor.
virtual const TargetInstrInfo * getInstrInfo() const
unsigned getObjectAlignment(int ObjectIdx) const
getObjectAlignment - Return the alignment of the specified stack object.
MachineFrameInfo * getFrameInfo()
const MachineInstrBuilder & addFrameIndex(int Idx) const
virtual unsigned getInlineAsmLength(const char *Str, const MCAsmInfo &MAI) const
IMPLICIT_DEF - This is the MachineInstr-level equivalent of undef.
DBG_VALUE - a mapping of the llvm.dbg.value intrinsic.
const MachineInstrBuilder & addMemOperand(MachineMemOperand *MMO) const
static MachineOperand CreateImm(int64_t Val)
const TargetMachine & getTarget() const
bool AnalyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify) const
unsigned InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, const SmallVectorImpl< MachineOperand > &Cond, DebugLoc DL) const
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned char TargetFlags=0) const
bool isLayoutSuccessor(const MachineBasicBlock *MBB) const
const MachineInstrBuilder & addReg(unsigned RegNo, unsigned flags=0, unsigned SubReg=0) const
int64_t getObjectSize(int ObjectIdx) const
bool isBarrier(QueryType Type=AnyInBundle) const