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>
259 return decodeSrcOp(Inst, 9, OpWidth, Imm, Imm, Decoder);
265template <
unsigned OpW
idth>
272 return decodeSrcOp(Inst, 9, OpWidth, Imm, Imm | 512, Decoder);
277template <
unsigned OpW
idth>
285 return decodeSrcOp(Inst, 10, OpWidth, Imm, Imm, Decoder);
293template <
unsigned OpW
idth>
297 return decodeSrcOp(Inst, 9, OpWidth, Imm, Imm, Decoder);
302template <
unsigned OpW
idth>
306 return decodeSrcOp(Inst, 9, OpWidth, Imm, Imm | 512, Decoder);
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));
432 uint64_t Addr,
const void *Decoder) {
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");
455 return addOperand(Inst, DAsm->decodeSrcOp(Inst, 64, Imm));
458#define DECODE_SDWA(DecName) \
459DECODE_OPERAND(decodeSDWA##DecName, decodeSDWA##DecName)
469 return addOperand(Inst, DAsm->decodeVersionImm(Imm));
472#include "AMDGPUGenDisassemblerTables.inc"
476template <>
constexpr uint32_t InsnBitWidth<uint32_t> = 32;
477template <>
constexpr uint32_t InsnBitWidth<uint64_t> = 64;
478template <>
constexpr uint32_t InsnBitWidth<std::bitset<96>> = 96;
479template <>
constexpr uint32_t InsnBitWidth<std::bitset<128>> = 128;
486template <
typename InsnType>
494 const auto SavedBytes = Bytes;
509 Comments << LocalComments;
516template <
typename InsnType>
521 for (
const uint8_t *
T : {Table1, Table2}) {
532 Bytes = Bytes.
slice(
sizeof(
T));
540 Bytes = Bytes.
slice(8);
542 Bytes = Bytes.
slice(4);
543 return (
Hi << 64) |
Lo;
550 Bytes = Bytes.
slice(8);
552 Bytes = Bytes.
slice(8);
553 return (
Hi << 64) |
Lo;
556bool AMDGPUDisassembler::decodeImmOperands(
MCInst &
MI,
558 const MCInstrDesc &
Desc = MCII.get(
MI.getOpcode());
560 if (OpNo >=
MI.getNumOperands())
570 MCOperand &
Op =
MI.getOperand(OpNo);
573 int64_t
Imm =
Op.getImm();
589 switch (OpDesc.OperandType) {
610 Imm = (F16Val << 16) | (F16Val & 0xFFFF);
638 unsigned MaxInstBytesNum = std::min((
size_t)TargetMaxInstBytes, Bytes_.
size());
639 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
643 Size = std::min((
size_t)4, Bytes_.
size());
655 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
690 if (
STI.hasFeature(AMDGPU::Feature64BitLiterals)) {
692 Bytes = Bytes_.
slice(4, MaxInstBytesNum - 4);
700 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
702 }
else if (Bytes.size() >= 16 &&
703 STI.hasFeature(AMDGPU::FeatureGFX950Insts)) {
709 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
712 if (Bytes.size() >= 8) {
715 if (
STI.hasFeature(AMDGPU::FeatureGFX10_BEncoding) &&
719 if (
STI.hasFeature(AMDGPU::FeatureUnpackedD16VMem) &&
723 if (
STI.hasFeature(AMDGPU::FeatureGFX950Insts) &&
730 if (
STI.hasFeature(AMDGPU::FeatureFmaMixInsts) &&
734 if (
STI.hasFeature(AMDGPU::FeatureGFX940Insts) &&
738 if (
STI.hasFeature(AMDGPU::FeatureGFX90AInsts) &&
790 Bytes = Bytes_.
slice(0, MaxInstBytesNum);
794 if (Bytes.size() >= 4) {
807 if (
STI.hasFeature(AMDGPU::FeatureGFX950Insts) &&
811 if (
STI.hasFeature(AMDGPU::FeatureGFX90AInsts) &&
815 if (
STI.hasFeature(AMDGPU::FeatureGFX10_BEncoding) &&
863 else if (AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::dpp8) !=
875 AMDGPU::OpName::src2_modifiers);
878 if (
MI.getOpcode() == AMDGPU::V_CVT_SR_BF8_F32_e64_dpp ||
879 MI.getOpcode() == AMDGPU::V_CVT_SR_FP8_F32_e64_dpp) {
882 AMDGPU::OpName::src2_modifiers);
891 int CPolPos = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
892 AMDGPU::OpName::cpol);
896 if (
MI.getNumOperands() <= (
unsigned)CPolPos) {
898 AMDGPU::OpName::cpol);
900 MI.getOperand(CPolPos).setImm(
MI.getOperand(CPolPos).getImm() | CPol);
906 (
STI.hasFeature(AMDGPU::FeatureGFX90AInsts))) {
909 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::tfe);
910 if (TFEOpIdx != -1) {
911 auto *TFEIter =
MI.begin();
912 std::advance(TFEIter, TFEOpIdx);
920 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::offset);
921 if (OffsetIdx != -1) {
922 uint32_t Imm =
MI.getOperand(OffsetIdx).getImm();
924 if (SignedOffset < 0)
931 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::swz);
932 if (SWZOpIdx != -1) {
933 auto *SWZIter =
MI.begin();
934 std::advance(SWZIter, SWZOpIdx);
942 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vaddr0);
944 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::srsrc);
945 unsigned NSAArgs = RsrcIdx - VAddr0Idx - 1;
946 if (VAddr0Idx >= 0 && NSAArgs > 0) {
947 unsigned NSAWords = (NSAArgs + 3) / 4;
948 if (Bytes.size() < 4 * NSAWords)
950 for (
unsigned i = 0; i < NSAArgs; ++i) {
951 const unsigned VAddrIdx = VAddr0Idx + 1 + i;
953 MCII->getOpRegClassID(
Desc.operands()[VAddrIdx], HwModeRegClass);
956 Bytes = Bytes.slice(4 * NSAWords);
980 int VDstIn_Idx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
981 AMDGPU::OpName::vdst_in);
982 if (VDstIn_Idx != -1) {
983 int Tied = MCII->get(
MI.getOpcode()).getOperandConstraint(VDstIn_Idx,
985 if (Tied != -1 && (
MI.getNumOperands() <= (
unsigned)VDstIn_Idx ||
986 !
MI.getOperand(VDstIn_Idx).isReg() ||
987 MI.getOperand(VDstIn_Idx).getReg() !=
MI.getOperand(Tied).getReg())) {
988 if (
MI.getNumOperands() > (
unsigned)VDstIn_Idx)
989 MI.erase(&
MI.getOperand(VDstIn_Idx));
992 AMDGPU::OpName::vdst_in);
1004 MCII->get(
MI.getOpcode()).getNumDefs() == 0 &&
1005 MCII->get(
MI.getOpcode()).hasImplicitDefOfPhysReg(AMDGPU::EXEC)) {
1006 auto ExecEncoding = MRI.getEncodingValue(AMDGPU::EXEC_LO);
1007 if (Bytes_[0] != ExecEncoding)
1011 Size = MaxInstBytesNum - Bytes.size();
1016 if (
STI.hasFeature(AMDGPU::FeatureGFX11Insts)) {
1026 if (
MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_t16_gfx11 ||
1027 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_fake16_gfx11 ||
1028 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_t16_gfx12 ||
1029 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_fake16_gfx12 ||
1030 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_t16_gfx13 ||
1031 MI.getOpcode() == AMDGPU::V_INTERP_P10_F16_F32_inreg_fake16_gfx13 ||
1032 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_t16_gfx11 ||
1033 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_fake16_gfx11 ||
1034 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_t16_gfx12 ||
1035 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_fake16_gfx12 ||
1036 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_t16_gfx13 ||
1037 MI.getOpcode() == AMDGPU::V_INTERP_P10_RTZ_F16_F32_inreg_fake16_gfx13 ||
1038 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_t16_gfx11 ||
1039 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_fake16_gfx11 ||
1040 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_t16_gfx12 ||
1041 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_fake16_gfx12 ||
1042 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_t16_gfx13 ||
1043 MI.getOpcode() == AMDGPU::V_INTERP_P2_F16_F32_inreg_fake16_gfx13 ||
1044 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_t16_gfx11 ||
1045 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_fake16_gfx11 ||
1046 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_t16_gfx12 ||
1047 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_fake16_gfx12 ||
1048 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_t16_gfx13 ||
1049 MI.getOpcode() == AMDGPU::V_INTERP_P2_RTZ_F16_F32_inreg_fake16_gfx13) {
1057 if (
STI.hasFeature(AMDGPU::FeatureGFX9) ||
1058 STI.hasFeature(AMDGPU::FeatureGFX10)) {
1062 }
else if (
STI.hasFeature(AMDGPU::FeatureVolcanicIslands)) {
1063 int SDst = AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::sdst);
1067 AMDGPU::OpName::sdst);
1092 NewReg = MRI.
getSubReg(MO.
getReg(), AMDGPU::sub0_sub1_sub2_sub3_sub4_sub5);
1096 AMDGPU::sub0_sub1_sub2_sub3_sub4_sub5_sub6_sub7);
1106 BaseReg, AMDGPU::sub0, &MRI.
getRegClass(AMDGPU::VReg_384RegClassID));
1130 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::blgp);
1135 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::cbsz);
1137 unsigned CBSZ =
MI.getOperand(CbszIdx).getImm();
1138 unsigned BLGP =
MI.getOperand(BlgpIdx).getImm();
1142 if (!AdjustedRegClassOpcode ||
1143 AdjustedRegClassOpcode->
Opcode ==
MI.getOpcode())
1146 MI.setOpcode(AdjustedRegClassOpcode->
Opcode);
1148 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src0);
1150 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src1);
1159 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::matrix_a_fmt);
1164 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::matrix_b_fmt);
1166 unsigned FmtA =
MI.getOperand(FmtAIdx).getImm();
1167 unsigned FmtB =
MI.getOperand(FmtBIdx).getImm();
1171 if (!AdjustedRegClassOpcode ||
1172 AdjustedRegClassOpcode->
Opcode ==
MI.getOpcode())
1175 MI.setOpcode(AdjustedRegClassOpcode->
Opcode);
1177 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src0);
1179 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::src1);
1197 bool IsVOP3P =
false) {
1199 unsigned Opc =
MI.getOpcode();
1200 const AMDGPU::OpName ModOps[] = {AMDGPU::OpName::src0_modifiers,
1201 AMDGPU::OpName::src1_modifiers,
1202 AMDGPU::OpName::src2_modifiers};
1203 for (
int J = 0; J < 3; ++J) {
1204 int OpIdx = AMDGPU::getNamedOperandIdx(
Opc, ModOps[J]);
1208 unsigned Val =
MI.getOperand(OpIdx).getImm();
1215 }
else if (J == 0) {
1226 const unsigned Opc =
MI.getOpcode();
1228 MRI.getRegClass(AMDGPU::VGPR_16RegClassID);
1229 constexpr std::array<std::tuple<AMDGPU::OpName, AMDGPU::OpName, unsigned>, 4>
1230 OpAndOpMods = {{{AMDGPU::OpName::src0, AMDGPU::OpName::src0_modifiers,
1232 {AMDGPU::OpName::src1, AMDGPU::OpName::src1_modifiers,
1234 {AMDGPU::OpName::src2, AMDGPU::OpName::src2_modifiers,
1236 {AMDGPU::OpName::vdst, AMDGPU::OpName::src0_modifiers,
1238 for (
const auto &[
OpName, OpModsName, OpSelMask] : OpAndOpMods) {
1239 int OpIdx = AMDGPU::getNamedOperandIdx(
Opc,
OpName);
1240 int OpModsIdx = AMDGPU::getNamedOperandIdx(
Opc, OpModsName);
1241 if (OpIdx == -1 || OpModsIdx == -1)
1248 unsigned OpEnc = MRI.getEncodingValue(
Op.getReg());
1249 const MCOperand &OpMods =
MI.getOperand(OpModsIdx);
1250 unsigned ModVal = OpMods.
getImm();
1251 if (ModVal & OpSelMask) {
1261 constexpr int DST_IDX = 0;
1262 auto Opcode =
MI.getOpcode();
1263 const auto &
Desc = MCII->get(Opcode);
1264 auto OldIdx = AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::old);
1266 if (OldIdx != -1 &&
Desc.getOperandConstraint(
1270 AMDGPU::getNamedOperandIdx(Opcode, AMDGPU::OpName::src2),
1281 assert(
MI.getNumOperands() + 1 < MCII->get(
MI.getOpcode()).getNumOperands());
1284 AMDGPU::OpName::src2_modifiers);
1288 unsigned Opc =
MI.getOpcode();
1291 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vdst_in);
1292 if (VDstInIdx != -1)
1295 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1296 if (
MI.getNumOperands() < DescNumOps &&
1301 AMDGPU::OpName::op_sel);
1304 if (
MI.getNumOperands() < DescNumOps &&
1307 AMDGPU::OpName::src0_modifiers);
1309 if (
MI.getNumOperands() < DescNumOps &&
1312 AMDGPU::OpName::src1_modifiers);
1320 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vdst_in);
1321 if (VDstInIdx != -1)
1324 unsigned Opc =
MI.getOpcode();
1325 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1326 if (
MI.getNumOperands() < DescNumOps &&
1330 AMDGPU::OpName::op_sel);
1345 BaseReg = AMDGPU::VGPR0;
1347 BaseReg = AMDGPU::AGPR0;
1349 assert(BaseReg &&
"Only vector registers expected");
1351 return (Sub0 - BaseReg + NumRegs <= 256) ?
Reg :
MCRegister();
1358 int VDstIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1359 AMDGPU::OpName::vdst);
1361 int VDataIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1362 AMDGPU::OpName::vdata);
1364 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::vaddr0);
1366 ? AMDGPU::OpName::srsrc
1367 : AMDGPU::OpName::rsrc;
1368 int RsrcIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(), RsrcOpName);
1369 int DMaskIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1370 AMDGPU::OpName::dmask);
1372 int TFEIdx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1373 AMDGPU::OpName::tfe);
1374 int D16Idx = AMDGPU::getNamedOperandIdx(
MI.getOpcode(),
1375 AMDGPU::OpName::d16);
1382 if (BaseOpcode->
BVH) {
1388 bool IsAtomic = (VDstIdx != -1);
1392 bool IsPartialNSA =
false;
1393 unsigned AddrSize = Info->VAddrDwords;
1397 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::dim);
1399 AMDGPU::getNamedOperandIdx(
MI.getOpcode(), AMDGPU::OpName::a16);
1402 const bool IsA16 = (A16Idx != -1 &&
MI.getOperand(A16Idx).
getImm());
1409 IsNSA = Info->MIMGEncoding == AMDGPU::MIMGEncGfx10NSA ||
1410 Info->MIMGEncoding == AMDGPU::MIMGEncGfx11NSA ||
1411 Info->MIMGEncoding == AMDGPU::MIMGEncGfx12 ||
1412 Info->MIMGEncoding == AMDGPU::MIMGEncGfx13;
1414 if (!IsVSample && AddrSize > 12)
1417 if (AddrSize > Info->VAddrDwords) {
1418 if (!
STI.hasFeature(AMDGPU::FeaturePartialNSAEncoding)) {
1423 IsPartialNSA =
true;
1428 unsigned DMask =
MI.getOperand(DMaskIdx).getImm() & 0xf;
1429 unsigned DstSize = IsGather4 ? 4 : std::max(
llvm::popcount(DMask), 1);
1431 bool D16 = D16Idx >= 0 &&
MI.getOperand(D16Idx).getImm();
1433 DstSize = (DstSize + 1) / 2;
1436 if (TFEIdx != -1 &&
MI.getOperand(TFEIdx).getImm())
1439 if (DstSize == Info->VDataDwords && AddrSize == Info->VAddrDwords)
1444 if (NewOpcode == -1)
1449 if (DstSize != Info->VDataDwords) {
1450 auto DataRCID = MCII->getOpRegClassID(
1451 MCII->get(NewOpcode).operands()[VDataIdx], HwModeRegClass);
1455 MCRegister VdataSub0 = MRI.getSubReg(Vdata0, AMDGPU::sub0);
1456 Vdata0 = (VdataSub0 != 0)? VdataSub0 : Vdata0;
1459 NewVdata = MRI.getMatchingSuperReg(Vdata0, AMDGPU::sub0, &NewRC);
1470 int VAddrSAIdx = IsPartialNSA ? (RsrcIdx - 1) : VAddr0Idx;
1472 if (
STI.hasFeature(AMDGPU::FeatureNSAEncoding) && (!IsNSA || IsPartialNSA) &&
1473 AddrSize != Info->VAddrDwords) {
1474 MCRegister VAddrSA =
MI.getOperand(VAddrSAIdx).getReg();
1475 MCRegister VAddrSubSA = MRI.getSubReg(VAddrSA, AMDGPU::sub0);
1476 VAddrSA = VAddrSubSA ? VAddrSubSA : VAddrSA;
1478 auto AddrRCID = MCII->getOpRegClassID(
1479 MCII->get(NewOpcode).operands()[VAddrSAIdx], HwModeRegClass);
1482 NewVAddrSA = MRI.getMatchingSuperReg(VAddrSA, AMDGPU::sub0, &NewRC);
1488 MI.setOpcode(NewOpcode);
1490 if (NewVdata != AMDGPU::NoRegister) {
1502 assert(AddrSize <= Info->VAddrDwords);
1503 MI.erase(
MI.begin() + VAddr0Idx + AddrSize,
1504 MI.begin() + VAddr0Idx + Info->VAddrDwords);
1512 unsigned Opc =
MI.getOpcode();
1513 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1516 if (
MI.getNumOperands() < DescNumOps &&
1520 if (
MI.getNumOperands() < DescNumOps &&
1523 AMDGPU::OpName::op_sel);
1524 if (
MI.getNumOperands() < DescNumOps &&
1527 AMDGPU::OpName::op_sel_hi);
1528 if (
MI.getNumOperands() < DescNumOps &&
1531 AMDGPU::OpName::neg_lo);
1532 if (
MI.getNumOperands() < DescNumOps &&
1535 AMDGPU::OpName::neg_hi);
1540 unsigned Opc =
MI.getOpcode();
1541 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1543 if (
MI.getNumOperands() < DescNumOps &&
1547 if (
MI.getNumOperands() < DescNumOps &&
1550 AMDGPU::OpName::src0_modifiers);
1552 if (
MI.getNumOperands() < DescNumOps &&
1555 AMDGPU::OpName::src1_modifiers);
1559 unsigned Opc =
MI.getOpcode();
1560 unsigned DescNumOps = MCII->get(
Opc).getNumOperands();
1564 if (
MI.getNumOperands() < DescNumOps &&
1568 AMDGPU::OpName::op_sel);
1573 assert(HasLiteral &&
"Should have decoded a literal");
1579 &getAMDGPUMCRegisterClass(RegClassID));
1584 const Twine& ErrMsg)
const {
1598 unsigned Val)
const {
1599 const auto &RegCl = getAMDGPUMCRegisterClass(RegClassID);
1600 if (Val >= RegCl.getNumRegs())
1602 ": unknown register " +
Twine(Val));
1608 unsigned Val)
const {
1612 switch (SRegClassID) {
1613 case AMDGPU::SGPR_32RegClassID:
1614 case AMDGPU::TTMP_32RegClassID:
1616 case AMDGPU::SGPR_64RegClassID:
1617 case AMDGPU::TTMP_64RegClassID:
1620 case AMDGPU::SGPR_96RegClassID:
1621 case AMDGPU::TTMP_96RegClassID:
1622 case AMDGPU::SGPR_128RegClassID:
1623 case AMDGPU::TTMP_128RegClassID:
1626 case AMDGPU::SGPR_256RegClassID:
1627 case AMDGPU::TTMP_256RegClassID:
1630 case AMDGPU::SGPR_288RegClassID:
1631 case AMDGPU::TTMP_288RegClassID:
1632 case AMDGPU::SGPR_320RegClassID:
1633 case AMDGPU::TTMP_320RegClassID:
1634 case AMDGPU::SGPR_352RegClassID:
1635 case AMDGPU::TTMP_352RegClassID:
1636 case AMDGPU::SGPR_384RegClassID:
1637 case AMDGPU::TTMP_384RegClassID:
1638 case AMDGPU::SGPR_512RegClassID:
1639 case AMDGPU::TTMP_512RegClassID:
1648 if (Val % (1 << shift)) {
1650 <<
": scalar reg isn't aligned " << Val;
1658 unsigned RegIdxInVGPR16 = RegIdx * 2 + (IsHi ? 1 : 0);
1668 "Should only decode multiple kimm with VOPD, check VSrc operand types");
1670 return errOperand(Val,
"More than one unique literal is illegal");
1681 return errOperand(Val,
"More than one unique literal is illegal");
1686 bool UseLit64 =
Hi_32(Literal) == 0;
1699 if (Bytes.size() < 4) {
1700 return errOperand(0,
"cannot read literal, inst bytes left " +
1701 Twine(Bytes.size()));
1708 bool HasInv2Pi =
true;
1712 int64_t Val = Literal;
1713 bool UseLit =
false;
1784 assert(
STI.hasFeature(AMDGPU::Feature64BitLiterals));
1787 if (Bytes.size() < 8) {
1788 return errOperand(0,
"cannot read literal64, inst bytes left " +
1789 Twine(Bytes.size()));
1795 bool UseLit64 =
Hi_32(Literal) == 0;
1798 Literal,
STI.hasFeature(AMDGPU::FeatureInv2PiInlineImm));
1808 assert(Imm >= INLINE_INTEGER_C_MIN && Imm <= INLINE_INTEGER_C_MAX);
1810 (
static_cast<int64_t
>(Imm) - INLINE_INTEGER_C_MIN) :
1811 (INLINE_INTEGER_C_POSITIVE_MAX -
static_cast<int64_t
>(Imm)));
1859 return 0x3fc45f306dc9c882;
1921 return VGPR_32RegClassID;
1923 return VReg_64RegClassID;
1925 return VReg_96RegClassID;
1927 return VReg_128RegClassID;
1929 return VReg_160RegClassID;
1931 return VReg_192RegClassID;
1933 return VReg_256RegClassID;
1935 return VReg_288RegClassID;
1937 return VReg_320RegClassID;
1939 return VReg_352RegClassID;
1941 return VReg_384RegClassID;
1943 return VReg_512RegClassID;
1945 return VReg_1024RegClassID;
1956 return AGPR_32RegClassID;
1958 return AReg_64RegClassID;
1960 return AReg_96RegClassID;
1962 return AReg_128RegClassID;
1964 return AReg_160RegClassID;
1966 return AReg_256RegClassID;
1968 return AReg_288RegClassID;
1970 return AReg_320RegClassID;
1972 return AReg_352RegClassID;
1974 return AReg_384RegClassID;
1976 return AReg_512RegClassID;
1978 return AReg_1024RegClassID;
1983std::optional<unsigned>
1990 return SGPR_32RegClassID;
1992 return SGPR_64RegClassID;
1994 return SGPR_96RegClassID;
1996 return SGPR_128RegClassID;
1998 return SGPR_160RegClassID;
2000 return SGPR_256RegClassID;
2002 return SGPR_288RegClassID;
2004 return SGPR_320RegClassID;
2006 return SGPR_352RegClassID;
2008 return SGPR_384RegClassID;
2010 return SGPR_512RegClassID;
2012 return std::nullopt;
2015std::optional<unsigned>
2022 return TTMP_32RegClassID;
2024 return TTMP_64RegClassID;
2026 return TTMP_128RegClassID;
2028 return TTMP_256RegClassID;
2030 return TTMP_288RegClassID;
2032 return TTMP_320RegClassID;
2034 return TTMP_352RegClassID;
2036 return TTMP_384RegClassID;
2038 return TTMP_512RegClassID;
2040 return std::nullopt;
2046 unsigned TTmpMin =
isGFX9Plus() ? TTMP_GFX9PLUS_MIN : TTMP_VI_MIN;
2047 unsigned TTmpMax =
isGFX9Plus() ? TTMP_GFX9PLUS_MAX : TTMP_VI_MAX;
2049 return (TTmpMin <= Val && Val <= TTmpMax)? Val - TTmpMin : -1;
2053 unsigned Val)
const {
2058 bool IsAGPR = Val & 512;
2061 if (VGPR_MIN <= Val && Val <= VGPR_MAX) {
2070 unsigned Val)
const {
2073 assert(Val < (1 << 8) &&
"9-bit Src encoding when Val{8} is 0");
2078 auto UnsupportedWidth = [&]() {
2080 "-bit non-VGPR operand encoding " +
Twine(Val));
2085 static_assert(SGPR_MIN == 0);
2088 return UnsupportedWidth();
2096 return UnsupportedWidth();
2100 if ((INLINE_INTEGER_C_MIN <= Val && Val <= INLINE_INTEGER_C_MAX) ||
2101 (INLINE_FLOATING_C_MIN <= Val && Val <= INLINE_FLOATING_C_MAX) ||
2102 Val == LITERAL_CONST)
2105 if (Val == LITERAL64_CONST &&
STI.hasFeature(AMDGPU::Feature64BitLiterals)) {
2111 "64-bit literal is not supported by this instruction");
2128 return UnsupportedWidth();
2135 unsigned Val)
const {
2137 AMDGPU::getNamedOperandIdx(Inst.
getOpcode(), AMDGPU::OpName::vdstX);
2140 unsigned XDstReg = MRI.getEncodingValue(Inst.
getOperand(VDstXInd).
getReg());
2141 Val |= ~XDstReg & 1;
2264 const unsigned Val)
const {
2268 if (
STI.hasFeature(AMDGPU::FeatureGFX9) ||
2269 STI.hasFeature(AMDGPU::FeatureGFX10)) {
2272 if (
int(SDWA9EncValues::SRC_VGPR_MIN) <=
int(Val) &&
2273 Val <= SDWA9EncValues::SRC_VGPR_MAX) {
2275 Val - SDWA9EncValues::SRC_VGPR_MIN);
2277 if (SDWA9EncValues::SRC_SGPR_MIN <= Val &&
2278 Val <= (
isGFX10Plus() ? SDWA9EncValues::SRC_SGPR_MAX_GFX10
2279 : SDWA9EncValues::SRC_SGPR_MAX_SI)) {
2281 Val - SDWA9EncValues::SRC_SGPR_MIN);
2283 if (SDWA9EncValues::SRC_TTMP_MIN <= Val &&
2284 Val <= SDWA9EncValues::SRC_TTMP_MAX) {
2286 Val - SDWA9EncValues::SRC_TTMP_MIN);
2289 const unsigned SVal = Val - SDWA9EncValues::SRC_SGPR_MIN;
2291 if ((INLINE_INTEGER_C_MIN <= SVal && SVal <= INLINE_INTEGER_C_MAX) ||
2292 (INLINE_FLOATING_C_MIN <= SVal && SVal <= INLINE_FLOATING_C_MAX))
2297 if (
STI.hasFeature(AMDGPU::FeatureVolcanicIslands))
2313 assert((
STI.hasFeature(AMDGPU::FeatureGFX9) ||
2314 STI.hasFeature(AMDGPU::FeatureGFX10)) &&
2315 "SDWAVopcDst should be present only on GFX9+");
2317 bool IsWave32 =
STI.hasFeature(AMDGPU::FeatureWavefrontSize32);
2319 if (Val & SDWA9EncValues::VOPC_DST_VCC_MASK) {
2320 Val &= SDWA9EncValues::VOPC_DST_SGPR_MASK;
2334 unsigned Val)
const {
2335 return STI.hasFeature(AMDGPU::FeatureWavefrontSize32)
2341 unsigned Val)
const {
2343 constexpr unsigned M0Encoding = 125;
2344 bool IsValidBarrier =
2345 Val == M0Encoding ||
2346 (INLINE_INTEGER_C_MIN <= Val && Val < INLINE_INTEGER_C_MIN + 32) ||
2347 (INLINE_INTEGER_C_POSITIVE_MAX < Val &&
2348 Val <= INLINE_INTEGER_C_POSITIVE_MAX + 4);
2349 if (!IsValidBarrier)
2367 auto [
Version, W64, W32, MDP] = Encoding::decode(Imm);
2370 if (Encoding::encode(
Version, W64, W32, MDP) != Imm)
2380 if (
I == Versions.end())
2396 return STI.hasFeature(AMDGPU::FeatureVolcanicIslands);
2402 return STI.hasFeature(AMDGPU::FeatureGFX90AInsts);
2414 return STI.hasFeature(AMDGPU::FeatureGFX11);
2422 return STI.hasFeature(AMDGPU::FeatureGFX11_7Insts);
2426 return STI.hasFeature(AMDGPU::FeatureGFX12);
2446 return STI.hasFeature(AMDGPU::FeatureArchitectedFlatScratch);
2467 if (PopCount == 1) {
2468 S <<
"bit (" << (TrailingZeros + BaseBytes * CHAR_BIT) <<
')';
2470 S <<
"bits in range ("
2471 << (TrailingZeros + PopCount - 1 + BaseBytes * CHAR_BIT) <<
':'
2472 << (TrailingZeros + BaseBytes * CHAR_BIT) <<
')';
2478#define GET_FIELD(MASK) (AMDHSA_BITS_GET(FourByteBuffer, MASK))
2479#define PRINT_DIRECTIVE(DIRECTIVE, MASK) \
2481 KdStream << Indent << DIRECTIVE " " << GET_FIELD(MASK) << '\n'; \
2483#define PRINT_PSEUDO_DIRECTIVE_COMMENT(DIRECTIVE, MASK) \
2485 KdStream << Indent << MAI.getCommentString() << ' ' << DIRECTIVE " " \
2486 << GET_FIELD(MASK) << '\n'; \
2489#define CHECK_RESERVED_BITS_IMPL(MASK, DESC, MSG) \
2491 if (FourByteBuffer & (MASK)) { \
2492 return createStringError(std::errc::invalid_argument, \
2493 "kernel descriptor " DESC \
2494 " reserved %s set" MSG, \
2495 getBitRangeFromMask((MASK), 0).c_str()); \
2499#define CHECK_RESERVED_BITS(MASK) CHECK_RESERVED_BITS_IMPL(MASK, #MASK, "")
2500#define CHECK_RESERVED_BITS_MSG(MASK, MSG) \
2501 CHECK_RESERVED_BITS_IMPL(MASK, #MASK, ", " MSG)
2502#define CHECK_RESERVED_BITS_DESC(MASK, DESC) \
2503 CHECK_RESERVED_BITS_IMPL(MASK, DESC, "")
2504#define CHECK_RESERVED_BITS_DESC_MSG(MASK, DESC, MSG) \
2505 CHECK_RESERVED_BITS_IMPL(MASK, DESC, ", " MSG)
2518 uint32_t GranulatedWorkitemVGPRCount =
2519 GET_FIELD(COMPUTE_PGM_RSRC1_GRANULATED_WORKITEM_VGPR_COUNT);
2522 (GranulatedWorkitemVGPRCount + 1) *
2525 KdStream << Indent <<
".amdhsa_next_free_vgpr " << NextFreeVGPR <<
'\n';
2546 uint32_t GranulatedWavefrontSGPRCount =
2547 GET_FIELD(COMPUTE_PGM_RSRC1_GRANULATED_WAVEFRONT_SGPR_COUNT);
2551 "must be zero on gfx10+");
2553 uint32_t NextFreeSGPR = (GranulatedWavefrontSGPRCount + 1) *
2556 KdStream << Indent <<
".amdhsa_reserve_vcc " << 0 <<
'\n';
2558 KdStream << Indent <<
".amdhsa_reserve_flat_scratch " << 0 <<
'\n';
2559 bool ReservedXnackMask =
STI.hasFeature(AMDGPU::FeatureXNACK);
2560 assert(!ReservedXnackMask ||
STI.hasFeature(AMDGPU::FeatureSupportsXNACK));
2561 KdStream << Indent <<
".amdhsa_reserve_xnack_mask " << ReservedXnackMask
2563 KdStream << Indent <<
".amdhsa_next_free_sgpr " << NextFreeSGPR <<
"\n";
2568 COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_32);
2570 COMPUTE_PGM_RSRC1_FLOAT_ROUND_MODE_16_64);
2572 COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_32);
2574 COMPUTE_PGM_RSRC1_FLOAT_DENORM_MODE_16_64);
2578 if (
STI.hasFeature(AMDGPU::FeatureDX10ClampAndIEEEMode))
2580 COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_DX10_CLAMP);
2584 if (
STI.hasFeature(AMDGPU::FeatureDX10ClampAndIEEEMode))
2586 COMPUTE_PGM_RSRC1_GFX6_GFX11_ENABLE_IEEE_MODE);
2593 PRINT_DIRECTIVE(
".amdhsa_fp16_overflow", COMPUTE_PGM_RSRC1_GFX9_PLUS_FP16_OVFL);
2596 "COMPUTE_PGM_RSRC1",
"must be zero pre-gfx9");
2602 COMPUTE_PGM_RSRC1_GFX125_FLAT_SCRATCH_IS_NV);
2605 "COMPUTE_PGM_RSRC1");
2616 COMPUTE_PGM_RSRC1_GFX10_PLUS_WGP_MODE);
2618 PRINT_DIRECTIVE(
".amdhsa_memory_ordered", COMPUTE_PGM_RSRC1_GFX10_PLUS_MEM_ORDERED);
2619 PRINT_DIRECTIVE(
".amdhsa_forward_progress", COMPUTE_PGM_RSRC1_GFX10_PLUS_FWD_PROGRESS);
2622 "COMPUTE_PGM_RSRC1");
2627 COMPUTE_PGM_RSRC1_GFX12_PLUS_ENABLE_WG_RR_EN);
2639 COMPUTE_PGM_RSRC2_ENABLE_PRIVATE_SEGMENT);
2641 PRINT_DIRECTIVE(
".amdhsa_system_sgpr_private_segment_wavefront_offset",
2642 COMPUTE_PGM_RSRC2_ENABLE_PRIVATE_SEGMENT);
2644 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_X);
2646 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Y);
2648 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_ID_Z);
2650 COMPUTE_PGM_RSRC2_ENABLE_SGPR_WORKGROUP_INFO);
2652 COMPUTE_PGM_RSRC2_ENABLE_VGPR_WORKITEM_ID);
2659 ".amdhsa_exception_fp_ieee_invalid_op",
2660 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INVALID_OPERATION);
2662 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_FP_DENORMAL_SOURCE);
2664 ".amdhsa_exception_fp_ieee_div_zero",
2665 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_DIVISION_BY_ZERO);
2667 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_OVERFLOW);
2669 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_UNDERFLOW);
2671 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_IEEE_754_FP_INEXACT);
2673 COMPUTE_PGM_RSRC2_ENABLE_EXCEPTION_INT_DIVIDE_BY_ZERO);
2686 KdStream << Indent <<
".amdhsa_accum_offset "
2687 << (
GET_FIELD(COMPUTE_PGM_RSRC3_GFX90A_ACCUM_OFFSET) + 1) * 4
2690 PRINT_DIRECTIVE(
".amdhsa_tg_split", COMPUTE_PGM_RSRC3_GFX90A_TG_SPLIT);
2693 "COMPUTE_PGM_RSRC3",
"must be zero on gfx90a");
2695 "COMPUTE_PGM_RSRC3",
"must be zero on gfx90a");
2699 if (!EnableWavefrontSize32 || !*EnableWavefrontSize32) {
2701 COMPUTE_PGM_RSRC3_GFX10_GFX11_SHARED_VGPR_COUNT);
2704 "SHARED_VGPR_COUNT",
2705 COMPUTE_PGM_RSRC3_GFX10_GFX11_SHARED_VGPR_COUNT);
2709 "COMPUTE_PGM_RSRC3",
2710 "must be zero on gfx12+");
2716 COMPUTE_PGM_RSRC3_GFX11_INST_PREF_SIZE);
2718 COMPUTE_PGM_RSRC3_GFX11_TRAP_ON_START);
2720 COMPUTE_PGM_RSRC3_GFX11_TRAP_ON_END);
2723 COMPUTE_PGM_RSRC3_GFX12_PLUS_INST_PREF_SIZE);
2726 "COMPUTE_PGM_RSRC3",
2727 "must be zero on gfx10");
2732 "COMPUTE_PGM_RSRC3",
"must be zero on gfx10+");
2737 COMPUTE_PGM_RSRC3_GFX12_PLUS_GLG_EN);
2740 "COMPUTE_PGM_RSRC3",
2741 "must be zero on gfx10 or gfx11");
2747 COMPUTE_PGM_RSRC3_GFX125_NAMED_BAR_CNT);
2749 "ENABLE_DYNAMIC_VGPR", COMPUTE_PGM_RSRC3_GFX125_ENABLE_DYNAMIC_VGPR);
2751 COMPUTE_PGM_RSRC3_GFX125_TCP_SPLIT);
2753 "ENABLE_DIDT_THROTTLE",
2754 COMPUTE_PGM_RSRC3_GFX125_ENABLE_DIDT_THROTTLE);
2757 "COMPUTE_PGM_RSRC3",
2758 "must be zero on gfx10+");
2763 "COMPUTE_PGM_RSRC3",
"must be zero on gfx10+");
2768 COMPUTE_PGM_RSRC3_GFX11_PLUS_IMAGE_OP);
2771 "COMPUTE_PGM_RSRC3",
2772 "must be zero on gfx10");
2774 }
else if (FourByteBuffer) {
2776 std::errc::invalid_argument,
2777 "kernel descriptor COMPUTE_PGM_RSRC3 must be all zero before gfx9");
2781#undef PRINT_PSEUDO_DIRECTIVE_COMMENT
2782#undef PRINT_DIRECTIVE
2784#undef CHECK_RESERVED_BITS_IMPL
2785#undef CHECK_RESERVED_BITS
2786#undef CHECK_RESERVED_BITS_MSG
2787#undef CHECK_RESERVED_BITS_DESC
2788#undef CHECK_RESERVED_BITS_DESC_MSG
2793 const char *
Msg =
"") {
2795 std::errc::invalid_argument,
"kernel descriptor reserved %s set%s%s",
2802 unsigned WidthInBytes) {
2806 std::errc::invalid_argument,
2807 "kernel descriptor reserved bits in range (%u:%u) set",
2808 (BaseInBytes + WidthInBytes) * CHAR_BIT - 1, BaseInBytes * CHAR_BIT);
2814#define PRINT_DIRECTIVE(DIRECTIVE, MASK) \
2816 KdStream << Indent << DIRECTIVE " " \
2817 << ((TwoByteBuffer & MASK) >> (MASK##_SHIFT)) << '\n'; \
2826 assert(Bytes.size() == 64);
2829 switch (Cursor.tell()) {
2831 FourByteBuffer = DE.
getU32(Cursor);
2832 KdStream << Indent <<
".amdhsa_group_segment_fixed_size " << FourByteBuffer
2837 FourByteBuffer = DE.
getU32(Cursor);
2838 KdStream << Indent <<
".amdhsa_private_segment_fixed_size "
2839 << FourByteBuffer <<
'\n';
2843 FourByteBuffer = DE.
getU32(Cursor);
2844 KdStream << Indent <<
".amdhsa_kernarg_size "
2845 << FourByteBuffer <<
'\n';
2850 ReservedBytes = DE.
getBytes(Cursor, 4);
2851 for (
char B : ReservedBytes) {
2866 ReservedBytes = DE.
getBytes(Cursor, 20);
2867 for (
char B : ReservedBytes) {
2874 FourByteBuffer = DE.
getU32(Cursor);
2878 FourByteBuffer = DE.
getU32(Cursor);
2882 FourByteBuffer = DE.
getU32(Cursor);
2887 TwoByteBuffer = DE.
getU16(Cursor);
2891 KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_BUFFER);
2893 KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_PTR);
2895 KERNEL_CODE_PROPERTY_ENABLE_SGPR_QUEUE_PTR);
2897 KERNEL_CODE_PROPERTY_ENABLE_SGPR_KERNARG_SEGMENT_PTR);
2899 KERNEL_CODE_PROPERTY_ENABLE_SGPR_DISPATCH_ID);
2902 KERNEL_CODE_PROPERTY_ENABLE_SGPR_FLAT_SCRATCH_INIT);
2904 KERNEL_CODE_PROPERTY_ENABLE_SGPR_PRIVATE_SEGMENT_SIZE);
2906 if (TwoByteBuffer & KERNEL_CODE_PROPERTY_RESERVED0)
2912 (TwoByteBuffer & KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32)) {
2914 KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32,
2919 KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32);
2924 KERNEL_CODE_PROPERTY_USES_DYNAMIC_STACK);
2926 if (TwoByteBuffer & KERNEL_CODE_PROPERTY_RESERVED1) {
2935 TwoByteBuffer = DE.
getU16(Cursor);
2936 if (TwoByteBuffer & KERNARG_PRELOAD_SPEC_LENGTH) {
2938 KERNARG_PRELOAD_SPEC_LENGTH);
2941 if (TwoByteBuffer & KERNARG_PRELOAD_SPEC_OFFSET) {
2943 KERNARG_PRELOAD_SPEC_OFFSET);
2949 ReservedBytes = DE.
getBytes(Cursor, 4);
2950 for (
char B : ReservedBytes) {
2960#undef PRINT_DIRECTIVE
2967 if (Bytes.size() != 64 || KdAddress % 64 != 0)
2969 "kernel descriptor must be 64-byte aligned");
2980 EnableWavefrontSize32 =
2982 amdhsa::KERNEL_CODE_PROPERTY_ENABLE_WAVEFRONT_SIZE32);
2987 KdStream <<
".amdhsa_kernel " << KdName <<
'\n';
2990 while (
C &&
C.tell() < Bytes.size()) {
2998 KdStream <<
".end_amdhsa_kernel\n";
3017 "code object v2 is not supported");
3030const MCExpr *AMDGPUDisassembler::createConstantSymbolExpr(
StringRef Id,
3033 MCSymbol *Sym = Ctx.getOrCreateSymbol(Id);
3041 if (!Valid || Res != Val)
3042 Ctx.reportWarning(
SMLoc(),
"unsupported redefinition of " + Id);
3082 if (Result != Symbols->end()) {
3083 auto *Sym =
Ctx.getOrCreateSymbol(Result->Name);
3089 ReferencedAddresses.push_back(
static_cast<uint64_t>(
Value));
3108 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)
static DecodeStatus decodeVersionImm(MCInst &Inst, unsigned Imm, uint64_t, const MCDisassembler *Decoder)
#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)
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)
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.