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));
243 if (
Imm >= 128 &&
Imm < 256)
251 unsigned OpWidth = 32;
260#define DECODE_OPERAND_SREG_7(RegClass, OpWidth) \
261 DECODE_SrcOp(Decode##RegClass##RegisterClass, 7, OpWidth, Imm)
263#define DECODE_OPERAND_SREG_8(RegClass, OpWidth) \
264 DECODE_SrcOp(Decode##RegClass##RegisterClass, 8, OpWidth, Imm)
266#define DECODE_OPERAND_SREG_9(RegClass, OpWidth) \
267 DECODE_SrcOp(Decode##RegClass##RegisterClass, 9, OpWidth, Imm)
273template <
unsigned OpW
idth>
281template <
unsigned OpW
idth>
291template <
unsigned OpW
idth>
303template <
unsigned OpW
idth>
319template <
unsigned OpW
idth>
328template <
unsigned OpW
idth>
383 assert((
Imm & (1 << 8)) == 0 &&
"Imm{8} should not be used");
385 bool IsHi =
Imm & (1 << 9);
386 unsigned RegIdx =
Imm & 0xff;
388 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
396 bool IsHi =
Imm & (1 << 7);
397 unsigned RegIdx =
Imm & 0x7f;
399 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
402template <
unsigned OpW
idth>
410 bool IsHi =
Imm & (1 << 7);
411 unsigned RegIdx =
Imm & 0x7f;
412 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
414 return addOperand(Inst, DAsm->decodeNonVGPRSrcOp(Inst, OpWidth,
Imm & 0xFF));
417template <
unsigned OpW
idth>
425 bool IsHi =
Imm & (1 << 9);
426 unsigned RegIdx =
Imm & 0xff;
427 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
429 return addOperand(Inst, DAsm->decodeNonVGPRSrcOp(Inst, OpWidth,
Imm & 0xFF));
441 bool IsHi =
Imm & (1 << 9);
442 unsigned RegIdx =
Imm & 0xff;
443 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
450 return addOperand(Inst, DAsm->decodeMandatoryLiteralConstant(
Imm));
457 return addOperand(Inst, DAsm->decodeMandatoryLiteral64Constant(
Imm));
463 return addOperand(Inst, DAsm->decodeVOPDDstYOp(Inst, Val));
469 return addOperand(Inst, DAsm->decodeSrcOp(Inst, Opw,
Imm | 256));
472template <
unsigned Opw>
482 assert(
Imm < (1 << 9) &&
"9-bit encoding");
487#define DECODE_SDWA(DecName) \
488DECODE_OPERAND(decodeSDWA##DecName, decodeSDWA##DecName)
494#define DECODE_SDWA_IMM_FIELD(Name, MaxImm) \
495 static DecodeStatus Name(MCInst &Inst, unsigned Imm, uint64_t , \
496 const MCDisassembler * ) { \
497 if (Imm > (MaxImm)) \
498 return MCDisassembler::Fail; \
499 return addOperand(Inst, MCOperand::createImm(Imm)); \
507 AMDGPU::SDWA::DstUnused::UNUSED_PRESERVE)
508#undef DECODE_SDWA_IMM_FIELD
517#include "AMDGPUGenDisassemblerTables.inc"
521template <>
constexpr uint32_t InsnBitWidth<uint32_t> = 32;
522template <>
constexpr uint32_t InsnBitWidth<uint64_t> = 64;
523template <>
constexpr uint32_t InsnBitWidth<std::bitset<96>> = 96;
524template <>
constexpr uint32_t InsnBitWidth<std::bitset<128>> = 128;
531template <
typename InsnType>
533 InsnType Inst, uint64_t
Address,
539 const auto SavedBytes = Bytes;
554 Comments << LocalComments;
561template <
typename InsnType>
566 for (
const uint8_t *
T : {Table1, Table2}) {
577 Bytes = Bytes.
slice(
sizeof(
T));
585 Bytes = Bytes.
slice(8);
587 Bytes = Bytes.
slice(4);
588 return (
Hi << 64) |
Lo;
595 Bytes = Bytes.
slice(8);
597 Bytes = Bytes.
slice(8);
598 return (
Hi << 64) |
Lo;
601bool AMDGPUDisassembler::decodeImmOperands(
MCInst &
MI,
603 const MCInstrDesc &
Desc = MCII.get(
MI.getOpcode());
605 if (OpNo >=
MI.getNumOperands())
615 MCOperand &
Op =
MI.getOperand(OpNo);
618 int64_t
Imm =
Op.getImm();
634 switch (OpDesc.OperandType) {
655 Imm = (F16Val << 16) | (F16Val & 0xFFFF);
683 unsigned MaxInstBytesNum = std::min((
size_t)TargetMaxInstBytes, Bytes_.
size());
684 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
688 Size = std::min((
size_t)4, Bytes_.
size());
700 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
735 if (
STI.hasFeature(AMDGPU::Feature64BitLiterals)) {
737 Bytes = Bytes_.
slice(4, MaxInstBytesNum - 4);
745 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
747 }
else if (Bytes.size() >= 16 &&
748 STI.hasFeature(AMDGPU::FeatureGFX950Insts)) {
754 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
757 if (Bytes.size() >= 8) {
760 if (
STI.hasFeature(AMDGPU::FeatureGFX10_BEncoding) &&
764 if (
STI.hasFeature(AMDGPU::FeatureUnpackedD16VMem) &&
768 if (
STI.hasFeature(AMDGPU::FeatureGFX950Insts) &&
775 if (
STI.hasFeature(AMDGPU::FeatureFmaMixInsts) &&
779 if (
STI.hasFeature(AMDGPU::FeatureGFX940Insts) &&
783 if (
STI.hasFeature(AMDGPU::FeatureGFX90AInsts) &&
835 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
839 if (Bytes.size() >= 4) {
852 if (
STI.hasFeature(AMDGPU::FeatureGFX950Insts) &&
856 if (
STI.hasFeature(AMDGPU::FeatureGFX90AInsts) &&
860 if (
STI.hasFeature(AMDGPU::FeatureGFX10_BEncoding) &&
908 else if (AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::dpp8) !=
920 AMDGPU::OpName::src2_modifiers);
923 if (
MI.getOpcode() == AMDGPU::V_CVT_SR_BF8_F32_e64_dpp ||
924 MI.getOpcode() == AMDGPU::V_CVT_SR_FP8_F32_e64_dpp) {
927 AMDGPU::OpName::src2_modifiers);
936 int CPolPos = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
937 AMDGPU::OpName::cpol);
941 if (
MI.getNumOperands() <= (
unsigned)CPolPos) {
943 AMDGPU::OpName::cpol);
945 MI.getOperand(CPolPos).setImm(
MI.getOperand(CPolPos).getImm() | CPol);
951 (
STI.hasFeature(AMDGPU::FeatureGFX90AInsts))) {
954 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::tfe);
955 if (TFEOpIdx != -1) {
956 auto *TFEIter =
MI.begin();
957 std::advance(TFEIter, TFEOpIdx);
965 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::offset);
966 if (OffsetIdx != -1) {
969 if (SignedOffset < 0)
976 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::swz);
977 if (SWZOpIdx != -1) {
978 auto *SWZIter =
MI.begin();
979 std::advance(SWZIter, SWZOpIdx);
987 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vaddr0);
989 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::srsrc);
990 unsigned NSAArgs = RsrcIdx - VAddr0Idx - 1;
991 if (VAddr0Idx >= 0 && NSAArgs > 0) {
992 unsigned NSAWords = (NSAArgs + 3) / 4;
993 if (Bytes.size() < 4 * NSAWords)
995 for (
unsigned i = 0; i < NSAArgs; ++i) {
996 const unsigned VAddrIdx = VAddr0Idx + 1 + i;
998 MCII->getOpRegClassID(
Desc.operands()[VAddrIdx], HwModeRegClass);
1001 Bytes = Bytes.slice(4 * NSAWords);
1025 int VDstIn_Idx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1026 AMDGPU::OpName::vdst_in);
1027 if (VDstIn_Idx != -1) {
1028 int Tied = MCII->get(
MI.getOpcode()).getOperandConstraint(VDstIn_Idx,
1030 if (Tied != -1 && (
MI.getNumOperands() <= (
unsigned)VDstIn_Idx ||
1031 !
MI.getOperand(VDstIn_Idx).isReg() ||
1032 MI.getOperand(VDstIn_Idx).getReg() !=
MI.getOperand(Tied).getReg())) {
1033 if (
MI.getNumOperands() > (
unsigned)VDstIn_Idx)
1034 MI.erase(&
MI.getOperand(VDstIn_Idx));
1037 AMDGPU::OpName::vdst_in);
1049 MCII->get(
MI.getOpcode()).getNumDefs() == 0 &&
1050 MCII->get(
MI.getOpcode()).hasImplicitDefOfPhysReg(AMDGPU::EXEC)) {
1051 auto ExecEncoding = MRI.getEncodingValue(AMDGPU::EXEC_LO);
1052 if (Bytes_[0] != ExecEncoding)
1056 Size = MaxInstBytesNum - Bytes.size();
1061 if (
STI.hasFeature(AMDGPU::FeatureGFX11Insts)) {
1071 if (
MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_t16_gfx11 ||
1072 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_fake16_gfx11 ||
1073 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_t16_gfx12 ||
1074 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_fake16_gfx12 ||
1075 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_t16_gfx13 ||
1076 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_fake16_gfx13 ||
1077 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_t16_gfx11 ||
1078 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_fake16_gfx11 ||
1079 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_t16_gfx12 ||
1080 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_fake16_gfx12 ||
1081 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_t16_gfx13 ||
1082 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_fake16_gfx13 ||
1083 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_t16_gfx11 ||
1084 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_fake16_gfx11 ||
1085 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_t16_gfx12 ||
1086 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_fake16_gfx12 ||
1087 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_t16_gfx13 ||
1088 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_fake16_gfx13 ||
1089 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_t16_gfx11 ||
1090 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_fake16_gfx11 ||
1091 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_t16_gfx12 ||
1092 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_fake16_gfx12 ||
1093 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_t16_gfx13 ||
1094 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_fake16_gfx13) {
1102 if (
STI.hasFeature(AMDGPU::FeatureGFX9) ||
1103 STI.hasFeature(AMDGPU::FeatureGFX10)) {
1107 }
else if (
STI.hasFeature(AMDGPU::FeatureVolcanicIslands)) {
1108 int SDst = AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::sdst);
1112 AMDGPU::OpName::sdst);
1137 NewReg = MRI.
getSubReg(MO.
getReg(), AMDGPU::sub0_sub1_sub2_sub3_sub4_sub5);
1141 AMDGPU::sub0_sub1_sub2_sub3_sub4_sub5_sub6_sub7);
1151 BaseReg, AMDGPU::sub0, &MRI.
getRegClass(AMDGPU::VReg_384RegClassID));
1175 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::blgp);
1180 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::cbsz);
1182 unsigned CBSZ =
MI.getOperand(CbszIdx).getImm();
1183 unsigned BLGP =
MI.getOperand(BlgpIdx).getImm();
1187 if (!AdjustedRegClassOpcode ||
1188 AdjustedRegClassOpcode->
Opcode ==
MI.getOpcode())
1191 MI.setOpcode(AdjustedRegClassOpcode->
Opcode);
1193 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src0);
1195 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src1);
1204 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::matrix_a_fmt);
1209 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::matrix_b_fmt);
1211 unsigned FmtA =
MI.getOperand(FmtAIdx).getImm();
1212 unsigned FmtB =
MI.getOperand(FmtBIdx).getImm();
1216 if (!AdjustedRegClassOpcode ||
1217 AdjustedRegClassOpcode->
Opcode ==
MI.getOpcode())
1220 MI.setOpcode(AdjustedRegClassOpcode->
Opcode);
1222 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src0);
1224 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src1);
1242 bool IsVOP3P =
false) {
1244 unsigned Opc =
MI.getOpcode();
1245 const AMDGPU::OpName ModOps[] = {AMDGPU::OpName::src0_modifiers,
1246 AMDGPU::OpName::src1_modifiers,
1247 AMDGPU::OpName::src2_modifiers};
1248 for (
int J = 0; J < 3; ++J) {
1249 int OpIdx = AMDGPU::getNamedOperandIdx(
Opc, ModOps[J]);
1253 unsigned Val =
MI.getOperand(OpIdx).getImm();
1260 }
else if (J == 0) {
1271 const unsigned Opc =
MI.getOpcode();
1273 MRI.getRegClass(AMDGPU::VGPR_16RegClassID);
1274 constexpr std::array<std::tuple<AMDGPU::OpName, AMDGPU::OpName, unsigned>, 4>
1275 OpAndOpMods = {{{AMDGPU::OpName::src0, AMDGPU::OpName::src0_modifiers,
1277 {AMDGPU::OpName::src1, AMDGPU::OpName::src1_modifiers,
1279 {AMDGPU::OpName::src2, AMDGPU::OpName::src2_modifiers,
1281 {AMDGPU::OpName::vdst, AMDGPU::OpName::src0_modifiers,
1283 for (
const auto &[
OpName, OpModsName, OpSelMask] : OpAndOpMods) {
1284 int OpIdx = AMDGPU::getNamedOperandIdx(
Opc,
OpName);
1285 int OpModsIdx = AMDGPU::getNamedOperandIdx(
Opc, OpModsName);
1286 if (OpIdx == -1 || OpModsIdx == -1)
1293 unsigned OpEnc = MRI.getEncodingValue(
Op.getReg());
1294 const MCOperand &OpMods =
MI.getOperand(OpModsIdx);
1295 unsigned ModVal = OpMods.
getImm();
1296 if (ModVal & OpSelMask) {
1306 constexpr int DST_IDX = 0;
1307 auto Opcode =
MI.getOpcode();
1308 const auto &
Desc = MCII->get(Opcode);
1309 auto OldIdx = AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::old);
1311 if (OldIdx != -1 &&
Desc.getOperandConstraint(
1315 AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::src2),
1326 assert(
MI.getNumOperands() + 1 < MCII->get(
MI.getOpcode()).getNumOperands());
1329 AMDGPU::OpName::src2_modifiers);
1333 unsigned Opc =
MI.getOpcode();
1336 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vdst_in);
1337 if (VDstInIdx != -1)
1340 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1341 if (
MI.getNumOperands() < DescNumOps &&
1346 AMDGPU::OpName::op_sel);
1349 if (
MI.getNumOperands() < DescNumOps &&
1352 AMDGPU::OpName::src0_modifiers);
1354 if (
MI.getNumOperands() < DescNumOps &&
1357 AMDGPU::OpName::src1_modifiers);
1365 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vdst_in);
1366 if (VDstInIdx != -1)
1369 unsigned Opc =
MI.getOpcode();
1370 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1371 if (
MI.getNumOperands() < DescNumOps &&
1375 AMDGPU::OpName::op_sel);
1390 BaseReg = AMDGPU::VGPR0;
1392 BaseReg = AMDGPU::AGPR0;
1394 assert(BaseReg &&
"Only vector registers expected");
1396 return (Sub0 - BaseReg + NumRegs <= 256) ?
Reg :
MCRegister();
1403 int VDstIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1404 AMDGPU::OpName::vdst);
1406 int VDataIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1407 AMDGPU::OpName::vdata);
1409 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vaddr0);
1411 ? AMDGPU::OpName::srsrc
1412 : AMDGPU::OpName::rsrc;
1413 int RsrcIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(), RsrcOpName);
1414 int DMaskIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1415 AMDGPU::OpName::dmask);
1417 int TFEIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1418 AMDGPU::OpName::tfe);
1419 int D16Idx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1420 AMDGPU::OpName::d16);
1427 if (BaseOpcode->
BVH) {
1433 bool IsAtomic = (VDstIdx != -1);
1437 bool IsPartialNSA =
false;
1438 unsigned AddrSize = Info->VAddrDwords;
1442 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::dim);
1444 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::a16);
1447 const bool IsA16 = (A16Idx != -1 &&
MI.getOperand(A16Idx).
getImm());
1454 IsNSA = Info->MIMGEncoding == AMDGPU::MIMGEncGfx10NSA ||
1455 Info->MIMGEncoding == AMDGPU::MIMGEncGfx11NSA ||
1456 Info->MIMGEncoding == AMDGPU::MIMGEncGfx12 ||
1457 Info->MIMGEncoding == AMDGPU::MIMGEncGfx13;
1459 if (!IsVSample && AddrSize > 12)
1462 if (AddrSize > Info->VAddrDwords) {
1463 if (!
STI.hasFeature(AMDGPU::FeaturePartialNSAEncoding)) {
1468 IsPartialNSA =
true;
1473 unsigned DMask =
MI.getOperand(DMaskIdx).getImm() & 0xf;
1474 unsigned DstSize = IsGather4 ? 4 : std::max(
llvm::popcount(DMask), 1);
1476 bool D16 = D16Idx >= 0 &&
MI.getOperand(D16Idx).getImm();
1478 DstSize = (DstSize + 1) / 2;
1481 if (TFEIdx != -1 &&
MI.getOperand(TFEIdx).getImm())
1484 if (DstSize == Info->VDataDwords && AddrSize == Info->VAddrDwords)
1489 if (NewOpcode == -1)
1494 if (DstSize != Info->VDataDwords) {
1495 auto DataRCID = MCII->getOpRegClassID(
1496 MCII->get(NewOpcode).operands()[VDataIdx], HwModeRegClass);
1500 MCRegister VdataSub0 = MRI.getSubReg(Vdata0, AMDGPU::sub0);
1501 Vdata0 = (VdataSub0 != 0)? VdataSub0 : Vdata0;
1504 NewVdata = MRI.getMatchingSuperReg(Vdata0, AMDGPU::sub0, &NewRC);
1515 int VAddrSAIdx = IsPartialNSA ? (RsrcIdx - 1) : VAddr0Idx;
1517 if (
STI.hasFeature(AMDGPU::FeatureNSAEncoding) && (!IsNSA || IsPartialNSA) &&
1518 AddrSize != Info->VAddrDwords) {
1519 MCRegister VAddrSA =
MI.getOperand(VAddrSAIdx).getReg();
1520 MCRegister VAddrSubSA = MRI.getSubReg(VAddrSA, AMDGPU::sub0);
1521 VAddrSA = VAddrSubSA ? VAddrSubSA : VAddrSA;
1523 auto AddrRCID = MCII->getOpRegClassID(
1524 MCII->get(NewOpcode).operands()[VAddrSAIdx], HwModeRegClass);
1527 NewVAddrSA = MRI.getMatchingSuperReg(VAddrSA, AMDGPU::sub0, &NewRC);
1533 MI.setOpcode(NewOpcode);
1535 if (NewVdata != AMDGPU::NoRegister) {
1547 assert(AddrSize <= Info->VAddrDwords);
1548 MI.erase(
MI.begin() + VAddr0Idx + AddrSize,
1549 MI.begin() + VAddr0Idx + Info->VAddrDwords);
1557 unsigned Opc =
MI.getOpcode();
1558 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1561 if (
MI.getNumOperands() < DescNumOps &&
1565 if (
MI.getNumOperands() < DescNumOps &&
1568 AMDGPU::OpName::op_sel);
1569 if (
MI.getNumOperands() < DescNumOps &&
1572 AMDGPU::OpName::op_sel_hi);
1573 if (
MI.getNumOperands() < DescNumOps &&
1576 AMDGPU::OpName::neg_lo);
1577 if (
MI.getNumOperands() < DescNumOps &&
1580 AMDGPU::OpName::neg_hi);
1585 unsigned Opc =
MI.getOpcode();
1586 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1588 if (
MI.getNumOperands() < DescNumOps &&
1592 if (
MI.getNumOperands() < DescNumOps &&
1595 AMDGPU::OpName::src0_modifiers);
1597 if (
MI.getNumOperands() < DescNumOps &&
1600 AMDGPU::OpName::src1_modifiers);
1604 unsigned Opc =
MI.getOpcode();
1605 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1609 if (
MI.getNumOperands() < DescNumOps &&
1613 AMDGPU::OpName::op_sel);
1618 assert(HasLiteral &&
"Should have decoded a literal");
1624 &getAMDGPUMCRegisterClass(RegClassID));
1629 const Twine& ErrMsg)
const {
1643 unsigned Val)
const {
1644 const auto &RegCl = getAMDGPUMCRegisterClass(RegClassID);
1645 if (Val >= RegCl.getNumRegs())
1647 ": unknown register " +
Twine(Val));
1653 unsigned Val)
const {
1657 switch (SRegClassID) {
1658 case AMDGPU::SGPR_32RegClassID:
1659 case AMDGPU::TTMP_32RegClassID:
1661 case AMDGPU::SGPR_64RegClassID:
1662 case AMDGPU::TTMP_64RegClassID:
1665 case AMDGPU::SGPR_96RegClassID:
1666 case AMDGPU::TTMP_96RegClassID:
1667 case AMDGPU::SGPR_128RegClassID:
1668 case AMDGPU::TTMP_128RegClassID:
1671 case AMDGPU::SGPR_256RegClassID:
1672 case AMDGPU::TTMP_256RegClassID:
1675 case AMDGPU::SGPR_288RegClassID:
1676 case AMDGPU::TTMP_288RegClassID:
1677 case AMDGPU::SGPR_320RegClassID:
1678 case AMDGPU::TTMP_320RegClassID:
1679 case AMDGPU::SGPR_352RegClassID:
1680 case AMDGPU::TTMP_352RegClassID:
1681 case AMDGPU::SGPR_384RegClassID:
1682 case AMDGPU::TTMP_384RegClassID:
1683 case AMDGPU::SGPR_512RegClassID:
1684 case AMDGPU::TTMP_512RegClassID:
1693 if (Val % (1 << shift)) {
1695 <<
": scalar reg isn't aligned " << Val;
1703 unsigned RegIdxInVGPR16 = RegIdx * 2 + (IsHi ? 1 : 0);
1713 "Should only decode multiple kimm with VOPD, check VSrc operand types");
1715 return errOperand(Val,
"More than one unique literal is illegal");
1726 return errOperand(Val,
"More than one unique literal is illegal");
1731 bool UseLit64 =
Hi_32(Literal) == 0;
1744 if (Bytes.size() < 4) {
1745 return errOperand(0,
"cannot read literal, inst bytes left " +
1746 Twine(Bytes.size()));
1753 bool HasInv2Pi =
true;
1757 int64_t Val = Literal;
1758 bool UseLit =
false;
1829 assert(
STI.hasFeature(AMDGPU::Feature64BitLiterals));
1832 if (Bytes.size() < 8) {
1833 return errOperand(0,
"cannot read literal64, inst bytes left " +
1834 Twine(Bytes.size()));
1840 bool UseLit64 =
Hi_32(Literal) == 0;
1843 Literal,
STI.hasFeature(AMDGPU::FeatureInv2PiInlineImm));
1853 assert(
Imm >= INLINE_INTEGER_C_MIN &&
Imm <= INLINE_INTEGER_C_MAX);
1855 (
static_cast<int64_t
>(
Imm) - INLINE_INTEGER_C_MIN) :
1856 (INLINE_INTEGER_C_POSITIVE_MAX -
static_cast<int64_t
>(
Imm)));
1904 return 0x3fc45f306dc9c882;
1966 return VGPR_32RegClassID;
1968 return VReg_64RegClassID;
1970 return VReg_96RegClassID;
1972 return VReg_128RegClassID;
1974 return VReg_160RegClassID;
1976 return VReg_192RegClassID;
1978 return VReg_256RegClassID;
1980 return VReg_288RegClassID;
1982 return VReg_320RegClassID;
1984 return VReg_352RegClassID;
1986 return VReg_384RegClassID;
1988 return VReg_512RegClassID;
1990 return VReg_1024RegClassID;
2001 return AGPR_32RegClassID;
2003 return AReg_64RegClassID;
2005 return AReg_96RegClassID;
2007 return AReg_128RegClassID;
2009 return AReg_160RegClassID;
2011 return AReg_256RegClassID;
2013 return AReg_288RegClassID;
2015 return AReg_320RegClassID;
2017 return AReg_352RegClassID;
2019 return AReg_384RegClassID;
2021 return AReg_512RegClassID;
2023 return AReg_1024RegClassID;
2028std::optional<unsigned>
2035 return SGPR_32RegClassID;
2037 return SGPR_64RegClassID;
2039 return SGPR_96RegClassID;
2041 return SGPR_128RegClassID;
2043 return SGPR_160RegClassID;
2045 return SGPR_256RegClassID;
2047 return SGPR_288RegClassID;
2049 return SGPR_320RegClassID;
2051 return SGPR_352RegClassID;
2053 return SGPR_384RegClassID;
2055 return SGPR_512RegClassID;
2057 return std::nullopt;
2060std::optional<unsigned>
2067 return TTMP_32RegClassID;
2069 return TTMP_64RegClassID;
2071 return TTMP_128RegClassID;
2073 return TTMP_256RegClassID;
2075 return TTMP_288RegClassID;
2077 return TTMP_320RegClassID;
2079 return TTMP_352RegClassID;
2081 return TTMP_384RegClassID;
2083 return TTMP_512RegClassID;
2085 return std::nullopt;
2091 unsigned TTmpMin =
isGFX9Plus() ? TTMP_GFX9PLUS_MIN : TTMP_VI_MIN;
2092 unsigned TTmpMax =
isGFX9Plus() ? TTMP_GFX9PLUS_MAX : TTMP_VI_MAX;
2094 return (TTmpMin <= Val && Val <= TTmpMax)? Val - TTmpMin : -1;
2098 unsigned Val)
const {
2103 bool IsAGPR = Val & 512;
2106 if (VGPR_MIN <= Val && Val <= VGPR_MAX) {
2115 unsigned Val)
const {
2118 assert(Val < (1 << 8) &&
"9-bit Src encoding when Val{8} is 0");
2123 auto UnsupportedWidth = [&]() {
2125 "-bit non-VGPR operand encoding " +
Twine(Val));
2130 static_assert(SGPR_MIN == 0);
2133 return UnsupportedWidth();
2141 return UnsupportedWidth();
2145 if ((INLINE_INTEGER_C_MIN <= Val && Val <= INLINE_INTEGER_C_MAX) ||
2146 (INLINE_FLOATING_C_MIN <= Val && Val <= INLINE_FLOATING_C_MAX) ||
2147 Val == LITERAL_CONST)
2150 if (Val == LITERAL64_CONST &&
STI.hasFeature(AMDGPU::Feature64BitLiterals)) {
2156 "64-bit literal is not supported by this instruction");
2173 return UnsupportedWidth();
2180 unsigned Val)
const {
2182 AMDGPU::getNamedOperandIdx(Inst.
getOpcode(), AMDGPU::OpName::vdstX);
2185 unsigned XDstReg = MRI.getEncodingValue(Inst.
getOperand(VDstXInd).
getReg());
2186 Val |= ~XDstReg & 1;
2309 const unsigned Val)
const {
2313 if (
STI.hasFeature(AMDGPU::FeatureGFX9) ||
2314 STI.hasFeature(AMDGPU::FeatureGFX10)) {
2317 if (
int(SDWA9EncValues::SRC_VGPR_MIN) <=
int(Val) &&
2318 Val <= SDWA9EncValues::SRC_VGPR_MAX) {
2320 Val - SDWA9EncValues::SRC_VGPR_MIN);
2322 if (SDWA9EncValues::SRC_SGPR_MIN <= Val &&
2323 Val <= (
isGFX10Plus() ? SDWA9EncValues::SRC_SGPR_MAX_GFX10
2324 : SDWA9EncValues::SRC_SGPR_MAX_SI)) {
2326 Val - SDWA9EncValues::SRC_SGPR_MIN);
2328 if (SDWA9EncValues::SRC_TTMP_MIN <= Val &&
2329 Val <= SDWA9EncValues::SRC_TTMP_MAX) {
2331 Val - SDWA9EncValues::SRC_TTMP_MIN);
2334 const unsigned SVal = Val - SDWA9EncValues::SRC_SGPR_MIN;
2336 if ((INLINE_INTEGER_C_MIN <= SVal && SVal <= INLINE_INTEGER_C_MAX) ||
2337 (INLINE_FLOATING_C_MIN <= SVal && SVal <= INLINE_FLOATING_C_MAX))
2342 if (
STI.hasFeature(AMDGPU::FeatureVolcanicIslands))
2358 assert((
STI.hasFeature(AMDGPU::FeatureGFX9) ||
2359 STI.hasFeature(AMDGPU::FeatureGFX10)) &&
2360 "SDWAVopcDst should be present only on GFX9+");
2362 bool IsWave32 =
STI.hasFeature(AMDGPU::FeatureWavefrontSize32);
2364 if (Val & SDWA9EncValues::VOPC_DST_VCC_MASK) {
2365 Val &= SDWA9EncValues::VOPC_DST_SGPR_MASK;
2379 unsigned Val)
const {
2380 return STI.hasFeature(AMDGPU::FeatureWavefrontSize32)
2386 unsigned Val)
const {
2388 constexpr unsigned M0Encoding = 125;
2389 bool IsValidBarrier =
2390 Val == M0Encoding ||
2391 (INLINE_INTEGER_C_MIN <= Val && Val < INLINE_INTEGER_C_MIN + 32) ||
2392 (INLINE_INTEGER_C_POSITIVE_MAX < Val &&
2393 Val <= INLINE_INTEGER_C_POSITIVE_MAX + 4);
2394 if (!IsValidBarrier)
2412 auto [
Version, W64, W32, MDP] = Encoding::decode(
Imm);
2415 if (Encoding::encode(
Version, W64, W32, MDP) !=
Imm)
2425 if (
I == Versions.end())
2441 return STI.hasFeature(AMDGPU::FeatureVolcanicIslands);
2447 return STI.hasFeature(AMDGPU::FeatureGFX90AInsts);
2459 return STI.hasFeature(AMDGPU::FeatureGFX11);
2467 return STI.hasFeature(AMDGPU::FeatureGFX11_7Insts);
2471 return STI.hasFeature(AMDGPU::FeatureGFX12);
2491 return STI.hasFeature(AMDGPU::FeatureArchitectedFlatScratch);
2512 if (PopCount == 1) {
2513 S <<
"bit (" << (TrailingZeros + BaseBytes * CHAR_BIT) <<
')';
2515 S <<
"bits in range ("
2516 << (TrailingZeros + PopCount - 1 + BaseBytes * CHAR_BIT) <<
':'
2517 << (TrailingZeros + BaseBytes * CHAR_BIT) <<
')';
2523#define GET_FIELD(MASK) (AMDHSA_BITS_GET(FourByteBuffer, MASK))
2524#define PRINT_DIRECTIVE(DIRECTIVE, MASK) \
2526 KdStream << Indent << DIRECTIVE " " << GET_FIELD(MASK) << '\n'; \
2528#define PRINT_PSEUDO_DIRECTIVE_COMMENT(DIRECTIVE, MASK) \
2530 KdStream << Indent << MAI.getCommentString() << ' ' << DIRECTIVE " " \
2531 << GET_FIELD(MASK) << '\n'; \
2534#define CHECK_RESERVED_BITS_IMPL(MASK, DESC, MSG) \
2536 if (FourByteBuffer & (MASK)) { \
2537 return createStringError(std::errc::invalid_argument, \
2538 "kernel descriptor " DESC \
2539 " reserved %s set" MSG, \
2540 getBitRangeFromMask((MASK), 0).c_str()); \
2544#define CHECK_RESERVED_BITS(MASK) CHECK_RESERVED_BITS_IMPL(MASK, #MASK, "")
2545#define CHECK_RESERVED_BITS_MSG(MASK, MSG) \
2546 CHECK_RESERVED_BITS_IMPL(MASK, #MASK, ", " MSG)
2547#define CHECK_RESERVED_BITS_DESC(MASK, DESC) \
2548 CHECK_RESERVED_BITS_IMPL(MASK, DESC, "")
2549#define CHECK_RESERVED_BITS_DESC_MSG(MASK, DESC, MSG) \
2550 CHECK_RESERVED_BITS_IMPL(MASK, DESC, ", " MSG)
2563 uint32_t GranulatedWorkitemVGPRCount =
2564 GET_FIELD(COMPUTE_PGM_RSRC1_GRANULATED_WORKITEM_VGPR_COUNT);
2567 (GranulatedWorkitemVGPRCount + 1) *
2570 KdStream << Indent <<
".amdhsa_next_free_vgpr " << NextFreeVGPR <<
'\n';
2591 uint32_t GranulatedWavefrontSGPRCount =
2592 GET_FIELD(COMPUTE_PGM_RSRC1_GRANULATED_WAVEFRONT_SGPR_COUNT);
2596 "must be zero on gfx10+");
2598 uint32_t NextFreeSGPR = (GranulatedWavefrontSGPRCount + 1) *
2601 KdStream << Indent <<
".amdhsa_reserve_vcc " << 0 <<
'\n';
2603 KdStream << Indent <<
".amdhsa_reserve_flat_scratch " << 0 <<
'\n';
2607 bool ReservedXnackMask =
2608 STI.hasFeature(AMDGPU::FeatureXNACK) || XnackOnFromEFlags;
2609 if (
STI.hasFeature(AMDGPU::FeatureSupportsXNACK) || ReservedXnackMask) {
2610 KdStream << Indent <<
".amdhsa_reserve_xnack_mask " << ReservedXnackMask
2613 KdStream << Indent <<
".amdhsa_next_free_sgpr " << NextFreeSGPR <<
"\n";
2618 COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_32);
2620 COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_16_64);
2622 COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_32);
2624 COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_16_64);
2628 if (
STI.hasFeature(AMDGPU::FeatureDX10ClampAndIEEEMode))
2630 COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_DX10_CLAMP);
2634 if (
STI.hasFeature(AMDGPU::FeatureDX10ClampAndIEEEMode))
2636 COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_IEEE_MODE);
2643 PRINT_DIRECTIVE(
".amdhsa_fp16_overflow", COMPUTE_PGM_RSRC1_GFX9_PLUS_FP16_OVFL);
2646 "COMPUTE_PGM_RSRC1",
"must be zero pre-gfx9");
2652 COMPUTE_PGM_RSRC1_GFX125_FLAT_SCRATCH_IS_NV);
2655 "COMPUTE_PGM_RSRC1");
2666 COMPUTE_PGM_RSRC1_GFX10_PLUS_WGP_MODE);
2668 PRINT_DIRECTIVE(
".amdhsa_memory_ordered", COMPUTE_PGM_RSRC1_GFX10_PLUS_MEM_ORDERED);
2669 PRINT_DIRECTIVE(
".amdhsa_forward_progress", COMPUTE_PGM_RSRC1_GFX10_PLUS_FWD_PROGRESS);
2672 "COMPUTE_PGM_RSRC1");
2677 COMPUTE_PGM_RSRC1_GFX12_PLUS_ENABLE_WG_RR_EN);
2689 COMPUTE_PGM_RSRC2_ENABLE_PRIVATE_SEGMENT);
2691 PRINT_DIRECTIVE(
".amdhsa_system_sgpr_private_segment_wavefront_offset",
2692 COMPUTE_PGM_RSRC2_ENABLE_PRIVATE_SEGMENT);
2694 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_X);
2696 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Y);
2698 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Z);
2700 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_INFO);
2702 COMPUTE_PGM_RSRC2_ENABLE_VGPR_WORKITEM_ID);
2709 ".amdhsa_exception_fp_ieee_invalid_op",
2710 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INVALID_OPERATION);
2712 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_FP_DENORMAL_SOURCE);
2714 ".amdhsa_exception_fp_ieee_div_zero",
2715 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_DIVISION_BY_ZERO);
2717 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_OVERFLOW);
2719 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_UNDERFLOW);
2721 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INEXACT);
2723 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_INT_DIVIDE_BY_ZERO);
2736 KdStream << Indent <<
".amdhsa_accum_offset "
2737 << (
GET_FIELD(COMPUTE_PGM_RSRC3_GFX90A_ACCUM_OFFSET) + 1) * 4
2740 PRINT_DIRECTIVE(
".amdhsa_tg_split", COMPUTE_PGM_RSRC3_GFX90A_TG_SPLIT);
2743 "COMPUTE_PGM_RSRC3",
"must be zero on gfx90a");
2745 "COMPUTE_PGM_RSRC3",
"must be zero on gfx90a");
2749 if (!EnableWavefrontSize32 || !*EnableWavefrontSize32) {
2751 COMPUTE_PGM_RSRC3_GFX10_GFX11_SHARED_VGPR_COUNT);
2754 "SHARED_VGPR_COUNT",
2755 COMPUTE_PGM_RSRC3_GFX10_GFX11_SHARED_VGPR_COUNT);
2759 "COMPUTE_PGM_RSRC3",
2760 "must be zero on gfx12+");
2766 COMPUTE_PGM_RSRC3_GFX11_INST_PREF_SIZE);
2768 COMPUTE_PGM_RSRC3_GFX11_TRAP_ON_START);
2770 COMPUTE_PGM_RSRC3_GFX11_TRAP_ON_END);
2773 COMPUTE_PGM_RSRC3_GFX12_PLUS_INST_PREF_SIZE);
2776 "COMPUTE_PGM_RSRC3",
2777 "must be zero on gfx10");
2782 "COMPUTE_PGM_RSRC3",
"must be zero on gfx10+");
2787 COMPUTE_PGM_RSRC3_GFX12_PLUS_GLG_EN);
2790 "COMPUTE_PGM_RSRC3",
2791 "must be zero on gfx10 or gfx11");
2797 COMPUTE_PGM_RSRC3_GFX125_NAMED_BAR_CNT);
2799 "ENABLE_DYNAMIC_VGPR", COMPUTE_PGM_RSRC3_GFX125_ENABLE_DYNAMIC_VGPR);
2801 COMPUTE_PGM_RSRC3_GFX125_TCP_SPLIT);
2803 "ENABLE_DIDT_THROTTLE",
2804 COMPUTE_PGM_RSRC3_GFX125_ENABLE_DIDT_THROTTLE);
2807 "COMPUTE_PGM_RSRC3",
2808 "must be zero on gfx10+");
2813 "COMPUTE_PGM_RSRC3",
"must be zero on gfx10+");
2818 COMPUTE_PGM_RSRC3_GFX11_PLUS_IMAGE_OP);
2821 "COMPUTE_PGM_RSRC3",
2822 "must be zero on gfx10");
2824 }
else if (FourByteBuffer) {
2826 std::errc::invalid_argument,
2827 "kernel descriptor COMPUTE_PGM_RSRC3 must be all zero before gfx9");
2831#undef PRINT_PSEUDO_DIRECTIVE_COMMENT
2832#undef PRINT_DIRECTIVE
2834#undef CHECK_RESERVED_BITS_IMPL
2835#undef CHECK_RESERVED_BITS
2836#undef CHECK_RESERVED_BITS_MSG
2837#undef CHECK_RESERVED_BITS_DESC
2838#undef CHECK_RESERVED_BITS_DESC_MSG
2843 const char *
Msg =
"") {
2845 std::errc::invalid_argument,
"kernel descriptor reserved %s set%s%s",
2852 unsigned WidthInBytes) {
2856 std::errc::invalid_argument,
2857 "kernel descriptor reserved bits in range (%u:%u) set",
2858 (BaseInBytes + WidthInBytes) * CHAR_BIT - 1, BaseInBytes * CHAR_BIT);
2864#define PRINT_DIRECTIVE(DIRECTIVE, MASK) \
2866 KdStream << Indent << DIRECTIVE " " \
2867 << ((TwoByteBuffer & MASK) >> (MASK##_SHIFT)) << '\n'; \
2870 uint16_t TwoByteBuffer = 0;
2876 assert(Bytes.size() == 64);
2879 switch (Cursor.tell()) {
2881 FourByteBuffer = DE.
getU32(Cursor);
2882 KdStream << Indent <<
".amdhsa_group_segment_fixed_size " << FourByteBuffer
2887 FourByteBuffer = DE.
getU32(Cursor);
2888 KdStream << Indent <<
".amdhsa_private_segment_fixed_size "
2889 << FourByteBuffer <<
'\n';
2893 FourByteBuffer = DE.
getU32(Cursor);
2894 KdStream << Indent <<
".amdhsa_kernarg_size "
2895 << FourByteBuffer <<
'\n';
2900 ReservedBytes = DE.
getBytes(Cursor, 4);
2901 for (
char B : ReservedBytes) {
2916 ReservedBytes = DE.
getBytes(Cursor, 20);
2917 for (
char B : ReservedBytes) {
2924 FourByteBuffer = DE.
getU32(Cursor);
2928 FourByteBuffer = DE.
getU32(Cursor);
2932 FourByteBuffer = DE.
getU32(Cursor);
2937 TwoByteBuffer = DE.
getU16(Cursor);
2941 KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER);
2943 KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_PTR);
2945 KERNEL_CODE_PROPERTY_ENABLE_SGPR_QUEUE_PTR);
2947 KERNEL_CODE_PROPERTY_ENABLE_SGPR_KERNARG_SEGMENT_PTR);
2949 KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_ID);
2952 KERNEL_CODE_PROPERTY_ENABLE_SGPR_FLAT_SCRATCH_INIT);
2954 KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE);
2956 if (TwoByteBuffer & KERNEL_CODE_PROPERTY_RESERVED0)
2962 (TwoByteBuffer & KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32)) {
2964 KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32,
2969 KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32);
2974 KERNEL_CODE_PROPERTY_USES_DYNAMIC_STACK);
2976 if (TwoByteBuffer & KERNEL_CODE_PROPERTY_RESERVED1) {
2985 TwoByteBuffer = DE.
getU16(Cursor);
2986 if (TwoByteBuffer & KERNARG_PRELOAD_SPEC_LENGTH) {
2988 KERNARG_PRELOAD_SPEC_LENGTH);
2991 if (TwoByteBuffer & KERNARG_PRELOAD_SPEC_OFFSET) {
2993 KERNARG_PRELOAD_SPEC_OFFSET);
2999 ReservedBytes = DE.
getBytes(Cursor, 4);
3000 for (
char B : ReservedBytes) {
3010#undef PRINT_DIRECTIVE
3017 if (Bytes.size() != 64 || KdAddress % 64 != 0)
3019 "kernel descriptor must be 64-byte aligned");
3027 uint16_t KernelCodeProperties =
3030 EnableWavefrontSize32 =
3032 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32);
3037 KdStream <<
".amdhsa_kernel " << KdName <<
'\n';
3040 while (
C &&
C.tell() < Bytes.size()) {
3048 KdStream <<
".end_amdhsa_kernel\n";
3067 "code object v2 is not supported");
3080const MCExpr *AMDGPUDisassembler::createConstantSymbolExpr(
StringRef Id,
3083 MCSymbol *Sym = Ctx.getOrCreateSymbol(Id);
3091 if (!Valid || Res != Val)
3092 Ctx.reportWarning(
SMLoc(),
"unsupported redefinition of " + Id);
3117 uint64_t ,
bool IsBranch, uint64_t ,
3118 uint64_t , uint64_t ) {
3129 return Val.
Addr ==
static_cast<uint64_t
>(
Value) &&
3132 if (Result != Symbols->end()) {
3133 auto *Sym =
Ctx.getOrCreateSymbol(Result->Name);
3139 ReferencedAddresses.push_back(
static_cast<uint64_t
>(
Value));
3158 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 DecodeStatus decodeRsrcRegOp(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder, unsigned OpWidth)
static VOPModifiers collectVOPModifiers(const MCInst &MI, bool IsVOP3P=false)
static int insertNamedMCOperand(MCInst &MI, const MCOperand &Op, AMDGPU::OpName Name)
#define DECODE_OPERAND_SREG_9(RegClass, OpWidth)
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 decodeRsrcReg128(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder)
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.