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);
174 if (STI.
hasFeature(AMDGPU::FeatureCacheFillSize)) {
192 O <<
" /* unexpected cache policy bit */";
195void AMDGPUInstPrinter::printTH(
const MCInst *
MI, int64_t TH, int64_t Scope,
201 const unsigned Opcode =
MI->getOpcode();
202 const MCInstrDesc &TID =
MII.get(Opcode);
225 O << (IsStore ?
"TH_STORE_" :
"TH_LOAD_");
235 : (IsStore ?
"WB" :
"LU"));
256void AMDGPUInstPrinter::printScope(int64_t Scope,
raw_ostream &O) {
272void AMDGPUInstPrinter::printCFS(int64_t CFS,
raw_ostream &O) {
293void AMDGPUInstPrinter::printDim(
const MCInst *
MI,
unsigned OpNo,
295 unsigned Dim =
MI->getOperand(OpNo).getImm();
296 O <<
" dim:SQ_RSRC_IMG_";
305void AMDGPUInstPrinter::printR128A16(
const MCInst *
MI,
unsigned OpNo,
308 printNamedBit(
MI, OpNo, O,
"a16");
310 printNamedBit(
MI, OpNo, O,
"r128");
313void AMDGPUInstPrinter::printFORMAT(
const MCInst *
MI,
unsigned OpNo,
318void AMDGPUInstPrinter::printSymbolicFormat(
const MCInst *
MI,
321 using namespace llvm::AMDGPU::MTBUFFormat;
324 AMDGPU::getNamedOperandIdx(
MI->getOpcode(), AMDGPU::OpName::format);
327 unsigned Val =
MI->getOperand(OpNo).getImm();
329 if (Val == UFMT_DEFAULT)
334 O <<
" format:" << Val;
337 if (Val == DFMT_NFMT_DEFAULT)
344 if (Dfmt != DFMT_DEFAULT) {
346 if (Nfmt != NFMT_DEFAULT) {
350 if (Nfmt != NFMT_DEFAULT) {
355 O <<
" format:" << Val;
363 unsigned Enc =
MRI.getEncodingValue(
Reg);
368 unsigned RegNo =
Idx % 0x100;
370 if (RC->
getID() == AMDGPU::VGPR_16RegClassID) {
389 unsigned Enc =
MRI.getEncodingValue(
Reg);
396 unsigned Opc =
Desc.getOpcode();
398 for (
I = 0;
I < 4; ++
I) {
399 if (
Ops.first[
I] != AMDGPU::OpName::NUM_OPERAND_NAMES &&
400 (
unsigned)AMDGPU::getNamedOperandIdx(
Opc,
Ops.first[
I]) == OpNo)
402 if (
Ops.second &&
Ops.second[
I] != AMDGPU::OpName::NUM_OPERAND_NAMES &&
403 (
unsigned)AMDGPU::getNamedOperandIdx(
Opc,
Ops.second[
I]) == OpNo)
408 unsigned OpMSBs = (VgprMSBs >> (
I * 2)) & 3;
416void AMDGPUInstPrinter::printRsrcReg(
const MCInst *
MI,
unsigned OpNo,
419 MCRegister
Reg =
MI->getOperand(OpNo).getReg();
434 case AMDGPU::PRIVATE_RSRC_REG:
457void AMDGPUInstPrinter::printVOPDst(
const MCInst *
MI,
unsigned OpNo,
459 auto Opcode =
MI->getOpcode();
476 printRegularOperand(
MI, OpNo, STI, O);
482 case AMDGPU::V_ADD_CO_CI_U32_e32_gfx10:
483 case AMDGPU::V_SUB_CO_CI_U32_e32_gfx10:
484 case AMDGPU::V_SUBREV_CO_CI_U32_e32_gfx10:
485 case AMDGPU::V_ADD_CO_CI_U32_sdwa_gfx10:
486 case AMDGPU::V_SUB_CO_CI_U32_sdwa_gfx10:
487 case AMDGPU::V_SUBREV_CO_CI_U32_sdwa_gfx10:
488 case AMDGPU::V_ADD_CO_CI_U32_dpp_gfx10:
489 case AMDGPU::V_SUB_CO_CI_U32_dpp_gfx10:
490 case AMDGPU::V_SUBREV_CO_CI_U32_dpp_gfx10:
491 case AMDGPU::V_ADD_CO_CI_U32_dpp8_gfx10:
492 case AMDGPU::V_SUB_CO_CI_U32_dpp8_gfx10:
493 case AMDGPU::V_SUBREV_CO_CI_U32_dpp8_gfx10:
494 case AMDGPU::V_ADD_CO_CI_U32_e32_gfx11:
495 case AMDGPU::V_SUB_CO_CI_U32_e32_gfx11:
496 case AMDGPU::V_SUBREV_CO_CI_U32_e32_gfx11:
497 case AMDGPU::V_ADD_CO_CI_U32_dpp_gfx11:
498 case AMDGPU::V_SUB_CO_CI_U32_dpp_gfx11:
499 case AMDGPU::V_SUBREV_CO_CI_U32_dpp_gfx11:
500 case AMDGPU::V_ADD_CO_CI_U32_dpp8_gfx11:
501 case AMDGPU::V_SUB_CO_CI_U32_dpp8_gfx11:
502 case AMDGPU::V_SUBREV_CO_CI_U32_dpp8_gfx11:
503 case AMDGPU::V_ADD_CO_CI_U32_e32_gfx12:
504 case AMDGPU::V_SUB_CO_CI_U32_e32_gfx12:
505 case AMDGPU::V_SUBREV_CO_CI_U32_e32_gfx12:
506 case AMDGPU::V_ADD_CO_CI_U32_dpp_gfx12:
507 case AMDGPU::V_SUB_CO_CI_U32_dpp_gfx12:
508 case AMDGPU::V_SUBREV_CO_CI_U32_dpp_gfx12:
509 case AMDGPU::V_ADD_CO_CI_U32_dpp8_gfx12:
510 case AMDGPU::V_SUB_CO_CI_U32_dpp8_gfx12:
511 case AMDGPU::V_SUBREV_CO_CI_U32_dpp8_gfx12:
512 case AMDGPU::V_ADD_CO_CI_U32_e32_gfx13:
513 case AMDGPU::V_SUB_CO_CI_U32_e32_gfx13:
514 case AMDGPU::V_SUBREV_CO_CI_U32_e32_gfx13:
515 case AMDGPU::V_ADD_CO_CI_U32_dpp_gfx13:
516 case AMDGPU::V_SUB_CO_CI_U32_dpp_gfx13:
517 case AMDGPU::V_SUBREV_CO_CI_U32_dpp_gfx13:
518 case AMDGPU::V_ADD_CO_CI_U32_dpp8_gfx13:
519 case AMDGPU::V_SUB_CO_CI_U32_dpp8_gfx13:
520 case AMDGPU::V_SUBREV_CO_CI_U32_dpp8_gfx13:
521 printDefaultVccOperand(
false, STI, O);
526void AMDGPUInstPrinter::printVINTRPDst(
const MCInst *
MI,
unsigned OpNo,
533 printRegularOperand(
MI, OpNo, STI, O);
536void AMDGPUInstPrinter::printAVLdSt32Align2RegOp(
const MCInst *
MI,
540 MCRegister
Reg =
MI->getOperand(OpNo).getReg();
543 if (MCRegister SubReg =
MRI.getSubReg(
Reg, AMDGPU::sub0))
548void AMDGPUInstPrinter::printImmediateInt16(uint32_t
Imm,
551 int32_t SImm =
static_cast<int32_t
>(
Imm);
557 if (printImmediateFloat32(
Imm, STI, O))
560 O << formatHex(static_cast<uint64_t>(
Imm & 0xffff));
567 else if (
Imm == 0xBC00)
569 else if (
Imm == 0x3800)
571 else if (
Imm == 0xB800)
573 else if (
Imm == 0x4000)
575 else if (
Imm == 0xC000)
577 else if (
Imm == 0x4400)
579 else if (
Imm == 0xC400)
581 else if (
Imm == 0x3118 && STI.
hasFeature(AMDGPU::FeatureInv2PiInlineImm))
593 else if (
Imm == 0xBF80)
595 else if (
Imm == 0x3F00)
597 else if (
Imm == 0xBF00)
599 else if (
Imm == 0x4000)
601 else if (
Imm == 0xC000)
603 else if (
Imm == 0x4080)
605 else if (
Imm == 0xC080)
607 else if (
Imm == 0x3E22 && STI.
hasFeature(AMDGPU::FeatureInv2PiInlineImm))
615void AMDGPUInstPrinter::printImmediateBF16(uint32_t
Imm,
618 int16_t SImm =
static_cast<int16_t
>(
Imm);
627 O << formatHex(static_cast<uint64_t>(
Imm & 0xffff));
630void AMDGPUInstPrinter::printImmediateF16(uint32_t
Imm,
633 int16_t SImm =
static_cast<int16_t
>(
Imm);
639 uint16_t HImm =
static_cast<uint16_t
>(
Imm);
647void AMDGPUInstPrinter::printImmediateV216(uint32_t
Imm, uint8_t OpType,
650 int32_t SImm =
static_cast<int32_t
>(
Imm);
659 if (printImmediateFloat32(
Imm, STI, O))
673 uint16_t
Lo16 =
static_cast<uint16_t
>(
Imm & 0xFFFF);
674 uint16_t
Hi16 =
static_cast<uint16_t
>((
Imm >> 16) & 0xFFFF);
699 O << formatHex(static_cast<uint64_t>(
Imm));
702bool AMDGPUInstPrinter::printImmediateFloat32(uint32_t
Imm,
723 else if (
Imm == 0x3e22f983 &&
724 STI.
hasFeature(AMDGPU::FeatureInv2PiInlineImm))
732void AMDGPUInstPrinter::printImmediate32(uint32_t
Imm,
735 int32_t SImm =
static_cast<int32_t
>(
Imm);
741 if (printImmediateFloat32(
Imm, STI, O))
744 O << formatHex(static_cast<uint64_t>(
Imm));
747void AMDGPUInstPrinter::printImmediate64(
uint64_t Imm,
750 int64_t SImm =
static_cast<int64_t
>(
Imm);
751 if (SImm >= -16 && SImm <= 64) {
774 else if (
Imm == 0x3fc45f306dc9c882 &&
775 STI.
hasFeature(AMDGPU::FeatureInv2PiInlineImm))
776 O <<
"0.15915494309189532";
778 printLiteral64(
Imm, O, IsFP);
784 O << formatHex(static_cast<uint64_t>(
Hi_32(
Imm)));
789void AMDGPUInstPrinter::printBLGP(
const MCInst *
MI,
unsigned OpNo,
792 unsigned Imm =
MI->getOperand(OpNo).getImm();
797 switch (
MI->getOpcode()) {
798 case AMDGPU::V_MFMA_F64_16X16X4F64_gfx940_acd:
799 case AMDGPU::V_MFMA_F64_16X16X4F64_gfx940_vcd:
800 case AMDGPU::V_MFMA_F64_4X4X4F64_gfx940_acd:
801 case AMDGPU::V_MFMA_F64_4X4X4F64_gfx940_vcd:
802 O <<
" neg:[" << (
Imm & 1) <<
',' << ((
Imm >> 1) & 1) <<
','
803 << ((
Imm >> 2) & 1) <<
']';
808 O <<
" blgp:" <<
Imm;
811void AMDGPUInstPrinter::printDefaultVccOperand(
bool FirstOperand,
825 unsigned OpNo)
const {
828 (
Desc.hasImplicitDefOfPhysReg(AMDGPU::VCC) ||
829 Desc.hasImplicitDefOfPhysReg(AMDGPU::VCC_LO));
833void AMDGPUInstPrinter::printOperand(
const MCInst *
MI,
unsigned OpNo,
836 unsigned Opc =
MI->getOpcode();
838 int ModIdx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src0_modifiers);
844 (
Desc.hasImplicitDefOfPhysReg(AMDGPU::VCC) ||
845 Desc.hasImplicitDefOfPhysReg(AMDGPU::VCC_LO)))
846 printDefaultVccOperand(
true, STI, O);
848 printRegularOperand(
MI, OpNo, STI, O);
852void AMDGPUInstPrinter::printRegularOperand(
const MCInst *
MI,
unsigned OpNo,
855 const MCInstrDesc &
Desc =
MII.get(
MI->getOpcode());
857 if (OpNo >=
MI->getNumOperands()) {
858 O <<
"/*Missing OP" << OpNo <<
"*/";
862 const MCOperand &
Op =
MI->getOperand(OpNo);
869 const MCOperandInfo &OpInfo =
Desc.operands()[OpNo];
871 int16_t RCID =
MII.getOpRegClassID(
873 const MCRegisterClass &RC =
MRI.getRegClass(RCID);
877 (OpInfo.
RegClass == AMDGPU::SReg_1 ||
878 OpInfo.
RegClass == AMDGPU::SReg_1_XEXEC);
885 O <<
"/*Invalid register, operand has \'" <<
MRI.getRegClassName(&RC)
886 <<
"\' register class*/";
890 }
else if (
Op.isImm()) {
891 const uint8_t OpTy =
Desc.operands()[OpNo].OperandType;
903 printImmediate32(
Op.getImm(), STI, O);
908 printImmediate64(
Op.getImm(), STI, O,
false);
914 printImmediate64(
Op.getImm(), STI, O,
true);
918 printImmediateInt16(
Op.getImm(), STI, O);
923 printImmediateF16(
Op.getImm(), STI, O);
927 printImmediateBF16(
Op.getImm(), STI, O);
937 printImmediateV216(
Op.getImm(), OpTy, STI, O);
946 printImmediate32(
Op.getImm(), STI, O);
947 O <<
"/*Invalid immediate*/";
954 }
else if (
Op.isExpr()) {
955 const MCExpr *
Exp =
Op.getExpr();
956 MAI.printExpr(O, *Exp);
962 switch (
MI->getOpcode()) {
965 case AMDGPU::V_CNDMASK_B32_e32_gfx10:
966 case AMDGPU::V_ADD_CO_CI_U32_e32_gfx10:
967 case AMDGPU::V_SUB_CO_CI_U32_e32_gfx10:
968 case AMDGPU::V_SUBREV_CO_CI_U32_e32_gfx10:
969 case AMDGPU::V_ADD_CO_CI_U32_dpp_gfx10:
970 case AMDGPU::V_SUB_CO_CI_U32_dpp_gfx10:
971 case AMDGPU::V_SUBREV_CO_CI_U32_dpp_gfx10:
972 case AMDGPU::V_CNDMASK_B32_dpp8_gfx10:
973 case AMDGPU::V_ADD_CO_CI_U32_dpp8_gfx10:
974 case AMDGPU::V_SUB_CO_CI_U32_dpp8_gfx10:
975 case AMDGPU::V_SUBREV_CO_CI_U32_dpp8_gfx10:
976 case AMDGPU::V_CNDMASK_B32_e32_gfx11:
977 case AMDGPU::V_ADD_CO_CI_U32_e32_gfx11:
978 case AMDGPU::V_SUB_CO_CI_U32_e32_gfx11:
979 case AMDGPU::V_SUBREV_CO_CI_U32_e32_gfx11:
980 case AMDGPU::V_ADD_CO_CI_U32_dpp_gfx11:
981 case AMDGPU::V_SUB_CO_CI_U32_dpp_gfx11:
982 case AMDGPU::V_SUBREV_CO_CI_U32_dpp_gfx11:
983 case AMDGPU::V_CNDMASK_B32_dpp8_gfx11:
984 case AMDGPU::V_ADD_CO_CI_U32_dpp8_gfx11:
985 case AMDGPU::V_SUB_CO_CI_U32_dpp8_gfx11:
986 case AMDGPU::V_SUBREV_CO_CI_U32_dpp8_gfx11:
987 case AMDGPU::V_CNDMASK_B32_e32_gfx12:
988 case AMDGPU::V_ADD_CO_CI_U32_e32_gfx12:
989 case AMDGPU::V_SUB_CO_CI_U32_e32_gfx12:
990 case AMDGPU::V_SUBREV_CO_CI_U32_e32_gfx12:
991 case AMDGPU::V_CNDMASK_B32_dpp_gfx12:
992 case AMDGPU::V_ADD_CO_CI_U32_dpp_gfx12:
993 case AMDGPU::V_SUB_CO_CI_U32_dpp_gfx12:
994 case AMDGPU::V_SUBREV_CO_CI_U32_dpp_gfx12:
995 case AMDGPU::V_CNDMASK_B32_dpp8_gfx12:
996 case AMDGPU::V_ADD_CO_CI_U32_dpp8_gfx12:
997 case AMDGPU::V_SUB_CO_CI_U32_dpp8_gfx12:
998 case AMDGPU::V_SUBREV_CO_CI_U32_dpp8_gfx12:
999 case AMDGPU::V_CNDMASK_B32_e32_gfx13:
1000 case AMDGPU::V_ADD_CO_CI_U32_e32_gfx13:
1001 case AMDGPU::V_SUB_CO_CI_U32_e32_gfx13:
1002 case AMDGPU::V_SUBREV_CO_CI_U32_e32_gfx13:
1003 case AMDGPU::V_CNDMASK_B32_dpp_gfx13:
1004 case AMDGPU::V_ADD_CO_CI_U32_dpp_gfx13:
1005 case AMDGPU::V_SUB_CO_CI_U32_dpp_gfx13:
1006 case AMDGPU::V_SUBREV_CO_CI_U32_dpp_gfx13:
1007 case AMDGPU::V_CNDMASK_B32_dpp8_gfx13:
1008 case AMDGPU::V_ADD_CO_CI_U32_dpp8_gfx13:
1009 case AMDGPU::V_SUB_CO_CI_U32_dpp8_gfx13:
1010 case AMDGPU::V_SUBREV_CO_CI_U32_dpp8_gfx13:
1012 case AMDGPU::V_CNDMASK_B32_e32_gfx6_gfx7:
1013 case AMDGPU::V_CNDMASK_B32_e32_vi:
1014 if ((
int)OpNo == AMDGPU::getNamedOperandIdx(
MI->getOpcode(),
1015 AMDGPU::OpName::src1))
1016 printDefaultVccOperand(OpNo == 0, STI, O);
1022 AMDGPU::getNamedOperandIdx(
MI->getOpcode(), AMDGPU::OpName::soffset);
1023 assert(SOffsetIdx != -1);
1024 if ((
int)OpNo == SOffsetIdx)
1025 printSymbolicFormat(
MI, STI, O);
1029void AMDGPUInstPrinter::printOperandAndFPInputMods(
const MCInst *
MI,
1033 const MCInstrDesc &
Desc =
MII.get(
MI->getOpcode());
1034 if (needsImpliedVcc(
Desc, OpNo))
1035 printDefaultVccOperand(
true, STI, O);
1037 unsigned InputModifiers =
MI->getOperand(OpNo).getImm();
1042 bool NegMnemo =
false;
1045 if (OpNo + 1 <
MI->getNumOperands() &&
1047 const MCOperand &
Op =
MI->getOperand(OpNo + 1);
1048 NegMnemo =
Op.isImm();
1059 printRegularOperand(
MI, OpNo + 1, STI, O);
1068 switch (
MI->getOpcode()) {
1072 case AMDGPU::V_CNDMASK_B32_sdwa_gfx10:
1073 case AMDGPU::V_CNDMASK_B32_dpp_gfx10:
1074 case AMDGPU::V_CNDMASK_B32_dpp_gfx11:
1075 if ((
int)OpNo + 1 ==
1076 AMDGPU::getNamedOperandIdx(
MI->getOpcode(), AMDGPU::OpName::src1))
1077 printDefaultVccOperand(OpNo == 0, STI, O);
1082void AMDGPUInstPrinter::printOperandAndIntInputMods(
const MCInst *
MI,
1086 const MCInstrDesc &
Desc =
MII.get(
MI->getOpcode());
1087 if (needsImpliedVcc(
Desc, OpNo))
1088 printDefaultVccOperand(
true, STI, O);
1090 unsigned InputModifiers =
MI->getOperand(OpNo).getImm();
1093 printRegularOperand(
MI, OpNo + 1, STI, O);
1098 switch (
MI->getOpcode()) {
1101 case AMDGPU::V_ADD_CO_CI_U32_sdwa_gfx10:
1102 case AMDGPU::V_SUB_CO_CI_U32_sdwa_gfx10:
1103 case AMDGPU::V_SUBREV_CO_CI_U32_sdwa_gfx10:
1104 if ((
int)OpNo + 1 == AMDGPU::getNamedOperandIdx(
MI->getOpcode(),
1105 AMDGPU::OpName::src1))
1106 printDefaultVccOperand(OpNo == 0, STI, O);
1111void AMDGPUInstPrinter::printDPP8(
const MCInst *
MI,
unsigned OpNo,
1117 unsigned Imm =
MI->getOperand(OpNo).getImm();
1119 for (
size_t i = 1; i < 8; ++i) {
1125void AMDGPUInstPrinter::printDPPCtrl(
const MCInst *
MI,
unsigned OpNo,
1128 using namespace AMDGPU::DPP;
1130 unsigned Imm =
MI->getOperand(OpNo).getImm();
1131 const MCInstrDesc &
Desc =
MII.get(
MI->getOpcode());
1136 O <<
" /* DP ALU dpp only supports "
1137 << (
isGFX12(STI) ?
"row_share" :
"row_newbcast") <<
" */";
1140 if (
Imm <= DppCtrl::QUAD_PERM_LAST) {
1146 }
else if ((
Imm >= DppCtrl::ROW_SHL_FIRST) &&
1147 (
Imm <= DppCtrl::ROW_SHL_LAST)) {
1149 }
else if ((
Imm >= DppCtrl::ROW_SHR_FIRST) &&
1150 (
Imm <= DppCtrl::ROW_SHR_LAST)) {
1152 }
else if ((
Imm >= DppCtrl::ROW_ROR_FIRST) &&
1153 (
Imm <= DppCtrl::ROW_ROR_LAST)) {
1155 }
else if (
Imm == DppCtrl::WAVE_SHL1) {
1157 O <<
"/* wave_shl is not supported starting from GFX10 */";
1161 }
else if (
Imm == DppCtrl::WAVE_ROL1) {
1163 O <<
"/* wave_rol is not supported starting from GFX10 */";
1167 }
else if (
Imm == DppCtrl::WAVE_SHR1) {
1169 O <<
"/* wave_shr is not supported starting from GFX10 */";
1173 }
else if (
Imm == DppCtrl::WAVE_ROR1) {
1175 O <<
"/* wave_ror is not supported starting from GFX10 */";
1179 }
else if (
Imm == DppCtrl::ROW_MIRROR) {
1181 }
else if (
Imm == DppCtrl::ROW_HALF_MIRROR) {
1182 O <<
"row_half_mirror";
1183 }
else if (
Imm == DppCtrl::BCAST15) {
1185 O <<
"/* row_bcast is not supported starting from GFX10 */";
1188 O <<
"row_bcast:15";
1189 }
else if (
Imm == DppCtrl::BCAST31) {
1191 O <<
"/* row_bcast is not supported starting from GFX10 */";
1194 O <<
"row_bcast:31";
1195 }
else if ((
Imm >= DppCtrl::ROW_SHARE_FIRST) &&
1196 (
Imm <= DppCtrl::ROW_SHARE_LAST)) {
1198 O <<
"row_newbcast:";
1202 O <<
" /* row_newbcast/row_share is not supported on ASICs earlier "
1203 "than GFX90A/GFX10 */";
1207 }
else if ((
Imm >= DppCtrl::ROW_XMASK_FIRST) &&
1208 (
Imm <= DppCtrl::ROW_XMASK_LAST)) {
1210 O <<
"/* row_xmask is not supported on ASICs earlier than GFX10 */";
1213 O <<
"row_xmask:" <<
formatDec(
Imm - DppCtrl::ROW_XMASK_FIRST);
1215 O <<
"/* Invalid dpp_ctrl value */";
1219void AMDGPUInstPrinter::printDppBoundCtrl(
const MCInst *
MI,
unsigned OpNo,
1222 unsigned Imm =
MI->getOperand(OpNo).getImm();
1224 O <<
" bound_ctrl:1";
1228void AMDGPUInstPrinter::printDppFI(
const MCInst *
MI,
unsigned OpNo,
1230 using namespace llvm::AMDGPU::DPP;
1231 unsigned Imm =
MI->getOperand(OpNo).getImm();
1232 if (
Imm == DPP_FI_1 ||
Imm == DPP8_FI_1) {
1237void AMDGPUInstPrinter::printSDWASel(
const MCInst *
MI,
unsigned OpNo,
1239 using namespace llvm::AMDGPU::SDWA;
1241 unsigned Imm =
MI->getOperand(OpNo).getImm();
1243 case SdwaSel::BYTE_0:
O <<
"BYTE_0";
break;
1244 case SdwaSel::BYTE_1:
O <<
"BYTE_1";
break;
1245 case SdwaSel::BYTE_2:
O <<
"BYTE_2";
break;
1246 case SdwaSel::BYTE_3:
O <<
"BYTE_3";
break;
1247 case SdwaSel::WORD_0:
O <<
"WORD_0";
break;
1248 case SdwaSel::WORD_1:
O <<
"WORD_1";
break;
1249 case SdwaSel::DWORD:
O <<
"DWORD";
break;
1254void AMDGPUInstPrinter::printSDWADstSel(
const MCInst *
MI,
unsigned OpNo,
1258 printSDWASel(
MI, OpNo, O);
1261void AMDGPUInstPrinter::printSDWASrc0Sel(
const MCInst *
MI,
unsigned OpNo,
1265 printSDWASel(
MI, OpNo, O);
1268void AMDGPUInstPrinter::printSDWASrc1Sel(
const MCInst *
MI,
unsigned OpNo,
1272 printSDWASel(
MI, OpNo, O);
1275void AMDGPUInstPrinter::printSDWADstUnused(
const MCInst *
MI,
unsigned OpNo,
1278 using namespace llvm::AMDGPU::SDWA;
1281 unsigned Imm =
MI->getOperand(OpNo).getImm();
1283 case DstUnused::UNUSED_PAD:
O <<
"UNUSED_PAD";
break;
1284 case DstUnused::UNUSED_SEXT:
O <<
"UNUSED_SEXT";
break;
1285 case DstUnused::UNUSED_PRESERVE:
O <<
"UNUSED_PRESERVE";
break;
1290void AMDGPUInstPrinter::printExpSrcN(
const MCInst *
MI,
unsigned OpNo,
1293 unsigned Opc =
MI->getOpcode();
1294 int EnIdx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::en);
1295 unsigned En =
MI->getOperand(EnIdx).getImm();
1297 int ComprIdx = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::compr);
1300 if (
MI->getOperand(ComprIdx).getImm())
1301 OpNo = OpNo -
N +
N / 2;
1309void AMDGPUInstPrinter::printExpSrc0(
const MCInst *
MI,
unsigned OpNo,
1312 printExpSrcN(
MI, OpNo, STI, O, 0);
1315void AMDGPUInstPrinter::printExpSrc1(
const MCInst *
MI,
unsigned OpNo,
1318 printExpSrcN(
MI, OpNo, STI, O, 1);
1321void AMDGPUInstPrinter::printExpSrc2(
const MCInst *
MI,
unsigned OpNo,
1324 printExpSrcN(
MI, OpNo, STI, O, 2);
1327void AMDGPUInstPrinter::printExpSrc3(
const MCInst *
MI,
unsigned OpNo,
1330 printExpSrcN(
MI, OpNo, STI, O, 3);
1333void AMDGPUInstPrinter::printExpTgt(
const MCInst *
MI,
unsigned OpNo,
1336 using namespace llvm::AMDGPU::Exp;
1339 unsigned Id =
MI->getOperand(OpNo).getImm() & ((1 << 6) - 1);
1344 O <<
' ' << TgtName;
1348 O <<
" invalid_target_" <<
Id;
1353 bool IsPacked,
bool HasDstSel) {
1357 if (!!(
Ops[
I] &
Mod) != DefaultValue)
1367void AMDGPUInstPrinter::printPackedModifier(
const MCInst *
MI,
1371 unsigned Opc =
MI->getOpcode();
1375 std::pair<AMDGPU::OpName, AMDGPU::OpName> MOps[] = {
1376 {AMDGPU::OpName::src0_modifiers, AMDGPU::OpName::src0},
1377 {AMDGPU::OpName::src1_modifiers, AMDGPU::OpName::src1},
1378 {AMDGPU::OpName::src2_modifiers, AMDGPU::OpName::src2}};
1381 for (
auto [SrcMod, Src] : MOps) {
1385 int ModIdx = AMDGPU::getNamedOperandIdx(
Opc, SrcMod);
1387 (ModIdx != -1) ?
MI->getOperand(ModIdx).getImm() : DefaultValue;
1396 AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src2_modifiers);
1402 (AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::vdst) != -1) ||
1403 (AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::sdst) != -1);
1410 for (AMDGPU::OpName OpName :
1411 {AMDGPU::OpName::src0_modifiers, AMDGPU::OpName::src1_modifiers,
1412 AMDGPU::OpName::src2_modifiers}) {
1413 int Idx = AMDGPU::getNamedOperandIdx(
Opc, OpName);
1430 ListSeparator Sep(
",");
1441void AMDGPUInstPrinter::printOpSel(
const MCInst *
MI,
unsigned,
1444 unsigned Opc =
MI->getOpcode();
1447 AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src0_modifiers);
1448 unsigned Mod =
MI->getOperand(SrcMod).getImm();
1451 if (Index0 || Index1)
1452 O <<
" op_sel:[" << Index0 <<
',' << Index1 <<
']';
1456 auto FIN = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src0_modifiers);
1457 auto BCN = AMDGPU::getNamedOperandIdx(
Opc, AMDGPU::OpName::src1_modifiers);
1461 O <<
" op_sel:[" << FI <<
',' << BC <<
']';
1468void AMDGPUInstPrinter::printOpSelHi(
const MCInst *
MI,
unsigned OpNo,
1474void AMDGPUInstPrinter::printNegLo(
const MCInst *
MI,
unsigned OpNo,
1480void AMDGPUInstPrinter::printNegHi(
const MCInst *
MI,
unsigned OpNo,
1486void AMDGPUInstPrinter::printIndexKey8bit(
const MCInst *
MI,
unsigned OpNo,
1489 auto Imm =
MI->getOperand(OpNo).getImm() & 0x7;
1493 O <<
" index_key:" <<
Imm;
1496void AMDGPUInstPrinter::printIndexKey16bit(
const MCInst *
MI,
unsigned OpNo,
1499 auto Imm =
MI->getOperand(OpNo).getImm() & 0x7;
1503 O <<
" index_key:" <<
Imm;
1506void AMDGPUInstPrinter::printIndexKey32bit(
const MCInst *
MI,
unsigned OpNo,
1509 auto Imm =
MI->getOperand(OpNo).getImm() & 0x7;
1513 O <<
" index_key:" <<
Imm;
1516void AMDGPUInstPrinter::printMatrixFMT(
const MCInst *
MI,
unsigned OpNo,
1519 auto Imm =
MI->getOperand(OpNo).getImm() & 0x7;
1523 O <<
" matrix_" << AorB <<
"_fmt:";
1530void AMDGPUInstPrinter::printMatrixAFMT(
const MCInst *
MI,
unsigned OpNo,
1533 printMatrixFMT(
MI, OpNo, STI, O,
'a');
1536void AMDGPUInstPrinter::printMatrixBFMT(
const MCInst *
MI,
unsigned OpNo,
1539 printMatrixFMT(
MI, OpNo, STI, O,
'b');
1542void AMDGPUInstPrinter::printMatrixScale(
const MCInst *
MI,
unsigned OpNo,
1545 auto Imm =
MI->getOperand(OpNo).getImm() & 1;
1549 O <<
" matrix_" << AorB <<
"_scale:";
1556void AMDGPUInstPrinter::printMatrixAScale(
const MCInst *
MI,
unsigned OpNo,
1559 printMatrixScale(
MI, OpNo, STI, O,
'a');
1562void AMDGPUInstPrinter::printMatrixBScale(
const MCInst *
MI,
unsigned OpNo,
1565 printMatrixScale(
MI, OpNo, STI, O,
'b');
1568void AMDGPUInstPrinter::printMatrixScaleFmt(
const MCInst *
MI,
unsigned OpNo,
1571 auto Imm =
MI->getOperand(OpNo).getImm() & 3;
1575 O <<
" matrix_" << AorB <<
"_scale_fmt:";
1582void AMDGPUInstPrinter::printMatrixAScaleFmt(
const MCInst *
MI,
unsigned OpNo,
1585 printMatrixScaleFmt(
MI, OpNo, STI, O,
'a');
1588void AMDGPUInstPrinter::printMatrixBScaleFmt(
const MCInst *
MI,
unsigned OpNo,
1591 printMatrixScaleFmt(
MI, OpNo, STI, O,
'b');
1594void AMDGPUInstPrinter::printInterpSlot(
const MCInst *
MI,
unsigned OpNum,
1597 unsigned Imm =
MI->getOperand(OpNum).getImm();
1609 O <<
"invalid_param_" <<
Imm;
1613void AMDGPUInstPrinter::printInterpAttr(
const MCInst *
MI,
unsigned OpNum,
1616 unsigned Attr =
MI->getOperand(OpNum).getImm();
1617 O <<
"attr" << Attr;
1620void AMDGPUInstPrinter::printInterpAttrChan(
const MCInst *
MI,
unsigned OpNum,
1623 unsigned Chan =
MI->getOperand(OpNum).getImm();
1624 O <<
'.' <<
"xyzw"[Chan & 0x3];
1627void AMDGPUInstPrinter::printGPRIdxMode(
const MCInst *
MI,
unsigned OpNo,
1630 using namespace llvm::AMDGPU::VGPRIndexMode;
1631 unsigned Val =
MI->getOperand(OpNo).getImm();
1633 if ((Val & ~ENABLE_MASK) != 0) {
1634 O << formatHex(static_cast<uint64_t>(Val));
1637 ListSeparator Sep(
",");
1638 for (
unsigned ModeId = ID_MIN; ModeId <=
ID_MAX; ++ModeId) {
1639 if (Val & (1 << ModeId))
1646void AMDGPUInstPrinter::printMemOperand(
const MCInst *
MI,
unsigned OpNo,
1649 printRegularOperand(
MI, OpNo, STI, O);
1651 printRegularOperand(
MI, OpNo + 1, STI, O);
1659 if (
Op.getImm() == 1) {
1670 if (
Op.getImm() == 1)
1677 int Imm =
MI->getOperand(OpNo).getImm();
1691 const unsigned Imm16 =
MI->getOperand(OpNo).getImm();
1702 O <<
"sendmsg(" << MsgName;
1711 O <<
"sendmsg(" << MsgId <<
", " << OpId <<
", " <<
StreamId <<
')';
1721 const uint16_t Imm16 =
static_cast<uint16_t
>(
MI->getOperand(OpNo).
getImm());
1724 if (EventName.
empty())
1725 O << formatHex(static_cast<uint64_t>(Imm16));
1736 uint16_t Probe0 = ((0 & AndMask) | OrMask) ^ XorMask;
1741 for (
unsigned Mask = 1 << (
BITMASK_WIDTH - 1); Mask > 0; Mask >>= 1) {
1768 uint16_t
Imm =
MI->getOperand(OpNo).getImm();
1811 }
else if (AndMask ==
BITMASK_MAX && OrMask == 0 && XorMask > 0 &&
1822 if (GroupSize > 1 &&
1824 OrMask < GroupSize &&
1842 printU16ImmDecOperand(
MI, OpNo, O);
1851 unsigned SImm16 =
MI->getOperand(OpNo).getImm();
1852 unsigned Vmcnt, Expcnt, Lgkmcnt;
1858 bool PrintAll = IsDefaultVmcnt && IsDefaultExpcnt && IsDefaultLgkmcnt;
1862 if (!IsDefaultVmcnt || PrintAll)
1863 O << Sep <<
"vmcnt(" << Vmcnt <<
')';
1865 if (!IsDefaultExpcnt || PrintAll)
1866 O << Sep <<
"expcnt(" << Expcnt <<
')';
1868 if (!IsDefaultLgkmcnt || PrintAll)
1869 O << Sep <<
"lgkmcnt(" << Lgkmcnt <<
')';
1877 uint64_t Imm16 =
MI->getOperand(OpNo).getImm() & 0xffff;
1879 bool HasNonDefaultVal =
false;
1887 if (!IsDefault || !HasNonDefaultVal)
1888 O << Sep << Name <<
'(' << Val <<
')';
1898 const char *BadInstId =
"/* invalid instid value */";
1899 static const std::array<const char *, 12> InstIds = {
1900 "NO_DEP",
"VALU_DEP_1",
"VALU_DEP_2",
1901 "VALU_DEP_3",
"VALU_DEP_4",
"TRANS32_DEP_1",
1902 "TRANS32_DEP_2",
"TRANS32_DEP_3",
"FMA_ACCUM_CYCLE_1",
1903 "SALU_CYCLE_1",
"SALU_CYCLE_2",
"SALU_CYCLE_3"};
1905 const char *BadInstSkip =
"/* invalid instskip value */";
1906 static const std::array<const char *, 6> InstSkips = {
1907 "SAME",
"NEXT",
"SKIP_1",
"SKIP_2",
"SKIP_3",
"SKIP_4"};
1909 unsigned SImm16 =
MI->getOperand(OpNo).getImm();
1910 const char *Prefix =
"";
1912 unsigned Value = SImm16 & 0xF;
1914 const char *Name =
Value < InstIds.size() ? InstIds[
Value] : BadInstId;
1915 O << Prefix <<
"instid0(" << Name <<
')';
1919 Value = (SImm16 >> 4) & 7;
1922 Value < InstSkips.size() ? InstSkips[
Value] : BadInstSkip;
1923 O << Prefix <<
"instskip(" << Name <<
')';
1927 Value = (SImm16 >> 7) & 0xF;
1929 const char *Name =
Value < InstIds.size() ? InstIds[
Value] : BadInstId;
1930 O << Prefix <<
"instid1(" << Name <<
')';
1941 unsigned Val =
MI->getOperand(OpNo).getImm();
1946 if (!HwRegName.
empty()) {
1952 O <<
", " <<
Offset <<
", " << Width;
1959 uint16_t
Imm =
MI->getOperand(OpNo).getImm();
1967void AMDGPUInstPrinter::printNamedInt(
const MCInst *
MI,
unsigned OpNo,
1970 bool PrintInHex,
bool AlwaysPrint) {
1971 int64_t V =
MI->getOperand(OpNo).getImm();
1972 if (AlwaysPrint || V != 0)
1976void AMDGPUInstPrinter::printBitOp3(
const MCInst *
MI,
unsigned OpNo,
1987 O << formatHex(static_cast<uint64_t>(
Imm));
1990#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
MachineRegisterInfo & MRI
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...
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)
bool getVOP3IsSingle(unsigned Opc)
bool getVOP1IsSingle(unsigned Opc)
LLVM_READONLY bool hasNamedOperand(uint32_t Opcode, OpName NamedIdx)
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)
@ Lo16
Fixup[15:0] <- Target + Addend.
@ Hi16
Fixup[15:0] <- (Target + Addend + 0x8000) >> 16.
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.
static constexpr ValueType Default
static std::tuple< typename Fields::ValueType... > decode(uint64_t Encoded)
Instruction set architecture version.
StringTable::Offset AsmSuffix