41#include "AMDGPUGenMCPseudoLowering.inc"
46 Ctx(ctx), ST(st), AP(ap) { }
128 unsigned Opcode =
MI->getOpcode();
131 const auto *
Info = AMDGPU::getT16D16Helper(Opcode);
133 llvm::AMDGPU::OpName
OpName;
134 if (
TII->isDS(Opcode)) {
136 OpName = llvm::AMDGPU::OpName::vdst;
137 else if (
MI->mayStore())
138 OpName = llvm::AMDGPU::OpName::data0;
143 ? llvm::AMDGPU::OpName::vdata
144 : llvm::AMDGPU::OpName::vdst;
148 int VDstOrVDataIdx = AMDGPU::getNamedOperandIdx(Opcode,
OpName);
153 Opcode = IsHi ?
Info->HiOp :
Info->LoOp;
155 int MCOpcode =
TII->pseudoToMCOpcode(Opcode);
157 "Pseudo instruction doesn't have a target-specific version");
161 for (
int I = 0, E =
MI->getNumExplicitOperands();
I < E;
I++) {
164 if (
I == VDstOrVDataIdx)
179 unsigned Opcode =
MI->getOpcode();
185 if (Opcode == AMDGPU::S_SETPC_B64_return)
186 Opcode = AMDGPU::S_SETPC_B64;
187 else if (Opcode == AMDGPU::SI_CALL) {
190 OutMI.
setOpcode(
TII->pseudoToMCOpcode(AMDGPU::S_SWAPPC_B64));
197 }
else if (Opcode == AMDGPU::SI_TCRETURN ||
198 Opcode == AMDGPU::SI_TCRETURN_GFX) {
200 Opcode = AMDGPU::S_SETPC_B64;
201 }
else if (AMDGPU::getT16D16Helper(Opcode)) {
206 int MCOpcode =
TII->pseudoToMCOpcode(Opcode);
207 if (MCOpcode == -1) {
208 LLVMContext &
C =
MI->getParent()->getParent()->getFunction().getContext();
209 C.emitError(
"AMDGPUMCInstLower::lower - Pseudo instruction doesn't have "
210 "a target-specific version: " +
Twine(
MI->getOpcode()));
221 int FIIdx = AMDGPU::getNamedOperandIdx(MCOpcode, AMDGPU::OpName::fi);
230 return MCInstLowering.lowerOperand(MO, MCOp);
238 if (
const GlobalVariable *GV = dyn_cast<const GlobalVariable>(CV)) {
239 if (std::optional<uint32_t>
Address =
262 TII->getNamedOperand(*
MI,
MI->mayLoad() ? AMDGPU::OpName::vdst
263 : AMDGPU::OpName::vdata)
265 Register FirstRegInBlock =
TRI->getSubReg(RegBlock, AMDGPU::sub0);
272 for (
unsigned I = 0;
I <
sizeof(Mask) * 8; ++
I) {
273 if (Mask & (1 <<
I)) {
275 .toVector(TransferredRegs);
279 OS.emitRawComment(
" transferring at most " + TransferredRegs);
297 LLVMContext &
C =
MI->getParent()->getParent()->getFunction().getContext();
298 C.emitError(
"Illegal instruction detected: " + Err);
302 if (
MI->isBundle()) {
313 if (
MI->getOpcode() == AMDGPU::SI_RETURN_TO_EPILOG) {
315 OutStreamer->emitRawComment(
" return to shader part epilog");
319 if (
MI->getOpcode() == AMDGPU::WAVE_BARRIER) {
325 if (
MI->getOpcode() == AMDGPU::SCHED_BARRIER) {
327 std::string HexString;
329 HexStream <<
format_hex(
MI->getOperand(0).getImm(), 10,
true);
330 OutStreamer->emitRawComment(
" sched_barrier mask(" + HexString +
")");
335 if (
MI->getOpcode() == AMDGPU::SCHED_GROUP_BARRIER) {
337 std::string HexString;
339 HexStream <<
format_hex(
MI->getOperand(0).getImm(), 10,
true);
341 " sched_group_barrier mask(" + HexString +
") size(" +
342 Twine(
MI->getOperand(1).getImm()) +
") SyncID(" +
343 Twine(
MI->getOperand(2).getImm()) +
")");
348 if (
MI->getOpcode() == AMDGPU::IGLP_OPT) {
350 std::string HexString;
352 HexStream <<
format_hex(
MI->getOperand(0).getImm(), 10,
true);
353 OutStreamer->emitRawComment(
" iglp_opt mask(" + HexString +
")");
358 if (
MI->getOpcode() == AMDGPU::SI_MASKED_UNREACHABLE) {
360 OutStreamer->emitRawComment(
" divergent unreachable");
364 if (
MI->isMetaInstruction()) {
377 MCInstLowering.lower(
MI, TmpInst);
380#ifdef EXPENSIVE_CHECKS
389 if (!
MI->isPseudo() && STI.isCPUStringValid(STI.getCPU()) &&
396 InstEmitter->encodeInstruction(TmpInst, CodeBytes, Fixups, STI);
402 if (DumpCodeInstEmitter) {
419 std::string &HexLine =
HexLines.back();
422 for (
size_t i = 0; i < CodeBytes.
size(); i += 4) {
423 unsigned int CodeDWord =
425 HexStream <<
format(
"%s%08X", (i > 0 ?
" " :
""), CodeDWord);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
AMDGPU Assembly printer class.
static void emitVGPRBlockComment(const MachineInstr *MI, const SIInstrInfo *TII, const TargetRegisterInfo *TRI, const SIMachineFunctionInfo *MFI, MCStreamer &OS)
Header of lower AMDGPU MachineInstrs to their corresponding MCInst.
Provides AMDGPU specific target descriptions.
Analysis containing CSE Info
This file contains the declarations for the subclasses of Constant, which represent the different fla...
const HexagonInstrInfo * TII
Register const TargetRegisterInfo * TRI
static SDValue lowerAddrSpaceCast(SDValue Op, SelectionDAG &DAG)
std::vector< std::string > DisasmLines
std::vector< std::string > HexLines
bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp) const
Wrapper for MCInstLowering.lowerOperand() for the tblgen'erated pseudo lowering.
bool lowerPseudoInstExpansion(const MachineInstr *MI, MCInst &Inst)
tblgen'erated driver function for lowering simple MI->MC pseudo instructions.
const MCExpr * lowerConstant(const Constant *CV, const Constant *BaseCV, uint64_t Offset) override
Lower the specified LLVM Constant to an MCExpr.
void emitInstruction(const MachineInstr *MI) override
Implemented in AMDGPUMCInstLower.cpp.
void printInst(const MCInst *MI, uint64_t Address, StringRef Annot, const MCSubtargetInfo &STI, raw_ostream &O) override
Print the specified MCInst to the specified raw_ostream.
bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp) const
void lowerT16D16Helper(const MachineInstr *MI, MCInst &OutMI) const
AMDGPUMCInstLower(MCContext &ctx, const TargetSubtargetInfo &ST, const AsmPrinter &AP)
void lower(const MachineInstr *MI, MCInst &OutMI) const
Lower a MachineInstr to an MCInst.
static std::optional< uint32_t > getLDSAbsoluteAddress(const GlobalValue &GV)
This class is intended to be used as a driving class for all asm writers.
void EmitToStreamer(MCStreamer &S, const MCInst &Inst)
TargetMachine & TM
Target machine description.
MachineFunction * MF
The current machine function.
virtual const MCExpr * lowerConstant(const Constant *CV, const Constant *BaseCV=nullptr, uint64_t Offset=0)
Lower the specified LLVM Constant to an MCExpr.
MCContext & OutContext
This is the context for the output file that we are streaming.
std::unique_ptr< MCStreamer > OutStreamer
This is the MCStreamer object for the file we are generating.
bool isVerbose() const
Return true if assembly output should contain comments.
void getNameWithPrefix(SmallVectorImpl< char > &Name, const GlobalValue *GV) const
This is an important base class in LLVM.
const SIInstrInfo * getInstrInfo() const override
bool hasOffset3fBug() const
const SIRegisterInfo * getRegisterInfo() const override
This is an important class for using LLVM in a threaded context.
static const MCBinaryExpr * createAdd(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx, SMLoc Loc=SMLoc())
virtual void encodeInstruction(const MCInst &Inst, SmallVectorImpl< char > &CB, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const =0
Encode the given Inst to bytes and append to CB.
static LLVM_ABI const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
Context object for machine code objects.
LLVM_ABI MCSymbol * getOrCreateSymbol(const Twine &Name)
Lookup the symbol inside with the specified Name.
Base class for the full range of assembler expressions which are needed for parsing.
Instances of this class represent a single low-level machine instruction.
unsigned getNumOperands() const
void addOperand(const MCOperand Op)
void setOpcode(unsigned Op)
Instances of this class represent operands of the MCInst class.
static MCOperand createExpr(const MCExpr *Val)
static MCOperand createReg(MCRegister Reg)
static MCOperand createImm(int64_t Val)
Streaming machine code generation interface.
Generic base class for all target subtargets.
Represent a reference to a symbol from inside an expression.
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx, SMLoc Loc=SMLoc())
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
LLVM_ABI MCSymbol * getSymbol() const
Return the MCSymbol for this basic block.
instr_iterator instr_end()
Instructions::const_iterator const_instr_iterator
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
Ty * getInfo()
getInfo - Keep track of various per-function pieces of information for backends that would like to do...
Representation of each machine instruction.
MachineOperand class - Representation of each machine instruction operand.
const GlobalValue * getGlobal() const
MachineBasicBlock * getMBB() const
unsigned getTargetFlags() const
MachineOperandType getType() const
getType - Returns the MachineOperandType for this operand.
const char * getSymbolName() const
Register getReg() const
getReg - Returns the register number.
MCSymbol * getMCSymbol() const
@ MO_Immediate
Immediate operand.
@ MO_MCSymbol
MCSymbol reference (for debug/eh info)
@ MO_GlobalAddress
Address of a global value.
@ MO_RegisterMask
Mask of preserved registers.
@ MO_MachineBasicBlock
MachineBasicBlock reference.
@ MO_Register
Register operand.
@ MO_ExternalSymbol
Name of external global symbol.
int64_t getOffset() const
Return the offset from the symbol in this operand.
virtual void print(raw_ostream &OS, const Module *M) const
print - Print out the internal state of the pass.
Wrapper class representing virtual and physical registers.
unsigned getInstSizeInBytes(const MachineInstr &MI) const override
static bool isBlockLoadStore(uint16_t Opcode)
bool verifyInstruction(const MachineInstr &MI, StringRef &ErrInfo) const override
This class keeps track of the SPI_SP_INPUT_ADDR config register, which tells the hardware which inter...
uint32_t getMaskForVGPRBlockOps(Register RegisterBlock) const
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
pointer data()
Return a pointer to the vector's buffer, even if empty().
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.
const MCAsmInfo * getMCAsmInfo() const
Return target specific asm information.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
TargetSubtargetInfo - Generic base class for all target subtargets.
virtual const TargetInstrInfo * getInstrInfo() const
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
A raw_ostream that writes to an std::string.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
MCRegister getMCReg(MCRegister Reg, const MCSubtargetInfo &STI)
If Reg is a pseudo reg, return the correct hardware register given STI otherwise return Reg.
bool isHi16Reg(MCRegister Reg, const MCRegisterInfo &MRI)
LLVM_READONLY bool hasNamedOperand(uint64_t Opcode, OpName NamedIdx)
@ C
The default llvm calling convention, compatible with C.
uint32_t read32le(const void *P)
This is an optimization pass for GlobalISel generic memory operations.
FormattedNumber format_hex(uint64_t N, unsigned Width, bool Upper=false)
format_hex - Output N as a fixed width hexadecimal.
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
static uint16_t getSpecifier(const MCSymbolRefExpr *SRE)
MCCodeEmitter * createAMDGPUMCCodeEmitter(const MCInstrInfo &MCII, MCContext &Ctx)