34#define GET_INSTRINFO_CTOR_DTOR
35#include "MipsGenInstrInfo.inc"
38void MipsInstrInfo::anchor() {}
42 Subtarget(STI), UncondBrOpc(UncondBr) {}
52 return op.isImm() &&
op.getImm() == 0;
68 "insertNop does not support MIPS16e mode at this time");
69 const unsigned MMOpc =
93void MipsInstrInfo::AnalyzeCondBr(
const MachineInstr *Inst,
unsigned Opc,
96 assert(getAnalyzableBrOpc(Opc) &&
"Not an analyzable branch");
104 for (
int i = 0; i < NumOp-1; i++)
112 bool AllowModify)
const {
122 unsigned Opc =
Cond[0].getImm();
126 for (
unsigned i = 1; i <
Cond.size(); ++i) {
128 "Cannot copy operand for conditional branch!");
139 int *BytesAdded)
const {
141 assert(
TBB &&
"insertBranch must not be told to insert a fallthrough");
142 assert(!BytesAdded &&
"code size not handled");
150 "# of Mips branch conditions must be <= 3!");
169 int *BytesRemoved)
const {
170 assert(!BytesRemoved &&
"code size not handled");
173 unsigned removed = 0;
177 while (
I != REnd && removed < 2) {
179 if (
I->isDebugInstr()) {
183 if (!getAnalyzableBrOpc(
I->getOpcode()))
186 I->eraseFromParent();
199 "Invalid Mips branch condition!");
211 while (
I != REnd &&
I->isDebugInstr())
214 if (
I == REnd || !isUnpredicatedTerminator(*
I)) {
222 unsigned LastOpc = LastInst->
getOpcode();
226 if (!getAnalyzableBrOpc(LastOpc))
230 unsigned SecondLastOpc = 0;
236 while (
I != REnd &&
I->isDebugInstr())
240 SecondLastInst = &*
I;
241 SecondLastOpc = getAnalyzableBrOpc(SecondLastInst->
getOpcode());
244 if (isUnpredicatedTerminator(*SecondLastInst) && !SecondLastOpc)
249 if (!SecondLastOpc) {
257 AnalyzeCondBr(LastInst, LastOpc,
TBB,
Cond);
263 if (++
I != REnd && isUnpredicatedTerminator(*
I))
266 BranchInstrs.
insert(BranchInstrs.
begin(), SecondLastInst);
286 AnalyzeCondBr(SecondLastInst, SecondLastOpc,
TBB,
Cond);
293 int64_t BrOffset)
const {
298 case Mips::BAL_BR_MM:
303 case Mips::BEQ:
case Mips::BEQ64:
305 case Mips::BGEZ:
case Mips::BGEZ64:
309 case Mips::BGTZ:
case Mips::BGTZ64:
311 case Mips::BLEZ:
case Mips::BLEZ64:
313 case Mips::BLTZ:
case Mips::BLTZ64:
317 case Mips::BNE:
case Mips::BNE64:
319 return isInt<18>(BrOffset);
327 case Mips::BGEZAL_MM:
331 case Mips::BLTZAL_MM:
335 return isInt<17>(BrOffset);
339 return isInt<11>(BrOffset);
341 case Mips::BEQZ16_MM:
342 case Mips::BNEZ16_MM:
343 return isInt<8>(BrOffset);
348 return isInt<28>(BrOffset);
354 case Mips::BEQC:
case Mips::BEQC64:
355 case Mips::BNEC:
case Mips::BNEC64:
356 case Mips::BGEC:
case Mips::BGEC64:
357 case Mips::BGEUC:
case Mips::BGEUC64:
358 case Mips::BGEZC:
case Mips::BGEZC64:
359 case Mips::BGTZC:
case Mips::BGTZC64:
360 case Mips::BLEZC:
case Mips::BLEZC64:
361 case Mips::BLTC:
case Mips::BLTC64:
362 case Mips::BLTUC:
case Mips::BLTUC64:
363 case Mips::BLTZC:
case Mips::BLTZC64:
372 return isInt<18>(BrOffset);
374 case Mips::BEQZC:
case Mips::BEQZC64:
375 case Mips::BNEZC:
case Mips::BNEZC64:
376 return isInt<23>(BrOffset);
379 case Mips::BC16_MMR6:
380 return isInt<11>(BrOffset);
382 case Mips::BEQZC16_MMR6:
383 case Mips::BNEZC16_MMR6:
384 return isInt<8>(BrOffset);
386 case Mips::BALC_MMR6:
388 return isInt<27>(BrOffset);
390 case Mips::BC1EQZC_MMR6:
391 case Mips::BC1NEZC_MMR6:
392 case Mips::BC2EQZC_MMR6:
393 case Mips::BC2NEZC_MMR6:
394 case Mips::BGEZALC_MMR6:
395 case Mips::BEQZALC_MMR6:
396 case Mips::BGTZALC_MMR6:
397 case Mips::BLEZALC_MMR6:
398 case Mips::BLTZALC_MMR6:
399 case Mips::BNEZALC_MMR6:
400 case Mips::BNVC_MMR6:
401 case Mips::BOVC_MMR6:
402 return isInt<17>(BrOffset);
404 case Mips::BEQC_MMR6:
405 case Mips::BNEC_MMR6:
406 case Mips::BGEC_MMR6:
407 case Mips::BGEUC_MMR6:
408 case Mips::BGEZC_MMR6:
409 case Mips::BGTZC_MMR6:
410 case Mips::BLEZC_MMR6:
411 case Mips::BLTC_MMR6:
412 case Mips::BLTUC_MMR6:
413 case Mips::BLTZC_MMR6:
414 return isInt<18>(BrOffset);
416 case Mips::BEQZC_MMR6:
417 case Mips::BNEZC_MMR6:
418 return isInt<23>(BrOffset);
422 return isInt<18>(BrOffset);
423 case Mips::BPOSGE32_MM:
424 case Mips::BPOSGE32C_MMR3:
425 return isInt<17>(BrOffset);
432 return isInt<18>(BrOffset);
445 return isInt<18>(BrOffset);
454 unsigned Opcode =
I->getOpcode();
455 bool canUseShortMicroMipsCTI =
false;
466 canUseShortMicroMipsCTI =
true;
471 case Mips::PseudoReturn:
472 case Mips::PseudoIndirectBranch:
473 canUseShortMicroMipsCTI =
true;
480 (
I->getOperand(0).isReg() &&
481 (
I->getOperand(0).getReg() == Mips::ZERO ||
482 I->getOperand(0).getReg() == Mips::ZERO_64)) &&
483 (
I->getOperand(1).isReg() &&
484 (
I->getOperand(1).getReg() == Mips::ZERO ||
485 I->getOperand(1).getReg() == Mips::ZERO_64)))
496 if (canUseShortMicroMipsCTI)
497 return Mips::BEQZC_MM;
498 else if (
I->getOperand(0).getReg() ==
I->getOperand(1).getReg())
503 if (canUseShortMicroMipsCTI)
504 return Mips::BNEZC_MM;
505 else if (
I->getOperand(0).getReg() ==
I->getOperand(1).getReg())
509 if (
I->getOperand(0).getReg() ==
I->getOperand(1).getReg())
513 if (
I->getOperand(0).getReg() ==
I->getOperand(1).getReg())
523 if (
I->getOperand(0).getReg() ==
I->getOperand(1).getReg())
527 if (
I->getOperand(0).getReg() ==
I->getOperand(1).getReg())
533 if (
I->getOperand(0).getReg() ==
I->getOperand(1).getReg())
537 if (
I->getOperand(0).getReg() ==
I->getOperand(1).getReg())
541 return Mips::BGTZC64;
543 return Mips::BGEZC64;
545 return Mips::BLTZC64;
547 return Mips::BLEZC64;
551 case Mips::PseudoIndirectBranchR6:
552 case Mips::PseudoReturn:
553 case Mips::TAILCALLR6REG:
554 if (canUseShortMicroMipsCTI)
555 return Mips::JRC16_MM;
557 case Mips::JALRPseudo:
560 case Mips::PseudoIndirectBranch64R6:
561 case Mips::PseudoReturn64:
562 case Mips::TAILCALL64R6REG:
564 case Mips::JALR64Pseudo:
565 return Mips::JIALC64;
578 if (
MI.isInlineAsm())
622 return Op.isReg() && MIInSlot.readsRegister(Op.getReg(), nullptr);
633 switch (
MI.getOpcode()) {
652 switch (
MI.getOpcode()) {
668 switch (
MI.getOpcode()) {
670 return MI.getDesc().getSize();
671 case TargetOpcode::INLINEASM:
672 case TargetOpcode::INLINEASM_BR: {
674 const char *AsmStr =
MI.getOperand(0).getSymbolName();
677 case Mips::CONSTPOOL_ENTRY:
680 return MI.getOperand(2).getImm();
698 int ZeroOperandPosition = -1;
699 bool BranchWithZeroOperand =
false;
700 if (
I->isBranch() && !
I->isPseudo()) {
701 auto TRI =
I->getParent()->getParent()->getSubtarget().getRegisterInfo();
702 ZeroOperandPosition =
I->findRegisterUseOperandIdx(Mips::ZERO,
TRI,
false);
703 BranchWithZeroOperand = ZeroOperandPosition != -1;
706 if (BranchWithZeroOperand) {
709 NewOpc = Mips::BEQZC;
712 NewOpc = Mips::BNEZC;
715 NewOpc = Mips::BGEZC;
718 NewOpc = Mips::BLTZC;
721 NewOpc = Mips::BEQZC64;
724 NewOpc = Mips::BNEZC64;
729 MIB =
BuildMI(*
I->getParent(),
I,
I->getDebugLoc(),
get(NewOpc));
735 if (NewOpc == Mips::JIC || NewOpc == Mips::JIALC || NewOpc == Mips::JIC64 ||
736 NewOpc == Mips::JIALC64) {
738 if (NewOpc == Mips::JIALC || NewOpc == Mips::JIALC64)
741 for (
unsigned J = 0, E =
I->getDesc().getNumOperands(); J < E; ++J) {
742 MIB.
add(
I->getOperand(J));
749 for (
unsigned J =
I->getDesc().getNumOperands(), E =
I->getNumOperands();
758 for (
unsigned J = 0, E =
I->getDesc().getNumOperands(); J < E; ++J) {
759 if (BranchWithZeroOperand && (
unsigned)ZeroOperandPosition == J)
762 MIB.
add(
I->getOperand(J));
773 unsigned &SrcOpIdx2)
const {
775 "TargetInstrInfo::findCommutedOpIndices() can't handle bundles");
781 switch (
MI.getOpcode()) {
782 case Mips::DPADD_U_H:
783 case Mips::DPADD_U_W:
784 case Mips::DPADD_U_D:
785 case Mips::DPADD_S_H:
786 case Mips::DPADD_S_W:
787 case Mips::DPADD_S_D:
789 if (!fixCommutedOpIndices(SrcOpIdx1, SrcOpIdx2, 2, 3))
792 if (!
MI.getOperand(SrcOpIdx1).isReg() || !
MI.getOperand(SrcOpIdx2).isReg())
814 const int64_t PosLow,
const int64_t PosHigh,
815 const int64_t SizeLow,
816 const int64_t SizeHigh,
817 const int64_t BothLow,
818 const int64_t BothHigh) {
820 if (!MOPos.
isImm()) {
821 ErrInfo =
"Position is not an immediate!";
824 int64_t Pos = MOPos.
getImm();
825 if (!((PosLow <= Pos) && (Pos < PosHigh))) {
826 ErrInfo =
"Position operand is out of range!";
831 if (!MOSize.
isImm()) {
832 ErrInfo =
"Size operand is not an immediate!";
836 if (!((SizeLow <
Size) && (
Size <= SizeHigh))) {
837 ErrInfo =
"Size operand is out of range!";
841 if (!((BothLow < (Pos +
Size)) && ((Pos +
Size) <= BothHigh))) {
842 ErrInfo =
"Position + Size is out of range!";
853 switch (
MI.getOpcode()) {
879 case Mips::TAILCALLREG:
880 case Mips::PseudoIndirectBranch:
885 case Mips::JALRPseudo:
889 ErrInfo =
"invalid instruction when using jump guards!";
898std::pair<unsigned, unsigned>
900 return std::make_pair(TF, 0u);
905 using namespace MipsII;
907 static const std::pair<unsigned, const char*> Flags[] = {
908 {MO_GOT,
"mips-got"},
909 {MO_GOT_CALL,
"mips-got-call"},
910 {MO_GPREL,
"mips-gprel"},
911 {MO_ABS_HI,
"mips-abs-hi"},
912 {MO_ABS_LO,
"mips-abs-lo"},
913 {MO_TLSGD,
"mips-tlsgd"},
914 {MO_TLSLDM,
"mips-tlsldm"},
915 {MO_DTPREL_HI,
"mips-dtprel-hi"},
916 {MO_DTPREL_LO,
"mips-dtprel-lo"},
917 {MO_GOTTPREL,
"mips-gottprel"},
918 {MO_TPREL_HI,
"mips-tprel-hi"},
919 {MO_TPREL_LO,
"mips-tprel-lo"},
920 {MO_GPOFF_HI,
"mips-gpoff-hi"},
921 {MO_GPOFF_LO,
"mips-gpoff-lo"},
922 {MO_GOT_DISP,
"mips-got-disp"},
923 {MO_GOT_PAGE,
"mips-got-page"},
924 {MO_GOT_OFST,
"mips-got-ofst"},
925 {MO_HIGHER,
"mips-higher"},
926 {MO_HIGHEST,
"mips-highest"},
927 {MO_GOT_HI16,
"mips-got-hi16"},
928 {MO_GOT_LO16,
"mips-got-lo16"},
929 {MO_CALL_HI16,
"mips-call-hi16"},
930 {MO_CALL_LO16,
"mips-call-lo16"},
931 {MO_JALR,
"mips-jalr"}
936std::optional<ParamLoadedValue>
944 int64_t
Offset = RegImm->Imm;
947 if (SrcReg == Mips::ZERO || SrcReg == Mips::ZERO_64) {
952 }
else if (
auto DestSrc = isCopyInstr(
MI)) {
955 Register DestReg = DestSrc->Destination->getReg();
958 if (
TRI->isSuperRegister(Reg, DestReg) ||
TRI->isSubRegister(Reg, DestReg))
973 switch (
MI.getOpcode()) {
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
SmallVector< uint32_t, 0 > Writes
unsigned const TargetRegisterInfo * TRI
static bool isReg(const MCInst &MI, unsigned OpNo)
static bool verifyInsExtInstruction(const MachineInstr &MI, StringRef &ErrInfo, const int64_t PosLow, const int64_t PosHigh, const int64_t SizeLow, const int64_t SizeHigh, const int64_t BothLow, const int64_t BothHigh)
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static bool isImm(const MachineOperand &MO, MachineRegisterInfo *MRI)
This file defines the SmallVector class.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
static DIExpression * prepend(const DIExpression *Expr, uint8_t Flags, int64_t Offset=0)
Prepend DIExpr with a deref and offset operation and optionally turn it into a stack value or/and an ...
This class represents an Operation in the Expression.
Describe properties that are true of each instruction in the target description file.
bool isCommutable() const
Return true if this may be a 2- or 3-address instruction (of the form "X = op Y, Z,...
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
reverse_iterator rbegin()
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
Align getObjectAlign(int ObjectIdx) const
Return the alignment of the specified stack object.
int64_t getObjectSize(int ObjectIdx) const
Return the size of the specified object.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
MachineMemOperand * getMachineMemOperand(MachinePointerInfo PtrInfo, MachineMemOperand::Flags f, LLT MemTy, Align base_alignment, const AAMDNodes &AAInfo=AAMDNodes(), const MDNode *Ranges=nullptr, SyncScope::ID SSID=SyncScope::System, AtomicOrdering Ordering=AtomicOrdering::NotAtomic, AtomicOrdering FailureOrdering=AtomicOrdering::NotAtomic)
getMachineMemOperand - Allocate a new MachineMemOperand.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
const LLVMTargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
const MachineInstrBuilder & addImm(int64_t Val) const
Add a new immediate operand.
const MachineInstrBuilder & add(const MachineOperand &MO) const
const MachineInstrBuilder & addSym(MCSymbol *Sym, unsigned char TargetFlags=0) const
const MachineInstrBuilder & addReg(Register RegNo, unsigned flags=0, unsigned SubReg=0) const
Add a new virtual register operand.
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned TargetFlags=0) const
const MachineInstrBuilder & cloneMemRefs(const MachineInstr &OtherMI) const
const MachineInstrBuilder & copyImplicitOps(const MachineInstr &OtherMI) const
Copy all the implicit operands from OtherMI onto this one.
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
std::pair< bool, bool > readsWritesVirtualRegister(Register Reg, SmallVectorImpl< unsigned > *Ops=nullptr) const
Return a pair of bools (reads, writes) indicating if this instruction reads or writes Reg.
unsigned getNumExplicitOperands() const
Returns the number of non-implicit operands.
bool isUnconditionalBranch(QueryType Type=AnyInBundle) const
Return true if this is a branch which always transfers control flow to some other block.
iterator_range< mop_iterator > defs()
Returns a range over all explicit operands that are register definitions.
void eraseFromParent()
Unlink 'this' from the containing basic block and delete it.
void removeOperand(unsigned OpNo)
Erase an operand from an instruction, leaving it with one fewer operand than it started with.
const MachineOperand & getOperand(unsigned i) const
bool isIndirectBranch(QueryType Type=AnyInBundle) const
Return true if this is an indirect branch, such as a branch through a register.
A description of a memory reference used in the backend.
Flags
Flags values. These may be or'd together.
MachineOperand class - Representation of each machine instruction operand.
bool isReg() const
isReg - Tests if this is a MO_Register operand.
MachineBasicBlock * getMBB() const
bool isImm() const
isImm - Tests if this is a MO_Immediate operand.
unsigned getTargetFlags() const
static MachineOperand CreateImm(int64_t Val)
Register getReg() const
getReg - Returns the register number.
MCSymbol * getMCSymbol() const
static MachineOperand CreateReg(Register Reg, bool isDef, bool isImp=false, bool isKill=false, bool isDead=false, bool isUndef=false, bool isEarlyClobber=false, unsigned SubReg=0, bool isDebug=false, bool isInternalRead=false, bool isRenamable=false)
unsigned GetZeroReg() const
ArrayRef< std::pair< unsigned, const char * > > getSerializableDirectMachineOperandTargetFlags() const override
bool SafeInForbiddenSlot(const MachineInstr &MI) const
Predicate to determine if an instruction can go in a forbidden slot.
unsigned getInstSizeInBytes(const MachineInstr &MI) const override
Return the number of bytes of code the specified instruction may be.
MachineInstrBuilder insertNop(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, DebugLoc DL) const
Insert an ISA appropriate nop.
bool isBranchOffsetInRange(unsigned BranchOpc, int64_t BrOffset) const override
Determine if the branch target is in range.
bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify) const override
Branch Analysis.
const MipsSubtarget & Subtarget
MipsInstrInfo(const MipsSubtarget &STI, unsigned UncondBrOpc)
MachineMemOperand * GetMemOperand(MachineBasicBlock &MBB, int FI, MachineMemOperand::Flags Flags) const
MachineInstrBuilder genInstrWithNewOpc(unsigned NewOpc, MachineBasicBlock::iterator I) const
Create an instruction which has the same operands and memory operands as MI but has a new opcode.
bool HasForbiddenSlot(const MachineInstr &MI) const
Predicate to determine if an instruction has a forbidden slot.
bool SafeInFPUDelaySlot(const MachineInstr &MIInSlot, const MachineInstr &FPUMI) const
Predicate to determine if an instruction can go in an FPU delay slot.
bool isZeroImm(const MachineOperand &op) const
unsigned getEquivalentCompactForm(const MachineBasicBlock::iterator I) const
Determine the opcode of a non-delay slot form for a branch if one exists.
bool SafeInLoadDelaySlot(const MachineInstr &MIInSlot, const MachineInstr &LoadMI) const
Predicate to determine if an instruction can go in a load delay slot.
bool reverseBranchCondition(SmallVectorImpl< MachineOperand > &Cond) const override
reverseBranchCondition - Return the inverse opcode of the specified Branch instruction.
unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, ArrayRef< MachineOperand > Cond, const DebugLoc &DL, int *BytesAdded=nullptr) const override
std::optional< RegImmPair > isAddImmediate(const MachineInstr &MI, Register Reg) const override
bool HasFPUDelaySlot(const MachineInstr &MI) const
Predicate to determine if an instruction has an FPU delay slot.
bool verifyInstruction(const MachineInstr &MI, StringRef &ErrInfo) const override
Perform target specific instruction verification.
std::pair< unsigned, unsigned > decomposeMachineOperandsTargetFlags(unsigned TF) const override
static const MipsInstrInfo * create(MipsSubtarget &STI)
bool findCommutedOpIndices(const MachineInstr &MI, unsigned &SrcOpIdx1, unsigned &SrcOpIdx2) const override
std::optional< ParamLoadedValue > describeLoadedValue(const MachineInstr &MI, Register Reg) const override
virtual unsigned getOppositeBranchOpc(unsigned Opc) const =0
bool HasLoadDelaySlot(const MachineInstr &MI) const
Predicate to determine if an instruction has a load delay slot.
unsigned removeBranch(MachineBasicBlock &MBB, int *BytesRemoved=nullptr) const override
void insertNoop(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI) const override
Insert nop instruction when hazard condition is found.
bool inMicroMipsMode() const
bool useIndirectJumpsHazard() const
bool inMips16Mode() const
const MipsABIInfo & getABI() const
Wrapper class representing virtual and physical registers.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
iterator insert(iterator I, T &&Elt)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
virtual bool findCommutedOpIndices(const MachineInstr &MI, unsigned &SrcOpIdx1, unsigned &SrcOpIdx2) const
Returns true iff the routine could find two commutable operands in the given machine instruction.
virtual std::optional< ParamLoadedValue > describeLoadedValue(const MachineInstr &MI, Register Reg) const
Produce the expression describing the MI loading a value into the physical register Reg.
const MCAsmInfo * getMCAsmInfo() const
Return target specific asm information.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
virtual const TargetRegisterInfo * getRegisterInfo() const
getRegisterInfo - If register information is available, return it.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ MO_JALR
Helper operand used to generate R_MIPS_JALR.
@ IsCTI
IsCTI - Instruction is a Control Transfer Instruction.
@ HasForbiddenSlot
HasForbiddenSlot - Instruction has a forbidden slot.
This is an optimization pass for GlobalISel generic memory operations.
std::pair< MachineOperand, DIExpression * > ParamLoadedValue
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
const MipsInstrInfo * createMipsSEInstrInfo(const MipsSubtarget &STI)
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
const MipsInstrInfo * createMips16InstrInfo(const MipsSubtarget &STI)
Create MipsInstrInfo objects.
static MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.
Used to describe a register and immediate addition.