41 bool NonePrinted =
true;
73 bool NonePrinted =
true;
75 auto PrintFieldIfNotMax = [&](StringRef Descr,
uint64_t Num,
unsigned Max) {
92void AMDGPUMIRFormatter::printSWaitLoadcntDscntImm(
uint64_t Imm,
95 bool NonePrinted =
true;
97 auto PrintFieldIfNotMax = [&](StringRef Descr,
uint64_t Num,
unsigned Max) {
113 std::optional<unsigned int> OpIdx, int64_t
Imm)
const {
115 switch (
MI.getOpcode()) {
116 case AMDGPU::S_WAITCNT:
117 case AMDGPU::S_WAITCNT_soft:
118 printSWaitcntImm(
Imm, OS);
120 case AMDGPU::S_WAIT_LOADCNT_DSCNT:
121 printSWaitLoadcntDscntImm(
Imm, OS);
123 case AMDGPU::S_WAITCNT_DEPCTR:
124 printSWaitAluImm(
Imm, OS);
126 case AMDGPU::S_DELAY_ALU:
128 printSDelayAluImm(
Imm, OS);
139 const unsigned OpIdx,
145 case AMDGPU::S_WAITCNT:
146 case AMDGPU::S_WAITCNT_soft:
147 return parseSWaitcntImmMnemonic(OpIdx,
Imm, Src, ErrorCallback);
148 case AMDGPU::S_WAIT_LOADCNT_DSCNT:
149 return parseSWaitLoadcntDscntImmMnemonic(OpIdx,
Imm, Src, ErrorCallback);
150 case AMDGPU::S_WAITCNT_DEPCTR:
151 return parseSWaitAluImmMnemonic(OpIdx,
Imm, Src, ErrorCallback);
152 case AMDGPU::S_DELAY_ALU:
153 return parseSDelayAluImmMnemonic(OpIdx,
Imm, Src, ErrorCallback);
160void AMDGPUMIRFormatter::printSDelayAluImm(int64_t
Imm,
165 constexpr int64_t
None = 0;
166 constexpr int64_t Same = 0;
168 uint64_t Id0 = (
Imm & 0xF);
169 uint64_t Skip = ((
Imm >> 4) & 0x7);
170 uint64_t Id1 = ((
Imm >> 7) & 0xF);
171 auto Outdep = [&](uint64_t Id) {
175 OS <<
"VALU_DEP_" << Id;
177 OS <<
"TRANS32_DEP_" << Id - 4;
179 OS <<
"SALU_CYCLE_" << Id - 8;
187 if (Skip == Same && Id1 ==
None)
197 OS <<
"SKIP_" << Skip - 1;
203bool AMDGPUMIRFormatter::parseSWaitcntImmMnemonic(
209 if (!Src.consumeInteger(10,
Imm))
220 return ErrorCallback(Src.begin(),
"expected prefix");
222 return ErrorCallback(Src.begin(),
"expected <CounterName>_<CounterNum>");
231 while (!Src.empty()) {
234 return ErrorCallback(Src.begin(),
"expected <CounterName>_<CounterNum>");
235 StringRef
Name = Src.substr(0, DelimIdx);
237 Src.consume_front(Name);
242 if (Src.consumeInteger(10, Num) || Num < 0)
243 return ErrorCallback(NumPos,
244 "expected non-negative integer counter number");
257 return ErrorCallback(NamePos,
"invalid counter name");
260 return ErrorCallback(NumPos,
"counter value too large");
269bool AMDGPUMIRFormatter::parseSWaitLoadcntDscntImmMnemonic(
275 if (!Src.consumeInteger(10,
Imm))
285 return ErrorCallback(Src.begin(),
"expected prefix");
287 return ErrorCallback(Src.begin(),
"expected <CounterName>_<CounterNum>");
296 while (!Src.empty()) {
299 return ErrorCallback(Src.begin(),
"expected <CounterName>_<CounterNum>");
300 StringRef
Name = Src.substr(0, DelimIdx);
302 Src.consume_front(Name);
307 if (Src.consumeInteger(10, Num) || Num < 0)
308 return ErrorCallback(NumPos,
309 "expected non-negative integer counter number");
319 return ErrorCallback(NamePos,
"invalid counter name");
322 return ErrorCallback(NumPos,
"counter value too large");
331bool AMDGPUMIRFormatter::parseSWaitAluImmMnemonic(
335 if (!Src.consumeInteger(10,
Imm))
344 return ErrorCallback(Src.begin(),
"expected prefix");
346 return ErrorCallback(Src.begin(),
"expected <CounterName>_<CounterNum>");
353 while (!Src.empty()) {
358 return ErrorCallback(Src.begin(),
"expected <CounterName>_<CounterNum>");
361 StringRef
Name = Src.substr(0, DelimIdx);
364 [[maybe_unused]]
bool ConsumeName = Src.consume_front(Name);
365 assert(ConsumeName &&
"Expected name");
366 [[maybe_unused]]
bool ConsumeDelim = Src.consume_front(
SWaitAluDelim);
367 assert(ConsumeDelim &&
"Expected delimiter");
376 if (Src.consumeInteger(10, Num) || Num < 0)
377 return ErrorCallback(NumPos,
378 "expected non-negative integer counter number");
403 return ErrorCallback(NamePos,
"invalid counter name");
407 return ErrorCallback(NumPos,
"counter value too large");
414bool AMDGPUMIRFormatter::parseSDelayAluImmMnemonic(
421 bool Expected = Src.consume_front(
".id0_");
423 return ErrorCallback(Src.begin(),
"Expected .id0_");
425 auto ExpectInt = [&](StringRef &Src, int64_t
Offset) -> int64_t {
427 if (!Src.consumeInteger(10, Dep))
433 auto DecodeDelay = [&](StringRef &Src) -> int64_t {
434 if (Src.consume_front(
"NONE"))
436 if (Src.consume_front(
"VALU_DEP_"))
437 return ExpectInt(Src, 0);
438 if (Src.consume_front(
"TRANS32_DEP_"))
439 return ExpectInt(Src, 4);
440 if (Src.consume_front(
"SALU_CYCLE_"))
441 return ExpectInt(Src, 8);
446 int64_t Delay0 = DecodeDelay(Src);
450 return ErrorCallback(Src.begin(),
"Could not decode delay0");
458 if (Src.begin() == Src.end())
461 Expected = Src.consume_front(
"_skip_");
463 return ErrorCallback(Src.begin(),
"Expected _skip_");
466 if (Src.consume_front(
"SAME")) {
468 }
else if (Src.consume_front(
"NEXT")) {
470 }
else if (Src.consume_front(
"SKIP_")) {
471 if (Src.consumeInteger(10, Skip)) {
472 return ErrorCallback(Src.begin(),
"Expected integer Skip value");
476 ErrorCallback(Src.begin(),
"Unexpected Skip Value");
479 Expected = Src.consume_front(
"_id1_");
481 return ErrorCallback(Src.begin(),
"Expected _id1_");
483 Delay1 = DecodeDelay(Src);
485 return ErrorCallback(Src.begin(),
"Could not decode delay1");
497 if (Src ==
"GWSResource") {
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
A helper class to return the specified delimiter string after the first invocation of operator String...
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
Representation of each machine instruction.
Special value supplied for machine level alias analysis.
This class keeps track of the SPI_SP_INPUT_ADDR config register, which tells the hardware which inter...
const AMDGPUGWSResourcePseudoSourceValue * getGWSPSV(const AMDGPUTargetMachine &TM)
A wrapper around a string literal that serves as a proxy for constructing global tables of StringRefs...
Represent a constant reference to a string, i.e.
static constexpr size_t npos
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned decodeFieldVaVcc(unsigned Encoded)
unsigned encodeFieldVaVcc(unsigned Encoded, unsigned VaVcc)
unsigned decodeFieldHoldCnt(unsigned Encoded, const IsaVersion &Version)
unsigned getVaVccBitMask()
unsigned encodeFieldHoldCnt(unsigned Encoded, unsigned HoldCnt, const IsaVersion &Version)
unsigned getVmVsrcBitMask()
unsigned encodeFieldVaSsrc(unsigned Encoded, unsigned VaSsrc)
unsigned encodeFieldVaVdst(unsigned Encoded, unsigned VaVdst)
unsigned decodeFieldSaSdst(unsigned Encoded)
unsigned getHoldCntBitMask(const IsaVersion &Version)
unsigned decodeFieldVaSdst(unsigned Encoded)
unsigned getVaVdstBitMask()
unsigned getVaSsrcBitMask()
unsigned encodeFieldVmVsrc(unsigned Encoded, unsigned VmVsrc)
unsigned getVaSdstBitMask()
unsigned decodeFieldVaSsrc(unsigned Encoded)
unsigned encodeFieldSaSdst(unsigned Encoded, unsigned SaSdst)
unsigned decodeFieldVaVdst(unsigned Encoded)
unsigned getSaSdstBitMask()
int getDefaultDepCtrEncoding(const MCSubtargetInfo &STI)
unsigned decodeFieldVmVsrc(unsigned Encoded)
unsigned encodeFieldVaSdst(unsigned Encoded, unsigned VaSdst)
unsigned encodeLoadcntDscnt(const IsaVersion &Version, const Waitcnt &Decoded)
LLVM_ABI IsaVersion getIsaVersion(StringRef GPU)
unsigned encodeWaitcnt(const IsaVersion &Version, const Waitcnt &Decoded)
unsigned decodeLgkmcnt(const IsaVersion &Version, unsigned Waitcnt)
unsigned getVmcntBitMask(const IsaVersion &Version)
unsigned getLgkmcntBitMask(const IsaVersion &Version)
unsigned decodeDscnt(const IsaVersion &Version, unsigned Waitcnt)
unsigned getExpcntBitMask(const IsaVersion &Version)
unsigned decodeExpcnt(const IsaVersion &Version, unsigned Waitcnt)
unsigned decodeVmcnt(const IsaVersion &Version, unsigned Waitcnt)
unsigned getLoadcntBitMask(const IsaVersion &Version)
unsigned decodeLoadcnt(const IsaVersion &Version, unsigned Waitcnt)
unsigned getDscntBitMask(const IsaVersion &Version)
This is an optimization pass for GlobalISel generic memory operations.