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 switch (SrameccSetting) {
109 TargetID.setSramEccSetting(AMDGPU::TargetIDSetting::Any);
112 TargetID.setSramEccSetting(AMDGPU::TargetIDSetting::Off);
116 TargetID.setSramEccSetting(AMDGPU::TargetIDSetting::On);
123 bool XnackHardwiredOn = TargetID.isXnackSupported() &&
124 !
STI.hasFeature(AMDGPU::FeatureXNACKOnOffModes);
130 TargetID.setXnackSetting(AMDGPU::TargetIDSetting::Any);
133 TargetID.setXnackSetting(AMDGPU::TargetIDSetting::Off);
134 if (!XnackHardwiredOn)
138 TargetID.setXnackSetting(AMDGPU::TargetIDSetting::On);
139 if (!XnackHardwiredOn)
157 AMDGPU::OpName Name) {
158 int OpIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(), Name);
160 auto *
I =
MI.begin();
161 std::advance(
I, OpIdx);
175 if (DAsm->tryAddingSymbolicOperand(Inst,
Offset, Addr,
true, 2, 2, 0))
184 if (DAsm->isGFX12Plus()) {
186 }
else if (DAsm->isVI()) {
197 return addOperand(Inst, DAsm->decodeBoolReg(Inst, Val));
204 return addOperand(Inst, DAsm->decodeSplitBarrier(Inst, Val));
210 return addOperand(Inst, DAsm->decodeDpp8FI(Val));
213#define DECODE_OPERAND(StaticDecoderName, DecoderName) \
214 static DecodeStatus StaticDecoderName(MCInst &Inst, unsigned Imm, \
216 const MCDisassembler *Decoder) { \
217 auto DAsm = static_cast<const AMDGPUDisassembler *>(Decoder); \
218 return addOperand(Inst, DAsm->DecoderName(Imm)); \
223#define DECODE_OPERAND_REG_8(RegClass) \
224 static DecodeStatus Decode##RegClass##RegisterClass( \
225 MCInst &Inst, unsigned Imm, uint64_t , \
226 const MCDisassembler *Decoder) { \
227 assert(Imm < (1 << 8) && "8-bit encoding"); \
228 auto DAsm = static_cast<const AMDGPUDisassembler *>(Decoder); \
230 Inst, DAsm->createRegOperand(AMDGPU::RegClass##RegClassID, Imm)); \
233#define DECODE_SrcOp(Name, EncSize, OpWidth, EncImm) \
234 static DecodeStatus Name(MCInst &Inst, unsigned Imm, uint64_t , \
235 const MCDisassembler *Decoder) { \
236 if (!isUInt<EncSize>(Imm)) \
237 return MCDisassembler::Fail; \
238 auto DAsm = static_cast<const AMDGPUDisassembler *>(Decoder); \
239 return addOperand(Inst, DAsm->decodeSrcOp(Inst, OpWidth, EncImm)); \
243 unsigned OpWidth,
unsigned Imm,
unsigned EncImm,
245 assert(
Imm < (1U << EncSize) &&
"Operand doesn't fit encoding!");
247 return addOperand(Inst, DAsm->decodeSrcOp(Inst, OpWidth, EncImm));
257 if (
Imm >= 128 &&
Imm < 256)
265 unsigned OpWidth = 32;
275 unsigned OpWidth = 32;
284#define DECODE_OPERAND_SREG_7(RegClass, OpWidth) \
285 DECODE_SrcOp(Decode##RegClass##RegisterClass, 7, OpWidth, Imm)
287#define DECODE_OPERAND_SREG_8(RegClass, OpWidth) \
288 DECODE_SrcOp(Decode##RegClass##RegisterClass, 8, OpWidth, Imm)
290#define DECODE_OPERAND_SREG_9(RegClass, OpWidth) \
291 DECODE_SrcOp(Decode##RegClass##RegisterClass, 9, OpWidth, Imm)
297template <
unsigned OpW
idth>
305template <
unsigned OpW
idth>
315template <
unsigned OpW
idth>
327template <
unsigned OpW
idth>
343template <
unsigned OpW
idth>
352template <
unsigned OpW
idth>
407 assert((
Imm & (1 << 8)) == 0 &&
"Imm{8} should not be used");
409 bool IsHi =
Imm & (1 << 9);
410 unsigned RegIdx =
Imm & 0xff;
412 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
420 bool IsHi =
Imm & (1 << 7);
421 unsigned RegIdx =
Imm & 0x7f;
423 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
426template <
unsigned OpW
idth>
434 bool IsHi =
Imm & (1 << 7);
435 unsigned RegIdx =
Imm & 0x7f;
436 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
438 return addOperand(Inst, DAsm->decodeNonVGPRSrcOp(Inst, OpWidth,
Imm & 0xFF));
441template <
unsigned OpW
idth>
449 bool IsHi =
Imm & (1 << 9);
450 unsigned RegIdx =
Imm & 0xff;
451 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
453 return addOperand(Inst, DAsm->decodeNonVGPRSrcOp(Inst, OpWidth,
Imm & 0xFF));
465 bool IsHi =
Imm & (1 << 9);
466 unsigned RegIdx =
Imm & 0xff;
467 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
474 return addOperand(Inst, DAsm->decodeMandatoryLiteralConstant(
Imm));
481 return addOperand(Inst, DAsm->decodeMandatoryLiteral64Constant(
Imm));
487 return addOperand(Inst, DAsm->decodeVOPDDstYOp(Inst, Val));
493 return addOperand(Inst, DAsm->decodeSrcOp(Inst, Opw,
Imm | 256));
496template <
unsigned Opw>
506 assert(
Imm < (1 << 9) &&
"9-bit encoding");
511#define DECODE_SDWA(DecName) \
512DECODE_OPERAND(decodeSDWA##DecName, decodeSDWA##DecName)
518#define DECODE_SDWA_IMM_FIELD(Name, MaxImm) \
519 static DecodeStatus Name(MCInst &Inst, unsigned Imm, uint64_t , \
520 const MCDisassembler * ) { \
521 if (Imm > (MaxImm)) \
522 return MCDisassembler::Fail; \
523 return addOperand(Inst, MCOperand::createImm(Imm)); \
531 AMDGPU::SDWA::DstUnused::UNUSED_PRESERVE)
532#undef DECODE_SDWA_IMM_FIELD
541#include "AMDGPUGenDisassemblerTables.inc"
545template <>
constexpr uint32_t InsnBitWidth<uint32_t> = 32;
546template <>
constexpr uint32_t InsnBitWidth<uint64_t> = 64;
547template <>
constexpr uint32_t InsnBitWidth<std::bitset<96>> = 96;
548template <>
constexpr uint32_t InsnBitWidth<std::bitset<128>> = 128;
555template <
typename InsnType>
557 InsnType Inst, uint64_t
Address,
563 const auto SavedBytes = Bytes;
578 Comments << LocalComments;
585template <
typename InsnType>
590 for (
const uint8_t *
T : {Table1, Table2}) {
601 Bytes = Bytes.
slice(
sizeof(
T));
609 Bytes = Bytes.
slice(8);
611 Bytes = Bytes.
slice(4);
612 return (
Hi << 64) |
Lo;
619 Bytes = Bytes.
slice(8);
621 Bytes = Bytes.
slice(8);
622 return (
Hi << 64) |
Lo;
625bool AMDGPUDisassembler::decodeImmOperands(
MCInst &
MI,
627 const MCInstrDesc &
Desc = MCII.get(
MI.getOpcode());
629 if (OpNo >=
MI.getNumOperands())
639 MCOperand &
Op =
MI.getOperand(OpNo);
642 int64_t
Imm =
Op.getImm();
658 switch (OpDesc.OperandType) {
684 Imm = (F16Val << 16) | (F16Val & 0xFFFF);
712 unsigned MaxInstBytesNum = std::min((
size_t)TargetMaxInstBytes, Bytes_.
size());
713 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
717 Size = std::min((
size_t)4, Bytes_.
size());
729 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
764 if (
STI.hasFeature(AMDGPU::Feature64BitLiterals)) {
766 Bytes = Bytes_.
slice(4, MaxInstBytesNum - 4);
774 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
776 }
else if (Bytes.size() >= 16 &&
777 STI.hasFeature(AMDGPU::FeatureGFX950Insts)) {
783 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
786 if (Bytes.size() >= 8) {
789 if (
STI.hasFeature(AMDGPU::FeatureGFX10_BEncoding) &&
793 if (
STI.hasFeature(AMDGPU::FeatureUnpackedD16VMem) &&
797 if (
STI.hasFeature(AMDGPU::FeatureGFX950Insts) &&
804 if (
STI.hasFeature(AMDGPU::FeatureFmaMixInsts) &&
808 if (
STI.hasFeature(AMDGPU::FeatureGFX940Insts) &&
812 if (
STI.hasFeature(AMDGPU::FeatureGFX90AInsts) &&
864 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
868 if (Bytes.size() >= 4) {
881 if (
STI.hasFeature(AMDGPU::FeatureGFX950Insts) &&
885 if (
STI.hasFeature(AMDGPU::FeatureGFX90AInsts) &&
889 if (
STI.hasFeature(AMDGPU::FeatureGFX10_BEncoding) &&
937 else if (AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::dpp8) !=
949 AMDGPU::OpName::src2_modifiers);
952 if (
MI.getOpcode() == AMDGPU::V_CVT_SR_BF8_F32_e64_dpp ||
953 MI.getOpcode() == AMDGPU::V_CVT_SR_FP8_F32_e64_dpp) {
956 AMDGPU::OpName::src2_modifiers);
965 int CPolPos = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
966 AMDGPU::OpName::cpol);
970 if (
MI.getNumOperands() <= (
unsigned)CPolPos) {
972 AMDGPU::OpName::cpol);
974 MI.getOperand(CPolPos).setImm(
MI.getOperand(CPolPos).getImm() | CPol);
980 (
STI.hasFeature(AMDGPU::FeatureGFX90AInsts))) {
983 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::tfe);
984 if (TFEOpIdx != -1) {
985 auto *TFEIter =
MI.begin();
986 std::advance(TFEIter, TFEOpIdx);
994 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::offset);
995 if (OffsetIdx != -1) {
998 if (SignedOffset < 0)
1005 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::swz);
1006 if (SWZOpIdx != -1) {
1007 auto *SWZIter =
MI.begin();
1008 std::advance(SWZIter, SWZOpIdx);
1016 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vaddr0);
1018 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::srsrc);
1019 unsigned NSAArgs = RsrcIdx - VAddr0Idx - 1;
1020 if (VAddr0Idx >= 0 && NSAArgs > 0) {
1021 unsigned NSAWords = (NSAArgs + 3) / 4;
1022 if (Bytes.size() < 4 * NSAWords)
1024 for (
unsigned i = 0; i < NSAArgs; ++i) {
1025 const unsigned VAddrIdx = VAddr0Idx + 1 + i;
1027 MCII->getOpRegClassID(
Desc.operands()[VAddrIdx], HwModeRegClass);
1030 Bytes = Bytes.slice(4 * NSAWords);
1054 int VDstIn_Idx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1055 AMDGPU::OpName::vdst_in);
1056 if (VDstIn_Idx != -1) {
1057 int Tied = MCII->get(
MI.getOpcode()).getOperandConstraint(VDstIn_Idx,
1059 if (Tied != -1 && (
MI.getNumOperands() <= (
unsigned)VDstIn_Idx ||
1060 !
MI.getOperand(VDstIn_Idx).isReg() ||
1061 MI.getOperand(VDstIn_Idx).getReg() !=
MI.getOperand(Tied).getReg())) {
1062 if (
MI.getNumOperands() > (
unsigned)VDstIn_Idx)
1063 MI.erase(&
MI.getOperand(VDstIn_Idx));
1066 AMDGPU::OpName::vdst_in);
1078 MCII->get(
MI.getOpcode()).getNumDefs() == 0 &&
1079 MCII->get(
MI.getOpcode()).hasImplicitDefOfPhysReg(AMDGPU::EXEC)) {
1080 auto ExecEncoding = MRI.getEncodingValue(AMDGPU::EXEC_LO);
1081 if (Bytes_[0] != ExecEncoding)
1085 Size = MaxInstBytesNum - Bytes.size();
1090 if (
STI.hasFeature(AMDGPU::FeatureGFX11Insts)) {
1100 if (
MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_t16_gfx11 ||
1101 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_fake16_gfx11 ||
1102 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_t16_gfx12 ||
1103 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_fake16_gfx12 ||
1104 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_t16_gfx13 ||
1105 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_fake16_gfx13 ||
1106 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_t16_gfx11 ||
1107 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_fake16_gfx11 ||
1108 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_t16_gfx12 ||
1109 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_fake16_gfx12 ||
1110 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_t16_gfx13 ||
1111 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_fake16_gfx13 ||
1112 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_t16_gfx11 ||
1113 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_fake16_gfx11 ||
1114 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_t16_gfx12 ||
1115 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_fake16_gfx12 ||
1116 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_t16_gfx13 ||
1117 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_fake16_gfx13 ||
1118 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_t16_gfx11 ||
1119 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_fake16_gfx11 ||
1120 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_t16_gfx12 ||
1121 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_fake16_gfx12 ||
1122 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_t16_gfx13 ||
1123 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_fake16_gfx13) {
1131 if (
STI.hasFeature(AMDGPU::FeatureGFX9) ||
1132 STI.hasFeature(AMDGPU::FeatureGFX10)) {
1136 }
else if (
STI.hasFeature(AMDGPU::FeatureVolcanicIslands)) {
1137 int SDst = AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::sdst);
1141 AMDGPU::OpName::sdst);
1166 NewReg = MRI.
getSubReg(MO.
getReg(), AMDGPU::sub0_sub1_sub2_sub3_sub4_sub5);
1170 AMDGPU::sub0_sub1_sub2_sub3_sub4_sub5_sub6_sub7);
1180 BaseReg, AMDGPU::sub0, &MRI.
getRegClass(AMDGPU::VReg_384RegClassID));
1204 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::blgp);
1209 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::cbsz);
1211 unsigned CBSZ =
MI.getOperand(CbszIdx).getImm();
1212 unsigned BLGP =
MI.getOperand(BlgpIdx).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);
1233 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::matrix_a_fmt);
1238 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::matrix_b_fmt);
1240 unsigned FmtA =
MI.getOperand(FmtAIdx).getImm();
1241 unsigned FmtB =
MI.getOperand(FmtBIdx).getImm();
1245 if (!AdjustedRegClassOpcode ||
1246 AdjustedRegClassOpcode->
Opcode ==
MI.getOpcode())
1249 MI.setOpcode(AdjustedRegClassOpcode->
Opcode);
1251 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src0);
1253 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src1);
1271 bool IsVOP3P =
false) {
1273 unsigned Opc =
MI.getOpcode();
1274 const AMDGPU::OpName ModOps[] = {AMDGPU::OpName::src0_modifiers,
1275 AMDGPU::OpName::src1_modifiers,
1276 AMDGPU::OpName::src2_modifiers};
1277 for (
int J = 0; J < 3; ++J) {
1278 int OpIdx = AMDGPU::getNamedOperandIdx(
Opc, ModOps[J]);
1282 unsigned Val =
MI.getOperand(OpIdx).getImm();
1289 }
else if (J == 0) {
1300 const unsigned Opc =
MI.getOpcode();
1302 MRI.getRegClass(AMDGPU::VGPR_16RegClassID);
1303 constexpr std::array<std::tuple<AMDGPU::OpName, AMDGPU::OpName, unsigned>, 4>
1304 OpAndOpMods = {{{AMDGPU::OpName::src0, AMDGPU::OpName::src0_modifiers,
1306 {AMDGPU::OpName::src1, AMDGPU::OpName::src1_modifiers,
1308 {AMDGPU::OpName::src2, AMDGPU::OpName::src2_modifiers,
1310 {AMDGPU::OpName::vdst, AMDGPU::OpName::src0_modifiers,
1312 for (
const auto &[
OpName, OpModsName, OpSelMask] : OpAndOpMods) {
1313 int OpIdx = AMDGPU::getNamedOperandIdx(
Opc,
OpName);
1314 int OpModsIdx = AMDGPU::getNamedOperandIdx(
Opc, OpModsName);
1315 if (OpIdx == -1 || OpModsIdx == -1)
1322 unsigned OpEnc = MRI.getEncodingValue(
Op.getReg());
1323 const MCOperand &OpMods =
MI.getOperand(OpModsIdx);
1324 unsigned ModVal = OpMods.
getImm();
1325 if (ModVal & OpSelMask) {
1335 constexpr int DST_IDX = 0;
1336 auto Opcode =
MI.getOpcode();
1337 const auto &
Desc = MCII->get(Opcode);
1338 auto OldIdx = AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::old);
1340 if (OldIdx != -1 &&
Desc.getOperandConstraint(
1344 AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::src2),
1355 assert(
MI.getNumOperands() + 1 < MCII->get(
MI.getOpcode()).getNumOperands());
1358 AMDGPU::OpName::src2_modifiers);
1362 unsigned Opc =
MI.getOpcode();
1365 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vdst_in);
1366 if (VDstInIdx != -1)
1369 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1370 if (
MI.getNumOperands() < DescNumOps &&
1375 AMDGPU::OpName::op_sel);
1378 if (
MI.getNumOperands() < DescNumOps &&
1381 AMDGPU::OpName::src0_modifiers);
1383 if (
MI.getNumOperands() < DescNumOps &&
1386 AMDGPU::OpName::src1_modifiers);
1394 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vdst_in);
1395 if (VDstInIdx != -1)
1398 unsigned Opc =
MI.getOpcode();
1399 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1400 if (
MI.getNumOperands() < DescNumOps &&
1404 AMDGPU::OpName::op_sel);
1419 BaseReg = AMDGPU::VGPR0;
1421 BaseReg = AMDGPU::AGPR0;
1423 assert(BaseReg &&
"Only vector registers expected");
1425 return (Sub0 - BaseReg + NumRegs <= 256) ?
Reg :
MCRegister();
1432 int VDstIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1433 AMDGPU::OpName::vdst);
1435 int VDataIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1436 AMDGPU::OpName::vdata);
1438 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vaddr0);
1440 ? AMDGPU::OpName::srsrc
1441 : AMDGPU::OpName::rsrc;
1442 int RsrcIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(), RsrcOpName);
1443 int DMaskIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1444 AMDGPU::OpName::dmask);
1446 int TFEIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1447 AMDGPU::OpName::tfe);
1448 int D16Idx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1449 AMDGPU::OpName::d16);
1456 if (BaseOpcode->
BVH) {
1462 bool IsAtomic = (VDstIdx != -1);
1466 bool IsPartialNSA =
false;
1467 unsigned AddrSize = Info->VAddrDwords;
1471 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::dim);
1473 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::a16);
1476 const bool IsA16 = (A16Idx != -1 &&
MI.getOperand(A16Idx).
getImm());
1483 IsNSA = Info->MIMGEncoding == AMDGPU::MIMGEncGfx10NSA ||
1484 Info->MIMGEncoding == AMDGPU::MIMGEncGfx11NSA ||
1485 Info->MIMGEncoding == AMDGPU::MIMGEncGfx12 ||
1486 Info->MIMGEncoding == AMDGPU::MIMGEncGfx13;
1488 if (!IsVSample && AddrSize > 12)
1491 if (AddrSize > Info->VAddrDwords) {
1492 if (!
STI.hasFeature(AMDGPU::FeaturePartialNSAEncoding)) {
1497 IsPartialNSA =
true;
1502 unsigned DMask =
MI.getOperand(DMaskIdx).getImm() & 0xf;
1503 unsigned DstSize = IsGather4 ? 4 : std::max(
llvm::popcount(DMask), 1);
1505 bool D16 = D16Idx >= 0 &&
MI.getOperand(D16Idx).getImm();
1507 DstSize = (DstSize + 1) / 2;
1510 if (TFEIdx != -1 &&
MI.getOperand(TFEIdx).getImm())
1513 if (DstSize == Info->VDataDwords && AddrSize == Info->VAddrDwords)
1518 AddrSize, Info->IndexedRsrc, Info->IndexedSamp);
1519 if (NewOpcode == -1)
1524 if (DstSize != Info->VDataDwords) {
1525 auto DataRCID = MCII->getOpRegClassID(
1526 MCII->get(NewOpcode).operands()[VDataIdx], HwModeRegClass);
1530 MCRegister VdataSub0 = MRI.getSubReg(Vdata0, AMDGPU::sub0);
1531 Vdata0 = (VdataSub0 != 0)? VdataSub0 : Vdata0;
1534 NewVdata = MRI.getMatchingSuperReg(Vdata0, AMDGPU::sub0, &NewRC);
1545 int VAddrSAIdx = IsPartialNSA ? (RsrcIdx - 1) : VAddr0Idx;
1547 if (
STI.hasFeature(AMDGPU::FeatureNSAEncoding) && (!IsNSA || IsPartialNSA) &&
1548 AddrSize != Info->VAddrDwords) {
1549 MCRegister VAddrSA =
MI.getOperand(VAddrSAIdx).getReg();
1550 MCRegister VAddrSubSA = MRI.getSubReg(VAddrSA, AMDGPU::sub0);
1551 VAddrSA = VAddrSubSA ? VAddrSubSA : VAddrSA;
1553 auto AddrRCID = MCII->getOpRegClassID(
1554 MCII->get(NewOpcode).operands()[VAddrSAIdx], HwModeRegClass);
1557 NewVAddrSA = MRI.getMatchingSuperReg(VAddrSA, AMDGPU::sub0, &NewRC);
1563 MI.setOpcode(NewOpcode);
1565 if (NewVdata != AMDGPU::NoRegister) {
1577 assert(AddrSize <= Info->VAddrDwords);
1578 MI.erase(
MI.begin() + VAddr0Idx + AddrSize,
1579 MI.begin() + VAddr0Idx + Info->VAddrDwords);
1587 unsigned Opc =
MI.getOpcode();
1588 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1591 if (
MI.getNumOperands() < DescNumOps &&
1595 if (
MI.getNumOperands() < DescNumOps &&
1598 AMDGPU::OpName::op_sel);
1599 if (
MI.getNumOperands() < DescNumOps &&
1602 AMDGPU::OpName::op_sel_hi);
1603 if (
MI.getNumOperands() < DescNumOps &&
1606 AMDGPU::OpName::neg_lo);
1607 if (
MI.getNumOperands() < DescNumOps &&
1610 AMDGPU::OpName::neg_hi);
1615 unsigned Opc =
MI.getOpcode();
1616 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1618 if (
MI.getNumOperands() < DescNumOps &&
1622 if (
MI.getNumOperands() < DescNumOps &&
1625 AMDGPU::OpName::src0_modifiers);
1627 if (
MI.getNumOperands() < DescNumOps &&
1630 AMDGPU::OpName::src1_modifiers);
1634 unsigned Opc =
MI.getOpcode();
1635 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1639 if (
MI.getNumOperands() < DescNumOps &&
1643 AMDGPU::OpName::op_sel);
1648 assert(HasLiteral &&
"Should have decoded a literal");
1654 &getAMDGPUMCRegisterClass(RegClassID));
1659 const Twine& ErrMsg)
const {
1673 unsigned Val)
const {
1674 const auto &RegCl = getAMDGPUMCRegisterClass(RegClassID);
1675 if (Val >= RegCl.getNumRegs())
1677 ": unknown register " +
Twine(Val));
1683 unsigned Val)
const {
1687 switch (SRegClassID) {
1688 case AMDGPU::SGPR_32RegClassID:
1689 case AMDGPU::TTMP_32RegClassID:
1691 case AMDGPU::SGPR_64RegClassID:
1692 case AMDGPU::TTMP_64RegClassID:
1695 case AMDGPU::SGPR_96RegClassID:
1696 case AMDGPU::TTMP_96RegClassID:
1697 case AMDGPU::SGPR_128RegClassID:
1698 case AMDGPU::TTMP_128RegClassID:
1701 case AMDGPU::SGPR_256RegClassID:
1702 case AMDGPU::TTMP_256RegClassID:
1705 case AMDGPU::SGPR_288RegClassID:
1706 case AMDGPU::TTMP_288RegClassID:
1707 case AMDGPU::SGPR_320RegClassID:
1708 case AMDGPU::TTMP_320RegClassID:
1709 case AMDGPU::SGPR_352RegClassID:
1710 case AMDGPU::TTMP_352RegClassID:
1711 case AMDGPU::SGPR_384RegClassID:
1712 case AMDGPU::TTMP_384RegClassID:
1713 case AMDGPU::SGPR_512RegClassID:
1714 case AMDGPU::TTMP_512RegClassID:
1723 if (Val % (1 << shift)) {
1725 <<
": scalar reg isn't aligned " << Val;
1733 unsigned RegIdxInVGPR16 = RegIdx * 2 + (IsHi ? 1 : 0);
1743 "Should only decode multiple kimm with VOPD, check VSrc operand types");
1745 return errOperand(Val,
"More than one unique literal is illegal");
1756 return errOperand(Val,
"More than one unique literal is illegal");
1761 bool UseLit64 =
Hi_32(Literal) == 0;
1774 if (Bytes.size() < 4) {
1775 return errOperand(0,
"cannot read literal, inst bytes left " +
1776 Twine(Bytes.size()));
1783 bool HasInv2Pi =
true;
1787 int64_t Val = Literal;
1788 bool UseLit =
false;
1860 assert(
STI.hasFeature(AMDGPU::Feature64BitLiterals));
1863 if (Bytes.size() < 8) {
1864 return errOperand(0,
"cannot read literal64, inst bytes left " +
1865 Twine(Bytes.size()));
1871 bool UseLit64 =
Hi_32(Literal) == 0;
1874 Literal,
STI.hasFeature(AMDGPU::FeatureInv2PiInlineImm));
1884 assert(
Imm >= INLINE_INTEGER_C_MIN &&
Imm <= INLINE_INTEGER_C_MAX);
1886 (
static_cast<int64_t
>(
Imm) - INLINE_INTEGER_C_MIN) :
1887 (INLINE_INTEGER_C_POSITIVE_MAX -
static_cast<int64_t
>(
Imm)));
1935 return 0x3fc45f306dc9c882;
1997 return VGPR_32RegClassID;
1999 return VReg_64RegClassID;
2001 return VReg_96RegClassID;
2003 return VReg_128RegClassID;
2005 return VReg_160RegClassID;
2007 return VReg_192RegClassID;
2009 return VReg_256RegClassID;
2011 return VReg_288RegClassID;
2013 return VReg_320RegClassID;
2015 return VReg_352RegClassID;
2017 return VReg_384RegClassID;
2019 return VReg_512RegClassID;
2021 return VReg_1024RegClassID;
2032 return AGPR_32RegClassID;
2034 return AReg_64RegClassID;
2036 return AReg_96RegClassID;
2038 return AReg_128RegClassID;
2040 return AReg_160RegClassID;
2042 return AReg_256RegClassID;
2044 return AReg_288RegClassID;
2046 return AReg_320RegClassID;
2048 return AReg_352RegClassID;
2050 return AReg_384RegClassID;
2052 return AReg_512RegClassID;
2054 return AReg_1024RegClassID;
2059std::optional<unsigned>
2066 return SGPR_32RegClassID;
2068 return SGPR_64RegClassID;
2070 return SGPR_96RegClassID;
2072 return SGPR_128RegClassID;
2074 return SGPR_160RegClassID;
2076 return SGPR_256RegClassID;
2078 return SGPR_288RegClassID;
2080 return SGPR_320RegClassID;
2082 return SGPR_352RegClassID;
2084 return SGPR_384RegClassID;
2086 return SGPR_512RegClassID;
2088 return std::nullopt;
2091std::optional<unsigned>
2098 return TTMP_32RegClassID;
2100 return TTMP_64RegClassID;
2102 return TTMP_128RegClassID;
2104 return TTMP_256RegClassID;
2106 return TTMP_288RegClassID;
2108 return TTMP_320RegClassID;
2110 return TTMP_352RegClassID;
2112 return TTMP_384RegClassID;
2114 return TTMP_512RegClassID;
2116 return std::nullopt;
2122 unsigned TTmpMin =
isGFX9Plus() ? TTMP_GFX9PLUS_MIN : TTMP_VI_MIN;
2123 unsigned TTmpMax =
isGFX9Plus() ? TTMP_GFX9PLUS_MAX : TTMP_VI_MAX;
2125 return (TTmpMin <= Val && Val <= TTmpMax)? Val - TTmpMin : -1;
2129 unsigned Val)
const {
2134 bool IsAGPR = Val & 512;
2137 if (VGPR_MIN <= Val && Val <= VGPR_MAX) {
2146 unsigned Val)
const {
2149 assert(Val < (1 << 8) &&
"9-bit Src encoding when Val{8} is 0");
2154 auto UnsupportedWidth = [&]() {
2156 "-bit non-VGPR operand encoding " +
Twine(Val));
2161 static_assert(SGPR_MIN == 0);
2164 return UnsupportedWidth();
2172 return UnsupportedWidth();
2176 if ((INLINE_INTEGER_C_MIN <= Val && Val <= INLINE_INTEGER_C_MAX) ||
2177 (INLINE_FLOATING_C_MIN <= Val && Val <= INLINE_FLOATING_C_MAX) ||
2178 Val == LITERAL_CONST)
2181 if (Val == LITERAL64_CONST &&
STI.hasFeature(AMDGPU::Feature64BitLiterals)) {
2187 "64-bit literal is not supported by this instruction");
2204 return UnsupportedWidth();
2211 unsigned Val)
const {
2213 AMDGPU::getNamedOperandIdx(Inst.
getOpcode(), AMDGPU::OpName::vdstX);
2216 unsigned XDstReg = MRI.getEncodingValue(Inst.
getOperand(VDstXInd).
getReg());
2217 Val |= ~XDstReg & 1;
2340 const unsigned Val)
const {
2344 if (
STI.hasFeature(AMDGPU::FeatureGFX9) ||
2345 STI.hasFeature(AMDGPU::FeatureGFX10)) {
2348 if (
int(SDWA9EncValues::SRC_VGPR_MIN) <=
int(Val) &&
2349 Val <= SDWA9EncValues::SRC_VGPR_MAX) {
2351 Val - SDWA9EncValues::SRC_VGPR_MIN);
2353 if (SDWA9EncValues::SRC_SGPR_MIN <= Val &&
2354 Val <= (
isGFX10Plus() ? SDWA9EncValues::SRC_SGPR_MAX_GFX10
2355 : SDWA9EncValues::SRC_SGPR_MAX_SI)) {
2357 Val - SDWA9EncValues::SRC_SGPR_MIN);
2359 if (SDWA9EncValues::SRC_TTMP_MIN <= Val &&
2360 Val <= SDWA9EncValues::SRC_TTMP_MAX) {
2362 Val - SDWA9EncValues::SRC_TTMP_MIN);
2365 const unsigned SVal = Val - SDWA9EncValues::SRC_SGPR_MIN;
2367 if ((INLINE_INTEGER_C_MIN <= SVal && SVal <= INLINE_INTEGER_C_MAX) ||
2368 (INLINE_FLOATING_C_MIN <= SVal && SVal <= INLINE_FLOATING_C_MAX))
2373 if (
STI.hasFeature(AMDGPU::FeatureVolcanicIslands))
2389 assert((
STI.hasFeature(AMDGPU::FeatureGFX9) ||
2390 STI.hasFeature(AMDGPU::FeatureGFX10)) &&
2391 "SDWAVopcDst should be present only on GFX9+");
2393 bool IsWave32 =
STI.hasFeature(AMDGPU::FeatureWavefrontSize32);
2395 if (Val & SDWA9EncValues::VOPC_DST_VCC_MASK) {
2396 Val &= SDWA9EncValues::VOPC_DST_SGPR_MASK;
2410 unsigned Val)
const {
2411 return STI.hasFeature(AMDGPU::FeatureWavefrontSize32)
2417 unsigned Val)
const {
2419 constexpr unsigned M0Encoding = 125;
2420 bool IsValidBarrier =
2421 Val == M0Encoding ||
2422 (INLINE_INTEGER_C_MIN <= Val && Val < INLINE_INTEGER_C_MIN + 32) ||
2423 (INLINE_INTEGER_C_POSITIVE_MAX < Val &&
2424 Val <= INLINE_INTEGER_C_POSITIVE_MAX + 4);
2425 if (!IsValidBarrier)
2443 auto [
Version, W64, W32, MDP] = Encoding::decode(
Imm);
2446 if (Encoding::encode(
Version, W64, W32, MDP) !=
Imm)
2456 if (
I == Versions.end())
2472 return STI.hasFeature(AMDGPU::FeatureVolcanicIslands);
2478 return STI.hasFeature(AMDGPU::FeatureGFX90AInsts);
2490 return STI.hasFeature(AMDGPU::FeatureGFX11);
2498 return STI.hasFeature(AMDGPU::FeatureGFX11_7Insts);
2502 return STI.hasFeature(AMDGPU::FeatureGFX12);
2522 return STI.hasFeature(AMDGPU::FeatureArchitectedFlatScratch);
2543 if (PopCount == 1) {
2544 S <<
"bit (" << (TrailingZeros + BaseBytes * CHAR_BIT) <<
')';
2546 S <<
"bits in range ("
2547 << (TrailingZeros + PopCount - 1 + BaseBytes * CHAR_BIT) <<
':'
2548 << (TrailingZeros + BaseBytes * CHAR_BIT) <<
')';
2554#define GET_FIELD(MASK) (AMDHSA_BITS_GET(FourByteBuffer, MASK))
2555#define PRINT_DIRECTIVE(DIRECTIVE, MASK) \
2557 KdStream << Indent << DIRECTIVE " " << GET_FIELD(MASK) << '\n'; \
2559#define PRINT_PSEUDO_DIRECTIVE_COMMENT(DIRECTIVE, MASK) \
2561 KdStream << Indent << MAI.getCommentString() << ' ' << DIRECTIVE " " \
2562 << GET_FIELD(MASK) << '\n'; \
2565#define CHECK_RESERVED_BITS_IMPL(MASK, DESC, MSG) \
2567 if (FourByteBuffer & (MASK)) { \
2568 return createStringError(std::errc::invalid_argument, \
2569 "kernel descriptor " DESC \
2570 " reserved %s set" MSG, \
2571 getBitRangeFromMask((MASK), 0).c_str()); \
2575#define CHECK_RESERVED_BITS(MASK) CHECK_RESERVED_BITS_IMPL(MASK, #MASK, "")
2576#define CHECK_RESERVED_BITS_MSG(MASK, MSG) \
2577 CHECK_RESERVED_BITS_IMPL(MASK, #MASK, ", " MSG)
2578#define CHECK_RESERVED_BITS_DESC(MASK, DESC) \
2579 CHECK_RESERVED_BITS_IMPL(MASK, DESC, "")
2580#define CHECK_RESERVED_BITS_DESC_MSG(MASK, DESC, MSG) \
2581 CHECK_RESERVED_BITS_IMPL(MASK, DESC, ", " MSG)
2594 uint32_t GranulatedWorkitemVGPRCount =
2595 GET_FIELD(COMPUTE_PGM_RSRC1_GRANULATED_WORKITEM_VGPR_COUNT);
2598 (GranulatedWorkitemVGPRCount + 1) *
2601 KdStream << Indent <<
".amdhsa_next_free_vgpr " << NextFreeVGPR <<
'\n';
2622 uint32_t GranulatedWavefrontSGPRCount =
2623 GET_FIELD(COMPUTE_PGM_RSRC1_GRANULATED_WAVEFRONT_SGPR_COUNT);
2627 "must be zero on gfx10+");
2629 uint32_t NextFreeSGPR = (GranulatedWavefrontSGPRCount + 1) *
2632 KdStream << Indent <<
".amdhsa_reserve_vcc " << 0 <<
'\n';
2634 KdStream << Indent <<
".amdhsa_reserve_flat_scratch " << 0 <<
'\n';
2638 bool ReservedXnackMask = TargetID.isXnackOnOrAny();
2639 if (
STI.hasFeature(AMDGPU::FeatureSupportsXNACK) || ReservedXnackMask) {
2640 KdStream << Indent <<
".amdhsa_reserve_xnack_mask " << ReservedXnackMask
2643 KdStream << Indent <<
".amdhsa_next_free_sgpr " << NextFreeSGPR <<
"\n";
2648 COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_32);
2650 COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_16_64);
2652 COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_32);
2654 COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_16_64);
2658 if (
STI.hasFeature(AMDGPU::FeatureDX10ClampAndIEEEMode))
2660 COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_DX10_CLAMP);
2664 if (
STI.hasFeature(AMDGPU::FeatureDX10ClampAndIEEEMode))
2666 COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_IEEE_MODE);
2673 PRINT_DIRECTIVE(
".amdhsa_fp16_overflow", COMPUTE_PGM_RSRC1_GFX9_PLUS_FP16_OVFL);
2676 "COMPUTE_PGM_RSRC1",
"must be zero pre-gfx9");
2682 COMPUTE_PGM_RSRC1_GFX125_FLAT_SCRATCH_IS_NV);
2685 "COMPUTE_PGM_RSRC1");
2696 COMPUTE_PGM_RSRC1_GFX10_PLUS_WGP_MODE);
2698 PRINT_DIRECTIVE(
".amdhsa_memory_ordered", COMPUTE_PGM_RSRC1_GFX10_PLUS_MEM_ORDERED);
2699 PRINT_DIRECTIVE(
".amdhsa_forward_progress", COMPUTE_PGM_RSRC1_GFX10_PLUS_FWD_PROGRESS);
2702 "COMPUTE_PGM_RSRC1");
2707 COMPUTE_PGM_RSRC1_GFX12_PLUS_ENABLE_WG_RR_EN);
2719 COMPUTE_PGM_RSRC2_ENABLE_PRIVATE_SEGMENT);
2721 PRINT_DIRECTIVE(
".amdhsa_system_sgpr_private_segment_wavefront_offset",
2722 COMPUTE_PGM_RSRC2_ENABLE_PRIVATE_SEGMENT);
2724 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_X);
2726 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Y);
2728 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Z);
2730 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_INFO);
2732 COMPUTE_PGM_RSRC2_ENABLE_VGPR_WORKITEM_ID);
2739 ".amdhsa_exception_fp_ieee_invalid_op",
2740 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INVALID_OPERATION);
2742 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_FP_DENORMAL_SOURCE);
2744 ".amdhsa_exception_fp_ieee_div_zero",
2745 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_DIVISION_BY_ZERO);
2747 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_OVERFLOW);
2749 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_UNDERFLOW);
2751 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INEXACT);
2753 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_INT_DIVIDE_BY_ZERO);
2766 KdStream << Indent <<
".amdhsa_accum_offset "
2767 << (
GET_FIELD(COMPUTE_PGM_RSRC3_GFX90A_ACCUM_OFFSET) + 1) * 4
2770 PRINT_DIRECTIVE(
".amdhsa_tg_split", COMPUTE_PGM_RSRC3_GFX90A_TG_SPLIT);
2773 "COMPUTE_PGM_RSRC3",
"must be zero on gfx90a");
2775 "COMPUTE_PGM_RSRC3",
"must be zero on gfx90a");
2779 if (!EnableWavefrontSize32 || !*EnableWavefrontSize32) {
2781 COMPUTE_PGM_RSRC3_GFX10_GFX11_SHARED_VGPR_COUNT);
2784 "SHARED_VGPR_COUNT",
2785 COMPUTE_PGM_RSRC3_GFX10_GFX11_SHARED_VGPR_COUNT);
2789 "COMPUTE_PGM_RSRC3",
2790 "must be zero on gfx12+");
2796 COMPUTE_PGM_RSRC3_GFX11_INST_PREF_SIZE);
2798 COMPUTE_PGM_RSRC3_GFX11_TRAP_ON_START);
2800 COMPUTE_PGM_RSRC3_GFX11_TRAP_ON_END);
2803 COMPUTE_PGM_RSRC3_GFX12_PLUS_INST_PREF_SIZE);
2806 "COMPUTE_PGM_RSRC3",
2807 "must be zero on gfx10");
2812 "COMPUTE_PGM_RSRC3",
"must be zero on gfx10+");
2817 COMPUTE_PGM_RSRC3_GFX12_PLUS_GLG_EN);
2820 "COMPUTE_PGM_RSRC3",
2821 "must be zero on gfx10 or gfx11");
2827 COMPUTE_PGM_RSRC3_GFX125_NAMED_BAR_CNT);
2829 "ENABLE_DYNAMIC_VGPR", COMPUTE_PGM_RSRC3_GFX125_ENABLE_DYNAMIC_VGPR);
2831 COMPUTE_PGM_RSRC3_GFX125_TCP_SPLIT);
2833 "ENABLE_DIDT_THROTTLE",
2834 COMPUTE_PGM_RSRC3_GFX125_ENABLE_DIDT_THROTTLE);
2837 "COMPUTE_PGM_RSRC3",
2838 "must be zero on gfx10+");
2843 "COMPUTE_PGM_RSRC3",
"must be zero on gfx10+");
2848 COMPUTE_PGM_RSRC3_GFX11_PLUS_IMAGE_OP);
2851 "COMPUTE_PGM_RSRC3",
2852 "must be zero on gfx10");
2854 }
else if (FourByteBuffer) {
2856 std::errc::invalid_argument,
2857 "kernel descriptor COMPUTE_PGM_RSRC3 must be all zero before gfx9");
2861#undef PRINT_PSEUDO_DIRECTIVE_COMMENT
2862#undef PRINT_DIRECTIVE
2864#undef CHECK_RESERVED_BITS_IMPL
2865#undef CHECK_RESERVED_BITS
2866#undef CHECK_RESERVED_BITS_MSG
2867#undef CHECK_RESERVED_BITS_DESC
2868#undef CHECK_RESERVED_BITS_DESC_MSG
2873 const char *
Msg =
"") {
2875 std::errc::invalid_argument,
"kernel descriptor reserved %s set%s%s",
2882 unsigned WidthInBytes) {
2886 std::errc::invalid_argument,
2887 "kernel descriptor reserved bits in range (%u:%u) set",
2888 (BaseInBytes + WidthInBytes) * CHAR_BIT - 1, BaseInBytes * CHAR_BIT);
2894#define PRINT_DIRECTIVE(DIRECTIVE, MASK) \
2896 KdStream << Indent << DIRECTIVE " " \
2897 << ((TwoByteBuffer & MASK) >> (MASK##_SHIFT)) << '\n'; \
2900 uint16_t TwoByteBuffer = 0;
2906 assert(Bytes.size() == 64);
2909 switch (Cursor.tell()) {
2911 FourByteBuffer = DE.
getU32(Cursor);
2912 KdStream << Indent <<
".amdhsa_group_segment_fixed_size " << FourByteBuffer
2917 FourByteBuffer = DE.
getU32(Cursor);
2918 KdStream << Indent <<
".amdhsa_private_segment_fixed_size "
2919 << FourByteBuffer <<
'\n';
2923 FourByteBuffer = DE.
getU32(Cursor);
2924 KdStream << Indent <<
".amdhsa_kernarg_size "
2925 << FourByteBuffer <<
'\n';
2930 ReservedBytes = DE.
getBytes(Cursor, 4);
2931 for (
char B : ReservedBytes) {
2946 ReservedBytes = DE.
getBytes(Cursor, 20);
2947 for (
char B : ReservedBytes) {
2954 FourByteBuffer = DE.
getU32(Cursor);
2958 FourByteBuffer = DE.
getU32(Cursor);
2962 FourByteBuffer = DE.
getU32(Cursor);
2967 TwoByteBuffer = DE.
getU16(Cursor);
2971 KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER);
2973 KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_PTR);
2975 KERNEL_CODE_PROPERTY_ENABLE_SGPR_QUEUE_PTR);
2977 KERNEL_CODE_PROPERTY_ENABLE_SGPR_KERNARG_SEGMENT_PTR);
2979 KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_ID);
2982 KERNEL_CODE_PROPERTY_ENABLE_SGPR_FLAT_SCRATCH_INIT);
2984 KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE);
2986 if (TwoByteBuffer & KERNEL_CODE_PROPERTY_RESERVED0)
2992 (TwoByteBuffer & KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32)) {
2994 KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32,
2999 KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32);
3004 KERNEL_CODE_PROPERTY_USES_DYNAMIC_STACK);
3006 if (TwoByteBuffer & KERNEL_CODE_PROPERTY_RESERVED1) {
3015 TwoByteBuffer = DE.
getU16(Cursor);
3016 if (TwoByteBuffer & KERNARG_PRELOAD_SPEC_LENGTH) {
3018 KERNARG_PRELOAD_SPEC_LENGTH);
3021 if (TwoByteBuffer & KERNARG_PRELOAD_SPEC_OFFSET) {
3023 KERNARG_PRELOAD_SPEC_OFFSET);
3029 ReservedBytes = DE.
getBytes(Cursor, 4);
3030 for (
char B : ReservedBytes) {
3040#undef PRINT_DIRECTIVE
3047 if (Bytes.size() != 64 || KdAddress % 64 != 0)
3049 "kernel descriptor must be 64-byte aligned");
3057 uint16_t KernelCodeProperties =
3060 EnableWavefrontSize32 =
3062 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32);
3067 KdStream <<
".amdhsa_kernel " << KdName <<
'\n';
3070 while (
C &&
C.tell() < Bytes.size()) {
3078 KdStream <<
".end_amdhsa_kernel\n";
3097 "code object v2 is not supported");
3110const MCExpr *AMDGPUDisassembler::createConstantSymbolExpr(
StringRef Id,
3113 MCSymbol *Sym = Ctx.getOrCreateSymbol(Id);
3121 if (!Valid || Res != Val)
3122 Ctx.reportWarning(
SMLoc(),
"unsupported redefinition of " + Id);
3147 uint64_t ,
bool IsBranch, uint64_t ,
3148 uint64_t , uint64_t ) {
3159 return Val.
Addr ==
static_cast<uint64_t
>(
Value) &&
3162 if (Result != Symbols->end()) {
3163 auto *Sym =
Ctx.getOrCreateSymbol(Result->Name);
3169 ReferencedAddresses.push_back(
static_cast<uint64_t
>(
Value));
3188 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 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)
#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.
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)
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.