44#define DEBUG_TYPE "amdgpu-disassembler"
47 (isGFX10Plus() ? AMDGPU::EncValues::SGPR_MAX_GFX10 \
48 : AMDGPU::EncValues::SGPR_MAX_SI)
60 MAI(Ctx.getAsmInfo()),
62 TargetMaxInstBytes(MAI.getMaxInstLength(&
STI)),
63 TargetID(
AMDGPU::createAMDGPUTargetID(
STI,
"")),
64 CodeObjectVersion(
AMDGPU::getDefaultAMDHSACodeObjectVersion()) {
66 if (!
STI.hasFeature(AMDGPU::FeatureGCN3Encoding) && !
isGFX10Plus())
70 createConstantSymbolExpr(Symbol, Code);
72 UCVersionW64Expr = createConstantSymbolExpr(
"UC_VERSION_W64_BIT", 0x2000);
73 UCVersionW32Expr = createConstantSymbolExpr(
"UC_VERSION_W32_BIT", 0x4000);
74 UCVersionMDPExpr = createConstantSymbolExpr(
"UC_VERSION_MDP_BIT", 0x8000);
82 unsigned EFlags)
const {
83 OS <<
"\t.amdgcn_target \""
90#define X(NUM, ENUM, NAME) \
105 bool SramEccHardwiredOn = TargetID.isSramEccSupported() &&
106 !
STI.hasFeature(AMDGPU::FeatureSRAMECCOnOffModes);
108 switch (SrameccSetting) {
112 TargetID.setSramEccSetting(AMDGPU::TargetIDSetting::Any);
115 TargetID.setSramEccSetting(AMDGPU::TargetIDSetting::Off);
116 if (!SramEccHardwiredOn)
120 TargetID.setSramEccSetting(AMDGPU::TargetIDSetting::On);
121 if (!SramEccHardwiredOn)
128 bool XnackHardwiredOn = TargetID.isXnackSupported() &&
129 !
STI.hasFeature(AMDGPU::FeatureXNACKOnOffModes);
135 TargetID.setXnackSetting(AMDGPU::TargetIDSetting::Any);
138 TargetID.setXnackSetting(AMDGPU::TargetIDSetting::Off);
139 if (!XnackHardwiredOn)
143 TargetID.setXnackSetting(AMDGPU::TargetIDSetting::On);
144 if (!XnackHardwiredOn)
162 AMDGPU::OpName Name) {
163 int OpIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(), Name);
165 auto *
I =
MI.begin();
166 std::advance(
I, OpIdx);
180 if (DAsm->tryAddingSymbolicOperand(Inst,
Offset, Addr,
true, 2, 2, 0))
189 if (DAsm->isGFX12Plus()) {
191 }
else if (DAsm->isVI()) {
202 return addOperand(Inst, DAsm->decodeBoolReg(Inst, Val));
209 return addOperand(Inst, DAsm->decodeSplitBarrier(Inst, Val));
215 return addOperand(Inst, DAsm->decodeDpp8FI(Val));
218#define DECODE_OPERAND(StaticDecoderName, DecoderName) \
219 static DecodeStatus StaticDecoderName(MCInst &Inst, unsigned Imm, \
221 const MCDisassembler *Decoder) { \
222 auto DAsm = static_cast<const AMDGPUDisassembler *>(Decoder); \
223 return addOperand(Inst, DAsm->DecoderName(Imm)); \
228#define DECODE_OPERAND_REG_8(RegClass) \
229 static DecodeStatus Decode##RegClass##RegisterClass( \
230 MCInst &Inst, unsigned Imm, uint64_t , \
231 const MCDisassembler *Decoder) { \
232 assert(Imm < (1 << 8) && "8-bit encoding"); \
233 auto DAsm = static_cast<const AMDGPUDisassembler *>(Decoder); \
235 Inst, DAsm->createRegOperand(AMDGPU::RegClass##RegClassID, Imm)); \
238#define DECODE_SrcOp(Name, EncSize, OpWidth, EncImm) \
239 static DecodeStatus Name(MCInst &Inst, unsigned Imm, uint64_t , \
240 const MCDisassembler *Decoder) { \
241 if (!isUInt<EncSize>(Imm)) \
242 return MCDisassembler::Fail; \
243 auto DAsm = static_cast<const AMDGPUDisassembler *>(Decoder); \
244 return addOperand(Inst, DAsm->decodeSrcOp(Inst, OpWidth, EncImm)); \
248 unsigned OpWidth,
unsigned Imm,
unsigned EncImm,
250 assert(
Imm < (1U << EncSize) &&
"Operand doesn't fit encoding!");
252 return addOperand(Inst, DAsm->decodeSrcOp(Inst, OpWidth, EncImm));
262 if (
Imm >= 128 &&
Imm < 256)
270 unsigned OpWidth = 32;
280 unsigned OpWidth = 32;
289#define DECODE_OPERAND_SREG_7(RegClass, OpWidth) \
290 DECODE_SrcOp(Decode##RegClass##RegisterClass, 7, OpWidth, Imm)
292#define DECODE_OPERAND_SREG_8(RegClass, OpWidth) \
293 DECODE_SrcOp(Decode##RegClass##RegisterClass, 8, OpWidth, Imm)
295#define DECODE_OPERAND_SREG_9(RegClass, OpWidth) \
296 DECODE_SrcOp(Decode##RegClass##RegisterClass, 9, OpWidth, Imm)
302template <
unsigned OpW
idth>
310template <
unsigned OpW
idth>
320template <
unsigned OpW
idth>
332template <
unsigned OpW
idth>
348template <
unsigned OpW
idth>
357template <
unsigned OpW
idth>
412 assert((
Imm & (1 << 8)) == 0 &&
"Imm{8} should not be used");
414 bool IsHi =
Imm & (1 << 9);
415 unsigned RegIdx =
Imm & 0xff;
417 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
425 bool IsHi =
Imm & (1 << 7);
426 unsigned RegIdx =
Imm & 0x7f;
428 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
431template <
unsigned OpW
idth>
439 bool IsHi =
Imm & (1 << 7);
440 unsigned RegIdx =
Imm & 0x7f;
441 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
443 return addOperand(Inst, DAsm->decodeNonVGPRSrcOp(Inst, OpWidth,
Imm & 0xFF));
446template <
unsigned OpW
idth>
454 bool IsHi =
Imm & (1 << 9);
455 unsigned RegIdx =
Imm & 0xff;
456 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
458 return addOperand(Inst, DAsm->decodeNonVGPRSrcOp(Inst, OpWidth,
Imm & 0xFF));
470 bool IsHi =
Imm & (1 << 9);
471 unsigned RegIdx =
Imm & 0xff;
472 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
479 return addOperand(Inst, DAsm->decodeMandatoryLiteralConstant(
Imm));
486 return addOperand(Inst, DAsm->decodeMandatoryLiteral64Constant(
Imm));
492 return addOperand(Inst, DAsm->decodeVOPDDstYOp(Inst, Val));
498 return addOperand(Inst, DAsm->decodeSrcOp(Inst, Opw,
Imm | 256));
501template <
unsigned Opw>
511 assert(
Imm < (1 << 9) &&
"9-bit encoding");
516#define DECODE_SDWA(DecName) \
517DECODE_OPERAND(decodeSDWA##DecName, decodeSDWA##DecName)
523#define DECODE_SDWA_IMM_FIELD(Name, MaxImm) \
524 static DecodeStatus Name(MCInst &Inst, unsigned Imm, uint64_t , \
525 const MCDisassembler * ) { \
526 if (Imm > (MaxImm)) \
527 return MCDisassembler::Fail; \
528 return addOperand(Inst, MCOperand::createImm(Imm)); \
536 AMDGPU::SDWA::DstUnused::UNUSED_PRESERVE)
537#undef DECODE_SDWA_IMM_FIELD
546#include "AMDGPUGenDisassemblerTables.inc"
550template <>
constexpr uint32_t InsnBitWidth<uint32_t> = 32;
551template <>
constexpr uint32_t InsnBitWidth<uint64_t> = 64;
552template <>
constexpr uint32_t InsnBitWidth<std::bitset<96>> = 96;
553template <>
constexpr uint32_t InsnBitWidth<std::bitset<128>> = 128;
560template <
typename InsnType>
562 InsnType Inst, uint64_t
Address,
568 const auto SavedBytes = Bytes;
583 Comments << LocalComments;
590template <
typename InsnType>
595 for (
const uint8_t *
T : {Table1, Table2}) {
606 Bytes = Bytes.
slice(
sizeof(
T));
614 Bytes = Bytes.
slice(8);
616 Bytes = Bytes.
slice(4);
617 return (
Hi << 64) |
Lo;
624 Bytes = Bytes.
slice(8);
626 Bytes = Bytes.
slice(8);
627 return (
Hi << 64) |
Lo;
630bool AMDGPUDisassembler::decodeImmOperands(
MCInst &
MI,
632 const MCInstrDesc &
Desc = MCII.get(
MI.getOpcode());
634 if (OpNo >=
MI.getNumOperands())
644 MCOperand &
Op =
MI.getOperand(OpNo);
647 int64_t
Imm =
Op.getImm();
663 switch (OpDesc.OperandType) {
689 Imm = (F16Val << 16) | (F16Val & 0xFFFF);
717 unsigned MaxInstBytesNum = std::min((
size_t)TargetMaxInstBytes, Bytes_.
size());
718 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
722 Size = std::min((
size_t)4, Bytes_.
size());
734 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
769 if (
STI.hasFeature(AMDGPU::Feature64BitLiterals)) {
771 Bytes = Bytes_.
slice(4, MaxInstBytesNum - 4);
779 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
781 }
else if (Bytes.size() >= 16 &&
782 STI.hasFeature(AMDGPU::FeatureGFX950Insts)) {
788 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
791 if (Bytes.size() >= 8) {
794 if (
STI.hasFeature(AMDGPU::FeatureGFX10_BEncoding) &&
798 if (
STI.hasFeature(AMDGPU::FeatureUnpackedD16VMem) &&
802 if (
STI.hasFeature(AMDGPU::FeatureGFX950Insts) &&
809 if (
STI.hasFeature(AMDGPU::FeatureFmaMixInsts) &&
813 if (
STI.hasFeature(AMDGPU::FeatureGFX940Insts) &&
817 if (
STI.hasFeature(AMDGPU::FeatureGFX90AInsts) &&
869 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
873 if (Bytes.size() >= 4) {
886 if (
STI.hasFeature(AMDGPU::FeatureGFX950Insts) &&
890 if (
STI.hasFeature(AMDGPU::FeatureGFX90AInsts) &&
894 if (
STI.hasFeature(AMDGPU::FeatureGFX10_BEncoding) &&
942 else if (AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::dpp8) !=
954 AMDGPU::OpName::src2_modifiers);
957 if (
MI.getOpcode() == AMDGPU::V_CVT_SR_BF8_F32_e64_dpp ||
958 MI.getOpcode() == AMDGPU::V_CVT_SR_FP8_F32_e64_dpp) {
961 AMDGPU::OpName::src2_modifiers);
970 int CPolPos = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
971 AMDGPU::OpName::cpol);
975 if (
MI.getNumOperands() <= (
unsigned)CPolPos) {
977 AMDGPU::OpName::cpol);
979 MI.getOperand(CPolPos).setImm(
MI.getOperand(CPolPos).getImm() | CPol);
985 (
STI.hasFeature(AMDGPU::FeatureGFX90AInsts))) {
988 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::tfe);
989 if (TFEOpIdx != -1) {
990 auto *TFEIter =
MI.begin();
991 std::advance(TFEIter, TFEOpIdx);
999 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::offset);
1000 if (OffsetIdx != -1) {
1003 if (SignedOffset < 0)
1010 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::swz);
1011 if (SWZOpIdx != -1) {
1012 auto *SWZIter =
MI.begin();
1013 std::advance(SWZIter, SWZOpIdx);
1021 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vaddr0);
1023 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::srsrc);
1024 unsigned NSAArgs = RsrcIdx - VAddr0Idx - 1;
1025 if (VAddr0Idx >= 0 && NSAArgs > 0) {
1026 unsigned NSAWords = (NSAArgs + 3) / 4;
1027 if (Bytes.size() < 4 * NSAWords)
1029 for (
unsigned i = 0; i < NSAArgs; ++i) {
1030 const unsigned VAddrIdx = VAddr0Idx + 1 + i;
1032 MCII->getOpRegClassID(
Desc.operands()[VAddrIdx], HwModeRegClass);
1035 Bytes = Bytes.slice(4 * NSAWords);
1059 int VDstIn_Idx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1060 AMDGPU::OpName::vdst_in);
1061 if (VDstIn_Idx != -1) {
1062 int Tied = MCII->get(
MI.getOpcode()).getOperandConstraint(VDstIn_Idx,
1064 if (Tied != -1 && (
MI.getNumOperands() <= (
unsigned)VDstIn_Idx ||
1065 !
MI.getOperand(VDstIn_Idx).isReg() ||
1066 MI.getOperand(VDstIn_Idx).getReg() !=
MI.getOperand(Tied).getReg())) {
1067 if (
MI.getNumOperands() > (
unsigned)VDstIn_Idx)
1068 MI.erase(&
MI.getOperand(VDstIn_Idx));
1071 AMDGPU::OpName::vdst_in);
1083 MCII->get(
MI.getOpcode()).getNumDefs() == 0 &&
1084 MCII->get(
MI.getOpcode()).hasImplicitDefOfPhysReg(AMDGPU::EXEC)) {
1085 auto ExecEncoding = MRI.getEncodingValue(AMDGPU::EXEC_LO);
1086 if (Bytes_[0] != ExecEncoding)
1090 Size = MaxInstBytesNum - Bytes.size();
1095 if (
STI.hasFeature(AMDGPU::FeatureGFX11Insts)) {
1105 if (
MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_t16_gfx11 ||
1106 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_fake16_gfx11 ||
1107 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_t16_gfx12 ||
1108 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_fake16_gfx12 ||
1109 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_t16_gfx13 ||
1110 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_fake16_gfx13 ||
1111 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_t16_gfx11 ||
1112 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_fake16_gfx11 ||
1113 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_t16_gfx12 ||
1114 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_fake16_gfx12 ||
1115 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_t16_gfx13 ||
1116 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_fake16_gfx13 ||
1117 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_t16_gfx11 ||
1118 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_fake16_gfx11 ||
1119 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_t16_gfx12 ||
1120 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_fake16_gfx12 ||
1121 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_t16_gfx13 ||
1122 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_fake16_gfx13 ||
1123 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_t16_gfx11 ||
1124 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_fake16_gfx11 ||
1125 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_t16_gfx12 ||
1126 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_fake16_gfx12 ||
1127 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_t16_gfx13 ||
1128 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_fake16_gfx13) {
1136 if (
STI.hasFeature(AMDGPU::FeatureGFX9) ||
1137 STI.hasFeature(AMDGPU::FeatureGFX10)) {
1141 }
else if (
STI.hasFeature(AMDGPU::FeatureVolcanicIslands)) {
1142 int SDst = AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::sdst);
1146 AMDGPU::OpName::sdst);
1171 NewReg = MRI.
getSubReg(MO.
getReg(), AMDGPU::sub0_sub1_sub2_sub3_sub4_sub5);
1175 AMDGPU::sub0_sub1_sub2_sub3_sub4_sub5_sub6_sub7);
1185 BaseReg, AMDGPU::sub0, &MRI.
getRegClass(AMDGPU::VReg_384RegClassID));
1209 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::blgp);
1214 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::cbsz);
1216 unsigned CBSZ =
MI.getOperand(CbszIdx).getImm();
1217 unsigned BLGP =
MI.getOperand(BlgpIdx).getImm();
1221 if (!AdjustedRegClassOpcode ||
1222 AdjustedRegClassOpcode->
Opcode ==
MI.getOpcode())
1225 MI.setOpcode(AdjustedRegClassOpcode->
Opcode);
1227 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src0);
1229 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src1);
1238 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::matrix_a_fmt);
1243 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::matrix_b_fmt);
1245 unsigned FmtA =
MI.getOperand(FmtAIdx).getImm();
1246 unsigned FmtB =
MI.getOperand(FmtBIdx).getImm();
1250 if (!AdjustedRegClassOpcode ||
1251 AdjustedRegClassOpcode->
Opcode ==
MI.getOpcode())
1254 MI.setOpcode(AdjustedRegClassOpcode->
Opcode);
1256 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src0);
1258 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src1);
1276 bool IsVOP3P =
false) {
1278 unsigned Opc =
MI.getOpcode();
1279 const AMDGPU::OpName ModOps[] = {AMDGPU::OpName::src0_modifiers,
1280 AMDGPU::OpName::src1_modifiers,
1281 AMDGPU::OpName::src2_modifiers};
1282 for (
int J = 0; J < 3; ++J) {
1283 int OpIdx = AMDGPU::getNamedOperandIdx(
Opc, ModOps[J]);
1287 unsigned Val =
MI.getOperand(OpIdx).getImm();
1294 }
else if (J == 0) {
1305 const unsigned Opc =
MI.getOpcode();
1307 MRI.getRegClass(AMDGPU::VGPR_16RegClassID);
1308 constexpr std::array<std::tuple<AMDGPU::OpName, AMDGPU::OpName, unsigned>, 4>
1309 OpAndOpMods = {{{AMDGPU::OpName::src0, AMDGPU::OpName::src0_modifiers,
1311 {AMDGPU::OpName::src1, AMDGPU::OpName::src1_modifiers,
1313 {AMDGPU::OpName::src2, AMDGPU::OpName::src2_modifiers,
1315 {AMDGPU::OpName::vdst, AMDGPU::OpName::src0_modifiers,
1317 for (
const auto &[
OpName, OpModsName, OpSelMask] : OpAndOpMods) {
1318 int OpIdx = AMDGPU::getNamedOperandIdx(
Opc,
OpName);
1319 int OpModsIdx = AMDGPU::getNamedOperandIdx(
Opc, OpModsName);
1320 if (OpIdx == -1 || OpModsIdx == -1)
1327 unsigned OpEnc = MRI.getEncodingValue(
Op.getReg());
1328 const MCOperand &OpMods =
MI.getOperand(OpModsIdx);
1329 unsigned ModVal = OpMods.
getImm();
1330 if (ModVal & OpSelMask) {
1340 constexpr int DST_IDX = 0;
1341 auto Opcode =
MI.getOpcode();
1342 const auto &
Desc = MCII->get(Opcode);
1343 auto OldIdx = AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::old);
1345 if (OldIdx != -1 &&
Desc.getOperandConstraint(
1349 AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::src2),
1360 assert(
MI.getNumOperands() + 1 < MCII->get(
MI.getOpcode()).getNumOperands());
1363 AMDGPU::OpName::src2_modifiers);
1367 unsigned Opc =
MI.getOpcode();
1370 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vdst_in);
1371 if (VDstInIdx != -1)
1374 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1375 if (
MI.getNumOperands() < DescNumOps &&
1380 AMDGPU::OpName::op_sel);
1383 if (
MI.getNumOperands() < DescNumOps &&
1386 AMDGPU::OpName::src0_modifiers);
1388 if (
MI.getNumOperands() < DescNumOps &&
1391 AMDGPU::OpName::src1_modifiers);
1399 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vdst_in);
1400 if (VDstInIdx != -1)
1403 unsigned Opc =
MI.getOpcode();
1404 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1405 if (
MI.getNumOperands() < DescNumOps &&
1409 AMDGPU::OpName::op_sel);
1424 BaseReg = AMDGPU::VGPR0;
1426 BaseReg = AMDGPU::AGPR0;
1428 assert(BaseReg &&
"Only vector registers expected");
1430 return (Sub0 - BaseReg + NumRegs <= 256) ?
Reg :
MCRegister();
1437 int VDstIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1438 AMDGPU::OpName::vdst);
1440 int VDataIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1441 AMDGPU::OpName::vdata);
1443 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vaddr0);
1445 ? AMDGPU::OpName::srsrc
1446 : AMDGPU::OpName::rsrc;
1447 int RsrcIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(), RsrcOpName);
1448 int DMaskIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1449 AMDGPU::OpName::dmask);
1451 int TFEIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1452 AMDGPU::OpName::tfe);
1453 int D16Idx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1454 AMDGPU::OpName::d16);
1461 if (BaseOpcode->
BVH) {
1467 bool IsAtomic = (VDstIdx != -1);
1471 bool IsPartialNSA =
false;
1472 unsigned AddrSize = Info->VAddrDwords;
1476 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::dim);
1478 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::a16);
1481 const bool IsA16 = (A16Idx != -1 &&
MI.getOperand(A16Idx).
getImm());
1488 IsNSA = Info->MIMGEncoding == AMDGPU::MIMGEncGfx10NSA ||
1489 Info->MIMGEncoding == AMDGPU::MIMGEncGfx11NSA ||
1490 Info->MIMGEncoding == AMDGPU::MIMGEncGfx12 ||
1491 Info->MIMGEncoding == AMDGPU::MIMGEncGfx13;
1493 if (!IsVSample && AddrSize > 12)
1496 if (AddrSize > Info->VAddrDwords) {
1497 if (!
STI.hasFeature(AMDGPU::FeaturePartialNSAEncoding)) {
1502 IsPartialNSA =
true;
1507 unsigned DMask =
MI.getOperand(DMaskIdx).getImm() & 0xf;
1508 unsigned DstSize = IsGather4 ? 4 : std::max(
llvm::popcount(DMask), 1);
1510 bool D16 = D16Idx >= 0 &&
MI.getOperand(D16Idx).getImm();
1512 DstSize = (DstSize + 1) / 2;
1515 if (TFEIdx != -1 &&
MI.getOperand(TFEIdx).getImm())
1518 if (DstSize == Info->VDataDwords && AddrSize == Info->VAddrDwords)
1523 AddrSize, Info->IndexedRsrc, Info->IndexedSamp);
1524 if (NewOpcode == -1)
1529 if (DstSize != Info->VDataDwords) {
1530 auto DataRCID = MCII->getOpRegClassID(
1531 MCII->get(NewOpcode).operands()[VDataIdx], HwModeRegClass);
1535 MCRegister VdataSub0 = MRI.getSubReg(Vdata0, AMDGPU::sub0);
1536 Vdata0 = (VdataSub0 != 0)? VdataSub0 : Vdata0;
1539 NewVdata = MRI.getMatchingSuperReg(Vdata0, AMDGPU::sub0, &NewRC);
1550 int VAddrSAIdx = IsPartialNSA ? (RsrcIdx - 1) : VAddr0Idx;
1552 if (
STI.hasFeature(AMDGPU::FeatureNSAEncoding) && (!IsNSA || IsPartialNSA) &&
1553 AddrSize != Info->VAddrDwords) {
1554 MCRegister VAddrSA =
MI.getOperand(VAddrSAIdx).getReg();
1555 MCRegister VAddrSubSA = MRI.getSubReg(VAddrSA, AMDGPU::sub0);
1556 VAddrSA = VAddrSubSA ? VAddrSubSA : VAddrSA;
1558 auto AddrRCID = MCII->getOpRegClassID(
1559 MCII->get(NewOpcode).operands()[VAddrSAIdx], HwModeRegClass);
1562 NewVAddrSA = MRI.getMatchingSuperReg(VAddrSA, AMDGPU::sub0, &NewRC);
1568 MI.setOpcode(NewOpcode);
1570 if (NewVdata != AMDGPU::NoRegister) {
1582 assert(AddrSize <= Info->VAddrDwords);
1583 MI.erase(
MI.begin() + VAddr0Idx + AddrSize,
1584 MI.begin() + VAddr0Idx + Info->VAddrDwords);
1592 unsigned Opc =
MI.getOpcode();
1593 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1596 if (
MI.getNumOperands() < DescNumOps &&
1600 if (
MI.getNumOperands() < DescNumOps &&
1603 AMDGPU::OpName::op_sel);
1604 if (
MI.getNumOperands() < DescNumOps &&
1607 AMDGPU::OpName::op_sel_hi);
1608 if (
MI.getNumOperands() < DescNumOps &&
1611 AMDGPU::OpName::neg_lo);
1612 if (
MI.getNumOperands() < DescNumOps &&
1615 AMDGPU::OpName::neg_hi);
1620 unsigned Opc =
MI.getOpcode();
1621 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1623 if (
MI.getNumOperands() < DescNumOps &&
1627 if (
MI.getNumOperands() < DescNumOps &&
1630 AMDGPU::OpName::src0_modifiers);
1632 if (
MI.getNumOperands() < DescNumOps &&
1635 AMDGPU::OpName::src1_modifiers);
1639 unsigned Opc =
MI.getOpcode();
1640 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1644 if (
MI.getNumOperands() < DescNumOps &&
1648 AMDGPU::OpName::op_sel);
1653 assert(HasLiteral &&
"Should have decoded a literal");
1659 &getAMDGPUMCRegisterClass(RegClassID));
1664 const Twine& ErrMsg)
const {
1678 unsigned Val)
const {
1679 const auto &RegCl = getAMDGPUMCRegisterClass(RegClassID);
1680 if (Val >= RegCl.getNumRegs())
1682 ": unknown register " +
Twine(Val));
1688 unsigned Val)
const {
1692 switch (SRegClassID) {
1693 case AMDGPU::SGPR_32RegClassID:
1694 case AMDGPU::TTMP_32RegClassID:
1696 case AMDGPU::SGPR_64RegClassID:
1697 case AMDGPU::TTMP_64RegClassID:
1700 case AMDGPU::SGPR_96RegClassID:
1701 case AMDGPU::TTMP_96RegClassID:
1702 case AMDGPU::SGPR_128RegClassID:
1703 case AMDGPU::TTMP_128RegClassID:
1706 case AMDGPU::SGPR_256RegClassID:
1707 case AMDGPU::TTMP_256RegClassID:
1710 case AMDGPU::SGPR_288RegClassID:
1711 case AMDGPU::TTMP_288RegClassID:
1712 case AMDGPU::SGPR_320RegClassID:
1713 case AMDGPU::TTMP_320RegClassID:
1714 case AMDGPU::SGPR_352RegClassID:
1715 case AMDGPU::TTMP_352RegClassID:
1716 case AMDGPU::SGPR_384RegClassID:
1717 case AMDGPU::TTMP_384RegClassID:
1718 case AMDGPU::SGPR_512RegClassID:
1719 case AMDGPU::TTMP_512RegClassID:
1728 if (Val % (1 << shift)) {
1730 <<
": scalar reg isn't aligned " << Val;
1738 unsigned RegIdxInVGPR16 = RegIdx * 2 + (IsHi ? 1 : 0);
1748 "Should only decode multiple kimm with VOPD, check VSrc operand types");
1750 return errOperand(Val,
"More than one unique literal is illegal");
1761 return errOperand(Val,
"More than one unique literal is illegal");
1766 bool UseLit64 =
Hi_32(Literal) == 0;
1779 if (Bytes.size() < 4) {
1780 return errOperand(0,
"cannot read literal, inst bytes left " +
1781 Twine(Bytes.size()));
1788 bool HasInv2Pi =
true;
1792 int64_t Val = Literal;
1793 bool UseLit =
false;
1865 assert(
STI.hasFeature(AMDGPU::Feature64BitLiterals));
1868 if (Bytes.size() < 8) {
1869 return errOperand(0,
"cannot read literal64, inst bytes left " +
1870 Twine(Bytes.size()));
1876 bool UseLit64 =
Hi_32(Literal) == 0;
1879 Literal,
STI.hasFeature(AMDGPU::FeatureInv2PiInlineImm));
1889 assert(
Imm >= INLINE_INTEGER_C_MIN &&
Imm <= INLINE_INTEGER_C_MAX);
1891 (
static_cast<int64_t
>(
Imm) - INLINE_INTEGER_C_MIN) :
1892 (INLINE_INTEGER_C_POSITIVE_MAX -
static_cast<int64_t
>(
Imm)));
1940 return 0x3fc45f306dc9c882;
2002 return VGPR_32RegClassID;
2004 return VReg_64RegClassID;
2006 return VReg_96RegClassID;
2008 return VReg_128RegClassID;
2010 return VReg_160RegClassID;
2012 return VReg_192RegClassID;
2014 return VReg_256RegClassID;
2016 return VReg_288RegClassID;
2018 return VReg_320RegClassID;
2020 return VReg_352RegClassID;
2022 return VReg_384RegClassID;
2024 return VReg_512RegClassID;
2026 return VReg_1024RegClassID;
2037 return AGPR_32RegClassID;
2039 return AReg_64RegClassID;
2041 return AReg_96RegClassID;
2043 return AReg_128RegClassID;
2045 return AReg_160RegClassID;
2047 return AReg_256RegClassID;
2049 return AReg_288RegClassID;
2051 return AReg_320RegClassID;
2053 return AReg_352RegClassID;
2055 return AReg_384RegClassID;
2057 return AReg_512RegClassID;
2059 return AReg_1024RegClassID;
2064std::optional<unsigned>
2071 return SGPR_32RegClassID;
2073 return SGPR_64RegClassID;
2075 return SGPR_96RegClassID;
2077 return SGPR_128RegClassID;
2079 return SGPR_160RegClassID;
2081 return SGPR_256RegClassID;
2083 return SGPR_288RegClassID;
2085 return SGPR_320RegClassID;
2087 return SGPR_352RegClassID;
2089 return SGPR_384RegClassID;
2091 return SGPR_512RegClassID;
2093 return std::nullopt;
2096std::optional<unsigned>
2103 return TTMP_32RegClassID;
2105 return TTMP_64RegClassID;
2107 return TTMP_128RegClassID;
2109 return TTMP_256RegClassID;
2111 return TTMP_288RegClassID;
2113 return TTMP_320RegClassID;
2115 return TTMP_352RegClassID;
2117 return TTMP_384RegClassID;
2119 return TTMP_512RegClassID;
2121 return std::nullopt;
2127 unsigned TTmpMin =
isGFX9Plus() ? TTMP_GFX9PLUS_MIN : TTMP_VI_MIN;
2128 unsigned TTmpMax =
isGFX9Plus() ? TTMP_GFX9PLUS_MAX : TTMP_VI_MAX;
2130 return (TTmpMin <= Val && Val <= TTmpMax)? Val - TTmpMin : -1;
2134 unsigned Val)
const {
2139 bool IsAGPR = Val & 512;
2142 if (VGPR_MIN <= Val && Val <= VGPR_MAX) {
2151 unsigned Val)
const {
2154 assert(Val < (1 << 8) &&
"9-bit Src encoding when Val{8} is 0");
2159 auto UnsupportedWidth = [&]() {
2161 "-bit non-VGPR operand encoding " +
Twine(Val));
2166 static_assert(SGPR_MIN == 0);
2169 return UnsupportedWidth();
2177 return UnsupportedWidth();
2181 if ((INLINE_INTEGER_C_MIN <= Val && Val <= INLINE_INTEGER_C_MAX) ||
2182 (INLINE_FLOATING_C_MIN <= Val && Val <= INLINE_FLOATING_C_MAX) ||
2183 Val == LITERAL_CONST)
2186 if (Val == LITERAL64_CONST &&
STI.hasFeature(AMDGPU::Feature64BitLiterals)) {
2192 "64-bit literal is not supported by this instruction");
2209 return UnsupportedWidth();
2216 unsigned Val)
const {
2218 AMDGPU::getNamedOperandIdx(Inst.
getOpcode(), AMDGPU::OpName::vdstX);
2221 unsigned XDstReg = MRI.getEncodingValue(Inst.
getOperand(VDstXInd).
getReg());
2222 Val |= ~XDstReg & 1;
2345 const unsigned Val)
const {
2349 if (
STI.hasFeature(AMDGPU::FeatureGFX9) ||
2350 STI.hasFeature(AMDGPU::FeatureGFX10)) {
2353 if (
int(SDWA9EncValues::SRC_VGPR_MIN) <=
int(Val) &&
2354 Val <= SDWA9EncValues::SRC_VGPR_MAX) {
2356 Val - SDWA9EncValues::SRC_VGPR_MIN);
2358 if (SDWA9EncValues::SRC_SGPR_MIN <= Val &&
2359 Val <= (
isGFX10Plus() ? SDWA9EncValues::SRC_SGPR_MAX_GFX10
2360 : SDWA9EncValues::SRC_SGPR_MAX_SI)) {
2362 Val - SDWA9EncValues::SRC_SGPR_MIN);
2364 if (SDWA9EncValues::SRC_TTMP_MIN <= Val &&
2365 Val <= SDWA9EncValues::SRC_TTMP_MAX) {
2367 Val - SDWA9EncValues::SRC_TTMP_MIN);
2370 const unsigned SVal = Val - SDWA9EncValues::SRC_SGPR_MIN;
2372 if ((INLINE_INTEGER_C_MIN <= SVal && SVal <= INLINE_INTEGER_C_MAX) ||
2373 (INLINE_FLOATING_C_MIN <= SVal && SVal <= INLINE_FLOATING_C_MAX))
2378 if (
STI.hasFeature(AMDGPU::FeatureVolcanicIslands))
2394 assert((
STI.hasFeature(AMDGPU::FeatureGFX9) ||
2395 STI.hasFeature(AMDGPU::FeatureGFX10)) &&
2396 "SDWAVopcDst should be present only on GFX9+");
2398 bool IsWave32 =
STI.hasFeature(AMDGPU::FeatureWavefrontSize32);
2400 if (Val & SDWA9EncValues::VOPC_DST_VCC_MASK) {
2401 Val &= SDWA9EncValues::VOPC_DST_SGPR_MASK;
2415 unsigned Val)
const {
2416 return STI.hasFeature(AMDGPU::FeatureWavefrontSize32)
2422 unsigned Val)
const {
2424 constexpr unsigned M0Encoding = 125;
2425 bool IsValidBarrier =
2426 Val == M0Encoding ||
2427 (INLINE_INTEGER_C_MIN <= Val && Val < INLINE_INTEGER_C_MIN + 32) ||
2428 (INLINE_INTEGER_C_POSITIVE_MAX < Val &&
2429 Val <= INLINE_INTEGER_C_POSITIVE_MAX + 4);
2430 if (!IsValidBarrier)
2448 auto [
Version, W64, W32, MDP] = Encoding::decode(
Imm);
2451 if (Encoding::encode(
Version, W64, W32, MDP) !=
Imm)
2461 if (
I == Versions.end())
2477 return STI.hasFeature(AMDGPU::FeatureVolcanicIslands);
2483 return STI.hasFeature(AMDGPU::FeatureGFX90AInsts);
2495 return STI.hasFeature(AMDGPU::FeatureGFX11);
2503 return STI.hasFeature(AMDGPU::FeatureGFX11_7Insts);
2507 return STI.hasFeature(AMDGPU::FeatureGFX12);
2527 return STI.hasFeature(AMDGPU::FeatureArchitectedFlatScratch);
2548 if (PopCount == 1) {
2549 S <<
"bit (" << (TrailingZeros + BaseBytes * CHAR_BIT) <<
')';
2551 S <<
"bits in range ("
2552 << (TrailingZeros + PopCount - 1 + BaseBytes * CHAR_BIT) <<
':'
2553 << (TrailingZeros + BaseBytes * CHAR_BIT) <<
')';
2559#define GET_FIELD(MASK) (AMDHSA_BITS_GET(FourByteBuffer, MASK))
2560#define PRINT_DIRECTIVE(DIRECTIVE, MASK) \
2562 KdStream << Indent << DIRECTIVE " " << GET_FIELD(MASK) << '\n'; \
2564#define PRINT_PSEUDO_DIRECTIVE_COMMENT(DIRECTIVE, MASK) \
2566 KdStream << Indent << MAI.getCommentString() << ' ' << DIRECTIVE " " \
2567 << GET_FIELD(MASK) << '\n'; \
2570#define CHECK_RESERVED_BITS_IMPL(MASK, DESC, MSG) \
2572 if (FourByteBuffer & (MASK)) { \
2573 return createStringError(std::errc::invalid_argument, \
2574 "kernel descriptor " DESC \
2575 " reserved %s set" MSG, \
2576 getBitRangeFromMask((MASK), 0).c_str()); \
2580#define CHECK_RESERVED_BITS(MASK) CHECK_RESERVED_BITS_IMPL(MASK, #MASK, "")
2581#define CHECK_RESERVED_BITS_MSG(MASK, MSG) \
2582 CHECK_RESERVED_BITS_IMPL(MASK, #MASK, ", " MSG)
2583#define CHECK_RESERVED_BITS_DESC(MASK, DESC) \
2584 CHECK_RESERVED_BITS_IMPL(MASK, DESC, "")
2585#define CHECK_RESERVED_BITS_DESC_MSG(MASK, DESC, MSG) \
2586 CHECK_RESERVED_BITS_IMPL(MASK, DESC, ", " MSG)
2599 uint32_t GranulatedWorkitemVGPRCount =
2600 GET_FIELD(COMPUTE_PGM_RSRC1_GRANULATED_WORKITEM_VGPR_COUNT);
2603 (GranulatedWorkitemVGPRCount + 1) *
2606 KdStream << Indent <<
".amdhsa_next_free_vgpr " << NextFreeVGPR <<
'\n';
2627 uint32_t GranulatedWavefrontSGPRCount =
2628 GET_FIELD(COMPUTE_PGM_RSRC1_GRANULATED_WAVEFRONT_SGPR_COUNT);
2632 "must be zero on gfx10+");
2634 uint32_t NextFreeSGPR = (GranulatedWavefrontSGPRCount + 1) *
2637 KdStream << Indent <<
".amdhsa_reserve_vcc " << 0 <<
'\n';
2639 KdStream << Indent <<
".amdhsa_reserve_flat_scratch " << 0 <<
'\n';
2643 bool ReservedXnackMask = TargetID.isXnackOnOrAny();
2644 if (
STI.hasFeature(AMDGPU::FeatureSupportsXNACK) || ReservedXnackMask) {
2645 KdStream << Indent <<
".amdhsa_reserve_xnack_mask " << ReservedXnackMask
2648 KdStream << Indent <<
".amdhsa_next_free_sgpr " << NextFreeSGPR <<
"\n";
2653 COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_32);
2655 COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_16_64);
2657 COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_32);
2659 COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_16_64);
2663 if (
STI.hasFeature(AMDGPU::FeatureDX10ClampAndIEEEMode))
2665 COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_DX10_CLAMP);
2669 if (
STI.hasFeature(AMDGPU::FeatureDX10ClampAndIEEEMode))
2671 COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_IEEE_MODE);
2678 PRINT_DIRECTIVE(
".amdhsa_fp16_overflow", COMPUTE_PGM_RSRC1_GFX9_PLUS_FP16_OVFL);
2681 "COMPUTE_PGM_RSRC1",
"must be zero pre-gfx9");
2687 COMPUTE_PGM_RSRC1_GFX125_FLAT_SCRATCH_IS_NV);
2690 "COMPUTE_PGM_RSRC1");
2701 COMPUTE_PGM_RSRC1_GFX10_PLUS_WGP_MODE);
2703 PRINT_DIRECTIVE(
".amdhsa_memory_ordered", COMPUTE_PGM_RSRC1_GFX10_PLUS_MEM_ORDERED);
2704 PRINT_DIRECTIVE(
".amdhsa_forward_progress", COMPUTE_PGM_RSRC1_GFX10_PLUS_FWD_PROGRESS);
2707 "COMPUTE_PGM_RSRC1");
2712 COMPUTE_PGM_RSRC1_GFX12_PLUS_ENABLE_WG_RR_EN);
2724 COMPUTE_PGM_RSRC2_ENABLE_PRIVATE_SEGMENT);
2726 PRINT_DIRECTIVE(
".amdhsa_system_sgpr_private_segment_wavefront_offset",
2727 COMPUTE_PGM_RSRC2_ENABLE_PRIVATE_SEGMENT);
2729 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_X);
2731 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Y);
2733 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Z);
2735 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_INFO);
2737 COMPUTE_PGM_RSRC2_ENABLE_VGPR_WORKITEM_ID);
2744 ".amdhsa_exception_fp_ieee_invalid_op",
2745 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INVALID_OPERATION);
2747 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_FP_DENORMAL_SOURCE);
2749 ".amdhsa_exception_fp_ieee_div_zero",
2750 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_DIVISION_BY_ZERO);
2752 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_OVERFLOW);
2754 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_UNDERFLOW);
2756 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INEXACT);
2758 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_INT_DIVIDE_BY_ZERO);
2771 KdStream << Indent <<
".amdhsa_accum_offset "
2772 << (
GET_FIELD(COMPUTE_PGM_RSRC3_GFX90A_ACCUM_OFFSET) + 1) * 4
2775 PRINT_DIRECTIVE(
".amdhsa_tg_split", COMPUTE_PGM_RSRC3_GFX90A_TG_SPLIT);
2778 "COMPUTE_PGM_RSRC3",
"must be zero on gfx90a");
2780 "COMPUTE_PGM_RSRC3",
"must be zero on gfx90a");
2784 if (!EnableWavefrontSize32 || !*EnableWavefrontSize32) {
2786 COMPUTE_PGM_RSRC3_GFX10_GFX11_SHARED_VGPR_COUNT);
2789 "SHARED_VGPR_COUNT",
2790 COMPUTE_PGM_RSRC3_GFX10_GFX11_SHARED_VGPR_COUNT);
2794 "COMPUTE_PGM_RSRC3",
2795 "must be zero on gfx12+");
2801 COMPUTE_PGM_RSRC3_GFX11_INST_PREF_SIZE);
2803 COMPUTE_PGM_RSRC3_GFX11_TRAP_ON_START);
2805 COMPUTE_PGM_RSRC3_GFX11_TRAP_ON_END);
2808 COMPUTE_PGM_RSRC3_GFX12_PLUS_INST_PREF_SIZE);
2811 "COMPUTE_PGM_RSRC3",
2812 "must be zero on gfx10");
2817 "COMPUTE_PGM_RSRC3",
"must be zero on gfx10+");
2822 COMPUTE_PGM_RSRC3_GFX12_PLUS_GLG_EN);
2825 "COMPUTE_PGM_RSRC3",
2826 "must be zero on gfx10 or gfx11");
2832 COMPUTE_PGM_RSRC3_GFX125_NAMED_BAR_CNT);
2834 "ENABLE_DYNAMIC_VGPR", COMPUTE_PGM_RSRC3_GFX125_ENABLE_DYNAMIC_VGPR);
2836 COMPUTE_PGM_RSRC3_GFX125_TCP_SPLIT);
2838 "ENABLE_DIDT_THROTTLE",
2839 COMPUTE_PGM_RSRC3_GFX125_ENABLE_DIDT_THROTTLE);
2842 "COMPUTE_PGM_RSRC3",
2843 "must be zero on gfx10+");
2848 "COMPUTE_PGM_RSRC3",
"must be zero on gfx10+");
2853 COMPUTE_PGM_RSRC3_GFX11_PLUS_IMAGE_OP);
2856 "COMPUTE_PGM_RSRC3",
2857 "must be zero on gfx10");
2859 }
else if (FourByteBuffer) {
2861 std::errc::invalid_argument,
2862 "kernel descriptor COMPUTE_PGM_RSRC3 must be all zero before gfx9");
2866#undef PRINT_PSEUDO_DIRECTIVE_COMMENT
2867#undef PRINT_DIRECTIVE
2869#undef CHECK_RESERVED_BITS_IMPL
2870#undef CHECK_RESERVED_BITS
2871#undef CHECK_RESERVED_BITS_MSG
2872#undef CHECK_RESERVED_BITS_DESC
2873#undef CHECK_RESERVED_BITS_DESC_MSG
2878 const char *
Msg =
"") {
2880 std::errc::invalid_argument,
"kernel descriptor reserved %s set%s%s",
2887 unsigned WidthInBytes) {
2891 std::errc::invalid_argument,
2892 "kernel descriptor reserved bits in range (%u:%u) set",
2893 (BaseInBytes + WidthInBytes) * CHAR_BIT - 1, BaseInBytes * CHAR_BIT);
2899#define PRINT_DIRECTIVE(DIRECTIVE, MASK) \
2901 KdStream << Indent << DIRECTIVE " " \
2902 << ((TwoByteBuffer & MASK) >> (MASK##_SHIFT)) << '\n'; \
2905 uint16_t TwoByteBuffer = 0;
2911 assert(Bytes.size() == 64);
2914 switch (Cursor.tell()) {
2916 FourByteBuffer = DE.
getU32(Cursor);
2917 KdStream << Indent <<
".amdhsa_group_segment_fixed_size " << FourByteBuffer
2922 FourByteBuffer = DE.
getU32(Cursor);
2923 KdStream << Indent <<
".amdhsa_private_segment_fixed_size "
2924 << FourByteBuffer <<
'\n';
2928 FourByteBuffer = DE.
getU32(Cursor);
2929 KdStream << Indent <<
".amdhsa_kernarg_size "
2930 << FourByteBuffer <<
'\n';
2935 ReservedBytes = DE.
getBytes(Cursor, 4);
2936 for (
char B : ReservedBytes) {
2951 ReservedBytes = DE.
getBytes(Cursor, 20);
2952 for (
char B : ReservedBytes) {
2959 FourByteBuffer = DE.
getU32(Cursor);
2963 FourByteBuffer = DE.
getU32(Cursor);
2967 FourByteBuffer = DE.
getU32(Cursor);
2972 TwoByteBuffer = DE.
getU16(Cursor);
2976 KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER);
2978 KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_PTR);
2980 KERNEL_CODE_PROPERTY_ENABLE_SGPR_QUEUE_PTR);
2982 KERNEL_CODE_PROPERTY_ENABLE_SGPR_KERNARG_SEGMENT_PTR);
2984 KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_ID);
2987 KERNEL_CODE_PROPERTY_ENABLE_SGPR_FLAT_SCRATCH_INIT);
2989 KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE);
2991 if (TwoByteBuffer & KERNEL_CODE_PROPERTY_RESERVED0)
2997 (TwoByteBuffer & KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32)) {
2999 KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32,
3004 KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32);
3009 KERNEL_CODE_PROPERTY_USES_DYNAMIC_STACK);
3011 if (TwoByteBuffer & KERNEL_CODE_PROPERTY_RESERVED1) {
3020 TwoByteBuffer = DE.
getU16(Cursor);
3021 if (TwoByteBuffer & KERNARG_PRELOAD_SPEC_LENGTH) {
3023 KERNARG_PRELOAD_SPEC_LENGTH);
3026 if (TwoByteBuffer & KERNARG_PRELOAD_SPEC_OFFSET) {
3028 KERNARG_PRELOAD_SPEC_OFFSET);
3034 ReservedBytes = DE.
getBytes(Cursor, 4);
3035 for (
char B : ReservedBytes) {
3045#undef PRINT_DIRECTIVE
3052 if (Bytes.size() != 64 || KdAddress % 64 != 0)
3054 "kernel descriptor must be 64-byte aligned");
3062 uint16_t KernelCodeProperties =
3065 EnableWavefrontSize32 =
3067 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32);
3072 KdStream <<
".amdhsa_kernel " << KdName <<
'\n';
3075 while (
C &&
C.tell() < Bytes.size()) {
3083 KdStream <<
".end_amdhsa_kernel\n";
3102 "code object v2 is not supported");
3115const MCExpr *AMDGPUDisassembler::createConstantSymbolExpr(
StringRef Id,
3118 MCSymbol *Sym = Ctx.getOrCreateSymbol(Id);
3126 if (!Valid || Res != Val)
3127 Ctx.reportWarning(
SMLoc(),
"unsupported redefinition of " + Id);
3152 uint64_t ,
bool IsBranch, uint64_t ,
3153 uint64_t , uint64_t ) {
3164 return Val.
Addr ==
static_cast<uint64_t
>(
Value) &&
3167 if (Result != Symbols->end()) {
3168 auto *Sym =
Ctx.getOrCreateSymbol(Result->Name);
3174 ReferencedAddresses.push_back(
static_cast<uint64_t
>(
Value));
3193 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.