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();
114 const MCInstrDesc &
Desc =
MII.get(
MI->getOpcode());
117 O << formatDec(SignExtend32<24>(
Imm));
119 printU16ImmDecOperand(
MI, OpNo, O);
123void AMDGPUInstPrinter::printFlatOffset(
const MCInst *
MI,
unsigned OpNo,
126 uint32_t
Imm =
MI->getOperand(OpNo).getImm();
130 const MCInstrDesc &
Desc =
MII.get(
MI->getOpcode());
133 STI.
hasFeature(AMDGPU::FeatureFlatSignedOffset);
138 printU16ImmDecOperand(
MI, OpNo, O);
142void AMDGPUInstPrinter::printSMRDOffset8(
const MCInst *
MI,
unsigned OpNo,
145 printU32ImmOperand(
MI, OpNo, STI, O);
148void AMDGPUInstPrinter::printSMEMOffset(
const MCInst *
MI,
unsigned OpNo,
154void AMDGPUInstPrinter::printSMRDLiteralOffset(
const MCInst *
MI,
unsigned OpNo,
157 printU32ImmOperand(
MI, OpNo, STI, O);
160void AMDGPUInstPrinter::printCPol(
const MCInst *
MI,
unsigned OpNo,
162 auto Imm =
MI->getOperand(OpNo).getImm();
169 O <<
" scale_offset";
171 printTH(
MI, TH, Scope, O);
172 printScope(Scope, O);
190 O <<
" /* unexpected cache policy bit */";
193void AMDGPUInstPrinter::printTH(
const MCInst *
MI, int64_t TH, int64_t Scope,
199 const unsigned Opcode =
MI->getOpcode();
200 const MCInstrDesc &TID =
MII.get(Opcode);
223 O << (IsStore ?
"TH_STORE_" :
"TH_LOAD_");
233 : (IsStore ?
"WB" :
"LU"));
254void AMDGPUInstPrinter::printScope(int64_t Scope,
raw_ostream &O) {
270void AMDGPUInstPrinter::printDim(
const MCInst *
MI,
unsigned OpNo,
272 unsigned Dim =
MI->getOperand(OpNo).getImm();
273 O <<
" dim:SQ_RSRC_IMG_";
282void AMDGPUInstPrinter::printR128A16(
const MCInst *
MI,
unsigned OpNo,
285 printNamedBit(
MI, OpNo, O,
"a16");
287 printNamedBit(
MI, OpNo, O,
"r128");
290void AMDGPUInstPrinter::printFORMAT(
const MCInst *
MI,
unsigned OpNo,
295void AMDGPUInstPrinter::printSymbolicFormat(
const MCInst *
MI,
298 using namespace llvm::AMDGPU::MTBUFFormat;
301 AMDGPU::getNamedOperandIdx(
MI->getOpcode(), AMDGPU::OpName::format);
304 unsigned Val =
MI->getOperand(OpNo).getImm();
306 if (Val == UFMT_DEFAULT)
311 O <<
" format:" << Val;
314 if (Val == DFMT_NFMT_DEFAULT)
321 if (Dfmt != DFMT_DEFAULT) {
323 if (Nfmt != NFMT_DEFAULT) {
327 if (Nfmt != NFMT_DEFAULT) {
332 O <<
" format:" << Val;
345 unsigned RegNo = Idx % 0x100;
347 if (RC->
getID() == AMDGPU::VGPR_16RegClassID) {
373 unsigned Opc =
Desc.getOpcode();
375 for (
I = 0;
I < 4; ++
I) {
376 if (
Ops.first[
I] != AMDGPU::OpName::NUM_OPERAND_NAMES &&
377 (
unsigned)AMDGPU::getNamedOperandIdx(
Opc,
Ops.first[
I]) == OpNo)
379 if (
Ops.second &&
Ops.second[
I] != AMDGPU::OpName::NUM_OPERAND_NAMES &&
380 (
unsigned)AMDGPU::getNamedOperandIdx(
Opc,
Ops.second[
I]) == OpNo)
385 unsigned OpMSBs = (VgprMSBs >> (
I * 2)) & 3;
399 case AMDGPU::PRIVATE_RSRC_REG:
422void AMDGPUInstPrinter::printVOPDst(
const MCInst *
MI,
unsigned OpNo,
424 auto Opcode =
MI->getOpcode();
442 printRegularOperand(
MI, OpNo, STI, O);
448 case AMDGPU::V_ADD_CO_CI_U32_e32_gfx10:
449 case AMDGPU::V_SUB_CO_CI_U32_e32_gfx10:
450 case AMDGPU::V_SUBREV_CO_CI_U32_e32_gfx10:
451 case AMDGPU::V_ADD_CO_CI_U32_sdwa_gfx10:
452 case AMDGPU::V_SUB_CO_CI_U32_sdwa_gfx10:
453 case AMDGPU::V_SUBREV_CO_CI_U32_sdwa_gfx10:
454 case AMDGPU::V_ADD_CO_CI_U32_dpp_gfx10:
455 case AMDGPU::V_SUB_CO_CI_U32_dpp_gfx10:
456 case AMDGPU::V_SUBREV_CO_CI_U32_dpp_gfx10:
457 case AMDGPU::V_ADD_CO_CI_U32_dpp8_gfx10:
458 case AMDGPU::V_SUB_CO_CI_U32_dpp8_gfx10:
459 case AMDGPU::V_SUBREV_CO_CI_U32_dpp8_gfx10:
460 case AMDGPU::V_ADD_CO_CI_U32_e32_gfx11:
461 case AMDGPU::V_SUB_CO_CI_U32_e32_gfx11:
462 case AMDGPU::V_SUBREV_CO_CI_U32_e32_gfx11:
463 case AMDGPU::V_ADD_CO_CI_U32_dpp_gfx11:
464 case AMDGPU::V_SUB_CO_CI_U32_dpp_gfx11:
465 case AMDGPU::V_SUBREV_CO_CI_U32_dpp_gfx11:
466 case AMDGPU::V_ADD_CO_CI_U32_dpp8_gfx11:
467 case AMDGPU::V_SUB_CO_CI_U32_dpp8_gfx11:
468 case AMDGPU::V_SUBREV_CO_CI_U32_dpp8_gfx11:
469 case AMDGPU::V_ADD_CO_CI_U32_e32_gfx12:
470 case AMDGPU::V_SUB_CO_CI_U32_e32_gfx12:
471 case AMDGPU::V_SUBREV_CO_CI_U32_e32_gfx12:
472 case AMDGPU::V_ADD_CO_CI_U32_dpp_gfx12:
473 case AMDGPU::V_SUB_CO_CI_U32_dpp_gfx12:
474 case AMDGPU::V_SUBREV_CO_CI_U32_dpp_gfx12:
475 case AMDGPU::V_ADD_CO_CI_U32_dpp8_gfx12:
476 case AMDGPU::V_SUB_CO_CI_U32_dpp8_gfx12:
477 case AMDGPU::V_SUBREV_CO_CI_U32_dpp8_gfx12:
478 case AMDGPU::V_ADD_CO_CI_U32_e32_gfx13:
479 case AMDGPU::V_SUB_CO_CI_U32_e32_gfx13:
480 case AMDGPU::V_SUBREV_CO_CI_U32_e32_gfx13:
481 case AMDGPU::V_ADD_CO_CI_U32_dpp_gfx13:
482 case AMDGPU::V_SUB_CO_CI_U32_dpp_gfx13:
483 case AMDGPU::V_SUBREV_CO_CI_U32_dpp_gfx13:
484 case AMDGPU::V_ADD_CO_CI_U32_dpp8_gfx13:
485 case AMDGPU::V_SUB_CO_CI_U32_dpp8_gfx13:
486 case AMDGPU::V_SUBREV_CO_CI_U32_dpp8_gfx13:
487 printDefaultVccOperand(
false, STI, O);
492void AMDGPUInstPrinter::printVINTRPDst(
const MCInst *
MI,
unsigned OpNo,
499 printRegularOperand(
MI, OpNo, STI, O);
502void AMDGPUInstPrinter::printAVLdSt32Align2RegOp(
const MCInst *
MI,
506 MCRegister
Reg =
MI->getOperand(OpNo).getReg();
509 if (MCRegister SubReg =
MRI.getSubReg(
Reg, AMDGPU::sub0))
514void AMDGPUInstPrinter::printImmediateInt16(uint32_t
Imm,
517 int32_t SImm =
static_cast<int32_t
>(
Imm);
523 if (printImmediateFloat32(
Imm, STI, O))
526 O << formatHex(static_cast<uint64_t>(
Imm & 0xffff));
533 else if (
Imm == 0xBC00)
535 else if (
Imm == 0x3800)
537 else if (
Imm == 0xB800)
539 else if (
Imm == 0x4000)
541 else if (
Imm == 0xC000)
543 else if (
Imm == 0x4400)
545 else if (
Imm == 0xC400)
547 else if (
Imm == 0x3118 && STI.
hasFeature(AMDGPU::FeatureInv2PiInlineImm))
559 else if (
Imm == 0xBF80)
561 else if (
Imm == 0x3F00)
563 else if (
Imm == 0xBF00)
565 else if (
Imm == 0x4000)
567 else if (
Imm == 0xC000)
569 else if (
Imm == 0x4080)
571 else if (
Imm == 0xC080)
573 else if (
Imm == 0x3E22 && STI.
hasFeature(AMDGPU::FeatureInv2PiInlineImm))
581void AMDGPUInstPrinter::printImmediateBF16(uint32_t
Imm,
584 int16_t SImm =
static_cast<int16_t
>(
Imm);
593 O << formatHex(static_cast<uint64_t>(
Imm));
596void AMDGPUInstPrinter::printImmediateF16(uint32_t
Imm,
599 int16_t SImm =
static_cast<int16_t
>(
Imm);
605 uint16_t HImm =
static_cast<uint16_t
>(
Imm);
609 uint64_t
Imm16 =
static_cast<uint16_t
>(
Imm);
613void AMDGPUInstPrinter::printImmediateV216(uint32_t
Imm, uint8_t OpType,
616 int32_t SImm =
static_cast<int32_t
>(
Imm);
625 if (printImmediateFloat32(
Imm, STI, O))
639 uint16_t Lo16 =
static_cast<uint16_t
>(
Imm & 0xFFFF);
640 uint16_t Hi16 =
static_cast<uint16_t
>((
Imm >> 16) & 0xFFFF);
665 O << formatHex(static_cast<uint64_t>(
Imm));
668bool AMDGPUInstPrinter::printImmediateFloat32(uint32_t
Imm,
689 else if (
Imm == 0x3e22f983 &&
690 STI.
hasFeature(AMDGPU::FeatureInv2PiInlineImm))
698void AMDGPUInstPrinter::printImmediate32(uint32_t
Imm,
701 int32_t SImm =
static_cast<int32_t
>(
Imm);
707 if (printImmediateFloat32(
Imm, STI, O))
710 O << formatHex(static_cast<uint64_t>(
Imm));
713void AMDGPUInstPrinter::printImmediate64(uint64_t
Imm,
716 int64_t SImm =
static_cast<int64_t
>(
Imm);
717 if (SImm >= -16 && SImm <= 64) {
740 else if (
Imm == 0x3fc45f306dc9c882 &&
741 STI.
hasFeature(AMDGPU::FeatureInv2PiInlineImm))
742 O <<
"0.15915494309189532";
744 printLiteral64(
Imm, O, IsFP);
747void AMDGPUInstPrinter::printLiteral64(uint64_t
Imm,
raw_ostream &O,
750 O << formatHex(static_cast<uint64_t>(
Hi_32(
Imm)));
755void AMDGPUInstPrinter::printBLGP(
const MCInst *
MI,
unsigned OpNo,
758 unsigned Imm =
MI->getOperand(OpNo).getImm();
763 switch (
MI->getOpcode()) {
764 case AMDGPU::V_MFMA_F64_16X16X4F64_gfx940_acd:
765 case AMDGPU::V_MFMA_F64_16X16X4F64_gfx940_vcd:
766 case AMDGPU::V_MFMA_F64_4X4X4F64_gfx940_acd:
767 case AMDGPU::V_MFMA_F64_4X4X4F64_gfx940_vcd:
768 O <<
" neg:[" << (
Imm & 1) <<
',' << ((
Imm >> 1) & 1) <<
','
769 << ((
Imm >> 2) & 1) <<
']';
774 O <<
" blgp:" <<
Imm;
777void AMDGPUInstPrinter::printDefaultVccOperand(
bool FirstOperand,
791 unsigned OpNo)
const {
795 (
Desc.hasImplicitDefOfPhysReg(AMDGPU::VCC) ||
796 Desc.hasImplicitDefOfPhysReg(AMDGPU::VCC_LO));
800void AMDGPUInstPrinter::printOperand(
const MCInst *
MI,
unsigned OpNo,
803 unsigned Opc =
MI->getOpcode();
805 int ModIdx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src0_modifiers);
812 (
Desc.hasImplicitDefOfPhysReg(AMDGPU::VCC) ||
813 Desc.hasImplicitDefOfPhysReg(AMDGPU::VCC_LO)))
814 printDefaultVccOperand(
true, STI, O);
816 printRegularOperand(
MI, OpNo, STI, O);
820void AMDGPUInstPrinter::printRegularOperand(
const MCInst *
MI,
unsigned OpNo,
823 const MCInstrDesc &
Desc =
MII.get(
MI->getOpcode());
825 if (OpNo >=
MI->getNumOperands()) {
826 O <<
"/*Missing OP" << OpNo <<
"*/";
830 const MCOperand &
Op =
MI->getOperand(OpNo);
837 const MCOperandInfo &OpInfo =
Desc.operands()[OpNo];
839 int16_t RCID =
MII.getOpRegClassID(
841 const MCRegisterClass &RC =
MRI.getRegClass(RCID);
845 (OpInfo.
RegClass == AMDGPU::SReg_1 ||
846 OpInfo.
RegClass == AMDGPU::SReg_1_XEXEC);
853 O <<
"/*Invalid register, operand has \'" <<
MRI.getRegClassName(&RC)
854 <<
"\' register class*/";
858 }
else if (
Op.isImm()) {
859 const uint8_t OpTy =
Desc.operands()[OpNo].OperandType;
871 printImmediate32(
Op.getImm(), STI, O);
876 printImmediate64(
Op.getImm(), STI, O,
false);
882 printImmediate64(
Op.getImm(), STI, O,
true);
886 printImmediateInt16(
Op.getImm(), STI, O);
890 printImmediateF16(
Op.getImm(), STI, O);
894 printImmediateBF16(
Op.getImm(), STI, O);
904 printImmediateV216(
Op.getImm(), OpTy, STI, O);
913 printImmediate32(
Op.getImm(), STI, O);
914 O <<
"/*Invalid immediate*/";
921 }
else if (
Op.isExpr()) {
922 const MCExpr *
Exp =
Op.getExpr();
923 MAI.printExpr(O, *Exp);
929 switch (
MI->getOpcode()) {
932 case AMDGPU::V_CNDMASK_B32_e32_gfx10:
933 case AMDGPU::V_ADD_CO_CI_U32_e32_gfx10:
934 case AMDGPU::V_SUB_CO_CI_U32_e32_gfx10:
935 case AMDGPU::V_SUBREV_CO_CI_U32_e32_gfx10:
936 case AMDGPU::V_ADD_CO_CI_U32_dpp_gfx10:
937 case AMDGPU::V_SUB_CO_CI_U32_dpp_gfx10:
938 case AMDGPU::V_SUBREV_CO_CI_U32_dpp_gfx10:
939 case AMDGPU::V_CNDMASK_B32_dpp8_gfx10:
940 case AMDGPU::V_ADD_CO_CI_U32_dpp8_gfx10:
941 case AMDGPU::V_SUB_CO_CI_U32_dpp8_gfx10:
942 case AMDGPU::V_SUBREV_CO_CI_U32_dpp8_gfx10:
943 case AMDGPU::V_CNDMASK_B32_e32_gfx11:
944 case AMDGPU::V_ADD_CO_CI_U32_e32_gfx11:
945 case AMDGPU::V_SUB_CO_CI_U32_e32_gfx11:
946 case AMDGPU::V_SUBREV_CO_CI_U32_e32_gfx11:
947 case AMDGPU::V_ADD_CO_CI_U32_dpp_gfx11:
948 case AMDGPU::V_SUB_CO_CI_U32_dpp_gfx11:
949 case AMDGPU::V_SUBREV_CO_CI_U32_dpp_gfx11:
950 case AMDGPU::V_CNDMASK_B32_dpp8_gfx11:
951 case AMDGPU::V_ADD_CO_CI_U32_dpp8_gfx11:
952 case AMDGPU::V_SUB_CO_CI_U32_dpp8_gfx11:
953 case AMDGPU::V_SUBREV_CO_CI_U32_dpp8_gfx11:
954 case AMDGPU::V_CNDMASK_B32_e32_gfx12:
955 case AMDGPU::V_ADD_CO_CI_U32_e32_gfx12:
956 case AMDGPU::V_SUB_CO_CI_U32_e32_gfx12:
957 case AMDGPU::V_SUBREV_CO_CI_U32_e32_gfx12:
958 case AMDGPU::V_CNDMASK_B32_dpp_gfx12:
959 case AMDGPU::V_ADD_CO_CI_U32_dpp_gfx12:
960 case AMDGPU::V_SUB_CO_CI_U32_dpp_gfx12:
961 case AMDGPU::V_SUBREV_CO_CI_U32_dpp_gfx12:
962 case AMDGPU::V_CNDMASK_B32_dpp8_gfx12:
963 case AMDGPU::V_ADD_CO_CI_U32_dpp8_gfx12:
964 case AMDGPU::V_SUB_CO_CI_U32_dpp8_gfx12:
965 case AMDGPU::V_SUBREV_CO_CI_U32_dpp8_gfx12:
966 case AMDGPU::V_CNDMASK_B32_e32_gfx13:
967 case AMDGPU::V_ADD_CO_CI_U32_e32_gfx13:
968 case AMDGPU::V_SUB_CO_CI_U32_e32_gfx13:
969 case AMDGPU::V_SUBREV_CO_CI_U32_e32_gfx13:
970 case AMDGPU::V_CNDMASK_B32_dpp_gfx13:
971 case AMDGPU::V_ADD_CO_CI_U32_dpp_gfx13:
972 case AMDGPU::V_SUB_CO_CI_U32_dpp_gfx13:
973 case AMDGPU::V_SUBREV_CO_CI_U32_dpp_gfx13:
974 case AMDGPU::V_CNDMASK_B32_dpp8_gfx13:
975 case AMDGPU::V_ADD_CO_CI_U32_dpp8_gfx13:
976 case AMDGPU::V_SUB_CO_CI_U32_dpp8_gfx13:
977 case AMDGPU::V_SUBREV_CO_CI_U32_dpp8_gfx13:
979 case AMDGPU::V_CNDMASK_B32_e32_gfx6_gfx7:
980 case AMDGPU::V_CNDMASK_B32_e32_vi:
981 if ((
int)OpNo == AMDGPU::getNamedOperandIdx(
MI->getOpcode(),
982 AMDGPU::OpName::src1))
983 printDefaultVccOperand(OpNo == 0, STI, O);
989 AMDGPU::getNamedOperandIdx(
MI->getOpcode(), AMDGPU::OpName::soffset);
991 if ((
int)OpNo == SOffsetIdx)
992 printSymbolicFormat(
MI, STI, O);
996void AMDGPUInstPrinter::printOperandAndFPInputMods(
const MCInst *
MI,
1000 const MCInstrDesc &
Desc =
MII.get(
MI->getOpcode());
1001 if (needsImpliedVcc(
Desc, OpNo))
1002 printDefaultVccOperand(
true, STI, O);
1004 unsigned InputModifiers =
MI->getOperand(OpNo).getImm();
1009 bool NegMnemo =
false;
1012 if (OpNo + 1 <
MI->getNumOperands() &&
1014 const MCOperand &
Op =
MI->getOperand(OpNo + 1);
1015 NegMnemo =
Op.isImm();
1026 printRegularOperand(
MI, OpNo + 1, STI, O);
1035 switch (
MI->getOpcode()) {
1039 case AMDGPU::V_CNDMASK_B32_sdwa_gfx10:
1040 case AMDGPU::V_CNDMASK_B32_dpp_gfx10:
1041 case AMDGPU::V_CNDMASK_B32_dpp_gfx11:
1042 if ((
int)OpNo + 1 ==
1043 AMDGPU::getNamedOperandIdx(
MI->getOpcode(), AMDGPU::OpName::src1))
1044 printDefaultVccOperand(OpNo == 0, STI, O);
1049void AMDGPUInstPrinter::printOperandAndIntInputMods(
const MCInst *
MI,
1053 const MCInstrDesc &
Desc =
MII.get(
MI->getOpcode());
1054 if (needsImpliedVcc(
Desc, OpNo))
1055 printDefaultVccOperand(
true, STI, O);
1057 unsigned InputModifiers =
MI->getOperand(OpNo).getImm();
1060 printRegularOperand(
MI, OpNo + 1, STI, O);
1065 switch (
MI->getOpcode()) {
1068 case AMDGPU::V_ADD_CO_CI_U32_sdwa_gfx10:
1069 case AMDGPU::V_SUB_CO_CI_U32_sdwa_gfx10:
1070 case AMDGPU::V_SUBREV_CO_CI_U32_sdwa_gfx10:
1071 if ((
int)OpNo + 1 == AMDGPU::getNamedOperandIdx(
MI->getOpcode(),
1072 AMDGPU::OpName::src1))
1073 printDefaultVccOperand(OpNo == 0, STI, O);
1078void AMDGPUInstPrinter::printDPP8(
const MCInst *
MI,
unsigned OpNo,
1084 unsigned Imm =
MI->getOperand(OpNo).getImm();
1086 for (
size_t i = 1; i < 8; ++i) {
1092void AMDGPUInstPrinter::printDPPCtrl(
const MCInst *
MI,
unsigned OpNo,
1095 using namespace AMDGPU::DPP;
1097 unsigned Imm =
MI->getOperand(OpNo).getImm();
1098 const MCInstrDesc &
Desc =
MII.get(
MI->getOpcode());
1102 O <<
" /* DP ALU dpp only supports "
1103 << (
isGFX12(STI) ?
"row_share" :
"row_newbcast") <<
" */";
1106 if (
Imm <= DppCtrl::QUAD_PERM_LAST) {
1112 }
else if ((
Imm >= DppCtrl::ROW_SHL_FIRST) &&
1113 (
Imm <= DppCtrl::ROW_SHL_LAST)) {
1115 }
else if ((
Imm >= DppCtrl::ROW_SHR_FIRST) &&
1116 (
Imm <= DppCtrl::ROW_SHR_LAST)) {
1118 }
else if ((
Imm >= DppCtrl::ROW_ROR_FIRST) &&
1119 (
Imm <= DppCtrl::ROW_ROR_LAST)) {
1121 }
else if (
Imm == DppCtrl::WAVE_SHL1) {
1123 O <<
"/* wave_shl is not supported starting from GFX10 */";
1127 }
else if (
Imm == DppCtrl::WAVE_ROL1) {
1129 O <<
"/* wave_rol is not supported starting from GFX10 */";
1133 }
else if (
Imm == DppCtrl::WAVE_SHR1) {
1135 O <<
"/* wave_shr is not supported starting from GFX10 */";
1139 }
else if (
Imm == DppCtrl::WAVE_ROR1) {
1141 O <<
"/* wave_ror is not supported starting from GFX10 */";
1145 }
else if (
Imm == DppCtrl::ROW_MIRROR) {
1147 }
else if (
Imm == DppCtrl::ROW_HALF_MIRROR) {
1148 O <<
"row_half_mirror";
1149 }
else if (
Imm == DppCtrl::BCAST15) {
1151 O <<
"/* row_bcast is not supported starting from GFX10 */";
1154 O <<
"row_bcast:15";
1155 }
else if (
Imm == DppCtrl::BCAST31) {
1157 O <<
"/* row_bcast is not supported starting from GFX10 */";
1160 O <<
"row_bcast:31";
1161 }
else if ((
Imm >= DppCtrl::ROW_SHARE_FIRST) &&
1162 (
Imm <= DppCtrl::ROW_SHARE_LAST)) {
1164 O <<
"row_newbcast:";
1168 O <<
" /* row_newbcast/row_share is not supported on ASICs earlier "
1169 "than GFX90A/GFX10 */";
1173 }
else if ((
Imm >= DppCtrl::ROW_XMASK_FIRST) &&
1174 (
Imm <= DppCtrl::ROW_XMASK_LAST)) {
1176 O <<
"/* row_xmask is not supported on ASICs earlier than GFX10 */";
1179 O <<
"row_xmask:" <<
formatDec(
Imm - DppCtrl::ROW_XMASK_FIRST);
1181 O <<
"/* Invalid dpp_ctrl value */";
1185void AMDGPUInstPrinter::printDppBoundCtrl(
const MCInst *
MI,
unsigned OpNo,
1188 unsigned Imm =
MI->getOperand(OpNo).getImm();
1190 O <<
" bound_ctrl:1";
1194void AMDGPUInstPrinter::printDppFI(
const MCInst *
MI,
unsigned OpNo,
1196 using namespace llvm::AMDGPU::DPP;
1197 unsigned Imm =
MI->getOperand(OpNo).getImm();
1198 if (
Imm == DPP_FI_1 ||
Imm == DPP8_FI_1) {
1203void AMDGPUInstPrinter::printSDWASel(
const MCInst *
MI,
unsigned OpNo,
1205 using namespace llvm::AMDGPU::SDWA;
1207 unsigned Imm =
MI->getOperand(OpNo).getImm();
1209 case SdwaSel::BYTE_0:
O <<
"BYTE_0";
break;
1210 case SdwaSel::BYTE_1:
O <<
"BYTE_1";
break;
1211 case SdwaSel::BYTE_2:
O <<
"BYTE_2";
break;
1212 case SdwaSel::BYTE_3:
O <<
"BYTE_3";
break;
1213 case SdwaSel::WORD_0:
O <<
"WORD_0";
break;
1214 case SdwaSel::WORD_1:
O <<
"WORD_1";
break;
1215 case SdwaSel::DWORD:
O <<
"DWORD";
break;
1220void AMDGPUInstPrinter::printSDWADstSel(
const MCInst *
MI,
unsigned OpNo,
1224 printSDWASel(
MI, OpNo, O);
1227void AMDGPUInstPrinter::printSDWASrc0Sel(
const MCInst *
MI,
unsigned OpNo,
1231 printSDWASel(
MI, OpNo, O);
1234void AMDGPUInstPrinter::printSDWASrc1Sel(
const MCInst *
MI,
unsigned OpNo,
1238 printSDWASel(
MI, OpNo, O);
1241void AMDGPUInstPrinter::printSDWADstUnused(
const MCInst *
MI,
unsigned OpNo,
1244 using namespace llvm::AMDGPU::SDWA;
1247 unsigned Imm =
MI->getOperand(OpNo).getImm();
1249 case DstUnused::UNUSED_PAD:
O <<
"UNUSED_PAD";
break;
1250 case DstUnused::UNUSED_SEXT:
O <<
"UNUSED_SEXT";
break;
1251 case DstUnused::UNUSED_PRESERVE:
O <<
"UNUSED_PRESERVE";
break;
1256void AMDGPUInstPrinter::printExpSrcN(
const MCInst *
MI,
unsigned OpNo,
1259 unsigned Opc =
MI->getOpcode();
1260 int EnIdx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::en);
1261 unsigned En =
MI->getOperand(EnIdx).getImm();
1263 int ComprIdx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::compr);
1266 if (
MI->getOperand(ComprIdx).getImm())
1267 OpNo = OpNo -
N +
N / 2;
1275void AMDGPUInstPrinter::printExpSrc0(
const MCInst *
MI,
unsigned OpNo,
1278 printExpSrcN(
MI, OpNo, STI, O, 0);
1281void AMDGPUInstPrinter::printExpSrc1(
const MCInst *
MI,
unsigned OpNo,
1284 printExpSrcN(
MI, OpNo, STI, O, 1);
1287void AMDGPUInstPrinter::printExpSrc2(
const MCInst *
MI,
unsigned OpNo,
1290 printExpSrcN(
MI, OpNo, STI, O, 2);
1293void AMDGPUInstPrinter::printExpSrc3(
const MCInst *
MI,
unsigned OpNo,
1296 printExpSrcN(
MI, OpNo, STI, O, 3);
1299void AMDGPUInstPrinter::printExpTgt(
const MCInst *
MI,
unsigned OpNo,
1302 using namespace llvm::AMDGPU::Exp;
1305 unsigned Id =
MI->getOperand(OpNo).getImm() & ((1 << 6) - 1);
1310 O <<
' ' << TgtName;
1314 O <<
" invalid_target_" <<
Id;
1319 bool IsPacked,
bool HasDstSel) {
1323 if (!!(
Ops[
I] &
Mod) != DefaultValue)
1333void AMDGPUInstPrinter::printPackedModifier(
const MCInst *
MI,
1337 unsigned Opc =
MI->getOpcode();
1341 std::pair<AMDGPU::OpName, AMDGPU::OpName> MOps[] = {
1342 {AMDGPU::OpName::src0_modifiers, AMDGPU::OpName::src0},
1343 {AMDGPU::OpName::src1_modifiers, AMDGPU::OpName::src1},
1344 {AMDGPU::OpName::src2_modifiers, AMDGPU::OpName::src2}};
1347 for (
auto [SrcMod, Src] : MOps) {
1351 int ModIdx = AMDGPU::getNamedOperandIdx(
Opc, SrcMod);
1353 (ModIdx != -1) ?
MI->getOperand(ModIdx).getImm() : DefaultValue;
1362 AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src2_modifiers);
1368 (AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::vdst) != -1) ||
1369 (AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::sdst) != -1);
1377 for (AMDGPU::OpName OpName :
1378 {AMDGPU::OpName::src0_modifiers, AMDGPU::OpName::src1_modifiers,
1379 AMDGPU::OpName::src2_modifiers}) {
1380 int Idx = AMDGPU::getNamedOperandIdx(
Opc, OpName);
1388 const bool HasDstSel =
1399 ListSeparator Sep(
",");
1410void AMDGPUInstPrinter::printOpSel(
const MCInst *
MI,
unsigned,
1413 unsigned Opc =
MI->getOpcode();
1416 AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src0_modifiers);
1417 unsigned Mod =
MI->getOperand(SrcMod).getImm();
1420 if (Index0 || Index1)
1421 O <<
" op_sel:[" << Index0 <<
',' << Index1 <<
']';
1425 auto FIN = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src0_modifiers);
1426 auto BCN = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src1_modifiers);
1430 O <<
" op_sel:[" << FI <<
',' << BC <<
']';
1437void AMDGPUInstPrinter::printOpSelHi(
const MCInst *
MI,
unsigned OpNo,
1443void AMDGPUInstPrinter::printNegLo(
const MCInst *
MI,
unsigned OpNo,
1449void AMDGPUInstPrinter::printNegHi(
const MCInst *
MI,
unsigned OpNo,
1455void AMDGPUInstPrinter::printIndexKey8bit(
const MCInst *
MI,
unsigned OpNo,
1458 auto Imm =
MI->getOperand(OpNo).getImm() & 0x7;
1462 O <<
" index_key:" <<
Imm;
1465void AMDGPUInstPrinter::printIndexKey16bit(
const MCInst *
MI,
unsigned OpNo,
1468 auto Imm =
MI->getOperand(OpNo).getImm() & 0x7;
1472 O <<
" index_key:" <<
Imm;
1475void AMDGPUInstPrinter::printIndexKey32bit(
const MCInst *
MI,
unsigned OpNo,
1478 auto Imm =
MI->getOperand(OpNo).getImm() & 0x7;
1482 O <<
" index_key:" <<
Imm;
1485void AMDGPUInstPrinter::printMatrixFMT(
const MCInst *
MI,
unsigned OpNo,
1488 auto Imm =
MI->getOperand(OpNo).getImm() & 0x7;
1492 O <<
" matrix_" << AorB <<
"_fmt:";
1499void AMDGPUInstPrinter::printMatrixAFMT(
const MCInst *
MI,
unsigned OpNo,
1502 printMatrixFMT(
MI, OpNo, STI, O,
'a');
1505void AMDGPUInstPrinter::printMatrixBFMT(
const MCInst *
MI,
unsigned OpNo,
1508 printMatrixFMT(
MI, OpNo, STI, O,
'b');
1511void AMDGPUInstPrinter::printMatrixScale(
const MCInst *
MI,
unsigned OpNo,
1514 auto Imm =
MI->getOperand(OpNo).getImm() & 1;
1518 O <<
" matrix_" << AorB <<
"_scale:";
1525void AMDGPUInstPrinter::printMatrixAScale(
const MCInst *
MI,
unsigned OpNo,
1528 printMatrixScale(
MI, OpNo, STI, O,
'a');
1531void AMDGPUInstPrinter::printMatrixBScale(
const MCInst *
MI,
unsigned OpNo,
1534 printMatrixScale(
MI, OpNo, STI, O,
'b');
1537void AMDGPUInstPrinter::printMatrixScaleFmt(
const MCInst *
MI,
unsigned OpNo,
1540 auto Imm =
MI->getOperand(OpNo).getImm() & 3;
1544 O <<
" matrix_" << AorB <<
"_scale_fmt:";
1551void AMDGPUInstPrinter::printMatrixAScaleFmt(
const MCInst *
MI,
unsigned OpNo,
1554 printMatrixScaleFmt(
MI, OpNo, STI, O,
'a');
1557void AMDGPUInstPrinter::printMatrixBScaleFmt(
const MCInst *
MI,
unsigned OpNo,
1560 printMatrixScaleFmt(
MI, OpNo, STI, O,
'b');
1563void AMDGPUInstPrinter::printInterpSlot(
const MCInst *
MI,
unsigned OpNum,
1566 unsigned Imm =
MI->getOperand(OpNum).getImm();
1578 O <<
"invalid_param_" <<
Imm;
1582void AMDGPUInstPrinter::printInterpAttr(
const MCInst *
MI,
unsigned OpNum,
1585 unsigned Attr =
MI->getOperand(OpNum).getImm();
1586 O <<
"attr" << Attr;
1589void AMDGPUInstPrinter::printInterpAttrChan(
const MCInst *
MI,
unsigned OpNum,
1592 unsigned Chan =
MI->getOperand(OpNum).getImm();
1593 O <<
'.' <<
"xyzw"[Chan & 0x3];
1596void AMDGPUInstPrinter::printGPRIdxMode(
const MCInst *
MI,
unsigned OpNo,
1599 using namespace llvm::AMDGPU::VGPRIndexMode;
1600 unsigned Val =
MI->getOperand(OpNo).getImm();
1602 if ((Val & ~ENABLE_MASK) != 0) {
1603 O << formatHex(static_cast<uint64_t>(Val));
1606 ListSeparator Sep(
",");
1607 for (
unsigned ModeId = ID_MIN; ModeId <=
ID_MAX; ++ModeId) {
1608 if (Val & (1 << ModeId))
1615void AMDGPUInstPrinter::printMemOperand(
const MCInst *
MI,
unsigned OpNo,
1618 printRegularOperand(
MI, OpNo, STI, O);
1620 printRegularOperand(
MI, OpNo + 1, STI, O);
1628 if (
Op.getImm() == 1) {
1639 if (
Op.getImm() == 1)
1646 int Imm =
MI->getOperand(OpNo).getImm();
1660 const unsigned Imm16 =
MI->getOperand(OpNo).getImm();
1671 O <<
"sendmsg(" << MsgName;
1680 O <<
"sendmsg(" << MsgId <<
", " << OpId <<
", " <<
StreamId <<
')';
1693 if (EventName.
empty())
1694 O << formatHex(static_cast<uint64_t>(Imm16));
1705 uint16_t Probe0 = ((0 & AndMask) | OrMask) ^ XorMask;
1710 for (
unsigned Mask = 1 << (
BITMASK_WIDTH - 1); Mask > 0; Mask >>= 1) {
1780 }
else if (AndMask ==
BITMASK_MAX && OrMask == 0 && XorMask > 0 &&
1791 if (GroupSize > 1 &&
1793 OrMask < GroupSize &&
1811 printU16ImmDecOperand(
MI, OpNo, O);
1820 unsigned SImm16 =
MI->getOperand(OpNo).getImm();
1821 unsigned Vmcnt, Expcnt, Lgkmcnt;
1827 bool PrintAll = IsDefaultVmcnt && IsDefaultExpcnt && IsDefaultLgkmcnt;
1831 if (!IsDefaultVmcnt || PrintAll)
1832 O << Sep <<
"vmcnt(" << Vmcnt <<
')';
1834 if (!IsDefaultExpcnt || PrintAll)
1835 O << Sep <<
"expcnt(" << Expcnt <<
')';
1837 if (!IsDefaultLgkmcnt || PrintAll)
1838 O << Sep <<
"lgkmcnt(" << Lgkmcnt <<
')';
1846 uint64_t Imm16 =
MI->getOperand(OpNo).getImm() & 0xffff;
1848 bool HasNonDefaultVal =
false;
1856 if (!IsDefault || !HasNonDefaultVal)
1857 O << Sep << Name <<
'(' << Val <<
')';
1867 const char *BadInstId =
"/* invalid instid value */";
1868 static const std::array<const char *, 12> InstIds = {
1869 "NO_DEP",
"VALU_DEP_1",
"VALU_DEP_2",
1870 "VALU_DEP_3",
"VALU_DEP_4",
"TRANS32_DEP_1",
1871 "TRANS32_DEP_2",
"TRANS32_DEP_3",
"FMA_ACCUM_CYCLE_1",
1872 "SALU_CYCLE_1",
"SALU_CYCLE_2",
"SALU_CYCLE_3"};
1874 const char *BadInstSkip =
"/* invalid instskip value */";
1875 static const std::array<const char *, 6> InstSkips = {
1876 "SAME",
"NEXT",
"SKIP_1",
"SKIP_2",
"SKIP_3",
"SKIP_4"};
1878 unsigned SImm16 =
MI->getOperand(OpNo).getImm();
1879 const char *Prefix =
"";
1881 unsigned Value = SImm16 & 0xF;
1883 const char *Name =
Value < InstIds.size() ? InstIds[
Value] : BadInstId;
1884 O << Prefix <<
"instid0(" << Name <<
')';
1888 Value = (SImm16 >> 4) & 7;
1891 Value < InstSkips.size() ? InstSkips[
Value] : BadInstSkip;
1892 O << Prefix <<
"instskip(" << Name <<
')';
1896 Value = (SImm16 >> 7) & 0xF;
1898 const char *Name =
Value < InstIds.size() ? InstIds[
Value] : BadInstId;
1899 O << Prefix <<
"instid1(" << Name <<
')';
1910 unsigned Val =
MI->getOperand(OpNo).getImm();
1915 if (!HwRegName.
empty()) {
1921 O <<
", " <<
Offset <<
", " << Width;
1936void AMDGPUInstPrinter::printNamedInt(
const MCInst *
MI,
unsigned OpNo,
1939 bool PrintInHex,
bool AlwaysPrint) {
1940 int64_t V =
MI->getOperand(OpNo).getImm();
1941 if (AlwaysPrint || V != 0)
1945void AMDGPUInstPrinter::printBitOp3(
const MCInst *
MI,
unsigned OpNo,
1956 O << formatHex(static_cast<uint64_t>(
Imm));
1959void AMDGPUInstPrinter::printScaleSel(
const MCInst *
MI,
unsigned OpNo,
1962 uint8_t
Imm =
MI->getOperand(OpNo).getImm();
1969#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_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 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)
bool isPermlane16(unsigned Opc)
constexpr bool isSMRD(const T &...O)
constexpr uint64_t getTSFlags(const MCInstrDesc &Desc)
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.