35#define GET_INSTRINFO_CTOR_DTOR
36#include "MipsGenInstrInfo.inc"
39void MipsInstrInfo::anchor() {}
43 Subtarget(STI), UncondBrOpc(UncondBr) {}
53 return op.isImm() &&
op.getImm() == 0;
69 "insertNop does not support MIPS16e mode at this time");
70 const unsigned MMOpc =
94void MipsInstrInfo::AnalyzeCondBr(
const MachineInstr *Inst,
unsigned Opc,
97 assert(getAnalyzableBrOpc(Opc) &&
"Not an analyzable branch");
105 for (
int i = 0; i < NumOp-1; i++)
113 bool AllowModify)
const {
123 unsigned Opc =
Cond[0].getImm();
127 for (
unsigned i = 1; i <
Cond.size(); ++i) {
129 "Cannot copy operand for conditional branch!");
140 int *BytesAdded)
const {
142 assert(
TBB &&
"insertBranch must not be told to insert a fallthrough");
143 assert(!BytesAdded &&
"code size not handled");
151 "# of Mips branch conditions must be <= 3!");
170 int *BytesRemoved)
const {
171 assert(!BytesRemoved &&
"code size not handled");
174 unsigned removed = 0;
178 while (
I != REnd && removed < 2) {
180 if (
I->isDebugInstr()) {
184 if (!getAnalyzableBrOpc(
I->getOpcode()))
187 I->eraseFromParent();
200 "Invalid Mips branch condition!");
212 while (
I != REnd &&
I->isDebugInstr())
215 if (
I == REnd || !isUnpredicatedTerminator(*
I)) {
223 unsigned LastOpc = LastInst->
getOpcode();
227 if (!getAnalyzableBrOpc(LastOpc))
231 unsigned SecondLastOpc = 0;
237 while (
I != REnd &&
I->isDebugInstr())
241 SecondLastInst = &*
I;
242 SecondLastOpc = getAnalyzableBrOpc(SecondLastInst->
getOpcode());
245 if (isUnpredicatedTerminator(*SecondLastInst) && !SecondLastOpc)
250 if (!SecondLastOpc) {
258 AnalyzeCondBr(LastInst, LastOpc,
TBB,
Cond);
264 if (++
I != REnd && isUnpredicatedTerminator(*
I))
267 BranchInstrs.
insert(BranchInstrs.
begin(), SecondLastInst);
287 AnalyzeCondBr(SecondLastInst, SecondLastOpc,
TBB,
Cond);
294 int64_t BrOffset)
const {
299 case Mips::BAL_BR_MM:
304 case Mips::BEQ:
case Mips::BEQ64:
306 case Mips::BGEZ:
case Mips::BGEZ64:
310 case Mips::BGTZ:
case Mips::BGTZ64:
312 case Mips::BLEZ:
case Mips::BLEZ64:
314 case Mips::BLTZ:
case Mips::BLTZ64:
318 case Mips::BNE:
case Mips::BNE64:
320 return isInt<18>(BrOffset);
328 case Mips::BGEZAL_MM:
332 case Mips::BLTZAL_MM:
336 return isInt<17>(BrOffset);
340 return isInt<11>(BrOffset);
342 case Mips::BEQZ16_MM:
343 case Mips::BNEZ16_MM:
344 return isInt<8>(BrOffset);
349 return isInt<28>(BrOffset);
355 case Mips::BEQC:
case Mips::BEQC64:
356 case Mips::BNEC:
case Mips::BNEC64:
357 case Mips::BGEC:
case Mips::BGEC64:
358 case Mips::BGEUC:
case Mips::BGEUC64:
359 case Mips::BGEZC:
case Mips::BGEZC64:
360 case Mips::BGTZC:
case Mips::BGTZC64:
361 case Mips::BLEZC:
case Mips::BLEZC64:
362 case Mips::BLTC:
case Mips::BLTC64:
363 case Mips::BLTUC:
case Mips::BLTUC64:
364 case Mips::BLTZC:
case Mips::BLTZC64:
373 return isInt<18>(BrOffset);
375 case Mips::BEQZC:
case Mips::BEQZC64:
376 case Mips::BNEZC:
case Mips::BNEZC64:
377 return isInt<23>(BrOffset);
380 case Mips::BC16_MMR6:
381 return isInt<11>(BrOffset);
383 case Mips::BEQZC16_MMR6:
384 case Mips::BNEZC16_MMR6:
385 return isInt<8>(BrOffset);
387 case Mips::BALC_MMR6:
389 return isInt<27>(BrOffset);
391 case Mips::BC1EQZC_MMR6:
392 case Mips::BC1NEZC_MMR6:
393 case Mips::BC2EQZC_MMR6:
394 case Mips::BC2NEZC_MMR6:
395 case Mips::BGEZALC_MMR6:
396 case Mips::BEQZALC_MMR6:
397 case Mips::BGTZALC_MMR6:
398 case Mips::BLEZALC_MMR6:
399 case Mips::BLTZALC_MMR6:
400 case Mips::BNEZALC_MMR6:
401 case Mips::BNVC_MMR6:
402 case Mips::BOVC_MMR6:
403 return isInt<17>(BrOffset);
405 case Mips::BEQC_MMR6:
406 case Mips::BNEC_MMR6:
407 case Mips::BGEC_MMR6:
408 case Mips::BGEUC_MMR6:
409 case Mips::BGEZC_MMR6:
410 case Mips::BGTZC_MMR6:
411 case Mips::BLEZC_MMR6:
412 case Mips::BLTC_MMR6:
413 case Mips::BLTUC_MMR6:
414 case Mips::BLTZC_MMR6:
415 return isInt<18>(BrOffset);
417 case Mips::BEQZC_MMR6:
418 case Mips::BNEZC_MMR6:
419 return isInt<23>(BrOffset);
423 return isInt<18>(BrOffset);
424 case Mips::BPOSGE32_MM:
425 case Mips::BPOSGE32C_MMR3:
426 return isInt<17>(BrOffset);
433 return isInt<18>(BrOffset);
446 return isInt<18>(BrOffset);
455 unsigned Opcode =
I->getOpcode();
456 bool canUseShortMicroMipsCTI =
false;
467 canUseShortMicroMipsCTI =
true;
472 case Mips::PseudoReturn:
473 case Mips::PseudoIndirectBranch:
474 canUseShortMicroMipsCTI =
true;
481 (
I->getOperand(0).isReg() &&
482 (
I->getOperand(0).getReg() == Mips::ZERO ||
483 I->getOperand(0).getReg() == Mips::ZERO_64)) &&
484 (
I->getOperand(1).isReg() &&
485 (
I->getOperand(1).getReg() == Mips::ZERO ||
486 I->getOperand(1).getReg() == Mips::ZERO_64)))
497 if (canUseShortMicroMipsCTI)
498 return Mips::BEQZC_MM;
499 else if (
I->getOperand(0).getReg() ==
I->getOperand(1).getReg())
504 if (canUseShortMicroMipsCTI)
505 return Mips::BNEZC_MM;
506 else if (
I->getOperand(0).getReg() ==
I->getOperand(1).getReg())
510 if (
I->getOperand(0).getReg() ==
I->getOperand(1).getReg())
514 if (
I->getOperand(0).getReg() ==
I->getOperand(1).getReg())
524 if (
I->getOperand(0).getReg() ==
I->getOperand(1).getReg())
528 if (
I->getOperand(0).getReg() ==
I->getOperand(1).getReg())
534 if (
I->getOperand(0).getReg() ==
I->getOperand(1).getReg())
538 if (
I->getOperand(0).getReg() ==
I->getOperand(1).getReg())
542 return Mips::BGTZC64;
544 return Mips::BGEZC64;
546 return Mips::BLTZC64;
548 return Mips::BLEZC64;
552 case Mips::PseudoIndirectBranchR6:
553 case Mips::PseudoReturn:
554 case Mips::TAILCALLR6REG:
555 if (canUseShortMicroMipsCTI)
556 return Mips::JRC16_MM;
558 case Mips::JALRPseudo:
561 case Mips::PseudoIndirectBranch64R6:
562 case Mips::PseudoReturn64:
563 case Mips::TAILCALL64R6REG:
565 case Mips::JALR64Pseudo:
566 return Mips::JIALC64;
586 if (
MI.isInlineAsm())
630 return Op.isReg() && MIInSlot.readsRegister(Op.getReg(), nullptr);
648 switch (
MI.getOpcode()) {
667 switch (
MI.getOpcode()) {
683 switch (
MI.getOpcode()) {
685 return MI.getDesc().getSize();
686 case TargetOpcode::INLINEASM:
687 case TargetOpcode::INLINEASM_BR: {
689 const char *AsmStr =
MI.getOperand(0).getSymbolName();
692 case Mips::CONSTPOOL_ENTRY:
695 return MI.getOperand(2).getImm();
713 int ZeroOperandPosition = -1;
714 bool BranchWithZeroOperand =
false;
715 if (
I->isBranch() && !
I->isPseudo()) {
716 auto TRI =
I->getParent()->getParent()->getSubtarget().getRegisterInfo();
717 ZeroOperandPosition =
I->findRegisterUseOperandIdx(Mips::ZERO,
TRI,
false);
718 BranchWithZeroOperand = ZeroOperandPosition != -1;
721 if (BranchWithZeroOperand) {
724 NewOpc = Mips::BEQZC;
727 NewOpc = Mips::BNEZC;
730 NewOpc = Mips::BGEZC;
733 NewOpc = Mips::BLTZC;
736 NewOpc = Mips::BEQZC64;
739 NewOpc = Mips::BNEZC64;
744 MIB =
BuildMI(*
I->getParent(),
I,
I->getDebugLoc(),
get(NewOpc));
750 if (NewOpc == Mips::JIC || NewOpc == Mips::JIALC || NewOpc == Mips::JIC64 ||
751 NewOpc == Mips::JIALC64) {
753 if (NewOpc == Mips::JIALC || NewOpc == Mips::JIALC64)
756 for (
unsigned J = 0, E =
I->getDesc().getNumOperands(); J < E; ++J) {
757 MIB.
add(
I->getOperand(J));
764 for (
unsigned J =
I->getDesc().getNumOperands(), E =
I->getNumOperands();
773 for (
unsigned J = 0, E =
I->getDesc().getNumOperands(); J < E; ++J) {
774 if (BranchWithZeroOperand && (
unsigned)ZeroOperandPosition == J)
777 MIB.
add(
I->getOperand(J));
788 unsigned &SrcOpIdx2)
const {
790 "TargetInstrInfo::findCommutedOpIndices() can't handle bundles");
796 switch (
MI.getOpcode()) {
797 case Mips::DPADD_U_H:
798 case Mips::DPADD_U_W:
799 case Mips::DPADD_U_D:
800 case Mips::DPADD_S_H:
801 case Mips::DPADD_S_W:
802 case Mips::DPADD_S_D:
804 if (!fixCommutedOpIndices(SrcOpIdx1, SrcOpIdx2, 2, 3))
807 if (!
MI.getOperand(SrcOpIdx1).isReg() || !
MI.getOperand(SrcOpIdx2).isReg())
829 const int64_t PosLow,
const int64_t PosHigh,
830 const int64_t SizeLow,
831 const int64_t SizeHigh,
832 const int64_t BothLow,
833 const int64_t BothHigh) {
835 if (!MOPos.
isImm()) {
836 ErrInfo =
"Position is not an immediate!";
839 int64_t Pos = MOPos.
getImm();
840 if (!((PosLow <= Pos) && (Pos < PosHigh))) {
841 ErrInfo =
"Position operand is out of range!";
846 if (!MOSize.
isImm()) {
847 ErrInfo =
"Size operand is not an immediate!";
851 if (!((SizeLow <
Size) && (
Size <= SizeHigh))) {
852 ErrInfo =
"Size operand is out of range!";
856 if (!((BothLow < (Pos +
Size)) && ((Pos +
Size) <= BothHigh))) {
857 ErrInfo =
"Position + Size is out of range!";
868 switch (
MI.getOpcode()) {
894 case Mips::TAILCALLREG:
895 case Mips::PseudoIndirectBranch:
900 case Mips::JALRPseudo:
904 ErrInfo =
"invalid instruction when using jump guards!";
913std::pair<unsigned, unsigned>
915 return std::make_pair(TF, 0u);
920 using namespace MipsII;
922 static const std::pair<unsigned, const char*> Flags[] = {
923 {MO_GOT,
"mips-got"},
924 {MO_GOT_CALL,
"mips-got-call"},
925 {MO_GPREL,
"mips-gprel"},
926 {MO_ABS_HI,
"mips-abs-hi"},
927 {MO_ABS_LO,
"mips-abs-lo"},
928 {MO_TLSGD,
"mips-tlsgd"},
929 {MO_TLSLDM,
"mips-tlsldm"},
930 {MO_DTPREL_HI,
"mips-dtprel-hi"},
931 {MO_DTPREL_LO,
"mips-dtprel-lo"},
932 {MO_GOTTPREL,
"mips-gottprel"},
933 {MO_TPREL_HI,
"mips-tprel-hi"},
934 {MO_TPREL_LO,
"mips-tprel-lo"},
935 {MO_GPOFF_HI,
"mips-gpoff-hi"},
936 {MO_GPOFF_LO,
"mips-gpoff-lo"},
937 {MO_GOT_DISP,
"mips-got-disp"},
938 {MO_GOT_PAGE,
"mips-got-page"},
939 {MO_GOT_OFST,
"mips-got-ofst"},
940 {MO_HIGHER,
"mips-higher"},
941 {MO_HIGHEST,
"mips-highest"},
942 {MO_GOT_HI16,
"mips-got-hi16"},
943 {MO_GOT_LO16,
"mips-got-lo16"},
944 {MO_CALL_HI16,
"mips-call-hi16"},
945 {MO_CALL_LO16,
"mips-call-lo16"},
946 {MO_JALR,
"mips-jalr"}
951std::optional<ParamLoadedValue>
959 int64_t
Offset = RegImm->Imm;
962 if (SrcReg == Mips::ZERO || SrcReg == Mips::ZERO_64) {
967 }
else if (
auto DestSrc = isCopyInstr(
MI)) {
970 Register DestReg = DestSrc->Destination->getReg();
973 if (
TRI->isSuperRegister(Reg, DestReg) ||
TRI->isSubRegister(Reg, DestReg))
988 switch (
MI.getOpcode()) {
1001 return std::nullopt;
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)
#define IsMFLOMFHI(instr)
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 TargetMachine & 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
bool SafeAfterMflo(const MachineInstr &MI) 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 IsMfloOrMfhi(const MachineInstr &MI) const
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.
@ IsCTI
IsCTI - Instruction is a Control Transfer Instruction.
@ HasForbiddenSlot
HasForbiddenSlot - Instruction has a forbidden slot.
@ MO_JALR
Helper operand used to generate R_MIPS_JALR.
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.