1 //===-- AMDGPUInstPrinter.cpp - AMDGPU MC Inst -> ASM ---------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
8 //===----------------------------------------------------------------------===//
10 #include "AMDGPUInstPrinter.h"
11 #include "MCTargetDesc/AMDGPUMCTargetDesc.h"
12 #include "SIDefines.h"
13 #include "Utils/AMDGPUAsmUtils.h"
14 #include "Utils/AMDGPUBaseInfo.h"
15 #include "llvm/MC/MCExpr.h"
16 #include "llvm/MC/MCInst.h"
17 #include "llvm/MC/MCInstrDesc.h"
18 #include "llvm/MC/MCInstrInfo.h"
19 #include "llvm/MC/MCRegisterInfo.h"
20 #include "llvm/MC/MCSubtargetInfo.h"
21 #include "llvm/Support/ErrorHandling.h"
22 #include "llvm/Support/MathExtras.h"
23 #include "llvm/Support/raw_ostream.h"
27 using namespace llvm::AMDGPU;
29 void AMDGPUInstPrinter::printInst(const MCInst *MI, raw_ostream &OS,
30 StringRef Annot, const MCSubtargetInfo &STI) {
32 printInstruction(MI, STI, OS);
33 printAnnotation(OS, Annot);
36 void AMDGPUInstPrinter::printU4ImmOperand(const MCInst *MI, unsigned OpNo,
37 const MCSubtargetInfo &STI,
39 O << formatHex(MI->getOperand(OpNo).getImm() & 0xf);
42 void AMDGPUInstPrinter::printU8ImmOperand(const MCInst *MI, unsigned OpNo,
44 O << formatHex(MI->getOperand(OpNo).getImm() & 0xff);
47 void AMDGPUInstPrinter::printU16ImmOperand(const MCInst *MI, unsigned OpNo,
48 const MCSubtargetInfo &STI,
50 // It's possible to end up with a 32-bit literal used with a 16-bit operand
51 // with ignored high bits. Print as 32-bit anyway in that case.
52 int64_t Imm = MI->getOperand(OpNo).getImm();
53 if (isInt<16>(Imm) || isUInt<16>(Imm))
54 O << formatHex(static_cast<uint64_t>(Imm & 0xffff));
56 printU32ImmOperand(MI, OpNo, STI, O);
59 void AMDGPUInstPrinter::printU4ImmDecOperand(const MCInst *MI, unsigned OpNo,
61 O << formatDec(MI->getOperand(OpNo).getImm() & 0xf);
64 void AMDGPUInstPrinter::printU8ImmDecOperand(const MCInst *MI, unsigned OpNo,
66 O << formatDec(MI->getOperand(OpNo).getImm() & 0xff);
69 void AMDGPUInstPrinter::printU16ImmDecOperand(const MCInst *MI, unsigned OpNo,
71 O << formatDec(MI->getOperand(OpNo).getImm() & 0xffff);
74 void AMDGPUInstPrinter::printU32ImmOperand(const MCInst *MI, unsigned OpNo,
75 const MCSubtargetInfo &STI,
77 O << formatHex(MI->getOperand(OpNo).getImm() & 0xffffffff);
80 void AMDGPUInstPrinter::printNamedBit(const MCInst *MI, unsigned OpNo,
81 raw_ostream &O, StringRef BitName) {
82 if (MI->getOperand(OpNo).getImm()) {
87 void AMDGPUInstPrinter::printOffen(const MCInst *MI, unsigned OpNo,
89 printNamedBit(MI, OpNo, O, "offen");
92 void AMDGPUInstPrinter::printIdxen(const MCInst *MI, unsigned OpNo,
94 printNamedBit(MI, OpNo, O, "idxen");
97 void AMDGPUInstPrinter::printAddr64(const MCInst *MI, unsigned OpNo,
99 printNamedBit(MI, OpNo, O, "addr64");
102 void AMDGPUInstPrinter::printMBUFOffset(const MCInst *MI, unsigned OpNo,
104 if (MI->getOperand(OpNo).getImm()) {
106 printU16ImmDecOperand(MI, OpNo, O);
110 void AMDGPUInstPrinter::printOffset(const MCInst *MI, unsigned OpNo,
111 const MCSubtargetInfo &STI,
113 uint16_t Imm = MI->getOperand(OpNo).getImm();
115 O << ((OpNo == 0)? "offset:" : " offset:");
116 printU16ImmDecOperand(MI, OpNo, O);
120 void AMDGPUInstPrinter::printFlatOffset(const MCInst *MI, unsigned OpNo,
121 const MCSubtargetInfo &STI,
123 uint16_t Imm = MI->getOperand(OpNo).getImm();
125 O << ((OpNo == 0)? "offset:" : " offset:");
127 const MCInstrDesc &Desc = MII.get(MI->getOpcode());
128 bool IsFlatSeg = !(Desc.TSFlags & SIInstrFlags::IsNonFlatSeg);
130 if (IsFlatSeg) { // Unsigned offset
131 printU16ImmDecOperand(MI, OpNo, O);
132 } else { // Signed offset
133 if (AMDGPU::isGFX10(STI)) {
134 O << formatDec(SignExtend32<12>(MI->getOperand(OpNo).getImm()));
136 O << formatDec(SignExtend32<13>(MI->getOperand(OpNo).getImm()));
142 void AMDGPUInstPrinter::printOffset0(const MCInst *MI, unsigned OpNo,
143 const MCSubtargetInfo &STI,
145 if (MI->getOperand(OpNo).getImm()) {
147 printU8ImmDecOperand(MI, OpNo, O);
151 void AMDGPUInstPrinter::printOffset1(const MCInst *MI, unsigned OpNo,
152 const MCSubtargetInfo &STI,
154 if (MI->getOperand(OpNo).getImm()) {
156 printU8ImmDecOperand(MI, OpNo, O);
160 void AMDGPUInstPrinter::printSMRDOffset8(const MCInst *MI, unsigned OpNo,
161 const MCSubtargetInfo &STI,
163 printU32ImmOperand(MI, OpNo, STI, O);
166 void AMDGPUInstPrinter::printSMRDOffset20(const MCInst *MI, unsigned OpNo,
167 const MCSubtargetInfo &STI,
169 printU32ImmOperand(MI, OpNo, STI, O);
172 void AMDGPUInstPrinter::printSMRDLiteralOffset(const MCInst *MI, unsigned OpNo,
173 const MCSubtargetInfo &STI,
175 printU32ImmOperand(MI, OpNo, STI, O);
178 void AMDGPUInstPrinter::printGDS(const MCInst *MI, unsigned OpNo,
179 const MCSubtargetInfo &STI, raw_ostream &O) {
180 printNamedBit(MI, OpNo, O, "gds");
183 void AMDGPUInstPrinter::printDLC(const MCInst *MI, unsigned OpNo,
184 const MCSubtargetInfo &STI, raw_ostream &O) {
185 if (AMDGPU::isGFX10(STI))
186 printNamedBit(MI, OpNo, O, "dlc");
189 void AMDGPUInstPrinter::printGLC(const MCInst *MI, unsigned OpNo,
190 const MCSubtargetInfo &STI, raw_ostream &O) {
191 printNamedBit(MI, OpNo, O, "glc");
194 void AMDGPUInstPrinter::printSLC(const MCInst *MI, unsigned OpNo,
195 const MCSubtargetInfo &STI, raw_ostream &O) {
196 printNamedBit(MI, OpNo, O, "slc");
199 void AMDGPUInstPrinter::printTFE(const MCInst *MI, unsigned OpNo,
200 const MCSubtargetInfo &STI, raw_ostream &O) {
201 printNamedBit(MI, OpNo, O, "tfe");
204 void AMDGPUInstPrinter::printDMask(const MCInst *MI, unsigned OpNo,
205 const MCSubtargetInfo &STI, raw_ostream &O) {
206 if (MI->getOperand(OpNo).getImm()) {
208 printU16ImmOperand(MI, OpNo, STI, O);
212 void AMDGPUInstPrinter::printDim(const MCInst *MI, unsigned OpNo,
213 const MCSubtargetInfo &STI, raw_ostream &O) {
214 unsigned Dim = MI->getOperand(OpNo).getImm();
215 O << " dim:SQ_RSRC_IMG_";
217 const AMDGPU::MIMGDimInfo *DimInfo = AMDGPU::getMIMGDimInfoByEncoding(Dim);
219 O << DimInfo->AsmSuffix;
224 void AMDGPUInstPrinter::printUNorm(const MCInst *MI, unsigned OpNo,
225 const MCSubtargetInfo &STI, raw_ostream &O) {
226 printNamedBit(MI, OpNo, O, "unorm");
229 void AMDGPUInstPrinter::printDA(const MCInst *MI, unsigned OpNo,
230 const MCSubtargetInfo &STI, raw_ostream &O) {
231 printNamedBit(MI, OpNo, O, "da");
234 void AMDGPUInstPrinter::printR128A16(const MCInst *MI, unsigned OpNo,
235 const MCSubtargetInfo &STI, raw_ostream &O) {
236 if (STI.hasFeature(AMDGPU::FeatureR128A16))
237 printNamedBit(MI, OpNo, O, "a16");
239 printNamedBit(MI, OpNo, O, "r128");
242 void AMDGPUInstPrinter::printLWE(const MCInst *MI, unsigned OpNo,
243 const MCSubtargetInfo &STI, raw_ostream &O) {
244 printNamedBit(MI, OpNo, O, "lwe");
247 void AMDGPUInstPrinter::printD16(const MCInst *MI, unsigned OpNo,
248 const MCSubtargetInfo &STI, raw_ostream &O) {
249 printNamedBit(MI, OpNo, O, "d16");
252 void AMDGPUInstPrinter::printExpCompr(const MCInst *MI, unsigned OpNo,
253 const MCSubtargetInfo &STI,
255 if (MI->getOperand(OpNo).getImm())
259 void AMDGPUInstPrinter::printExpVM(const MCInst *MI, unsigned OpNo,
260 const MCSubtargetInfo &STI,
262 if (MI->getOperand(OpNo).getImm())
266 void AMDGPUInstPrinter::printFORMAT(const MCInst *MI, unsigned OpNo,
267 const MCSubtargetInfo &STI,
269 if (unsigned Val = MI->getOperand(OpNo).getImm()) {
270 if (AMDGPU::isGFX10(STI))
271 O << " format:" << Val;
273 O << " dfmt:" << (Val & 15);
274 O << ", nfmt:" << (Val >> 4);
279 void AMDGPUInstPrinter::printRegOperand(unsigned RegNo, raw_ostream &O,
280 const MCRegisterInfo &MRI) {
285 case AMDGPU::SCRATCH_WAVE_OFFSET_REG:
286 case AMDGPU::PRIVATE_RSRC_REG:
287 llvm_unreachable("pseudo-register should not ever be emitted");
289 llvm_unreachable("pseudo scc should not ever be emitted");
295 unsigned AltName = AMDGPU::Reg32;
297 if (MRI.getRegClass(AMDGPU::VReg_64RegClassID).contains(RegNo) ||
298 MRI.getRegClass(AMDGPU::SGPR_64RegClassID).contains(RegNo) ||
299 MRI.getRegClass(AMDGPU::AReg_64RegClassID).contains(RegNo))
300 AltName = AMDGPU::Reg64;
301 else if (MRI.getRegClass(AMDGPU::VReg_128RegClassID).contains(RegNo) ||
302 MRI.getRegClass(AMDGPU::SGPR_128RegClassID).contains(RegNo) ||
303 MRI.getRegClass(AMDGPU::AReg_128RegClassID).contains(RegNo))
304 AltName = AMDGPU::Reg128;
305 else if (MRI.getRegClass(AMDGPU::VReg_96RegClassID).contains(RegNo) ||
306 MRI.getRegClass(AMDGPU::SReg_96RegClassID).contains(RegNo))
307 AltName = AMDGPU::Reg96;
308 else if (MRI.getRegClass(AMDGPU::VReg_160RegClassID).contains(RegNo) ||
309 MRI.getRegClass(AMDGPU::SReg_160RegClassID).contains(RegNo))
310 AltName = AMDGPU::Reg160;
311 else if (MRI.getRegClass(AMDGPU::VReg_256RegClassID).contains(RegNo) ||
312 MRI.getRegClass(AMDGPU::SGPR_256RegClassID).contains(RegNo))
313 AltName = AMDGPU::Reg256;
314 else if (MRI.getRegClass(AMDGPU::VReg_512RegClassID).contains(RegNo) ||
315 MRI.getRegClass(AMDGPU::SGPR_512RegClassID).contains(RegNo) ||
316 MRI.getRegClass(AMDGPU::AReg_512RegClassID).contains(RegNo))
317 AltName = AMDGPU::Reg512;
318 else if (MRI.getRegClass(AMDGPU::VReg_1024RegClassID).contains(RegNo) ||
319 MRI.getRegClass(AMDGPU::SReg_1024RegClassID).contains(RegNo) ||
320 MRI.getRegClass(AMDGPU::AReg_1024RegClassID).contains(RegNo))
321 AltName = AMDGPU::Reg1024;
323 O << getRegisterName(RegNo, AltName);
326 void AMDGPUInstPrinter::printVOPDst(const MCInst *MI, unsigned OpNo,
327 const MCSubtargetInfo &STI, raw_ostream &O) {
329 if (MII.get(MI->getOpcode()).TSFlags & SIInstrFlags::VOP3)
331 else if (MII.get(MI->getOpcode()).TSFlags & SIInstrFlags::DPP)
333 else if (MII.get(MI->getOpcode()).TSFlags & SIInstrFlags::SDWA)
339 printOperand(MI, OpNo, STI, O);
341 // Print default vcc/vcc_lo operand.
342 switch (MI->getOpcode()) {
345 case AMDGPU::V_ADD_CO_CI_U32_e32_gfx10:
346 case AMDGPU::V_SUB_CO_CI_U32_e32_gfx10:
347 case AMDGPU::V_SUBREV_CO_CI_U32_e32_gfx10:
348 case AMDGPU::V_ADD_CO_CI_U32_sdwa_gfx10:
349 case AMDGPU::V_SUB_CO_CI_U32_sdwa_gfx10:
350 case AMDGPU::V_SUBREV_CO_CI_U32_sdwa_gfx10:
351 case AMDGPU::V_ADD_CO_CI_U32_dpp_gfx10:
352 case AMDGPU::V_SUB_CO_CI_U32_dpp_gfx10:
353 case AMDGPU::V_SUBREV_CO_CI_U32_dpp_gfx10:
354 case AMDGPU::V_ADD_CO_CI_U32_dpp8_gfx10:
355 case AMDGPU::V_SUB_CO_CI_U32_dpp8_gfx10:
356 case AMDGPU::V_SUBREV_CO_CI_U32_dpp8_gfx10:
357 printDefaultVccOperand(1, STI, O);
362 void AMDGPUInstPrinter::printVINTRPDst(const MCInst *MI, unsigned OpNo,
363 const MCSubtargetInfo &STI, raw_ostream &O) {
364 if (AMDGPU::isSI(STI) || AMDGPU::isCI(STI))
369 printOperand(MI, OpNo, STI, O);
372 void AMDGPUInstPrinter::printImmediate16(uint32_t Imm,
373 const MCSubtargetInfo &STI,
375 int16_t SImm = static_cast<int16_t>(Imm);
376 if (SImm >= -16 && SImm <= 64) {
383 else if (Imm == 0xBC00)
385 else if (Imm == 0x3800)
387 else if (Imm == 0xB800)
389 else if (Imm == 0x4000)
391 else if (Imm == 0xC000)
393 else if (Imm == 0x4400)
395 else if (Imm == 0xC400)
397 else if (Imm == 0x3118) {
398 assert(STI.getFeatureBits()[AMDGPU::FeatureInv2PiInlineImm]);
401 O << formatHex(static_cast<uint64_t>(Imm));
404 void AMDGPUInstPrinter::printImmediateV216(uint32_t Imm,
405 const MCSubtargetInfo &STI,
407 uint16_t Lo16 = static_cast<uint16_t>(Imm);
408 printImmediate16(Lo16, STI, O);
411 void AMDGPUInstPrinter::printImmediate32(uint32_t Imm,
412 const MCSubtargetInfo &STI,
414 int32_t SImm = static_cast<int32_t>(Imm);
415 if (SImm >= -16 && SImm <= 64) {
420 if (Imm == FloatToBits(0.0f))
422 else if (Imm == FloatToBits(1.0f))
424 else if (Imm == FloatToBits(-1.0f))
426 else if (Imm == FloatToBits(0.5f))
428 else if (Imm == FloatToBits(-0.5f))
430 else if (Imm == FloatToBits(2.0f))
432 else if (Imm == FloatToBits(-2.0f))
434 else if (Imm == FloatToBits(4.0f))
436 else if (Imm == FloatToBits(-4.0f))
438 else if (Imm == 0x3e22f983 &&
439 STI.getFeatureBits()[AMDGPU::FeatureInv2PiInlineImm])
442 O << formatHex(static_cast<uint64_t>(Imm));
445 void AMDGPUInstPrinter::printImmediate64(uint64_t Imm,
446 const MCSubtargetInfo &STI,
448 int64_t SImm = static_cast<int64_t>(Imm);
449 if (SImm >= -16 && SImm <= 64) {
454 if (Imm == DoubleToBits(0.0))
456 else if (Imm == DoubleToBits(1.0))
458 else if (Imm == DoubleToBits(-1.0))
460 else if (Imm == DoubleToBits(0.5))
462 else if (Imm == DoubleToBits(-0.5))
464 else if (Imm == DoubleToBits(2.0))
466 else if (Imm == DoubleToBits(-2.0))
468 else if (Imm == DoubleToBits(4.0))
470 else if (Imm == DoubleToBits(-4.0))
472 else if (Imm == 0x3fc45f306dc9c882 &&
473 STI.getFeatureBits()[AMDGPU::FeatureInv2PiInlineImm])
474 O << "0.15915494309189532";
476 assert(isUInt<32>(Imm) || Imm == 0x3fc45f306dc9c882);
478 // In rare situations, we will have a 32-bit literal in a 64-bit
479 // operand. This is technically allowed for the encoding of s_mov_b64.
480 O << formatHex(static_cast<uint64_t>(Imm));
484 void AMDGPUInstPrinter::printBLGP(const MCInst *MI, unsigned OpNo,
485 const MCSubtargetInfo &STI,
487 unsigned Imm = MI->getOperand(OpNo).getImm();
491 O << " blgp:" << Imm;
494 void AMDGPUInstPrinter::printCBSZ(const MCInst *MI, unsigned OpNo,
495 const MCSubtargetInfo &STI,
497 unsigned Imm = MI->getOperand(OpNo).getImm();
501 O << " cbsz:" << Imm;
504 void AMDGPUInstPrinter::printABID(const MCInst *MI, unsigned OpNo,
505 const MCSubtargetInfo &STI,
507 unsigned Imm = MI->getOperand(OpNo).getImm();
511 O << " abid:" << Imm;
514 void AMDGPUInstPrinter::printDefaultVccOperand(unsigned OpNo,
515 const MCSubtargetInfo &STI,
519 printRegOperand(STI.getFeatureBits()[AMDGPU::FeatureWavefrontSize64] ?
520 AMDGPU::VCC : AMDGPU::VCC_LO, O, MRI);
525 void AMDGPUInstPrinter::printOperand(const MCInst *MI, unsigned OpNo,
526 const MCSubtargetInfo &STI,
528 // Print default vcc/vcc_lo operand of VOPC.
529 const MCInstrDesc &Desc = MII.get(MI->getOpcode());
530 if (OpNo == 0 && (Desc.TSFlags & SIInstrFlags::VOPC) &&
531 (Desc.hasImplicitDefOfPhysReg(AMDGPU::VCC) ||
532 Desc.hasImplicitDefOfPhysReg(AMDGPU::VCC_LO)))
533 printDefaultVccOperand(OpNo, STI, O);
535 if (OpNo >= MI->getNumOperands()) {
536 O << "/*Missing OP" << OpNo << "*/";
540 const MCOperand &Op = MI->getOperand(OpNo);
542 printRegOperand(Op.getReg(), O, MRI);
543 } else if (Op.isImm()) {
544 switch (Desc.OpInfo[OpNo].OperandType) {
545 case AMDGPU::OPERAND_REG_IMM_INT32:
546 case AMDGPU::OPERAND_REG_IMM_FP32:
547 case AMDGPU::OPERAND_REG_INLINE_C_INT32:
548 case AMDGPU::OPERAND_REG_INLINE_C_FP32:
549 case AMDGPU::OPERAND_REG_INLINE_AC_INT32:
550 case AMDGPU::OPERAND_REG_INLINE_AC_FP32:
551 case MCOI::OPERAND_IMMEDIATE:
552 printImmediate32(Op.getImm(), STI, O);
554 case AMDGPU::OPERAND_REG_IMM_INT64:
555 case AMDGPU::OPERAND_REG_IMM_FP64:
556 case AMDGPU::OPERAND_REG_INLINE_C_INT64:
557 case AMDGPU::OPERAND_REG_INLINE_C_FP64:
558 printImmediate64(Op.getImm(), STI, O);
560 case AMDGPU::OPERAND_REG_INLINE_C_INT16:
561 case AMDGPU::OPERAND_REG_INLINE_C_FP16:
562 case AMDGPU::OPERAND_REG_INLINE_AC_INT16:
563 case AMDGPU::OPERAND_REG_INLINE_AC_FP16:
564 case AMDGPU::OPERAND_REG_IMM_INT16:
565 case AMDGPU::OPERAND_REG_IMM_FP16:
566 printImmediate16(Op.getImm(), STI, O);
568 case AMDGPU::OPERAND_REG_IMM_V2INT16:
569 case AMDGPU::OPERAND_REG_IMM_V2FP16:
570 if (!isUInt<16>(Op.getImm()) &&
571 STI.getFeatureBits()[AMDGPU::FeatureVOP3Literal]) {
572 printImmediate32(Op.getImm(), STI, O);
576 case AMDGPU::OPERAND_REG_INLINE_C_V2FP16:
577 case AMDGPU::OPERAND_REG_INLINE_C_V2INT16:
578 case AMDGPU::OPERAND_REG_INLINE_AC_V2FP16:
579 case AMDGPU::OPERAND_REG_INLINE_AC_V2INT16:
580 printImmediateV216(Op.getImm(), STI, O);
582 case MCOI::OPERAND_UNKNOWN:
583 case MCOI::OPERAND_PCREL:
584 O << formatDec(Op.getImm());
586 case MCOI::OPERAND_REGISTER:
587 // FIXME: This should be removed and handled somewhere else. Seems to come
588 // from a disassembler bug.
589 O << "/*invalid immediate*/";
592 // We hit this for the immediate instruction bits that don't yet have a
594 llvm_unreachable("unexpected immediate operand type");
596 } else if (Op.isFPImm()) {
597 // We special case 0.0 because otherwise it will be printed as an integer.
598 if (Op.getFPImm() == 0.0)
601 const MCInstrDesc &Desc = MII.get(MI->getOpcode());
602 int RCID = Desc.OpInfo[OpNo].RegClass;
603 unsigned RCBits = AMDGPU::getRegBitWidth(MRI.getRegClass(RCID));
605 printImmediate32(FloatToBits(Op.getFPImm()), STI, O);
606 else if (RCBits == 64)
607 printImmediate64(DoubleToBits(Op.getFPImm()), STI, O);
609 llvm_unreachable("Invalid register class size");
611 } else if (Op.isExpr()) {
612 const MCExpr *Exp = Op.getExpr();
618 // Print default vcc/vcc_lo operand of v_cndmask_b32_e32.
619 switch (MI->getOpcode()) {
622 case AMDGPU::V_CNDMASK_B32_e32_gfx10:
623 case AMDGPU::V_ADD_CO_CI_U32_e32_gfx10:
624 case AMDGPU::V_SUB_CO_CI_U32_e32_gfx10:
625 case AMDGPU::V_SUBREV_CO_CI_U32_e32_gfx10:
626 case AMDGPU::V_ADD_CO_CI_U32_dpp_gfx10:
627 case AMDGPU::V_SUB_CO_CI_U32_dpp_gfx10:
628 case AMDGPU::V_SUBREV_CO_CI_U32_dpp_gfx10:
629 case AMDGPU::V_ADD_CO_CI_U32_dpp8_gfx10:
630 case AMDGPU::V_SUB_CO_CI_U32_dpp8_gfx10:
631 case AMDGPU::V_SUBREV_CO_CI_U32_dpp8_gfx10:
633 case AMDGPU::V_CNDMASK_B32_e32_gfx6_gfx7:
634 case AMDGPU::V_CNDMASK_B32_e32_vi:
635 if ((int)OpNo == AMDGPU::getNamedOperandIdx(MI->getOpcode(),
636 AMDGPU::OpName::src1))
637 printDefaultVccOperand(OpNo, STI, O);
642 void AMDGPUInstPrinter::printOperandAndFPInputMods(const MCInst *MI,
644 const MCSubtargetInfo &STI,
646 unsigned InputModifiers = MI->getOperand(OpNo).getImm();
648 // Use 'neg(...)' instead of '-' to avoid ambiguity.
649 // This is important for integer literals because
650 // -1 is not the same value as neg(1).
651 bool NegMnemo = false;
653 if (InputModifiers & SISrcMods::NEG) {
654 if (OpNo + 1 < MI->getNumOperands() &&
655 (InputModifiers & SISrcMods::ABS) == 0) {
656 const MCOperand &Op = MI->getOperand(OpNo + 1);
657 NegMnemo = Op.isImm() || Op.isFPImm();
666 if (InputModifiers & SISrcMods::ABS)
668 printOperand(MI, OpNo + 1, STI, O);
669 if (InputModifiers & SISrcMods::ABS)
677 void AMDGPUInstPrinter::printOperandAndIntInputMods(const MCInst *MI,
679 const MCSubtargetInfo &STI,
681 unsigned InputModifiers = MI->getOperand(OpNo).getImm();
682 if (InputModifiers & SISrcMods::SEXT)
684 printOperand(MI, OpNo + 1, STI, O);
685 if (InputModifiers & SISrcMods::SEXT)
688 // Print default vcc/vcc_lo operand of VOP2b.
689 switch (MI->getOpcode()) {
692 case AMDGPU::V_ADD_CO_CI_U32_sdwa_gfx10:
693 case AMDGPU::V_SUB_CO_CI_U32_sdwa_gfx10:
694 case AMDGPU::V_SUBREV_CO_CI_U32_sdwa_gfx10:
695 if ((int)OpNo + 1 == AMDGPU::getNamedOperandIdx(MI->getOpcode(),
696 AMDGPU::OpName::src1))
697 printDefaultVccOperand(OpNo, STI, O);
702 void AMDGPUInstPrinter::printDPP8(const MCInst *MI, unsigned OpNo,
703 const MCSubtargetInfo &STI,
705 if (!AMDGPU::isGFX10(STI))
706 llvm_unreachable("dpp8 is not supported on ASICs earlier than GFX10");
708 unsigned Imm = MI->getOperand(OpNo).getImm();
709 O << " dpp8:[" << formatDec(Imm & 0x7);
710 for (size_t i = 1; i < 8; ++i) {
711 O << ',' << formatDec((Imm >> (3 * i)) & 0x7);
716 void AMDGPUInstPrinter::printDPPCtrl(const MCInst *MI, unsigned OpNo,
717 const MCSubtargetInfo &STI,
719 using namespace AMDGPU::DPP;
721 unsigned Imm = MI->getOperand(OpNo).getImm();
722 if (Imm <= DppCtrl::QUAD_PERM_LAST) {
724 O << formatDec(Imm & 0x3) << ',';
725 O << formatDec((Imm & 0xc) >> 2) << ',';
726 O << formatDec((Imm & 0x30) >> 4) << ',';
727 O << formatDec((Imm & 0xc0) >> 6) << ']';
728 } else if ((Imm >= DppCtrl::ROW_SHL_FIRST) &&
729 (Imm <= DppCtrl::ROW_SHL_LAST)) {
731 printU4ImmDecOperand(MI, OpNo, O);
732 } else if ((Imm >= DppCtrl::ROW_SHR_FIRST) &&
733 (Imm <= DppCtrl::ROW_SHR_LAST)) {
735 printU4ImmDecOperand(MI, OpNo, O);
736 } else if ((Imm >= DppCtrl::ROW_ROR_FIRST) &&
737 (Imm <= DppCtrl::ROW_ROR_LAST)) {
739 printU4ImmDecOperand(MI, OpNo, O);
740 } else if (Imm == DppCtrl::WAVE_SHL1) {
741 if (!AMDGPU::isVI(STI) && !AMDGPU::isGFX9(STI)) {
742 O << " /* wave_shl is not supported starting from GFX10 */";
746 } else if (Imm == DppCtrl::WAVE_ROL1) {
747 if (!AMDGPU::isVI(STI) && !AMDGPU::isGFX9(STI)) {
748 O << " /* wave_rol is not supported starting from GFX10 */";
752 } else if (Imm == DppCtrl::WAVE_SHR1) {
753 if (!AMDGPU::isVI(STI) && !AMDGPU::isGFX9(STI)) {
754 O << " /* wave_shr is not supported starting from GFX10 */";
758 } else if (Imm == DppCtrl::WAVE_ROR1) {
759 if (!AMDGPU::isVI(STI) && !AMDGPU::isGFX9(STI)) {
760 O << " /* wave_ror is not supported starting from GFX10 */";
764 } else if (Imm == DppCtrl::ROW_MIRROR) {
766 } else if (Imm == DppCtrl::ROW_HALF_MIRROR) {
767 O << " row_half_mirror";
768 } else if (Imm == DppCtrl::BCAST15) {
769 if (!AMDGPU::isVI(STI) && !AMDGPU::isGFX9(STI)) {
770 O << " /* row_bcast is not supported starting from GFX10 */";
773 O << " row_bcast:15";
774 } else if (Imm == DppCtrl::BCAST31) {
775 if (!AMDGPU::isVI(STI) && !AMDGPU::isGFX9(STI)) {
776 O << " /* row_bcast is not supported starting from GFX10 */";
779 O << " row_bcast:31";
780 } else if ((Imm >= DppCtrl::ROW_SHARE_FIRST) &&
781 (Imm <= DppCtrl::ROW_SHARE_LAST)) {
782 if (!AMDGPU::isGFX10(STI)) {
783 O << " /* row_share is not supported on ASICs earlier than GFX10 */";
787 printU4ImmDecOperand(MI, OpNo, O);
788 } else if ((Imm >= DppCtrl::ROW_XMASK_FIRST) &&
789 (Imm <= DppCtrl::ROW_XMASK_LAST)) {
790 if (!AMDGPU::isGFX10(STI)) {
791 O << " /* row_xmask is not supported on ASICs earlier than GFX10 */";
795 printU4ImmDecOperand(MI, OpNo, O);
797 O << " /* Invalid dpp_ctrl value */";
801 void AMDGPUInstPrinter::printRowMask(const MCInst *MI, unsigned OpNo,
802 const MCSubtargetInfo &STI,
805 printU4ImmOperand(MI, OpNo, STI, O);
808 void AMDGPUInstPrinter::printBankMask(const MCInst *MI, unsigned OpNo,
809 const MCSubtargetInfo &STI,
812 printU4ImmOperand(MI, OpNo, STI, O);
815 void AMDGPUInstPrinter::printBoundCtrl(const MCInst *MI, unsigned OpNo,
816 const MCSubtargetInfo &STI,
818 unsigned Imm = MI->getOperand(OpNo).getImm();
820 O << " bound_ctrl:0"; // XXX - this syntax is used in sp3
824 void AMDGPUInstPrinter::printFI(const MCInst *MI, unsigned OpNo,
825 const MCSubtargetInfo &STI,
827 using namespace llvm::AMDGPU::DPP;
828 unsigned Imm = MI->getOperand(OpNo).getImm();
829 if (Imm == DPP_FI_1 || Imm == DPP8_FI_1) {
834 void AMDGPUInstPrinter::printSDWASel(const MCInst *MI, unsigned OpNo,
836 using namespace llvm::AMDGPU::SDWA;
838 unsigned Imm = MI->getOperand(OpNo).getImm();
840 case SdwaSel::BYTE_0: O << "BYTE_0"; break;
841 case SdwaSel::BYTE_1: O << "BYTE_1"; break;
842 case SdwaSel::BYTE_2: O << "BYTE_2"; break;
843 case SdwaSel::BYTE_3: O << "BYTE_3"; break;
844 case SdwaSel::WORD_0: O << "WORD_0"; break;
845 case SdwaSel::WORD_1: O << "WORD_1"; break;
846 case SdwaSel::DWORD: O << "DWORD"; break;
847 default: llvm_unreachable("Invalid SDWA data select operand");
851 void AMDGPUInstPrinter::printSDWADstSel(const MCInst *MI, unsigned OpNo,
852 const MCSubtargetInfo &STI,
855 printSDWASel(MI, OpNo, O);
858 void AMDGPUInstPrinter::printSDWASrc0Sel(const MCInst *MI, unsigned OpNo,
859 const MCSubtargetInfo &STI,
862 printSDWASel(MI, OpNo, O);
865 void AMDGPUInstPrinter::printSDWASrc1Sel(const MCInst *MI, unsigned OpNo,
866 const MCSubtargetInfo &STI,
869 printSDWASel(MI, OpNo, O);
872 void AMDGPUInstPrinter::printSDWADstUnused(const MCInst *MI, unsigned OpNo,
873 const MCSubtargetInfo &STI,
875 using namespace llvm::AMDGPU::SDWA;
878 unsigned Imm = MI->getOperand(OpNo).getImm();
880 case DstUnused::UNUSED_PAD: O << "UNUSED_PAD"; break;
881 case DstUnused::UNUSED_SEXT: O << "UNUSED_SEXT"; break;
882 case DstUnused::UNUSED_PRESERVE: O << "UNUSED_PRESERVE"; break;
883 default: llvm_unreachable("Invalid SDWA dest_unused operand");
887 template <unsigned N>
888 void AMDGPUInstPrinter::printExpSrcN(const MCInst *MI, unsigned OpNo,
889 const MCSubtargetInfo &STI,
891 unsigned Opc = MI->getOpcode();
892 int EnIdx = AMDGPU::getNamedOperandIdx(Opc, AMDGPU::OpName::en);
893 unsigned En = MI->getOperand(EnIdx).getImm();
895 int ComprIdx = AMDGPU::getNamedOperandIdx(Opc, AMDGPU::OpName::compr);
897 // If compr is set, print as src0, src0, src1, src1
898 if (MI->getOperand(ComprIdx).getImm()) {
899 if (N == 1 || N == 2)
906 printRegOperand(MI->getOperand(OpNo).getReg(), O, MRI);
911 void AMDGPUInstPrinter::printExpSrc0(const MCInst *MI, unsigned OpNo,
912 const MCSubtargetInfo &STI,
914 printExpSrcN<0>(MI, OpNo, STI, O);
917 void AMDGPUInstPrinter::printExpSrc1(const MCInst *MI, unsigned OpNo,
918 const MCSubtargetInfo &STI,
920 printExpSrcN<1>(MI, OpNo, STI, O);
923 void AMDGPUInstPrinter::printExpSrc2(const MCInst *MI, unsigned OpNo,
924 const MCSubtargetInfo &STI,
926 printExpSrcN<2>(MI, OpNo, STI, O);
929 void AMDGPUInstPrinter::printExpSrc3(const MCInst *MI, unsigned OpNo,
930 const MCSubtargetInfo &STI,
932 printExpSrcN<3>(MI, OpNo, STI, O);
935 void AMDGPUInstPrinter::printExpTgt(const MCInst *MI, unsigned OpNo,
936 const MCSubtargetInfo &STI,
938 // This is really a 6 bit field.
939 uint32_t Tgt = MI->getOperand(OpNo).getImm() & ((1 << 6) - 1);
947 else if ((Tgt >= 12 && Tgt <= 15) || (Tgt == 16 && AMDGPU::isGFX10(STI)))
948 O << " pos" << Tgt - 12;
949 else if (AMDGPU::isGFX10(STI) && Tgt == 20)
951 else if (Tgt >= 32 && Tgt <= 63)
952 O << " param" << Tgt - 32;
954 // Reserved values 10, 11
955 O << " invalid_target_" << Tgt;
959 static bool allOpsDefaultValue(const int* Ops, int NumOps, int Mod,
960 bool IsPacked, bool HasDstSel) {
961 int DefaultValue = IsPacked && (Mod == SISrcMods::OP_SEL_1);
963 for (int I = 0; I < NumOps; ++I) {
964 if (!!(Ops[I] & Mod) != DefaultValue)
968 if (HasDstSel && (Ops[0] & SISrcMods::DST_OP_SEL) != 0)
974 void AMDGPUInstPrinter::printPackedModifier(const MCInst *MI,
978 unsigned Opc = MI->getOpcode();
982 for (int OpName : { AMDGPU::OpName::src0_modifiers,
983 AMDGPU::OpName::src1_modifiers,
984 AMDGPU::OpName::src2_modifiers }) {
985 int Idx = AMDGPU::getNamedOperandIdx(Opc, OpName);
989 Ops[NumOps++] = MI->getOperand(Idx).getImm();
992 const bool HasDstSel =
994 Mod == SISrcMods::OP_SEL_0 &&
995 MII.get(MI->getOpcode()).TSFlags & SIInstrFlags::VOP3_OPSEL;
997 const bool IsPacked =
998 MII.get(MI->getOpcode()).TSFlags & SIInstrFlags::IsPacked;
1000 if (allOpsDefaultValue(Ops, NumOps, Mod, IsPacked, HasDstSel))
1004 for (int I = 0; I < NumOps; ++I) {
1008 O << !!(Ops[I] & Mod);
1012 O << ',' << !!(Ops[0] & SISrcMods::DST_OP_SEL);
1018 void AMDGPUInstPrinter::printOpSel(const MCInst *MI, unsigned,
1019 const MCSubtargetInfo &STI,
1021 unsigned Opc = MI->getOpcode();
1022 if (Opc == AMDGPU::V_PERMLANE16_B32_gfx10 ||
1023 Opc == AMDGPU::V_PERMLANEX16_B32_gfx10) {
1024 auto FIN = AMDGPU::getNamedOperandIdx(Opc, AMDGPU::OpName::src0_modifiers);
1025 auto BCN = AMDGPU::getNamedOperandIdx(Opc, AMDGPU::OpName::src1_modifiers);
1026 unsigned FI = !!(MI->getOperand(FIN).getImm() & SISrcMods::OP_SEL_0);
1027 unsigned BC = !!(MI->getOperand(BCN).getImm() & SISrcMods::OP_SEL_0);
1029 O << " op_sel:[" << FI << ',' << BC << ']';
1033 printPackedModifier(MI, " op_sel:[", SISrcMods::OP_SEL_0, O);
1036 void AMDGPUInstPrinter::printOpSelHi(const MCInst *MI, unsigned OpNo,
1037 const MCSubtargetInfo &STI,
1039 printPackedModifier(MI, " op_sel_hi:[", SISrcMods::OP_SEL_1, O);
1042 void AMDGPUInstPrinter::printNegLo(const MCInst *MI, unsigned OpNo,
1043 const MCSubtargetInfo &STI,
1045 printPackedModifier(MI, " neg_lo:[", SISrcMods::NEG, O);
1048 void AMDGPUInstPrinter::printNegHi(const MCInst *MI, unsigned OpNo,
1049 const MCSubtargetInfo &STI,
1051 printPackedModifier(MI, " neg_hi:[", SISrcMods::NEG_HI, O);
1054 void AMDGPUInstPrinter::printInterpSlot(const MCInst *MI, unsigned OpNum,
1055 const MCSubtargetInfo &STI,
1057 unsigned Imm = MI->getOperand(OpNum).getImm();
1069 O << "invalid_param_" << Imm;
1073 void AMDGPUInstPrinter::printInterpAttr(const MCInst *MI, unsigned OpNum,
1074 const MCSubtargetInfo &STI,
1076 unsigned Attr = MI->getOperand(OpNum).getImm();
1077 O << "attr" << Attr;
1080 void AMDGPUInstPrinter::printInterpAttrChan(const MCInst *MI, unsigned OpNum,
1081 const MCSubtargetInfo &STI,
1083 unsigned Chan = MI->getOperand(OpNum).getImm();
1084 O << '.' << "xyzw"[Chan & 0x3];
1087 void AMDGPUInstPrinter::printVGPRIndexMode(const MCInst *MI, unsigned OpNo,
1088 const MCSubtargetInfo &STI,
1090 using namespace llvm::AMDGPU::VGPRIndexMode;
1091 unsigned Val = MI->getOperand(OpNo).getImm();
1093 if ((Val & ~ENABLE_MASK) != 0) {
1094 O << " " << formatHex(static_cast<uint64_t>(Val));
1097 bool NeedComma = false;
1098 for (unsigned ModeId = ID_MIN; ModeId <= ID_MAX; ++ModeId) {
1099 if (Val & (1 << ModeId)) {
1102 O << IdSymbolic[ModeId];
1110 void AMDGPUInstPrinter::printMemOperand(const MCInst *MI, unsigned OpNo,
1111 const MCSubtargetInfo &STI,
1113 printOperand(MI, OpNo, STI, O);
1115 printOperand(MI, OpNo + 1, STI, O);
1118 void AMDGPUInstPrinter::printIfSet(const MCInst *MI, unsigned OpNo,
1119 raw_ostream &O, StringRef Asm,
1120 StringRef Default) {
1121 const MCOperand &Op = MI->getOperand(OpNo);
1123 if (Op.getImm() == 1) {
1130 void AMDGPUInstPrinter::printIfSet(const MCInst *MI, unsigned OpNo,
1131 raw_ostream &O, char Asm) {
1132 const MCOperand &Op = MI->getOperand(OpNo);
1134 if (Op.getImm() == 1)
1138 void AMDGPUInstPrinter::printHigh(const MCInst *MI, unsigned OpNo,
1139 const MCSubtargetInfo &STI,
1141 if (MI->getOperand(OpNo).getImm())
1145 void AMDGPUInstPrinter::printClampSI(const MCInst *MI, unsigned OpNo,
1146 const MCSubtargetInfo &STI,
1148 if (MI->getOperand(OpNo).getImm())
1152 void AMDGPUInstPrinter::printOModSI(const MCInst *MI, unsigned OpNo,
1153 const MCSubtargetInfo &STI,
1155 int Imm = MI->getOperand(OpNo).getImm();
1156 if (Imm == SIOutMods::MUL2)
1158 else if (Imm == SIOutMods::MUL4)
1160 else if (Imm == SIOutMods::DIV2)
1164 void AMDGPUInstPrinter::printSendMsg(const MCInst *MI, unsigned OpNo,
1165 const MCSubtargetInfo &STI,
1167 using namespace llvm::AMDGPU::SendMsg;
1169 const unsigned Imm16 = MI->getOperand(OpNo).getImm();
1174 decodeMsg(Imm16, MsgId, OpId, StreamId);
1176 if (isValidMsgId(MsgId, STI) &&
1177 isValidMsgOp(MsgId, OpId) &&
1178 isValidMsgStream(MsgId, OpId, StreamId)) {
1179 O << "sendmsg(" << getMsgName(MsgId);
1180 if (msgRequiresOp(MsgId)) {
1181 O << ", " << getMsgOpName(MsgId, OpId);
1182 if (msgSupportsStream(MsgId, OpId)) {
1183 O << ", " << StreamId;
1187 } else if (encodeMsg(MsgId, OpId, StreamId) == Imm16) {
1188 O << "sendmsg(" << MsgId << ", " << OpId << ", " << StreamId << ')';
1190 O << Imm16; // Unknown imm16 code.
1194 static void printSwizzleBitmask(const uint16_t AndMask,
1195 const uint16_t OrMask,
1196 const uint16_t XorMask,
1198 using namespace llvm::AMDGPU::Swizzle;
1200 uint16_t Probe0 = ((0 & AndMask) | OrMask) ^ XorMask;
1201 uint16_t Probe1 = ((BITMASK_MASK & AndMask) | OrMask) ^ XorMask;
1205 for (unsigned Mask = 1 << (BITMASK_WIDTH - 1); Mask > 0; Mask >>= 1) {
1206 uint16_t p0 = Probe0 & Mask;
1207 uint16_t p1 = Probe1 & Mask;
1227 void AMDGPUInstPrinter::printSwizzle(const MCInst *MI, unsigned OpNo,
1228 const MCSubtargetInfo &STI,
1230 using namespace llvm::AMDGPU::Swizzle;
1232 uint16_t Imm = MI->getOperand(OpNo).getImm();
1239 if ((Imm & QUAD_PERM_ENC_MASK) == QUAD_PERM_ENC) {
1241 O << "swizzle(" << IdSymbolic[ID_QUAD_PERM];
1242 for (unsigned I = 0; I < LANE_NUM; ++I) {
1244 O << formatDec(Imm & LANE_MASK);
1249 } else if ((Imm & BITMASK_PERM_ENC_MASK) == BITMASK_PERM_ENC) {
1251 uint16_t AndMask = (Imm >> BITMASK_AND_SHIFT) & BITMASK_MASK;
1252 uint16_t OrMask = (Imm >> BITMASK_OR_SHIFT) & BITMASK_MASK;
1253 uint16_t XorMask = (Imm >> BITMASK_XOR_SHIFT) & BITMASK_MASK;
1255 if (AndMask == BITMASK_MAX &&
1257 countPopulation(XorMask) == 1) {
1259 O << "swizzle(" << IdSymbolic[ID_SWAP];
1261 O << formatDec(XorMask);
1264 } else if (AndMask == BITMASK_MAX &&
1265 OrMask == 0 && XorMask > 0 &&
1266 isPowerOf2_64(XorMask + 1)) {
1268 O << "swizzle(" << IdSymbolic[ID_REVERSE];
1270 O << formatDec(XorMask + 1);
1275 uint16_t GroupSize = BITMASK_MAX - AndMask + 1;
1276 if (GroupSize > 1 &&
1277 isPowerOf2_64(GroupSize) &&
1278 OrMask < GroupSize &&
1281 O << "swizzle(" << IdSymbolic[ID_BROADCAST];
1283 O << formatDec(GroupSize);
1285 O << formatDec(OrMask);
1289 O << "swizzle(" << IdSymbolic[ID_BITMASK_PERM];
1291 printSwizzleBitmask(AndMask, OrMask, XorMask, O);
1296 printU16ImmDecOperand(MI, OpNo, O);
1300 void AMDGPUInstPrinter::printWaitFlag(const MCInst *MI, unsigned OpNo,
1301 const MCSubtargetInfo &STI,
1303 AMDGPU::IsaVersion ISA = AMDGPU::getIsaVersion(STI.getCPU());
1305 unsigned SImm16 = MI->getOperand(OpNo).getImm();
1306 unsigned Vmcnt, Expcnt, Lgkmcnt;
1307 decodeWaitcnt(ISA, SImm16, Vmcnt, Expcnt, Lgkmcnt);
1309 bool NeedSpace = false;
1311 if (Vmcnt != getVmcntBitMask(ISA)) {
1312 O << "vmcnt(" << Vmcnt << ')';
1316 if (Expcnt != getExpcntBitMask(ISA)) {
1319 O << "expcnt(" << Expcnt << ')';
1323 if (Lgkmcnt != getLgkmcntBitMask(ISA)) {
1326 O << "lgkmcnt(" << Lgkmcnt << ')';
1330 void AMDGPUInstPrinter::printHwreg(const MCInst *MI, unsigned OpNo,
1331 const MCSubtargetInfo &STI, raw_ostream &O) {
1336 using namespace llvm::AMDGPU::Hwreg;
1337 unsigned Val = MI->getOperand(OpNo).getImm();
1338 decodeHwreg(Val, Id, Offset, Width);
1339 StringRef HwRegName = getHwreg(Id, STI);
1342 if (!HwRegName.empty()) {
1347 if (Width != WIDTH_DEFAULT_ || Offset != OFFSET_DEFAULT_) {
1348 O << ", " << Offset << ", " << Width;
1353 void AMDGPUInstPrinter::printEndpgm(const MCInst *MI, unsigned OpNo,
1354 const MCSubtargetInfo &STI,
1356 uint16_t Imm = MI->getOperand(OpNo).getImm();
1361 O << ' ' << formatDec(Imm);
1364 #include "AMDGPUGenAsmWriter.inc"
1366 void R600InstPrinter::printInst(const MCInst *MI, raw_ostream &O,
1367 StringRef Annot, const MCSubtargetInfo &STI) {
1369 printInstruction(MI, O);
1370 printAnnotation(O, Annot);
1373 void R600InstPrinter::printAbs(const MCInst *MI, unsigned OpNo,
1375 AMDGPUInstPrinter::printIfSet(MI, OpNo, O, '|');
1378 void R600InstPrinter::printBankSwizzle(const MCInst *MI, unsigned OpNo,
1380 int BankSwizzle = MI->getOperand(OpNo).getImm();
1381 switch (BankSwizzle) {
1383 O << "BS:VEC_021/SCL_122";
1386 O << "BS:VEC_120/SCL_212";
1389 O << "BS:VEC_102/SCL_221";
1402 void R600InstPrinter::printClamp(const MCInst *MI, unsigned OpNo,
1404 AMDGPUInstPrinter::printIfSet(MI, OpNo, O, "_SAT");
1407 void R600InstPrinter::printCT(const MCInst *MI, unsigned OpNo,
1409 unsigned CT = MI->getOperand(OpNo).getImm();
1422 void R600InstPrinter::printKCache(const MCInst *MI, unsigned OpNo,
1424 int KCacheMode = MI->getOperand(OpNo).getImm();
1425 if (KCacheMode > 0) {
1426 int KCacheBank = MI->getOperand(OpNo - 2).getImm();
1427 O << "CB" << KCacheBank << ':';
1428 int KCacheAddr = MI->getOperand(OpNo + 2).getImm();
1429 int LineSize = (KCacheMode == 1) ? 16 : 32;
1430 O << KCacheAddr * 16 << '-' << KCacheAddr * 16 + LineSize;
1434 void R600InstPrinter::printLast(const MCInst *MI, unsigned OpNo,
1436 AMDGPUInstPrinter::printIfSet(MI, OpNo, O, "*", " ");
1439 void R600InstPrinter::printLiteral(const MCInst *MI, unsigned OpNo,
1441 const MCOperand &Op = MI->getOperand(OpNo);
1442 assert(Op.isImm() || Op.isExpr());
1444 int64_t Imm = Op.getImm();
1445 O << Imm << '(' << BitsToFloat(Imm) << ')';
1448 Op.getExpr()->print(O << '@', &MAI);
1452 void R600InstPrinter::printNeg(const MCInst *MI, unsigned OpNo,
1454 AMDGPUInstPrinter::printIfSet(MI, OpNo, O, '-');
1457 void R600InstPrinter::printOMOD(const MCInst *MI, unsigned OpNo,
1459 switch (MI->getOperand(OpNo).getImm()) {
1473 void R600InstPrinter::printMemOperand(const MCInst *MI, unsigned OpNo,
1475 printOperand(MI, OpNo, O);
1477 printOperand(MI, OpNo + 1, O);
1480 void R600InstPrinter::printOperand(const MCInst *MI, unsigned OpNo,
1482 if (OpNo >= MI->getNumOperands()) {
1483 O << "/*Missing OP" << OpNo << "*/";
1487 const MCOperand &Op = MI->getOperand(OpNo);
1489 switch (Op.getReg()) {
1490 // This is the default predicate state, so we don't need to print it.
1491 case R600::PRED_SEL_OFF:
1495 O << getRegisterName(Op.getReg());
1498 } else if (Op.isImm()) {
1500 } else if (Op.isFPImm()) {
1501 // We special case 0.0 because otherwise it will be printed as an integer.
1502 if (Op.getFPImm() == 0.0)
1507 } else if (Op.isExpr()) {
1508 const MCExpr *Exp = Op.getExpr();
1509 Exp->print(O, &MAI);
1515 void R600InstPrinter::printRel(const MCInst *MI, unsigned OpNo,
1517 AMDGPUInstPrinter::printIfSet(MI, OpNo, O, '+');
1520 void R600InstPrinter::printRSel(const MCInst *MI, unsigned OpNo,
1522 unsigned Sel = MI->getOperand(OpNo).getImm();
1550 void R600InstPrinter::printUpdateExecMask(const MCInst *MI, unsigned OpNo,
1552 AMDGPUInstPrinter::printIfSet(MI, OpNo, O, "ExecMask,");
1555 void R600InstPrinter::printUpdatePred(const MCInst *MI, unsigned OpNo,
1557 AMDGPUInstPrinter::printIfSet(MI, OpNo, O, "Pred,");
1560 void R600InstPrinter::printWrite(const MCInst *MI, unsigned OpNo,
1562 const MCOperand &Op = MI->getOperand(OpNo);
1563 if (Op.getImm() == 0) {
1568 #include "R600GenAsmWriter.inc"