26#define GET_INSTRINFO_CTOR_DTOR
27#include "LoongArchGenInstrInfo.inc"
46 bool RenamableSrc)
const {
47 if (LoongArch::GPRRegClass.
contains(DstReg, SrcReg)) {
55 if (LoongArch::LSX128RegClass.
contains(DstReg, SrcReg)) {
63 if (LoongArch::LASX256RegClass.
contains(DstReg, SrcReg)) {
71 if (LoongArch::CFRRegClass.
contains(DstReg) &&
72 LoongArch::GPRRegClass.
contains(SrcReg)) {
78 if (LoongArch::GPRRegClass.
contains(DstReg) &&
79 LoongArch::CFRRegClass.
contains(SrcReg)) {
85 if (LoongArch::CFRRegClass.
contains(DstReg, SrcReg)) {
93 if (LoongArch::FPR32RegClass.
contains(DstReg, SrcReg)) {
94 Opc = LoongArch::FMOV_S;
95 }
else if (LoongArch::FPR64RegClass.
contains(DstReg, SrcReg)) {
96 Opc = LoongArch::FMOV_D;
97 }
else if (LoongArch::GPRRegClass.
contains(DstReg) &&
98 LoongArch::FPR32RegClass.
contains(SrcReg)) {
100 Opc = LoongArch::MOVFR2GR_S;
101 }
else if (LoongArch::GPRRegClass.
contains(DstReg) &&
102 LoongArch::FPR64RegClass.
contains(SrcReg)) {
104 Opc = LoongArch::MOVFR2GR_D;
123 if (LoongArch::GPRRegClass.hasSubClassEq(RC))
124 Opcode =
TRI.getRegSizeInBits(LoongArch::GPRRegClass) == 32
127 else if (LoongArch::FPR32RegClass.hasSubClassEq(RC))
128 Opcode = LoongArch::FST_S;
129 else if (LoongArch::FPR64RegClass.hasSubClassEq(RC))
130 Opcode = LoongArch::FST_D;
131 else if (LoongArch::LSX128RegClass.hasSubClassEq(RC))
132 Opcode = LoongArch::VST;
133 else if (LoongArch::LASX256RegClass.hasSubClassEq(RC))
134 Opcode = LoongArch::XVST;
135 else if (LoongArch::CFRRegClass.hasSubClassEq(RC))
136 Opcode = LoongArch::PseudoST_CFR;
159 DL =
I->getDebugLoc();
162 if (LoongArch::GPRRegClass.hasSubClassEq(RC))
163 Opcode = RegInfo.getRegSizeInBits(LoongArch::GPRRegClass) == 32
166 else if (LoongArch::FPR32RegClass.hasSubClassEq(RC))
167 Opcode = LoongArch::FLD_S;
168 else if (LoongArch::FPR64RegClass.hasSubClassEq(RC))
169 Opcode = LoongArch::FLD_D;
170 else if (LoongArch::LSX128RegClass.hasSubClassEq(RC))
171 Opcode = LoongArch::VLD;
172 else if (LoongArch::LASX256RegClass.hasSubClassEq(RC))
173 Opcode = LoongArch::XVLD;
174 else if (LoongArch::CFRRegClass.hasSubClassEq(RC))
175 Opcode = LoongArch::PseudoLD_CFR;
201 for (
auto &Inst : Seq) {
203 case LoongArch::LU12I_W:
208 case LoongArch::ADDI_W:
210 case LoongArch::LU32I_D:
211 case LoongArch::LU52I_D:
217 case LoongArch::BSTRINS_D:
226 assert(
false &&
"Unknown insn emitted by LoongArchMatInt");
235 unsigned Opcode =
MI.getOpcode();
237 if (Opcode == TargetOpcode::INLINEASM ||
238 Opcode == TargetOpcode::INLINEASM_BR) {
241 return getInlineAsmLength(
MI.getOperand(0).getSymbolName(), *MAI);
244 unsigned NumBytes = 0;
250 switch (
Desc.getOpcode()) {
252 return Desc.getSize();
253 case TargetOpcode::STATEPOINT:
255 assert(NumBytes % 4 == 0 &&
"Invalid number of NOP bytes requested!");
265 const unsigned Opcode =
MI.getOpcode();
269 case LoongArch::ADDI_D:
271 case LoongArch::XORI:
272 return (
MI.getOperand(1).isReg() &&
273 MI.getOperand(1).getReg() == LoongArch::R0) ||
274 (
MI.getOperand(2).isImm() &&
MI.getOperand(2).getImm() == 0);
276 return MI.isAsCheapAsAMove();
281 assert(
MI.getDesc().isBranch() &&
"Unexpected opcode!");
283 return MI.getOperand(
MI.getNumExplicitOperands() - 1).getMBB();
290 "Unknown conditional branch");
295 for (
int i = 0; i < NumOp - 1; i++)
303 bool AllowModify)
const {
309 if (
I ==
MBB.end() || !isUnpredicatedTerminator(*
I))
315 int NumTerminators = 0;
316 for (
auto J =
I.getReverse(); J !=
MBB.rend() && isUnpredicatedTerminator(*J);
319 if (J->getDesc().isUnconditionalBranch() ||
320 J->getDesc().isIndirectBranch()) {
327 if (AllowModify && FirstUncondOrIndirectBr !=
MBB.end()) {
328 while (std::next(FirstUncondOrIndirectBr) !=
MBB.end()) {
329 std::next(FirstUncondOrIndirectBr)->eraseFromParent();
332 I = FirstUncondOrIndirectBr;
336 if (NumTerminators == 1 &&
I->getDesc().isUnconditionalBranch()) {
342 if (NumTerminators == 1 &&
I->getDesc().isConditionalBranch()) {
348 if (NumTerminators == 2 && std::prev(
I)->getDesc().isConditionalBranch() &&
349 I->getDesc().isUnconditionalBranch()) {
360 int64_t BrOffset)
const {
368 case LoongArch::BLTU:
369 case LoongArch::BGEU:
371 case LoongArch::BEQZ:
372 case LoongArch::BNEZ:
373 case LoongArch::BCEQZ:
374 case LoongArch::BCNEZ:
377 case LoongArch::PseudoBR:
385 auto MII =
MI.getIterator();
386 auto MIE =
MBB->end();
417 switch (
MI.getOpcode()) {
418 case LoongArch::PCALAU12I: {
419 auto AddI = std::next(MII);
420 if (AddI == MIE || AddI->getOpcode() != LoongArch::ADDI_D)
422 auto Lu32I = std::next(AddI);
423 if (Lu32I == MIE || Lu32I->getOpcode() != LoongArch::LU32I_D)
425 auto MO0 =
MI.getOperand(1).getTargetFlags();
426 auto MO1 = AddI->getOperand(2).getTargetFlags();
427 auto MO2 = Lu32I->getOperand(2).getTargetFlags();
444 case LoongArch::LU52I_D: {
445 auto MO =
MI.getOperand(2).getTargetFlags();
456 if (
STI.hasFeature(LoongArch::FeatureRelax)) {
473 unsigned AddiOp =
STI.is64Bit() ? LoongArch::ADDI_D : LoongArch::ADDI_W;
474 unsigned LdOp =
STI.is64Bit() ? LoongArch::LD_D : LoongArch::LD_W;
475 switch (
MI.getOpcode()) {
476 case LoongArch::PCALAU12I: {
478 auto SecondOp = std::next(MII);
480 if (SecondOp == MIE || SecondOp->getOpcode() != AddiOp)
482 auto Ld = std::next(SecondOp);
483 if (Ld == MIE || Ld->getOpcode() != LdOp)
491 if (SecondOp == MIE ||
492 (SecondOp->getOpcode() != AddiOp && SecondOp->getOpcode() != LdOp))
507 case LoongArch::ADDI_W:
508 case LoongArch::ADDI_D: {
514 case LoongArch::LD_W:
515 case LoongArch::LD_D: {
521 case LoongArch::PseudoDESC_CALL: {
548 int *BytesRemoved)
const {
555 if (!
I->getDesc().isBranch())
561 I->eraseFromParent();
565 if (
I ==
MBB.begin())
568 if (!
I->getDesc().isConditionalBranch())
574 I->eraseFromParent();
587 assert(
TBB &&
"insertBranch must not be told to insert a fallthrough");
589 "LoongArch branch conditions have at most two components!");
601 for (
unsigned i = 1; i <
Cond.size(); ++i)
624 assert(RS &&
"RegScavenger required for long branching");
626 "new block should be inserted for expanding unconditional branch");
634 bool Has32S =
STI.hasFeature(LoongArch::Feature32S);
638 "Branch offsets outside of the signed 32-bit range not supported");
640 Register ScratchReg =
MRI.createVirtualRegister(&LoongArch::GPRRegClass);
644 unsigned ADDIOp =
STI.is64Bit() ? LoongArch::ADDI_D : LoongArch::ADDI_W;
665 RS->enterBasicBlockEnd(
MBB);
666 Register Scav = RS->scavengeRegisterBackwards(
667 LoongArch::GPRRegClass, PCAI->
getIterator(),
false,
669 if (Scav != LoongArch::NoRegister)
670 RS->setRegUsed(Scav);
674 Scav = LoongArch::R20;
676 if (FrameIndex == -1)
679 &LoongArch::GPRRegClass,
Register());
686 &LoongArch::GPRRegClass,
Register());
687 TRI->eliminateFrameIndex(RestoreBB.
back(),
690 MRI.replaceRegWith(ScratchReg, Scav);
699 return LoongArch::BNE;
701 return LoongArch::BEQ;
702 case LoongArch::BEQZ:
703 return LoongArch::BNEZ;
704 case LoongArch::BNEZ:
705 return LoongArch::BEQZ;
706 case LoongArch::BCEQZ:
707 return LoongArch::BCNEZ;
708 case LoongArch::BCNEZ:
709 return LoongArch::BCEQZ;
711 return LoongArch::BGE;
713 return LoongArch::BLT;
714 case LoongArch::BLTU:
715 return LoongArch::BGEU;
716 case LoongArch::BGEU:
717 return LoongArch::BLTU;
723 assert((
Cond.size() &&
Cond.size() <= 3) &&
"Invalid branch condition!");
728std::pair<unsigned, unsigned>
731 return std::make_pair(TF & Mask, TF & ~Mask);
738 static const std::pair<unsigned, const char *> TargetFlags[] = {
739 {MO_CALL,
"loongarch-call"},
740 {MO_CALL_PLT,
"loongarch-call-plt"},
741 {MO_PCREL_HI,
"loongarch-pcrel-hi"},
742 {MO_PCREL_LO,
"loongarch-pcrel-lo"},
743 {MO_PCREL64_LO,
"loongarch-pcrel64-lo"},
744 {MO_PCREL64_HI,
"loongarch-pcrel64-hi"},
745 {MO_GOT_PC_HI,
"loongarch-got-pc-hi"},
746 {MO_GOT_PC_LO,
"loongarch-got-pc-lo"},
747 {MO_GOT_PC64_LO,
"loongarch-got-pc64-lo"},
748 {MO_GOT_PC64_HI,
"loongarch-got-pc64-hi"},
749 {MO_LE_HI,
"loongarch-le-hi"},
750 {MO_LE_LO,
"loongarch-le-lo"},
751 {MO_LE64_LO,
"loongarch-le64-lo"},
752 {MO_LE64_HI,
"loongarch-le64-hi"},
753 {MO_IE_PC_HI,
"loongarch-ie-pc-hi"},
754 {MO_IE_PC_LO,
"loongarch-ie-pc-lo"},
755 {MO_IE_PC64_LO,
"loongarch-ie-pc64-lo"},
756 {MO_IE_PC64_HI,
"loongarch-ie-pc64-hi"},
757 {MO_LD_PC_HI,
"loongarch-ld-pc-hi"},
758 {MO_GD_PC_HI,
"loongarch-gd-pc-hi"},
759 {MO_CALL30,
"loongarch-call30"},
760 {MO_CALL36,
"loongarch-call36"},
761 {MO_DESC_PC_HI,
"loongarch-desc-pc-hi"},
762 {MO_DESC_PC_LO,
"loongarch-desc-pc-lo"},
763 {MO_DESC64_PC_LO,
"loongarch-desc64-pc-lo"},
764 {MO_DESC64_PC_HI,
"loongarch-desc64-pc-hi"},
765 {MO_DESC_LD,
"loongarch-desc-ld"},
766 {MO_DESC_CALL,
"loongarch-desc-call"},
767 {MO_LE_HI_R,
"loongarch-le-hi-r"},
768 {MO_LE_ADD_R,
"loongarch-le-add-r"},
769 {MO_LE_LO_R,
"loongarch-le-lo-r"},
770 {MO_PCADD_HI,
"loongarch-pcadd-hi"},
771 {MO_PCADD_LO,
"loongarch-pcadd-lo"},
772 {MO_GOT_PCADD_HI,
"loongarch-got-pcadd-hi"},
773 {MO_GOT_PCADD_LO,
"loongarch-got-pcadd-lo"},
774 {MO_IE_PCADD_HI,
"loongarch-ie-pcadd-hi"},
775 {MO_IE_PCADD_LO,
"loongarch-ie-pcadd-lo"},
776 {MO_LD_PCADD_HI,
"loongarch-ld-pcadd-hi"},
777 {MO_LD_PCADD_LO,
"loongarch-ld-pcadd-lo"},
778 {MO_GD_PCADD_HI,
"loongarch-gd-pcadd-hi"},
779 {MO_GD_PCADD_LO,
"loongarch-gd-pcadd-lo"},
780 {MO_DESC_PCADD_HI,
"loongarch-pcadd-desc-hi"},
781 {MO_DESC_PCADD_LO,
"loongarch-pcadd-desc-lo"}};
788 static const std::pair<unsigned, const char *> TargetFlags[] = {
789 {MO_RELAX,
"loongarch-relax"}};
797 enum MemIOffsetType {
813 case LoongArch::LDPTR_W:
814 case LoongArch::LDPTR_D:
815 case LoongArch::STPTR_W:
816 case LoongArch::STPTR_D:
819 case LoongArch::LD_B:
820 case LoongArch::LD_H:
821 case LoongArch::LD_W:
822 case LoongArch::LD_D:
823 case LoongArch::LD_BU:
824 case LoongArch::LD_HU:
825 case LoongArch::LD_WU:
826 case LoongArch::ST_B:
827 case LoongArch::ST_H:
828 case LoongArch::ST_W:
829 case LoongArch::ST_D:
830 case LoongArch::FLD_S:
831 case LoongArch::FLD_D:
832 case LoongArch::FST_S:
833 case LoongArch::FST_D:
836 case LoongArch::XVLD:
837 case LoongArch::XVST:
838 case LoongArch::VLDREPL_B:
839 case LoongArch::XVLDREPL_B:
842 case LoongArch::VLDREPL_H:
843 case LoongArch::XVLDREPL_H:
846 case LoongArch::VLDREPL_W:
847 case LoongArch::XVLDREPL_W:
850 case LoongArch::VLDREPL_D:
851 case LoongArch::XVLDREPL_D:
854 case LoongArch::VSTELM_B:
855 case LoongArch::XVSTELM_B:
858 case LoongArch::VSTELM_H:
859 case LoongArch::XVSTELM_H:
862 case LoongArch::VSTELM_W:
863 case LoongArch::XVSTELM_W:
866 case LoongArch::VSTELM_D:
867 case LoongArch::XVSTELM_D:
875 if ((AddrI.
getOpcode() != LoongArch::ADDI_W &&
876 AddrI.
getOpcode() != LoongArch::ADDI_D) ||
882 int64_t NewOffset = OldOffset + Disp;
887 !(OT == Imm12 &&
isInt<12>(NewOffset)) &&
891 !(OT == Imm8 &&
isInt<8>(NewOffset)) &&
912 "Addressing mode not supported for folding");
924 case LoongArch::VSTELM_B:
925 case LoongArch::VSTELM_H:
926 case LoongArch::VSTELM_W:
927 case LoongArch::VSTELM_D:
928 case LoongArch::XVSTELM_B:
929 case LoongArch::XVSTELM_H:
930 case LoongArch::XVSTELM_W:
931 case LoongArch::XVSTELM_D:
944 return MI.getOpcode() == LoongArch::ADDI_W &&
MI.getOperand(1).isReg() &&
945 MI.getOperand(2).isImm() &&
MI.getOperand(2).getImm() == 0;
unsigned const MachineRegisterInfo * MRI
static void parseCondBranch(MachineInstr *LastInst, MachineBasicBlock *&Target, SmallVectorImpl< MachineOperand > &Cond)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
static unsigned getOppositeBranchOpc(unsigned Opcode)
Register const TargetRegisterInfo * TRI
Promote Memory to Register
uint64_t IntrinsicInst * II
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
This file declares the machine register scavenger class.
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &DL, Register DstReg, Register SrcReg, bool KillSrc, bool RenamableDest=false, bool RenamableSrc=false) const override
ArrayRef< std::pair< unsigned, const char * > > getSerializableBitmaskMachineOperandTargetFlags() const override
const LoongArchSubtarget & STI
bool reverseBranchCondition(SmallVectorImpl< MachineOperand > &Cond) const override
bool isSafeToMove(const MachineInstr &MI, const MachineBasicBlock *MBB, const MachineFunction &MF) const override
bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify) const override
void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register SrcReg, bool IsKill, int FrameIndex, const TargetRegisterClass *RC, Register VReg, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
std::pair< unsigned, unsigned > decomposeMachineOperandsTargetFlags(unsigned TF) const override
bool isAsCheapAsAMove(const MachineInstr &MI) const override
MCInst getNop() const override
LoongArchInstrInfo(const LoongArchSubtarget &STI)
ArrayRef< std::pair< unsigned, const char * > > getSerializableDirectMachineOperandTargetFlags() const override
unsigned removeBranch(MachineBasicBlock &MBB, int *BytesRemoved=nullptr) const override
void movImm(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &DL, Register DstReg, uint64_t Val, MachineInstr::MIFlag Flag=MachineInstr::NoFlags) const
unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, ArrayRef< MachineOperand > Cond, const DebugLoc &dl, int *BytesAdded=nullptr) const override
void insertIndirectBranch(MachineBasicBlock &MBB, MachineBasicBlock &NewDestBB, MachineBasicBlock &RestoreBB, const DebugLoc &DL, int64_t BrOffset, RegScavenger *RS) const override
void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register DstReg, int FrameIndex, const TargetRegisterClass *RC, Register VReg, unsigned SubReg=0, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
bool isSchedulingBoundary(const MachineInstr &MI, const MachineBasicBlock *MBB, const MachineFunction &MF) const override
bool isBranchOffsetInRange(unsigned BranchOpc, int64_t BrOffset) const override
bool canFoldIntoAddrMode(const MachineInstr &MemI, Register Reg, const MachineInstr &AddrI, ExtAddrMode &AM) const override
unsigned getInstSizeInBytes(const MachineInstr &MI) const override
MachineBasicBlock * getBranchDestBlock(const MachineInstr &MI) const override
MachineInstr * emitLdStWithAddr(MachineInstr &MemI, const ExtAddrMode &AM) const override
LoongArchMachineFunctionInfo - This class is derived from MachineFunctionInfo and contains private Lo...
int getBranchRelaxationSpillFrameIndex()
This class is intended to be used as a base class for asm properties and features specific to the tar...
LLVM_ABI MCSymbol * createNamedTempSymbol()
Create a temporary symbol with a unique name whose name cannot be omitted in the symbol table.
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 isConditionalBranch() const
Return true if this is a branch which may fall through to the next instruction or may transfer contro...
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
MachineInstrBundleIterator< MachineInstr > iterator
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.
MCContext & getContext() const
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
const MachineInstrBuilder & setMemRefs(ArrayRef< MachineMemOperand * > MMOs) const
const MachineInstrBuilder & setMIFlag(MachineInstr::MIFlag Flag) const
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 & addFrameIndex(int Idx) 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 & setMIFlags(unsigned Flags) const
const MachineInstrBuilder & addMemOperand(MachineMemOperand *MMO) const
reverse_iterator getReverse() const
Get a reverse iterator to the same node.
Representation of each machine instruction.
unsigned getOpcode() const
Returns the opcode of this MachineInstr.
const MachineBasicBlock * getParent() const
LLVM_ABI void setPreInstrSymbol(MachineFunction &MF, MCSymbol *Symbol)
Set a symbol that will be emitted just prior to the instruction itself.
LLVM_ABI unsigned getNumExplicitOperands() const
Returns the number of non-implicit operands.
bool mayLoad(QueryType Type=AnyInBundle) const
Return true if this instruction could possibly read memory.
const MCInstrDesc & getDesc() const
Returns the target instruction descriptor of this MachineInstr.
ArrayRef< MachineMemOperand * > memoperands() const
Access to memory operands of the instruction.
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
const MachineOperand & getOperand(unsigned i) const
uint32_t getFlags() const
Return the MI flags bitvector.
A description of a memory reference used in the backend.
@ MOLoad
The memory access reads data.
@ MOStore
The memory access writes data.
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.
void setMBB(MachineBasicBlock *MBB)
static MachineOperand CreateImm(int64_t Val)
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
Wrapper class representing virtual and physical registers.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
MI-level Statepoint operands.
uint32_t getNumPatchBytes() const
Return the number of patchable bytes the given statepoint should emit.
virtual bool isSchedulingBoundary(const MachineInstr &MI, const MachineBasicBlock *MBB, const MachineFunction &MF) const
Test if the given instruction should be considered a scheduling boundary.
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.
Target - Wrapper for Target specific information.
self_iterator getIterator()
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
static unsigned getDirectFlags(const MachineOperand &MO)
InstSeq generateInstSeq(int64_t Val)
bool isSEXT_W(const MachineInstr &MI)
@ Define
Register definition.
@ Kill
The last use of a register.
This is an optimization pass for GlobalISel generic memory operations.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
constexpr bool isInt(int64_t x)
Checks if an integer fits into the given bit width.
MachineInstr * getImm(const MachineOperand &MO, const MachineRegisterInfo *MRI)
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
unsigned getKillRegState(bool B)
ArrayRef(const T &OneElt) -> ArrayRef< T >
constexpr bool isShiftedInt(int64_t x)
Checks if a signed integer is an N bit number shifted left by S.
constexpr int64_t SignExtend64(uint64_t x)
Sign-extend the number in the bottom B bits of X to a 64-bit integer.
Used to describe addressing mode similar to ExtAddrMode in CodeGenPrepare.
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.