25#define GET_INSTRINFO_CTOR_DTOR
26#include "XtensaGenInstrInfo.inc"
55 int &FrameIndex)
const {
56 if (
MI.getOpcode() == Xtensa::L32I) {
57 if (
MI.getOperand(1).isFI() &&
MI.getOperand(2).isImm() &&
58 MI.getOperand(2).getImm() == 0) {
59 FrameIndex =
MI.getOperand(1).getIndex();
60 return MI.getOperand(0).getReg();
67 int &FrameIndex)
const {
68 if (
MI.getOpcode() == Xtensa::S32I) {
69 if (
MI.getOperand(1).isFI() &&
MI.getOperand(2).isImm() &&
70 MI.getOperand(2).getImm() == 0) {
71 FrameIndex =
MI.getOperand(1).getIndex();
72 return MI.getOperand(0).getReg();
93 if (isInt<8>(Amount)) {
116 bool RenamableDest,
bool RenamableSrc)
const {
119 if (Xtensa::ARRegClass.
contains(DestReg, SrcReg))
133 unsigned LoadOpcode, StoreOpcode;
145 unsigned LoadOpcode, StoreOpcode;
151 unsigned &LoadOpcode,
152 unsigned &StoreOpcode,
153 int64_t offset)
const {
154 if (RC == &Xtensa::ARRegClass) {
155 LoadOpcode = Xtensa::L32I;
156 StoreOpcode = Xtensa::S32I;
157 }
else if (RC == &Xtensa::FPRRegClass) {
158 LoadOpcode = Xtensa::LSI;
159 StoreOpcode = Xtensa::SSI;
176 }
else if (
Value >= -32768 &&
Value <= 32767) {
182 }
else if (
Value >= -4294967296LL &&
Value <= 4294967295LL) {
186 const Constant *CVal = ConstantInt::get(
200 switch (
MI.getOpcode()) {
201 case TargetOpcode::INLINEASM: {
203 const char *AsmStr =
MI.getOperand(0).getSymbolName();
207 return MI.getDesc().getSize();
213 assert(
Cond.size() <= 4 &&
"Invalid branch condition!");
217 Cond[0].setImm(Xtensa::BNE);
220 Cond[0].setImm(Xtensa::BEQ);
223 Cond[0].setImm(Xtensa::BGE);
226 Cond[0].setImm(Xtensa::BLT);
229 Cond[0].setImm(Xtensa::BGEU);
232 Cond[0].setImm(Xtensa::BLTU);
235 Cond[0].setImm(Xtensa::BNEI);
238 Cond[0].setImm(Xtensa::BEQI);
241 Cond[0].setImm(Xtensa::BLTI);
244 Cond[0].setImm(Xtensa::BGEI);
247 Cond[0].setImm(Xtensa::BLTUI);
250 Cond[0].setImm(Xtensa::BGEUI);
253 Cond[0].setImm(Xtensa::BNEZ);
256 Cond[0].setImm(Xtensa::BEQZ);
259 Cond[0].setImm(Xtensa::BGEZ);
262 Cond[0].setImm(Xtensa::BLTZ);
265 Cond[0].setImm(Xtensa::BT);
268 Cond[0].setImm(Xtensa::BF);
277 unsigned OpCode =
MI.getOpcode();
283 return MI.getOperand(0).getMBB();
290 return MI.getOperand(2).getMBB();
297 return MI.getOperand(2).getMBB();
302 return MI.getOperand(1).getMBB();
305 return MI.getOperand(1).getMBB();
312 int64_t BrOffset)
const {
316 return isIntN(18, BrOffset);
334 return isIntN(8, BrOffset);
340 return isIntN(12, BrOffset);
344 return isIntN(8, BrOffset);
354 bool AllowModify =
false)
const {
362 if (
I->isDebugValue())
367 if (!isUnpredicatedTerminator(*
I))
379 if (!ThisTarget->
isMBB())
382 if (ThisCond[0].
getImm() == Xtensa::J) {
390 while (std::next(
I) !=
MBB.
end())
409 for (
unsigned int i = 0; i < (
I->getNumExplicitOperands() - 1); i++)
410 Cond.push_back(
I->getOperand(i));
425 unsigned OldCond =
Cond[0].getImm();
426 if (OldCond == ThisCond[0].
getImm())
434 int *BytesRemoved)
const {
453 I->eraseFromParent();
487 assert(RS &&
"RegScavenger required for long branching");
489 "new block should be inserted for expanding unconditional branch");
498 if (!isInt<32>(BrOffset))
500 "Branch offsets outside of the signed 32-bit range not supported");
502 Register ScratchReg =
MRI.createVirtualRegister(&Xtensa::ARRegClass);
515 if (ScavRegister != Xtensa::NoRegister)
520 ScavRegister = Xtensa::A12;
522 int FrameIndex = XtensaFI->getBranchRelaxationScratchFrameIndex();
523 if (FrameIndex == -1)
525 "Unable to properly handle scavenged register for indirect jump, "
526 "function code size is significantly larger than estimated");
529 &Xtensa::ARRegClass, &RI,
Register());
534 &Xtensa::ARRegClass, &RI,
Register());
537 JumpToMBB = &RestoreBB;
540 unsigned LabelId = XtensaFI->createCPLabelId();
547 MRI.replaceRegWith(ScratchReg, ScavRegister);
555 "Xtensa branch conditions have less than four components!");
557 if (
Cond.empty() || (
Cond[0].getImm() == Xtensa::J)) {
560 if (BytesAdded &&
MI)
566 unsigned BR_C =
Cond[0].getImm();
604 if (BytesAdded &&
MI)
615 int *BytesAdded)
const {
617 assert(
TBB &&
"InsertBranch must not be told to insert a fallthrough");
619 "Xtensa branch conditions have less than four components!");
621 if (
Cond.empty() || (
Cond[0].getImm() == Xtensa::J)) {
624 if (BytesAdded &&
MI)
630 unsigned BR_C =
Cond[0].getImm();
668 if (BytesAdded &&
MI)
677 unsigned OpCode =
MI->getOpcode();
682 Cond[0].setImm(OpCode);
691 Cond[0].setImm(OpCode);
701 Cond[0].setImm(OpCode);
709 Cond[0].setImm(OpCode);
715 Cond[0].setImm(OpCode);
720 assert(!
MI->getDesc().isBranch() &&
"Unknown branch opcode");
unsigned const MachineRegisterInfo * MRI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
MachineBasicBlock MachineBasicBlock::iterator MBBI
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
Register const TargetRegisterInfo * TRI
static unsigned getReg(const MCDisassembler *D, unsigned RC, unsigned RegNo)
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)
static const MachineInstrBuilder & addFrameReference(const MachineInstrBuilder &MIB, int FI)
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
This is an important base class in LLVM.
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
Describe properties that are true of each instruction in the target description file.
bool mayStore() const
Return true if this instruction could possibly modify memory.
bool mayLoad() const
Return true if this instruction could possibly read memory.
Wrapper class representing physical registers. Should be passed by value.
unsigned pred_size() const
LLVM_ABI void eraseFromParent()
This method unlinks 'this' from the containing function and deletes it.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
The MachineConstantPool class keeps track of constants referenced by a function which must be spilled...
unsigned getConstantPoolIndex(const Constant *C, Align Alignment)
getConstantPoolIndex - Create a new entry in the constant pool or return an existing one.
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.
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.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
MachineConstantPool * getConstantPool()
getConstantPool - Return the constant pool 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 & addFrameIndex(int Idx) const
const MachineInstrBuilder & addConstantPoolIndex(unsigned Idx, int Offset=0, unsigned 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 & addMemOperand(MachineMemOperand *MMO) const
Representation of each machine instruction.
LLVM_ABI void addOperand(MachineFunction &MF, const MachineOperand &Op)
Add the specified operand to the instruction.
A description of a memory reference used in the backend.
Flags
Flags values. These may be or'd together.
@ MOLoad
The memory access reads data.
@ MOStore
The memory access writes data.
MachineOperand class - Representation of each machine instruction operand.
MachineBasicBlock * getMBB() const
static MachineOperand CreateImm(int64_t Val)
static MachineOperand CreateCPI(unsigned Idx, int Offset, unsigned TargetFlags=0)
bool isMBB() const
isMBB - Tests if this is a MO_MachineBasicBlock operand.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
LLVM_ABI Register createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
void enterBasicBlockEnd(MachineBasicBlock &MBB)
Start tracking liveness from the end of basic block MBB.
void setRegUsed(Register Reg, LaneBitmask LaneMask=LaneBitmask::getAll())
Tell the scavenger a register is used.
Register scavengeRegisterBackwards(const TargetRegisterClass &RC, MachineBasicBlock::iterator To, bool RestoreAfter, int SPAdj, bool AllowSpill=true)
Make a register of the specific register class available from the current position backwards to the p...
Wrapper class representing virtual and physical registers.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
const MCAsmInfo * getMCAsmInfo() const
Return target specific asm information.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
Target - Wrapper for Target specific information.
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
LLVM Value Representation.
static XtensaConstantPoolMBB * Create(LLVMContext &C, const MachineBasicBlock *M, unsigned ID)
XtensaConstantPoolValue - Xtensa specific constantpool value.
bool isBranch(const MachineBasicBlock::iterator &MI, SmallVectorImpl< MachineOperand > &Cond, const MachineOperand *&Target) const
void copyPhysReg(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, const DebugLoc &DL, Register DestReg, Register SrcReg, bool KillSrc, bool RenamableDest=false, bool RenamableSrc=false) const override
unsigned removeBranch(MachineBasicBlock &MBB, int *BytesRemoved=nullptr) const override
Register isStoreToStackSlot(const MachineInstr &MI, int &FrameIndex) const override
bool isBranchOffsetInRange(unsigned BranchOpc, int64_t BrOffset) const override
unsigned getInstSizeInBytes(const MachineInstr &MI) const override
void loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register DestReg, int FrameIdx, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI, Register VReg, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
bool reverseBranchCondition(SmallVectorImpl< MachineOperand > &Cond) const override
void insertIndirectBranch(MachineBasicBlock &MBB, MachineBasicBlock &DestBB, MachineBasicBlock &RestoreBB, const DebugLoc &DL, int64_t BrOffset=0, RegScavenger *RS=nullptr) const override
void adjustStackPtr(MCRegister SP, int64_t Amount, MachineBasicBlock &MBB, MachineBasicBlock::iterator I) const
Adjust SP by Amount bytes.
Register isLoadFromStackSlot(const MachineInstr &MI, int &FrameIndex) const override
unsigned insertConstBranchAtInst(MachineBasicBlock &MBB, MachineInstr *I, int64_t offset, ArrayRef< MachineOperand > Cond, DebugLoc DL, int *BytesAdded) const
unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, ArrayRef< MachineOperand > Cond, const DebugLoc &DL, int *BytesAdded=nullptr) const override
unsigned insertBranchAtInst(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, MachineBasicBlock *TBB, ArrayRef< MachineOperand > Cond, const DebugLoc &DL, int *BytesAdded) const
MachineBasicBlock * getBranchDestBlock(const MachineInstr &MI) const override
XtensaInstrInfo(const XtensaSubtarget &STI)
bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify) const override
void getLoadStoreOpcodes(const TargetRegisterClass *RC, unsigned &LoadOpcode, unsigned &StoreOpcode, int64_t offset) const
void loadImmediate(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, MCRegister *Reg, int64_t Value) const
void storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator MBBI, Register SrcReg, bool isKill, int FrameIndex, const TargetRegisterClass *RC, const TargetRegisterInfo *TRI, Register VReg, MachineInstr::MIFlag Flags=MachineInstr::NoFlags) const override
bool eliminateFrameIndex(MachineBasicBlock::iterator MI, int SPAdj, unsigned FIOperandNum, RegScavenger *RS=nullptr) const override
bool isWindowedABI() const
self_iterator getIterator()
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ C
The default llvm calling convention, compatible with C.
@ Kill
The last use of a register.
This is an optimization pass for GlobalISel generic memory operations.
@ Low
Lower the current thread's priority such that it does not affect foreground tasks significantly.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
static const MachineInstrBuilder & addFrameReference(const MachineInstrBuilder &MIB, int FI, int Offset=0, bool mem=true)
addFrameReference - This function is used to add a reference to the base of an abstract object on the...
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)
constexpr bool isIntN(unsigned N, int64_t x)
Checks if an signed integer fits into the given (dynamic) bit width.
This struct is a compact representation of a valid (non-zero power of two) alignment.
static LLVM_ABI MachinePointerInfo getFixedStack(MachineFunction &MF, int FI, int64_t Offset=0)
Return a MachinePointerInfo record that refers to the specified FrameIndex.