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 TargetID(
AMDGPU::createAMDGPUTargetID(
STI,
"")),
64 CodeObjectVersion(
AMDGPU::getDefaultAMDHSACodeObjectVersion()) {
66 if (!
STI.hasFeature(AMDGPU::FeatureGCN3Encoding) && !
isGFX10Plus())
70 createConstantSymbolExpr(Symbol, Code);
72 UCVersionW64Expr = createConstantSymbolExpr(
"UC_VERSION_W64_BIT", 0x2000);
73 UCVersionW32Expr = createConstantSymbolExpr(
"UC_VERSION_W32_BIT", 0x4000);
74 UCVersionMDPExpr = createConstantSymbolExpr(
"UC_VERSION_MDP_BIT", 0x8000);
82 unsigned EFlags)
const {
83 OS <<
"\t.amdgcn_target \""
90#define X(NUM, ENUM, NAME) \
105 bool SramEccHardwiredOn = TargetID.isSramEccSupported() &&
106 !
STI.hasFeature(AMDGPU::FeatureSRAMECCOnOffModes);
108 switch (SrameccSetting) {
112 TargetID.setSramEccSetting(AMDGPU::TargetIDSetting::Any);
115 TargetID.setSramEccSetting(AMDGPU::TargetIDSetting::Off);
116 if (!SramEccHardwiredOn)
120 TargetID.setSramEccSetting(AMDGPU::TargetIDSetting::On);
121 if (!SramEccHardwiredOn)
128 bool XnackHardwiredOn = TargetID.isXnackSupported() &&
129 !
STI.hasFeature(AMDGPU::FeatureXNACKOnOffModes);
135 TargetID.setXnackSetting(AMDGPU::TargetIDSetting::Any);
138 TargetID.setXnackSetting(AMDGPU::TargetIDSetting::Off);
139 if (!XnackHardwiredOn)
143 TargetID.setXnackSetting(AMDGPU::TargetIDSetting::On);
144 if (!XnackHardwiredOn)
162 AMDGPU::OpName Name) {
163 int OpIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(), Name);
165 auto *
I =
MI.begin();
166 std::advance(
I, OpIdx);
180 if (DAsm->tryAddingSymbolicOperand(Inst,
Offset, Addr,
true, 2, 2, 0))
189 if (DAsm->isGFX12Plus()) {
191 }
else if (DAsm->isVI()) {
203 DAsm->decodeBoolReg(Inst,
static_cast<unsigned>(Val)));
211 DAsm->decodeSplitBarrier(Inst,
static_cast<unsigned>(Val)));
217 return addOperand(Inst, DAsm->decodeDpp8FI(
static_cast<unsigned>(Val)));
220#define DECODE_OPERAND(StaticDecoderName, DecoderName) \
221 static DecodeStatus StaticDecoderName(MCInst &Inst, uint64_t Imm, \
223 const MCDisassembler *Decoder) { \
224 auto DAsm = static_cast<const AMDGPUDisassembler *>(Decoder); \
225 return addOperand(Inst, DAsm->DecoderName(static_cast<unsigned>(Imm))); \
230#define DECODE_OPERAND_REG_8(RegClass) \
231 static DecodeStatus Decode##RegClass##RegisterClass( \
232 MCInst &Inst, uint64_t Imm, uint64_t , \
233 const MCDisassembler *Decoder) { \
234 assert(Imm < (1 << 8) && "8-bit encoding"); \
235 auto DAsm = static_cast<const AMDGPUDisassembler *>(Decoder); \
236 return addOperand(Inst, \
237 DAsm->createRegOperand(AMDGPU::RegClass##RegClassID, \
238 static_cast<unsigned>(Imm))); \
241#define DECODE_SrcOp(Name, EncSize, OpWidth, EncImm) \
242 static DecodeStatus Name(MCInst &Inst, uint64_t Imm, uint64_t , \
243 const MCDisassembler *Decoder) { \
244 if (!isUInt<EncSize>(Imm)) \
245 return MCDisassembler::Fail; \
246 auto DAsm = static_cast<const AMDGPUDisassembler *>(Decoder); \
247 return addOperand(Inst, DAsm->decodeSrcOp(Inst, OpWidth, \
248 static_cast<unsigned>(EncImm))); \
254 assert(
Imm < (1U << EncSize) &&
"Operand doesn't fit encoding!");
257 Inst, DAsm->decodeSrcOp(Inst, OpWidth,
static_cast<unsigned>(EncImm)));
267 if (
Imm >= 128 &&
Imm < 256)
275 unsigned OpWidth = 32;
285 unsigned OpWidth = 32;
294#define DECODE_OPERAND_SREG_7(RegClass, OpWidth) \
295 DECODE_SrcOp(Decode##RegClass##RegisterClass, 7, OpWidth, Imm)
297#define DECODE_OPERAND_SREG_8(RegClass, OpWidth) \
298 DECODE_SrcOp(Decode##RegClass##RegisterClass, 8, OpWidth, Imm)
300#define DECODE_OPERAND_SREG_9(RegClass, OpWidth) \
301 DECODE_SrcOp(Decode##RegClass##RegisterClass, 9, OpWidth, Imm)
307template <
unsigned OpW
idth>
315template <
unsigned OpW
idth>
325template <
unsigned OpW
idth>
337template <
unsigned OpW
idth>
353template <
unsigned OpW
idth>
362template <
unsigned OpW
idth>
417 assert((
Imm & (1 << 8)) == 0 &&
"Imm{8} should not be used");
419 bool IsHi =
Imm & (1 << 9);
420 unsigned RegIdx =
static_cast<unsigned>(
Imm & 0xff);
422 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
430 bool IsHi =
Imm & (1 << 7);
431 unsigned RegIdx =
static_cast<unsigned>(
Imm & 0x7f);
433 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
436template <
unsigned OpW
idth>
444 bool IsHi =
Imm & (1 << 7);
445 unsigned RegIdx =
static_cast<unsigned>(
Imm & 0x7f);
446 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
449 Inst, DAsm->decodeNonVGPRSrcOp(Inst, OpWidth,
450 static_cast<unsigned>(
Imm & 0xFF)));
453template <
unsigned OpW
idth>
461 bool IsHi =
Imm & (1 << 9);
462 unsigned RegIdx =
static_cast<unsigned>(
Imm & 0xff);
463 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
466 Inst, DAsm->decodeNonVGPRSrcOp(Inst, OpWidth,
467 static_cast<unsigned>(
Imm & 0xFF)));
479 bool IsHi =
Imm & (1 << 9);
480 unsigned RegIdx =
static_cast<unsigned>(
Imm & 0xff);
481 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
489 Inst, DAsm->decodeMandatoryLiteralConstant(
static_cast<unsigned>(
Imm)));
496 return addOperand(Inst, DAsm->decodeMandatoryLiteral64Constant(
Imm));
503 DAsm->decodeVOPDDstYOp(Inst,
static_cast<unsigned>(Val)));
510 Inst, DAsm->decodeSrcOp(Inst, Opw,
static_cast<unsigned>(
Imm | 256)));
513template <
unsigned Opw>
523 assert(
Imm < (1 << 9) &&
"9-bit encoding");
526 DAsm->decodeSrcOp(Inst, 64,
static_cast<unsigned>(
Imm)));
529#define DECODE_SDWA(DecName) \
530DECODE_OPERAND(decodeSDWA##DecName, decodeSDWA##DecName)
536#define DECODE_SDWA_IMM_FIELD(Name, MaxImm) \
537 static DecodeStatus Name(MCInst &Inst, uint64_t Imm, uint64_t , \
538 const MCDisassembler * ) { \
539 if (Imm > (MaxImm)) \
540 return MCDisassembler::Fail; \
541 return addOperand(Inst, MCOperand::createImm(Imm)); \
549 AMDGPU::SDWA::DstUnused::UNUSED_PRESERVE)
550#undef DECODE_SDWA_IMM_FIELD
556 return addOperand(Inst, DAsm->decodeVersionImm(
static_cast<unsigned>(
Imm)));
559#include "AMDGPUGenDisassemblerTables.inc"
563template <>
constexpr uint32_t InsnBitWidth<uint32_t> = 32;
564template <>
constexpr uint32_t InsnBitWidth<uint64_t> = 64;
565template <>
constexpr uint32_t InsnBitWidth<std::bitset<96>> = 96;
566template <>
constexpr uint32_t InsnBitWidth<std::bitset<128>> = 128;
573template <
typename InsnType>
575 InsnType Inst, uint64_t
Address,
581 const auto SavedBytes = Bytes;
596 Comments << LocalComments;
603template <
typename InsnType>
608 for (
const uint8_t *
T : {Table1, Table2}) {
619 Bytes = Bytes.
slice(
sizeof(
T));
627 Bytes = Bytes.
slice(8);
629 Bytes = Bytes.
slice(4);
630 return (
Hi << 64) |
Lo;
637 Bytes = Bytes.
slice(8);
639 Bytes = Bytes.
slice(8);
640 return (
Hi << 64) |
Lo;
643bool AMDGPUDisassembler::decodeImmOperands(
MCInst &
MI,
645 const MCInstrDesc &
Desc = MCII.get(
MI.getOpcode());
647 if (OpNo >=
MI.getNumOperands())
657 MCOperand &
Op =
MI.getOperand(OpNo);
660 int64_t
Imm =
Op.getImm();
676 switch (OpDesc.OperandType) {
702 Imm = (F16Val << 16) | (F16Val & 0xFFFF);
730 unsigned MaxInstBytesNum = std::min((
size_t)TargetMaxInstBytes, Bytes_.
size());
731 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
735 Size = std::min((
size_t)4, Bytes_.
size());
747 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
782 if (
STI.hasFeature(AMDGPU::Feature64BitLiterals)) {
784 Bytes = Bytes_.
slice(4, MaxInstBytesNum - 4);
792 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
794 }
else if (Bytes.size() >= 16 &&
795 STI.hasFeature(AMDGPU::FeatureGFX950Insts)) {
801 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
804 if (Bytes.size() >= 8) {
807 if (
STI.hasFeature(AMDGPU::FeatureGFX10_BEncoding) &&
811 if (
STI.hasFeature(AMDGPU::FeatureUnpackedD16VMem) &&
815 if (
STI.hasFeature(AMDGPU::FeatureGFX950Insts) &&
822 if (
STI.hasFeature(AMDGPU::FeatureFmaMixInsts) &&
826 if (
STI.hasFeature(AMDGPU::FeatureGFX940Insts) &&
830 if (
STI.hasFeature(AMDGPU::FeatureGFX90AInsts) &&
882 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
886 if (Bytes.size() >= 4) {
899 if (
STI.hasFeature(AMDGPU::FeatureGFX950Insts) &&
903 if (
STI.hasFeature(AMDGPU::FeatureGFX90AInsts) &&
907 if (
STI.hasFeature(AMDGPU::FeatureGFX10_BEncoding) &&
955 else if (AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::dpp8) !=
967 AMDGPU::OpName::src2_modifiers);
970 if (
MI.getOpcode() == AMDGPU::V_CVT_SR_BF8_F32_e64_dpp ||
971 MI.getOpcode() == AMDGPU::V_CVT_SR_FP8_F32_e64_dpp) {
974 AMDGPU::OpName::src2_modifiers);
983 int CPolPos = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
984 AMDGPU::OpName::cpol);
988 if (
MI.getNumOperands() <= (
unsigned)CPolPos) {
990 AMDGPU::OpName::cpol);
992 MI.getOperand(CPolPos).setImm(
MI.getOperand(CPolPos).getImm() | CPol);
998 (
STI.hasFeature(AMDGPU::FeatureGFX90AInsts))) {
1001 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::tfe);
1002 if (TFEOpIdx != -1) {
1003 auto *TFEIter =
MI.begin();
1004 std::advance(TFEIter, TFEOpIdx);
1012 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::offset);
1013 if (OffsetIdx != -1) {
1016 if (SignedOffset < 0)
1023 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::swz);
1024 if (SWZOpIdx != -1) {
1025 auto *SWZIter =
MI.begin();
1026 std::advance(SWZIter, SWZOpIdx);
1034 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vaddr0);
1036 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::srsrc);
1037 unsigned NSAArgs = RsrcIdx - VAddr0Idx - 1;
1038 if (VAddr0Idx >= 0 && NSAArgs > 0) {
1039 unsigned NSAWords = (NSAArgs + 3) / 4;
1040 if (Bytes.size() < 4 * NSAWords)
1042 for (
unsigned i = 0; i < NSAArgs; ++i) {
1043 const unsigned VAddrIdx = VAddr0Idx + 1 + i;
1045 MCII->getOpRegClassID(
Desc.operands()[VAddrIdx], HwModeRegClass);
1048 Bytes = Bytes.slice(4 * NSAWords);
1072 int VDstIn_Idx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1073 AMDGPU::OpName::vdst_in);
1074 if (VDstIn_Idx != -1) {
1075 int Tied = MCII->get(
MI.getOpcode()).getOperandConstraint(VDstIn_Idx,
1077 if (Tied != -1 && (
MI.getNumOperands() <= (
unsigned)VDstIn_Idx ||
1078 !
MI.getOperand(VDstIn_Idx).isReg() ||
1079 MI.getOperand(VDstIn_Idx).getReg() !=
MI.getOperand(Tied).getReg())) {
1080 if (
MI.getNumOperands() > (
unsigned)VDstIn_Idx)
1081 MI.erase(&
MI.getOperand(VDstIn_Idx));
1084 AMDGPU::OpName::vdst_in);
1096 MCII->get(
MI.getOpcode()).getNumDefs() == 0 &&
1097 MCII->get(
MI.getOpcode()).hasImplicitDefOfPhysReg(AMDGPU::EXEC)) {
1098 auto ExecEncoding = MRI.getEncodingValue(AMDGPU::EXEC_LO);
1099 if (Bytes_[0] != ExecEncoding)
1103 Size = MaxInstBytesNum - Bytes.size();
1108 if (
STI.hasFeature(AMDGPU::FeatureGFX11Insts)) {
1118 if (
MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_t16_gfx11 ||
1119 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_fake16_gfx11 ||
1120 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_t16_gfx12 ||
1121 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_fake16_gfx12 ||
1122 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_t16_gfx13 ||
1123 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_fake16_gfx13 ||
1124 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_t16_gfx11 ||
1125 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_fake16_gfx11 ||
1126 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_t16_gfx12 ||
1127 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_fake16_gfx12 ||
1128 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_t16_gfx13 ||
1129 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_fake16_gfx13 ||
1130 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_t16_gfx11 ||
1131 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_fake16_gfx11 ||
1132 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_t16_gfx12 ||
1133 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_fake16_gfx12 ||
1134 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_t16_gfx13 ||
1135 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_fake16_gfx13 ||
1136 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_t16_gfx11 ||
1137 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_fake16_gfx11 ||
1138 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_t16_gfx12 ||
1139 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_fake16_gfx12 ||
1140 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_t16_gfx13 ||
1141 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_fake16_gfx13) {
1149 if (
STI.hasFeature(AMDGPU::FeatureGFX9) ||
1150 STI.hasFeature(AMDGPU::FeatureGFX10)) {
1154 }
else if (
STI.hasFeature(AMDGPU::FeatureVolcanicIslands)) {
1155 int SDst = AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::sdst);
1159 AMDGPU::OpName::sdst);
1181 NewReg =
MRI.getSubReg(MO.
getReg(), AMDGPU::sub0_sub1_sub2_sub3);
1184 NewReg =
MRI.getSubReg(MO.
getReg(), AMDGPU::sub0_sub1_sub2_sub3_sub4_sub5);
1188 AMDGPU::sub0_sub1_sub2_sub3_sub4_sub5_sub6_sub7);
1197 NewReg =
MRI.getMatchingSuperReg(
1198 BaseReg, AMDGPU::sub0, &
MRI.getRegClass(AMDGPU::VReg_384RegClassID));
1222 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::blgp);
1227 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::cbsz);
1229 unsigned CBSZ =
MI.getOperand(CbszIdx).getImm();
1230 unsigned BLGP =
MI.getOperand(BlgpIdx).getImm();
1234 if (!AdjustedRegClassOpcode ||
1235 AdjustedRegClassOpcode->
Opcode ==
MI.getOpcode())
1238 MI.setOpcode(AdjustedRegClassOpcode->
Opcode);
1240 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src0);
1242 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src1);
1251 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::matrix_a_fmt);
1256 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::matrix_b_fmt);
1258 unsigned FmtA =
MI.getOperand(FmtAIdx).getImm();
1259 unsigned FmtB =
MI.getOperand(FmtBIdx).getImm();
1263 if (!AdjustedRegClassOpcode ||
1264 AdjustedRegClassOpcode->
Opcode ==
MI.getOpcode())
1267 MI.setOpcode(AdjustedRegClassOpcode->
Opcode);
1269 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src0);
1271 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src1);
1289 bool IsVOP3P =
false) {
1291 unsigned Opc =
MI.getOpcode();
1292 const AMDGPU::OpName ModOps[] = {AMDGPU::OpName::src0_modifiers,
1293 AMDGPU::OpName::src1_modifiers,
1294 AMDGPU::OpName::src2_modifiers};
1295 for (
int J = 0; J < 3; ++J) {
1296 int OpIdx = AMDGPU::getNamedOperandIdx(
Opc, ModOps[J]);
1300 unsigned Val =
MI.getOperand(OpIdx).getImm();
1307 }
else if (J == 0) {
1318 const unsigned Opc =
MI.getOpcode();
1320 MRI.getRegClass(AMDGPU::VGPR_16RegClassID);
1321 constexpr std::array<std::tuple<AMDGPU::OpName, AMDGPU::OpName, unsigned>, 4>
1322 OpAndOpMods = {{{AMDGPU::OpName::src0, AMDGPU::OpName::src0_modifiers,
1324 {AMDGPU::OpName::src1, AMDGPU::OpName::src1_modifiers,
1326 {AMDGPU::OpName::src2, AMDGPU::OpName::src2_modifiers,
1328 {AMDGPU::OpName::vdst, AMDGPU::OpName::src0_modifiers,
1330 for (
const auto &[
OpName, OpModsName, OpSelMask] : OpAndOpMods) {
1331 int OpIdx = AMDGPU::getNamedOperandIdx(
Opc,
OpName);
1332 int OpModsIdx = AMDGPU::getNamedOperandIdx(
Opc, OpModsName);
1333 if (OpIdx == -1 || OpModsIdx == -1)
1340 unsigned OpEnc = MRI.getEncodingValue(
Op.getReg());
1341 const MCOperand &OpMods =
MI.getOperand(OpModsIdx);
1342 unsigned ModVal = OpMods.
getImm();
1343 if (ModVal & OpSelMask) {
1353 constexpr int DST_IDX = 0;
1354 auto Opcode =
MI.getOpcode();
1355 const auto &
Desc = MCII->get(Opcode);
1356 auto OldIdx = AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::old);
1358 if (OldIdx != -1 &&
Desc.getOperandConstraint(
1362 AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::src2),
1373 assert(
MI.getNumOperands() + 1 < MCII->get(
MI.getOpcode()).getNumOperands());
1376 AMDGPU::OpName::src2_modifiers);
1380 unsigned Opc =
MI.getOpcode();
1383 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vdst_in);
1384 if (VDstInIdx != -1)
1387 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1388 if (
MI.getNumOperands() < DescNumOps &&
1393 AMDGPU::OpName::op_sel);
1396 if (
MI.getNumOperands() < DescNumOps &&
1399 AMDGPU::OpName::src0_modifiers);
1401 if (
MI.getNumOperands() < DescNumOps &&
1404 AMDGPU::OpName::src1_modifiers);
1412 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vdst_in);
1413 if (VDstInIdx != -1)
1416 unsigned Opc =
MI.getOpcode();
1417 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1418 if (
MI.getNumOperands() < DescNumOps &&
1422 AMDGPU::OpName::op_sel);
1436 if (
MRI.getRegClass(AMDGPU::VGPR_32RegClassID).contains(Sub0))
1437 BaseReg = AMDGPU::VGPR0;
1438 else if (
MRI.getRegClass(AMDGPU::AGPR_32RegClassID).contains(Sub0))
1439 BaseReg = AMDGPU::AGPR0;
1441 assert(BaseReg &&
"Only vector registers expected");
1443 return (Sub0 - BaseReg + NumRegs <= 256) ?
Reg :
MCRegister();
1450 int VDstIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1451 AMDGPU::OpName::vdst);
1453 int VDataIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1454 AMDGPU::OpName::vdata);
1456 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vaddr0);
1458 ? AMDGPU::OpName::srsrc
1459 : AMDGPU::OpName::rsrc;
1460 int RsrcIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(), RsrcOpName);
1461 int DMaskIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1462 AMDGPU::OpName::dmask);
1464 int TFEIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1465 AMDGPU::OpName::tfe);
1466 int D16Idx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1467 AMDGPU::OpName::d16);
1474 if (BaseOpcode->
BVH) {
1480 bool IsAtomic = (VDstIdx != -1);
1484 bool IsPartialNSA =
false;
1485 unsigned AddrSize = Info->VAddrDwords;
1489 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::dim);
1491 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::a16);
1494 const bool IsA16 = (A16Idx != -1 &&
MI.getOperand(A16Idx).
getImm());
1501 IsNSA = Info->MIMGEncoding == AMDGPU::MIMGEncGfx10NSA ||
1502 Info->MIMGEncoding == AMDGPU::MIMGEncGfx11NSA ||
1503 Info->MIMGEncoding == AMDGPU::MIMGEncGfx12 ||
1504 Info->MIMGEncoding == AMDGPU::MIMGEncGfx13;
1506 if (!IsVSample && AddrSize > 12)
1509 if (AddrSize > Info->VAddrDwords) {
1510 if (!
STI.hasFeature(AMDGPU::FeaturePartialNSAEncoding)) {
1515 IsPartialNSA =
true;
1520 unsigned DMask =
MI.getOperand(DMaskIdx).getImm() & 0xf;
1521 unsigned DstSize = IsGather4 ? 4 : std::max(
llvm::popcount(DMask), 1);
1523 bool D16 = D16Idx >= 0 &&
MI.getOperand(D16Idx).getImm();
1525 DstSize = (DstSize + 1) / 2;
1528 if (TFEIdx != -1 &&
MI.getOperand(TFEIdx).getImm())
1531 if (DstSize == Info->VDataDwords && AddrSize == Info->VAddrDwords)
1536 AddrSize, Info->IndexedRsrc, Info->IndexedSamp);
1537 if (NewOpcode == -1)
1542 if (DstSize != Info->VDataDwords) {
1543 auto DataRCID = MCII->getOpRegClassID(
1544 MCII->get(NewOpcode).operands()[VDataIdx], HwModeRegClass);
1548 MCRegister VdataSub0 = MRI.getSubReg(Vdata0, AMDGPU::sub0);
1549 Vdata0 = (VdataSub0 != 0)? VdataSub0 : Vdata0;
1552 NewVdata = MRI.getMatchingSuperReg(Vdata0, AMDGPU::sub0, &NewRC);
1563 int VAddrSAIdx = IsPartialNSA ? (RsrcIdx - 1) : VAddr0Idx;
1565 if (
STI.hasFeature(AMDGPU::FeatureNSAEncoding) && (!IsNSA || IsPartialNSA) &&
1566 AddrSize != Info->VAddrDwords) {
1567 MCRegister VAddrSA =
MI.getOperand(VAddrSAIdx).getReg();
1568 MCRegister VAddrSubSA = MRI.getSubReg(VAddrSA, AMDGPU::sub0);
1569 VAddrSA = VAddrSubSA ? VAddrSubSA : VAddrSA;
1571 auto AddrRCID = MCII->getOpRegClassID(
1572 MCII->get(NewOpcode).operands()[VAddrSAIdx], HwModeRegClass);
1575 NewVAddrSA = MRI.getMatchingSuperReg(VAddrSA, AMDGPU::sub0, &NewRC);
1581 MI.setOpcode(NewOpcode);
1583 if (NewVdata != AMDGPU::NoRegister) {
1595 assert(AddrSize <= Info->VAddrDwords);
1596 MI.erase(
MI.begin() + VAddr0Idx + AddrSize,
1597 MI.begin() + VAddr0Idx + Info->VAddrDwords);
1605 unsigned Opc =
MI.getOpcode();
1606 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1609 if (
MI.getNumOperands() < DescNumOps &&
1613 if (
MI.getNumOperands() < DescNumOps &&
1616 AMDGPU::OpName::op_sel);
1617 if (
MI.getNumOperands() < DescNumOps &&
1620 AMDGPU::OpName::op_sel_hi);
1621 if (
MI.getNumOperands() < DescNumOps &&
1624 AMDGPU::OpName::neg_lo);
1625 if (
MI.getNumOperands() < DescNumOps &&
1628 AMDGPU::OpName::neg_hi);
1633 unsigned Opc =
MI.getOpcode();
1634 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1636 if (
MI.getNumOperands() < DescNumOps &&
1640 if (
MI.getNumOperands() < DescNumOps &&
1643 AMDGPU::OpName::src0_modifiers);
1645 if (
MI.getNumOperands() < DescNumOps &&
1648 AMDGPU::OpName::src1_modifiers);
1652 unsigned Opc =
MI.getOpcode();
1653 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1657 if (
MI.getNumOperands() < DescNumOps &&
1661 AMDGPU::OpName::op_sel);
1666 assert(HasLiteral &&
"Should have decoded a literal");
1672 &getAMDGPUMCRegisterClass(RegClassID));
1677 const Twine& ErrMsg)
const {
1691 unsigned Val)
const {
1692 const auto &RegCl = getAMDGPUMCRegisterClass(RegClassID);
1693 if (Val >= RegCl.getNumRegs())
1695 ": unknown register " +
Twine(Val));
1701 unsigned Val)
const {
1705 switch (SRegClassID) {
1706 case AMDGPU::SGPR_32RegClassID:
1707 case AMDGPU::TTMP_32RegClassID:
1709 case AMDGPU::SGPR_64RegClassID:
1710 case AMDGPU::TTMP_64RegClassID:
1713 case AMDGPU::SGPR_96RegClassID:
1714 case AMDGPU::TTMP_96RegClassID:
1715 case AMDGPU::SGPR_128RegClassID:
1716 case AMDGPU::TTMP_128RegClassID:
1719 case AMDGPU::SGPR_256RegClassID:
1720 case AMDGPU::TTMP_256RegClassID:
1723 case AMDGPU::SGPR_288RegClassID:
1724 case AMDGPU::TTMP_288RegClassID:
1725 case AMDGPU::SGPR_320RegClassID:
1726 case AMDGPU::TTMP_320RegClassID:
1727 case AMDGPU::SGPR_352RegClassID:
1728 case AMDGPU::TTMP_352RegClassID:
1729 case AMDGPU::SGPR_384RegClassID:
1730 case AMDGPU::TTMP_384RegClassID:
1731 case AMDGPU::SGPR_512RegClassID:
1732 case AMDGPU::TTMP_512RegClassID:
1741 if (Val % (1 << shift)) {
1743 <<
": scalar reg isn't aligned " << Val;
1751 unsigned RegIdxInVGPR16 = RegIdx * 2 + (IsHi ? 1 : 0);
1761 "Should only decode multiple kimm with VOPD, check VSrc operand types");
1763 return errOperand(Val,
"More than one unique literal is illegal");
1774 return errOperand(Val,
"More than one unique literal is illegal");
1779 bool UseLit64 =
Hi_32(Literal) == 0;
1792 if (Bytes.size() < 4) {
1793 return errOperand(0,
"cannot read literal, inst bytes left " +
1794 Twine(Bytes.size()));
1801 bool HasInv2Pi =
true;
1805 int64_t Val = Literal;
1806 bool UseLit =
false;
1878 assert(
STI.hasFeature(AMDGPU::Feature64BitLiterals));
1881 if (Bytes.size() < 8) {
1882 return errOperand(0,
"cannot read literal64, inst bytes left " +
1883 Twine(Bytes.size()));
1889 bool UseLit64 =
Hi_32(Literal) == 0;
1892 Literal,
STI.hasFeature(AMDGPU::FeatureInv2PiInlineImm));
1902 assert(
Imm >= INLINE_INTEGER_C_MIN &&
Imm <= INLINE_INTEGER_C_MAX);
1904 (
static_cast<int64_t
>(
Imm) - INLINE_INTEGER_C_MIN) :
1905 (INLINE_INTEGER_C_POSITIVE_MAX -
static_cast<int64_t
>(
Imm)));
1953 return 0x3fc45f306dc9c882;
2015 return VGPR_32RegClassID;
2017 return VReg_64RegClassID;
2019 return VReg_96RegClassID;
2021 return VReg_128RegClassID;
2023 return VReg_160RegClassID;
2025 return VReg_192RegClassID;
2027 return VReg_256RegClassID;
2029 return VReg_288RegClassID;
2031 return VReg_320RegClassID;
2033 return VReg_352RegClassID;
2035 return VReg_384RegClassID;
2037 return VReg_512RegClassID;
2039 return VReg_1024RegClassID;
2050 return AGPR_32RegClassID;
2052 return AReg_64RegClassID;
2054 return AReg_96RegClassID;
2056 return AReg_128RegClassID;
2058 return AReg_160RegClassID;
2060 return AReg_256RegClassID;
2062 return AReg_288RegClassID;
2064 return AReg_320RegClassID;
2066 return AReg_352RegClassID;
2068 return AReg_384RegClassID;
2070 return AReg_512RegClassID;
2072 return AReg_1024RegClassID;
2077std::optional<unsigned>
2084 return SGPR_32RegClassID;
2086 return SGPR_64RegClassID;
2088 return SGPR_96RegClassID;
2090 return SGPR_128RegClassID;
2092 return SGPR_160RegClassID;
2094 return SGPR_256RegClassID;
2096 return SGPR_288RegClassID;
2098 return SGPR_320RegClassID;
2100 return SGPR_352RegClassID;
2102 return SGPR_384RegClassID;
2104 return SGPR_512RegClassID;
2106 return std::nullopt;
2109std::optional<unsigned>
2116 return TTMP_32RegClassID;
2118 return TTMP_64RegClassID;
2120 return TTMP_128RegClassID;
2122 return TTMP_256RegClassID;
2124 return TTMP_288RegClassID;
2126 return TTMP_320RegClassID;
2128 return TTMP_352RegClassID;
2130 return TTMP_384RegClassID;
2132 return TTMP_512RegClassID;
2134 return std::nullopt;
2140 unsigned TTmpMin =
isGFX9Plus() ? TTMP_GFX9PLUS_MIN : TTMP_VI_MIN;
2141 unsigned TTmpMax =
isGFX9Plus() ? TTMP_GFX9PLUS_MAX : TTMP_VI_MAX;
2143 return (TTmpMin <= Val && Val <= TTmpMax)? Val - TTmpMin : -1;
2147 unsigned Val)
const {
2152 bool IsAGPR = Val & 512;
2155 if (VGPR_MIN <= Val && Val <= VGPR_MAX) {
2164 unsigned Val)
const {
2167 assert(Val < (1 << 8) &&
"9-bit Src encoding when Val{8} is 0");
2172 auto UnsupportedWidth = [&]() {
2174 "-bit non-VGPR operand encoding " +
Twine(Val));
2179 static_assert(SGPR_MIN == 0);
2182 return UnsupportedWidth();
2190 return UnsupportedWidth();
2194 if ((INLINE_INTEGER_C_MIN <= Val && Val <= INLINE_INTEGER_C_MAX) ||
2195 (INLINE_FLOATING_C_MIN <= Val && Val <= INLINE_FLOATING_C_MAX) ||
2196 Val == LITERAL_CONST)
2199 if (Val == LITERAL64_CONST &&
STI.hasFeature(AMDGPU::Feature64BitLiterals)) {
2205 "64-bit literal is not supported by this instruction");
2222 return UnsupportedWidth();
2229 unsigned Val)
const {
2231 AMDGPU::getNamedOperandIdx(Inst.
getOpcode(), AMDGPU::OpName::vdstX);
2234 unsigned XDstReg = MRI.getEncodingValue(Inst.
getOperand(VDstXInd).
getReg());
2235 Val |= ~XDstReg & 1;
2358 const unsigned Val)
const {
2362 if (
STI.hasFeature(AMDGPU::FeatureGFX9) ||
2363 STI.hasFeature(AMDGPU::FeatureGFX10)) {
2366 if (
int(SDWA9EncValues::SRC_VGPR_MIN) <=
int(Val) &&
2367 Val <= SDWA9EncValues::SRC_VGPR_MAX) {
2369 Val - SDWA9EncValues::SRC_VGPR_MIN);
2371 if (SDWA9EncValues::SRC_SGPR_MIN <= Val &&
2372 Val <= (
isGFX10Plus() ? SDWA9EncValues::SRC_SGPR_MAX_GFX10
2373 : SDWA9EncValues::SRC_SGPR_MAX_SI)) {
2375 Val - SDWA9EncValues::SRC_SGPR_MIN);
2377 if (SDWA9EncValues::SRC_TTMP_MIN <= Val &&
2378 Val <= SDWA9EncValues::SRC_TTMP_MAX) {
2380 Val - SDWA9EncValues::SRC_TTMP_MIN);
2383 const unsigned SVal = Val - SDWA9EncValues::SRC_SGPR_MIN;
2385 if ((INLINE_INTEGER_C_MIN <= SVal && SVal <= INLINE_INTEGER_C_MAX) ||
2386 (INLINE_FLOATING_C_MIN <= SVal && SVal <= INLINE_FLOATING_C_MAX))
2391 if (
STI.hasFeature(AMDGPU::FeatureVolcanicIslands))
2407 assert((
STI.hasFeature(AMDGPU::FeatureGFX9) ||
2408 STI.hasFeature(AMDGPU::FeatureGFX10)) &&
2409 "SDWAVopcDst should be present only on GFX9+");
2411 bool IsWave32 =
STI.hasFeature(AMDGPU::FeatureWavefrontSize32);
2413 if (Val & SDWA9EncValues::VOPC_DST_VCC_MASK) {
2414 Val &= SDWA9EncValues::VOPC_DST_SGPR_MASK;
2428 unsigned Val)
const {
2429 return STI.hasFeature(AMDGPU::FeatureWavefrontSize32)
2435 unsigned Val)
const {
2437 constexpr unsigned M0Encoding = 125;
2438 bool IsValidBarrier =
2439 Val == M0Encoding ||
2440 (INLINE_INTEGER_C_MIN <= Val && Val < INLINE_INTEGER_C_MIN + 32) ||
2441 (INLINE_INTEGER_C_POSITIVE_MAX < Val &&
2442 Val <= INLINE_INTEGER_C_POSITIVE_MAX + 4);
2443 if (!IsValidBarrier)
2461 auto [
Version, W64, W32, MDP] = Encoding::decode(
Imm);
2464 if (Encoding::encode(
Version, W64, W32, MDP) !=
Imm)
2474 if (
I == Versions.end())
2490 return STI.hasFeature(AMDGPU::FeatureVolcanicIslands);
2496 return STI.hasFeature(AMDGPU::FeatureGFX90AInsts);
2508 return STI.hasFeature(AMDGPU::FeatureGFX11);
2516 return STI.hasFeature(AMDGPU::FeatureGFX11_7Insts);
2520 return STI.hasFeature(AMDGPU::FeatureGFX12);
2540 return STI.hasFeature(AMDGPU::FeatureArchitectedFlatScratch);
2561 if (PopCount == 1) {
2562 S <<
"bit (" << (TrailingZeros + BaseBytes * CHAR_BIT) <<
')';
2564 S <<
"bits in range ("
2565 << (TrailingZeros + PopCount - 1 + BaseBytes * CHAR_BIT) <<
':'
2566 << (TrailingZeros + BaseBytes * CHAR_BIT) <<
')';
2572#define GET_FIELD(MASK) (AMDHSA_BITS_GET(FourByteBuffer, MASK))
2573#define PRINT_DIRECTIVE(DIRECTIVE, MASK) \
2575 KdStream << Indent << DIRECTIVE " " << GET_FIELD(MASK) << '\n'; \
2577#define PRINT_PSEUDO_DIRECTIVE_COMMENT(DIRECTIVE, MASK) \
2579 KdStream << Indent << MAI.getCommentString() << ' ' << DIRECTIVE " " \
2580 << GET_FIELD(MASK) << '\n'; \
2583#define CHECK_RESERVED_BITS_IMPL(MASK, DESC, MSG) \
2585 if (FourByteBuffer & (MASK)) { \
2586 return createStringError(std::errc::invalid_argument, \
2587 "kernel descriptor " DESC \
2588 " reserved %s set" MSG, \
2589 getBitRangeFromMask((MASK), 0).c_str()); \
2593#define CHECK_RESERVED_BITS(MASK) CHECK_RESERVED_BITS_IMPL(MASK, #MASK, "")
2594#define CHECK_RESERVED_BITS_MSG(MASK, MSG) \
2595 CHECK_RESERVED_BITS_IMPL(MASK, #MASK, ", " MSG)
2596#define CHECK_RESERVED_BITS_DESC(MASK, DESC) \
2597 CHECK_RESERVED_BITS_IMPL(MASK, DESC, "")
2598#define CHECK_RESERVED_BITS_DESC_MSG(MASK, DESC, MSG) \
2599 CHECK_RESERVED_BITS_IMPL(MASK, DESC, ", " MSG)
2612 uint32_t GranulatedWorkitemVGPRCount =
2613 GET_FIELD(COMPUTE_PGM_RSRC1_GRANULATED_WORKITEM_VGPR_COUNT);
2616 (GranulatedWorkitemVGPRCount + 1) *
2619 KdStream << Indent <<
".amdhsa_next_free_vgpr " << NextFreeVGPR <<
'\n';
2640 uint32_t GranulatedWavefrontSGPRCount =
2641 GET_FIELD(COMPUTE_PGM_RSRC1_GRANULATED_WAVEFRONT_SGPR_COUNT);
2645 "must be zero on gfx10+");
2647 uint32_t NextFreeSGPR = (GranulatedWavefrontSGPRCount + 1) *
2650 KdStream << Indent <<
".amdhsa_reserve_vcc " << 0 <<
'\n';
2652 KdStream << Indent <<
".amdhsa_reserve_flat_scratch " << 0 <<
'\n';
2656 bool ReservedXnackMask = TargetID.isXnackOnOrAny();
2657 if (
STI.hasFeature(AMDGPU::FeatureSupportsXNACK) || ReservedXnackMask) {
2658 KdStream << Indent <<
".amdhsa_reserve_xnack_mask " << ReservedXnackMask
2661 KdStream << Indent <<
".amdhsa_next_free_sgpr " << NextFreeSGPR <<
"\n";
2666 COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_32);
2668 COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_16_64);
2670 COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_32);
2672 COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_16_64);
2676 if (
STI.hasFeature(AMDGPU::FeatureDX10ClampAndIEEEMode))
2678 COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_DX10_CLAMP);
2682 if (
STI.hasFeature(AMDGPU::FeatureDX10ClampAndIEEEMode))
2684 COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_IEEE_MODE);
2691 PRINT_DIRECTIVE(
".amdhsa_fp16_overflow", COMPUTE_PGM_RSRC1_GFX9_PLUS_FP16_OVFL);
2694 "COMPUTE_PGM_RSRC1",
"must be zero pre-gfx9");
2700 COMPUTE_PGM_RSRC1_GFX125_FLAT_SCRATCH_IS_NV);
2703 "COMPUTE_PGM_RSRC1");
2714 COMPUTE_PGM_RSRC1_GFX10_PLUS_WGP_MODE);
2716 PRINT_DIRECTIVE(
".amdhsa_memory_ordered", COMPUTE_PGM_RSRC1_GFX10_PLUS_MEM_ORDERED);
2717 PRINT_DIRECTIVE(
".amdhsa_forward_progress", COMPUTE_PGM_RSRC1_GFX10_PLUS_FWD_PROGRESS);
2720 "COMPUTE_PGM_RSRC1");
2725 COMPUTE_PGM_RSRC1_GFX12_PLUS_ENABLE_WG_RR_EN);
2737 COMPUTE_PGM_RSRC2_ENABLE_PRIVATE_SEGMENT);
2739 PRINT_DIRECTIVE(
".amdhsa_system_sgpr_private_segment_wavefront_offset",
2740 COMPUTE_PGM_RSRC2_ENABLE_PRIVATE_SEGMENT);
2742 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_X);
2744 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Y);
2746 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Z);
2748 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_INFO);
2750 COMPUTE_PGM_RSRC2_ENABLE_VGPR_WORKITEM_ID);
2757 ".amdhsa_exception_fp_ieee_invalid_op",
2758 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INVALID_OPERATION);
2760 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_FP_DENORMAL_SOURCE);
2762 ".amdhsa_exception_fp_ieee_div_zero",
2763 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_DIVISION_BY_ZERO);
2765 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_OVERFLOW);
2767 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_UNDERFLOW);
2769 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INEXACT);
2771 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_INT_DIVIDE_BY_ZERO);
2784 KdStream << Indent <<
".amdhsa_accum_offset "
2785 << (
GET_FIELD(COMPUTE_PGM_RSRC3_GFX90A_ACCUM_OFFSET) + 1) * 4
2788 PRINT_DIRECTIVE(
".amdhsa_tg_split", COMPUTE_PGM_RSRC3_GFX90A_TG_SPLIT);
2791 "COMPUTE_PGM_RSRC3",
"must be zero on gfx90a");
2793 "COMPUTE_PGM_RSRC3",
"must be zero on gfx90a");
2797 if (!EnableWavefrontSize32 || !*EnableWavefrontSize32) {
2799 COMPUTE_PGM_RSRC3_GFX10_GFX11_SHARED_VGPR_COUNT);
2802 "SHARED_VGPR_COUNT",
2803 COMPUTE_PGM_RSRC3_GFX10_GFX11_SHARED_VGPR_COUNT);
2807 "COMPUTE_PGM_RSRC3",
2808 "must be zero on gfx12+");
2814 COMPUTE_PGM_RSRC3_GFX11_INST_PREF_SIZE);
2816 COMPUTE_PGM_RSRC3_GFX11_TRAP_ON_START);
2818 COMPUTE_PGM_RSRC3_GFX11_TRAP_ON_END);
2821 COMPUTE_PGM_RSRC3_GFX12_PLUS_INST_PREF_SIZE);
2824 "COMPUTE_PGM_RSRC3",
2825 "must be zero on gfx10");
2830 "COMPUTE_PGM_RSRC3",
"must be zero on gfx10+");
2835 COMPUTE_PGM_RSRC3_GFX12_PLUS_GLG_EN);
2838 "COMPUTE_PGM_RSRC3",
2839 "must be zero on gfx10 or gfx11");
2845 COMPUTE_PGM_RSRC3_GFX125_NAMED_BAR_CNT);
2847 "ENABLE_DYNAMIC_VGPR", COMPUTE_PGM_RSRC3_GFX125_ENABLE_DYNAMIC_VGPR);
2849 COMPUTE_PGM_RSRC3_GFX125_TCP_SPLIT);
2851 "ENABLE_DIDT_THROTTLE",
2852 COMPUTE_PGM_RSRC3_GFX125_ENABLE_DIDT_THROTTLE);
2855 "COMPUTE_PGM_RSRC3",
2856 "must be zero on gfx10+");
2861 "COMPUTE_PGM_RSRC3",
"must be zero on gfx10+");
2866 COMPUTE_PGM_RSRC3_GFX11_PLUS_IMAGE_OP);
2869 "COMPUTE_PGM_RSRC3",
2870 "must be zero on gfx10");
2872 }
else if (FourByteBuffer) {
2874 std::errc::invalid_argument,
2875 "kernel descriptor COMPUTE_PGM_RSRC3 must be all zero before gfx9");
2879#undef PRINT_PSEUDO_DIRECTIVE_COMMENT
2880#undef PRINT_DIRECTIVE
2882#undef CHECK_RESERVED_BITS_IMPL
2883#undef CHECK_RESERVED_BITS
2884#undef CHECK_RESERVED_BITS_MSG
2885#undef CHECK_RESERVED_BITS_DESC
2886#undef CHECK_RESERVED_BITS_DESC_MSG
2891 const char *
Msg =
"") {
2893 std::errc::invalid_argument,
"kernel descriptor reserved %s set%s%s",
2900 unsigned WidthInBytes) {
2904 std::errc::invalid_argument,
2905 "kernel descriptor reserved bits in range (%u:%u) set",
2906 (BaseInBytes + WidthInBytes) * CHAR_BIT - 1, BaseInBytes * CHAR_BIT);
2912#define PRINT_DIRECTIVE(DIRECTIVE, MASK) \
2914 KdStream << Indent << DIRECTIVE " " \
2915 << ((TwoByteBuffer & MASK) >> (MASK##_SHIFT)) << '\n'; \
2918 uint16_t TwoByteBuffer = 0;
2924 assert(Bytes.size() == 64);
2927 switch (Cursor.tell()) {
2929 FourByteBuffer = DE.
getU32(Cursor);
2930 KdStream << Indent <<
".amdhsa_group_segment_fixed_size " << FourByteBuffer
2935 FourByteBuffer = DE.
getU32(Cursor);
2936 KdStream << Indent <<
".amdhsa_private_segment_fixed_size "
2937 << FourByteBuffer <<
'\n';
2941 FourByteBuffer = DE.
getU32(Cursor);
2942 KdStream << Indent <<
".amdhsa_kernarg_size "
2943 << FourByteBuffer <<
'\n';
2948 ReservedBytes = DE.
getBytes(Cursor, 4);
2949 for (
char B : ReservedBytes) {
2964 ReservedBytes = DE.
getBytes(Cursor, 20);
2965 for (
char B : ReservedBytes) {
2972 FourByteBuffer = DE.
getU32(Cursor);
2976 FourByteBuffer = DE.
getU32(Cursor);
2980 FourByteBuffer = DE.
getU32(Cursor);
2985 TwoByteBuffer = DE.
getU16(Cursor);
2989 KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER);
2991 KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_PTR);
2993 KERNEL_CODE_PROPERTY_ENABLE_SGPR_QUEUE_PTR);
2995 KERNEL_CODE_PROPERTY_ENABLE_SGPR_KERNARG_SEGMENT_PTR);
2997 KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_ID);
3000 KERNEL_CODE_PROPERTY_ENABLE_SGPR_FLAT_SCRATCH_INIT);
3002 KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE);
3004 if (TwoByteBuffer & KERNEL_CODE_PROPERTY_RESERVED0)
3010 (TwoByteBuffer & KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32)) {
3012 KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32,
3017 KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32);
3022 KERNEL_CODE_PROPERTY_USES_DYNAMIC_STACK);
3024 if (TwoByteBuffer & KERNEL_CODE_PROPERTY_RESERVED1) {
3033 TwoByteBuffer = DE.
getU16(Cursor);
3034 if (TwoByteBuffer & KERNARG_PRELOAD_SPEC_LENGTH) {
3036 KERNARG_PRELOAD_SPEC_LENGTH);
3039 if (TwoByteBuffer & KERNARG_PRELOAD_SPEC_OFFSET) {
3041 KERNARG_PRELOAD_SPEC_OFFSET);
3047 ReservedBytes = DE.
getBytes(Cursor, 4);
3048 for (
char B : ReservedBytes) {
3058#undef PRINT_DIRECTIVE
3065 if (Bytes.size() != 64 || KdAddress % 64 != 0)
3067 "kernel descriptor must be 64-byte aligned");
3075 uint16_t KernelCodeProperties =
3078 EnableWavefrontSize32 =
3080 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32);
3085 KdStream <<
".amdhsa_kernel " << KdName <<
'\n';
3088 while (
C &&
C.tell() < Bytes.size()) {
3096 KdStream <<
".end_amdhsa_kernel\n";
3115 "code object v2 is not supported");
3128const MCExpr *AMDGPUDisassembler::createConstantSymbolExpr(
StringRef Id,
3131 MCSymbol *Sym = Ctx.getOrCreateSymbol(Id);
3139 if (!Valid || Res != Val)
3140 Ctx.reportWarning(
SMLoc(),
"unsupported redefinition of " + Id);
3165 uint64_t ,
bool IsBranch, uint64_t ,
3166 uint64_t , uint64_t ) {
3177 return Val.
Addr ==
static_cast<uint64_t
>(
Value) &&
3180 if (Result != Symbols->end()) {
3181 auto *Sym =
Ctx.getOrCreateSymbol(Result->Name);
3187 ReferencedAddresses.push_back(
static_cast<uint64_t
>(
Value));
3206 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 DecodeStatus DecodeVGPR_16_Lo128RegisterClass(MCInst &Inst, uint64_t Imm, uint64_t, const MCDisassembler *Decoder)
static VOPModifiers collectVOPModifiers(const MCInst &MI, bool IsVOP3P=false)
static DecodeStatus decodeSrcRegOrImmA9(MCInst &Inst, uint64_t Imm, uint64_t, const MCDisassembler *Decoder)
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 decodeSrcOp(MCInst &Inst, unsigned EncSize, unsigned OpWidth, uint64_t Imm, uint64_t EncImm, 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...
static DecodeStatus decodeDpp8FI(MCInst &Inst, uint64_t Val, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus decodeSrcReg9(MCInst &Inst, uint64_t Imm, uint64_t, const MCDisassembler *Decoder)
#define DECODE_OPERAND_SREG_8(RegClass, OpWidth)
static DecodeStatus decodeSrcA9(MCInst &Inst, uint64_t Imm, uint64_t, const MCDisassembler *Decoder)
static DecodeStatus decodeOperandVOPDDstY(MCInst &Inst, uint64_t Val, uint64_t Addr, const void *Decoder)
static std::bitset< 128 > eat16Bytes(ArrayRef< uint8_t > &Bytes)
#define DECODE_OPERAND_SREG_7(RegClass, OpWidth)
#define PRINT_PSEUDO_DIRECTIVE_COMMENT(DIRECTIVE, MASK)
static DecodeStatus decodeSMEMOffset(MCInst &Inst, uint64_t Imm, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus decodeOperand_VSrcT16(MCInst &Inst, uint64_t Imm, uint64_t, const MCDisassembler *Decoder)
static DecodeStatus decodeOperand_VSrcT16_Lo128(MCInst &Inst, uint64_t Imm, uint64_t, const MCDisassembler *Decoder)
static MCRegister CheckVGPROverflow(MCRegister Reg, const MCRegisterClass &RC, const MCRegisterInfo &MRI)
static int64_t getInlineImmValBF16(unsigned Imm)
#define DECODE_SDWA(DecName)
#define DECODE_OPERAND_REG_8(RegClass)
static DecodeStatus decodeSrcAV10(MCInst &Inst, uint64_t Imm, uint64_t, const MCDisassembler *Decoder)
#define PRINT_DIRECTIVE(DIRECTIVE, MASK)
static DecodeStatus decodeBoolReg(MCInst &Inst, uint64_t Val, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus decodeOperand_KImmFP(MCInst &Inst, uint64_t Imm, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus decodeRsrcReg256(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder)
static int64_t getInlineImmVal32(unsigned Imm)
static MCDisassembler::DecodeStatus addOperand(MCInst &Inst, const MCOperand &Opnd)
static DecodeStatus decodeOperand_VSrc_f64(MCInst &Inst, uint64_t Imm, uint64_t Addr, const MCDisassembler *Decoder)
#define CHECK_RESERVED_BITS(MASK)
static int64_t getInlineImmVal64(unsigned Imm)
static DecodeStatus decodeSrcRegOrImm9(MCInst &Inst, uint64_t Imm, uint64_t, const MCDisassembler *Decoder)
static T eatBytes(ArrayRef< uint8_t > &Bytes)
static DecodeStatus decodeSplitBarrier(MCInst &Inst, uint64_t Val, uint64_t Addr, const MCDisassembler *Decoder)
#define DECODE_SDWA_IMM_FIELD(Name, MaxImm)
static MCDisassembler * createAMDGPUDisassembler(const Target &T, const MCSubtargetInfo &STI, MCContext &Ctx)
static DecodeStatus decodeSOPPBrTarget(MCInst &Inst, uint64_t Imm, uint64_t Addr, const MCDisassembler *Decoder)
#define CHECK_RESERVED_BITS_MSG(MASK, MSG)
static DecodeStatus decodeAV10(MCInst &Inst, uint64_t Imm, uint64_t, const MCDisassembler *Decoder)
uint64_t const MCDisassembler * Decoder
static MCSymbolizer * createAMDGPUSymbolizer(const Triple &, LLVMOpInfoCallback, LLVMSymbolLookupCallback, void *DisInfo, MCContext *Ctx, std::unique_ptr< MCRelocationInfo > &&RelInfo)
static int64_t getInlineImmValF16(unsigned Imm)
static std::bitset< 96 > eat12Bytes(ArrayRef< uint8_t > &Bytes)
static DecodeStatus decodeAVLdSt(MCInst &Inst, uint64_t Imm, unsigned Opw, const MCDisassembler *Decoder)
static DecodeStatus decodeRsrcReg128(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder)
static DecodeStatus DecodeVGPR_16RegisterClass(MCInst &Inst, uint64_t 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 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...
static DecodeStatus decodeOperand_VGPR_16(MCInst &Inst, uint64_t Imm, uint64_t, const MCDisassembler *Decoder)
#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
MachineRegisterInfo & MRI
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...
const char * getRegClassName(const MCRegisterClass *Class) const
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.
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)
bool isGFX9(const MCSubtargetInfo &STI)
LLVM_READONLY bool hasNamedOperand(uint32_t Opcode, OpName NamedIdx)
int getMIMGOpcode(unsigned BaseOpcode, unsigned MIMGEncoding, unsigned VDataDwords, unsigned VAddrDwords, bool IndexedRsrc, bool IndexedSamp)
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_IMM_NOINLINE_FP16
@ 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.