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;
274#define DECODE_OPERAND_SREG_7(RegClass, OpWidth) \
275 DECODE_SrcOp(Decode##RegClass##RegisterClass, 7, OpWidth, Imm)
277#define DECODE_OPERAND_SREG_8(RegClass, OpWidth) \
278 DECODE_SrcOp(Decode##RegClass##RegisterClass, 8, OpWidth, Imm)
280#define DECODE_OPERAND_SREG_9(RegClass, OpWidth) \
281 DECODE_SrcOp(Decode##RegClass##RegisterClass, 9, OpWidth, Imm)
287template <
unsigned OpW
idth>
295template <
unsigned OpW
idth>
305template <
unsigned OpW
idth>
317template <
unsigned OpW
idth>
333template <
unsigned OpW
idth>
342template <
unsigned OpW
idth>
397 assert((
Imm & (1 << 8)) == 0 &&
"Imm{8} should not be used");
399 bool IsHi =
Imm & (1 << 9);
400 unsigned RegIdx =
Imm & 0xff;
402 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
410 bool IsHi =
Imm & (1 << 7);
411 unsigned RegIdx =
Imm & 0x7f;
413 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
416template <
unsigned OpW
idth>
424 bool IsHi =
Imm & (1 << 7);
425 unsigned RegIdx =
Imm & 0x7f;
426 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
428 return addOperand(Inst, DAsm->decodeNonVGPRSrcOp(Inst, OpWidth,
Imm & 0xFF));
431template <
unsigned OpW
idth>
439 bool IsHi =
Imm & (1 << 9);
440 unsigned RegIdx =
Imm & 0xff;
441 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
443 return addOperand(Inst, DAsm->decodeNonVGPRSrcOp(Inst, OpWidth,
Imm & 0xFF));
455 bool IsHi =
Imm & (1 << 9);
456 unsigned RegIdx =
Imm & 0xff;
457 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
464 return addOperand(Inst, DAsm->decodeMandatoryLiteralConstant(
Imm));
471 return addOperand(Inst, DAsm->decodeMandatoryLiteral64Constant(
Imm));
477 return addOperand(Inst, DAsm->decodeVOPDDstYOp(Inst, Val));
483 return addOperand(Inst, DAsm->decodeSrcOp(Inst, Opw,
Imm | 256));
486template <
unsigned Opw>
496 assert(
Imm < (1 << 9) &&
"9-bit encoding");
501#define DECODE_SDWA(DecName) \
502DECODE_OPERAND(decodeSDWA##DecName, decodeSDWA##DecName)
508#define DECODE_SDWA_IMM_FIELD(Name, MaxImm) \
509 static DecodeStatus Name(MCInst &Inst, unsigned Imm, uint64_t , \
510 const MCDisassembler * ) { \
511 if (Imm > (MaxImm)) \
512 return MCDisassembler::Fail; \
513 return addOperand(Inst, MCOperand::createImm(Imm)); \
521 AMDGPU::SDWA::DstUnused::UNUSED_PRESERVE)
522#undef DECODE_SDWA_IMM_FIELD
531#include "AMDGPUGenDisassemblerTables.inc"
535template <>
constexpr uint32_t InsnBitWidth<uint32_t> = 32;
536template <>
constexpr uint32_t InsnBitWidth<uint64_t> = 64;
537template <>
constexpr uint32_t InsnBitWidth<std::bitset<96>> = 96;
538template <>
constexpr uint32_t InsnBitWidth<std::bitset<128>> = 128;
545template <
typename InsnType>
547 InsnType Inst, uint64_t
Address,
553 const auto SavedBytes = Bytes;
568 Comments << LocalComments;
575template <
typename InsnType>
580 for (
const uint8_t *
T : {Table1, Table2}) {
591 Bytes = Bytes.
slice(
sizeof(
T));
599 Bytes = Bytes.
slice(8);
601 Bytes = Bytes.
slice(4);
602 return (
Hi << 64) |
Lo;
609 Bytes = Bytes.
slice(8);
611 Bytes = Bytes.
slice(8);
612 return (
Hi << 64) |
Lo;
615bool AMDGPUDisassembler::decodeImmOperands(
MCInst &
MI,
617 const MCInstrDesc &
Desc = MCII.get(
MI.getOpcode());
619 if (OpNo >=
MI.getNumOperands())
629 MCOperand &
Op =
MI.getOperand(OpNo);
632 int64_t
Imm =
Op.getImm();
648 switch (OpDesc.OperandType) {
674 Imm = (F16Val << 16) | (F16Val & 0xFFFF);
702 unsigned MaxInstBytesNum = std::min((
size_t)TargetMaxInstBytes, Bytes_.
size());
703 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
707 Size = std::min((
size_t)4, Bytes_.
size());
719 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
754 if (
STI.hasFeature(AMDGPU::Feature64BitLiterals)) {
756 Bytes = Bytes_.
slice(4, MaxInstBytesNum - 4);
764 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
766 }
else if (Bytes.size() >= 16 &&
767 STI.hasFeature(AMDGPU::FeatureGFX950Insts)) {
773 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
776 if (Bytes.size() >= 8) {
779 if (
STI.hasFeature(AMDGPU::FeatureGFX10_BEncoding) &&
783 if (
STI.hasFeature(AMDGPU::FeatureUnpackedD16VMem) &&
787 if (
STI.hasFeature(AMDGPU::FeatureGFX950Insts) &&
794 if (
STI.hasFeature(AMDGPU::FeatureFmaMixInsts) &&
798 if (
STI.hasFeature(AMDGPU::FeatureGFX940Insts) &&
802 if (
STI.hasFeature(AMDGPU::FeatureGFX90AInsts) &&
854 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
858 if (Bytes.size() >= 4) {
871 if (
STI.hasFeature(AMDGPU::FeatureGFX950Insts) &&
875 if (
STI.hasFeature(AMDGPU::FeatureGFX90AInsts) &&
879 if (
STI.hasFeature(AMDGPU::FeatureGFX10_BEncoding) &&
927 else if (AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::dpp8) !=
939 AMDGPU::OpName::src2_modifiers);
942 if (
MI.getOpcode() == AMDGPU::V_CVT_SR_BF8_F32_e64_dpp ||
943 MI.getOpcode() == AMDGPU::V_CVT_SR_FP8_F32_e64_dpp) {
946 AMDGPU::OpName::src2_modifiers);
955 int CPolPos = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
956 AMDGPU::OpName::cpol);
960 if (
MI.getNumOperands() <= (
unsigned)CPolPos) {
962 AMDGPU::OpName::cpol);
964 MI.getOperand(CPolPos).setImm(
MI.getOperand(CPolPos).getImm() | CPol);
970 (
STI.hasFeature(AMDGPU::FeatureGFX90AInsts))) {
973 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::tfe);
974 if (TFEOpIdx != -1) {
975 auto *TFEIter =
MI.begin();
976 std::advance(TFEIter, TFEOpIdx);
984 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::offset);
985 if (OffsetIdx != -1) {
988 if (SignedOffset < 0)
995 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::swz);
996 if (SWZOpIdx != -1) {
997 auto *SWZIter =
MI.begin();
998 std::advance(SWZIter, SWZOpIdx);
1006 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vaddr0);
1008 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::srsrc);
1009 unsigned NSAArgs = RsrcIdx - VAddr0Idx - 1;
1010 if (VAddr0Idx >= 0 && NSAArgs > 0) {
1011 unsigned NSAWords = (NSAArgs + 3) / 4;
1012 if (Bytes.size() < 4 * NSAWords)
1014 for (
unsigned i = 0; i < NSAArgs; ++i) {
1015 const unsigned VAddrIdx = VAddr0Idx + 1 + i;
1017 MCII->getOpRegClassID(
Desc.operands()[VAddrIdx], HwModeRegClass);
1020 Bytes = Bytes.slice(4 * NSAWords);
1044 int VDstIn_Idx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1045 AMDGPU::OpName::vdst_in);
1046 if (VDstIn_Idx != -1) {
1047 int Tied = MCII->get(
MI.getOpcode()).getOperandConstraint(VDstIn_Idx,
1049 if (Tied != -1 && (
MI.getNumOperands() <= (
unsigned)VDstIn_Idx ||
1050 !
MI.getOperand(VDstIn_Idx).isReg() ||
1051 MI.getOperand(VDstIn_Idx).getReg() !=
MI.getOperand(Tied).getReg())) {
1052 if (
MI.getNumOperands() > (
unsigned)VDstIn_Idx)
1053 MI.erase(&
MI.getOperand(VDstIn_Idx));
1056 AMDGPU::OpName::vdst_in);
1068 MCII->get(
MI.getOpcode()).getNumDefs() == 0 &&
1069 MCII->get(
MI.getOpcode()).hasImplicitDefOfPhysReg(AMDGPU::EXEC)) {
1070 auto ExecEncoding = MRI.getEncodingValue(AMDGPU::EXEC_LO);
1071 if (Bytes_[0] != ExecEncoding)
1075 Size = MaxInstBytesNum - Bytes.size();
1080 if (
STI.hasFeature(AMDGPU::FeatureGFX11Insts)) {
1090 if (
MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_t16_gfx11 ||
1091 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_fake16_gfx11 ||
1092 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_t16_gfx12 ||
1093 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_fake16_gfx12 ||
1094 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_t16_gfx13 ||
1095 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_fake16_gfx13 ||
1096 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_t16_gfx11 ||
1097 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_fake16_gfx11 ||
1098 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_t16_gfx12 ||
1099 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_fake16_gfx12 ||
1100 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_t16_gfx13 ||
1101 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_fake16_gfx13 ||
1102 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_t16_gfx11 ||
1103 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_fake16_gfx11 ||
1104 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_t16_gfx12 ||
1105 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_fake16_gfx12 ||
1106 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_t16_gfx13 ||
1107 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_fake16_gfx13 ||
1108 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_t16_gfx11 ||
1109 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_fake16_gfx11 ||
1110 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_t16_gfx12 ||
1111 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_fake16_gfx12 ||
1112 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_t16_gfx13 ||
1113 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_fake16_gfx13) {
1121 if (
STI.hasFeature(AMDGPU::FeatureGFX9) ||
1122 STI.hasFeature(AMDGPU::FeatureGFX10)) {
1126 }
else if (
STI.hasFeature(AMDGPU::FeatureVolcanicIslands)) {
1127 int SDst = AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::sdst);
1131 AMDGPU::OpName::sdst);
1156 NewReg = MRI.
getSubReg(MO.
getReg(), AMDGPU::sub0_sub1_sub2_sub3_sub4_sub5);
1160 AMDGPU::sub0_sub1_sub2_sub3_sub4_sub5_sub6_sub7);
1170 BaseReg, AMDGPU::sub0, &MRI.
getRegClass(AMDGPU::VReg_384RegClassID));
1194 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::blgp);
1199 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::cbsz);
1201 unsigned CBSZ =
MI.getOperand(CbszIdx).getImm();
1202 unsigned BLGP =
MI.getOperand(BlgpIdx).getImm();
1206 if (!AdjustedRegClassOpcode ||
1207 AdjustedRegClassOpcode->
Opcode ==
MI.getOpcode())
1210 MI.setOpcode(AdjustedRegClassOpcode->
Opcode);
1212 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src0);
1214 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src1);
1223 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::matrix_a_fmt);
1228 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::matrix_b_fmt);
1230 unsigned FmtA =
MI.getOperand(FmtAIdx).getImm();
1231 unsigned FmtB =
MI.getOperand(FmtBIdx).getImm();
1235 if (!AdjustedRegClassOpcode ||
1236 AdjustedRegClassOpcode->
Opcode ==
MI.getOpcode())
1239 MI.setOpcode(AdjustedRegClassOpcode->
Opcode);
1241 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src0);
1243 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src1);
1261 bool IsVOP3P =
false) {
1263 unsigned Opc =
MI.getOpcode();
1264 const AMDGPU::OpName ModOps[] = {AMDGPU::OpName::src0_modifiers,
1265 AMDGPU::OpName::src1_modifiers,
1266 AMDGPU::OpName::src2_modifiers};
1267 for (
int J = 0; J < 3; ++J) {
1268 int OpIdx = AMDGPU::getNamedOperandIdx(
Opc, ModOps[J]);
1272 unsigned Val =
MI.getOperand(OpIdx).getImm();
1279 }
else if (J == 0) {
1290 const unsigned Opc =
MI.getOpcode();
1292 MRI.getRegClass(AMDGPU::VGPR_16RegClassID);
1293 constexpr std::array<std::tuple<AMDGPU::OpName, AMDGPU::OpName, unsigned>, 4>
1294 OpAndOpMods = {{{AMDGPU::OpName::src0, AMDGPU::OpName::src0_modifiers,
1296 {AMDGPU::OpName::src1, AMDGPU::OpName::src1_modifiers,
1298 {AMDGPU::OpName::src2, AMDGPU::OpName::src2_modifiers,
1300 {AMDGPU::OpName::vdst, AMDGPU::OpName::src0_modifiers,
1302 for (
const auto &[
OpName, OpModsName, OpSelMask] : OpAndOpMods) {
1303 int OpIdx = AMDGPU::getNamedOperandIdx(
Opc,
OpName);
1304 int OpModsIdx = AMDGPU::getNamedOperandIdx(
Opc, OpModsName);
1305 if (OpIdx == -1 || OpModsIdx == -1)
1312 unsigned OpEnc = MRI.getEncodingValue(
Op.getReg());
1313 const MCOperand &OpMods =
MI.getOperand(OpModsIdx);
1314 unsigned ModVal = OpMods.
getImm();
1315 if (ModVal & OpSelMask) {
1325 constexpr int DST_IDX = 0;
1326 auto Opcode =
MI.getOpcode();
1327 const auto &
Desc = MCII->get(Opcode);
1328 auto OldIdx = AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::old);
1330 if (OldIdx != -1 &&
Desc.getOperandConstraint(
1334 AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::src2),
1345 assert(
MI.getNumOperands() + 1 < MCII->get(
MI.getOpcode()).getNumOperands());
1348 AMDGPU::OpName::src2_modifiers);
1352 unsigned Opc =
MI.getOpcode();
1355 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vdst_in);
1356 if (VDstInIdx != -1)
1359 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1360 if (
MI.getNumOperands() < DescNumOps &&
1365 AMDGPU::OpName::op_sel);
1368 if (
MI.getNumOperands() < DescNumOps &&
1371 AMDGPU::OpName::src0_modifiers);
1373 if (
MI.getNumOperands() < DescNumOps &&
1376 AMDGPU::OpName::src1_modifiers);
1384 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vdst_in);
1385 if (VDstInIdx != -1)
1388 unsigned Opc =
MI.getOpcode();
1389 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1390 if (
MI.getNumOperands() < DescNumOps &&
1394 AMDGPU::OpName::op_sel);
1409 BaseReg = AMDGPU::VGPR0;
1411 BaseReg = AMDGPU::AGPR0;
1413 assert(BaseReg &&
"Only vector registers expected");
1415 return (Sub0 - BaseReg + NumRegs <= 256) ?
Reg :
MCRegister();
1422 int VDstIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1423 AMDGPU::OpName::vdst);
1425 int VDataIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1426 AMDGPU::OpName::vdata);
1428 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vaddr0);
1430 ? AMDGPU::OpName::srsrc
1431 : AMDGPU::OpName::rsrc;
1432 int RsrcIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(), RsrcOpName);
1433 int DMaskIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1434 AMDGPU::OpName::dmask);
1436 int TFEIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1437 AMDGPU::OpName::tfe);
1438 int D16Idx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1439 AMDGPU::OpName::d16);
1446 if (BaseOpcode->
BVH) {
1452 bool IsAtomic = (VDstIdx != -1);
1456 bool IsPartialNSA =
false;
1457 unsigned AddrSize = Info->VAddrDwords;
1461 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::dim);
1463 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::a16);
1466 const bool IsA16 = (A16Idx != -1 &&
MI.getOperand(A16Idx).
getImm());
1473 IsNSA = Info->MIMGEncoding == AMDGPU::MIMGEncGfx10NSA ||
1474 Info->MIMGEncoding == AMDGPU::MIMGEncGfx11NSA ||
1475 Info->MIMGEncoding == AMDGPU::MIMGEncGfx12 ||
1476 Info->MIMGEncoding == AMDGPU::MIMGEncGfx13;
1478 if (!IsVSample && AddrSize > 12)
1481 if (AddrSize > Info->VAddrDwords) {
1482 if (!
STI.hasFeature(AMDGPU::FeaturePartialNSAEncoding)) {
1487 IsPartialNSA =
true;
1492 unsigned DMask =
MI.getOperand(DMaskIdx).getImm() & 0xf;
1493 unsigned DstSize = IsGather4 ? 4 : std::max(
llvm::popcount(DMask), 1);
1495 bool D16 = D16Idx >= 0 &&
MI.getOperand(D16Idx).getImm();
1497 DstSize = (DstSize + 1) / 2;
1500 if (TFEIdx != -1 &&
MI.getOperand(TFEIdx).getImm())
1503 if (DstSize == Info->VDataDwords && AddrSize == Info->VAddrDwords)
1508 if (NewOpcode == -1)
1513 if (DstSize != Info->VDataDwords) {
1514 auto DataRCID = MCII->getOpRegClassID(
1515 MCII->get(NewOpcode).operands()[VDataIdx], HwModeRegClass);
1519 MCRegister VdataSub0 = MRI.getSubReg(Vdata0, AMDGPU::sub0);
1520 Vdata0 = (VdataSub0 != 0)? VdataSub0 : Vdata0;
1523 NewVdata = MRI.getMatchingSuperReg(Vdata0, AMDGPU::sub0, &NewRC);
1534 int VAddrSAIdx = IsPartialNSA ? (RsrcIdx - 1) : VAddr0Idx;
1536 if (
STI.hasFeature(AMDGPU::FeatureNSAEncoding) && (!IsNSA || IsPartialNSA) &&
1537 AddrSize != Info->VAddrDwords) {
1538 MCRegister VAddrSA =
MI.getOperand(VAddrSAIdx).getReg();
1539 MCRegister VAddrSubSA = MRI.getSubReg(VAddrSA, AMDGPU::sub0);
1540 VAddrSA = VAddrSubSA ? VAddrSubSA : VAddrSA;
1542 auto AddrRCID = MCII->getOpRegClassID(
1543 MCII->get(NewOpcode).operands()[VAddrSAIdx], HwModeRegClass);
1546 NewVAddrSA = MRI.getMatchingSuperReg(VAddrSA, AMDGPU::sub0, &NewRC);
1552 MI.setOpcode(NewOpcode);
1554 if (NewVdata != AMDGPU::NoRegister) {
1566 assert(AddrSize <= Info->VAddrDwords);
1567 MI.erase(
MI.begin() + VAddr0Idx + AddrSize,
1568 MI.begin() + VAddr0Idx + Info->VAddrDwords);
1576 unsigned Opc =
MI.getOpcode();
1577 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1580 if (
MI.getNumOperands() < DescNumOps &&
1584 if (
MI.getNumOperands() < DescNumOps &&
1587 AMDGPU::OpName::op_sel);
1588 if (
MI.getNumOperands() < DescNumOps &&
1591 AMDGPU::OpName::op_sel_hi);
1592 if (
MI.getNumOperands() < DescNumOps &&
1595 AMDGPU::OpName::neg_lo);
1596 if (
MI.getNumOperands() < DescNumOps &&
1599 AMDGPU::OpName::neg_hi);
1604 unsigned Opc =
MI.getOpcode();
1605 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1607 if (
MI.getNumOperands() < DescNumOps &&
1611 if (
MI.getNumOperands() < DescNumOps &&
1614 AMDGPU::OpName::src0_modifiers);
1616 if (
MI.getNumOperands() < DescNumOps &&
1619 AMDGPU::OpName::src1_modifiers);
1623 unsigned Opc =
MI.getOpcode();
1624 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1628 if (
MI.getNumOperands() < DescNumOps &&
1632 AMDGPU::OpName::op_sel);
1637 assert(HasLiteral &&
"Should have decoded a literal");
1643 &getAMDGPUMCRegisterClass(RegClassID));
1648 const Twine& ErrMsg)
const {
1662 unsigned Val)
const {
1663 const auto &RegCl = getAMDGPUMCRegisterClass(RegClassID);
1664 if (Val >= RegCl.getNumRegs())
1666 ": unknown register " +
Twine(Val));
1672 unsigned Val)
const {
1676 switch (SRegClassID) {
1677 case AMDGPU::SGPR_32RegClassID:
1678 case AMDGPU::TTMP_32RegClassID:
1680 case AMDGPU::SGPR_64RegClassID:
1681 case AMDGPU::TTMP_64RegClassID:
1684 case AMDGPU::SGPR_96RegClassID:
1685 case AMDGPU::TTMP_96RegClassID:
1686 case AMDGPU::SGPR_128RegClassID:
1687 case AMDGPU::TTMP_128RegClassID:
1690 case AMDGPU::SGPR_256RegClassID:
1691 case AMDGPU::TTMP_256RegClassID:
1694 case AMDGPU::SGPR_288RegClassID:
1695 case AMDGPU::TTMP_288RegClassID:
1696 case AMDGPU::SGPR_320RegClassID:
1697 case AMDGPU::TTMP_320RegClassID:
1698 case AMDGPU::SGPR_352RegClassID:
1699 case AMDGPU::TTMP_352RegClassID:
1700 case AMDGPU::SGPR_384RegClassID:
1701 case AMDGPU::TTMP_384RegClassID:
1702 case AMDGPU::SGPR_512RegClassID:
1703 case AMDGPU::TTMP_512RegClassID:
1712 if (Val % (1 << shift)) {
1714 <<
": scalar reg isn't aligned " << Val;
1722 unsigned RegIdxInVGPR16 = RegIdx * 2 + (IsHi ? 1 : 0);
1732 "Should only decode multiple kimm with VOPD, check VSrc operand types");
1734 return errOperand(Val,
"More than one unique literal is illegal");
1745 return errOperand(Val,
"More than one unique literal is illegal");
1750 bool UseLit64 =
Hi_32(Literal) == 0;
1763 if (Bytes.size() < 4) {
1764 return errOperand(0,
"cannot read literal, inst bytes left " +
1765 Twine(Bytes.size()));
1772 bool HasInv2Pi =
true;
1776 int64_t Val = Literal;
1777 bool UseLit =
false;
1849 assert(
STI.hasFeature(AMDGPU::Feature64BitLiterals));
1852 if (Bytes.size() < 8) {
1853 return errOperand(0,
"cannot read literal64, inst bytes left " +
1854 Twine(Bytes.size()));
1860 bool UseLit64 =
Hi_32(Literal) == 0;
1863 Literal,
STI.hasFeature(AMDGPU::FeatureInv2PiInlineImm));
1873 assert(
Imm >= INLINE_INTEGER_C_MIN &&
Imm <= INLINE_INTEGER_C_MAX);
1875 (
static_cast<int64_t
>(
Imm) - INLINE_INTEGER_C_MIN) :
1876 (INLINE_INTEGER_C_POSITIVE_MAX -
static_cast<int64_t
>(
Imm)));
1924 return 0x3fc45f306dc9c882;
1986 return VGPR_32RegClassID;
1988 return VReg_64RegClassID;
1990 return VReg_96RegClassID;
1992 return VReg_128RegClassID;
1994 return VReg_160RegClassID;
1996 return VReg_192RegClassID;
1998 return VReg_256RegClassID;
2000 return VReg_288RegClassID;
2002 return VReg_320RegClassID;
2004 return VReg_352RegClassID;
2006 return VReg_384RegClassID;
2008 return VReg_512RegClassID;
2010 return VReg_1024RegClassID;
2021 return AGPR_32RegClassID;
2023 return AReg_64RegClassID;
2025 return AReg_96RegClassID;
2027 return AReg_128RegClassID;
2029 return AReg_160RegClassID;
2031 return AReg_256RegClassID;
2033 return AReg_288RegClassID;
2035 return AReg_320RegClassID;
2037 return AReg_352RegClassID;
2039 return AReg_384RegClassID;
2041 return AReg_512RegClassID;
2043 return AReg_1024RegClassID;
2048std::optional<unsigned>
2055 return SGPR_32RegClassID;
2057 return SGPR_64RegClassID;
2059 return SGPR_96RegClassID;
2061 return SGPR_128RegClassID;
2063 return SGPR_160RegClassID;
2065 return SGPR_256RegClassID;
2067 return SGPR_288RegClassID;
2069 return SGPR_320RegClassID;
2071 return SGPR_352RegClassID;
2073 return SGPR_384RegClassID;
2075 return SGPR_512RegClassID;
2077 return std::nullopt;
2080std::optional<unsigned>
2087 return TTMP_32RegClassID;
2089 return TTMP_64RegClassID;
2091 return TTMP_128RegClassID;
2093 return TTMP_256RegClassID;
2095 return TTMP_288RegClassID;
2097 return TTMP_320RegClassID;
2099 return TTMP_352RegClassID;
2101 return TTMP_384RegClassID;
2103 return TTMP_512RegClassID;
2105 return std::nullopt;
2111 unsigned TTmpMin =
isGFX9Plus() ? TTMP_GFX9PLUS_MIN : TTMP_VI_MIN;
2112 unsigned TTmpMax =
isGFX9Plus() ? TTMP_GFX9PLUS_MAX : TTMP_VI_MAX;
2114 return (TTmpMin <= Val && Val <= TTmpMax)? Val - TTmpMin : -1;
2118 unsigned Val)
const {
2123 bool IsAGPR = Val & 512;
2126 if (VGPR_MIN <= Val && Val <= VGPR_MAX) {
2135 unsigned Val)
const {
2138 assert(Val < (1 << 8) &&
"9-bit Src encoding when Val{8} is 0");
2143 auto UnsupportedWidth = [&]() {
2145 "-bit non-VGPR operand encoding " +
Twine(Val));
2150 static_assert(SGPR_MIN == 0);
2153 return UnsupportedWidth();
2161 return UnsupportedWidth();
2165 if ((INLINE_INTEGER_C_MIN <= Val && Val <= INLINE_INTEGER_C_MAX) ||
2166 (INLINE_FLOATING_C_MIN <= Val && Val <= INLINE_FLOATING_C_MAX) ||
2167 Val == LITERAL_CONST)
2170 if (Val == LITERAL64_CONST &&
STI.hasFeature(AMDGPU::Feature64BitLiterals)) {
2176 "64-bit literal is not supported by this instruction");
2193 return UnsupportedWidth();
2200 unsigned Val)
const {
2202 AMDGPU::getNamedOperandIdx(Inst.
getOpcode(), AMDGPU::OpName::vdstX);
2205 unsigned XDstReg = MRI.getEncodingValue(Inst.
getOperand(VDstXInd).
getReg());
2206 Val |= ~XDstReg & 1;
2329 const unsigned Val)
const {
2333 if (
STI.hasFeature(AMDGPU::FeatureGFX9) ||
2334 STI.hasFeature(AMDGPU::FeatureGFX10)) {
2337 if (
int(SDWA9EncValues::SRC_VGPR_MIN) <=
int(Val) &&
2338 Val <= SDWA9EncValues::SRC_VGPR_MAX) {
2340 Val - SDWA9EncValues::SRC_VGPR_MIN);
2342 if (SDWA9EncValues::SRC_SGPR_MIN <= Val &&
2343 Val <= (
isGFX10Plus() ? SDWA9EncValues::SRC_SGPR_MAX_GFX10
2344 : SDWA9EncValues::SRC_SGPR_MAX_SI)) {
2346 Val - SDWA9EncValues::SRC_SGPR_MIN);
2348 if (SDWA9EncValues::SRC_TTMP_MIN <= Val &&
2349 Val <= SDWA9EncValues::SRC_TTMP_MAX) {
2351 Val - SDWA9EncValues::SRC_TTMP_MIN);
2354 const unsigned SVal = Val - SDWA9EncValues::SRC_SGPR_MIN;
2356 if ((INLINE_INTEGER_C_MIN <= SVal && SVal <= INLINE_INTEGER_C_MAX) ||
2357 (INLINE_FLOATING_C_MIN <= SVal && SVal <= INLINE_FLOATING_C_MAX))
2362 if (
STI.hasFeature(AMDGPU::FeatureVolcanicIslands))
2378 assert((
STI.hasFeature(AMDGPU::FeatureGFX9) ||
2379 STI.hasFeature(AMDGPU::FeatureGFX10)) &&
2380 "SDWAVopcDst should be present only on GFX9+");
2382 bool IsWave32 =
STI.hasFeature(AMDGPU::FeatureWavefrontSize32);
2384 if (Val & SDWA9EncValues::VOPC_DST_VCC_MASK) {
2385 Val &= SDWA9EncValues::VOPC_DST_SGPR_MASK;
2399 unsigned Val)
const {
2400 return STI.hasFeature(AMDGPU::FeatureWavefrontSize32)
2406 unsigned Val)
const {
2408 constexpr unsigned M0Encoding = 125;
2409 bool IsValidBarrier =
2410 Val == M0Encoding ||
2411 (INLINE_INTEGER_C_MIN <= Val && Val < INLINE_INTEGER_C_MIN + 32) ||
2412 (INLINE_INTEGER_C_POSITIVE_MAX < Val &&
2413 Val <= INLINE_INTEGER_C_POSITIVE_MAX + 4);
2414 if (!IsValidBarrier)
2432 auto [
Version, W64, W32, MDP] = Encoding::decode(
Imm);
2435 if (Encoding::encode(
Version, W64, W32, MDP) !=
Imm)
2445 if (
I == Versions.end())
2461 return STI.hasFeature(AMDGPU::FeatureVolcanicIslands);
2467 return STI.hasFeature(AMDGPU::FeatureGFX90AInsts);
2479 return STI.hasFeature(AMDGPU::FeatureGFX11);
2487 return STI.hasFeature(AMDGPU::FeatureGFX11_7Insts);
2491 return STI.hasFeature(AMDGPU::FeatureGFX12);
2511 return STI.hasFeature(AMDGPU::FeatureArchitectedFlatScratch);
2532 if (PopCount == 1) {
2533 S <<
"bit (" << (TrailingZeros + BaseBytes * CHAR_BIT) <<
')';
2535 S <<
"bits in range ("
2536 << (TrailingZeros + PopCount - 1 + BaseBytes * CHAR_BIT) <<
':'
2537 << (TrailingZeros + BaseBytes * CHAR_BIT) <<
')';
2543#define GET_FIELD(MASK) (AMDHSA_BITS_GET(FourByteBuffer, MASK))
2544#define PRINT_DIRECTIVE(DIRECTIVE, MASK) \
2546 KdStream << Indent << DIRECTIVE " " << GET_FIELD(MASK) << '\n'; \
2548#define PRINT_PSEUDO_DIRECTIVE_COMMENT(DIRECTIVE, MASK) \
2550 KdStream << Indent << MAI.getCommentString() << ' ' << DIRECTIVE " " \
2551 << GET_FIELD(MASK) << '\n'; \
2554#define CHECK_RESERVED_BITS_IMPL(MASK, DESC, MSG) \
2556 if (FourByteBuffer & (MASK)) { \
2557 return createStringError(std::errc::invalid_argument, \
2558 "kernel descriptor " DESC \
2559 " reserved %s set" MSG, \
2560 getBitRangeFromMask((MASK), 0).c_str()); \
2564#define CHECK_RESERVED_BITS(MASK) CHECK_RESERVED_BITS_IMPL(MASK, #MASK, "")
2565#define CHECK_RESERVED_BITS_MSG(MASK, MSG) \
2566 CHECK_RESERVED_BITS_IMPL(MASK, #MASK, ", " MSG)
2567#define CHECK_RESERVED_BITS_DESC(MASK, DESC) \
2568 CHECK_RESERVED_BITS_IMPL(MASK, DESC, "")
2569#define CHECK_RESERVED_BITS_DESC_MSG(MASK, DESC, MSG) \
2570 CHECK_RESERVED_BITS_IMPL(MASK, DESC, ", " MSG)
2583 uint32_t GranulatedWorkitemVGPRCount =
2584 GET_FIELD(COMPUTE_PGM_RSRC1_GRANULATED_WORKITEM_VGPR_COUNT);
2587 (GranulatedWorkitemVGPRCount + 1) *
2590 KdStream << Indent <<
".amdhsa_next_free_vgpr " << NextFreeVGPR <<
'\n';
2611 uint32_t GranulatedWavefrontSGPRCount =
2612 GET_FIELD(COMPUTE_PGM_RSRC1_GRANULATED_WAVEFRONT_SGPR_COUNT);
2616 "must be zero on gfx10+");
2618 uint32_t NextFreeSGPR = (GranulatedWavefrontSGPRCount + 1) *
2621 KdStream << Indent <<
".amdhsa_reserve_vcc " << 0 <<
'\n';
2623 KdStream << Indent <<
".amdhsa_reserve_flat_scratch " << 0 <<
'\n';
2627 bool ReservedXnackMask = TargetID.isXnackOnOrAny();
2628 if (
STI.hasFeature(AMDGPU::FeatureSupportsXNACK) || ReservedXnackMask) {
2629 KdStream << Indent <<
".amdhsa_reserve_xnack_mask " << ReservedXnackMask
2632 KdStream << Indent <<
".amdhsa_next_free_sgpr " << NextFreeSGPR <<
"\n";
2637 COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_32);
2639 COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_16_64);
2641 COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_32);
2643 COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_16_64);
2647 if (
STI.hasFeature(AMDGPU::FeatureDX10ClampAndIEEEMode))
2649 COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_DX10_CLAMP);
2653 if (
STI.hasFeature(AMDGPU::FeatureDX10ClampAndIEEEMode))
2655 COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_IEEE_MODE);
2662 PRINT_DIRECTIVE(
".amdhsa_fp16_overflow", COMPUTE_PGM_RSRC1_GFX9_PLUS_FP16_OVFL);
2665 "COMPUTE_PGM_RSRC1",
"must be zero pre-gfx9");
2671 COMPUTE_PGM_RSRC1_GFX125_FLAT_SCRATCH_IS_NV);
2674 "COMPUTE_PGM_RSRC1");
2685 COMPUTE_PGM_RSRC1_GFX10_PLUS_WGP_MODE);
2687 PRINT_DIRECTIVE(
".amdhsa_memory_ordered", COMPUTE_PGM_RSRC1_GFX10_PLUS_MEM_ORDERED);
2688 PRINT_DIRECTIVE(
".amdhsa_forward_progress", COMPUTE_PGM_RSRC1_GFX10_PLUS_FWD_PROGRESS);
2691 "COMPUTE_PGM_RSRC1");
2696 COMPUTE_PGM_RSRC1_GFX12_PLUS_ENABLE_WG_RR_EN);
2708 COMPUTE_PGM_RSRC2_ENABLE_PRIVATE_SEGMENT);
2710 PRINT_DIRECTIVE(
".amdhsa_system_sgpr_private_segment_wavefront_offset",
2711 COMPUTE_PGM_RSRC2_ENABLE_PRIVATE_SEGMENT);
2713 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_X);
2715 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Y);
2717 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Z);
2719 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_INFO);
2721 COMPUTE_PGM_RSRC2_ENABLE_VGPR_WORKITEM_ID);
2728 ".amdhsa_exception_fp_ieee_invalid_op",
2729 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INVALID_OPERATION);
2731 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_FP_DENORMAL_SOURCE);
2733 ".amdhsa_exception_fp_ieee_div_zero",
2734 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_DIVISION_BY_ZERO);
2736 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_OVERFLOW);
2738 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_UNDERFLOW);
2740 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INEXACT);
2742 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_INT_DIVIDE_BY_ZERO);
2755 KdStream << Indent <<
".amdhsa_accum_offset "
2756 << (
GET_FIELD(COMPUTE_PGM_RSRC3_GFX90A_ACCUM_OFFSET) + 1) * 4
2759 PRINT_DIRECTIVE(
".amdhsa_tg_split", COMPUTE_PGM_RSRC3_GFX90A_TG_SPLIT);
2762 "COMPUTE_PGM_RSRC3",
"must be zero on gfx90a");
2764 "COMPUTE_PGM_RSRC3",
"must be zero on gfx90a");
2768 if (!EnableWavefrontSize32 || !*EnableWavefrontSize32) {
2770 COMPUTE_PGM_RSRC3_GFX10_GFX11_SHARED_VGPR_COUNT);
2773 "SHARED_VGPR_COUNT",
2774 COMPUTE_PGM_RSRC3_GFX10_GFX11_SHARED_VGPR_COUNT);
2778 "COMPUTE_PGM_RSRC3",
2779 "must be zero on gfx12+");
2785 COMPUTE_PGM_RSRC3_GFX11_INST_PREF_SIZE);
2787 COMPUTE_PGM_RSRC3_GFX11_TRAP_ON_START);
2789 COMPUTE_PGM_RSRC3_GFX11_TRAP_ON_END);
2792 COMPUTE_PGM_RSRC3_GFX12_PLUS_INST_PREF_SIZE);
2795 "COMPUTE_PGM_RSRC3",
2796 "must be zero on gfx10");
2801 "COMPUTE_PGM_RSRC3",
"must be zero on gfx10+");
2806 COMPUTE_PGM_RSRC3_GFX12_PLUS_GLG_EN);
2809 "COMPUTE_PGM_RSRC3",
2810 "must be zero on gfx10 or gfx11");
2816 COMPUTE_PGM_RSRC3_GFX125_NAMED_BAR_CNT);
2818 "ENABLE_DYNAMIC_VGPR", COMPUTE_PGM_RSRC3_GFX125_ENABLE_DYNAMIC_VGPR);
2820 COMPUTE_PGM_RSRC3_GFX125_TCP_SPLIT);
2822 "ENABLE_DIDT_THROTTLE",
2823 COMPUTE_PGM_RSRC3_GFX125_ENABLE_DIDT_THROTTLE);
2826 "COMPUTE_PGM_RSRC3",
2827 "must be zero on gfx10+");
2832 "COMPUTE_PGM_RSRC3",
"must be zero on gfx10+");
2837 COMPUTE_PGM_RSRC3_GFX11_PLUS_IMAGE_OP);
2840 "COMPUTE_PGM_RSRC3",
2841 "must be zero on gfx10");
2843 }
else if (FourByteBuffer) {
2845 std::errc::invalid_argument,
2846 "kernel descriptor COMPUTE_PGM_RSRC3 must be all zero before gfx9");
2850#undef PRINT_PSEUDO_DIRECTIVE_COMMENT
2851#undef PRINT_DIRECTIVE
2853#undef CHECK_RESERVED_BITS_IMPL
2854#undef CHECK_RESERVED_BITS
2855#undef CHECK_RESERVED_BITS_MSG
2856#undef CHECK_RESERVED_BITS_DESC
2857#undef CHECK_RESERVED_BITS_DESC_MSG
2862 const char *
Msg =
"") {
2864 std::errc::invalid_argument,
"kernel descriptor reserved %s set%s%s",
2871 unsigned WidthInBytes) {
2875 std::errc::invalid_argument,
2876 "kernel descriptor reserved bits in range (%u:%u) set",
2877 (BaseInBytes + WidthInBytes) * CHAR_BIT - 1, BaseInBytes * CHAR_BIT);
2883#define PRINT_DIRECTIVE(DIRECTIVE, MASK) \
2885 KdStream << Indent << DIRECTIVE " " \
2886 << ((TwoByteBuffer & MASK) >> (MASK##_SHIFT)) << '\n'; \
2889 uint16_t TwoByteBuffer = 0;
2895 assert(Bytes.size() == 64);
2898 switch (Cursor.tell()) {
2900 FourByteBuffer = DE.
getU32(Cursor);
2901 KdStream << Indent <<
".amdhsa_group_segment_fixed_size " << FourByteBuffer
2906 FourByteBuffer = DE.
getU32(Cursor);
2907 KdStream << Indent <<
".amdhsa_private_segment_fixed_size "
2908 << FourByteBuffer <<
'\n';
2912 FourByteBuffer = DE.
getU32(Cursor);
2913 KdStream << Indent <<
".amdhsa_kernarg_size "
2914 << FourByteBuffer <<
'\n';
2919 ReservedBytes = DE.
getBytes(Cursor, 4);
2920 for (
char B : ReservedBytes) {
2935 ReservedBytes = DE.
getBytes(Cursor, 20);
2936 for (
char B : ReservedBytes) {
2943 FourByteBuffer = DE.
getU32(Cursor);
2947 FourByteBuffer = DE.
getU32(Cursor);
2951 FourByteBuffer = DE.
getU32(Cursor);
2956 TwoByteBuffer = DE.
getU16(Cursor);
2960 KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER);
2962 KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_PTR);
2964 KERNEL_CODE_PROPERTY_ENABLE_SGPR_QUEUE_PTR);
2966 KERNEL_CODE_PROPERTY_ENABLE_SGPR_KERNARG_SEGMENT_PTR);
2968 KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_ID);
2971 KERNEL_CODE_PROPERTY_ENABLE_SGPR_FLAT_SCRATCH_INIT);
2973 KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE);
2975 if (TwoByteBuffer & KERNEL_CODE_PROPERTY_RESERVED0)
2981 (TwoByteBuffer & KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32)) {
2983 KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32,
2988 KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32);
2993 KERNEL_CODE_PROPERTY_USES_DYNAMIC_STACK);
2995 if (TwoByteBuffer & KERNEL_CODE_PROPERTY_RESERVED1) {
3004 TwoByteBuffer = DE.
getU16(Cursor);
3005 if (TwoByteBuffer & KERNARG_PRELOAD_SPEC_LENGTH) {
3007 KERNARG_PRELOAD_SPEC_LENGTH);
3010 if (TwoByteBuffer & KERNARG_PRELOAD_SPEC_OFFSET) {
3012 KERNARG_PRELOAD_SPEC_OFFSET);
3018 ReservedBytes = DE.
getBytes(Cursor, 4);
3019 for (
char B : ReservedBytes) {
3029#undef PRINT_DIRECTIVE
3036 if (Bytes.size() != 64 || KdAddress % 64 != 0)
3038 "kernel descriptor must be 64-byte aligned");
3046 uint16_t KernelCodeProperties =
3049 EnableWavefrontSize32 =
3051 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32);
3056 KdStream <<
".amdhsa_kernel " << KdName <<
'\n';
3059 while (
C &&
C.tell() < Bytes.size()) {
3067 KdStream <<
".end_amdhsa_kernel\n";
3086 "code object v2 is not supported");
3099const MCExpr *AMDGPUDisassembler::createConstantSymbolExpr(
StringRef Id,
3102 MCSymbol *Sym = Ctx.getOrCreateSymbol(Id);
3110 if (!Valid || Res != Val)
3111 Ctx.reportWarning(
SMLoc(),
"unsupported redefinition of " + Id);
3136 uint64_t ,
bool IsBranch, uint64_t ,
3137 uint64_t , uint64_t ) {
3148 return Val.
Addr ==
static_cast<uint64_t
>(
Value) &&
3151 if (Result != Symbols->end()) {
3152 auto *Sym =
Ctx.getOrCreateSymbol(Result->Name);
3158 ReferencedAddresses.push_back(
static_cast<uint64_t
>(
Value));
3177 std::unique_ptr<MCRelocationInfo> &&RelInfo) {
MCDisassembler::DecodeStatus DecodeStatus
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define CHECK_RESERVED_BITS_DESC(MASK, DESC)
static DecodeStatus decodeRsrcRegOp(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder, unsigned OpWidth)
static VOPModifiers collectVOPModifiers(const MCInst &MI, bool IsVOP3P=false)
static int insertNamedMCOperand(MCInst &MI, const MCOperand &Op, AMDGPU::OpName Name)
#define DECODE_OPERAND_SREG_9(RegClass, OpWidth)
LLVM_ABI LLVM_EXTERNAL_VISIBILITY void LLVMInitializeAMDGPUDisassembler()
static DecodeStatus decodeOperand_VSrcT16_Lo128(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder)
static DecodeStatus decodeOperand_KImmFP64(MCInst &Inst, uint64_t Imm, uint64_t Addr, const MCDisassembler *Decoder)
static SmallString< 32 > getBitRangeFromMask(uint32_t Mask, unsigned BaseBytes)
Print a string describing the reserved bit range specified by Mask with offset BaseBytes for use in e...
#define DECODE_OPERAND_SREG_8(RegClass, OpWidth)
static DecodeStatus decodeSMEMOffset(MCInst &Inst, unsigned Imm, uint64_t Addr, const MCDisassembler *Decoder)
static std::bitset< 128 > eat16Bytes(ArrayRef< uint8_t > &Bytes)
#define DECODE_OPERAND_SREG_7(RegClass, OpWidth)
static DecodeStatus decodeSrcA9(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder)
static DecodeStatus decodeOperand_VGPR_16(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder)
#define PRINT_PSEUDO_DIRECTIVE_COMMENT(DIRECTIVE, MASK)
static DecodeStatus decodeSrcOp(MCInst &Inst, unsigned EncSize, unsigned OpWidth, unsigned Imm, unsigned EncImm, const MCDisassembler *Decoder)
static DecodeStatus decodeDpp8FI(MCInst &Inst, unsigned Val, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus decodeOperand_VSrc_f64(MCInst &Inst, unsigned Imm, uint64_t Addr, const MCDisassembler *Decoder)
static MCRegister CheckVGPROverflow(MCRegister Reg, const MCRegisterClass &RC, const MCRegisterInfo &MRI)
static int64_t getInlineImmValBF16(unsigned Imm)
#define DECODE_SDWA(DecName)
static DecodeStatus decodeSOPPBrTarget(MCInst &Inst, unsigned Imm, uint64_t Addr, const MCDisassembler *Decoder)
#define DECODE_OPERAND_REG_8(RegClass)
#define PRINT_DIRECTIVE(DIRECTIVE, MASK)
static DecodeStatus decodeSrcRegOrImm9(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder)
static DecodeStatus DecodeVGPR_16RegisterClass(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder)
static DecodeStatus decodeSrcReg9(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder)
static int64_t getInlineImmVal32(unsigned Imm)
static MCDisassembler::DecodeStatus addOperand(MCInst &Inst, const MCOperand &Opnd)
#define CHECK_RESERVED_BITS(MASK)
static DecodeStatus decodeSrcAV10(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder)
static int64_t getInlineImmVal64(unsigned Imm)
static T eatBytes(ArrayRef< uint8_t > &Bytes)
static DecodeStatus decodeOperand_KImmFP(MCInst &Inst, unsigned Imm, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus decodeAVLdSt(MCInst &Inst, unsigned Imm, unsigned Opw, const MCDisassembler *Decoder)
#define DECODE_SDWA_IMM_FIELD(Name, MaxImm)
static MCDisassembler * createAMDGPUDisassembler(const Target &T, const MCSubtargetInfo &STI, MCContext &Ctx)
static DecodeStatus decodeSrcRegOrImmA9(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder)
static DecodeStatus DecodeVGPR_16_Lo128RegisterClass(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder)
#define CHECK_RESERVED_BITS_MSG(MASK, MSG)
static DecodeStatus decodeOperandVOPDDstY(MCInst &Inst, unsigned Val, uint64_t Addr, const void *Decoder)
static MCSymbolizer * createAMDGPUSymbolizer(const Triple &, LLVMOpInfoCallback, LLVMSymbolLookupCallback, void *DisInfo, MCContext *Ctx, std::unique_ptr< MCRelocationInfo > &&RelInfo)
static DecodeStatus decodeBoolReg(MCInst &Inst, unsigned Val, uint64_t Addr, const MCDisassembler *Decoder)
static int64_t getInlineImmValF16(unsigned Imm)
unsigned const MCDisassembler * Decoder
static std::bitset< 96 > eat12Bytes(ArrayRef< uint8_t > &Bytes)
static DecodeStatus decodeRsrcReg128(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder)
static DecodeStatus decodeOperand_VSrcT16(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder)
static Error createReservedKDBytesError(unsigned BaseInBytes, unsigned WidthInBytes)
Create an error object to return from onSymbolStart for reserved kernel descriptor bytes being set.
static DecodeStatus decodeSplitBarrier(MCInst &Inst, unsigned Val, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus decodeAV10(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder)
static bool adjustMFMA_F8F6F4OpRegClass(const MCRegisterInfo &MRI, MCOperand &MO, uint8_t NumRegs)
Adjust the register values used by V_MFMA_F8F6F4_f8_f8 instructions to the appropriate subregister fo...
#define CHECK_RESERVED_BITS_DESC_MSG(MASK, DESC, MSG)
static Error createReservedKDBitsError(uint32_t Mask, unsigned BaseBytes, const char *Msg="")
Create an error object to return from onSymbolStart for reserved kernel descriptor bits being set.
This file contains declaration for AMDGPU ISA disassembler.
Provides AMDGPU specific target descriptions.
static cl::opt< bool > XnackSetting("amdgpu-xnack", cl::desc("Force amdgpu.xnack value for testing"), cl::ReallyHidden)
AMDHSA kernel descriptor definitions.
#define AMDHSA_BITS_GET(SRC, MSK)
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_EXTERNAL_VISIBILITY
Interface definition for SIRegisterInfo.
std::optional< unsigned > getSgprClassId(unsigned Width) const
Return the SGPR/TTMP register class accepted by source decoding for Width, or std::nullopt if that wi...
MCOperand decodeNonVGPRSrcOp(const MCInst &Inst, unsigned Width, unsigned Val) const
MCOperand decodeLiteral64Constant() const
void convertVOPC64DPPInst(MCInst &MI) const
bool isBufferInstruction(const MCInst &MI) const
Check if the instruction is a buffer operation (MUBUF, MTBUF, or S_BUFFER)
bool hasKernargPreload() const
void convertEXPInst(MCInst &MI) const
MCOperand decodeSpecialReg64(unsigned Val) const
const char * getRegClassName(unsigned RegClassID) const
Expected< bool > decodeCOMPUTE_PGM_RSRC1(uint32_t FourByteBuffer, raw_string_ostream &KdStream) const
Decode as directives that handle COMPUTE_PGM_RSRC1.
MCOperand decodeSplitBarrier(const MCInst &Inst, unsigned Val) const
Expected< bool > decodeKernelDescriptorDirective(DataExtractor::Cursor &Cursor, ArrayRef< uint8_t > Bytes, raw_string_ostream &KdStream) const
void convertVOPCDPPInst(MCInst &MI) const
bool isGFX1250Plus() const
MCOperand decodeSpecialReg96Plus(unsigned Val) const
MCOperand decodeSDWASrc32(unsigned Val) const
void setABIVersion(unsigned Version) override
ELF-specific, set the ABI version from the object header.
Expected< bool > decodeCOMPUTE_PGM_RSRC2(uint32_t FourByteBuffer, raw_string_ostream &KdStream) const
Decode as directives that handle COMPUTE_PGM_RSRC2.
unsigned getAgprClassId(unsigned Width) const
MCOperand decodeDpp8FI(unsigned Val) const
MCOperand decodeSDWASrc(unsigned Width, unsigned Val) const
void convertFMAanyK(MCInst &MI) const
DecodeStatus tryDecodeInst(const uint8_t *Table, MCInst &MI, InsnType Inst, uint64_t Address, raw_ostream &Comments) const
void convertMacDPPInst(MCInst &MI) const
MCOperand decodeVOPDDstYOp(MCInst &Inst, unsigned Val) const
void convertDPP8Inst(MCInst &MI) const
MCOperand createVGPR16Operand(unsigned RegIdx, bool IsHi) const
MCOperand errOperand(unsigned V, const Twine &ErrMsg) const
MCOperand decodeVersionImm(unsigned Imm) const
Expected< bool > decodeKernelDescriptor(StringRef KdName, ArrayRef< uint8_t > Bytes, uint64_t KdAddress) const
void convertVOP3DPPInst(MCInst &MI) const
void convertTrue16OpSel(MCInst &MI) const
MCOperand decodeSrcOp(const MCInst &Inst, unsigned Width, unsigned Val) const
bool convertMAIInst(MCInst &MI) const
f8f6f4 instructions have different pseudos depending on the used formats.
MCOperand decodeMandatoryLiteralConstant(unsigned Imm) const
MCOperand decodeLiteralConstant(const MCInstrDesc &Desc, const MCOperandInfo &OpDesc) const
Expected< bool > decodeCOMPUTE_PGM_RSRC3(uint32_t FourByteBuffer, raw_string_ostream &KdStream) const
Decode as directives that handle COMPUTE_PGM_RSRC3.
AMDGPUDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx, MCInstrInfo const *MCII)
MCOperand decodeSpecialReg32(unsigned Val) const
MCOperand createRegOperand(MCRegister Reg) const
MCOperand decodeSDWAVopcDst(unsigned Val) const
void convertVINTERPInst(MCInst &MI) const
void convertSDWAInst(MCInst &MI) const
static MCOperand decodeIntImmed(unsigned Imm)
MCOperand decodeBoolReg(const MCInst &Inst, unsigned Val) const
void emitTargetIDIfSupported(raw_ostream &OS, unsigned EFlags) const override
Emit something based on ELF's e_flags if the target needs to.
unsigned getVgprClassId(unsigned Width) const
bool hasArchitectedFlatScratch() const
DecodeStatus getInstruction(MCInst &MI, uint64_t &Size, ArrayRef< uint8_t > Bytes, uint64_t Address, raw_ostream &CS) const override
Returns the disassembly of a single instruction.
std::optional< unsigned > getTtmpClassId(unsigned Width) const
MCOperand decodeMandatoryLiteral64Constant(uint64_t Imm) const
void convertMIMGInst(MCInst &MI) const
bool isMacDPP(MCInst &MI) const
int getTTmpIdx(unsigned Val) const
void convertVOP3PDPPInst(MCInst &MI) const
bool convertWMMAInst(MCInst &MI) const
MCOperand createSRegOperand(unsigned SRegClassID, unsigned Val) const
MCOperand decodeSDWASrc16(unsigned Val) const
Expected< bool > onSymbolStart(SymbolInfoTy &Symbol, uint64_t &Size, ArrayRef< uint8_t > Bytes, uint64_t Address) const override
Used to perform separate target specific disassembly for a particular symbol.
static const AMDGPUMCExpr * createLit(LitModifier Lit, int64_t Value, MCContext &Ctx)
bool tryAddingSymbolicOperand(MCInst &Inst, raw_ostream &cStream, int64_t Value, uint64_t Address, bool IsBranch, uint64_t Offset, uint64_t OpSize, uint64_t InstSize) override
Try to add a symbolic operand instead of Value to the MCInst.
void tryAddingPcLoadReferenceComment(raw_ostream &cStream, int64_t Value, uint64_t Address) override
Try to add a comment on the PC-relative load.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
ArrayRef< T > slice(size_t N, size_t M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array.
Lightweight error class with error context and mandatory checking.
Tagged union holding either a T or a Error.
static const MCBinaryExpr * createOr(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
static LLVM_ABI const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
Context object for machine code objects.
const MCRegisterInfo * getRegisterInfo() const
Superclass for all disassemblers.
MCDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx)
MCContext & getContext() const
const MCSubtargetInfo & STI
raw_ostream * CommentStream
DecodeStatus
Ternary decode status.
Base class for the full range of assembler expressions which are needed for parsing.
Instances of this class represent a single low-level machine instruction.
unsigned getOpcode() const
void addOperand(const MCOperand Op)
const MCOperand & getOperand(unsigned i) const
Describe properties that are true of each instruction in the target description file.
Interface to description of machine instruction set.
This holds information about one operand of a machine instruction, indicating the register class for ...
uint8_t OperandType
Information about the type of the operand.
Instances of this class represent operands of the MCInst class.
static MCOperand createExpr(const MCExpr *Val)
static MCOperand createReg(MCRegister Reg)
static MCOperand createImm(int64_t Val)
void setReg(MCRegister Reg)
Set the register number.
MCRegister getReg() const
Returns the register number.
MCRegisterClass - Base class of TargetRegisterClass.
MCRegister getRegister(unsigned i) const
getRegister - Return the specified register in the class.
unsigned getSizeInBits() const
Return the size of the physical register in bits if we are able to determine it.
bool contains(MCRegister Reg) const
contains - Return true if the specified register is included in this register class.
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
MCRegister getMatchingSuperReg(MCRegister Reg, unsigned SubIdx, const MCRegisterClass *RC) const
Return a super-register of the specified register Reg so its sub-register of index SubIdx is Reg.
const char * getRegClassName(const MCRegisterClass *Class) const
const MCRegisterClass & getRegClass(unsigned i) const
Returns the register class associated with the enumeration value.
MCRegister getSubReg(MCRegister Reg, unsigned Idx) const
Returns the physical register number of sub-register "Index" for physical register RegNo.
Wrapper class representing physical registers. Should be passed by value.
Generic base class for all target subtargets.
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx, SMLoc Loc=SMLoc())
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
bool isVariable() const
isVariable - Check if this is a variable symbol.
LLVM_ABI void setVariableValue(const MCExpr *Value)
const MCExpr * getVariableValue() const
Get the expression of the variable symbol.
Symbolize and annotate disassembled instructions.
Represents a location in source code.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Represent a constant reference to a string, i.e.
Target - Wrapper for Target specific information.
Triple - Helper class for working with autoconf configuration names.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
LLVM Value Representation.
This class implements an extremely fast bulk output stream that can only output to a stream.
A raw_ostream that writes to an std::string.
std::string & str()
Returns the string's reference.
A raw_ostream that writes to an SmallVector or SmallString.
const char *(* LLVMSymbolLookupCallback)(void *DisInfo, uint64_t ReferenceValue, uint64_t *ReferenceType, uint64_t ReferencePC, const char **ReferenceName)
The type for the symbol lookup function.
int(* LLVMOpInfoCallback)(void *DisInfo, uint64_t PC, uint64_t Offset, uint64_t OpSize, uint64_t InstSize, int TagType, void *TagBuf)
The type for the operand information call back function.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned getVGPREncodingGranule(const MCSubtargetInfo &STI, std::optional< bool > EnableWavefrontSize32)
unsigned getSGPREncodingGranule(const MCSubtargetInfo &STI)
ArrayRef< GFXVersion > getGFXVersions()
bool isInlinableLiteralBF16(int16_t Literal, bool HasInv2Pi)
EncodingField< Bit, Bit, D > EncodingBit
bool isPKFMACF16InlineConstant(uint32_t Literal, bool IsGFX11Plus)
LLVM_READONLY const MIMGInfo * getMIMGInfo(unsigned Opc)
bool isInlinableLiteralFP16(int16_t Literal, bool HasInv2Pi)
MCRegister getMCReg(MCRegister Reg, const MCSubtargetInfo &STI)
If Reg is a pseudo reg, return the correct hardware register given STI otherwise return Reg.
int getMIMGOpcode(unsigned BaseOpcode, unsigned MIMGEncoding, unsigned VDataDwords, unsigned VAddrDwords)
bool isInlinableLiteralV2I16(uint32_t Literal)
bool isGFX10(const MCSubtargetInfo &STI)
bool isInlinableLiteralV2BF16(uint32_t Literal)
bool isGFX12Plus(const MCSubtargetInfo &STI)
bool hasPackedD16(const MCSubtargetInfo &STI)
bool isInlinableLiteralV2F16(uint32_t Literal)
bool getSMEMIsBuffer(unsigned Opc)
bool isGFX13(const MCSubtargetInfo &STI)
bool isVOPC64DPP(unsigned Opc)
bool hasPrivateApertureRegs(const MCSubtargetInfo &STI)
unsigned getAMDHSACodeObjectVersion(const Module &M)
LLVM_READONLY bool hasNamedOperand(uint64_t Opcode, OpName NamedIdx)
bool isGFX9(const MCSubtargetInfo &STI)
LLVM_READONLY const MIMGDimInfo * getMIMGDimInfoByEncoding(uint8_t DimEnc)
bool isInlinableLiteral32(int32_t Literal, bool HasInv2Pi)
const MFMA_F8F6F4_Info * getWMMA_F8F6F4_WithFormatArgs(unsigned FmtA, unsigned FmtB, unsigned F8F8Opcode)
bool hasG16(const MCSubtargetInfo &STI)
unsigned getAddrSizeMIMGOp(const MIMGBaseOpcodeInfo *BaseOpcode, const MIMGDimInfo *Dim, bool IsA16, bool IsG16Supported)
bool isGFX13Plus(const MCSubtargetInfo &STI)
bool isGFX11Plus(const MCSubtargetInfo &STI)
bool isGFX10Plus(const MCSubtargetInfo &STI)
@ OPERAND_KIMM32
Operand with 32-bit immediate that uses the constant bus.
@ OPERAND_REG_INLINE_C_FP64
@ OPERAND_REG_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.