14 #ifndef X86INSTRUCTIONINFO_H
15 #define X86INSTRUCTIONINFO_H
22 #define GET_INSTRINFO_HEADER
23 #include "X86GenInstrInfo.inc"
26 class X86RegisterInfo;
27 class X86TargetMachine;
153 unsigned RegOp,
unsigned MemOp,
unsigned Flags);
155 virtual void anchor();
173 unsigned &SrcReg,
unsigned &DstReg,
174 unsigned &SubIdx)
const;
193 unsigned DestReg,
unsigned SubIdx,
206 unsigned LEAOpcode,
bool AllowSP,
207 unsigned &NewSrc,
bool &isKill,
234 bool AllowModify)
const;
242 unsigned,
unsigned,
int&,
int&,
int&)
const;
247 unsigned TrueReg,
unsigned FalseReg)
const;
250 unsigned DestReg,
unsigned SrcReg,
308 unsigned Reg,
bool UnfoldLoad,
bool UnfoldStore,
321 bool UnfoldLoad,
bool UnfoldStore,
322 unsigned *LoadRegIndex = 0)
const;
330 int64_t &Offset1, int64_t &Offset2)
const;
341 int64_t Offset1, int64_t Offset2,
342 unsigned NumLoads)
const;
357 if (!MO.
isReg())
return false;
367 std::pair<uint16_t, uint16_t>
383 unsigned Size,
unsigned Alignment)
const;
398 int &CmpMask,
int &CmpValue)
const;
404 unsigned SrcReg2,
int CmpMask,
int CmpValue,
416 unsigned &FoldAsLoadDefReg,
420 MachineInstr * convertToThreeAddressWithLEA(
unsigned MIOpc,
unsigned GetCondBranchFromCond(CondCode CC)
virtual void getNoopForMachoTarget(MCInst &NopInst) const
getNoopForMachoTarget - Return the noop instruction to use for a noop.
static bool isScale(const MachineOperand &MO)
virtual void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, unsigned SrcReg, bool isKill, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI) const
virtual void storeRegToAddr(MachineFunction &MF, unsigned SrcReg, bool isKill, SmallVectorImpl< MachineOperand > &Addr, const TargetRegisterClass *RC, MachineInstr::mmo_iterator MMOBegin, MachineInstr::mmo_iterator MMOEnd, SmallVectorImpl< MachineInstr * > &NewMIs) const
virtual bool AnalyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify) const
CondCode getCondFromCMovOpc(unsigned Opc)
getCondFromCmovOpc - return condition code of a CMov opcode.
bool isHighLatencyDef(int opc) const
virtual unsigned getOpcodeAfterMemoryUnfold(unsigned Opc, bool UnfoldLoad, bool UnfoldStore, unsigned *LoadRegIndex=0) const
virtual MachineInstr * foldMemoryOperandImpl(MachineFunction &MF, MachineInstr *MI, const SmallVectorImpl< unsigned > &Ops, int FrameIndex) const
virtual bool canInsertSelect(const MachineBasicBlock &, const SmallVectorImpl< MachineOperand > &Cond, unsigned, unsigned, int &, int &, int &) const
virtual const X86RegisterInfo & getRegisterInfo() const
virtual MachineInstr * commuteInstruction(MachineInstr *MI, bool NewMI) const
bool isJTI() const
isJTI - Tests if this is a MO_JumpTableIndex operand.
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
unsigned isLoadFromStackSlot(const MachineInstr *MI, int &FrameIndex) const
bool isReg() const
isReg - Tests if this is a MO_Register operand.
static bool isGlobalStubReference(unsigned char TargetFlag)
virtual bool shouldScheduleAdjacent(MachineInstr *First, MachineInstr *Second) const LLVM_OVERRIDE
std::pair< uint16_t, uint16_t > getExecutionDomain(const MachineInstr *MI) const
static bool isLeaMem(const MachineInstr *MI, unsigned Op)
virtual void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, unsigned DestReg, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI) const
unsigned getNumOperands() const
bool isCPI() const
isCPI - Tests if this is a MO_ConstantPoolIndex operand.
bool isGlobal() const
isGlobal - Tests if this is a MO_GlobalAddress operand.
static bool isGlobalRelativeToPICBase(unsigned char TargetFlag)
bool isFI() const
isFI - Tests if this is a MO_FrameIndex operand.
void breakPartialRegDependency(MachineBasicBlock::iterator MI, unsigned OpNum, const TargetRegisterInfo *TRI) const
unsigned getUndefRegClearance(const MachineInstr *MI, unsigned &OpNum, const TargetRegisterInfo *TRI) const
bool isX86_64ExtendedReg(unsigned RegNo)
CondCode GetOppositeBranchCondition(X86::CondCode CC)
bool hasHighOperandLatency(const InstrItineraryData *ItinData, const MachineRegisterInfo *MRI, const MachineInstr *DefMI, unsigned DefIdx, const MachineInstr *UseMI, unsigned UseIdx) const
virtual bool expandPostRAPseudo(MachineBasicBlock::iterator MI) const
const MachineOperand & getOperand(unsigned i) const
static bool isX86_64ExtendedReg(const MachineOperand &MO)
virtual bool canFoldMemoryOperand(const MachineInstr *, const SmallVectorImpl< unsigned > &) const
unsigned isStoreToStackSlot(const MachineInstr *MI, int &FrameIndex) const
bool classifyLEAReg(MachineInstr *MI, const MachineOperand &Src, unsigned LEAOpcode, bool AllowSP, unsigned &NewSrc, bool &isKill, bool &isUndef, MachineOperand &ImplicitOp) const
virtual unsigned InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, const SmallVectorImpl< MachineOperand > &Cond, DebugLoc DL) const
virtual bool isCoalescableExtInstr(const MachineInstr &MI, unsigned &SrcReg, unsigned &DstReg, unsigned &SubIdx) const
virtual bool areLoadsFromSameBasePtr(SDNode *Load1, SDNode *Load2, int64_t &Offset1, int64_t &Offset2) const
virtual void insertSelect(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, DebugLoc DL, unsigned DstReg, const SmallVectorImpl< MachineOperand > &Cond, unsigned TrueReg, unsigned FalseReg) const
unsigned isStoreToStackSlotPostFE(const MachineInstr *MI, int &FrameIndex) const
unsigned getGlobalBaseReg(MachineFunction *MF) const
virtual void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, DebugLoc DL, unsigned DestReg, unsigned SrcReg, bool KillSrc) const
unsigned isLoadFromStackSlotPostFE(const MachineInstr *MI, int &FrameIndex) const
virtual unsigned RemoveBranch(MachineBasicBlock &MBB) const
virtual bool optimizeCompareInstr(MachineInstr *CmpInstr, unsigned SrcReg, unsigned SrcReg2, int CmpMask, int CmpValue, const MachineRegisterInfo *MRI) const
virtual bool analyzeCompare(const MachineInstr *MI, unsigned &SrcReg, unsigned &SrcReg2, int &CmpMask, int &CmpValue) const
bool isSafeToMoveRegClassDefs(const TargetRegisterClass *RC) const
virtual bool unfoldMemoryOperand(MachineFunction &MF, MachineInstr *MI, unsigned Reg, bool UnfoldLoad, bool UnfoldStore, SmallVectorImpl< MachineInstr * > &NewMIs) const
void setExecutionDomain(MachineInstr *MI, unsigned Domain) const
static bool isMem(const MachineInstr *MI, unsigned Op)
virtual void loadRegFromAddr(MachineFunction &MF, unsigned DestReg, SmallVectorImpl< MachineOperand > &Addr, const TargetRegisterClass *RC, MachineInstr::mmo_iterator MMOBegin, MachineInstr::mmo_iterator MMOEnd, SmallVectorImpl< MachineInstr * > &NewMIs) const
virtual bool isUnpredicatedTerminator(const MachineInstr *MI) const
unsigned getReg() const
getReg - Returns the register number.
bool isReallyTriviallyReMaterializable(const MachineInstr *MI, AliasAnalysis *AA) const
virtual bool shouldScheduleLoadsNear(SDNode *Load1, SDNode *Load2, int64_t Offset1, int64_t Offset2, unsigned NumLoads) const
BasicBlockListType::iterator iterator
virtual MachineInstr * optimizeLoadInstr(MachineInstr *MI, const MachineRegisterInfo *MRI, unsigned &FoldAsLoadDefReg, MachineInstr *&DefMI) const
void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, unsigned DestReg, unsigned SubIdx, const MachineInstr *Orig, const TargetRegisterInfo &TRI) const
const MCRegisterInfo & MRI
virtual MachineInstr * convertToThreeAddress(MachineFunction::iterator &MFI, MachineBasicBlock::iterator &MBBI, LiveVariables *LV) const
virtual bool ReverseBranchCondition(SmallVectorImpl< MachineOperand > &Cond) const
X86InstrInfo(X86TargetMachine &tm)
unsigned getPartialRegUpdateClearance(const MachineInstr *MI, unsigned OpNum, const TargetRegisterInfo *TRI) const