44#define DEBUG_TYPE "amdgpu-disassembler"
47 (isGFX10Plus() ? AMDGPU::EncValues::SGPR_MAX_GFX10 \
48 : AMDGPU::EncValues::SGPR_MAX_SI)
60 MAI(Ctx.getAsmInfo()),
62 TargetMaxInstBytes(MAI.getMaxInstLength(&
STI)),
63 CodeObjectVersion(
AMDGPU::getDefaultAMDHSACodeObjectVersion()) {
65 if (!
STI.hasFeature(AMDGPU::FeatureGCN3Encoding) && !
isGFX10Plus())
69 createConstantSymbolExpr(Symbol, Code);
71 UCVersionW64Expr = createConstantSymbolExpr(
"UC_VERSION_W64_BIT", 0x2000);
72 UCVersionW32Expr = createConstantSymbolExpr(
"UC_VERSION_W32_BIT", 0x4000);
73 UCVersionMDPExpr = createConstantSymbolExpr(
"UC_VERSION_MDP_BIT", 0x8000);
81 unsigned EFlags)
const {
82 OS <<
"\t.amdgcn_target \""
89#define X(NUM, ENUM, NAME) \
104 switch (SrameccSetting) {
126 XnackOnFromEFlags =
true;
143 AMDGPU::OpName Name) {
144 int OpIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(), Name);
146 auto *
I =
MI.begin();
147 std::advance(
I, OpIdx);
161 if (DAsm->tryAddingSymbolicOperand(Inst,
Offset, Addr,
true, 2, 2, 0))
170 if (DAsm->isGFX12Plus()) {
172 }
else if (DAsm->isVI()) {
183 return addOperand(Inst, DAsm->decodeBoolReg(Inst, Val));
190 return addOperand(Inst, DAsm->decodeSplitBarrier(Inst, Val));
196 return addOperand(Inst, DAsm->decodeDpp8FI(Val));
199#define DECODE_OPERAND(StaticDecoderName, DecoderName) \
200 static DecodeStatus StaticDecoderName(MCInst &Inst, unsigned Imm, \
202 const MCDisassembler *Decoder) { \
203 auto DAsm = static_cast<const AMDGPUDisassembler *>(Decoder); \
204 return addOperand(Inst, DAsm->DecoderName(Imm)); \
209#define DECODE_OPERAND_REG_8(RegClass) \
210 static DecodeStatus Decode##RegClass##RegisterClass( \
211 MCInst &Inst, unsigned Imm, uint64_t , \
212 const MCDisassembler *Decoder) { \
213 assert(Imm < (1 << 8) && "8-bit encoding"); \
214 auto DAsm = static_cast<const AMDGPUDisassembler *>(Decoder); \
216 Inst, DAsm->createRegOperand(AMDGPU::RegClass##RegClassID, Imm)); \
219#define DECODE_SrcOp(Name, EncSize, OpWidth, EncImm) \
220 static DecodeStatus Name(MCInst &Inst, unsigned Imm, uint64_t , \
221 const MCDisassembler *Decoder) { \
222 if (!isUInt<EncSize>(Imm)) \
223 return MCDisassembler::Fail; \
224 auto DAsm = static_cast<const AMDGPUDisassembler *>(Decoder); \
225 return addOperand(Inst, DAsm->decodeSrcOp(Inst, OpWidth, EncImm)); \
229 unsigned OpWidth,
unsigned Imm,
unsigned EncImm,
231 assert(
Imm < (1U << EncSize) &&
"Operand doesn't fit encoding!");
233 return addOperand(Inst, DAsm->decodeSrcOp(Inst, OpWidth, EncImm));
238#define DECODE_OPERAND_SREG_7(RegClass, OpWidth) \
239 DECODE_SrcOp(Decode##RegClass##RegisterClass, 7, OpWidth, Imm)
241#define DECODE_OPERAND_SREG_8(RegClass, OpWidth) \
242 DECODE_SrcOp(Decode##RegClass##RegisterClass, 8, OpWidth, Imm)
248template <
unsigned OpW
idth>
256template <
unsigned OpW
idth>
266template <
unsigned OpW
idth>
278template <
unsigned OpW
idth>
294template <
unsigned OpW
idth>
303template <
unsigned OpW
idth>
355 assert((
Imm & (1 << 8)) == 0 &&
"Imm{8} should not be used");
357 bool IsHi =
Imm & (1 << 9);
358 unsigned RegIdx =
Imm & 0xff;
360 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
368 bool IsHi =
Imm & (1 << 7);
369 unsigned RegIdx =
Imm & 0x7f;
371 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
374template <
unsigned OpW
idth>
382 bool IsHi =
Imm & (1 << 7);
383 unsigned RegIdx =
Imm & 0x7f;
384 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
386 return addOperand(Inst, DAsm->decodeNonVGPRSrcOp(Inst, OpWidth,
Imm & 0xFF));
389template <
unsigned OpW
idth>
397 bool IsHi =
Imm & (1 << 9);
398 unsigned RegIdx =
Imm & 0xff;
399 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
401 return addOperand(Inst, DAsm->decodeNonVGPRSrcOp(Inst, OpWidth,
Imm & 0xFF));
413 bool IsHi =
Imm & (1 << 9);
414 unsigned RegIdx =
Imm & 0xff;
415 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
422 return addOperand(Inst, DAsm->decodeMandatoryLiteralConstant(
Imm));
429 return addOperand(Inst, DAsm->decodeMandatoryLiteral64Constant(
Imm));
435 return addOperand(Inst, DAsm->decodeVOPDDstYOp(Inst, Val));
441 return addOperand(Inst, DAsm->decodeSrcOp(Inst, Opw,
Imm | 256));
444template <
unsigned Opw>
454 assert(
Imm < (1 << 9) &&
"9-bit encoding");
459#define DECODE_SDWA(DecName) \
460DECODE_OPERAND(decodeSDWA##DecName, decodeSDWA##DecName)
466#define DECODE_SDWA_IMM_FIELD(Name, MaxImm) \
467 static DecodeStatus Name(MCInst &Inst, unsigned Imm, uint64_t , \
468 const MCDisassembler * ) { \
469 if (Imm > (MaxImm)) \
470 return MCDisassembler::Fail; \
471 return addOperand(Inst, MCOperand::createImm(Imm)); \
479 AMDGPU::SDWA::DstUnused::UNUSED_PRESERVE)
480#undef DECODE_SDWA_IMM_FIELD
489#include "AMDGPUGenDisassemblerTables.inc"
493template <>
constexpr uint32_t InsnBitWidth<uint32_t> = 32;
494template <>
constexpr uint32_t InsnBitWidth<uint64_t> = 64;
495template <>
constexpr uint32_t InsnBitWidth<std::bitset<96>> = 96;
496template <>
constexpr uint32_t InsnBitWidth<std::bitset<128>> = 128;
503template <
typename InsnType>
505 InsnType Inst, uint64_t
Address,
511 const auto SavedBytes = Bytes;
526 Comments << LocalComments;
533template <
typename InsnType>
538 for (
const uint8_t *
T : {Table1, Table2}) {
549 Bytes = Bytes.
slice(
sizeof(
T));
557 Bytes = Bytes.
slice(8);
559 Bytes = Bytes.
slice(4);
560 return (
Hi << 64) |
Lo;
567 Bytes = Bytes.
slice(8);
569 Bytes = Bytes.
slice(8);
570 return (
Hi << 64) |
Lo;
573bool AMDGPUDisassembler::decodeImmOperands(
MCInst &
MI,
575 const MCInstrDesc &
Desc = MCII.get(
MI.getOpcode());
577 if (OpNo >=
MI.getNumOperands())
587 MCOperand &
Op =
MI.getOperand(OpNo);
590 int64_t
Imm =
Op.getImm();
606 switch (OpDesc.OperandType) {
627 Imm = (F16Val << 16) | (F16Val & 0xFFFF);
655 unsigned MaxInstBytesNum = std::min((
size_t)TargetMaxInstBytes, Bytes_.
size());
656 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
660 Size = std::min((
size_t)4, Bytes_.
size());
672 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
707 if (
STI.hasFeature(AMDGPU::Feature64BitLiterals)) {
709 Bytes = Bytes_.
slice(4, MaxInstBytesNum - 4);
717 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
719 }
else if (Bytes.size() >= 16 &&
720 STI.hasFeature(AMDGPU::FeatureGFX950Insts)) {
726 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
729 if (Bytes.size() >= 8) {
732 if (
STI.hasFeature(AMDGPU::FeatureGFX10_BEncoding) &&
736 if (
STI.hasFeature(AMDGPU::FeatureUnpackedD16VMem) &&
740 if (
STI.hasFeature(AMDGPU::FeatureGFX950Insts) &&
747 if (
STI.hasFeature(AMDGPU::FeatureFmaMixInsts) &&
751 if (
STI.hasFeature(AMDGPU::FeatureGFX940Insts) &&
755 if (
STI.hasFeature(AMDGPU::FeatureGFX90AInsts) &&
807 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
811 if (Bytes.size() >= 4) {
824 if (
STI.hasFeature(AMDGPU::FeatureGFX950Insts) &&
828 if (
STI.hasFeature(AMDGPU::FeatureGFX90AInsts) &&
832 if (
STI.hasFeature(AMDGPU::FeatureGFX10_BEncoding) &&
880 else if (AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::dpp8) !=
892 AMDGPU::OpName::src2_modifiers);
895 if (
MI.getOpcode() == AMDGPU::V_CVT_SR_BF8_F32_e64_dpp ||
896 MI.getOpcode() == AMDGPU::V_CVT_SR_FP8_F32_e64_dpp) {
899 AMDGPU::OpName::src2_modifiers);
908 int CPolPos = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
909 AMDGPU::OpName::cpol);
913 if (
MI.getNumOperands() <= (
unsigned)CPolPos) {
915 AMDGPU::OpName::cpol);
917 MI.getOperand(CPolPos).setImm(
MI.getOperand(CPolPos).getImm() | CPol);
923 (
STI.hasFeature(AMDGPU::FeatureGFX90AInsts))) {
926 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::tfe);
927 if (TFEOpIdx != -1) {
928 auto *TFEIter =
MI.begin();
929 std::advance(TFEIter, TFEOpIdx);
937 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::offset);
938 if (OffsetIdx != -1) {
941 if (SignedOffset < 0)
948 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::swz);
949 if (SWZOpIdx != -1) {
950 auto *SWZIter =
MI.begin();
951 std::advance(SWZIter, SWZOpIdx);
959 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vaddr0);
961 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::srsrc);
962 unsigned NSAArgs = RsrcIdx - VAddr0Idx - 1;
963 if (VAddr0Idx >= 0 && NSAArgs > 0) {
964 unsigned NSAWords = (NSAArgs + 3) / 4;
965 if (Bytes.size() < 4 * NSAWords)
967 for (
unsigned i = 0; i < NSAArgs; ++i) {
968 const unsigned VAddrIdx = VAddr0Idx + 1 + i;
970 MCII->getOpRegClassID(
Desc.operands()[VAddrIdx], HwModeRegClass);
973 Bytes = Bytes.slice(4 * NSAWords);
997 int VDstIn_Idx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
998 AMDGPU::OpName::vdst_in);
999 if (VDstIn_Idx != -1) {
1000 int Tied = MCII->get(
MI.getOpcode()).getOperandConstraint(VDstIn_Idx,
1002 if (Tied != -1 && (
MI.getNumOperands() <= (
unsigned)VDstIn_Idx ||
1003 !
MI.getOperand(VDstIn_Idx).isReg() ||
1004 MI.getOperand(VDstIn_Idx).getReg() !=
MI.getOperand(Tied).getReg())) {
1005 if (
MI.getNumOperands() > (
unsigned)VDstIn_Idx)
1006 MI.erase(&
MI.getOperand(VDstIn_Idx));
1009 AMDGPU::OpName::vdst_in);
1021 MCII->get(
MI.getOpcode()).getNumDefs() == 0 &&
1022 MCII->get(
MI.getOpcode()).hasImplicitDefOfPhysReg(AMDGPU::EXEC)) {
1023 auto ExecEncoding = MRI.getEncodingValue(AMDGPU::EXEC_LO);
1024 if (Bytes_[0] != ExecEncoding)
1028 Size = MaxInstBytesNum - Bytes.size();
1033 if (
STI.hasFeature(AMDGPU::FeatureGFX11Insts)) {
1043 if (
MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_t16_gfx11 ||
1044 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_fake16_gfx11 ||
1045 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_t16_gfx12 ||
1046 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_fake16_gfx12 ||
1047 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_t16_gfx13 ||
1048 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_fake16_gfx13 ||
1049 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_t16_gfx11 ||
1050 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_fake16_gfx11 ||
1051 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_t16_gfx12 ||
1052 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_fake16_gfx12 ||
1053 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_t16_gfx13 ||
1054 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_fake16_gfx13 ||
1055 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_t16_gfx11 ||
1056 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_fake16_gfx11 ||
1057 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_t16_gfx12 ||
1058 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_fake16_gfx12 ||
1059 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_t16_gfx13 ||
1060 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_fake16_gfx13 ||
1061 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_t16_gfx11 ||
1062 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_fake16_gfx11 ||
1063 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_t16_gfx12 ||
1064 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_fake16_gfx12 ||
1065 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_t16_gfx13 ||
1066 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_fake16_gfx13) {
1074 if (
STI.hasFeature(AMDGPU::FeatureGFX9) ||
1075 STI.hasFeature(AMDGPU::FeatureGFX10)) {
1079 }
else if (
STI.hasFeature(AMDGPU::FeatureVolcanicIslands)) {
1080 int SDst = AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::sdst);
1084 AMDGPU::OpName::sdst);
1109 NewReg = MRI.
getSubReg(MO.
getReg(), AMDGPU::sub0_sub1_sub2_sub3_sub4_sub5);
1113 AMDGPU::sub0_sub1_sub2_sub3_sub4_sub5_sub6_sub7);
1123 BaseReg, AMDGPU::sub0, &MRI.
getRegClass(AMDGPU::VReg_384RegClassID));
1147 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::blgp);
1152 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::cbsz);
1154 unsigned CBSZ =
MI.getOperand(CbszIdx).getImm();
1155 unsigned BLGP =
MI.getOperand(BlgpIdx).getImm();
1159 if (!AdjustedRegClassOpcode ||
1160 AdjustedRegClassOpcode->
Opcode ==
MI.getOpcode())
1163 MI.setOpcode(AdjustedRegClassOpcode->
Opcode);
1165 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src0);
1167 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src1);
1176 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::matrix_a_fmt);
1181 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::matrix_b_fmt);
1183 unsigned FmtA =
MI.getOperand(FmtAIdx).getImm();
1184 unsigned FmtB =
MI.getOperand(FmtBIdx).getImm();
1188 if (!AdjustedRegClassOpcode ||
1189 AdjustedRegClassOpcode->
Opcode ==
MI.getOpcode())
1192 MI.setOpcode(AdjustedRegClassOpcode->
Opcode);
1194 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src0);
1196 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src1);
1214 bool IsVOP3P =
false) {
1216 unsigned Opc =
MI.getOpcode();
1217 const AMDGPU::OpName ModOps[] = {AMDGPU::OpName::src0_modifiers,
1218 AMDGPU::OpName::src1_modifiers,
1219 AMDGPU::OpName::src2_modifiers};
1220 for (
int J = 0; J < 3; ++J) {
1221 int OpIdx = AMDGPU::getNamedOperandIdx(
Opc, ModOps[J]);
1225 unsigned Val =
MI.getOperand(OpIdx).getImm();
1232 }
else if (J == 0) {
1243 const unsigned Opc =
MI.getOpcode();
1245 MRI.getRegClass(AMDGPU::VGPR_16RegClassID);
1246 constexpr std::array<std::tuple<AMDGPU::OpName, AMDGPU::OpName, unsigned>, 4>
1247 OpAndOpMods = {{{AMDGPU::OpName::src0, AMDGPU::OpName::src0_modifiers,
1249 {AMDGPU::OpName::src1, AMDGPU::OpName::src1_modifiers,
1251 {AMDGPU::OpName::src2, AMDGPU::OpName::src2_modifiers,
1253 {AMDGPU::OpName::vdst, AMDGPU::OpName::src0_modifiers,
1255 for (
const auto &[
OpName, OpModsName, OpSelMask] : OpAndOpMods) {
1256 int OpIdx = AMDGPU::getNamedOperandIdx(
Opc,
OpName);
1257 int OpModsIdx = AMDGPU::getNamedOperandIdx(
Opc, OpModsName);
1258 if (OpIdx == -1 || OpModsIdx == -1)
1265 unsigned OpEnc = MRI.getEncodingValue(
Op.getReg());
1266 const MCOperand &OpMods =
MI.getOperand(OpModsIdx);
1267 unsigned ModVal = OpMods.
getImm();
1268 if (ModVal & OpSelMask) {
1278 constexpr int DST_IDX = 0;
1279 auto Opcode =
MI.getOpcode();
1280 const auto &
Desc = MCII->get(Opcode);
1281 auto OldIdx = AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::old);
1283 if (OldIdx != -1 &&
Desc.getOperandConstraint(
1287 AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::src2),
1298 assert(
MI.getNumOperands() + 1 < MCII->get(
MI.getOpcode()).getNumOperands());
1301 AMDGPU::OpName::src2_modifiers);
1305 unsigned Opc =
MI.getOpcode();
1308 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vdst_in);
1309 if (VDstInIdx != -1)
1312 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1313 if (
MI.getNumOperands() < DescNumOps &&
1318 AMDGPU::OpName::op_sel);
1321 if (
MI.getNumOperands() < DescNumOps &&
1324 AMDGPU::OpName::src0_modifiers);
1326 if (
MI.getNumOperands() < DescNumOps &&
1329 AMDGPU::OpName::src1_modifiers);
1337 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vdst_in);
1338 if (VDstInIdx != -1)
1341 unsigned Opc =
MI.getOpcode();
1342 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1343 if (
MI.getNumOperands() < DescNumOps &&
1347 AMDGPU::OpName::op_sel);
1362 BaseReg = AMDGPU::VGPR0;
1364 BaseReg = AMDGPU::AGPR0;
1366 assert(BaseReg &&
"Only vector registers expected");
1368 return (Sub0 - BaseReg + NumRegs <= 256) ?
Reg :
MCRegister();
1375 int VDstIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1376 AMDGPU::OpName::vdst);
1378 int VDataIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1379 AMDGPU::OpName::vdata);
1381 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vaddr0);
1383 ? AMDGPU::OpName::srsrc
1384 : AMDGPU::OpName::rsrc;
1385 int RsrcIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(), RsrcOpName);
1386 int DMaskIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1387 AMDGPU::OpName::dmask);
1389 int TFEIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1390 AMDGPU::OpName::tfe);
1391 int D16Idx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1392 AMDGPU::OpName::d16);
1399 if (BaseOpcode->
BVH) {
1405 bool IsAtomic = (VDstIdx != -1);
1409 bool IsPartialNSA =
false;
1410 unsigned AddrSize = Info->VAddrDwords;
1414 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::dim);
1416 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::a16);
1419 const bool IsA16 = (A16Idx != -1 &&
MI.getOperand(A16Idx).
getImm());
1426 IsNSA = Info->MIMGEncoding == AMDGPU::MIMGEncGfx10NSA ||
1427 Info->MIMGEncoding == AMDGPU::MIMGEncGfx11NSA ||
1428 Info->MIMGEncoding == AMDGPU::MIMGEncGfx12 ||
1429 Info->MIMGEncoding == AMDGPU::MIMGEncGfx13;
1431 if (!IsVSample && AddrSize > 12)
1434 if (AddrSize > Info->VAddrDwords) {
1435 if (!
STI.hasFeature(AMDGPU::FeaturePartialNSAEncoding)) {
1440 IsPartialNSA =
true;
1445 unsigned DMask =
MI.getOperand(DMaskIdx).getImm() & 0xf;
1446 unsigned DstSize = IsGather4 ? 4 : std::max(
llvm::popcount(DMask), 1);
1448 bool D16 = D16Idx >= 0 &&
MI.getOperand(D16Idx).getImm();
1450 DstSize = (DstSize + 1) / 2;
1453 if (TFEIdx != -1 &&
MI.getOperand(TFEIdx).getImm())
1456 if (DstSize == Info->VDataDwords && AddrSize == Info->VAddrDwords)
1461 if (NewOpcode == -1)
1466 if (DstSize != Info->VDataDwords) {
1467 auto DataRCID = MCII->getOpRegClassID(
1468 MCII->get(NewOpcode).operands()[VDataIdx], HwModeRegClass);
1472 MCRegister VdataSub0 = MRI.getSubReg(Vdata0, AMDGPU::sub0);
1473 Vdata0 = (VdataSub0 != 0)? VdataSub0 : Vdata0;
1476 NewVdata = MRI.getMatchingSuperReg(Vdata0, AMDGPU::sub0, &NewRC);
1487 int VAddrSAIdx = IsPartialNSA ? (RsrcIdx - 1) : VAddr0Idx;
1489 if (
STI.hasFeature(AMDGPU::FeatureNSAEncoding) && (!IsNSA || IsPartialNSA) &&
1490 AddrSize != Info->VAddrDwords) {
1491 MCRegister VAddrSA =
MI.getOperand(VAddrSAIdx).getReg();
1492 MCRegister VAddrSubSA = MRI.getSubReg(VAddrSA, AMDGPU::sub0);
1493 VAddrSA = VAddrSubSA ? VAddrSubSA : VAddrSA;
1495 auto AddrRCID = MCII->getOpRegClassID(
1496 MCII->get(NewOpcode).operands()[VAddrSAIdx], HwModeRegClass);
1499 NewVAddrSA = MRI.getMatchingSuperReg(VAddrSA, AMDGPU::sub0, &NewRC);
1505 MI.setOpcode(NewOpcode);
1507 if (NewVdata != AMDGPU::NoRegister) {
1519 assert(AddrSize <= Info->VAddrDwords);
1520 MI.erase(
MI.begin() + VAddr0Idx + AddrSize,
1521 MI.begin() + VAddr0Idx + Info->VAddrDwords);
1529 unsigned Opc =
MI.getOpcode();
1530 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1533 if (
MI.getNumOperands() < DescNumOps &&
1537 if (
MI.getNumOperands() < DescNumOps &&
1540 AMDGPU::OpName::op_sel);
1541 if (
MI.getNumOperands() < DescNumOps &&
1544 AMDGPU::OpName::op_sel_hi);
1545 if (
MI.getNumOperands() < DescNumOps &&
1548 AMDGPU::OpName::neg_lo);
1549 if (
MI.getNumOperands() < DescNumOps &&
1552 AMDGPU::OpName::neg_hi);
1557 unsigned Opc =
MI.getOpcode();
1558 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1560 if (
MI.getNumOperands() < DescNumOps &&
1564 if (
MI.getNumOperands() < DescNumOps &&
1567 AMDGPU::OpName::src0_modifiers);
1569 if (
MI.getNumOperands() < DescNumOps &&
1572 AMDGPU::OpName::src1_modifiers);
1576 unsigned Opc =
MI.getOpcode();
1577 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1581 if (
MI.getNumOperands() < DescNumOps &&
1585 AMDGPU::OpName::op_sel);
1590 assert(HasLiteral &&
"Should have decoded a literal");
1596 &getAMDGPUMCRegisterClass(RegClassID));
1601 const Twine& ErrMsg)
const {
1615 unsigned Val)
const {
1616 const auto &RegCl = getAMDGPUMCRegisterClass(RegClassID);
1617 if (Val >= RegCl.getNumRegs())
1619 ": unknown register " +
Twine(Val));
1625 unsigned Val)
const {
1629 switch (SRegClassID) {
1630 case AMDGPU::SGPR_32RegClassID:
1631 case AMDGPU::TTMP_32RegClassID:
1633 case AMDGPU::SGPR_64RegClassID:
1634 case AMDGPU::TTMP_64RegClassID:
1637 case AMDGPU::SGPR_96RegClassID:
1638 case AMDGPU::TTMP_96RegClassID:
1639 case AMDGPU::SGPR_128RegClassID:
1640 case AMDGPU::TTMP_128RegClassID:
1643 case AMDGPU::SGPR_256RegClassID:
1644 case AMDGPU::TTMP_256RegClassID:
1647 case AMDGPU::SGPR_288RegClassID:
1648 case AMDGPU::TTMP_288RegClassID:
1649 case AMDGPU::SGPR_320RegClassID:
1650 case AMDGPU::TTMP_320RegClassID:
1651 case AMDGPU::SGPR_352RegClassID:
1652 case AMDGPU::TTMP_352RegClassID:
1653 case AMDGPU::SGPR_384RegClassID:
1654 case AMDGPU::TTMP_384RegClassID:
1655 case AMDGPU::SGPR_512RegClassID:
1656 case AMDGPU::TTMP_512RegClassID:
1665 if (Val % (1 << shift)) {
1667 <<
": scalar reg isn't aligned " << Val;
1675 unsigned RegIdxInVGPR16 = RegIdx * 2 + (IsHi ? 1 : 0);
1685 "Should only decode multiple kimm with VOPD, check VSrc operand types");
1687 return errOperand(Val,
"More than one unique literal is illegal");
1698 return errOperand(Val,
"More than one unique literal is illegal");
1703 bool UseLit64 =
Hi_32(Literal) == 0;
1716 if (Bytes.size() < 4) {
1717 return errOperand(0,
"cannot read literal, inst bytes left " +
1718 Twine(Bytes.size()));
1725 bool HasInv2Pi =
true;
1729 int64_t Val = Literal;
1730 bool UseLit =
false;
1801 assert(
STI.hasFeature(AMDGPU::Feature64BitLiterals));
1804 if (Bytes.size() < 8) {
1805 return errOperand(0,
"cannot read literal64, inst bytes left " +
1806 Twine(Bytes.size()));
1812 bool UseLit64 =
Hi_32(Literal) == 0;
1815 Literal,
STI.hasFeature(AMDGPU::FeatureInv2PiInlineImm));
1825 assert(
Imm >= INLINE_INTEGER_C_MIN &&
Imm <= INLINE_INTEGER_C_MAX);
1827 (
static_cast<int64_t
>(
Imm) - INLINE_INTEGER_C_MIN) :
1828 (INLINE_INTEGER_C_POSITIVE_MAX -
static_cast<int64_t
>(
Imm)));
1876 return 0x3fc45f306dc9c882;
1938 return VGPR_32RegClassID;
1940 return VReg_64RegClassID;
1942 return VReg_96RegClassID;
1944 return VReg_128RegClassID;
1946 return VReg_160RegClassID;
1948 return VReg_192RegClassID;
1950 return VReg_256RegClassID;
1952 return VReg_288RegClassID;
1954 return VReg_320RegClassID;
1956 return VReg_352RegClassID;
1958 return VReg_384RegClassID;
1960 return VReg_512RegClassID;
1962 return VReg_1024RegClassID;
1973 return AGPR_32RegClassID;
1975 return AReg_64RegClassID;
1977 return AReg_96RegClassID;
1979 return AReg_128RegClassID;
1981 return AReg_160RegClassID;
1983 return AReg_256RegClassID;
1985 return AReg_288RegClassID;
1987 return AReg_320RegClassID;
1989 return AReg_352RegClassID;
1991 return AReg_384RegClassID;
1993 return AReg_512RegClassID;
1995 return AReg_1024RegClassID;
2000std::optional<unsigned>
2007 return SGPR_32RegClassID;
2009 return SGPR_64RegClassID;
2011 return SGPR_96RegClassID;
2013 return SGPR_128RegClassID;
2015 return SGPR_160RegClassID;
2017 return SGPR_256RegClassID;
2019 return SGPR_288RegClassID;
2021 return SGPR_320RegClassID;
2023 return SGPR_352RegClassID;
2025 return SGPR_384RegClassID;
2027 return SGPR_512RegClassID;
2029 return std::nullopt;
2032std::optional<unsigned>
2039 return TTMP_32RegClassID;
2041 return TTMP_64RegClassID;
2043 return TTMP_128RegClassID;
2045 return TTMP_256RegClassID;
2047 return TTMP_288RegClassID;
2049 return TTMP_320RegClassID;
2051 return TTMP_352RegClassID;
2053 return TTMP_384RegClassID;
2055 return TTMP_512RegClassID;
2057 return std::nullopt;
2063 unsigned TTmpMin =
isGFX9Plus() ? TTMP_GFX9PLUS_MIN : TTMP_VI_MIN;
2064 unsigned TTmpMax =
isGFX9Plus() ? TTMP_GFX9PLUS_MAX : TTMP_VI_MAX;
2066 return (TTmpMin <= Val && Val <= TTmpMax)? Val - TTmpMin : -1;
2070 unsigned Val)
const {
2075 bool IsAGPR = Val & 512;
2078 if (VGPR_MIN <= Val && Val <= VGPR_MAX) {
2087 unsigned Val)
const {
2090 assert(Val < (1 << 8) &&
"9-bit Src encoding when Val{8} is 0");
2095 auto UnsupportedWidth = [&]() {
2097 "-bit non-VGPR operand encoding " +
Twine(Val));
2102 static_assert(SGPR_MIN == 0);
2105 return UnsupportedWidth();
2113 return UnsupportedWidth();
2117 if ((INLINE_INTEGER_C_MIN <= Val && Val <= INLINE_INTEGER_C_MAX) ||
2118 (INLINE_FLOATING_C_MIN <= Val && Val <= INLINE_FLOATING_C_MAX) ||
2119 Val == LITERAL_CONST)
2122 if (Val == LITERAL64_CONST &&
STI.hasFeature(AMDGPU::Feature64BitLiterals)) {
2128 "64-bit literal is not supported by this instruction");
2145 return UnsupportedWidth();
2152 unsigned Val)
const {
2154 AMDGPU::getNamedOperandIdx(Inst.
getOpcode(), AMDGPU::OpName::vdstX);
2157 unsigned XDstReg = MRI.getEncodingValue(Inst.
getOperand(VDstXInd).
getReg());
2158 Val |= ~XDstReg & 1;
2281 const unsigned Val)
const {
2285 if (
STI.hasFeature(AMDGPU::FeatureGFX9) ||
2286 STI.hasFeature(AMDGPU::FeatureGFX10)) {
2289 if (
int(SDWA9EncValues::SRC_VGPR_MIN) <=
int(Val) &&
2290 Val <= SDWA9EncValues::SRC_VGPR_MAX) {
2292 Val - SDWA9EncValues::SRC_VGPR_MIN);
2294 if (SDWA9EncValues::SRC_SGPR_MIN <= Val &&
2295 Val <= (
isGFX10Plus() ? SDWA9EncValues::SRC_SGPR_MAX_GFX10
2296 : SDWA9EncValues::SRC_SGPR_MAX_SI)) {
2298 Val - SDWA9EncValues::SRC_SGPR_MIN);
2300 if (SDWA9EncValues::SRC_TTMP_MIN <= Val &&
2301 Val <= SDWA9EncValues::SRC_TTMP_MAX) {
2303 Val - SDWA9EncValues::SRC_TTMP_MIN);
2306 const unsigned SVal = Val - SDWA9EncValues::SRC_SGPR_MIN;
2308 if ((INLINE_INTEGER_C_MIN <= SVal && SVal <= INLINE_INTEGER_C_MAX) ||
2309 (INLINE_FLOATING_C_MIN <= SVal && SVal <= INLINE_FLOATING_C_MAX))
2314 if (
STI.hasFeature(AMDGPU::FeatureVolcanicIslands))
2330 assert((
STI.hasFeature(AMDGPU::FeatureGFX9) ||
2331 STI.hasFeature(AMDGPU::FeatureGFX10)) &&
2332 "SDWAVopcDst should be present only on GFX9+");
2334 bool IsWave32 =
STI.hasFeature(AMDGPU::FeatureWavefrontSize32);
2336 if (Val & SDWA9EncValues::VOPC_DST_VCC_MASK) {
2337 Val &= SDWA9EncValues::VOPC_DST_SGPR_MASK;
2351 unsigned Val)
const {
2352 return STI.hasFeature(AMDGPU::FeatureWavefrontSize32)
2358 unsigned Val)
const {
2360 constexpr unsigned M0Encoding = 125;
2361 bool IsValidBarrier =
2362 Val == M0Encoding ||
2363 (INLINE_INTEGER_C_MIN <= Val && Val < INLINE_INTEGER_C_MIN + 32) ||
2364 (INLINE_INTEGER_C_POSITIVE_MAX < Val &&
2365 Val <= INLINE_INTEGER_C_POSITIVE_MAX + 4);
2366 if (!IsValidBarrier)
2384 auto [
Version, W64, W32, MDP] = Encoding::decode(
Imm);
2387 if (Encoding::encode(
Version, W64, W32, MDP) !=
Imm)
2397 if (
I == Versions.end())
2413 return STI.hasFeature(AMDGPU::FeatureVolcanicIslands);
2419 return STI.hasFeature(AMDGPU::FeatureGFX90AInsts);
2431 return STI.hasFeature(AMDGPU::FeatureGFX11);
2439 return STI.hasFeature(AMDGPU::FeatureGFX11_7Insts);
2443 return STI.hasFeature(AMDGPU::FeatureGFX12);
2463 return STI.hasFeature(AMDGPU::FeatureArchitectedFlatScratch);
2484 if (PopCount == 1) {
2485 S <<
"bit (" << (TrailingZeros + BaseBytes * CHAR_BIT) <<
')';
2487 S <<
"bits in range ("
2488 << (TrailingZeros + PopCount - 1 + BaseBytes * CHAR_BIT) <<
':'
2489 << (TrailingZeros + BaseBytes * CHAR_BIT) <<
')';
2495#define GET_FIELD(MASK) (AMDHSA_BITS_GET(FourByteBuffer, MASK))
2496#define PRINT_DIRECTIVE(DIRECTIVE, MASK) \
2498 KdStream << Indent << DIRECTIVE " " << GET_FIELD(MASK) << '\n'; \
2500#define PRINT_PSEUDO_DIRECTIVE_COMMENT(DIRECTIVE, MASK) \
2502 KdStream << Indent << MAI.getCommentString() << ' ' << DIRECTIVE " " \
2503 << GET_FIELD(MASK) << '\n'; \
2506#define CHECK_RESERVED_BITS_IMPL(MASK, DESC, MSG) \
2508 if (FourByteBuffer & (MASK)) { \
2509 return createStringError(std::errc::invalid_argument, \
2510 "kernel descriptor " DESC \
2511 " reserved %s set" MSG, \
2512 getBitRangeFromMask((MASK), 0).c_str()); \
2516#define CHECK_RESERVED_BITS(MASK) CHECK_RESERVED_BITS_IMPL(MASK, #MASK, "")
2517#define CHECK_RESERVED_BITS_MSG(MASK, MSG) \
2518 CHECK_RESERVED_BITS_IMPL(MASK, #MASK, ", " MSG)
2519#define CHECK_RESERVED_BITS_DESC(MASK, DESC) \
2520 CHECK_RESERVED_BITS_IMPL(MASK, DESC, "")
2521#define CHECK_RESERVED_BITS_DESC_MSG(MASK, DESC, MSG) \
2522 CHECK_RESERVED_BITS_IMPL(MASK, DESC, ", " MSG)
2535 uint32_t GranulatedWorkitemVGPRCount =
2536 GET_FIELD(COMPUTE_PGM_RSRC1_GRANULATED_WORKITEM_VGPR_COUNT);
2539 (GranulatedWorkitemVGPRCount + 1) *
2542 KdStream << Indent <<
".amdhsa_next_free_vgpr " << NextFreeVGPR <<
'\n';
2563 uint32_t GranulatedWavefrontSGPRCount =
2564 GET_FIELD(COMPUTE_PGM_RSRC1_GRANULATED_WAVEFRONT_SGPR_COUNT);
2568 "must be zero on gfx10+");
2570 uint32_t NextFreeSGPR = (GranulatedWavefrontSGPRCount + 1) *
2573 KdStream << Indent <<
".amdhsa_reserve_vcc " << 0 <<
'\n';
2575 KdStream << Indent <<
".amdhsa_reserve_flat_scratch " << 0 <<
'\n';
2579 bool ReservedXnackMask =
2580 STI.hasFeature(AMDGPU::FeatureXNACK) || XnackOnFromEFlags;
2581 if (
STI.hasFeature(AMDGPU::FeatureSupportsXNACK) || ReservedXnackMask) {
2582 KdStream << Indent <<
".amdhsa_reserve_xnack_mask " << ReservedXnackMask
2585 KdStream << Indent <<
".amdhsa_next_free_sgpr " << NextFreeSGPR <<
"\n";
2590 COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_32);
2592 COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_16_64);
2594 COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_32);
2596 COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_16_64);
2600 if (
STI.hasFeature(AMDGPU::FeatureDX10ClampAndIEEEMode))
2602 COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_DX10_CLAMP);
2606 if (
STI.hasFeature(AMDGPU::FeatureDX10ClampAndIEEEMode))
2608 COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_IEEE_MODE);
2615 PRINT_DIRECTIVE(
".amdhsa_fp16_overflow", COMPUTE_PGM_RSRC1_GFX9_PLUS_FP16_OVFL);
2618 "COMPUTE_PGM_RSRC1",
"must be zero pre-gfx9");
2624 COMPUTE_PGM_RSRC1_GFX125_FLAT_SCRATCH_IS_NV);
2627 "COMPUTE_PGM_RSRC1");
2638 COMPUTE_PGM_RSRC1_GFX10_PLUS_WGP_MODE);
2640 PRINT_DIRECTIVE(
".amdhsa_memory_ordered", COMPUTE_PGM_RSRC1_GFX10_PLUS_MEM_ORDERED);
2641 PRINT_DIRECTIVE(
".amdhsa_forward_progress", COMPUTE_PGM_RSRC1_GFX10_PLUS_FWD_PROGRESS);
2644 "COMPUTE_PGM_RSRC1");
2649 COMPUTE_PGM_RSRC1_GFX12_PLUS_ENABLE_WG_RR_EN);
2661 COMPUTE_PGM_RSRC2_ENABLE_PRIVATE_SEGMENT);
2663 PRINT_DIRECTIVE(
".amdhsa_system_sgpr_private_segment_wavefront_offset",
2664 COMPUTE_PGM_RSRC2_ENABLE_PRIVATE_SEGMENT);
2666 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_X);
2668 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Y);
2670 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Z);
2672 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_INFO);
2674 COMPUTE_PGM_RSRC2_ENABLE_VGPR_WORKITEM_ID);
2681 ".amdhsa_exception_fp_ieee_invalid_op",
2682 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INVALID_OPERATION);
2684 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_FP_DENORMAL_SOURCE);
2686 ".amdhsa_exception_fp_ieee_div_zero",
2687 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_DIVISION_BY_ZERO);
2689 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_OVERFLOW);
2691 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_UNDERFLOW);
2693 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INEXACT);
2695 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_INT_DIVIDE_BY_ZERO);
2708 KdStream << Indent <<
".amdhsa_accum_offset "
2709 << (
GET_FIELD(COMPUTE_PGM_RSRC3_GFX90A_ACCUM_OFFSET) + 1) * 4
2712 PRINT_DIRECTIVE(
".amdhsa_tg_split", COMPUTE_PGM_RSRC3_GFX90A_TG_SPLIT);
2715 "COMPUTE_PGM_RSRC3",
"must be zero on gfx90a");
2717 "COMPUTE_PGM_RSRC3",
"must be zero on gfx90a");
2721 if (!EnableWavefrontSize32 || !*EnableWavefrontSize32) {
2723 COMPUTE_PGM_RSRC3_GFX10_GFX11_SHARED_VGPR_COUNT);
2726 "SHARED_VGPR_COUNT",
2727 COMPUTE_PGM_RSRC3_GFX10_GFX11_SHARED_VGPR_COUNT);
2731 "COMPUTE_PGM_RSRC3",
2732 "must be zero on gfx12+");
2738 COMPUTE_PGM_RSRC3_GFX11_INST_PREF_SIZE);
2740 COMPUTE_PGM_RSRC3_GFX11_TRAP_ON_START);
2742 COMPUTE_PGM_RSRC3_GFX11_TRAP_ON_END);
2745 COMPUTE_PGM_RSRC3_GFX12_PLUS_INST_PREF_SIZE);
2748 "COMPUTE_PGM_RSRC3",
2749 "must be zero on gfx10");
2754 "COMPUTE_PGM_RSRC3",
"must be zero on gfx10+");
2759 COMPUTE_PGM_RSRC3_GFX12_PLUS_GLG_EN);
2762 "COMPUTE_PGM_RSRC3",
2763 "must be zero on gfx10 or gfx11");
2769 COMPUTE_PGM_RSRC3_GFX125_NAMED_BAR_CNT);
2771 "ENABLE_DYNAMIC_VGPR", COMPUTE_PGM_RSRC3_GFX125_ENABLE_DYNAMIC_VGPR);
2773 COMPUTE_PGM_RSRC3_GFX125_TCP_SPLIT);
2775 "ENABLE_DIDT_THROTTLE",
2776 COMPUTE_PGM_RSRC3_GFX125_ENABLE_DIDT_THROTTLE);
2779 "COMPUTE_PGM_RSRC3",
2780 "must be zero on gfx10+");
2785 "COMPUTE_PGM_RSRC3",
"must be zero on gfx10+");
2790 COMPUTE_PGM_RSRC3_GFX11_PLUS_IMAGE_OP);
2793 "COMPUTE_PGM_RSRC3",
2794 "must be zero on gfx10");
2796 }
else if (FourByteBuffer) {
2798 std::errc::invalid_argument,
2799 "kernel descriptor COMPUTE_PGM_RSRC3 must be all zero before gfx9");
2803#undef PRINT_PSEUDO_DIRECTIVE_COMMENT
2804#undef PRINT_DIRECTIVE
2806#undef CHECK_RESERVED_BITS_IMPL
2807#undef CHECK_RESERVED_BITS
2808#undef CHECK_RESERVED_BITS_MSG
2809#undef CHECK_RESERVED_BITS_DESC
2810#undef CHECK_RESERVED_BITS_DESC_MSG
2815 const char *
Msg =
"") {
2817 std::errc::invalid_argument,
"kernel descriptor reserved %s set%s%s",
2824 unsigned WidthInBytes) {
2828 std::errc::invalid_argument,
2829 "kernel descriptor reserved bits in range (%u:%u) set",
2830 (BaseInBytes + WidthInBytes) * CHAR_BIT - 1, BaseInBytes * CHAR_BIT);
2836#define PRINT_DIRECTIVE(DIRECTIVE, MASK) \
2838 KdStream << Indent << DIRECTIVE " " \
2839 << ((TwoByteBuffer & MASK) >> (MASK##_SHIFT)) << '\n'; \
2848 assert(Bytes.size() == 64);
2851 switch (Cursor.tell()) {
2853 FourByteBuffer = DE.
getU32(Cursor);
2854 KdStream << Indent <<
".amdhsa_group_segment_fixed_size " << FourByteBuffer
2859 FourByteBuffer = DE.
getU32(Cursor);
2860 KdStream << Indent <<
".amdhsa_private_segment_fixed_size "
2861 << FourByteBuffer <<
'\n';
2865 FourByteBuffer = DE.
getU32(Cursor);
2866 KdStream << Indent <<
".amdhsa_kernarg_size "
2867 << FourByteBuffer <<
'\n';
2872 ReservedBytes = DE.
getBytes(Cursor, 4);
2873 for (
char B : ReservedBytes) {
2888 ReservedBytes = DE.
getBytes(Cursor, 20);
2889 for (
char B : ReservedBytes) {
2896 FourByteBuffer = DE.
getU32(Cursor);
2900 FourByteBuffer = DE.
getU32(Cursor);
2904 FourByteBuffer = DE.
getU32(Cursor);
2909 TwoByteBuffer = DE.
getU16(Cursor);
2913 KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER);
2915 KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_PTR);
2917 KERNEL_CODE_PROPERTY_ENABLE_SGPR_QUEUE_PTR);
2919 KERNEL_CODE_PROPERTY_ENABLE_SGPR_KERNARG_SEGMENT_PTR);
2921 KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_ID);
2924 KERNEL_CODE_PROPERTY_ENABLE_SGPR_FLAT_SCRATCH_INIT);
2926 KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE);
2928 if (TwoByteBuffer & KERNEL_CODE_PROPERTY_RESERVED0)
2934 (TwoByteBuffer & KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32)) {
2936 KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32,
2941 KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32);
2946 KERNEL_CODE_PROPERTY_USES_DYNAMIC_STACK);
2948 if (TwoByteBuffer & KERNEL_CODE_PROPERTY_RESERVED1) {
2957 TwoByteBuffer = DE.
getU16(Cursor);
2958 if (TwoByteBuffer & KERNARG_PRELOAD_SPEC_LENGTH) {
2960 KERNARG_PRELOAD_SPEC_LENGTH);
2963 if (TwoByteBuffer & KERNARG_PRELOAD_SPEC_OFFSET) {
2965 KERNARG_PRELOAD_SPEC_OFFSET);
2971 ReservedBytes = DE.
getBytes(Cursor, 4);
2972 for (
char B : ReservedBytes) {
2982#undef PRINT_DIRECTIVE
2989 if (Bytes.size() != 64 || KdAddress % 64 != 0)
2991 "kernel descriptor must be 64-byte aligned");
3002 EnableWavefrontSize32 =
3004 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32);
3009 KdStream <<
".amdhsa_kernel " << KdName <<
'\n';
3012 while (
C &&
C.tell() < Bytes.size()) {
3020 KdStream <<
".end_amdhsa_kernel\n";
3039 "code object v2 is not supported");
3052const MCExpr *AMDGPUDisassembler::createConstantSymbolExpr(
StringRef Id,
3055 MCSymbol *Sym = Ctx.getOrCreateSymbol(Id);
3063 if (!Valid || Res != Val)
3064 Ctx.reportWarning(
SMLoc(),
"unsupported redefinition of " + Id);
3089 uint64_t ,
bool IsBranch, uint64_t ,
3090 uint64_t , uint64_t ) {
3101 return Val.
Addr ==
static_cast<uint64_t
>(
Value) &&
3104 if (Result != Symbols->end()) {
3105 auto *Sym =
Ctx.getOrCreateSymbol(Result->Name);
3111 ReferencedAddresses.push_back(
static_cast<uint64_t
>(
Value));
3130 std::unique_ptr<MCRelocationInfo> &&RelInfo) {
MCDisassembler::DecodeStatus DecodeStatus
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define CHECK_RESERVED_BITS_DESC(MASK, DESC)
static VOPModifiers collectVOPModifiers(const MCInst &MI, bool IsVOP3P=false)
static int insertNamedMCOperand(MCInst &MI, const MCOperand &Op, AMDGPU::OpName Name)
LLVM_ABI LLVM_EXTERNAL_VISIBILITY void LLVMInitializeAMDGPUDisassembler()
static DecodeStatus decodeOperand_VSrcT16_Lo128(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder)
static DecodeStatus decodeOperand_KImmFP64(MCInst &Inst, uint64_t Imm, uint64_t Addr, const MCDisassembler *Decoder)
static SmallString< 32 > getBitRangeFromMask(uint32_t Mask, unsigned BaseBytes)
Print a string describing the reserved bit range specified by Mask with offset BaseBytes for use in e...
#define DECODE_OPERAND_SREG_8(RegClass, OpWidth)
static DecodeStatus decodeSMEMOffset(MCInst &Inst, unsigned Imm, uint64_t Addr, const MCDisassembler *Decoder)
static std::bitset< 128 > eat16Bytes(ArrayRef< uint8_t > &Bytes)
#define DECODE_OPERAND_SREG_7(RegClass, OpWidth)
static DecodeStatus decodeSrcA9(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder)
static DecodeStatus decodeOperand_VGPR_16(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder)
#define PRINT_PSEUDO_DIRECTIVE_COMMENT(DIRECTIVE, MASK)
static DecodeStatus decodeSrcOp(MCInst &Inst, unsigned EncSize, unsigned OpWidth, unsigned Imm, unsigned EncImm, const MCDisassembler *Decoder)
static DecodeStatus decodeDpp8FI(MCInst &Inst, unsigned Val, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus decodeOperand_VSrc_f64(MCInst &Inst, unsigned Imm, uint64_t Addr, const MCDisassembler *Decoder)
static MCRegister CheckVGPROverflow(MCRegister Reg, const MCRegisterClass &RC, const MCRegisterInfo &MRI)
static int64_t getInlineImmValBF16(unsigned Imm)
#define DECODE_SDWA(DecName)
static DecodeStatus decodeSOPPBrTarget(MCInst &Inst, unsigned Imm, uint64_t Addr, const MCDisassembler *Decoder)
#define DECODE_OPERAND_REG_8(RegClass)
#define PRINT_DIRECTIVE(DIRECTIVE, MASK)
static DecodeStatus decodeSrcRegOrImm9(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder)
static DecodeStatus DecodeVGPR_16RegisterClass(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder)
static DecodeStatus decodeSrcReg9(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder)
static int64_t getInlineImmVal32(unsigned Imm)
static MCDisassembler::DecodeStatus addOperand(MCInst &Inst, const MCOperand &Opnd)
#define CHECK_RESERVED_BITS(MASK)
static DecodeStatus decodeSrcAV10(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder)
static int64_t getInlineImmVal64(unsigned Imm)
static T eatBytes(ArrayRef< uint8_t > &Bytes)
static DecodeStatus decodeOperand_KImmFP(MCInst &Inst, unsigned Imm, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus decodeAVLdSt(MCInst &Inst, unsigned Imm, unsigned Opw, const MCDisassembler *Decoder)
#define DECODE_SDWA_IMM_FIELD(Name, MaxImm)
static MCDisassembler * createAMDGPUDisassembler(const Target &T, const MCSubtargetInfo &STI, MCContext &Ctx)
static DecodeStatus decodeSrcRegOrImmA9(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder)
static DecodeStatus DecodeVGPR_16_Lo128RegisterClass(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder)
#define CHECK_RESERVED_BITS_MSG(MASK, MSG)
static DecodeStatus decodeOperandVOPDDstY(MCInst &Inst, unsigned Val, uint64_t Addr, const void *Decoder)
static MCSymbolizer * createAMDGPUSymbolizer(const Triple &, LLVMOpInfoCallback, LLVMSymbolLookupCallback, void *DisInfo, MCContext *Ctx, std::unique_ptr< MCRelocationInfo > &&RelInfo)
static DecodeStatus decodeBoolReg(MCInst &Inst, unsigned Val, uint64_t Addr, const MCDisassembler *Decoder)
static int64_t getInlineImmValF16(unsigned Imm)
unsigned const MCDisassembler * Decoder
static std::bitset< 96 > eat12Bytes(ArrayRef< uint8_t > &Bytes)
static DecodeStatus decodeOperand_VSrcT16(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder)
static Error createReservedKDBytesError(unsigned BaseInBytes, unsigned WidthInBytes)
Create an error object to return from onSymbolStart for reserved kernel descriptor bytes being set.
static DecodeStatus decodeSplitBarrier(MCInst &Inst, unsigned Val, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus decodeAV10(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder)
static bool adjustMFMA_F8F6F4OpRegClass(const MCRegisterInfo &MRI, MCOperand &MO, uint8_t NumRegs)
Adjust the register values used by V_MFMA_F8F6F4_f8_f8 instructions to the appropriate subregister fo...
#define CHECK_RESERVED_BITS_DESC_MSG(MASK, DESC, MSG)
static Error createReservedKDBitsError(uint32_t Mask, unsigned BaseBytes, const char *Msg="")
Create an error object to return from onSymbolStart for reserved kernel descriptor bits being set.
This file contains declaration for AMDGPU ISA disassembler.
Provides AMDGPU specific target descriptions.
static cl::opt< bool > XnackSetting("amdgpu-xnack", cl::desc("Force amdgpu.xnack value for testing"), cl::ReallyHidden)
AMDHSA kernel descriptor definitions.
#define AMDHSA_BITS_GET(SRC, MSK)
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_EXTERNAL_VISIBILITY
Interface definition for SIRegisterInfo.
std::optional< unsigned > getSgprClassId(unsigned Width) const
Return the SGPR/TTMP register class accepted by source decoding for Width, or std::nullopt if that wi...
MCOperand decodeNonVGPRSrcOp(const MCInst &Inst, unsigned Width, unsigned Val) const
MCOperand decodeLiteral64Constant() const
void convertVOPC64DPPInst(MCInst &MI) const
bool isBufferInstruction(const MCInst &MI) const
Check if the instruction is a buffer operation (MUBUF, MTBUF, or S_BUFFER)
bool hasKernargPreload() const
void convertEXPInst(MCInst &MI) const
MCOperand decodeSpecialReg64(unsigned Val) const
const char * getRegClassName(unsigned RegClassID) const
Expected< bool > decodeCOMPUTE_PGM_RSRC1(uint32_t FourByteBuffer, raw_string_ostream &KdStream) const
Decode as directives that handle COMPUTE_PGM_RSRC1.
MCOperand decodeSplitBarrier(const MCInst &Inst, unsigned Val) const
Expected< bool > decodeKernelDescriptorDirective(DataExtractor::Cursor &Cursor, ArrayRef< uint8_t > Bytes, raw_string_ostream &KdStream) const
void convertVOPCDPPInst(MCInst &MI) const
bool isGFX1250Plus() const
MCOperand decodeSpecialReg96Plus(unsigned Val) const
MCOperand decodeSDWASrc32(unsigned Val) const
void setABIVersion(unsigned Version) override
ELF-specific, set the ABI version from the object header.
Expected< bool > decodeCOMPUTE_PGM_RSRC2(uint32_t FourByteBuffer, raw_string_ostream &KdStream) const
Decode as directives that handle COMPUTE_PGM_RSRC2.
unsigned getAgprClassId(unsigned Width) const
MCOperand decodeDpp8FI(unsigned Val) const
MCOperand decodeSDWASrc(unsigned Width, unsigned Val) const
void convertFMAanyK(MCInst &MI) const
DecodeStatus tryDecodeInst(const uint8_t *Table, MCInst &MI, InsnType Inst, uint64_t Address, raw_ostream &Comments) const
void convertMacDPPInst(MCInst &MI) const
MCOperand decodeVOPDDstYOp(MCInst &Inst, unsigned Val) const
void convertDPP8Inst(MCInst &MI) const
MCOperand createVGPR16Operand(unsigned RegIdx, bool IsHi) const
MCOperand errOperand(unsigned V, const Twine &ErrMsg) const
MCOperand decodeVersionImm(unsigned Imm) const
Expected< bool > decodeKernelDescriptor(StringRef KdName, ArrayRef< uint8_t > Bytes, uint64_t KdAddress) const
void convertVOP3DPPInst(MCInst &MI) const
void convertTrue16OpSel(MCInst &MI) const
MCOperand decodeSrcOp(const MCInst &Inst, unsigned Width, unsigned Val) const
bool convertMAIInst(MCInst &MI) const
f8f6f4 instructions have different pseudos depending on the used formats.
MCOperand decodeMandatoryLiteralConstant(unsigned Imm) const
MCOperand decodeLiteralConstant(const MCInstrDesc &Desc, const MCOperandInfo &OpDesc) const
Expected< bool > decodeCOMPUTE_PGM_RSRC3(uint32_t FourByteBuffer, raw_string_ostream &KdStream) const
Decode as directives that handle COMPUTE_PGM_RSRC3.
AMDGPUDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx, MCInstrInfo const *MCII)
MCOperand decodeSpecialReg32(unsigned Val) const
MCOperand createRegOperand(MCRegister Reg) const
MCOperand decodeSDWAVopcDst(unsigned Val) const
void convertVINTERPInst(MCInst &MI) const
void convertSDWAInst(MCInst &MI) const
static MCOperand decodeIntImmed(unsigned Imm)
MCOperand decodeBoolReg(const MCInst &Inst, unsigned Val) const
void emitTargetIDIfSupported(raw_ostream &OS, unsigned EFlags) const override
Emit something based on ELF's e_flags if the target needs to.
unsigned getVgprClassId(unsigned Width) const
bool hasArchitectedFlatScratch() const
DecodeStatus getInstruction(MCInst &MI, uint64_t &Size, ArrayRef< uint8_t > Bytes, uint64_t Address, raw_ostream &CS) const override
Returns the disassembly of a single instruction.
std::optional< unsigned > getTtmpClassId(unsigned Width) const
MCOperand decodeMandatoryLiteral64Constant(uint64_t Imm) const
void convertMIMGInst(MCInst &MI) const
bool isMacDPP(MCInst &MI) const
int getTTmpIdx(unsigned Val) const
void convertVOP3PDPPInst(MCInst &MI) const
bool convertWMMAInst(MCInst &MI) const
MCOperand createSRegOperand(unsigned SRegClassID, unsigned Val) const
MCOperand decodeSDWASrc16(unsigned Val) const
Expected< bool > onSymbolStart(SymbolInfoTy &Symbol, uint64_t &Size, ArrayRef< uint8_t > Bytes, uint64_t Address) const override
Used to perform separate target specific disassembly for a particular symbol.
static const AMDGPUMCExpr * createLit(LitModifier Lit, int64_t Value, MCContext &Ctx)
bool tryAddingSymbolicOperand(MCInst &Inst, raw_ostream &cStream, int64_t Value, uint64_t Address, bool IsBranch, uint64_t Offset, uint64_t OpSize, uint64_t InstSize) override
Try to add a symbolic operand instead of Value to the MCInst.
void tryAddingPcLoadReferenceComment(raw_ostream &cStream, int64_t Value, uint64_t Address) override
Try to add a comment on the PC-relative load.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
ArrayRef< T > slice(size_t N, size_t M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array.
Lightweight error class with error context and mandatory checking.
Tagged union holding either a T or a Error.
static const MCBinaryExpr * createOr(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
static LLVM_ABI const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
Context object for machine code objects.
const MCRegisterInfo * getRegisterInfo() const
Superclass for all disassemblers.
MCDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx)
MCContext & getContext() const
const MCSubtargetInfo & STI
raw_ostream * CommentStream
DecodeStatus
Ternary decode status.
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 getOpcode() const
void addOperand(const MCOperand Op)
const MCOperand & getOperand(unsigned i) const
Describe properties that are true of each instruction in the target description file.
Interface to description of machine instruction set.
This holds information about one operand of a machine instruction, indicating the register class for ...
uint8_t OperandType
Information about the type of the operand.
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)
void setReg(MCRegister Reg)
Set the register number.
MCRegister getReg() const
Returns the register number.
MCRegisterClass - Base class of TargetRegisterClass.
MCRegister getRegister(unsigned i) const
getRegister - Return the specified register in the class.
unsigned getSizeInBits() const
Return the size of the physical register in bits if we are able to determine it.
bool contains(MCRegister Reg) const
contains - Return true if the specified register is included in this register class.
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
MCRegister getMatchingSuperReg(MCRegister Reg, unsigned SubIdx, const MCRegisterClass *RC) const
Return a super-register of the specified register Reg so its sub-register of index SubIdx is Reg.
const char * getRegClassName(const MCRegisterClass *Class) const
const MCRegisterClass & getRegClass(unsigned i) const
Returns the register class associated with the enumeration value.
MCRegister getSubReg(MCRegister Reg, unsigned Idx) const
Returns the physical register number of sub-register "Index" for physical register RegNo.
Wrapper class representing physical registers. Should be passed by value.
Generic base class for all target subtargets.
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 ...
bool isVariable() const
isVariable - Check if this is a variable symbol.
LLVM_ABI void setVariableValue(const MCExpr *Value)
const MCExpr * getVariableValue() const
Get the expression of the variable symbol.
Symbolize and annotate disassembled instructions.
Represents a location in source code.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Represent a constant reference to a string, i.e.
Target - Wrapper for Target specific information.
Triple - Helper class for working with autoconf configuration names.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
LLVM Value Representation.
This class implements an extremely fast bulk output stream that can only output to a stream.
A raw_ostream that writes to an std::string.
std::string & str()
Returns the string's reference.
A raw_ostream that writes to an SmallVector or SmallString.
const char *(* LLVMSymbolLookupCallback)(void *DisInfo, uint64_t ReferenceValue, uint64_t *ReferenceType, uint64_t ReferencePC, const char **ReferenceName)
The type for the symbol lookup function.
int(* LLVMOpInfoCallback)(void *DisInfo, uint64_t PC, uint64_t Offset, uint64_t OpSize, uint64_t InstSize, int TagType, void *TagBuf)
The type for the operand information call back function.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned getVGPREncodingGranule(const MCSubtargetInfo &STI, std::optional< bool > EnableWavefrontSize32)
unsigned getSGPREncodingGranule(const MCSubtargetInfo &STI)
ArrayRef< GFXVersion > getGFXVersions()
bool isInlinableLiteralBF16(int16_t Literal, bool HasInv2Pi)
EncodingField< Bit, Bit, D > EncodingBit
bool isPKFMACF16InlineConstant(uint32_t Literal, bool IsGFX11Plus)
LLVM_READONLY const MIMGInfo * getMIMGInfo(unsigned Opc)
bool isInlinableLiteralFP16(int16_t Literal, bool HasInv2Pi)
MCRegister getMCReg(MCRegister Reg, const MCSubtargetInfo &STI)
If Reg is a pseudo reg, return the correct hardware register given STI otherwise return Reg.
int getMIMGOpcode(unsigned BaseOpcode, unsigned MIMGEncoding, unsigned VDataDwords, unsigned VAddrDwords)
bool isInlinableLiteralV2I16(uint32_t Literal)
bool isGFX10(const MCSubtargetInfo &STI)
bool isInlinableLiteralV2BF16(uint32_t Literal)
bool isGFX12Plus(const MCSubtargetInfo &STI)
bool hasPackedD16(const MCSubtargetInfo &STI)
bool isInlinableLiteralV2F16(uint32_t Literal)
bool getSMEMIsBuffer(unsigned Opc)
bool isGFX13(const MCSubtargetInfo &STI)
bool isVOPC64DPP(unsigned Opc)
bool hasPrivateApertureRegs(const MCSubtargetInfo &STI)
unsigned getAMDHSACodeObjectVersion(const Module &M)
LLVM_READONLY bool hasNamedOperand(uint64_t Opcode, OpName NamedIdx)
bool isGFX9(const MCSubtargetInfo &STI)
LLVM_READONLY const MIMGDimInfo * getMIMGDimInfoByEncoding(uint8_t DimEnc)
bool isInlinableLiteral32(int32_t Literal, bool HasInv2Pi)
const MFMA_F8F6F4_Info * getWMMA_F8F6F4_WithFormatArgs(unsigned FmtA, unsigned FmtB, unsigned F8F8Opcode)
bool hasG16(const MCSubtargetInfo &STI)
unsigned getAddrSizeMIMGOp(const MIMGBaseOpcodeInfo *BaseOpcode, const MIMGDimInfo *Dim, bool IsA16, bool IsG16Supported)
bool isGFX13Plus(const MCSubtargetInfo &STI)
bool isGFX11Plus(const MCSubtargetInfo &STI)
bool isGFX10Plus(const MCSubtargetInfo &STI)
@ OPERAND_KIMM32
Operand with 32-bit immediate that uses the constant bus.
@ OPERAND_REG_INLINE_C_FP64
@ OPERAND_REG_INLINE_C_BF16
@ OPERAND_REG_INLINE_C_V2BF16
@ OPERAND_REG_IMM_V2INT64
@ OPERAND_REG_IMM_V2INT16
@ OPERAND_REG_IMM_INT32
Operands with register, 32-bit, or 64-bit immediate.
@ OPERAND_REG_IMM_V2FP16_SPLAT
@ OPERAND_REG_INLINE_C_INT64
@ OPERAND_REG_INLINE_C_INT16
Operands with register or inline constant.
@ OPERAND_REG_IMM_NOINLINE_V2FP16
@ OPERAND_REG_INLINE_C_V2FP16
@ OPERAND_REG_INLINE_AC_INT32
Operands with an AccVGPR register or inline constant.
@ OPERAND_REG_INLINE_AC_FP32
@ OPERAND_REG_IMM_V2INT32
@ OPERAND_REG_INLINE_C_FP32
@ OPERAND_REG_INLINE_C_INT32
@ OPERAND_REG_INLINE_C_V2INT16
@ OPERAND_REG_INLINE_AC_FP64
@ OPERAND_REG_INLINE_C_FP16
bool hasGDS(const MCSubtargetInfo &STI)
bool isGFX9Plus(const MCSubtargetInfo &STI)
bool isVOPD(unsigned Opc)
bool isGFX1250(const MCSubtargetInfo &STI)
unsigned hasKernargPreload(const MCSubtargetInfo &STI)
LLVM_READONLY const MIMGBaseOpcodeInfo * getMIMGBaseOpcodeInfo(unsigned BaseOpcode)
bool isGFX1250Plus(const MCSubtargetInfo &STI)
bool hasPopsExitingWaveID(const MCSubtargetInfo &STI)
bool isInlinableLiteralI16(int32_t Literal, bool HasInv2Pi)
bool hasVOPD(const MCSubtargetInfo &STI)
bool isInlinableLiteral64(int64_t Literal, bool HasInv2Pi)
Is this literal inlinable.
const MFMA_F8F6F4_Info * getMFMA_F8F6F4_WithFormatArgs(unsigned CBSZ, unsigned BLGP, unsigned F8F8Opcode)
@ EF_AMDGPU_FEATURE_XNACK_ANY_V4
@ EF_AMDGPU_FEATURE_SRAMECC_UNSUPPORTED_V4
@ EF_AMDGPU_FEATURE_SRAMECC_OFF_V4
@ EF_AMDGPU_FEATURE_XNACK_UNSUPPORTED_V4
@ EF_AMDGPU_FEATURE_XNACK_OFF_V4
@ EF_AMDGPU_FEATURE_XNACK_V4
@ EF_AMDGPU_FEATURE_SRAMECC_V4
@ EF_AMDGPU_FEATURE_XNACK_ON_V4
@ EF_AMDGPU_FEATURE_SRAMECC_ANY_V4
@ EF_AMDGPU_FEATURE_SRAMECC_ON_V4
constexpr bool isAtomicRet(const T &...O)
constexpr bool isVOPC(const T &...O)
constexpr bool isVOP3(const T &...O)
constexpr bool isMAI(const T &...O)
constexpr bool isFLAT(const T &...O)
constexpr bool isVOP3P(const T &...O)
constexpr bool isBuffer(const T &...O)
constexpr bool isVIMAGE(const T &...O)
constexpr bool isSMRD(const T &...O)
constexpr bool isVOP3Like(const T &...O)
constexpr bool isMIMG(const T &...O)
constexpr bool isWMMA(const T &...O)
constexpr bool isMUBUF(const T &...O)
constexpr bool isSDWA(const T &...O)
constexpr bool isEXP(const T &...O)
constexpr bool isSOPK(const T &...O)
constexpr bool isVINTERP(const T &...O)
constexpr bool isVSAMPLE(const T &...O)
constexpr bool isDS(const T &...O)
constexpr bool isGather4(const T &...O)
constexpr bool isDPP(const T &...O)
@ KERNEL_CODE_PROPERTIES_OFFSET
@ GROUP_SEGMENT_FIXED_SIZE_OFFSET
@ COMPUTE_PGM_RSRC3_OFFSET
@ KERNEL_CODE_ENTRY_BYTE_OFFSET_OFFSET
@ COMPUTE_PGM_RSRC1_OFFSET
@ COMPUTE_PGM_RSRC2_OFFSET
@ PRIVATE_SEGMENT_FIXED_SIZE_OFFSET
value_type read(const void *memory, endianness endian)
Read a value of a particular endianness from memory.
uint16_t read16(const void *P, endianness E)
This is an optimization pass for GlobalISel generic memory operations.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
LLVM_ABI raw_fd_ostream & outs()
This returns a reference to a raw_fd_ostream for standard output.
SmallVectorImpl< T >::const_pointer c_str(SmallVectorImpl< T > &str)
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
constexpr int popcount(T Value) noexcept
Count the number of set bits in a value.
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
MachineInstr * getImm(const MachineOperand &MO, const MachineRegisterInfo *MRI)
constexpr uint32_t Hi_32(uint64_t Value)
Return the high 32 bits of a 64 bit value.
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
void cantFail(Error Err, const char *Msg=nullptr)
Report a fatal error if Err is a failure value.
Target & getTheGCNTarget()
The target for GCN GPUs.
To bit_cast(const From &from) noexcept
DWARFExpression::Operation Op
unsigned M0(unsigned Val)
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
Target & getTheGCNLegacyTarget()
The target for GCN GPUs, registered under the legacy "amdgcn" architecture name for use with -march.
std::vector< SymbolInfoTy > SectionSymbolsTy
constexpr int64_t SignExtend64(uint64_t x)
Sign-extend the number in the bottom B bits of X to a 64-bit integer.
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
static void RegisterMCSymbolizer(Target &T, Target::MCSymbolizerCtorTy Fn)
RegisterMCSymbolizer - Register an MCSymbolizer implementation for the given target.
static void RegisterMCDisassembler(Target &T, Target::MCDisassemblerCtorTy Fn)
RegisterMCDisassembler - Register a MCDisassembler implementation for the given target.