14 #ifndef ARMBASEINSTRUCTIONINFO_H
15 #define ARMBASEINSTRUCTIONINFO_H
23 #define GET_INSTRINFO_HEADER
24 #include "ARMGenInstrInfo.inc"
28 class ARMBaseRegisterInfo;
64 bool AllowModify =
false)
const;
92 std::vector<MachineOperand> &Pred)
const;
111 unsigned DestReg,
unsigned SrcReg,
130 unsigned DestReg,
unsigned SubIdx,
139 unsigned SubIdx,
unsigned State,
152 int64_t &Offset1, int64_t &Offset2)
const;
163 int64_t Offset1, int64_t Offset2,
164 unsigned NumLoads)
const;
171 unsigned NumCycles,
unsigned ExtraPredCycles,
175 unsigned NumT,
unsigned ExtraT,
177 unsigned NumF,
unsigned ExtraF,
183 &Probability)
const {
184 return NumCycles == 1;
195 unsigned &SrcReg2,
int &CmpMask,
196 int &CmpValue)
const;
203 unsigned SrcReg2,
int CmpMask,
int CmpValue,
208 unsigned &TrueOp,
unsigned &FalseOp,
209 bool &Optimizable)
const;
227 SDNode *DefNode,
unsigned DefIdx,
228 SDNode *UseNode,
unsigned UseIdx)
const;
231 std::pair<uint16_t, uint16_t>
248 unsigned DefIdx,
unsigned DefAlign)
const;
252 unsigned DefIdx,
unsigned DefAlign)
const;
256 unsigned UseIdx,
unsigned UseAlign)
const;
260 unsigned UseIdx,
unsigned UseAlign)
const;
263 unsigned DefIdx,
unsigned DefAlign,
265 unsigned UseIdx,
unsigned UseAlign)
const;
271 unsigned *PredCost = 0)
const;
301 return MLxEntryMap.
count(Opcode);
308 unsigned &AddSubOpc,
bool &NegAcc,
309 bool &HasLane)
const;
315 return MLxHazardOpcodes.
count(Opcode);
335 bool isDead =
false) {
346 return Opc == ARM::B || Opc == ARM::tB || Opc == ARM::t2B;
351 return Opc == ARM::Bcc || Opc == ARM::tBcc || Opc == ARM::t2Bcc;
356 return Opc == ARM::BR_JTr || Opc == ARM::BR_JTm || Opc == ARM::BR_JTadd ||
357 Opc == ARM::tBR_JTr || Opc == ARM::t2BR_JT;
362 return Opc == ARM::BX || Opc == ARM::MOVPCRX || Opc == ARM::tBRIND;
366 return Opc == ARM::tPOP_RET || Opc == ARM::LDMIA_RET ||
367 Opc == ARM::t2LDMIA_RET || Opc == ARM::tPOP || Opc == ARM::LDMIA_UPD ||
368 Opc == ARM::t2LDMIA_UPD || Opc == ARM::VLDMDIA_UPD;
372 return Opc == ARM::tPUSH || Opc == ARM::t2STMDB_UPD ||
373 Opc == ARM::STMDB_UPD || Opc == ARM::VSTMDDB_UPD;
387 const MachineRegisterInfo &
MRI);
399 unsigned DestReg,
unsigned BaseReg,
int NumBytes,
401 const ARMBaseInstrInfo &
TII,
unsigned MIFlags = 0);
405 unsigned DestReg,
unsigned BaseReg,
int NumBytes,
407 const ARMBaseInstrInfo &
TII,
unsigned MIFlags = 0);
410 unsigned DestReg,
unsigned BaseReg,
411 int NumBytes,
const TargetInstrInfo &
TII,
412 const ARMBaseRegisterInfo&
MRI,
413 unsigned MIFlags = 0);
428 unsigned FrameReg,
int &Offset,
429 const ARMBaseInstrInfo &
TII);
432 unsigned FrameReg,
int &Offset,
433 const ARMBaseInstrInfo &
TII);
virtual void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, unsigned SrcReg, bool isKill, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI) const
ARMCC::CondCodes getPredicate(const MachineInstr *MI) const
virtual bool SubsumesPredicate(const SmallVectorImpl< MachineOperand > &Pred1, const SmallVectorImpl< MachineOperand > &Pred2) const
virtual unsigned isStoreToStackSlotPostFE(const MachineInstr *MI, int &FrameIndex) const
virtual unsigned getNumMicroOps(const InstrItineraryData *ItinData, const MachineInstr *MI) const
virtual bool isSchedulingBoundary(const MachineInstr *MI, const MachineBasicBlock *MBB, const MachineFunction &MF) const
ScheduleHazardRecognizer * CreateTargetHazardRecognizer(const TargetMachine *TM, const ScheduleDAG *DAG) const
virtual bool shouldScheduleLoadsNear(SDNode *Load1, SDNode *Load2, int64_t Offset1, int64_t Offset2, unsigned NumLoads) const
void emitT2RegPlusImmediate(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI, DebugLoc dl, unsigned DestReg, unsigned BaseReg, int NumBytes, ARMCC::CondCodes Pred, unsigned PredReg, const ARMBaseInstrInfo &TII, unsigned MIFlags=0)
virtual bool AnalyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify=false) const
virtual bool isProfitableToDupForIfCvt(MachineBasicBlock &MBB, unsigned NumCycles, const BranchProbability &Probability) const
virtual unsigned isLoadFromStackSlotPostFE(const MachineInstr *MI, int &FrameIndex) const
virtual unsigned GetInstSizeInBytes(const MachineInstr *MI) const
virtual void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, unsigned DestReg, unsigned SubIdx, const MachineInstr *Orig, const TargetRegisterInfo &TRI) const
virtual bool optimizeCompareInstr(MachineInstr *CmpInstr, unsigned SrcReg, unsigned SrcReg2, int CmpMask, int CmpValue, const MachineRegisterInfo *MRI) const
static const MachineInstrBuilder & AddNoT1CC(const MachineInstrBuilder &MIB)
virtual void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, DebugLoc DL, unsigned DestReg, unsigned SrcReg, bool KillSrc) const
static const MachineInstrBuilder & AddDefaultPred(const MachineInstrBuilder &MIB)
const HexagonInstrInfo * TII
virtual MachineInstr * optimizeSelect(MachineInstr *MI, bool) const
bool rewriteARMFrameIndex(MachineInstr &MI, unsigned FrameRegIdx, unsigned FrameReg, int &Offset, const ARMBaseInstrInfo &TII)
unsigned getPartialRegUpdateClearance(const MachineInstr *, unsigned, const TargetRegisterInfo *) const
bool tryFoldSPUpdateIntoPushPop(MachineFunction &MF, MachineInstr *MI, unsigned NumBytes)
bool rewriteT2FrameIndex(MachineInstr &MI, unsigned FrameRegIdx, unsigned FrameReg, int &Offset, const ARMBaseInstrInfo &TII)
bool isPredicated(const MachineInstr *MI) const
const MachineInstrBuilder & addImm(int64_t Val) const
bool isFpMLxInstruction(unsigned Opcode) const
bool canCauseFpMLxStall(unsigned Opcode) const
virtual bool produceSameValue(const MachineInstr *MI0, const MachineInstr *MI1, const MachineRegisterInfo *MRI) const
virtual unsigned RemoveBranch(MachineBasicBlock &MBB) const
static bool isCondBranchOpcode(int Opc)
unsigned getDeadRegState(bool B)
unsigned getDefRegState(bool B)
bundle_iterator< MachineInstr, instr_iterator > iterator
virtual MachineInstr * convertToThreeAddress(MachineFunction::iterator &MFI, MachineBasicBlock::iterator &MBBI, LiveVariables *LV) const
virtual unsigned isStoreToStackSlot(const MachineInstr *MI, int &FrameIndex) const
std::pair< uint16_t, uint16_t > getExecutionDomain(const MachineInstr *MI) const
VFP/NEON execution domains.
MachineInstr * duplicate(MachineInstr *Orig, MachineFunction &MF) const
ScheduleHazardRecognizer * CreateTargetPostRAHazardRecognizer(const InstrItineraryData *II, const ScheduleDAG *DAG) const
ARMCC::CondCodes getInstrPredicate(const MachineInstr *MI, unsigned &PredReg)
MachineInstr * commuteInstruction(MachineInstr *, bool=false) const
commuteInstruction - Handle commutable instructions.
virtual bool areLoadsFromSameBasePtr(SDNode *Load1, SDNode *Load2, int64_t &Offset1, int64_t &Offset2) const
virtual bool analyzeCompare(const MachineInstr *MI, unsigned &SrcReg, unsigned &SrcReg2, int &CmpMask, int &CmpValue) const
const MachineOperand & getOperand(unsigned i) const
static bool isJumpTableBranchOpcode(int Opc)
void emitThumbRegPlusImmediate(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI, DebugLoc dl, unsigned DestReg, unsigned BaseReg, int NumBytes, const TargetInstrInfo &TII, const ARMBaseRegisterInfo &MRI, unsigned MIFlags=0)
virtual bool isProfitableToUnpredicate(MachineBasicBlock &TMBB, MachineBasicBlock &FMBB) const
unsigned convertAddSubFlagsOpcode(unsigned OldOpc)
bool count(const KeyT &Val) const
count - Return true if the specified key is in the map.
void emitARMRegPlusImmediate(MachineBasicBlock &MBB, MachineBasicBlock::iterator &MBBI, DebugLoc dl, unsigned DestReg, unsigned BaseReg, int NumBytes, ARMCC::CondCodes Pred, unsigned PredReg, const ARMBaseInstrInfo &TII, unsigned MIFlags=0)
static const MachineInstrBuilder & AddDefaultCC(const MachineInstrBuilder &MIB)
static bool isIndirectBranchOpcode(int Opc)
virtual bool expandPostRAPseudo(MachineBasicBlock::iterator MI) const
virtual bool isProfitableToIfCvt(MachineBasicBlock &MBB, unsigned NumCycles, unsigned ExtraPredCycles, const BranchProbability &Probability) const
static bool isUncondBranchOpcode(int Opc)
virtual unsigned getUnindexedOpcode(unsigned Opc) const =0
virtual bool PredicateInstruction(MachineInstr *MI, const SmallVectorImpl< MachineOperand > &Pred) const
virtual void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, unsigned DestReg, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI) const
virtual unsigned InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, const SmallVectorImpl< MachineOperand > &Cond, DebugLoc DL) const
bool isSwiftFastImmShift(const MachineInstr *MI) const
static bool isPushOpcode(int Opc)
virtual bool analyzeSelect(const MachineInstr *MI, SmallVectorImpl< MachineOperand > &Cond, unsigned &TrueOp, unsigned &FalseOp, bool &Optimizable) const
virtual bool ReverseBranchCondition(SmallVectorImpl< MachineOperand > &Cond) const
int getMatchingCondBranchOpcode(int Opc)
int findFirstPredOperandIdx() const
unsigned canFoldARMInstrIntoMOVCC(unsigned Reg, MachineInstr *&MI, const MachineRegisterInfo &MRI)
ARMBaseInstrInfo(const ARMSubtarget &STI)
bool count(const T &V) const
count - Return true if the element is in the set.
static bool isPopOpcode(int Opc)
unsigned getNumLDMAddresses(const MachineInstr *MI) const
Get the number of addresses by LDM or VLDM or zero for unknown.
void setExecutionDomain(MachineInstr *MI, unsigned Domain) const
virtual bool DefinesPredicate(MachineInstr *MI, std::vector< MachineOperand > &Pred) const
void breakPartialRegDependency(MachineBasicBlock::iterator, unsigned, const TargetRegisterInfo *TRI) const
virtual const ARMBaseRegisterInfo & getRegisterInfo() const =0
virtual bool isPredicable(MachineInstr *MI) const
BasicBlockListType::iterator iterator
const ARMSubtarget & getSubtarget() const
virtual unsigned isLoadFromStackSlot(const MachineInstr *MI, int &FrameIndex) const
const MCRegisterInfo & MRI
const MachineInstrBuilder & addReg(unsigned RegNo, unsigned flags=0, unsigned SubReg=0) const
virtual int getOperandLatency(const InstrItineraryData *ItinData, const MachineInstr *DefMI, unsigned DefIdx, const MachineInstr *UseMI, unsigned UseIdx) const
static const MachineInstrBuilder & AddDefaultT1CC(const MachineInstrBuilder &MIB, bool isDead=false)
const MachineInstrBuilder & AddDReg(MachineInstrBuilder &MIB, unsigned Reg, unsigned SubIdx, unsigned State, const TargetRegisterInfo *TRI) const
virtual bool FoldImmediate(MachineInstr *UseMI, MachineInstr *DefMI, unsigned Reg, MachineRegisterInfo *MRI) const