51void AMDGPUInstPrinter::printU16ImmOperand(
const MCInst *
MI,
unsigned OpNo,
62 int64_t
Imm =
Op.getImm();
64 O << formatHex(static_cast<uint64_t>(
Imm & 0xffff));
66 printU32ImmOperand(
MI, OpNo, STI, O);
69void AMDGPUInstPrinter::printU16ImmDecOperand(
const MCInst *
MI,
unsigned OpNo,
74void AMDGPUInstPrinter::printU32ImmOperand(
const MCInst *
MI,
unsigned OpNo,
77 const MCOperand &
Op =
MI->getOperand(OpNo);
79 MAI.printExpr(O, *
Op.getExpr());
86void AMDGPUInstPrinter::printFP64ImmOperand(
const MCInst *
MI,
unsigned OpNo,
90 const MCOperand &
Op =
MI->getOperand(OpNo);
92 MAI.printExpr(O, *
Op.getExpr());
96 printLiteral64(
Op.getImm(), O,
true);
99void AMDGPUInstPrinter::printNamedBit(
const MCInst *
MI,
unsigned OpNo,
101 if (
MI->getOperand(OpNo).getImm()) {
106void AMDGPUInstPrinter::printOffset(
const MCInst *
MI,
unsigned OpNo,
109 uint32_t
Imm =
MI->getOperand(OpNo).getImm();
116 O << formatDec(SignExtend32<24>(
Imm));
118 printU16ImmDecOperand(
MI, OpNo, O);
122void AMDGPUInstPrinter::printFlatOffset(
const MCInst *
MI,
unsigned OpNo,
125 uint32_t
Imm =
MI->getOperand(OpNo).getImm();
130 STI.
hasFeature(AMDGPU::FeatureFlatSignedOffset);
135 printU16ImmDecOperand(
MI, OpNo, O);
139void AMDGPUInstPrinter::printSMRDOffset8(
const MCInst *
MI,
unsigned OpNo,
142 printU32ImmOperand(
MI, OpNo, STI, O);
145void AMDGPUInstPrinter::printSMEMOffset(
const MCInst *
MI,
unsigned OpNo,
151void AMDGPUInstPrinter::printSMRDLiteralOffset(
const MCInst *
MI,
unsigned OpNo,
154 printU32ImmOperand(
MI, OpNo, STI, O);
157void AMDGPUInstPrinter::printCPol(
const MCInst *
MI,
unsigned OpNo,
159 auto Imm =
MI->getOperand(OpNo).getImm();
166 O <<
" scale_offset";
168 printTH(
MI, TH, Scope, O);
169 printScope(Scope, O);
187 O <<
" /* unexpected cache policy bit */";
190void AMDGPUInstPrinter::printTH(
const MCInst *
MI, int64_t TH, int64_t Scope,
196 const unsigned Opcode =
MI->getOpcode();
197 const MCInstrDesc &TID =
MII.get(Opcode);
220 O << (IsStore ?
"TH_STORE_" :
"TH_LOAD_");
230 : (IsStore ?
"WB" :
"LU"));
251void AMDGPUInstPrinter::printScope(int64_t Scope,
raw_ostream &O) {
267void AMDGPUInstPrinter::printDim(
const MCInst *
MI,
unsigned OpNo,
269 unsigned Dim =
MI->getOperand(OpNo).getImm();
270 O <<
" dim:SQ_RSRC_IMG_";
279void AMDGPUInstPrinter::printR128A16(
const MCInst *
MI,
unsigned OpNo,
282 printNamedBit(
MI, OpNo, O,
"a16");
284 printNamedBit(
MI, OpNo, O,
"r128");
287void AMDGPUInstPrinter::printFORMAT(
const MCInst *
MI,
unsigned OpNo,
292void AMDGPUInstPrinter::printSymbolicFormat(
const MCInst *
MI,
295 using namespace llvm::AMDGPU::MTBUFFormat;
298 AMDGPU::getNamedOperandIdx(
MI->getOpcode(), AMDGPU::OpName::format);
301 unsigned Val =
MI->getOperand(OpNo).getImm();
303 if (Val == UFMT_DEFAULT)
308 O <<
" format:" << Val;
311 if (Val == DFMT_NFMT_DEFAULT)
318 if (Dfmt != DFMT_DEFAULT) {
320 if (Nfmt != NFMT_DEFAULT) {
324 if (Nfmt != NFMT_DEFAULT) {
329 O <<
" format:" << Val;
342 unsigned RegNo = Idx % 0x100;
344 if (RC->
getID() == AMDGPU::VGPR_16RegClassID) {
370 unsigned Opc =
Desc.getOpcode();
372 for (
I = 0;
I < 4; ++
I) {
373 if (
Ops.first[
I] != AMDGPU::OpName::NUM_OPERAND_NAMES &&
374 (
unsigned)AMDGPU::getNamedOperandIdx(
Opc,
Ops.first[
I]) == OpNo)
376 if (
Ops.second &&
Ops.second[
I] != AMDGPU::OpName::NUM_OPERAND_NAMES &&
377 (
unsigned)AMDGPU::getNamedOperandIdx(
Opc,
Ops.second[
I]) == OpNo)
382 unsigned OpMSBs = (VgprMSBs >> (
I * 2)) & 3;
390void AMDGPUInstPrinter::printRsrcReg(
const MCInst *
MI,
unsigned OpNo,
393 MCRegister
Reg =
MI->getOperand(OpNo).getReg();
408 case AMDGPU::PRIVATE_RSRC_REG:
431void AMDGPUInstPrinter::printVOPDst(
const MCInst *
MI,
unsigned OpNo,
433 auto Opcode =
MI->getOpcode();
450 printRegularOperand(
MI, OpNo, STI, O);
456 case AMDGPU::V_ADD_CO_CI_U32_e32_gfx10:
457 case AMDGPU::V_SUB_CO_CI_U32_e32_gfx10:
458 case AMDGPU::V_SUBREV_CO_CI_U32_e32_gfx10:
459 case AMDGPU::V_ADD_CO_CI_U32_sdwa_gfx10:
460 case AMDGPU::V_SUB_CO_CI_U32_sdwa_gfx10:
461 case AMDGPU::V_SUBREV_CO_CI_U32_sdwa_gfx10:
462 case AMDGPU::V_ADD_CO_CI_U32_dpp_gfx10:
463 case AMDGPU::V_SUB_CO_CI_U32_dpp_gfx10:
464 case AMDGPU::V_SUBREV_CO_CI_U32_dpp_gfx10:
465 case AMDGPU::V_ADD_CO_CI_U32_dpp8_gfx10:
466 case AMDGPU::V_SUB_CO_CI_U32_dpp8_gfx10:
467 case AMDGPU::V_SUBREV_CO_CI_U32_dpp8_gfx10:
468 case AMDGPU::V_ADD_CO_CI_U32_e32_gfx11:
469 case AMDGPU::V_SUB_CO_CI_U32_e32_gfx11:
470 case AMDGPU::V_SUBREV_CO_CI_U32_e32_gfx11:
471 case AMDGPU::V_ADD_CO_CI_U32_dpp_gfx11:
472 case AMDGPU::V_SUB_CO_CI_U32_dpp_gfx11:
473 case AMDGPU::V_SUBREV_CO_CI_U32_dpp_gfx11:
474 case AMDGPU::V_ADD_CO_CI_U32_dpp8_gfx11:
475 case AMDGPU::V_SUB_CO_CI_U32_dpp8_gfx11:
476 case AMDGPU::V_SUBREV_CO_CI_U32_dpp8_gfx11:
477 case AMDGPU::V_ADD_CO_CI_U32_e32_gfx12:
478 case AMDGPU::V_SUB_CO_CI_U32_e32_gfx12:
479 case AMDGPU::V_SUBREV_CO_CI_U32_e32_gfx12:
480 case AMDGPU::V_ADD_CO_CI_U32_dpp_gfx12:
481 case AMDGPU::V_SUB_CO_CI_U32_dpp_gfx12:
482 case AMDGPU::V_SUBREV_CO_CI_U32_dpp_gfx12:
483 case AMDGPU::V_ADD_CO_CI_U32_dpp8_gfx12:
484 case AMDGPU::V_SUB_CO_CI_U32_dpp8_gfx12:
485 case AMDGPU::V_SUBREV_CO_CI_U32_dpp8_gfx12:
486 case AMDGPU::V_ADD_CO_CI_U32_e32_gfx13:
487 case AMDGPU::V_SUB_CO_CI_U32_e32_gfx13:
488 case AMDGPU::V_SUBREV_CO_CI_U32_e32_gfx13:
489 case AMDGPU::V_ADD_CO_CI_U32_dpp_gfx13:
490 case AMDGPU::V_SUB_CO_CI_U32_dpp_gfx13:
491 case AMDGPU::V_SUBREV_CO_CI_U32_dpp_gfx13:
492 case AMDGPU::V_ADD_CO_CI_U32_dpp8_gfx13:
493 case AMDGPU::V_SUB_CO_CI_U32_dpp8_gfx13:
494 case AMDGPU::V_SUBREV_CO_CI_U32_dpp8_gfx13:
495 printDefaultVccOperand(
false, STI, O);
500void AMDGPUInstPrinter::printVINTRPDst(
const MCInst *
MI,
unsigned OpNo,
507 printRegularOperand(
MI, OpNo, STI, O);
510void AMDGPUInstPrinter::printAVLdSt32Align2RegOp(
const MCInst *
MI,
514 MCRegister
Reg =
MI->getOperand(OpNo).getReg();
517 if (MCRegister SubReg =
MRI.getSubReg(
Reg, AMDGPU::sub0))
522void AMDGPUInstPrinter::printImmediateInt16(uint32_t
Imm,
525 int32_t SImm =
static_cast<int32_t
>(
Imm);
531 if (printImmediateFloat32(
Imm, STI, O))
534 O << formatHex(static_cast<uint64_t>(
Imm & 0xffff));
541 else if (
Imm == 0xBC00)
543 else if (
Imm == 0x3800)
545 else if (
Imm == 0xB800)
547 else if (
Imm == 0x4000)
549 else if (
Imm == 0xC000)
551 else if (
Imm == 0x4400)
553 else if (
Imm == 0xC400)
555 else if (
Imm == 0x3118 && STI.
hasFeature(AMDGPU::FeatureInv2PiInlineImm))
567 else if (
Imm == 0xBF80)
569 else if (
Imm == 0x3F00)
571 else if (
Imm == 0xBF00)
573 else if (
Imm == 0x4000)
575 else if (
Imm == 0xC000)
577 else if (
Imm == 0x4080)
579 else if (
Imm == 0xC080)
581 else if (
Imm == 0x3E22 && STI.
hasFeature(AMDGPU::FeatureInv2PiInlineImm))
589void AMDGPUInstPrinter::printImmediateBF16(uint32_t
Imm,
592 int16_t SImm =
static_cast<int16_t
>(
Imm);
601 O << formatHex(static_cast<uint64_t>(
Imm));
604void AMDGPUInstPrinter::printImmediateF16(uint32_t
Imm,
607 int16_t SImm =
static_cast<int16_t
>(
Imm);
613 uint16_t HImm =
static_cast<uint16_t
>(
Imm);
621void AMDGPUInstPrinter::printImmediateV216(uint32_t
Imm, uint8_t OpType,
624 int32_t SImm =
static_cast<int32_t
>(
Imm);
633 if (printImmediateFloat32(
Imm, STI, O))
647 uint16_t Lo16 =
static_cast<uint16_t
>(
Imm & 0xFFFF);
648 uint16_t Hi16 =
static_cast<uint16_t
>((
Imm >> 16) & 0xFFFF);
673 O << formatHex(static_cast<uint64_t>(
Imm));
676bool AMDGPUInstPrinter::printImmediateFloat32(uint32_t
Imm,
697 else if (
Imm == 0x3e22f983 &&
698 STI.
hasFeature(AMDGPU::FeatureInv2PiInlineImm))
706void AMDGPUInstPrinter::printImmediate32(uint32_t
Imm,
709 int32_t SImm =
static_cast<int32_t
>(
Imm);
715 if (printImmediateFloat32(
Imm, STI, O))
718 O << formatHex(static_cast<uint64_t>(
Imm));
721void AMDGPUInstPrinter::printImmediate64(
uint64_t Imm,
724 int64_t SImm =
static_cast<int64_t
>(
Imm);
725 if (SImm >= -16 && SImm <= 64) {
748 else if (
Imm == 0x3fc45f306dc9c882 &&
749 STI.
hasFeature(AMDGPU::FeatureInv2PiInlineImm))
750 O <<
"0.15915494309189532";
752 printLiteral64(
Imm, O, IsFP);
758 O << formatHex(static_cast<uint64_t>(
Hi_32(
Imm)));
763void AMDGPUInstPrinter::printBLGP(
const MCInst *
MI,
unsigned OpNo,
766 unsigned Imm =
MI->getOperand(OpNo).getImm();
771 switch (
MI->getOpcode()) {
772 case AMDGPU::V_MFMA_F64_16X16X4F64_gfx940_acd:
773 case AMDGPU::V_MFMA_F64_16X16X4F64_gfx940_vcd:
774 case AMDGPU::V_MFMA_F64_4X4X4F64_gfx940_acd:
775 case AMDGPU::V_MFMA_F64_4X4X4F64_gfx940_vcd:
776 O <<
" neg:[" << (
Imm & 1) <<
',' << ((
Imm >> 1) & 1) <<
','
777 << ((
Imm >> 2) & 1) <<
']';
782 O <<
" blgp:" <<
Imm;
785void AMDGPUInstPrinter::printDefaultVccOperand(
bool FirstOperand,
799 unsigned OpNo)
const {
802 (
Desc.hasImplicitDefOfPhysReg(AMDGPU::VCC) ||
803 Desc.hasImplicitDefOfPhysReg(AMDGPU::VCC_LO));
807void AMDGPUInstPrinter::printOperand(
const MCInst *
MI,
unsigned OpNo,
810 unsigned Opc =
MI->getOpcode();
812 int ModIdx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src0_modifiers);
818 (
Desc.hasImplicitDefOfPhysReg(AMDGPU::VCC) ||
819 Desc.hasImplicitDefOfPhysReg(AMDGPU::VCC_LO)))
820 printDefaultVccOperand(
true, STI, O);
822 printRegularOperand(
MI, OpNo, STI, O);
826void AMDGPUInstPrinter::printRegularOperand(
const MCInst *
MI,
unsigned OpNo,
829 const MCInstrDesc &
Desc =
MII.get(
MI->getOpcode());
831 if (OpNo >=
MI->getNumOperands()) {
832 O <<
"/*Missing OP" << OpNo <<
"*/";
836 const MCOperand &
Op =
MI->getOperand(OpNo);
843 const MCOperandInfo &OpInfo =
Desc.operands()[OpNo];
845 int16_t RCID =
MII.getOpRegClassID(
847 const MCRegisterClass &RC =
MRI.getRegClass(RCID);
851 (OpInfo.
RegClass == AMDGPU::SReg_1 ||
852 OpInfo.
RegClass == AMDGPU::SReg_1_XEXEC);
859 O <<
"/*Invalid register, operand has \'" <<
MRI.getRegClassName(&RC)
860 <<
"\' register class*/";
864 }
else if (
Op.isImm()) {
865 const uint8_t OpTy =
Desc.operands()[OpNo].OperandType;
877 printImmediate32(
Op.getImm(), STI, O);
882 printImmediate64(
Op.getImm(), STI, O,
false);
888 printImmediate64(
Op.getImm(), STI, O,
true);
892 printImmediateInt16(
Op.getImm(), STI, O);
897 printImmediateF16(
Op.getImm(), STI, O);
901 printImmediateBF16(
Op.getImm(), STI, O);
911 printImmediateV216(
Op.getImm(), OpTy, STI, O);
920 printImmediate32(
Op.getImm(), STI, O);
921 O <<
"/*Invalid immediate*/";
928 }
else if (
Op.isExpr()) {
929 const MCExpr *
Exp =
Op.getExpr();
930 MAI.printExpr(O, *Exp);
936 switch (
MI->getOpcode()) {
939 case AMDGPU::V_CNDMASK_B32_e32_gfx10:
940 case AMDGPU::V_ADD_CO_CI_U32_e32_gfx10:
941 case AMDGPU::V_SUB_CO_CI_U32_e32_gfx10:
942 case AMDGPU::V_SUBREV_CO_CI_U32_e32_gfx10:
943 case AMDGPU::V_ADD_CO_CI_U32_dpp_gfx10:
944 case AMDGPU::V_SUB_CO_CI_U32_dpp_gfx10:
945 case AMDGPU::V_SUBREV_CO_CI_U32_dpp_gfx10:
946 case AMDGPU::V_CNDMASK_B32_dpp8_gfx10:
947 case AMDGPU::V_ADD_CO_CI_U32_dpp8_gfx10:
948 case AMDGPU::V_SUB_CO_CI_U32_dpp8_gfx10:
949 case AMDGPU::V_SUBREV_CO_CI_U32_dpp8_gfx10:
950 case AMDGPU::V_CNDMASK_B32_e32_gfx11:
951 case AMDGPU::V_ADD_CO_CI_U32_e32_gfx11:
952 case AMDGPU::V_SUB_CO_CI_U32_e32_gfx11:
953 case AMDGPU::V_SUBREV_CO_CI_U32_e32_gfx11:
954 case AMDGPU::V_ADD_CO_CI_U32_dpp_gfx11:
955 case AMDGPU::V_SUB_CO_CI_U32_dpp_gfx11:
956 case AMDGPU::V_SUBREV_CO_CI_U32_dpp_gfx11:
957 case AMDGPU::V_CNDMASK_B32_dpp8_gfx11:
958 case AMDGPU::V_ADD_CO_CI_U32_dpp8_gfx11:
959 case AMDGPU::V_SUB_CO_CI_U32_dpp8_gfx11:
960 case AMDGPU::V_SUBREV_CO_CI_U32_dpp8_gfx11:
961 case AMDGPU::V_CNDMASK_B32_e32_gfx12:
962 case AMDGPU::V_ADD_CO_CI_U32_e32_gfx12:
963 case AMDGPU::V_SUB_CO_CI_U32_e32_gfx12:
964 case AMDGPU::V_SUBREV_CO_CI_U32_e32_gfx12:
965 case AMDGPU::V_CNDMASK_B32_dpp_gfx12:
966 case AMDGPU::V_ADD_CO_CI_U32_dpp_gfx12:
967 case AMDGPU::V_SUB_CO_CI_U32_dpp_gfx12:
968 case AMDGPU::V_SUBREV_CO_CI_U32_dpp_gfx12:
969 case AMDGPU::V_CNDMASK_B32_dpp8_gfx12:
970 case AMDGPU::V_ADD_CO_CI_U32_dpp8_gfx12:
971 case AMDGPU::V_SUB_CO_CI_U32_dpp8_gfx12:
972 case AMDGPU::V_SUBREV_CO_CI_U32_dpp8_gfx12:
973 case AMDGPU::V_CNDMASK_B32_e32_gfx13:
974 case AMDGPU::V_ADD_CO_CI_U32_e32_gfx13:
975 case AMDGPU::V_SUB_CO_CI_U32_e32_gfx13:
976 case AMDGPU::V_SUBREV_CO_CI_U32_e32_gfx13:
977 case AMDGPU::V_CNDMASK_B32_dpp_gfx13:
978 case AMDGPU::V_ADD_CO_CI_U32_dpp_gfx13:
979 case AMDGPU::V_SUB_CO_CI_U32_dpp_gfx13:
980 case AMDGPU::V_SUBREV_CO_CI_U32_dpp_gfx13:
981 case AMDGPU::V_CNDMASK_B32_dpp8_gfx13:
982 case AMDGPU::V_ADD_CO_CI_U32_dpp8_gfx13:
983 case AMDGPU::V_SUB_CO_CI_U32_dpp8_gfx13:
984 case AMDGPU::V_SUBREV_CO_CI_U32_dpp8_gfx13:
986 case AMDGPU::V_CNDMASK_B32_e32_gfx6_gfx7:
987 case AMDGPU::V_CNDMASK_B32_e32_vi:
988 if ((
int)OpNo == AMDGPU::getNamedOperandIdx(
MI->getOpcode(),
989 AMDGPU::OpName::src1))
990 printDefaultVccOperand(OpNo == 0, STI, O);
996 AMDGPU::getNamedOperandIdx(
MI->getOpcode(), AMDGPU::OpName::soffset);
998 if ((
int)OpNo == SOffsetIdx)
999 printSymbolicFormat(
MI, STI, O);
1003void AMDGPUInstPrinter::printOperandAndFPInputMods(
const MCInst *
MI,
1007 const MCInstrDesc &
Desc =
MII.get(
MI->getOpcode());
1008 if (needsImpliedVcc(
Desc, OpNo))
1009 printDefaultVccOperand(
true, STI, O);
1011 unsigned InputModifiers =
MI->getOperand(OpNo).getImm();
1016 bool NegMnemo =
false;
1019 if (OpNo + 1 <
MI->getNumOperands() &&
1021 const MCOperand &
Op =
MI->getOperand(OpNo + 1);
1022 NegMnemo =
Op.isImm();
1033 printRegularOperand(
MI, OpNo + 1, STI, O);
1042 switch (
MI->getOpcode()) {
1046 case AMDGPU::V_CNDMASK_B32_sdwa_gfx10:
1047 case AMDGPU::V_CNDMASK_B32_dpp_gfx10:
1048 case AMDGPU::V_CNDMASK_B32_dpp_gfx11:
1049 if ((
int)OpNo + 1 ==
1050 AMDGPU::getNamedOperandIdx(
MI->getOpcode(), AMDGPU::OpName::src1))
1051 printDefaultVccOperand(OpNo == 0, STI, O);
1056void AMDGPUInstPrinter::printOperandAndIntInputMods(
const MCInst *
MI,
1060 const MCInstrDesc &
Desc =
MII.get(
MI->getOpcode());
1061 if (needsImpliedVcc(
Desc, OpNo))
1062 printDefaultVccOperand(
true, STI, O);
1064 unsigned InputModifiers =
MI->getOperand(OpNo).getImm();
1067 printRegularOperand(
MI, OpNo + 1, STI, O);
1072 switch (
MI->getOpcode()) {
1075 case AMDGPU::V_ADD_CO_CI_U32_sdwa_gfx10:
1076 case AMDGPU::V_SUB_CO_CI_U32_sdwa_gfx10:
1077 case AMDGPU::V_SUBREV_CO_CI_U32_sdwa_gfx10:
1078 if ((
int)OpNo + 1 == AMDGPU::getNamedOperandIdx(
MI->getOpcode(),
1079 AMDGPU::OpName::src1))
1080 printDefaultVccOperand(OpNo == 0, STI, O);
1085void AMDGPUInstPrinter::printDPP8(
const MCInst *
MI,
unsigned OpNo,
1091 unsigned Imm =
MI->getOperand(OpNo).getImm();
1093 for (
size_t i = 1; i < 8; ++i) {
1099void AMDGPUInstPrinter::printDPPCtrl(
const MCInst *
MI,
unsigned OpNo,
1102 using namespace AMDGPU::DPP;
1104 unsigned Imm =
MI->getOperand(OpNo).getImm();
1105 const MCInstrDesc &
Desc =
MII.get(
MI->getOpcode());
1110 O <<
" /* DP ALU dpp only supports "
1111 << (
isGFX12(STI) ?
"row_share" :
"row_newbcast") <<
" */";
1114 if (
Imm <= DppCtrl::QUAD_PERM_LAST) {
1120 }
else if ((
Imm >= DppCtrl::ROW_SHL_FIRST) &&
1121 (
Imm <= DppCtrl::ROW_SHL_LAST)) {
1123 }
else if ((
Imm >= DppCtrl::ROW_SHR_FIRST) &&
1124 (
Imm <= DppCtrl::ROW_SHR_LAST)) {
1126 }
else if ((
Imm >= DppCtrl::ROW_ROR_FIRST) &&
1127 (
Imm <= DppCtrl::ROW_ROR_LAST)) {
1129 }
else if (
Imm == DppCtrl::WAVE_SHL1) {
1131 O <<
"/* wave_shl is not supported starting from GFX10 */";
1135 }
else if (
Imm == DppCtrl::WAVE_ROL1) {
1137 O <<
"/* wave_rol is not supported starting from GFX10 */";
1141 }
else if (
Imm == DppCtrl::WAVE_SHR1) {
1143 O <<
"/* wave_shr is not supported starting from GFX10 */";
1147 }
else if (
Imm == DppCtrl::WAVE_ROR1) {
1149 O <<
"/* wave_ror is not supported starting from GFX10 */";
1153 }
else if (
Imm == DppCtrl::ROW_MIRROR) {
1155 }
else if (
Imm == DppCtrl::ROW_HALF_MIRROR) {
1156 O <<
"row_half_mirror";
1157 }
else if (
Imm == DppCtrl::BCAST15) {
1159 O <<
"/* row_bcast is not supported starting from GFX10 */";
1162 O <<
"row_bcast:15";
1163 }
else if (
Imm == DppCtrl::BCAST31) {
1165 O <<
"/* row_bcast is not supported starting from GFX10 */";
1168 O <<
"row_bcast:31";
1169 }
else if ((
Imm >= DppCtrl::ROW_SHARE_FIRST) &&
1170 (
Imm <= DppCtrl::ROW_SHARE_LAST)) {
1172 O <<
"row_newbcast:";
1176 O <<
" /* row_newbcast/row_share is not supported on ASICs earlier "
1177 "than GFX90A/GFX10 */";
1181 }
else if ((
Imm >= DppCtrl::ROW_XMASK_FIRST) &&
1182 (
Imm <= DppCtrl::ROW_XMASK_LAST)) {
1184 O <<
"/* row_xmask is not supported on ASICs earlier than GFX10 */";
1187 O <<
"row_xmask:" <<
formatDec(
Imm - DppCtrl::ROW_XMASK_FIRST);
1189 O <<
"/* Invalid dpp_ctrl value */";
1193void AMDGPUInstPrinter::printDppBoundCtrl(
const MCInst *
MI,
unsigned OpNo,
1196 unsigned Imm =
MI->getOperand(OpNo).getImm();
1198 O <<
" bound_ctrl:1";
1202void AMDGPUInstPrinter::printDppFI(
const MCInst *
MI,
unsigned OpNo,
1204 using namespace llvm::AMDGPU::DPP;
1205 unsigned Imm =
MI->getOperand(OpNo).getImm();
1206 if (
Imm == DPP_FI_1 ||
Imm == DPP8_FI_1) {
1211void AMDGPUInstPrinter::printSDWASel(
const MCInst *
MI,
unsigned OpNo,
1213 using namespace llvm::AMDGPU::SDWA;
1215 unsigned Imm =
MI->getOperand(OpNo).getImm();
1217 case SdwaSel::BYTE_0:
O <<
"BYTE_0";
break;
1218 case SdwaSel::BYTE_1:
O <<
"BYTE_1";
break;
1219 case SdwaSel::BYTE_2:
O <<
"BYTE_2";
break;
1220 case SdwaSel::BYTE_3:
O <<
"BYTE_3";
break;
1221 case SdwaSel::WORD_0:
O <<
"WORD_0";
break;
1222 case SdwaSel::WORD_1:
O <<
"WORD_1";
break;
1223 case SdwaSel::DWORD:
O <<
"DWORD";
break;
1228void AMDGPUInstPrinter::printSDWADstSel(
const MCInst *
MI,
unsigned OpNo,
1232 printSDWASel(
MI, OpNo, O);
1235void AMDGPUInstPrinter::printSDWASrc0Sel(
const MCInst *
MI,
unsigned OpNo,
1239 printSDWASel(
MI, OpNo, O);
1242void AMDGPUInstPrinter::printSDWASrc1Sel(
const MCInst *
MI,
unsigned OpNo,
1246 printSDWASel(
MI, OpNo, O);
1249void AMDGPUInstPrinter::printSDWADstUnused(
const MCInst *
MI,
unsigned OpNo,
1252 using namespace llvm::AMDGPU::SDWA;
1255 unsigned Imm =
MI->getOperand(OpNo).getImm();
1257 case DstUnused::UNUSED_PAD:
O <<
"UNUSED_PAD";
break;
1258 case DstUnused::UNUSED_SEXT:
O <<
"UNUSED_SEXT";
break;
1259 case DstUnused::UNUSED_PRESERVE:
O <<
"UNUSED_PRESERVE";
break;
1264void AMDGPUInstPrinter::printExpSrcN(
const MCInst *
MI,
unsigned OpNo,
1267 unsigned Opc =
MI->getOpcode();
1268 int EnIdx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::en);
1269 unsigned En =
MI->getOperand(EnIdx).getImm();
1271 int ComprIdx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::compr);
1274 if (
MI->getOperand(ComprIdx).getImm())
1275 OpNo = OpNo -
N +
N / 2;
1283void AMDGPUInstPrinter::printExpSrc0(
const MCInst *
MI,
unsigned OpNo,
1286 printExpSrcN(
MI, OpNo, STI, O, 0);
1289void AMDGPUInstPrinter::printExpSrc1(
const MCInst *
MI,
unsigned OpNo,
1292 printExpSrcN(
MI, OpNo, STI, O, 1);
1295void AMDGPUInstPrinter::printExpSrc2(
const MCInst *
MI,
unsigned OpNo,
1298 printExpSrcN(
MI, OpNo, STI, O, 2);
1301void AMDGPUInstPrinter::printExpSrc3(
const MCInst *
MI,
unsigned OpNo,
1304 printExpSrcN(
MI, OpNo, STI, O, 3);
1307void AMDGPUInstPrinter::printExpTgt(
const MCInst *
MI,
unsigned OpNo,
1310 using namespace llvm::AMDGPU::Exp;
1313 unsigned Id =
MI->getOperand(OpNo).getImm() & ((1 << 6) - 1);
1318 O <<
' ' << TgtName;
1322 O <<
" invalid_target_" <<
Id;
1327 bool IsPacked,
bool HasDstSel) {
1331 if (!!(
Ops[
I] &
Mod) != DefaultValue)
1341void AMDGPUInstPrinter::printPackedModifier(
const MCInst *
MI,
1345 unsigned Opc =
MI->getOpcode();
1349 std::pair<AMDGPU::OpName, AMDGPU::OpName> MOps[] = {
1350 {AMDGPU::OpName::src0_modifiers, AMDGPU::OpName::src0},
1351 {AMDGPU::OpName::src1_modifiers, AMDGPU::OpName::src1},
1352 {AMDGPU::OpName::src2_modifiers, AMDGPU::OpName::src2}};
1355 for (
auto [SrcMod, Src] : MOps) {
1359 int ModIdx = AMDGPU::getNamedOperandIdx(
Opc, SrcMod);
1361 (ModIdx != -1) ?
MI->getOperand(ModIdx).getImm() : DefaultValue;
1370 AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src2_modifiers);
1376 (AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::vdst) != -1) ||
1377 (AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::sdst) != -1);
1384 for (AMDGPU::OpName OpName :
1385 {AMDGPU::OpName::src0_modifiers, AMDGPU::OpName::src1_modifiers,
1386 AMDGPU::OpName::src2_modifiers}) {
1387 int Idx = AMDGPU::getNamedOperandIdx(
Opc, OpName);
1404 ListSeparator Sep(
",");
1415void AMDGPUInstPrinter::printOpSel(
const MCInst *
MI,
unsigned,
1418 unsigned Opc =
MI->getOpcode();
1421 AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src0_modifiers);
1422 unsigned Mod =
MI->getOperand(SrcMod).getImm();
1425 if (Index0 || Index1)
1426 O <<
" op_sel:[" << Index0 <<
',' << Index1 <<
']';
1430 auto FIN = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src0_modifiers);
1431 auto BCN = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src1_modifiers);
1435 O <<
" op_sel:[" << FI <<
',' << BC <<
']';
1442void AMDGPUInstPrinter::printOpSelHi(
const MCInst *
MI,
unsigned OpNo,
1448void AMDGPUInstPrinter::printNegLo(
const MCInst *
MI,
unsigned OpNo,
1454void AMDGPUInstPrinter::printNegHi(
const MCInst *
MI,
unsigned OpNo,
1460void AMDGPUInstPrinter::printIndexKey8bit(
const MCInst *
MI,
unsigned OpNo,
1463 auto Imm =
MI->getOperand(OpNo).getImm() & 0x7;
1467 O <<
" index_key:" <<
Imm;
1470void AMDGPUInstPrinter::printIndexKey16bit(
const MCInst *
MI,
unsigned OpNo,
1473 auto Imm =
MI->getOperand(OpNo).getImm() & 0x7;
1477 O <<
" index_key:" <<
Imm;
1480void AMDGPUInstPrinter::printIndexKey32bit(
const MCInst *
MI,
unsigned OpNo,
1483 auto Imm =
MI->getOperand(OpNo).getImm() & 0x7;
1487 O <<
" index_key:" <<
Imm;
1490void AMDGPUInstPrinter::printMatrixFMT(
const MCInst *
MI,
unsigned OpNo,
1493 auto Imm =
MI->getOperand(OpNo).getImm() & 0x7;
1497 O <<
" matrix_" << AorB <<
"_fmt:";
1504void AMDGPUInstPrinter::printMatrixAFMT(
const MCInst *
MI,
unsigned OpNo,
1507 printMatrixFMT(
MI, OpNo, STI, O,
'a');
1510void AMDGPUInstPrinter::printMatrixBFMT(
const MCInst *
MI,
unsigned OpNo,
1513 printMatrixFMT(
MI, OpNo, STI, O,
'b');
1516void AMDGPUInstPrinter::printMatrixScale(
const MCInst *
MI,
unsigned OpNo,
1519 auto Imm =
MI->getOperand(OpNo).getImm() & 1;
1523 O <<
" matrix_" << AorB <<
"_scale:";
1530void AMDGPUInstPrinter::printMatrixAScale(
const MCInst *
MI,
unsigned OpNo,
1533 printMatrixScale(
MI, OpNo, STI, O,
'a');
1536void AMDGPUInstPrinter::printMatrixBScale(
const MCInst *
MI,
unsigned OpNo,
1539 printMatrixScale(
MI, OpNo, STI, O,
'b');
1542void AMDGPUInstPrinter::printMatrixScaleFmt(
const MCInst *
MI,
unsigned OpNo,
1545 auto Imm =
MI->getOperand(OpNo).getImm() & 3;
1549 O <<
" matrix_" << AorB <<
"_scale_fmt:";
1556void AMDGPUInstPrinter::printMatrixAScaleFmt(
const MCInst *
MI,
unsigned OpNo,
1559 printMatrixScaleFmt(
MI, OpNo, STI, O,
'a');
1562void AMDGPUInstPrinter::printMatrixBScaleFmt(
const MCInst *
MI,
unsigned OpNo,
1565 printMatrixScaleFmt(
MI, OpNo, STI, O,
'b');
1568void AMDGPUInstPrinter::printInterpSlot(
const MCInst *
MI,
unsigned OpNum,
1571 unsigned Imm =
MI->getOperand(OpNum).getImm();
1583 O <<
"invalid_param_" <<
Imm;
1587void AMDGPUInstPrinter::printInterpAttr(
const MCInst *
MI,
unsigned OpNum,
1590 unsigned Attr =
MI->getOperand(OpNum).getImm();
1591 O <<
"attr" << Attr;
1594void AMDGPUInstPrinter::printInterpAttrChan(
const MCInst *
MI,
unsigned OpNum,
1597 unsigned Chan =
MI->getOperand(OpNum).getImm();
1598 O <<
'.' <<
"xyzw"[Chan & 0x3];
1601void AMDGPUInstPrinter::printGPRIdxMode(
const MCInst *
MI,
unsigned OpNo,
1604 using namespace llvm::AMDGPU::VGPRIndexMode;
1605 unsigned Val =
MI->getOperand(OpNo).getImm();
1607 if ((Val & ~ENABLE_MASK) != 0) {
1608 O << formatHex(static_cast<uint64_t>(Val));
1611 ListSeparator Sep(
",");
1612 for (
unsigned ModeId = ID_MIN; ModeId <=
ID_MAX; ++ModeId) {
1613 if (Val & (1 << ModeId))
1620void AMDGPUInstPrinter::printMemOperand(
const MCInst *
MI,
unsigned OpNo,
1623 printRegularOperand(
MI, OpNo, STI, O);
1625 printRegularOperand(
MI, OpNo + 1, STI, O);
1633 if (
Op.getImm() == 1) {
1644 if (
Op.getImm() == 1)
1651 int Imm =
MI->getOperand(OpNo).getImm();
1665 const unsigned Imm16 =
MI->getOperand(OpNo).getImm();
1676 O <<
"sendmsg(" << MsgName;
1685 O <<
"sendmsg(" << MsgId <<
", " << OpId <<
", " <<
StreamId <<
')';
1695 const uint16_t Imm16 =
static_cast<uint16_t
>(
MI->getOperand(OpNo).
getImm());
1698 if (EventName.
empty())
1699 O << formatHex(static_cast<uint64_t>(Imm16));
1710 uint16_t Probe0 = ((0 & AndMask) | OrMask) ^ XorMask;
1715 for (
unsigned Mask = 1 << (
BITMASK_WIDTH - 1); Mask > 0; Mask >>= 1) {
1742 uint16_t
Imm =
MI->getOperand(OpNo).getImm();
1785 }
else if (AndMask ==
BITMASK_MAX && OrMask == 0 && XorMask > 0 &&
1796 if (GroupSize > 1 &&
1798 OrMask < GroupSize &&
1816 printU16ImmDecOperand(
MI, OpNo, O);
1825 unsigned SImm16 =
MI->getOperand(OpNo).getImm();
1826 unsigned Vmcnt, Expcnt, Lgkmcnt;
1832 bool PrintAll = IsDefaultVmcnt && IsDefaultExpcnt && IsDefaultLgkmcnt;
1836 if (!IsDefaultVmcnt || PrintAll)
1837 O << Sep <<
"vmcnt(" << Vmcnt <<
')';
1839 if (!IsDefaultExpcnt || PrintAll)
1840 O << Sep <<
"expcnt(" << Expcnt <<
')';
1842 if (!IsDefaultLgkmcnt || PrintAll)
1843 O << Sep <<
"lgkmcnt(" << Lgkmcnt <<
')';
1851 uint64_t Imm16 =
MI->getOperand(OpNo).getImm() & 0xffff;
1853 bool HasNonDefaultVal =
false;
1861 if (!IsDefault || !HasNonDefaultVal)
1862 O << Sep << Name <<
'(' << Val <<
')';
1872 const char *BadInstId =
"/* invalid instid value */";
1873 static const std::array<const char *, 12> InstIds = {
1874 "NO_DEP",
"VALU_DEP_1",
"VALU_DEP_2",
1875 "VALU_DEP_3",
"VALU_DEP_4",
"TRANS32_DEP_1",
1876 "TRANS32_DEP_2",
"TRANS32_DEP_3",
"FMA_ACCUM_CYCLE_1",
1877 "SALU_CYCLE_1",
"SALU_CYCLE_2",
"SALU_CYCLE_3"};
1879 const char *BadInstSkip =
"/* invalid instskip value */";
1880 static const std::array<const char *, 6> InstSkips = {
1881 "SAME",
"NEXT",
"SKIP_1",
"SKIP_2",
"SKIP_3",
"SKIP_4"};
1883 unsigned SImm16 =
MI->getOperand(OpNo).getImm();
1884 const char *Prefix =
"";
1886 unsigned Value = SImm16 & 0xF;
1888 const char *Name =
Value < InstIds.size() ? InstIds[
Value] : BadInstId;
1889 O << Prefix <<
"instid0(" << Name <<
')';
1893 Value = (SImm16 >> 4) & 7;
1896 Value < InstSkips.size() ? InstSkips[
Value] : BadInstSkip;
1897 O << Prefix <<
"instskip(" << Name <<
')';
1901 Value = (SImm16 >> 7) & 0xF;
1903 const char *Name =
Value < InstIds.size() ? InstIds[
Value] : BadInstId;
1904 O << Prefix <<
"instid1(" << Name <<
')';
1915 unsigned Val =
MI->getOperand(OpNo).getImm();
1920 if (!HwRegName.
empty()) {
1926 O <<
", " <<
Offset <<
", " << Width;
1933 uint16_t
Imm =
MI->getOperand(OpNo).getImm();
1941void AMDGPUInstPrinter::printNamedInt(
const MCInst *
MI,
unsigned OpNo,
1944 bool PrintInHex,
bool AlwaysPrint) {
1945 int64_t V =
MI->getOperand(OpNo).getImm();
1946 if (AlwaysPrint || V != 0)
1950void AMDGPUInstPrinter::printBitOp3(
const MCInst *
MI,
unsigned OpNo,
1961 O << formatHex(static_cast<uint64_t>(
Imm));
1964void AMDGPUInstPrinter::printScaleSel(
const MCInst *
MI,
unsigned OpNo,
1967 uint8_t
Imm =
MI->getOperand(OpNo).getImm();
1974#include "AMDGPUGenAsmWriter.inc"
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static void printSwizzleBitmask(const uint16_t AndMask, const uint16_t OrMask, const uint16_t XorMask, raw_ostream &O)
static bool printImmediateBFloat16(uint32_t Imm, const MCSubtargetInfo &STI, raw_ostream &O)
static bool allOpsDefaultValue(const int *Ops, int NumOps, int Mod, bool IsPacked, bool HasDstSel)
static MCRegister getRegForPrinting(MCRegister Reg, const MCRegisterInfo &MRI)
static MCRegister getRegFromMIA(MCRegister Reg, unsigned OpNo, const MCInstrDesc &Desc, const MCRegisterInfo &MRI, const AMDGPUMCInstrAnalysis &MIA)
static bool printImmediateFP16(uint32_t Imm, const MCSubtargetInfo &STI, raw_ostream &O)
Provides AMDGPU specific target descriptions.
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
if(auto Err=PB.parsePassPipeline(MPM, Passes)) return wrap(std MPM run * Mod
void printSwizzle(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
void printWaitEvent(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
void printEndpgm(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
static const char * getRegisterName(MCRegister Reg)
static void printIfSet(const MCInst *MI, unsigned OpNo, raw_ostream &O, StringRef Asm, StringRef Default="")
void printDepCtr(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
void printHwreg(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
void printSendMsg(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
static void printRegOperand(MCRegister Reg, raw_ostream &O, const MCRegisterInfo &MRI)
void printRegName(raw_ostream &OS, MCRegister Reg) override
Print the assembler register name.
void printInst(const MCInst *MI, uint64_t Address, StringRef Annot, const MCSubtargetInfo &STI, raw_ostream &O) override
Print the specified MCInst to the specified raw_ostream.
void printInstruction(const MCInst *MI, uint64_t Address, const MCSubtargetInfo &STI, raw_ostream &O)
void printSWaitCnt(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
void printOModSI(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
void printSDelayALU(const MCInst *MI, unsigned OpNo, const MCSubtargetInfo &STI, raw_ostream &O)
unsigned getVgprMSBs() const
A helper class to return the specified delimiter string after the first invocation of operator String...
void printExpr(raw_ostream &, const MCExpr &) const
format_object< int64_t > formatHex(int64_t Value) const
format_object< int64_t > formatDec(int64_t Value) const
Utility functions to print decimal/hexadecimal values.
const MCRegisterInfo & MRI
void printAnnotation(raw_ostream &OS, StringRef Annot)
Utility function for printing annotations.
const MCInstrAnalysis * MIA
Instances of this class represent a single low-level machine instruction.
Describe properties that are true of each instruction in the target description file.
bool isLookupRegClassByHwMode() const
Set if this operand is a value that requires the current hwmode to look up its register class.
int16_t RegClass
This specifies the register class enumeration of the operand if the operand is a register.
Instances of this class represent operands of the MCInst class.
MCRegisterClass - Base class of TargetRegisterClass.
unsigned getID() const
getID() - Return the register class ID number.
MCRegister getRegister(unsigned i) const
getRegister - Return the specified register in the class.
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...
uint16_t getEncodingValue(MCRegister Reg) const
Returns the encoding for Reg.
Wrapper class representing physical registers. Should be passed by value.
Generic base class for all target subtargets.
bool hasFeature(unsigned Feature) const
virtual unsigned getHwMode(enum HwModeType type=HwMode_Default) const
HwMode ID corresponding to the 'type' parameter is retrieved from the HwMode bit set of the current s...
Represent a constant reference to a string, i.e.
constexpr bool empty() const
Check if the string is empty.
LLVM Value Representation.
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
bool decodeDepCtr(unsigned Code, int &Id, StringRef &Name, unsigned &Val, bool &IsDefault, const MCSubtargetInfo &STI)
bool isSymbolicDepCtrEncoding(unsigned Code, bool &HasNonDefaultVal, const MCSubtargetInfo &STI)
bool isSupportedTgtId(unsigned Id, const MCSubtargetInfo &STI)
bool getTgtName(unsigned Id, StringRef &Name, int &Index)
StringRef getHwreg(uint64_t Encoding, const MCSubtargetInfo &STI)
uint64_t encodeMsg(uint64_t MsgId, uint64_t OpId, uint64_t StreamId)
bool msgSupportsStream(int64_t MsgId, int64_t OpId, const MCSubtargetInfo &STI)
void decodeMsg(unsigned Val, uint16_t &MsgId, uint16_t &OpId, uint16_t &StreamId, const MCSubtargetInfo &STI)
StringRef getMsgName(uint64_t Encoding, const MCSubtargetInfo &STI)
Map from an encoding to the symbolic name for a msg_id immediate.
bool isValidMsgStream(int64_t MsgId, int64_t OpId, int64_t StreamId, const MCSubtargetInfo &STI, bool Strict)
StringRef getMsgOpName(int64_t MsgId, uint64_t Encoding, const MCSubtargetInfo &STI)
Map from an encoding to the symbolic name for a sendmsg operation.
bool msgRequiresOp(int64_t MsgId, const MCSubtargetInfo &STI)
bool isValidMsgOp(int64_t MsgId, int64_t OpId, const MCSubtargetInfo &STI, bool Strict)
const char *const IdSymbolic[]
constexpr const char *const ModMatrixFmt[]
constexpr const char *const ModMatrixScaleFmt[]
constexpr const char *const ModMatrixScale[]
StringRef getWaitEventMaskName(uint64_t Encoding, const MCSubtargetInfo &STI)
bool isInlineValue(MCRegister Reg)
bool isVOPCAsmOnly(unsigned Opc)
unsigned getTemporalHintType(const MCInstrDesc TID)
unsigned getNumFlatOffsetBits(const MCSubtargetInfo &ST)
For pre-GFX12 FLAT instructions the offset must be positive; MSB is ignored and forced to zero.
bool isGFX12Plus(const MCSubtargetInfo &STI)
const MCRegisterClass * getVGPRPhysRegClass(MCRegister Reg, const MCRegisterInfo &MRI)
bool isGFX940(const MCSubtargetInfo &STI)
LLVM_ABI IsaVersion getIsaVersion(StringRef GPU)
LLVM_READNONE bool isLegalDPALU_DPPControl(const MCSubtargetInfo &ST, unsigned DC)
bool isSI(const MCSubtargetInfo &STI)
Waitcnt decodeWaitcnt(const IsaVersion &Version, unsigned Encoded)
LLVM_READONLY bool hasNamedOperand(uint64_t Opcode, OpName NamedIdx)
bool getVOP3IsSingle(unsigned Opc)
bool getVOP1IsSingle(unsigned Opc)
bool isGFX90A(const MCSubtargetInfo &STI)
LLVM_READONLY const MIMGDimInfo * getMIMGDimInfoByEncoding(uint8_t DimEnc)
bool isGFX12(const MCSubtargetInfo &STI)
MCRegister getVGPRWithMSBs(MCRegister Reg, unsigned MSBs, const MCRegisterInfo &MRI)
If Reg is a low VGPR return a corresponding high VGPR with MSBs set.
unsigned getVmcntBitMask(const IsaVersion &Version)
LLVM_READNONE bool isInlinableIntLiteral(int64_t Literal)
Is this literal inlinable, and not one of the values intended for floating point values.
unsigned getLgkmcntBitMask(const IsaVersion &Version)
std::pair< const AMDGPU::OpName *, const AMDGPU::OpName * > getVGPRLoweringOperandTables(const MCInstrDesc &Desc)
unsigned getExpcntBitMask(const IsaVersion &Version)
bool isGFX11Plus(const MCSubtargetInfo &STI)
bool isGFX10Plus(const MCSubtargetInfo &STI)
@ OPERAND_REG_INLINE_C_FP64
@ OPERAND_REG_IMM_NOINLINE_FP16
@ OPERAND_REG_INLINE_C_BF16
@ OPERAND_REG_INLINE_C_V2BF16
@ OPERAND_REG_IMM_V2INT64
@ OPERAND_REG_IMM_V2INT16
@ OPERAND_REG_IMM_INT32
Operands with register, 32-bit, or 64-bit immediate.
@ OPERAND_REG_IMM_V2FP16_SPLAT
@ OPERAND_REG_INLINE_C_INT64
@ OPERAND_REG_INLINE_C_INT16
Operands with register or inline constant.
@ OPERAND_REG_IMM_NOINLINE_V2FP16
@ OPERAND_REG_INLINE_C_V2FP16
@ OPERAND_REG_INLINE_AC_INT32
Operands with an AccVGPR register or inline constant.
@ OPERAND_REG_INLINE_AC_FP32
@ OPERAND_REG_IMM_V2INT32
@ OPERAND_REG_INLINE_C_FP32
@ OPERAND_REG_INLINE_C_INT32
@ OPERAND_REG_INLINE_C_V2INT16
@ OPERAND_REG_INLINE_AC_FP64
@ OPERAND_REG_INLINE_C_FP16
@ OPERAND_INLINE_SPLIT_BARRIER_INT32
bool isDPALU_DPP(const MCInstrDesc &OpDesc, const MCInstrInfo &MII, const MCSubtargetInfo &ST)
bool isGFX9Plus(const MCSubtargetInfo &STI)
bool isRsrcIndexReg(MCRegister Reg, const MCRegisterInfo &MRI)
bool isCvt_F32_Fp8_Bf8_e64(unsigned Opc)
MCRegister mc2PseudoReg(MCRegister Reg)
Convert hardware register Reg to a pseudo register.
bool isCI(const MCSubtargetInfo &STI)
bool getVOP2IsSingle(unsigned Opc)
LLVM_READONLY StringRef getMIMGDimInfoStr(StringTable::Offset)
bool isPermlane16(unsigned Opc)
constexpr bool isVOPC(const T &...O)
constexpr bool isVOP3(const T &...O)
constexpr bool hasVOP3OpSel(const T &...O)
constexpr bool isVOP1(const T &...O)
constexpr bool isVOP2(const T &...O)
constexpr bool isSWMMAC(const T &...O)
constexpr bool isBuffer(const T &...O)
constexpr bool isMTBUF(const T &...O)
constexpr bool isSMRD(const T &...O)
constexpr bool isWMMA(const T &...O)
constexpr bool isSDWA(const T &...O)
constexpr bool isPacked(const T &...O)
constexpr bool isDPP(const T &...O)
constexpr bool isSegmentSpecificFLAT(const T &...O)
Scope
Defines the scope in which this symbol should be visible: Default – Visible in the public interface o...
This is an optimization pass for GlobalISel generic memory operations.
constexpr bool isInt(int64_t x)
Checks if an integer fits into the given bit width.
constexpr bool isPowerOf2_64(uint64_t Value)
Return true if the argument is a power of two > 0 (64 bit edition.)
constexpr int popcount(T Value) noexcept
Count the number of set bits in a value.
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.
constexpr uint32_t Lo_32(uint64_t Value)
Return the low 32 bits of a 64 bit value.
@ Mod
The access may modify the value stored in memory.
To bit_cast(const From &from) noexcept
DWARFExpression::Operation Op
constexpr int32_t SignExtend32(uint32_t X)
Sign-extend the number in the bottom B bits of X to a 32-bit integer.
@ Default
The result value is uniform if and only if all operands are uniform.
static constexpr ValueType Default
static std::tuple< typename Fields::ValueType... > decode(uint64_t Encoded)
Instruction set architecture version.
StringTable::Offset AsmSuffix