36#define GET_INSTRINFO_CTOR_DTOR
37#include "MipsGenInstrInfo.inc"
40void MipsInstrInfo::anchor() {}
44 Subtarget(STI), UncondBrOpc(UncondBr) {}
54 return op.isImm() &&
op.getImm() == 0;
77 "insertNop does not support MIPS16e mode at this time");
78 const unsigned MMOpc =
102void MipsInstrInfo::AnalyzeCondBr(
const MachineInstr *Inst,
unsigned Opc,
105 assert(getAnalyzableBrOpc(
Opc) &&
"Not an analyzable branch");
113 for (
int i = 0; i < NumOp-1; i++)
121 bool AllowModify)
const {
131 unsigned Opc =
Cond[0].getImm();
135 for (
unsigned i = 1; i <
Cond.size(); ++i) {
137 "Cannot copy operand for conditional branch!");
148 int *BytesAdded)
const {
150 assert(
TBB &&
"insertBranch must not be told to insert a fallthrough");
151 assert(!BytesAdded &&
"code size not handled");
159 "# of Mips branch conditions must be <= 3!");
178 int *BytesRemoved)
const {
179 assert(!BytesRemoved &&
"code size not handled");
182 unsigned removed = 0;
186 while (
I != REnd && removed < 2) {
188 if (
I->isDebugInstr()) {
192 if (!getAnalyzableBrOpc(
I->getOpcode()))
195 I->eraseFromParent();
208 "Invalid Mips branch condition!");
220 while (
I != REnd &&
I->isDebugInstr())
223 if (
I == REnd || !isUnpredicatedTerminator(*
I)) {
231 unsigned LastOpc = LastInst->
getOpcode();
235 if (!getAnalyzableBrOpc(LastOpc))
239 unsigned SecondLastOpc = 0;
245 while (
I != REnd &&
I->isDebugInstr())
249 SecondLastInst = &*
I;
250 SecondLastOpc = getAnalyzableBrOpc(SecondLastInst->
getOpcode());
253 if (isUnpredicatedTerminator(*SecondLastInst) && !SecondLastOpc)
258 if (!SecondLastOpc) {
266 AnalyzeCondBr(LastInst, LastOpc,
TBB,
Cond);
272 if (++
I != REnd && isUnpredicatedTerminator(*
I))
275 BranchInstrs.
insert(BranchInstrs.
begin(), SecondLastInst);
295 AnalyzeCondBr(SecondLastInst, SecondLastOpc,
TBB,
Cond);
302 int64_t BrOffset)
const {
307 case Mips::BAL_BR_MM:
312 case Mips::BEQ:
case Mips::BEQ64:
314 case Mips::BGEZ:
case Mips::BGEZ64:
318 case Mips::BGTZ:
case Mips::BGTZ64:
320 case Mips::BLEZ:
case Mips::BLEZ64:
322 case Mips::BLTZ:
case Mips::BLTZ64:
326 case Mips::BNE:
case Mips::BNE64:
328 return isInt<18>(BrOffset);
336 case Mips::BGEZAL_MM:
340 case Mips::BLTZAL_MM:
344 return isInt<17>(BrOffset);
348 return isInt<11>(BrOffset);
350 case Mips::BEQZ16_MM:
351 case Mips::BNEZ16_MM:
352 return isInt<8>(BrOffset);
357 return isInt<28>(BrOffset);
363 case Mips::BEQC:
case Mips::BEQC64:
364 case Mips::BNEC:
case Mips::BNEC64:
365 case Mips::BGEC:
case Mips::BGEC64:
366 case Mips::BGEUC:
case Mips::BGEUC64:
367 case Mips::BGEZC:
case Mips::BGEZC64:
368 case Mips::BGTZC:
case Mips::BGTZC64:
369 case Mips::BLEZC:
case Mips::BLEZC64:
370 case Mips::BLTC:
case Mips::BLTC64:
371 case Mips::BLTUC:
case Mips::BLTUC64:
372 case Mips::BLTZC:
case Mips::BLTZC64:
381 return isInt<18>(BrOffset);
383 case Mips::BEQZC:
case Mips::BEQZC64:
384 case Mips::BNEZC:
case Mips::BNEZC64:
385 return isInt<23>(BrOffset);
388 case Mips::BC16_MMR6:
389 return isInt<11>(BrOffset);
391 case Mips::BEQZC16_MMR6:
392 case Mips::BNEZC16_MMR6:
393 return isInt<8>(BrOffset);
395 case Mips::BALC_MMR6:
397 return isInt<27>(BrOffset);
399 case Mips::BC1EQZC_MMR6:
400 case Mips::BC1NEZC_MMR6:
401 case Mips::BC2EQZC_MMR6:
402 case Mips::BC2NEZC_MMR6:
403 case Mips::BGEZALC_MMR6:
404 case Mips::BEQZALC_MMR6:
405 case Mips::BGTZALC_MMR6:
406 case Mips::BLEZALC_MMR6:
407 case Mips::BLTZALC_MMR6:
408 case Mips::BNEZALC_MMR6:
409 case Mips::BNVC_MMR6:
410 case Mips::BOVC_MMR6:
411 return isInt<17>(BrOffset);
413 case Mips::BEQC_MMR6:
414 case Mips::BNEC_MMR6:
415 case Mips::BGEC_MMR6:
416 case Mips::BGEUC_MMR6:
417 case Mips::BGEZC_MMR6:
418 case Mips::BGTZC_MMR6:
419 case Mips::BLEZC_MMR6:
420 case Mips::BLTC_MMR6:
421 case Mips::BLTUC_MMR6:
422 case Mips::BLTZC_MMR6:
423 return isInt<18>(BrOffset);
425 case Mips::BEQZC_MMR6:
426 case Mips::BNEZC_MMR6:
427 return isInt<23>(BrOffset);
431 return isInt<18>(BrOffset);
432 case Mips::BPOSGE32_MM:
433 case Mips::BPOSGE32C_MMR3:
434 return isInt<17>(BrOffset);
441 return isInt<18>(BrOffset);
454 return isInt<18>(BrOffset);
463 unsigned Opcode =
I->getOpcode();
464 bool canUseShortMicroMipsCTI =
false;
475 canUseShortMicroMipsCTI =
true;
480 case Mips::PseudoReturn:
481 case Mips::PseudoIndirectBranch:
482 canUseShortMicroMipsCTI =
true;
489 (
I->getOperand(0).isReg() &&
490 (
I->getOperand(0).getReg() == Mips::ZERO ||
491 I->getOperand(0).getReg() == Mips::ZERO_64)) &&
492 (
I->getOperand(1).isReg() &&
493 (
I->getOperand(1).getReg() == Mips::ZERO ||
494 I->getOperand(1).getReg() == Mips::ZERO_64)))
505 if (canUseShortMicroMipsCTI)
506 return Mips::BEQZC_MM;
507 else if (
I->getOperand(0).getReg() ==
I->getOperand(1).getReg())
512 if (canUseShortMicroMipsCTI)
513 return Mips::BNEZC_MM;
514 else if (
I->getOperand(0).getReg() ==
I->getOperand(1).getReg())
518 if (
I->getOperand(0).getReg() ==
I->getOperand(1).getReg())
522 if (
I->getOperand(0).getReg() ==
I->getOperand(1).getReg())
532 if (
I->getOperand(0).getReg() ==
I->getOperand(1).getReg())
536 if (
I->getOperand(0).getReg() ==
I->getOperand(1).getReg())
542 if (
I->getOperand(0).getReg() ==
I->getOperand(1).getReg())
546 if (
I->getOperand(0).getReg() ==
I->getOperand(1).getReg())
550 return Mips::BGTZC64;
552 return Mips::BGEZC64;
554 return Mips::BLTZC64;
556 return Mips::BLEZC64;
560 case Mips::PseudoIndirectBranchR6:
561 case Mips::PseudoReturn:
562 case Mips::TAILCALLR6REG:
563 if (canUseShortMicroMipsCTI)
564 return Mips::JRC16_MM;
566 case Mips::JALRPseudo:
569 case Mips::PseudoIndirectBranch64R6:
570 case Mips::PseudoReturn64:
571 case Mips::TAILCALL64R6REG:
573 case Mips::JALR64Pseudo:
574 return Mips::JIALC64;
594 if (
MI.isInlineAsm())
638 return Op.isReg() && MIInSlot.readsRegister(Op.getReg(), nullptr);
656 switch (
MI.getOpcode()) {
675 switch (
MI.getOpcode()) {
690 const unsigned Opcode =
MI.getOpcode();
697 return ((
MI.getOperand(2).isImm() &&
MI.getOperand(2).getImm() == 0) ||
698 (
MI.getOperand(1).isReg() &&
699 (
MI.getOperand(1).getReg() == Mips::ZERO ||
700 MI.getOperand(1).getReg() == Mips::ZERO_64)));
702 return MI.isAsCheapAsAMove();
707 switch (
MI.getOpcode()) {
709 return MI.getDesc().getSize();
710 case TargetOpcode::INLINEASM:
711 case TargetOpcode::INLINEASM_BR: {
713 const char *AsmStr =
MI.getOperand(0).getSymbolName();
716 case Mips::CONSTPOOL_ENTRY:
719 return MI.getOperand(2).getImm();
737 int ZeroOperandPosition = -1;
738 bool BranchWithZeroOperand =
false;
739 if (
I->isBranch() && !
I->isPseudo()) {
740 auto TRI =
I->getParent()->getParent()->getSubtarget().getRegisterInfo();
741 ZeroOperandPosition =
I->findRegisterUseOperandIdx(Mips::ZERO,
TRI,
false);
742 BranchWithZeroOperand = ZeroOperandPosition != -1;
745 if (BranchWithZeroOperand) {
748 NewOpc = Mips::BEQZC;
751 NewOpc = Mips::BNEZC;
754 NewOpc = Mips::BGEZC;
757 NewOpc = Mips::BLTZC;
760 NewOpc = Mips::BEQZC64;
763 NewOpc = Mips::BNEZC64;
768 MIB =
BuildMI(*
I->getParent(),
I,
I->getDebugLoc(),
get(NewOpc));
774 if (NewOpc == Mips::JIC || NewOpc == Mips::JIALC || NewOpc == Mips::JIC64 ||
775 NewOpc == Mips::JIALC64) {
777 if (NewOpc == Mips::JIALC || NewOpc == Mips::JIALC64)
780 for (
unsigned J = 0, E =
I->getDesc().getNumOperands(); J < E; ++J) {
781 MIB.
add(
I->getOperand(J));
788 for (
unsigned J =
I->getDesc().getNumOperands(), E =
I->getNumOperands();
797 for (
unsigned J = 0, E =
I->getDesc().getNumOperands(); J < E; ++J) {
798 if (BranchWithZeroOperand && (
unsigned)ZeroOperandPosition == J)
801 MIB.
add(
I->getOperand(J));
812 unsigned &SrcOpIdx2)
const {
814 "TargetInstrInfo::findCommutedOpIndices() can't handle bundles");
820 switch (
MI.getOpcode()) {
821 case Mips::DPADD_U_H:
822 case Mips::DPADD_U_W:
823 case Mips::DPADD_U_D:
824 case Mips::DPADD_S_H:
825 case Mips::DPADD_S_W:
826 case Mips::DPADD_S_D:
828 if (!fixCommutedOpIndices(SrcOpIdx1, SrcOpIdx2, 2, 3))
831 if (!
MI.getOperand(SrcOpIdx1).isReg() || !
MI.getOperand(SrcOpIdx2).isReg())
853 const int64_t PosLow,
const int64_t PosHigh,
854 const int64_t SizeLow,
855 const int64_t SizeHigh,
856 const int64_t BothLow,
857 const int64_t BothHigh) {
859 if (!MOPos.
isImm()) {
860 ErrInfo =
"Position is not an immediate!";
863 int64_t Pos = MOPos.
getImm();
864 if (!((PosLow <= Pos) && (Pos < PosHigh))) {
865 ErrInfo =
"Position operand is out of range!";
870 if (!MOSize.
isImm()) {
871 ErrInfo =
"Size operand is not an immediate!";
875 if (!((SizeLow <
Size) && (
Size <= SizeHigh))) {
876 ErrInfo =
"Size operand is out of range!";
880 if (!((BothLow < (Pos +
Size)) && ((Pos +
Size) <= BothHigh))) {
881 ErrInfo =
"Position + Size is out of range!";
892 switch (
MI.getOpcode()) {
918 case Mips::TAILCALLREG:
919 case Mips::PseudoIndirectBranch:
924 case Mips::JALRPseudo:
928 ErrInfo =
"invalid instruction when using jump guards!";
937std::pair<unsigned, unsigned>
939 return std::make_pair(TF, 0u);
944 using namespace MipsII;
946 static const std::pair<unsigned, const char*> Flags[] = {
947 {MO_GOT,
"mips-got"},
948 {MO_GOT_CALL,
"mips-got-call"},
949 {MO_GPREL,
"mips-gprel"},
950 {MO_ABS_HI,
"mips-abs-hi"},
951 {MO_ABS_LO,
"mips-abs-lo"},
952 {MO_TLSGD,
"mips-tlsgd"},
953 {MO_TLSLDM,
"mips-tlsldm"},
954 {MO_DTPREL_HI,
"mips-dtprel-hi"},
955 {MO_DTPREL_LO,
"mips-dtprel-lo"},
956 {MO_GOTTPREL,
"mips-gottprel"},
957 {MO_TPREL_HI,
"mips-tprel-hi"},
958 {MO_TPREL_LO,
"mips-tprel-lo"},
959 {MO_GPOFF_HI,
"mips-gpoff-hi"},
960 {MO_GPOFF_LO,
"mips-gpoff-lo"},
961 {MO_GOT_DISP,
"mips-got-disp"},
962 {MO_GOT_PAGE,
"mips-got-page"},
963 {MO_GOT_OFST,
"mips-got-ofst"},
964 {MO_HIGHER,
"mips-higher"},
965 {MO_HIGHEST,
"mips-highest"},
966 {MO_GOT_HI16,
"mips-got-hi16"},
967 {MO_GOT_LO16,
"mips-got-lo16"},
968 {MO_CALL_HI16,
"mips-call-hi16"},
969 {MO_CALL_LO16,
"mips-call-lo16"},
970 {MO_JALR,
"mips-jalr"}
975std::optional<ParamLoadedValue>
983 int64_t
Offset = RegImm->Imm;
986 if (SrcReg == Mips::ZERO || SrcReg == Mips::ZERO_64) {
991 }
else if (
auto DestSrc = isCopyInstr(
MI)) {
994 Register DestReg = DestSrc->Destination->getReg();
997 if (
TRI->isSuperRegister(Reg, DestReg) ||
TRI->isSubRegister(Reg, DestReg))
1010 return std::nullopt;
1012 switch (
MI.getOpcode()) {
1014 case Mips::DADDiu: {
1025 return std::nullopt;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
SmallVector< uint32_t, 0 > Writes
Register 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
This file defines the SmallVector class.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
static LLVM_ABI 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.
MCInstBuilder & addReg(MCRegister Reg)
Add a new register operand.
MCInstBuilder & addImm(int64_t Val)
Add a new integer immediate operand.
Instances of this class represent a single low-level machine instruction.
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.
mop_range defs()
Returns all explicit operands that are register definitions.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
LLVM_ABI 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.
LLVM_ABI 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.
LLVM_ABI void eraseFromParent()
Unlink 'this' from the containing basic block and delete it.
LLVM_ABI 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
MCInst getNop() const override
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.
bool isAsCheapAsAMove(const MachineInstr &MI) const override
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 =0
Return the target's register information.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
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.
MachineInstr * getImm(const MachineOperand &MO, const MachineRegisterInfo *MRI)
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
const MipsInstrInfo * createMips16InstrInfo(const MipsSubtarget &STI)
Create MipsInstrInfo objects.
static LLVM_ABI 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.