44#define DEBUG_TYPE "amdgpu-disassembler"
47 (isGFX10Plus() ? AMDGPU::EncValues::SGPR_MAX_GFX10 \
48 : AMDGPU::EncValues::SGPR_MAX_SI)
60 MAI(Ctx.getAsmInfo()),
62 TargetMaxInstBytes(MAI.getMaxInstLength(&
STI)),
63 CodeObjectVersion(
AMDGPU::getDefaultAMDHSACodeObjectVersion()) {
65 if (!
STI.hasFeature(AMDGPU::FeatureGCN3Encoding) && !
isGFX10Plus())
69 createConstantSymbolExpr(Symbol, Code);
71 UCVersionW64Expr = createConstantSymbolExpr(
"UC_VERSION_W64_BIT", 0x2000);
72 UCVersionW32Expr = createConstantSymbolExpr(
"UC_VERSION_W32_BIT", 0x4000);
73 UCVersionMDPExpr = createConstantSymbolExpr(
"UC_VERSION_MDP_BIT", 0x8000);
81 unsigned EFlags)
const {
82 OS <<
"\t.amdgcn_target \""
89#define X(NUM, ENUM, NAME) \
104 switch (SrameccSetting) {
142 AMDGPU::OpName Name) {
143 int OpIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(), Name);
145 auto *
I =
MI.begin();
146 std::advance(
I, OpIdx);
160 if (DAsm->tryAddingSymbolicOperand(Inst,
Offset, Addr,
true, 2, 2, 0))
169 if (DAsm->isGFX12Plus()) {
171 }
else if (DAsm->isVI()) {
182 return addOperand(Inst, DAsm->decodeBoolReg(Inst, Val));
189 return addOperand(Inst, DAsm->decodeSplitBarrier(Inst, Val));
195 return addOperand(Inst, DAsm->decodeDpp8FI(Val));
198#define DECODE_OPERAND(StaticDecoderName, DecoderName) \
199 static DecodeStatus StaticDecoderName(MCInst &Inst, unsigned Imm, \
201 const MCDisassembler *Decoder) { \
202 auto DAsm = static_cast<const AMDGPUDisassembler *>(Decoder); \
203 return addOperand(Inst, DAsm->DecoderName(Imm)); \
208#define DECODE_OPERAND_REG_8(RegClass) \
209 static DecodeStatus Decode##RegClass##RegisterClass( \
210 MCInst &Inst, unsigned Imm, uint64_t , \
211 const MCDisassembler *Decoder) { \
212 assert(Imm < (1 << 8) && "8-bit encoding"); \
213 auto DAsm = static_cast<const AMDGPUDisassembler *>(Decoder); \
215 Inst, DAsm->createRegOperand(AMDGPU::RegClass##RegClassID, Imm)); \
218#define DECODE_SrcOp(Name, EncSize, OpWidth, EncImm) \
219 static DecodeStatus Name(MCInst &Inst, unsigned Imm, uint64_t , \
220 const MCDisassembler *Decoder) { \
221 if (!isUInt<EncSize>(Imm)) \
222 return MCDisassembler::Fail; \
223 auto DAsm = static_cast<const AMDGPUDisassembler *>(Decoder); \
224 return addOperand(Inst, DAsm->decodeSrcOp(Inst, OpWidth, EncImm)); \
228 unsigned OpWidth,
unsigned Imm,
unsigned EncImm,
230 assert(
Imm < (1U << EncSize) &&
"Operand doesn't fit encoding!");
232 return addOperand(Inst, DAsm->decodeSrcOp(Inst, OpWidth, EncImm));
237#define DECODE_OPERAND_SREG_7(RegClass, OpWidth) \
238 DECODE_SrcOp(Decode##RegClass##RegisterClass, 7, OpWidth, Imm)
240#define DECODE_OPERAND_SREG_8(RegClass, OpWidth) \
241 DECODE_SrcOp(Decode##RegClass##RegisterClass, 8, OpWidth, Imm)
247template <
unsigned OpW
idth>
255template <
unsigned OpW
idth>
265template <
unsigned OpW
idth>
277template <
unsigned OpW
idth>
293template <
unsigned OpW
idth>
302template <
unsigned OpW
idth>
354 assert((
Imm & (1 << 8)) == 0 &&
"Imm{8} should not be used");
356 bool IsHi =
Imm & (1 << 9);
357 unsigned RegIdx =
Imm & 0xff;
359 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
367 bool IsHi =
Imm & (1 << 7);
368 unsigned RegIdx =
Imm & 0x7f;
370 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
373template <
unsigned OpW
idth>
381 bool IsHi =
Imm & (1 << 7);
382 unsigned RegIdx =
Imm & 0x7f;
383 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
385 return addOperand(Inst, DAsm->decodeNonVGPRSrcOp(Inst, OpWidth,
Imm & 0xFF));
388template <
unsigned OpW
idth>
396 bool IsHi =
Imm & (1 << 9);
397 unsigned RegIdx =
Imm & 0xff;
398 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
400 return addOperand(Inst, DAsm->decodeNonVGPRSrcOp(Inst, OpWidth,
Imm & 0xFF));
412 bool IsHi =
Imm & (1 << 9);
413 unsigned RegIdx =
Imm & 0xff;
414 return addOperand(Inst, DAsm->createVGPR16Operand(RegIdx, IsHi));
421 return addOperand(Inst, DAsm->decodeMandatoryLiteralConstant(
Imm));
428 return addOperand(Inst, DAsm->decodeMandatoryLiteral64Constant(
Imm));
434 return addOperand(Inst, DAsm->decodeVOPDDstYOp(Inst, Val));
440 return addOperand(Inst, DAsm->decodeSrcOp(Inst, Opw,
Imm | 256));
443template <
unsigned Opw>
453 assert(
Imm < (1 << 9) &&
"9-bit encoding");
458#define DECODE_SDWA(DecName) \
459DECODE_OPERAND(decodeSDWA##DecName, decodeSDWA##DecName)
465#define DECODE_SDWA_IMM_FIELD(Name, MaxImm) \
466 static DecodeStatus Name(MCInst &Inst, unsigned Imm, uint64_t , \
467 const MCDisassembler * ) { \
468 if (Imm > (MaxImm)) \
469 return MCDisassembler::Fail; \
470 return addOperand(Inst, MCOperand::createImm(Imm)); \
478 AMDGPU::SDWA::DstUnused::UNUSED_PRESERVE)
479#undef DECODE_SDWA_IMM_FIELD
488#include "AMDGPUGenDisassemblerTables.inc"
492template <>
constexpr uint32_t InsnBitWidth<uint32_t> = 32;
493template <>
constexpr uint32_t InsnBitWidth<uint64_t> = 64;
494template <>
constexpr uint32_t InsnBitWidth<std::bitset<96>> = 96;
495template <>
constexpr uint32_t InsnBitWidth<std::bitset<128>> = 128;
502template <
typename InsnType>
504 InsnType Inst, uint64_t
Address,
510 const auto SavedBytes = Bytes;
525 Comments << LocalComments;
532template <
typename InsnType>
537 for (
const uint8_t *
T : {Table1, Table2}) {
548 Bytes = Bytes.
slice(
sizeof(
T));
556 Bytes = Bytes.
slice(8);
558 Bytes = Bytes.
slice(4);
559 return (
Hi << 64) |
Lo;
566 Bytes = Bytes.
slice(8);
568 Bytes = Bytes.
slice(8);
569 return (
Hi << 64) |
Lo;
572bool AMDGPUDisassembler::decodeImmOperands(
MCInst &
MI,
574 const MCInstrDesc &
Desc = MCII.get(
MI.getOpcode());
576 if (OpNo >=
MI.getNumOperands())
586 MCOperand &
Op =
MI.getOperand(OpNo);
589 int64_t
Imm =
Op.getImm();
605 switch (OpDesc.OperandType) {
626 Imm = (F16Val << 16) | (F16Val & 0xFFFF);
654 unsigned MaxInstBytesNum = std::min((
size_t)TargetMaxInstBytes, Bytes_.
size());
655 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
659 Size = std::min((
size_t)4, Bytes_.
size());
671 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
706 if (
STI.hasFeature(AMDGPU::Feature64BitLiterals)) {
708 Bytes = Bytes_.
slice(4, MaxInstBytesNum - 4);
716 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
718 }
else if (Bytes.size() >= 16 &&
719 STI.hasFeature(AMDGPU::FeatureGFX950Insts)) {
725 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
728 if (Bytes.size() >= 8) {
731 if (
STI.hasFeature(AMDGPU::FeatureGFX10_BEncoding) &&
735 if (
STI.hasFeature(AMDGPU::FeatureUnpackedD16VMem) &&
739 if (
STI.hasFeature(AMDGPU::FeatureGFX950Insts) &&
746 if (
STI.hasFeature(AMDGPU::FeatureFmaMixInsts) &&
750 if (
STI.hasFeature(AMDGPU::FeatureGFX940Insts) &&
754 if (
STI.hasFeature(AMDGPU::FeatureGFX90AInsts) &&
806 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
810 if (Bytes.size() >= 4) {
823 if (
STI.hasFeature(AMDGPU::FeatureGFX950Insts) &&
827 if (
STI.hasFeature(AMDGPU::FeatureGFX90AInsts) &&
831 if (
STI.hasFeature(AMDGPU::FeatureGFX10_BEncoding) &&
879 else if (AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::dpp8) !=
891 AMDGPU::OpName::src2_modifiers);
894 if (
MI.getOpcode() == AMDGPU::V_CVT_SR_BF8_F32_e64_dpp ||
895 MI.getOpcode() == AMDGPU::V_CVT_SR_FP8_F32_e64_dpp) {
898 AMDGPU::OpName::src2_modifiers);
907 int CPolPos = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
908 AMDGPU::OpName::cpol);
912 if (
MI.getNumOperands() <= (
unsigned)CPolPos) {
914 AMDGPU::OpName::cpol);
916 MI.getOperand(CPolPos).setImm(
MI.getOperand(CPolPos).getImm() | CPol);
922 (
STI.hasFeature(AMDGPU::FeatureGFX90AInsts))) {
925 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::tfe);
926 if (TFEOpIdx != -1) {
927 auto *TFEIter =
MI.begin();
928 std::advance(TFEIter, TFEOpIdx);
936 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::offset);
937 if (OffsetIdx != -1) {
940 if (SignedOffset < 0)
947 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::swz);
948 if (SWZOpIdx != -1) {
949 auto *SWZIter =
MI.begin();
950 std::advance(SWZIter, SWZOpIdx);
958 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vaddr0);
960 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::srsrc);
961 unsigned NSAArgs = RsrcIdx - VAddr0Idx - 1;
962 if (VAddr0Idx >= 0 && NSAArgs > 0) {
963 unsigned NSAWords = (NSAArgs + 3) / 4;
964 if (Bytes.size() < 4 * NSAWords)
966 for (
unsigned i = 0; i < NSAArgs; ++i) {
967 const unsigned VAddrIdx = VAddr0Idx + 1 + i;
969 MCII->getOpRegClassID(
Desc.operands()[VAddrIdx], HwModeRegClass);
972 Bytes = Bytes.slice(4 * NSAWords);
996 int VDstIn_Idx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
997 AMDGPU::OpName::vdst_in);
998 if (VDstIn_Idx != -1) {
999 int Tied = MCII->get(
MI.getOpcode()).getOperandConstraint(VDstIn_Idx,
1001 if (Tied != -1 && (
MI.getNumOperands() <= (
unsigned)VDstIn_Idx ||
1002 !
MI.getOperand(VDstIn_Idx).isReg() ||
1003 MI.getOperand(VDstIn_Idx).getReg() !=
MI.getOperand(Tied).getReg())) {
1004 if (
MI.getNumOperands() > (
unsigned)VDstIn_Idx)
1005 MI.erase(&
MI.getOperand(VDstIn_Idx));
1008 AMDGPU::OpName::vdst_in);
1020 MCII->get(
MI.getOpcode()).getNumDefs() == 0 &&
1021 MCII->get(
MI.getOpcode()).hasImplicitDefOfPhysReg(AMDGPU::EXEC)) {
1022 auto ExecEncoding = MRI.getEncodingValue(AMDGPU::EXEC_LO);
1023 if (Bytes_[0] != ExecEncoding)
1027 Size = MaxInstBytesNum - Bytes.size();
1032 if (
STI.hasFeature(AMDGPU::FeatureGFX11Insts)) {
1042 if (
MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_t16_gfx11 ||
1043 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_fake16_gfx11 ||
1044 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_t16_gfx12 ||
1045 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_fake16_gfx12 ||
1046 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_t16_gfx13 ||
1047 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_fake16_gfx13 ||
1048 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_t16_gfx11 ||
1049 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_fake16_gfx11 ||
1050 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_t16_gfx12 ||
1051 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_fake16_gfx12 ||
1052 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_t16_gfx13 ||
1053 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_fake16_gfx13 ||
1054 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_t16_gfx11 ||
1055 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_fake16_gfx11 ||
1056 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_t16_gfx12 ||
1057 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_fake16_gfx12 ||
1058 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_t16_gfx13 ||
1059 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_fake16_gfx13 ||
1060 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_t16_gfx11 ||
1061 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_fake16_gfx11 ||
1062 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_t16_gfx12 ||
1063 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_fake16_gfx12 ||
1064 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_t16_gfx13 ||
1065 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_fake16_gfx13) {
1073 if (
STI.hasFeature(AMDGPU::FeatureGFX9) ||
1074 STI.hasFeature(AMDGPU::FeatureGFX10)) {
1078 }
else if (
STI.hasFeature(AMDGPU::FeatureVolcanicIslands)) {
1079 int SDst = AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::sdst);
1083 AMDGPU::OpName::sdst);
1108 NewReg = MRI.
getSubReg(MO.
getReg(), AMDGPU::sub0_sub1_sub2_sub3_sub4_sub5);
1112 AMDGPU::sub0_sub1_sub2_sub3_sub4_sub5_sub6_sub7);
1122 BaseReg, AMDGPU::sub0, &MRI.
getRegClass(AMDGPU::VReg_384RegClassID));
1146 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::blgp);
1151 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::cbsz);
1153 unsigned CBSZ =
MI.getOperand(CbszIdx).getImm();
1154 unsigned BLGP =
MI.getOperand(BlgpIdx).getImm();
1158 if (!AdjustedRegClassOpcode ||
1159 AdjustedRegClassOpcode->
Opcode ==
MI.getOpcode())
1162 MI.setOpcode(AdjustedRegClassOpcode->
Opcode);
1164 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src0);
1166 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src1);
1175 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::matrix_a_fmt);
1180 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::matrix_b_fmt);
1182 unsigned FmtA =
MI.getOperand(FmtAIdx).getImm();
1183 unsigned FmtB =
MI.getOperand(FmtBIdx).getImm();
1187 if (!AdjustedRegClassOpcode ||
1188 AdjustedRegClassOpcode->
Opcode ==
MI.getOpcode())
1191 MI.setOpcode(AdjustedRegClassOpcode->
Opcode);
1193 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src0);
1195 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src1);
1213 bool IsVOP3P =
false) {
1215 unsigned Opc =
MI.getOpcode();
1216 const AMDGPU::OpName ModOps[] = {AMDGPU::OpName::src0_modifiers,
1217 AMDGPU::OpName::src1_modifiers,
1218 AMDGPU::OpName::src2_modifiers};
1219 for (
int J = 0; J < 3; ++J) {
1220 int OpIdx = AMDGPU::getNamedOperandIdx(
Opc, ModOps[J]);
1224 unsigned Val =
MI.getOperand(OpIdx).getImm();
1231 }
else if (J == 0) {
1242 const unsigned Opc =
MI.getOpcode();
1244 MRI.getRegClass(AMDGPU::VGPR_16RegClassID);
1245 constexpr std::array<std::tuple<AMDGPU::OpName, AMDGPU::OpName, unsigned>, 4>
1246 OpAndOpMods = {{{AMDGPU::OpName::src0, AMDGPU::OpName::src0_modifiers,
1248 {AMDGPU::OpName::src1, AMDGPU::OpName::src1_modifiers,
1250 {AMDGPU::OpName::src2, AMDGPU::OpName::src2_modifiers,
1252 {AMDGPU::OpName::vdst, AMDGPU::OpName::src0_modifiers,
1254 for (
const auto &[
OpName, OpModsName, OpSelMask] : OpAndOpMods) {
1255 int OpIdx = AMDGPU::getNamedOperandIdx(
Opc,
OpName);
1256 int OpModsIdx = AMDGPU::getNamedOperandIdx(
Opc, OpModsName);
1257 if (OpIdx == -1 || OpModsIdx == -1)
1264 unsigned OpEnc = MRI.getEncodingValue(
Op.getReg());
1265 const MCOperand &OpMods =
MI.getOperand(OpModsIdx);
1266 unsigned ModVal = OpMods.
getImm();
1267 if (ModVal & OpSelMask) {
1277 constexpr int DST_IDX = 0;
1278 auto Opcode =
MI.getOpcode();
1279 const auto &
Desc = MCII->get(Opcode);
1280 auto OldIdx = AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::old);
1282 if (OldIdx != -1 &&
Desc.getOperandConstraint(
1286 AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::src2),
1297 assert(
MI.getNumOperands() + 1 < MCII->get(
MI.getOpcode()).getNumOperands());
1300 AMDGPU::OpName::src2_modifiers);
1304 unsigned Opc =
MI.getOpcode();
1307 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vdst_in);
1308 if (VDstInIdx != -1)
1311 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1312 if (
MI.getNumOperands() < DescNumOps &&
1317 AMDGPU::OpName::op_sel);
1320 if (
MI.getNumOperands() < DescNumOps &&
1323 AMDGPU::OpName::src0_modifiers);
1325 if (
MI.getNumOperands() < DescNumOps &&
1328 AMDGPU::OpName::src1_modifiers);
1336 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vdst_in);
1337 if (VDstInIdx != -1)
1340 unsigned Opc =
MI.getOpcode();
1341 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1342 if (
MI.getNumOperands() < DescNumOps &&
1346 AMDGPU::OpName::op_sel);
1361 BaseReg = AMDGPU::VGPR0;
1363 BaseReg = AMDGPU::AGPR0;
1365 assert(BaseReg &&
"Only vector registers expected");
1367 return (Sub0 - BaseReg + NumRegs <= 256) ?
Reg :
MCRegister();
1374 int VDstIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1375 AMDGPU::OpName::vdst);
1377 int VDataIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1378 AMDGPU::OpName::vdata);
1380 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vaddr0);
1382 ? AMDGPU::OpName::srsrc
1383 : AMDGPU::OpName::rsrc;
1384 int RsrcIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(), RsrcOpName);
1385 int DMaskIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1386 AMDGPU::OpName::dmask);
1388 int TFEIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1389 AMDGPU::OpName::tfe);
1390 int D16Idx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1391 AMDGPU::OpName::d16);
1398 if (BaseOpcode->
BVH) {
1404 bool IsAtomic = (VDstIdx != -1);
1408 bool IsPartialNSA =
false;
1409 unsigned AddrSize = Info->VAddrDwords;
1413 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::dim);
1415 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::a16);
1418 const bool IsA16 = (A16Idx != -1 &&
MI.getOperand(A16Idx).
getImm());
1425 IsNSA = Info->MIMGEncoding == AMDGPU::MIMGEncGfx10NSA ||
1426 Info->MIMGEncoding == AMDGPU::MIMGEncGfx11NSA ||
1427 Info->MIMGEncoding == AMDGPU::MIMGEncGfx12 ||
1428 Info->MIMGEncoding == AMDGPU::MIMGEncGfx13;
1430 if (!IsVSample && AddrSize > 12)
1433 if (AddrSize > Info->VAddrDwords) {
1434 if (!
STI.hasFeature(AMDGPU::FeaturePartialNSAEncoding)) {
1439 IsPartialNSA =
true;
1444 unsigned DMask =
MI.getOperand(DMaskIdx).getImm() & 0xf;
1445 unsigned DstSize = IsGather4 ? 4 : std::max(
llvm::popcount(DMask), 1);
1447 bool D16 = D16Idx >= 0 &&
MI.getOperand(D16Idx).getImm();
1449 DstSize = (DstSize + 1) / 2;
1452 if (TFEIdx != -1 &&
MI.getOperand(TFEIdx).getImm())
1455 if (DstSize == Info->VDataDwords && AddrSize == Info->VAddrDwords)
1460 if (NewOpcode == -1)
1465 if (DstSize != Info->VDataDwords) {
1466 auto DataRCID = MCII->getOpRegClassID(
1467 MCII->get(NewOpcode).operands()[VDataIdx], HwModeRegClass);
1471 MCRegister VdataSub0 = MRI.getSubReg(Vdata0, AMDGPU::sub0);
1472 Vdata0 = (VdataSub0 != 0)? VdataSub0 : Vdata0;
1475 NewVdata = MRI.getMatchingSuperReg(Vdata0, AMDGPU::sub0, &NewRC);
1486 int VAddrSAIdx = IsPartialNSA ? (RsrcIdx - 1) : VAddr0Idx;
1488 if (
STI.hasFeature(AMDGPU::FeatureNSAEncoding) && (!IsNSA || IsPartialNSA) &&
1489 AddrSize != Info->VAddrDwords) {
1490 MCRegister VAddrSA =
MI.getOperand(VAddrSAIdx).getReg();
1491 MCRegister VAddrSubSA = MRI.getSubReg(VAddrSA, AMDGPU::sub0);
1492 VAddrSA = VAddrSubSA ? VAddrSubSA : VAddrSA;
1494 auto AddrRCID = MCII->getOpRegClassID(
1495 MCII->get(NewOpcode).operands()[VAddrSAIdx], HwModeRegClass);
1498 NewVAddrSA = MRI.getMatchingSuperReg(VAddrSA, AMDGPU::sub0, &NewRC);
1504 MI.setOpcode(NewOpcode);
1506 if (NewVdata != AMDGPU::NoRegister) {
1518 assert(AddrSize <= Info->VAddrDwords);
1519 MI.erase(
MI.begin() + VAddr0Idx + AddrSize,
1520 MI.begin() + VAddr0Idx + Info->VAddrDwords);
1528 unsigned Opc =
MI.getOpcode();
1529 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1532 if (
MI.getNumOperands() < DescNumOps &&
1536 if (
MI.getNumOperands() < DescNumOps &&
1539 AMDGPU::OpName::op_sel);
1540 if (
MI.getNumOperands() < DescNumOps &&
1543 AMDGPU::OpName::op_sel_hi);
1544 if (
MI.getNumOperands() < DescNumOps &&
1547 AMDGPU::OpName::neg_lo);
1548 if (
MI.getNumOperands() < DescNumOps &&
1551 AMDGPU::OpName::neg_hi);
1556 unsigned Opc =
MI.getOpcode();
1557 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1559 if (
MI.getNumOperands() < DescNumOps &&
1563 if (
MI.getNumOperands() < DescNumOps &&
1566 AMDGPU::OpName::src0_modifiers);
1568 if (
MI.getNumOperands() < DescNumOps &&
1571 AMDGPU::OpName::src1_modifiers);
1575 unsigned Opc =
MI.getOpcode();
1576 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1580 if (
MI.getNumOperands() < DescNumOps &&
1584 AMDGPU::OpName::op_sel);
1589 assert(HasLiteral &&
"Should have decoded a literal");
1595 &getAMDGPUMCRegisterClass(RegClassID));
1600 const Twine& ErrMsg)
const {
1614 unsigned Val)
const {
1615 const auto &RegCl = getAMDGPUMCRegisterClass(RegClassID);
1616 if (Val >= RegCl.getNumRegs())
1618 ": unknown register " +
Twine(Val));
1624 unsigned Val)
const {
1628 switch (SRegClassID) {
1629 case AMDGPU::SGPR_32RegClassID:
1630 case AMDGPU::TTMP_32RegClassID:
1632 case AMDGPU::SGPR_64RegClassID:
1633 case AMDGPU::TTMP_64RegClassID:
1636 case AMDGPU::SGPR_96RegClassID:
1637 case AMDGPU::TTMP_96RegClassID:
1638 case AMDGPU::SGPR_128RegClassID:
1639 case AMDGPU::TTMP_128RegClassID:
1642 case AMDGPU::SGPR_256RegClassID:
1643 case AMDGPU::TTMP_256RegClassID:
1646 case AMDGPU::SGPR_288RegClassID:
1647 case AMDGPU::TTMP_288RegClassID:
1648 case AMDGPU::SGPR_320RegClassID:
1649 case AMDGPU::TTMP_320RegClassID:
1650 case AMDGPU::SGPR_352RegClassID:
1651 case AMDGPU::TTMP_352RegClassID:
1652 case AMDGPU::SGPR_384RegClassID:
1653 case AMDGPU::TTMP_384RegClassID:
1654 case AMDGPU::SGPR_512RegClassID:
1655 case AMDGPU::TTMP_512RegClassID:
1664 if (Val % (1 << shift)) {
1666 <<
": scalar reg isn't aligned " << Val;
1674 unsigned RegIdxInVGPR16 = RegIdx * 2 + (IsHi ? 1 : 0);
1684 "Should only decode multiple kimm with VOPD, check VSrc operand types");
1686 return errOperand(Val,
"More than one unique literal is illegal");
1697 return errOperand(Val,
"More than one unique literal is illegal");
1702 bool UseLit64 =
Hi_32(Literal) == 0;
1715 if (Bytes.size() < 4) {
1716 return errOperand(0,
"cannot read literal, inst bytes left " +
1717 Twine(Bytes.size()));
1724 bool HasInv2Pi =
true;
1728 int64_t Val = Literal;
1729 bool UseLit =
false;
1800 assert(
STI.hasFeature(AMDGPU::Feature64BitLiterals));
1803 if (Bytes.size() < 8) {
1804 return errOperand(0,
"cannot read literal64, inst bytes left " +
1805 Twine(Bytes.size()));
1811 bool UseLit64 =
Hi_32(Literal) == 0;
1814 Literal,
STI.hasFeature(AMDGPU::FeatureInv2PiInlineImm));
1824 assert(
Imm >= INLINE_INTEGER_C_MIN &&
Imm <= INLINE_INTEGER_C_MAX);
1826 (
static_cast<int64_t
>(
Imm) - INLINE_INTEGER_C_MIN) :
1827 (INLINE_INTEGER_C_POSITIVE_MAX -
static_cast<int64_t
>(
Imm)));
1875 return 0x3fc45f306dc9c882;
1937 return VGPR_32RegClassID;
1939 return VReg_64RegClassID;
1941 return VReg_96RegClassID;
1943 return VReg_128RegClassID;
1945 return VReg_160RegClassID;
1947 return VReg_192RegClassID;
1949 return VReg_256RegClassID;
1951 return VReg_288RegClassID;
1953 return VReg_320RegClassID;
1955 return VReg_352RegClassID;
1957 return VReg_384RegClassID;
1959 return VReg_512RegClassID;
1961 return VReg_1024RegClassID;
1972 return AGPR_32RegClassID;
1974 return AReg_64RegClassID;
1976 return AReg_96RegClassID;
1978 return AReg_128RegClassID;
1980 return AReg_160RegClassID;
1982 return AReg_256RegClassID;
1984 return AReg_288RegClassID;
1986 return AReg_320RegClassID;
1988 return AReg_352RegClassID;
1990 return AReg_384RegClassID;
1992 return AReg_512RegClassID;
1994 return AReg_1024RegClassID;
1999std::optional<unsigned>
2006 return SGPR_32RegClassID;
2008 return SGPR_64RegClassID;
2010 return SGPR_96RegClassID;
2012 return SGPR_128RegClassID;
2014 return SGPR_160RegClassID;
2016 return SGPR_256RegClassID;
2018 return SGPR_288RegClassID;
2020 return SGPR_320RegClassID;
2022 return SGPR_352RegClassID;
2024 return SGPR_384RegClassID;
2026 return SGPR_512RegClassID;
2028 return std::nullopt;
2031std::optional<unsigned>
2038 return TTMP_32RegClassID;
2040 return TTMP_64RegClassID;
2042 return TTMP_128RegClassID;
2044 return TTMP_256RegClassID;
2046 return TTMP_288RegClassID;
2048 return TTMP_320RegClassID;
2050 return TTMP_352RegClassID;
2052 return TTMP_384RegClassID;
2054 return TTMP_512RegClassID;
2056 return std::nullopt;
2062 unsigned TTmpMin =
isGFX9Plus() ? TTMP_GFX9PLUS_MIN : TTMP_VI_MIN;
2063 unsigned TTmpMax =
isGFX9Plus() ? TTMP_GFX9PLUS_MAX : TTMP_VI_MAX;
2065 return (TTmpMin <= Val && Val <= TTmpMax)? Val - TTmpMin : -1;
2069 unsigned Val)
const {
2074 bool IsAGPR = Val & 512;
2077 if (VGPR_MIN <= Val && Val <= VGPR_MAX) {
2086 unsigned Val)
const {
2089 assert(Val < (1 << 8) &&
"9-bit Src encoding when Val{8} is 0");
2094 auto UnsupportedWidth = [&]() {
2096 "-bit non-VGPR operand encoding " +
Twine(Val));
2101 static_assert(SGPR_MIN == 0);
2104 return UnsupportedWidth();
2112 return UnsupportedWidth();
2116 if ((INLINE_INTEGER_C_MIN <= Val && Val <= INLINE_INTEGER_C_MAX) ||
2117 (INLINE_FLOATING_C_MIN <= Val && Val <= INLINE_FLOATING_C_MAX) ||
2118 Val == LITERAL_CONST)
2121 if (Val == LITERAL64_CONST &&
STI.hasFeature(AMDGPU::Feature64BitLiterals)) {
2127 "64-bit literal is not supported by this instruction");
2144 return UnsupportedWidth();
2151 unsigned Val)
const {
2153 AMDGPU::getNamedOperandIdx(Inst.
getOpcode(), AMDGPU::OpName::vdstX);
2156 unsigned XDstReg = MRI.getEncodingValue(Inst.
getOperand(VDstXInd).
getReg());
2157 Val |= ~XDstReg & 1;
2280 const unsigned Val)
const {
2284 if (
STI.hasFeature(AMDGPU::FeatureGFX9) ||
2285 STI.hasFeature(AMDGPU::FeatureGFX10)) {
2288 if (
int(SDWA9EncValues::SRC_VGPR_MIN) <=
int(Val) &&
2289 Val <= SDWA9EncValues::SRC_VGPR_MAX) {
2291 Val - SDWA9EncValues::SRC_VGPR_MIN);
2293 if (SDWA9EncValues::SRC_SGPR_MIN <= Val &&
2294 Val <= (
isGFX10Plus() ? SDWA9EncValues::SRC_SGPR_MAX_GFX10
2295 : SDWA9EncValues::SRC_SGPR_MAX_SI)) {
2297 Val - SDWA9EncValues::SRC_SGPR_MIN);
2299 if (SDWA9EncValues::SRC_TTMP_MIN <= Val &&
2300 Val <= SDWA9EncValues::SRC_TTMP_MAX) {
2302 Val - SDWA9EncValues::SRC_TTMP_MIN);
2305 const unsigned SVal = Val - SDWA9EncValues::SRC_SGPR_MIN;
2307 if ((INLINE_INTEGER_C_MIN <= SVal && SVal <= INLINE_INTEGER_C_MAX) ||
2308 (INLINE_FLOATING_C_MIN <= SVal && SVal <= INLINE_FLOATING_C_MAX))
2313 if (
STI.hasFeature(AMDGPU::FeatureVolcanicIslands))
2329 assert((
STI.hasFeature(AMDGPU::FeatureGFX9) ||
2330 STI.hasFeature(AMDGPU::FeatureGFX10)) &&
2331 "SDWAVopcDst should be present only on GFX9+");
2333 bool IsWave32 =
STI.hasFeature(AMDGPU::FeatureWavefrontSize32);
2335 if (Val & SDWA9EncValues::VOPC_DST_VCC_MASK) {
2336 Val &= SDWA9EncValues::VOPC_DST_SGPR_MASK;
2350 unsigned Val)
const {
2351 return STI.hasFeature(AMDGPU::FeatureWavefrontSize32)
2357 unsigned Val)
const {
2359 constexpr unsigned M0Encoding = 125;
2360 bool IsValidBarrier =
2361 Val == M0Encoding ||
2362 (INLINE_INTEGER_C_MIN <= Val && Val < INLINE_INTEGER_C_MIN + 32) ||
2363 (INLINE_INTEGER_C_POSITIVE_MAX < Val &&
2364 Val <= INLINE_INTEGER_C_POSITIVE_MAX + 4);
2365 if (!IsValidBarrier)
2383 auto [
Version, W64, W32, MDP] = Encoding::decode(
Imm);
2386 if (Encoding::encode(
Version, W64, W32, MDP) !=
Imm)
2396 if (
I == Versions.end())
2412 return STI.hasFeature(AMDGPU::FeatureVolcanicIslands);
2418 return STI.hasFeature(AMDGPU::FeatureGFX90AInsts);
2430 return STI.hasFeature(AMDGPU::FeatureGFX11);
2438 return STI.hasFeature(AMDGPU::FeatureGFX11_7Insts);
2442 return STI.hasFeature(AMDGPU::FeatureGFX12);
2462 return STI.hasFeature(AMDGPU::FeatureArchitectedFlatScratch);
2483 if (PopCount == 1) {
2484 S <<
"bit (" << (TrailingZeros + BaseBytes * CHAR_BIT) <<
')';
2486 S <<
"bits in range ("
2487 << (TrailingZeros + PopCount - 1 + BaseBytes * CHAR_BIT) <<
':'
2488 << (TrailingZeros + BaseBytes * CHAR_BIT) <<
')';
2494#define GET_FIELD(MASK) (AMDHSA_BITS_GET(FourByteBuffer, MASK))
2495#define PRINT_DIRECTIVE(DIRECTIVE, MASK) \
2497 KdStream << Indent << DIRECTIVE " " << GET_FIELD(MASK) << '\n'; \
2499#define PRINT_PSEUDO_DIRECTIVE_COMMENT(DIRECTIVE, MASK) \
2501 KdStream << Indent << MAI.getCommentString() << ' ' << DIRECTIVE " " \
2502 << GET_FIELD(MASK) << '\n'; \
2505#define CHECK_RESERVED_BITS_IMPL(MASK, DESC, MSG) \
2507 if (FourByteBuffer & (MASK)) { \
2508 return createStringError(std::errc::invalid_argument, \
2509 "kernel descriptor " DESC \
2510 " reserved %s set" MSG, \
2511 getBitRangeFromMask((MASK), 0).c_str()); \
2515#define CHECK_RESERVED_BITS(MASK) CHECK_RESERVED_BITS_IMPL(MASK, #MASK, "")
2516#define CHECK_RESERVED_BITS_MSG(MASK, MSG) \
2517 CHECK_RESERVED_BITS_IMPL(MASK, #MASK, ", " MSG)
2518#define CHECK_RESERVED_BITS_DESC(MASK, DESC) \
2519 CHECK_RESERVED_BITS_IMPL(MASK, DESC, "")
2520#define CHECK_RESERVED_BITS_DESC_MSG(MASK, DESC, MSG) \
2521 CHECK_RESERVED_BITS_IMPL(MASK, DESC, ", " MSG)
2534 uint32_t GranulatedWorkitemVGPRCount =
2535 GET_FIELD(COMPUTE_PGM_RSRC1_GRANULATED_WORKITEM_VGPR_COUNT);
2538 (GranulatedWorkitemVGPRCount + 1) *
2541 KdStream << Indent <<
".amdhsa_next_free_vgpr " << NextFreeVGPR <<
'\n';
2562 uint32_t GranulatedWavefrontSGPRCount =
2563 GET_FIELD(COMPUTE_PGM_RSRC1_GRANULATED_WAVEFRONT_SGPR_COUNT);
2567 "must be zero on gfx10+");
2569 uint32_t NextFreeSGPR = (GranulatedWavefrontSGPRCount + 1) *
2572 KdStream << Indent <<
".amdhsa_reserve_vcc " << 0 <<
'\n';
2574 KdStream << Indent <<
".amdhsa_reserve_flat_scratch " << 0 <<
'\n';
2575 bool ReservedXnackMask =
STI.hasFeature(AMDGPU::FeatureXNACK);
2576 assert(!ReservedXnackMask ||
STI.hasFeature(AMDGPU::FeatureSupportsXNACK));
2577 KdStream << Indent <<
".amdhsa_reserve_xnack_mask " << ReservedXnackMask
2579 KdStream << Indent <<
".amdhsa_next_free_sgpr " << NextFreeSGPR <<
"\n";
2584 COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_32);
2586 COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_16_64);
2588 COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_32);
2590 COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_16_64);
2594 if (
STI.hasFeature(AMDGPU::FeatureDX10ClampAndIEEEMode))
2596 COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_DX10_CLAMP);
2600 if (
STI.hasFeature(AMDGPU::FeatureDX10ClampAndIEEEMode))
2602 COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_IEEE_MODE);
2609 PRINT_DIRECTIVE(
".amdhsa_fp16_overflow", COMPUTE_PGM_RSRC1_GFX9_PLUS_FP16_OVFL);
2612 "COMPUTE_PGM_RSRC1",
"must be zero pre-gfx9");
2618 COMPUTE_PGM_RSRC1_GFX125_FLAT_SCRATCH_IS_NV);
2621 "COMPUTE_PGM_RSRC1");
2632 COMPUTE_PGM_RSRC1_GFX10_PLUS_WGP_MODE);
2634 PRINT_DIRECTIVE(
".amdhsa_memory_ordered", COMPUTE_PGM_RSRC1_GFX10_PLUS_MEM_ORDERED);
2635 PRINT_DIRECTIVE(
".amdhsa_forward_progress", COMPUTE_PGM_RSRC1_GFX10_PLUS_FWD_PROGRESS);
2638 "COMPUTE_PGM_RSRC1");
2643 COMPUTE_PGM_RSRC1_GFX12_PLUS_ENABLE_WG_RR_EN);
2655 COMPUTE_PGM_RSRC2_ENABLE_PRIVATE_SEGMENT);
2657 PRINT_DIRECTIVE(
".amdhsa_system_sgpr_private_segment_wavefront_offset",
2658 COMPUTE_PGM_RSRC2_ENABLE_PRIVATE_SEGMENT);
2660 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_X);
2662 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Y);
2664 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Z);
2666 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_INFO);
2668 COMPUTE_PGM_RSRC2_ENABLE_VGPR_WORKITEM_ID);
2675 ".amdhsa_exception_fp_ieee_invalid_op",
2676 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INVALID_OPERATION);
2678 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_FP_DENORMAL_SOURCE);
2680 ".amdhsa_exception_fp_ieee_div_zero",
2681 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_DIVISION_BY_ZERO);
2683 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_OVERFLOW);
2685 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_UNDERFLOW);
2687 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INEXACT);
2689 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_INT_DIVIDE_BY_ZERO);
2702 KdStream << Indent <<
".amdhsa_accum_offset "
2703 << (
GET_FIELD(COMPUTE_PGM_RSRC3_GFX90A_ACCUM_OFFSET) + 1) * 4
2706 PRINT_DIRECTIVE(
".amdhsa_tg_split", COMPUTE_PGM_RSRC3_GFX90A_TG_SPLIT);
2709 "COMPUTE_PGM_RSRC3",
"must be zero on gfx90a");
2711 "COMPUTE_PGM_RSRC3",
"must be zero on gfx90a");
2715 if (!EnableWavefrontSize32 || !*EnableWavefrontSize32) {
2717 COMPUTE_PGM_RSRC3_GFX10_GFX11_SHARED_VGPR_COUNT);
2720 "SHARED_VGPR_COUNT",
2721 COMPUTE_PGM_RSRC3_GFX10_GFX11_SHARED_VGPR_COUNT);
2725 "COMPUTE_PGM_RSRC3",
2726 "must be zero on gfx12+");
2732 COMPUTE_PGM_RSRC3_GFX11_INST_PREF_SIZE);
2734 COMPUTE_PGM_RSRC3_GFX11_TRAP_ON_START);
2736 COMPUTE_PGM_RSRC3_GFX11_TRAP_ON_END);
2739 COMPUTE_PGM_RSRC3_GFX12_PLUS_INST_PREF_SIZE);
2742 "COMPUTE_PGM_RSRC3",
2743 "must be zero on gfx10");
2748 "COMPUTE_PGM_RSRC3",
"must be zero on gfx10+");
2753 COMPUTE_PGM_RSRC3_GFX12_PLUS_GLG_EN);
2756 "COMPUTE_PGM_RSRC3",
2757 "must be zero on gfx10 or gfx11");
2763 COMPUTE_PGM_RSRC3_GFX125_NAMED_BAR_CNT);
2765 "ENABLE_DYNAMIC_VGPR", COMPUTE_PGM_RSRC3_GFX125_ENABLE_DYNAMIC_VGPR);
2767 COMPUTE_PGM_RSRC3_GFX125_TCP_SPLIT);
2769 "ENABLE_DIDT_THROTTLE",
2770 COMPUTE_PGM_RSRC3_GFX125_ENABLE_DIDT_THROTTLE);
2773 "COMPUTE_PGM_RSRC3",
2774 "must be zero on gfx10+");
2779 "COMPUTE_PGM_RSRC3",
"must be zero on gfx10+");
2784 COMPUTE_PGM_RSRC3_GFX11_PLUS_IMAGE_OP);
2787 "COMPUTE_PGM_RSRC3",
2788 "must be zero on gfx10");
2790 }
else if (FourByteBuffer) {
2792 std::errc::invalid_argument,
2793 "kernel descriptor COMPUTE_PGM_RSRC3 must be all zero before gfx9");
2797#undef PRINT_PSEUDO_DIRECTIVE_COMMENT
2798#undef PRINT_DIRECTIVE
2800#undef CHECK_RESERVED_BITS_IMPL
2801#undef CHECK_RESERVED_BITS
2802#undef CHECK_RESERVED_BITS_MSG
2803#undef CHECK_RESERVED_BITS_DESC
2804#undef CHECK_RESERVED_BITS_DESC_MSG
2809 const char *
Msg =
"") {
2811 std::errc::invalid_argument,
"kernel descriptor reserved %s set%s%s",
2818 unsigned WidthInBytes) {
2822 std::errc::invalid_argument,
2823 "kernel descriptor reserved bits in range (%u:%u) set",
2824 (BaseInBytes + WidthInBytes) * CHAR_BIT - 1, BaseInBytes * CHAR_BIT);
2830#define PRINT_DIRECTIVE(DIRECTIVE, MASK) \
2832 KdStream << Indent << DIRECTIVE " " \
2833 << ((TwoByteBuffer & MASK) >> (MASK##_SHIFT)) << '\n'; \
2842 assert(Bytes.size() == 64);
2845 switch (Cursor.tell()) {
2847 FourByteBuffer = DE.
getU32(Cursor);
2848 KdStream << Indent <<
".amdhsa_group_segment_fixed_size " << FourByteBuffer
2853 FourByteBuffer = DE.
getU32(Cursor);
2854 KdStream << Indent <<
".amdhsa_private_segment_fixed_size "
2855 << FourByteBuffer <<
'\n';
2859 FourByteBuffer = DE.
getU32(Cursor);
2860 KdStream << Indent <<
".amdhsa_kernarg_size "
2861 << FourByteBuffer <<
'\n';
2866 ReservedBytes = DE.
getBytes(Cursor, 4);
2867 for (
char B : ReservedBytes) {
2882 ReservedBytes = DE.
getBytes(Cursor, 20);
2883 for (
char B : ReservedBytes) {
2890 FourByteBuffer = DE.
getU32(Cursor);
2894 FourByteBuffer = DE.
getU32(Cursor);
2898 FourByteBuffer = DE.
getU32(Cursor);
2903 TwoByteBuffer = DE.
getU16(Cursor);
2907 KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER);
2909 KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_PTR);
2911 KERNEL_CODE_PROPERTY_ENABLE_SGPR_QUEUE_PTR);
2913 KERNEL_CODE_PROPERTY_ENABLE_SGPR_KERNARG_SEGMENT_PTR);
2915 KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_ID);
2918 KERNEL_CODE_PROPERTY_ENABLE_SGPR_FLAT_SCRATCH_INIT);
2920 KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE);
2922 if (TwoByteBuffer & KERNEL_CODE_PROPERTY_RESERVED0)
2928 (TwoByteBuffer & KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32)) {
2930 KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32,
2935 KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32);
2940 KERNEL_CODE_PROPERTY_USES_DYNAMIC_STACK);
2942 if (TwoByteBuffer & KERNEL_CODE_PROPERTY_RESERVED1) {
2951 TwoByteBuffer = DE.
getU16(Cursor);
2952 if (TwoByteBuffer & KERNARG_PRELOAD_SPEC_LENGTH) {
2954 KERNARG_PRELOAD_SPEC_LENGTH);
2957 if (TwoByteBuffer & KERNARG_PRELOAD_SPEC_OFFSET) {
2959 KERNARG_PRELOAD_SPEC_OFFSET);
2965 ReservedBytes = DE.
getBytes(Cursor, 4);
2966 for (
char B : ReservedBytes) {
2976#undef PRINT_DIRECTIVE
2983 if (Bytes.size() != 64 || KdAddress % 64 != 0)
2985 "kernel descriptor must be 64-byte aligned");
2996 EnableWavefrontSize32 =
2998 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32);
3003 KdStream <<
".amdhsa_kernel " << KdName <<
'\n';
3006 while (
C &&
C.tell() < Bytes.size()) {
3014 KdStream <<
".end_amdhsa_kernel\n";
3033 "code object v2 is not supported");
3046const MCExpr *AMDGPUDisassembler::createConstantSymbolExpr(
StringRef Id,
3049 MCSymbol *Sym = Ctx.getOrCreateSymbol(Id);
3057 if (!Valid || Res != Val)
3058 Ctx.reportWarning(
SMLoc(),
"unsupported redefinition of " + Id);
3083 uint64_t ,
bool IsBranch, uint64_t ,
3084 uint64_t , uint64_t ) {
3095 return Val.
Addr ==
static_cast<uint64_t
>(
Value) &&
3098 if (Result != Symbols->end()) {
3099 auto *Sym =
Ctx.getOrCreateSymbol(Result->Name);
3105 ReferencedAddresses.push_back(
static_cast<uint64_t
>(
Value));
3124 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 VOPModifiers collectVOPModifiers(const MCInst &MI, bool IsVOP3P=false)
static int insertNamedMCOperand(MCInst &MI, const MCOperand &Op, AMDGPU::OpName Name)
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 decodeOperand_VSrcT16(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder)
static Error createReservedKDBytesError(unsigned BaseInBytes, unsigned WidthInBytes)
Create an error object to return from onSymbolStart for reserved kernel descriptor bytes being set.
static DecodeStatus decodeSplitBarrier(MCInst &Inst, unsigned Val, uint64_t Addr, const MCDisassembler *Decoder)
static DecodeStatus decodeAV10(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder)
static bool adjustMFMA_F8F6F4OpRegClass(const MCRegisterInfo &MRI, MCOperand &MO, uint8_t NumRegs)
Adjust the register values used by V_MFMA_F8F6F4_f8_f8 instructions to the appropriate subregister fo...
#define CHECK_RESERVED_BITS_DESC_MSG(MASK, DESC, MSG)
static Error createReservedKDBitsError(uint32_t Mask, unsigned BaseBytes, const char *Msg="")
Create an error object to return from onSymbolStart for reserved kernel descriptor bits being set.
This file contains declaration for AMDGPU ISA disassembler.
Provides AMDGPU specific target descriptions.
static cl::opt< bool > XnackSetting("amdgpu-xnack", cl::desc("Force amdgpu.xnack value for testing"), cl::ReallyHidden)
AMDHSA kernel descriptor definitions.
#define AMDHSA_BITS_GET(SRC, MSK)
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_EXTERNAL_VISIBILITY
Interface definition for SIRegisterInfo.
std::optional< unsigned > getSgprClassId(unsigned Width) const
Return the SGPR/TTMP register class accepted by source decoding for Width, or std::nullopt if that wi...
MCOperand decodeNonVGPRSrcOp(const MCInst &Inst, unsigned Width, unsigned Val) const
MCOperand decodeLiteral64Constant() const
void convertVOPC64DPPInst(MCInst &MI) const
bool isBufferInstruction(const MCInst &MI) const
Check if the instruction is a buffer operation (MUBUF, MTBUF, or S_BUFFER)
bool hasKernargPreload() const
void convertEXPInst(MCInst &MI) const
MCOperand decodeSpecialReg64(unsigned Val) const
const char * getRegClassName(unsigned RegClassID) const
Expected< bool > decodeCOMPUTE_PGM_RSRC1(uint32_t FourByteBuffer, raw_string_ostream &KdStream) const
Decode as directives that handle COMPUTE_PGM_RSRC1.
MCOperand decodeSplitBarrier(const MCInst &Inst, unsigned Val) const
Expected< bool > decodeKernelDescriptorDirective(DataExtractor::Cursor &Cursor, ArrayRef< uint8_t > Bytes, raw_string_ostream &KdStream) const
void convertVOPCDPPInst(MCInst &MI) const
bool isGFX1250Plus() const
MCOperand decodeSpecialReg96Plus(unsigned Val) const
MCOperand decodeSDWASrc32(unsigned Val) const
void setABIVersion(unsigned Version) override
ELF-specific, set the ABI version from the object header.
Expected< bool > decodeCOMPUTE_PGM_RSRC2(uint32_t FourByteBuffer, raw_string_ostream &KdStream) const
Decode as directives that handle COMPUTE_PGM_RSRC2.
unsigned getAgprClassId(unsigned Width) const
MCOperand decodeDpp8FI(unsigned Val) const
MCOperand decodeSDWASrc(unsigned Width, unsigned Val) const
void convertFMAanyK(MCInst &MI) const
DecodeStatus tryDecodeInst(const uint8_t *Table, MCInst &MI, InsnType Inst, uint64_t Address, raw_ostream &Comments) const
void convertMacDPPInst(MCInst &MI) const
MCOperand decodeVOPDDstYOp(MCInst &Inst, unsigned Val) const
void convertDPP8Inst(MCInst &MI) const
MCOperand createVGPR16Operand(unsigned RegIdx, bool IsHi) const
MCOperand errOperand(unsigned V, const Twine &ErrMsg) const
MCOperand decodeVersionImm(unsigned Imm) const
Expected< bool > decodeKernelDescriptor(StringRef KdName, ArrayRef< uint8_t > Bytes, uint64_t KdAddress) const
void convertVOP3DPPInst(MCInst &MI) const
void convertTrue16OpSel(MCInst &MI) const
MCOperand decodeSrcOp(const MCInst &Inst, unsigned Width, unsigned Val) const
bool convertMAIInst(MCInst &MI) const
f8f6f4 instructions have different pseudos depending on the used formats.
MCOperand decodeMandatoryLiteralConstant(unsigned Imm) const
MCOperand decodeLiteralConstant(const MCInstrDesc &Desc, const MCOperandInfo &OpDesc) const
Expected< bool > decodeCOMPUTE_PGM_RSRC3(uint32_t FourByteBuffer, raw_string_ostream &KdStream) const
Decode as directives that handle COMPUTE_PGM_RSRC3.
AMDGPUDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx, MCInstrInfo const *MCII)
MCOperand decodeSpecialReg32(unsigned Val) const
MCOperand createRegOperand(MCRegister Reg) const
MCOperand decodeSDWAVopcDst(unsigned Val) const
void convertVINTERPInst(MCInst &MI) const
void convertSDWAInst(MCInst &MI) const
static MCOperand decodeIntImmed(unsigned Imm)
MCOperand decodeBoolReg(const MCInst &Inst, unsigned Val) const
void emitTargetIDIfSupported(raw_ostream &OS, unsigned EFlags) const override
Emit something based on ELF's e_flags if the target needs to.
unsigned getVgprClassId(unsigned Width) const
bool hasArchitectedFlatScratch() const
DecodeStatus getInstruction(MCInst &MI, uint64_t &Size, ArrayRef< uint8_t > Bytes, uint64_t Address, raw_ostream &CS) const override
Returns the disassembly of a single instruction.
std::optional< unsigned > getTtmpClassId(unsigned Width) const
MCOperand decodeMandatoryLiteral64Constant(uint64_t Imm) const
void convertMIMGInst(MCInst &MI) const
bool isMacDPP(MCInst &MI) const
int getTTmpIdx(unsigned Val) const
void convertVOP3PDPPInst(MCInst &MI) const
bool convertWMMAInst(MCInst &MI) const
MCOperand createSRegOperand(unsigned SRegClassID, unsigned Val) const
MCOperand decodeSDWASrc16(unsigned Val) const
Expected< bool > onSymbolStart(SymbolInfoTy &Symbol, uint64_t &Size, ArrayRef< uint8_t > Bytes, uint64_t Address) const override
Used to perform separate target specific disassembly for a particular symbol.
static const AMDGPUMCExpr * createLit(LitModifier Lit, int64_t Value, MCContext &Ctx)
bool tryAddingSymbolicOperand(MCInst &Inst, raw_ostream &cStream, int64_t Value, uint64_t Address, bool IsBranch, uint64_t Offset, uint64_t OpSize, uint64_t InstSize) override
Try to add a symbolic operand instead of Value to the MCInst.
void tryAddingPcLoadReferenceComment(raw_ostream &cStream, int64_t Value, uint64_t Address) override
Try to add a comment on the PC-relative load.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
ArrayRef< T > slice(size_t N, size_t M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array.
Lightweight error class with error context and mandatory checking.
Tagged union holding either a T or a Error.
static const MCBinaryExpr * createOr(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
static LLVM_ABI const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
Context object for machine code objects.
const MCRegisterInfo * getRegisterInfo() const
Superclass for all disassemblers.
MCDisassembler(const MCSubtargetInfo &STI, MCContext &Ctx)
MCContext & getContext() const
const MCSubtargetInfo & STI
raw_ostream * CommentStream
DecodeStatus
Ternary decode status.
Base class for the full range of assembler expressions which are needed for parsing.
Instances of this class represent a single low-level machine instruction.
unsigned getOpcode() const
void addOperand(const MCOperand Op)
const MCOperand & getOperand(unsigned i) const
Describe properties that are true of each instruction in the target description file.
Interface to description of machine instruction set.
This holds information about one operand of a machine instruction, indicating the register class for ...
uint8_t OperandType
Information about the type of the operand.
Instances of this class represent operands of the MCInst class.
static MCOperand createExpr(const MCExpr *Val)
static MCOperand createReg(MCRegister Reg)
static MCOperand createImm(int64_t Val)
void setReg(MCRegister Reg)
Set the register number.
MCRegister getReg() const
Returns the register number.
MCRegisterClass - Base class of TargetRegisterClass.
MCRegister getRegister(unsigned i) const
getRegister - Return the specified register in the class.
unsigned getSizeInBits() const
Return the size of the physical register in bits if we are able to determine it.
bool contains(MCRegister Reg) const
contains - Return true if the specified register is included in this register class.
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
MCRegister getMatchingSuperReg(MCRegister Reg, unsigned SubIdx, const MCRegisterClass *RC) const
Return a super-register of the specified register Reg so its sub-register of index SubIdx is Reg.
const char * getRegClassName(const MCRegisterClass *Class) const
const MCRegisterClass & getRegClass(unsigned i) const
Returns the register class associated with the enumeration value.
MCRegister getSubReg(MCRegister Reg, unsigned Idx) const
Returns the physical register number of sub-register "Index" for physical register RegNo.
Wrapper class representing physical registers. Should be passed by value.
Generic base class for all target subtargets.
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx, SMLoc Loc=SMLoc())
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
bool isVariable() const
isVariable - Check if this is a variable symbol.
LLVM_ABI void setVariableValue(const MCExpr *Value)
const MCExpr * getVariableValue() const
Get the expression of the variable symbol.
Symbolize and annotate disassembled instructions.
Represents a location in source code.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Represent a constant reference to a string, i.e.
Target - Wrapper for Target specific information.
Triple - Helper class for working with autoconf configuration names.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
LLVM Value Representation.
This class implements an extremely fast bulk output stream that can only output to a stream.
A raw_ostream that writes to an std::string.
std::string & str()
Returns the string's reference.
A raw_ostream that writes to an SmallVector or SmallString.
const char *(* LLVMSymbolLookupCallback)(void *DisInfo, uint64_t ReferenceValue, uint64_t *ReferenceType, uint64_t ReferencePC, const char **ReferenceName)
The type for the symbol lookup function.
int(* LLVMOpInfoCallback)(void *DisInfo, uint64_t PC, uint64_t Offset, uint64_t OpSize, uint64_t InstSize, int TagType, void *TagBuf)
The type for the operand information call back function.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned getVGPREncodingGranule(const MCSubtargetInfo &STI, std::optional< bool > EnableWavefrontSize32)
unsigned getSGPREncodingGranule(const MCSubtargetInfo &STI)
ArrayRef< GFXVersion > getGFXVersions()
bool isInlinableLiteralBF16(int16_t Literal, bool HasInv2Pi)
EncodingField< Bit, Bit, D > EncodingBit
bool isPKFMACF16InlineConstant(uint32_t Literal, bool IsGFX11Plus)
LLVM_READONLY const MIMGInfo * getMIMGInfo(unsigned Opc)
bool isInlinableLiteralFP16(int16_t Literal, bool HasInv2Pi)
MCRegister getMCReg(MCRegister Reg, const MCSubtargetInfo &STI)
If Reg is a pseudo reg, return the correct hardware register given STI otherwise return Reg.
int getMIMGOpcode(unsigned BaseOpcode, unsigned MIMGEncoding, unsigned VDataDwords, unsigned VAddrDwords)
bool isInlinableLiteralV2I16(uint32_t Literal)
bool isGFX10(const MCSubtargetInfo &STI)
bool isInlinableLiteralV2BF16(uint32_t Literal)
bool isGFX12Plus(const MCSubtargetInfo &STI)
bool hasPackedD16(const MCSubtargetInfo &STI)
bool isInlinableLiteralV2F16(uint32_t Literal)
bool getSMEMIsBuffer(unsigned Opc)
bool isGFX13(const MCSubtargetInfo &STI)
bool isVOPC64DPP(unsigned Opc)
bool hasPrivateApertureRegs(const MCSubtargetInfo &STI)
unsigned getAMDHSACodeObjectVersion(const Module &M)
LLVM_READONLY bool hasNamedOperand(uint64_t Opcode, OpName NamedIdx)
bool isGFX9(const MCSubtargetInfo &STI)
LLVM_READONLY const MIMGDimInfo * getMIMGDimInfoByEncoding(uint8_t DimEnc)
bool isInlinableLiteral32(int32_t Literal, bool HasInv2Pi)
const MFMA_F8F6F4_Info * getWMMA_F8F6F4_WithFormatArgs(unsigned FmtA, unsigned FmtB, unsigned F8F8Opcode)
bool hasG16(const MCSubtargetInfo &STI)
unsigned getAddrSizeMIMGOp(const MIMGBaseOpcodeInfo *BaseOpcode, const MIMGDimInfo *Dim, bool IsA16, bool IsG16Supported)
bool isGFX13Plus(const MCSubtargetInfo &STI)
bool isGFX11Plus(const MCSubtargetInfo &STI)
bool isGFX10Plus(const MCSubtargetInfo &STI)
@ OPERAND_KIMM32
Operand with 32-bit immediate that uses the constant bus.
@ OPERAND_REG_INLINE_C_FP64
@ OPERAND_REG_INLINE_C_BF16
@ OPERAND_REG_INLINE_C_V2BF16
@ OPERAND_REG_IMM_V2INT64
@ OPERAND_REG_IMM_V2INT16
@ OPERAND_REG_IMM_INT32
Operands with register, 32-bit, or 64-bit immediate.
@ OPERAND_REG_IMM_V2FP16_SPLAT
@ OPERAND_REG_INLINE_C_INT64
@ OPERAND_REG_INLINE_C_INT16
Operands with register or inline constant.
@ OPERAND_REG_IMM_NOINLINE_V2FP16
@ OPERAND_REG_INLINE_C_V2FP16
@ OPERAND_REG_INLINE_AC_INT32
Operands with an AccVGPR register or inline constant.
@ OPERAND_REG_INLINE_AC_FP32
@ OPERAND_REG_IMM_V2INT32
@ OPERAND_REG_INLINE_C_FP32
@ OPERAND_REG_INLINE_C_INT32
@ OPERAND_REG_INLINE_C_V2INT16
@ OPERAND_REG_INLINE_AC_FP64
@ OPERAND_REG_INLINE_C_FP16
bool hasGDS(const MCSubtargetInfo &STI)
bool isGFX9Plus(const MCSubtargetInfo &STI)
bool isVOPD(unsigned Opc)
bool isGFX1250(const MCSubtargetInfo &STI)
unsigned hasKernargPreload(const MCSubtargetInfo &STI)
LLVM_READONLY const MIMGBaseOpcodeInfo * getMIMGBaseOpcodeInfo(unsigned BaseOpcode)
bool isGFX1250Plus(const MCSubtargetInfo &STI)
bool hasPopsExitingWaveID(const MCSubtargetInfo &STI)
bool isInlinableLiteralI16(int32_t Literal, bool HasInv2Pi)
bool hasVOPD(const MCSubtargetInfo &STI)
bool isInlinableLiteral64(int64_t Literal, bool HasInv2Pi)
Is this literal inlinable.
const MFMA_F8F6F4_Info * getMFMA_F8F6F4_WithFormatArgs(unsigned CBSZ, unsigned BLGP, unsigned F8F8Opcode)
@ EF_AMDGPU_FEATURE_XNACK_ANY_V4
@ EF_AMDGPU_FEATURE_SRAMECC_UNSUPPORTED_V4
@ EF_AMDGPU_FEATURE_SRAMECC_OFF_V4
@ EF_AMDGPU_FEATURE_XNACK_UNSUPPORTED_V4
@ EF_AMDGPU_FEATURE_XNACK_OFF_V4
@ EF_AMDGPU_FEATURE_XNACK_V4
@ EF_AMDGPU_FEATURE_SRAMECC_V4
@ EF_AMDGPU_FEATURE_XNACK_ON_V4
@ EF_AMDGPU_FEATURE_SRAMECC_ANY_V4
@ EF_AMDGPU_FEATURE_SRAMECC_ON_V4
constexpr bool isAtomicRet(const T &...O)
constexpr bool isVOPC(const T &...O)
constexpr bool isVOP3(const T &...O)
constexpr bool isMAI(const T &...O)
constexpr bool isFLAT(const T &...O)
constexpr bool isVOP3P(const T &...O)
constexpr bool isBuffer(const T &...O)
constexpr bool isVIMAGE(const T &...O)
constexpr bool isSMRD(const T &...O)
constexpr bool isVOP3Like(const T &...O)
constexpr bool isMIMG(const T &...O)
constexpr bool isWMMA(const T &...O)
constexpr bool isMUBUF(const T &...O)
constexpr bool isSDWA(const T &...O)
constexpr bool isEXP(const T &...O)
constexpr bool isSOPK(const T &...O)
constexpr bool isVINTERP(const T &...O)
constexpr bool isVSAMPLE(const T &...O)
constexpr bool isDS(const T &...O)
constexpr bool isGather4(const T &...O)
constexpr bool isDPP(const T &...O)
@ KERNEL_CODE_PROPERTIES_OFFSET
@ GROUP_SEGMENT_FIXED_SIZE_OFFSET
@ COMPUTE_PGM_RSRC3_OFFSET
@ KERNEL_CODE_ENTRY_BYTE_OFFSET_OFFSET
@ COMPUTE_PGM_RSRC1_OFFSET
@ COMPUTE_PGM_RSRC2_OFFSET
@ PRIVATE_SEGMENT_FIXED_SIZE_OFFSET
value_type read(const void *memory, endianness endian)
Read a value of a particular endianness from memory.
uint16_t read16(const void *P, endianness E)
This is an optimization pass for GlobalISel generic memory operations.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
LLVM_ABI raw_fd_ostream & outs()
This returns a reference to a raw_fd_ostream for standard output.
SmallVectorImpl< T >::const_pointer c_str(SmallVectorImpl< T > &str)
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
constexpr int popcount(T Value) noexcept
Count the number of set bits in a value.
int countr_zero(T Val)
Count number of 0's from the least significant bit to the most stopping at the first 1.
MachineInstr * getImm(const MachineOperand &MO, const MachineRegisterInfo *MRI)
constexpr uint32_t Hi_32(uint64_t Value)
Return the high 32 bits of a 64 bit value.
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
void cantFail(Error Err, const char *Msg=nullptr)
Report a fatal error if Err is a failure value.
Target & getTheGCNTarget()
The target for GCN GPUs.
To bit_cast(const From &from) noexcept
DWARFExpression::Operation Op
unsigned M0(unsigned Val)
auto find_if(R &&Range, UnaryPredicate P)
Provide wrappers to std::find_if which take ranges instead of having to pass begin/end explicitly.
Target & getTheGCNLegacyTarget()
The target for GCN GPUs, registered under the legacy "amdgcn" architecture name for use with -march.
std::vector< SymbolInfoTy > SectionSymbolsTy
constexpr int64_t SignExtend64(uint64_t x)
Sign-extend the number in the bottom B bits of X to a 64-bit integer.
LLVM_ABI void reportFatalUsageError(Error Err)
Report a fatal error that does not indicate a bug in LLVM.
static void RegisterMCSymbolizer(Target &T, Target::MCSymbolizerCtorTy Fn)
RegisterMCSymbolizer - Register an MCSymbolizer implementation for the given target.
static void RegisterMCDisassembler(Target &T, Target::MCDisassemblerCtorTy Fn)
RegisterMCDisassembler - Register a MCDisassembler implementation for the given target.