48 bool NonePrinted =
true;
80 bool NonePrinted =
true;
82 auto PrintFieldIfNotMax = [&](StringRef Descr,
uint64_t Num,
unsigned Max) {
99void AMDGPUMIRFormatter::printSWaitLoadcntDscntImm(
uint64_t Imm,
102 bool NonePrinted =
true;
104 auto PrintFieldIfNotMax = [&](StringRef Descr,
uint64_t Num,
unsigned Max) {
119void AMDGPUMIRFormatter::printAsyncStageMaskImm(int64_t
Imm,
149 std::optional<unsigned int> OpIdx, int64_t
Imm)
const {
151 switch (
MI.getOpcode()) {
152 case AMDGPU::ASYNCMARK:
153 case AMDGPU::WAIT_ASYNCMARK:
154 if (OpIdx ==
MI.getNumExplicitOperands() - 1u)
155 printAsyncStageMaskImm(
Imm, OS);
159 case AMDGPU::S_WAITCNT:
160 case AMDGPU::S_WAITCNT_soft:
161 printSWaitcntImm(
Imm, OS);
163 case AMDGPU::S_WAIT_LOADCNT_DSCNT:
164 printSWaitLoadcntDscntImm(
Imm, OS);
166 case AMDGPU::S_WAITCNT_DEPCTR:
167 printSWaitAluImm(
Imm, OS);
169 case AMDGPU::S_DELAY_ALU:
171 printSDelayAluImm(
Imm, OS);
182 const unsigned OpIdx,
188 case AMDGPU::S_WAITCNT:
189 case AMDGPU::S_WAITCNT_soft:
190 return parseSWaitcntImmMnemonic(OpIdx,
Imm, Src, ErrorCallback);
191 case AMDGPU::S_WAIT_LOADCNT_DSCNT:
192 return parseSWaitLoadcntDscntImmMnemonic(OpIdx,
Imm, Src, ErrorCallback);
193 case AMDGPU::S_WAITCNT_DEPCTR:
194 return parseSWaitAluImmMnemonic(OpIdx,
Imm, Src, ErrorCallback);
195 case AMDGPU::S_DELAY_ALU:
196 return parseSDelayAluImmMnemonic(OpIdx,
Imm, Src, ErrorCallback);
197 case AMDGPU::ASYNCMARK:
199 return parseAsyncStageMaskImmMnemonic(OpIdx,
Imm, Src, ErrorCallback);
201 case AMDGPU::WAIT_ASYNCMARK:
203 return parseAsyncStageMaskImmMnemonic(OpIdx,
Imm, Src, ErrorCallback);
211void AMDGPUMIRFormatter::printSDelayAluImm(int64_t
Imm,
216 constexpr int64_t
None = 0;
217 constexpr int64_t Same = 0;
219 uint64_t Id0 = (
Imm & 0xF);
220 uint64_t Skip = ((
Imm >> 4) & 0x7);
221 uint64_t Id1 = ((
Imm >> 7) & 0xF);
222 auto Outdep = [&](uint64_t Id) {
226 OS <<
"VALU_DEP_" << Id;
228 OS <<
"TRANS32_DEP_" << Id - 4;
230 OS <<
"SALU_CYCLE_" << Id - 8;
238 if (Skip == Same && Id1 ==
None)
248 OS <<
"SKIP_" << Skip - 1;
254bool AMDGPUMIRFormatter::parseSWaitcntImmMnemonic(
260 if (!Src.consumeInteger(10,
Imm))
271 return ErrorCallback(Src.begin(),
"expected prefix");
273 return ErrorCallback(Src.begin(),
"expected <CounterName>_<CounterNum>");
282 while (!Src.empty()) {
285 return ErrorCallback(Src.begin(),
"expected <CounterName>_<CounterNum>");
286 StringRef
Name = Src.substr(0, DelimIdx);
288 Src.consume_front(Name);
293 if (Src.consumeInteger(10, Num) || Num < 0)
294 return ErrorCallback(NumPos,
295 "expected non-negative integer counter number");
308 return ErrorCallback(NamePos,
"invalid counter name");
311 return ErrorCallback(NumPos,
"counter value too large");
320bool AMDGPUMIRFormatter::parseSWaitLoadcntDscntImmMnemonic(
326 if (!Src.consumeInteger(10,
Imm))
336 return ErrorCallback(Src.begin(),
"expected prefix");
338 return ErrorCallback(Src.begin(),
"expected <CounterName>_<CounterNum>");
347 while (!Src.empty()) {
350 return ErrorCallback(Src.begin(),
"expected <CounterName>_<CounterNum>");
351 StringRef
Name = Src.substr(0, DelimIdx);
353 Src.consume_front(Name);
358 if (Src.consumeInteger(10, Num) || Num < 0)
359 return ErrorCallback(NumPos,
360 "expected non-negative integer counter number");
370 return ErrorCallback(NamePos,
"invalid counter name");
373 return ErrorCallback(NumPos,
"counter value too large");
382bool AMDGPUMIRFormatter::parseSWaitAluImmMnemonic(
386 if (!Src.consumeInteger(10,
Imm))
395 return ErrorCallback(Src.begin(),
"expected prefix");
397 return ErrorCallback(Src.begin(),
"expected <CounterName>_<CounterNum>");
404 while (!Src.empty()) {
409 return ErrorCallback(Src.begin(),
"expected <CounterName>_<CounterNum>");
412 StringRef
Name = Src.substr(0, DelimIdx);
415 [[maybe_unused]]
bool ConsumeName = Src.consume_front(Name);
416 assert(ConsumeName &&
"Expected name");
417 [[maybe_unused]]
bool ConsumeDelim = Src.consume_front(
SWaitAluDelim);
418 assert(ConsumeDelim &&
"Expected delimiter");
427 if (Src.consumeInteger(10, Num) || Num < 0)
428 return ErrorCallback(NumPos,
429 "expected non-negative integer counter number");
454 return ErrorCallback(NamePos,
"invalid counter name");
458 return ErrorCallback(NumPos,
"counter value too large");
465bool AMDGPUMIRFormatter::parseSDelayAluImmMnemonic(
472 bool Expected = Src.consume_front(
".id0_");
474 return ErrorCallback(Src.begin(),
"Expected .id0_");
476 auto ExpectInt = [&](StringRef &Src, int64_t
Offset) -> int64_t {
478 if (!Src.consumeInteger(10, Dep))
484 auto DecodeDelay = [&](StringRef &Src) -> int64_t {
485 if (Src.consume_front(
"NONE"))
487 if (Src.consume_front(
"VALU_DEP_"))
488 return ExpectInt(Src, 0);
489 if (Src.consume_front(
"TRANS32_DEP_"))
490 return ExpectInt(Src, 4);
491 if (Src.consume_front(
"SALU_CYCLE_"))
492 return ExpectInt(Src, 8);
497 int64_t Delay0 = DecodeDelay(Src);
501 return ErrorCallback(Src.begin(),
"Could not decode delay0");
509 if (Src.begin() == Src.end())
512 Expected = Src.consume_front(
"_skip_");
514 return ErrorCallback(Src.begin(),
"Expected _skip_");
517 if (Src.consume_front(
"SAME")) {
519 }
else if (Src.consume_front(
"NEXT")) {
521 }
else if (Src.consume_front(
"SKIP_")) {
522 if (Src.consumeInteger(10, Skip)) {
523 return ErrorCallback(Src.begin(),
"Expected integer Skip value");
527 ErrorCallback(Src.begin(),
"Unexpected Skip Value");
530 Expected = Src.consume_front(
"_id1_");
532 return ErrorCallback(Src.begin(),
"Expected _id1_");
534 Delay1 = DecodeDelay(Src);
536 return ErrorCallback(Src.begin(),
"Could not decode delay1");
544bool AMDGPUMIRFormatter::parseAsyncStageMaskImmMnemonic(
547 if (!Src.consumeInteger(10,
Imm))
551 return ErrorCallback(Src.begin(),
"expected prefix");
553 return ErrorCallback(Src.begin(),
"expected <StageName>");
561 while (!Src.empty()) {
564 Src.consume_front(Name);
571 if (
Bits.getAsInteger(16, Mask) ||
Bits.empty() || !Mask)
572 return ErrorCallback(NamePos,
"invalid async stage mask");
574 return ErrorCallback(NamePos,
"async stage mask out of range");
576 return ErrorCallback(NamePos,
577 "async stage mask names a non-reserved stage");
584 return ErrorCallback(NamePos,
"invalid async stage name");
599 if (Src ==
"GWSResource") {
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
Shared AMDGPU asyncmark stage definitions.
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)
StringRef getAsyncStageName(AsyncStages Stage)
unsigned encodeLoadcntDscnt(const IsaVersion &Version, const Waitcnt &Decoded)
constexpr bool isValidAsyncStageMask(int64_t Mask)
AsyncStages
Bit mask of the async stages tracked by the asyncmark / wait_asyncmark intrinsics.
LLVM_ABI IsaVersion getIsaVersion(StringRef GPU)
constexpr StringLiteral AsyncStageNames[NumAsyncStages]
The name of each stage, indexed by the position of its bit.
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)
auto asyncStages(AsyncStages Mask)
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)
constexpr bool any(E Val)
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
This is an optimization pass for GlobalISel generic memory operations.
auto find(R &&Range, const T &Val)
Provide wrappers to std::find which take ranges instead of having to pass begin/end explicitly.
constexpr std::underlying_type_t< Enum > to_underlying(Enum E)
Returns underlying integer value of an enum.
FormattedNumber format_hex_no_prefix(uint64_t N, unsigned Width, bool Upper=false)
format_hex_no_prefix - Output N as a fixed width hexadecimal.