1*9880d681SAndroid Build Coastguard Worker //===-- AMDGPUInstPrinter.cpp - AMDGPU MC Inst -> ASM ---------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker // \file
9*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard Worker #include "AMDGPUInstPrinter.h"
12*9880d681SAndroid Build Coastguard Worker #include "MCTargetDesc/AMDGPUMCTargetDesc.h"
13*9880d681SAndroid Build Coastguard Worker #include "SIDefines.h"
14*9880d681SAndroid Build Coastguard Worker #include "Utils/AMDGPUAsmUtils.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCExpr.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCInst.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCInstrInfo.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCRegisterInfo.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/MathExtras.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker #include <string>
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Worker using namespace llvm;
25*9880d681SAndroid Build Coastguard Worker
printInst(const MCInst * MI,raw_ostream & OS,StringRef Annot,const MCSubtargetInfo & STI)26*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printInst(const MCInst *MI, raw_ostream &OS,
27*9880d681SAndroid Build Coastguard Worker StringRef Annot, const MCSubtargetInfo &STI) {
28*9880d681SAndroid Build Coastguard Worker OS.flush();
29*9880d681SAndroid Build Coastguard Worker printInstruction(MI, OS);
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker printAnnotation(OS, Annot);
32*9880d681SAndroid Build Coastguard Worker }
33*9880d681SAndroid Build Coastguard Worker
printU4ImmOperand(const MCInst * MI,unsigned OpNo,raw_ostream & O)34*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printU4ImmOperand(const MCInst *MI, unsigned OpNo,
35*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
36*9880d681SAndroid Build Coastguard Worker O << formatHex(MI->getOperand(OpNo).getImm() & 0xf);
37*9880d681SAndroid Build Coastguard Worker }
38*9880d681SAndroid Build Coastguard Worker
printU8ImmOperand(const MCInst * MI,unsigned OpNo,raw_ostream & O)39*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printU8ImmOperand(const MCInst *MI, unsigned OpNo,
40*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
41*9880d681SAndroid Build Coastguard Worker O << formatHex(MI->getOperand(OpNo).getImm() & 0xff);
42*9880d681SAndroid Build Coastguard Worker }
43*9880d681SAndroid Build Coastguard Worker
printU16ImmOperand(const MCInst * MI,unsigned OpNo,raw_ostream & O)44*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printU16ImmOperand(const MCInst *MI, unsigned OpNo,
45*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
46*9880d681SAndroid Build Coastguard Worker O << formatHex(MI->getOperand(OpNo).getImm() & 0xffff);
47*9880d681SAndroid Build Coastguard Worker }
48*9880d681SAndroid Build Coastguard Worker
printU32ImmOperand(const MCInst * MI,unsigned OpNo,raw_ostream & O)49*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printU32ImmOperand(const MCInst *MI, unsigned OpNo,
50*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
51*9880d681SAndroid Build Coastguard Worker O << formatHex(MI->getOperand(OpNo).getImm() & 0xffffffff);
52*9880d681SAndroid Build Coastguard Worker }
53*9880d681SAndroid Build Coastguard Worker
printU4ImmDecOperand(const MCInst * MI,unsigned OpNo,raw_ostream & O)54*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printU4ImmDecOperand(const MCInst *MI, unsigned OpNo,
55*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
56*9880d681SAndroid Build Coastguard Worker O << formatDec(MI->getOperand(OpNo).getImm() & 0xf);
57*9880d681SAndroid Build Coastguard Worker }
58*9880d681SAndroid Build Coastguard Worker
printU8ImmDecOperand(const MCInst * MI,unsigned OpNo,raw_ostream & O)59*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printU8ImmDecOperand(const MCInst *MI, unsigned OpNo,
60*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
61*9880d681SAndroid Build Coastguard Worker O << formatDec(MI->getOperand(OpNo).getImm() & 0xff);
62*9880d681SAndroid Build Coastguard Worker }
63*9880d681SAndroid Build Coastguard Worker
printU16ImmDecOperand(const MCInst * MI,unsigned OpNo,raw_ostream & O)64*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printU16ImmDecOperand(const MCInst *MI, unsigned OpNo,
65*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
66*9880d681SAndroid Build Coastguard Worker O << formatDec(MI->getOperand(OpNo).getImm() & 0xffff);
67*9880d681SAndroid Build Coastguard Worker }
68*9880d681SAndroid Build Coastguard Worker
printNamedBit(const MCInst * MI,unsigned OpNo,raw_ostream & O,StringRef BitName)69*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printNamedBit(const MCInst* MI, unsigned OpNo,
70*9880d681SAndroid Build Coastguard Worker raw_ostream& O, StringRef BitName) {
71*9880d681SAndroid Build Coastguard Worker if (MI->getOperand(OpNo).getImm()) {
72*9880d681SAndroid Build Coastguard Worker O << ' ' << BitName;
73*9880d681SAndroid Build Coastguard Worker }
74*9880d681SAndroid Build Coastguard Worker }
75*9880d681SAndroid Build Coastguard Worker
printOffen(const MCInst * MI,unsigned OpNo,raw_ostream & O)76*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printOffen(const MCInst *MI, unsigned OpNo,
77*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
78*9880d681SAndroid Build Coastguard Worker printNamedBit(MI, OpNo, O, "offen");
79*9880d681SAndroid Build Coastguard Worker }
80*9880d681SAndroid Build Coastguard Worker
printIdxen(const MCInst * MI,unsigned OpNo,raw_ostream & O)81*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printIdxen(const MCInst *MI, unsigned OpNo,
82*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
83*9880d681SAndroid Build Coastguard Worker printNamedBit(MI, OpNo, O, "idxen");
84*9880d681SAndroid Build Coastguard Worker }
85*9880d681SAndroid Build Coastguard Worker
printAddr64(const MCInst * MI,unsigned OpNo,raw_ostream & O)86*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printAddr64(const MCInst *MI, unsigned OpNo,
87*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
88*9880d681SAndroid Build Coastguard Worker printNamedBit(MI, OpNo, O, "addr64");
89*9880d681SAndroid Build Coastguard Worker }
90*9880d681SAndroid Build Coastguard Worker
printMBUFOffset(const MCInst * MI,unsigned OpNo,raw_ostream & O)91*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printMBUFOffset(const MCInst *MI, unsigned OpNo,
92*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
93*9880d681SAndroid Build Coastguard Worker if (MI->getOperand(OpNo).getImm()) {
94*9880d681SAndroid Build Coastguard Worker O << " offset:";
95*9880d681SAndroid Build Coastguard Worker printU16ImmDecOperand(MI, OpNo, O);
96*9880d681SAndroid Build Coastguard Worker }
97*9880d681SAndroid Build Coastguard Worker }
98*9880d681SAndroid Build Coastguard Worker
printOffset(const MCInst * MI,unsigned OpNo,raw_ostream & O)99*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printOffset(const MCInst *MI, unsigned OpNo,
100*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
101*9880d681SAndroid Build Coastguard Worker uint16_t Imm = MI->getOperand(OpNo).getImm();
102*9880d681SAndroid Build Coastguard Worker if (Imm != 0) {
103*9880d681SAndroid Build Coastguard Worker O << " offset:";
104*9880d681SAndroid Build Coastguard Worker printU16ImmDecOperand(MI, OpNo, O);
105*9880d681SAndroid Build Coastguard Worker }
106*9880d681SAndroid Build Coastguard Worker }
107*9880d681SAndroid Build Coastguard Worker
printOffset0(const MCInst * MI,unsigned OpNo,raw_ostream & O)108*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printOffset0(const MCInst *MI, unsigned OpNo,
109*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
110*9880d681SAndroid Build Coastguard Worker if (MI->getOperand(OpNo).getImm()) {
111*9880d681SAndroid Build Coastguard Worker O << " offset0:";
112*9880d681SAndroid Build Coastguard Worker printU8ImmDecOperand(MI, OpNo, O);
113*9880d681SAndroid Build Coastguard Worker }
114*9880d681SAndroid Build Coastguard Worker }
115*9880d681SAndroid Build Coastguard Worker
printOffset1(const MCInst * MI,unsigned OpNo,raw_ostream & O)116*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printOffset1(const MCInst *MI, unsigned OpNo,
117*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
118*9880d681SAndroid Build Coastguard Worker if (MI->getOperand(OpNo).getImm()) {
119*9880d681SAndroid Build Coastguard Worker O << " offset1:";
120*9880d681SAndroid Build Coastguard Worker printU8ImmDecOperand(MI, OpNo, O);
121*9880d681SAndroid Build Coastguard Worker }
122*9880d681SAndroid Build Coastguard Worker }
123*9880d681SAndroid Build Coastguard Worker
printSMRDOffset(const MCInst * MI,unsigned OpNo,raw_ostream & O)124*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printSMRDOffset(const MCInst *MI, unsigned OpNo,
125*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
126*9880d681SAndroid Build Coastguard Worker printU32ImmOperand(MI, OpNo, O);
127*9880d681SAndroid Build Coastguard Worker }
128*9880d681SAndroid Build Coastguard Worker
printSMRDLiteralOffset(const MCInst * MI,unsigned OpNo,raw_ostream & O)129*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printSMRDLiteralOffset(const MCInst *MI, unsigned OpNo,
130*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
131*9880d681SAndroid Build Coastguard Worker printU32ImmOperand(MI, OpNo, O);
132*9880d681SAndroid Build Coastguard Worker }
133*9880d681SAndroid Build Coastguard Worker
printGDS(const MCInst * MI,unsigned OpNo,raw_ostream & O)134*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printGDS(const MCInst *MI, unsigned OpNo,
135*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
136*9880d681SAndroid Build Coastguard Worker printNamedBit(MI, OpNo, O, "gds");
137*9880d681SAndroid Build Coastguard Worker }
138*9880d681SAndroid Build Coastguard Worker
printGLC(const MCInst * MI,unsigned OpNo,raw_ostream & O)139*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printGLC(const MCInst *MI, unsigned OpNo,
140*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
141*9880d681SAndroid Build Coastguard Worker printNamedBit(MI, OpNo, O, "glc");
142*9880d681SAndroid Build Coastguard Worker }
143*9880d681SAndroid Build Coastguard Worker
printSLC(const MCInst * MI,unsigned OpNo,raw_ostream & O)144*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printSLC(const MCInst *MI, unsigned OpNo,
145*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
146*9880d681SAndroid Build Coastguard Worker printNamedBit(MI, OpNo, O, "slc");
147*9880d681SAndroid Build Coastguard Worker }
148*9880d681SAndroid Build Coastguard Worker
printTFE(const MCInst * MI,unsigned OpNo,raw_ostream & O)149*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printTFE(const MCInst *MI, unsigned OpNo,
150*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
151*9880d681SAndroid Build Coastguard Worker printNamedBit(MI, OpNo, O, "tfe");
152*9880d681SAndroid Build Coastguard Worker }
153*9880d681SAndroid Build Coastguard Worker
printDMask(const MCInst * MI,unsigned OpNo,raw_ostream & O)154*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printDMask(const MCInst *MI, unsigned OpNo,
155*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
156*9880d681SAndroid Build Coastguard Worker if (MI->getOperand(OpNo).getImm()) {
157*9880d681SAndroid Build Coastguard Worker O << " dmask:";
158*9880d681SAndroid Build Coastguard Worker printU16ImmOperand(MI, OpNo, O);
159*9880d681SAndroid Build Coastguard Worker }
160*9880d681SAndroid Build Coastguard Worker }
161*9880d681SAndroid Build Coastguard Worker
printUNorm(const MCInst * MI,unsigned OpNo,raw_ostream & O)162*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printUNorm(const MCInst *MI, unsigned OpNo,
163*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
164*9880d681SAndroid Build Coastguard Worker printNamedBit(MI, OpNo, O, "unorm");
165*9880d681SAndroid Build Coastguard Worker }
166*9880d681SAndroid Build Coastguard Worker
printDA(const MCInst * MI,unsigned OpNo,raw_ostream & O)167*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printDA(const MCInst *MI, unsigned OpNo,
168*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
169*9880d681SAndroid Build Coastguard Worker printNamedBit(MI, OpNo, O, "da");
170*9880d681SAndroid Build Coastguard Worker }
171*9880d681SAndroid Build Coastguard Worker
printR128(const MCInst * MI,unsigned OpNo,raw_ostream & O)172*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printR128(const MCInst *MI, unsigned OpNo,
173*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
174*9880d681SAndroid Build Coastguard Worker printNamedBit(MI, OpNo, O, "r128");
175*9880d681SAndroid Build Coastguard Worker }
176*9880d681SAndroid Build Coastguard Worker
printLWE(const MCInst * MI,unsigned OpNo,raw_ostream & O)177*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printLWE(const MCInst *MI, unsigned OpNo,
178*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
179*9880d681SAndroid Build Coastguard Worker printNamedBit(MI, OpNo, O, "lwe");
180*9880d681SAndroid Build Coastguard Worker }
181*9880d681SAndroid Build Coastguard Worker
printRegOperand(unsigned reg,raw_ostream & O,const MCRegisterInfo & MRI)182*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printRegOperand(unsigned reg, raw_ostream &O,
183*9880d681SAndroid Build Coastguard Worker const MCRegisterInfo &MRI) {
184*9880d681SAndroid Build Coastguard Worker switch (reg) {
185*9880d681SAndroid Build Coastguard Worker case AMDGPU::VCC:
186*9880d681SAndroid Build Coastguard Worker O << "vcc";
187*9880d681SAndroid Build Coastguard Worker return;
188*9880d681SAndroid Build Coastguard Worker case AMDGPU::SCC:
189*9880d681SAndroid Build Coastguard Worker O << "scc";
190*9880d681SAndroid Build Coastguard Worker return;
191*9880d681SAndroid Build Coastguard Worker case AMDGPU::EXEC:
192*9880d681SAndroid Build Coastguard Worker O << "exec";
193*9880d681SAndroid Build Coastguard Worker return;
194*9880d681SAndroid Build Coastguard Worker case AMDGPU::M0:
195*9880d681SAndroid Build Coastguard Worker O << "m0";
196*9880d681SAndroid Build Coastguard Worker return;
197*9880d681SAndroid Build Coastguard Worker case AMDGPU::FLAT_SCR:
198*9880d681SAndroid Build Coastguard Worker O << "flat_scratch";
199*9880d681SAndroid Build Coastguard Worker return;
200*9880d681SAndroid Build Coastguard Worker case AMDGPU::VCC_LO:
201*9880d681SAndroid Build Coastguard Worker O << "vcc_lo";
202*9880d681SAndroid Build Coastguard Worker return;
203*9880d681SAndroid Build Coastguard Worker case AMDGPU::VCC_HI:
204*9880d681SAndroid Build Coastguard Worker O << "vcc_hi";
205*9880d681SAndroid Build Coastguard Worker return;
206*9880d681SAndroid Build Coastguard Worker case AMDGPU::TBA_LO:
207*9880d681SAndroid Build Coastguard Worker O << "tba_lo";
208*9880d681SAndroid Build Coastguard Worker return;
209*9880d681SAndroid Build Coastguard Worker case AMDGPU::TBA_HI:
210*9880d681SAndroid Build Coastguard Worker O << "tba_hi";
211*9880d681SAndroid Build Coastguard Worker return;
212*9880d681SAndroid Build Coastguard Worker case AMDGPU::TMA_LO:
213*9880d681SAndroid Build Coastguard Worker O << "tma_lo";
214*9880d681SAndroid Build Coastguard Worker return;
215*9880d681SAndroid Build Coastguard Worker case AMDGPU::TMA_HI:
216*9880d681SAndroid Build Coastguard Worker O << "tma_hi";
217*9880d681SAndroid Build Coastguard Worker return;
218*9880d681SAndroid Build Coastguard Worker case AMDGPU::EXEC_LO:
219*9880d681SAndroid Build Coastguard Worker O << "exec_lo";
220*9880d681SAndroid Build Coastguard Worker return;
221*9880d681SAndroid Build Coastguard Worker case AMDGPU::EXEC_HI:
222*9880d681SAndroid Build Coastguard Worker O << "exec_hi";
223*9880d681SAndroid Build Coastguard Worker return;
224*9880d681SAndroid Build Coastguard Worker case AMDGPU::FLAT_SCR_LO:
225*9880d681SAndroid Build Coastguard Worker O << "flat_scratch_lo";
226*9880d681SAndroid Build Coastguard Worker return;
227*9880d681SAndroid Build Coastguard Worker case AMDGPU::FLAT_SCR_HI:
228*9880d681SAndroid Build Coastguard Worker O << "flat_scratch_hi";
229*9880d681SAndroid Build Coastguard Worker return;
230*9880d681SAndroid Build Coastguard Worker default:
231*9880d681SAndroid Build Coastguard Worker break;
232*9880d681SAndroid Build Coastguard Worker }
233*9880d681SAndroid Build Coastguard Worker
234*9880d681SAndroid Build Coastguard Worker // The low 8 bits of the encoding value is the register index, for both VGPRs
235*9880d681SAndroid Build Coastguard Worker // and SGPRs.
236*9880d681SAndroid Build Coastguard Worker unsigned RegIdx = MRI.getEncodingValue(reg) & ((1 << 8) - 1);
237*9880d681SAndroid Build Coastguard Worker
238*9880d681SAndroid Build Coastguard Worker unsigned NumRegs;
239*9880d681SAndroid Build Coastguard Worker if (MRI.getRegClass(AMDGPU::VGPR_32RegClassID).contains(reg)) {
240*9880d681SAndroid Build Coastguard Worker O << 'v';
241*9880d681SAndroid Build Coastguard Worker NumRegs = 1;
242*9880d681SAndroid Build Coastguard Worker } else if (MRI.getRegClass(AMDGPU::SGPR_32RegClassID).contains(reg)) {
243*9880d681SAndroid Build Coastguard Worker O << 's';
244*9880d681SAndroid Build Coastguard Worker NumRegs = 1;
245*9880d681SAndroid Build Coastguard Worker } else if (MRI.getRegClass(AMDGPU::VReg_64RegClassID).contains(reg)) {
246*9880d681SAndroid Build Coastguard Worker O <<'v';
247*9880d681SAndroid Build Coastguard Worker NumRegs = 2;
248*9880d681SAndroid Build Coastguard Worker } else if (MRI.getRegClass(AMDGPU::SGPR_64RegClassID).contains(reg)) {
249*9880d681SAndroid Build Coastguard Worker O << 's';
250*9880d681SAndroid Build Coastguard Worker NumRegs = 2;
251*9880d681SAndroid Build Coastguard Worker } else if (MRI.getRegClass(AMDGPU::VReg_128RegClassID).contains(reg)) {
252*9880d681SAndroid Build Coastguard Worker O << 'v';
253*9880d681SAndroid Build Coastguard Worker NumRegs = 4;
254*9880d681SAndroid Build Coastguard Worker } else if (MRI.getRegClass(AMDGPU::SGPR_128RegClassID).contains(reg)) {
255*9880d681SAndroid Build Coastguard Worker O << 's';
256*9880d681SAndroid Build Coastguard Worker NumRegs = 4;
257*9880d681SAndroid Build Coastguard Worker } else if (MRI.getRegClass(AMDGPU::VReg_96RegClassID).contains(reg)) {
258*9880d681SAndroid Build Coastguard Worker O << 'v';
259*9880d681SAndroid Build Coastguard Worker NumRegs = 3;
260*9880d681SAndroid Build Coastguard Worker } else if (MRI.getRegClass(AMDGPU::VReg_256RegClassID).contains(reg)) {
261*9880d681SAndroid Build Coastguard Worker O << 'v';
262*9880d681SAndroid Build Coastguard Worker NumRegs = 8;
263*9880d681SAndroid Build Coastguard Worker } else if (MRI.getRegClass(AMDGPU::SReg_256RegClassID).contains(reg)) {
264*9880d681SAndroid Build Coastguard Worker O << 's';
265*9880d681SAndroid Build Coastguard Worker NumRegs = 8;
266*9880d681SAndroid Build Coastguard Worker } else if (MRI.getRegClass(AMDGPU::VReg_512RegClassID).contains(reg)) {
267*9880d681SAndroid Build Coastguard Worker O << 'v';
268*9880d681SAndroid Build Coastguard Worker NumRegs = 16;
269*9880d681SAndroid Build Coastguard Worker } else if (MRI.getRegClass(AMDGPU::SReg_512RegClassID).contains(reg)) {
270*9880d681SAndroid Build Coastguard Worker O << 's';
271*9880d681SAndroid Build Coastguard Worker NumRegs = 16;
272*9880d681SAndroid Build Coastguard Worker } else if (MRI.getRegClass(AMDGPU::TTMP_64RegClassID).contains(reg)) {
273*9880d681SAndroid Build Coastguard Worker O << "ttmp";
274*9880d681SAndroid Build Coastguard Worker NumRegs = 2;
275*9880d681SAndroid Build Coastguard Worker RegIdx -= 112; // Trap temps start at offset 112. TODO: Get this from tablegen.
276*9880d681SAndroid Build Coastguard Worker } else if (MRI.getRegClass(AMDGPU::TTMP_128RegClassID).contains(reg)) {
277*9880d681SAndroid Build Coastguard Worker O << "ttmp";
278*9880d681SAndroid Build Coastguard Worker NumRegs = 4;
279*9880d681SAndroid Build Coastguard Worker RegIdx -= 112; // Trap temps start at offset 112. TODO: Get this from tablegen.
280*9880d681SAndroid Build Coastguard Worker } else {
281*9880d681SAndroid Build Coastguard Worker O << getRegisterName(reg);
282*9880d681SAndroid Build Coastguard Worker return;
283*9880d681SAndroid Build Coastguard Worker }
284*9880d681SAndroid Build Coastguard Worker
285*9880d681SAndroid Build Coastguard Worker if (NumRegs == 1) {
286*9880d681SAndroid Build Coastguard Worker O << RegIdx;
287*9880d681SAndroid Build Coastguard Worker return;
288*9880d681SAndroid Build Coastguard Worker }
289*9880d681SAndroid Build Coastguard Worker
290*9880d681SAndroid Build Coastguard Worker O << '[' << RegIdx << ':' << (RegIdx + NumRegs - 1) << ']';
291*9880d681SAndroid Build Coastguard Worker }
292*9880d681SAndroid Build Coastguard Worker
printVOPDst(const MCInst * MI,unsigned OpNo,raw_ostream & O)293*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printVOPDst(const MCInst *MI, unsigned OpNo,
294*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
295*9880d681SAndroid Build Coastguard Worker if (MII.get(MI->getOpcode()).TSFlags & SIInstrFlags::VOP3)
296*9880d681SAndroid Build Coastguard Worker O << "_e64 ";
297*9880d681SAndroid Build Coastguard Worker else if (MII.get(MI->getOpcode()).TSFlags & SIInstrFlags::DPP)
298*9880d681SAndroid Build Coastguard Worker O << "_dpp ";
299*9880d681SAndroid Build Coastguard Worker else if (MII.get(MI->getOpcode()).TSFlags & SIInstrFlags::SDWA)
300*9880d681SAndroid Build Coastguard Worker O << "_sdwa ";
301*9880d681SAndroid Build Coastguard Worker else
302*9880d681SAndroid Build Coastguard Worker O << "_e32 ";
303*9880d681SAndroid Build Coastguard Worker
304*9880d681SAndroid Build Coastguard Worker printOperand(MI, OpNo, O);
305*9880d681SAndroid Build Coastguard Worker }
306*9880d681SAndroid Build Coastguard Worker
printImmediate32(uint32_t Imm,raw_ostream & O)307*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printImmediate32(uint32_t Imm, raw_ostream &O) {
308*9880d681SAndroid Build Coastguard Worker int32_t SImm = static_cast<int32_t>(Imm);
309*9880d681SAndroid Build Coastguard Worker if (SImm >= -16 && SImm <= 64) {
310*9880d681SAndroid Build Coastguard Worker O << SImm;
311*9880d681SAndroid Build Coastguard Worker return;
312*9880d681SAndroid Build Coastguard Worker }
313*9880d681SAndroid Build Coastguard Worker
314*9880d681SAndroid Build Coastguard Worker if (Imm == FloatToBits(0.0f))
315*9880d681SAndroid Build Coastguard Worker O << "0.0";
316*9880d681SAndroid Build Coastguard Worker else if (Imm == FloatToBits(1.0f))
317*9880d681SAndroid Build Coastguard Worker O << "1.0";
318*9880d681SAndroid Build Coastguard Worker else if (Imm == FloatToBits(-1.0f))
319*9880d681SAndroid Build Coastguard Worker O << "-1.0";
320*9880d681SAndroid Build Coastguard Worker else if (Imm == FloatToBits(0.5f))
321*9880d681SAndroid Build Coastguard Worker O << "0.5";
322*9880d681SAndroid Build Coastguard Worker else if (Imm == FloatToBits(-0.5f))
323*9880d681SAndroid Build Coastguard Worker O << "-0.5";
324*9880d681SAndroid Build Coastguard Worker else if (Imm == FloatToBits(2.0f))
325*9880d681SAndroid Build Coastguard Worker O << "2.0";
326*9880d681SAndroid Build Coastguard Worker else if (Imm == FloatToBits(-2.0f))
327*9880d681SAndroid Build Coastguard Worker O << "-2.0";
328*9880d681SAndroid Build Coastguard Worker else if (Imm == FloatToBits(4.0f))
329*9880d681SAndroid Build Coastguard Worker O << "4.0";
330*9880d681SAndroid Build Coastguard Worker else if (Imm == FloatToBits(-4.0f))
331*9880d681SAndroid Build Coastguard Worker O << "-4.0";
332*9880d681SAndroid Build Coastguard Worker else
333*9880d681SAndroid Build Coastguard Worker O << formatHex(static_cast<uint64_t>(Imm));
334*9880d681SAndroid Build Coastguard Worker }
335*9880d681SAndroid Build Coastguard Worker
printImmediate64(uint64_t Imm,raw_ostream & O)336*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printImmediate64(uint64_t Imm, raw_ostream &O) {
337*9880d681SAndroid Build Coastguard Worker int64_t SImm = static_cast<int64_t>(Imm);
338*9880d681SAndroid Build Coastguard Worker if (SImm >= -16 && SImm <= 64) {
339*9880d681SAndroid Build Coastguard Worker O << SImm;
340*9880d681SAndroid Build Coastguard Worker return;
341*9880d681SAndroid Build Coastguard Worker }
342*9880d681SAndroid Build Coastguard Worker
343*9880d681SAndroid Build Coastguard Worker if (Imm == DoubleToBits(0.0))
344*9880d681SAndroid Build Coastguard Worker O << "0.0";
345*9880d681SAndroid Build Coastguard Worker else if (Imm == DoubleToBits(1.0))
346*9880d681SAndroid Build Coastguard Worker O << "1.0";
347*9880d681SAndroid Build Coastguard Worker else if (Imm == DoubleToBits(-1.0))
348*9880d681SAndroid Build Coastguard Worker O << "-1.0";
349*9880d681SAndroid Build Coastguard Worker else if (Imm == DoubleToBits(0.5))
350*9880d681SAndroid Build Coastguard Worker O << "0.5";
351*9880d681SAndroid Build Coastguard Worker else if (Imm == DoubleToBits(-0.5))
352*9880d681SAndroid Build Coastguard Worker O << "-0.5";
353*9880d681SAndroid Build Coastguard Worker else if (Imm == DoubleToBits(2.0))
354*9880d681SAndroid Build Coastguard Worker O << "2.0";
355*9880d681SAndroid Build Coastguard Worker else if (Imm == DoubleToBits(-2.0))
356*9880d681SAndroid Build Coastguard Worker O << "-2.0";
357*9880d681SAndroid Build Coastguard Worker else if (Imm == DoubleToBits(4.0))
358*9880d681SAndroid Build Coastguard Worker O << "4.0";
359*9880d681SAndroid Build Coastguard Worker else if (Imm == DoubleToBits(-4.0))
360*9880d681SAndroid Build Coastguard Worker O << "-4.0";
361*9880d681SAndroid Build Coastguard Worker else {
362*9880d681SAndroid Build Coastguard Worker assert(isUInt<32>(Imm));
363*9880d681SAndroid Build Coastguard Worker
364*9880d681SAndroid Build Coastguard Worker // In rare situations, we will have a 32-bit literal in a 64-bit
365*9880d681SAndroid Build Coastguard Worker // operand. This is technically allowed for the encoding of s_mov_b64.
366*9880d681SAndroid Build Coastguard Worker O << formatHex(static_cast<uint64_t>(Imm));
367*9880d681SAndroid Build Coastguard Worker }
368*9880d681SAndroid Build Coastguard Worker }
369*9880d681SAndroid Build Coastguard Worker
printOperand(const MCInst * MI,unsigned OpNo,raw_ostream & O)370*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printOperand(const MCInst *MI, unsigned OpNo,
371*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
372*9880d681SAndroid Build Coastguard Worker
373*9880d681SAndroid Build Coastguard Worker const MCOperand &Op = MI->getOperand(OpNo);
374*9880d681SAndroid Build Coastguard Worker if (Op.isReg()) {
375*9880d681SAndroid Build Coastguard Worker switch (Op.getReg()) {
376*9880d681SAndroid Build Coastguard Worker // This is the default predicate state, so we don't need to print it.
377*9880d681SAndroid Build Coastguard Worker case AMDGPU::PRED_SEL_OFF:
378*9880d681SAndroid Build Coastguard Worker break;
379*9880d681SAndroid Build Coastguard Worker
380*9880d681SAndroid Build Coastguard Worker default:
381*9880d681SAndroid Build Coastguard Worker printRegOperand(Op.getReg(), O, MRI);
382*9880d681SAndroid Build Coastguard Worker break;
383*9880d681SAndroid Build Coastguard Worker }
384*9880d681SAndroid Build Coastguard Worker } else if (Op.isImm()) {
385*9880d681SAndroid Build Coastguard Worker const MCInstrDesc &Desc = MII.get(MI->getOpcode());
386*9880d681SAndroid Build Coastguard Worker int RCID = Desc.OpInfo[OpNo].RegClass;
387*9880d681SAndroid Build Coastguard Worker if (RCID != -1) {
388*9880d681SAndroid Build Coastguard Worker const MCRegisterClass &ImmRC = MRI.getRegClass(RCID);
389*9880d681SAndroid Build Coastguard Worker if (ImmRC.getSize() == 4)
390*9880d681SAndroid Build Coastguard Worker printImmediate32(Op.getImm(), O);
391*9880d681SAndroid Build Coastguard Worker else if (ImmRC.getSize() == 8)
392*9880d681SAndroid Build Coastguard Worker printImmediate64(Op.getImm(), O);
393*9880d681SAndroid Build Coastguard Worker else
394*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Invalid register class size");
395*9880d681SAndroid Build Coastguard Worker } else if (Desc.OpInfo[OpNo].OperandType == MCOI::OPERAND_IMMEDIATE) {
396*9880d681SAndroid Build Coastguard Worker printImmediate32(Op.getImm(), O);
397*9880d681SAndroid Build Coastguard Worker } else {
398*9880d681SAndroid Build Coastguard Worker // We hit this for the immediate instruction bits that don't yet have a
399*9880d681SAndroid Build Coastguard Worker // custom printer.
400*9880d681SAndroid Build Coastguard Worker // TODO: Eventually this should be unnecessary.
401*9880d681SAndroid Build Coastguard Worker O << formatDec(Op.getImm());
402*9880d681SAndroid Build Coastguard Worker }
403*9880d681SAndroid Build Coastguard Worker } else if (Op.isFPImm()) {
404*9880d681SAndroid Build Coastguard Worker // We special case 0.0 because otherwise it will be printed as an integer.
405*9880d681SAndroid Build Coastguard Worker if (Op.getFPImm() == 0.0)
406*9880d681SAndroid Build Coastguard Worker O << "0.0";
407*9880d681SAndroid Build Coastguard Worker else {
408*9880d681SAndroid Build Coastguard Worker const MCInstrDesc &Desc = MII.get(MI->getOpcode());
409*9880d681SAndroid Build Coastguard Worker const MCRegisterClass &ImmRC = MRI.getRegClass(Desc.OpInfo[OpNo].RegClass);
410*9880d681SAndroid Build Coastguard Worker
411*9880d681SAndroid Build Coastguard Worker if (ImmRC.getSize() == 4)
412*9880d681SAndroid Build Coastguard Worker printImmediate32(FloatToBits(Op.getFPImm()), O);
413*9880d681SAndroid Build Coastguard Worker else if (ImmRC.getSize() == 8)
414*9880d681SAndroid Build Coastguard Worker printImmediate64(DoubleToBits(Op.getFPImm()), O);
415*9880d681SAndroid Build Coastguard Worker else
416*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Invalid register class size");
417*9880d681SAndroid Build Coastguard Worker }
418*9880d681SAndroid Build Coastguard Worker } else if (Op.isExpr()) {
419*9880d681SAndroid Build Coastguard Worker const MCExpr *Exp = Op.getExpr();
420*9880d681SAndroid Build Coastguard Worker Exp->print(O, &MAI);
421*9880d681SAndroid Build Coastguard Worker } else {
422*9880d681SAndroid Build Coastguard Worker O << "/*INV_OP*/";
423*9880d681SAndroid Build Coastguard Worker }
424*9880d681SAndroid Build Coastguard Worker }
425*9880d681SAndroid Build Coastguard Worker
printOperandAndFPInputMods(const MCInst * MI,unsigned OpNo,raw_ostream & O)426*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printOperandAndFPInputMods(const MCInst *MI,
427*9880d681SAndroid Build Coastguard Worker unsigned OpNo,
428*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
429*9880d681SAndroid Build Coastguard Worker unsigned InputModifiers = MI->getOperand(OpNo).getImm();
430*9880d681SAndroid Build Coastguard Worker if (InputModifiers & SISrcMods::NEG)
431*9880d681SAndroid Build Coastguard Worker O << '-';
432*9880d681SAndroid Build Coastguard Worker if (InputModifiers & SISrcMods::ABS)
433*9880d681SAndroid Build Coastguard Worker O << '|';
434*9880d681SAndroid Build Coastguard Worker printOperand(MI, OpNo + 1, O);
435*9880d681SAndroid Build Coastguard Worker if (InputModifiers & SISrcMods::ABS)
436*9880d681SAndroid Build Coastguard Worker O << '|';
437*9880d681SAndroid Build Coastguard Worker }
438*9880d681SAndroid Build Coastguard Worker
printOperandAndIntInputMods(const MCInst * MI,unsigned OpNo,raw_ostream & O)439*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printOperandAndIntInputMods(const MCInst *MI,
440*9880d681SAndroid Build Coastguard Worker unsigned OpNo,
441*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
442*9880d681SAndroid Build Coastguard Worker unsigned InputModifiers = MI->getOperand(OpNo).getImm();
443*9880d681SAndroid Build Coastguard Worker if (InputModifiers & SISrcMods::SEXT)
444*9880d681SAndroid Build Coastguard Worker O << "sext(";
445*9880d681SAndroid Build Coastguard Worker printOperand(MI, OpNo + 1, O);
446*9880d681SAndroid Build Coastguard Worker if (InputModifiers & SISrcMods::SEXT)
447*9880d681SAndroid Build Coastguard Worker O << ')';
448*9880d681SAndroid Build Coastguard Worker }
449*9880d681SAndroid Build Coastguard Worker
450*9880d681SAndroid Build Coastguard Worker
printDPPCtrl(const MCInst * MI,unsigned OpNo,raw_ostream & O)451*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printDPPCtrl(const MCInst *MI, unsigned OpNo,
452*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
453*9880d681SAndroid Build Coastguard Worker unsigned Imm = MI->getOperand(OpNo).getImm();
454*9880d681SAndroid Build Coastguard Worker if (Imm <= 0x0ff) {
455*9880d681SAndroid Build Coastguard Worker O << " quad_perm:[";
456*9880d681SAndroid Build Coastguard Worker O << formatDec(Imm & 0x3) << ',';
457*9880d681SAndroid Build Coastguard Worker O << formatDec((Imm & 0xc) >> 2) << ',';
458*9880d681SAndroid Build Coastguard Worker O << formatDec((Imm & 0x30) >> 4) << ',';
459*9880d681SAndroid Build Coastguard Worker O << formatDec((Imm & 0xc0) >> 6) << ']';
460*9880d681SAndroid Build Coastguard Worker } else if ((Imm >= 0x101) && (Imm <= 0x10f)) {
461*9880d681SAndroid Build Coastguard Worker O << " row_shl:";
462*9880d681SAndroid Build Coastguard Worker printU4ImmDecOperand(MI, OpNo, O);
463*9880d681SAndroid Build Coastguard Worker } else if ((Imm >= 0x111) && (Imm <= 0x11f)) {
464*9880d681SAndroid Build Coastguard Worker O << " row_shr:";
465*9880d681SAndroid Build Coastguard Worker printU4ImmDecOperand(MI, OpNo, O);
466*9880d681SAndroid Build Coastguard Worker } else if ((Imm >= 0x121) && (Imm <= 0x12f)) {
467*9880d681SAndroid Build Coastguard Worker O << " row_ror:";
468*9880d681SAndroid Build Coastguard Worker printU4ImmDecOperand(MI, OpNo, O);
469*9880d681SAndroid Build Coastguard Worker } else if (Imm == 0x130) {
470*9880d681SAndroid Build Coastguard Worker O << " wave_shl:1";
471*9880d681SAndroid Build Coastguard Worker } else if (Imm == 0x134) {
472*9880d681SAndroid Build Coastguard Worker O << " wave_rol:1";
473*9880d681SAndroid Build Coastguard Worker } else if (Imm == 0x138) {
474*9880d681SAndroid Build Coastguard Worker O << " wave_shr:1";
475*9880d681SAndroid Build Coastguard Worker } else if (Imm == 0x13c) {
476*9880d681SAndroid Build Coastguard Worker O << " wave_ror:1";
477*9880d681SAndroid Build Coastguard Worker } else if (Imm == 0x140) {
478*9880d681SAndroid Build Coastguard Worker O << " row_mirror";
479*9880d681SAndroid Build Coastguard Worker } else if (Imm == 0x141) {
480*9880d681SAndroid Build Coastguard Worker O << " row_half_mirror";
481*9880d681SAndroid Build Coastguard Worker } else if (Imm == 0x142) {
482*9880d681SAndroid Build Coastguard Worker O << " row_bcast:15";
483*9880d681SAndroid Build Coastguard Worker } else if (Imm == 0x143) {
484*9880d681SAndroid Build Coastguard Worker O << " row_bcast:31";
485*9880d681SAndroid Build Coastguard Worker } else {
486*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Invalid dpp_ctrl value");
487*9880d681SAndroid Build Coastguard Worker }
488*9880d681SAndroid Build Coastguard Worker }
489*9880d681SAndroid Build Coastguard Worker
printRowMask(const MCInst * MI,unsigned OpNo,raw_ostream & O)490*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printRowMask(const MCInst *MI, unsigned OpNo,
491*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
492*9880d681SAndroid Build Coastguard Worker O << " row_mask:";
493*9880d681SAndroid Build Coastguard Worker printU4ImmOperand(MI, OpNo, O);
494*9880d681SAndroid Build Coastguard Worker }
495*9880d681SAndroid Build Coastguard Worker
printBankMask(const MCInst * MI,unsigned OpNo,raw_ostream & O)496*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printBankMask(const MCInst *MI, unsigned OpNo,
497*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
498*9880d681SAndroid Build Coastguard Worker O << " bank_mask:";
499*9880d681SAndroid Build Coastguard Worker printU4ImmOperand(MI, OpNo, O);
500*9880d681SAndroid Build Coastguard Worker }
501*9880d681SAndroid Build Coastguard Worker
printBoundCtrl(const MCInst * MI,unsigned OpNo,raw_ostream & O)502*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printBoundCtrl(const MCInst *MI, unsigned OpNo,
503*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
504*9880d681SAndroid Build Coastguard Worker unsigned Imm = MI->getOperand(OpNo).getImm();
505*9880d681SAndroid Build Coastguard Worker if (Imm) {
506*9880d681SAndroid Build Coastguard Worker O << " bound_ctrl:0"; // XXX - this syntax is used in sp3
507*9880d681SAndroid Build Coastguard Worker }
508*9880d681SAndroid Build Coastguard Worker }
509*9880d681SAndroid Build Coastguard Worker
printSDWASel(const MCInst * MI,unsigned OpNo,raw_ostream & O)510*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printSDWASel(const MCInst *MI, unsigned OpNo,
511*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
512*9880d681SAndroid Build Coastguard Worker unsigned Imm = MI->getOperand(OpNo).getImm();
513*9880d681SAndroid Build Coastguard Worker switch (Imm) {
514*9880d681SAndroid Build Coastguard Worker case 0: O << "BYTE_0"; break;
515*9880d681SAndroid Build Coastguard Worker case 1: O << "BYTE_1"; break;
516*9880d681SAndroid Build Coastguard Worker case 2: O << "BYTE_2"; break;
517*9880d681SAndroid Build Coastguard Worker case 3: O << "BYTE_3"; break;
518*9880d681SAndroid Build Coastguard Worker case 4: O << "WORD_0"; break;
519*9880d681SAndroid Build Coastguard Worker case 5: O << "WORD_1"; break;
520*9880d681SAndroid Build Coastguard Worker case 6: O << "DWORD"; break;
521*9880d681SAndroid Build Coastguard Worker default: llvm_unreachable("Invalid SDWA data select operand");
522*9880d681SAndroid Build Coastguard Worker }
523*9880d681SAndroid Build Coastguard Worker }
524*9880d681SAndroid Build Coastguard Worker
printSDWADstSel(const MCInst * MI,unsigned OpNo,raw_ostream & O)525*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printSDWADstSel(const MCInst *MI, unsigned OpNo,
526*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
527*9880d681SAndroid Build Coastguard Worker O << "dst_sel:";
528*9880d681SAndroid Build Coastguard Worker printSDWASel(MI, OpNo, O);
529*9880d681SAndroid Build Coastguard Worker }
530*9880d681SAndroid Build Coastguard Worker
printSDWASrc0Sel(const MCInst * MI,unsigned OpNo,raw_ostream & O)531*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printSDWASrc0Sel(const MCInst *MI, unsigned OpNo,
532*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
533*9880d681SAndroid Build Coastguard Worker O << "src0_sel:";
534*9880d681SAndroid Build Coastguard Worker printSDWASel(MI, OpNo, O);
535*9880d681SAndroid Build Coastguard Worker }
536*9880d681SAndroid Build Coastguard Worker
printSDWASrc1Sel(const MCInst * MI,unsigned OpNo,raw_ostream & O)537*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printSDWASrc1Sel(const MCInst *MI, unsigned OpNo,
538*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
539*9880d681SAndroid Build Coastguard Worker O << "src1_sel:";
540*9880d681SAndroid Build Coastguard Worker printSDWASel(MI, OpNo, O);
541*9880d681SAndroid Build Coastguard Worker }
542*9880d681SAndroid Build Coastguard Worker
printSDWADstUnused(const MCInst * MI,unsigned OpNo,raw_ostream & O)543*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printSDWADstUnused(const MCInst *MI, unsigned OpNo,
544*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
545*9880d681SAndroid Build Coastguard Worker O << "dst_unused:";
546*9880d681SAndroid Build Coastguard Worker unsigned Imm = MI->getOperand(OpNo).getImm();
547*9880d681SAndroid Build Coastguard Worker switch (Imm) {
548*9880d681SAndroid Build Coastguard Worker case 0: O << "UNUSED_PAD"; break;
549*9880d681SAndroid Build Coastguard Worker case 1: O << "UNUSED_SEXT"; break;
550*9880d681SAndroid Build Coastguard Worker case 2: O << "UNUSED_PRESERVE"; break;
551*9880d681SAndroid Build Coastguard Worker default: llvm_unreachable("Invalid SDWA dest_unused operand");
552*9880d681SAndroid Build Coastguard Worker }
553*9880d681SAndroid Build Coastguard Worker }
554*9880d681SAndroid Build Coastguard Worker
printInterpSlot(const MCInst * MI,unsigned OpNum,raw_ostream & O)555*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printInterpSlot(const MCInst *MI, unsigned OpNum,
556*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
557*9880d681SAndroid Build Coastguard Worker unsigned Imm = MI->getOperand(OpNum).getImm();
558*9880d681SAndroid Build Coastguard Worker
559*9880d681SAndroid Build Coastguard Worker if (Imm == 2) {
560*9880d681SAndroid Build Coastguard Worker O << "P0";
561*9880d681SAndroid Build Coastguard Worker } else if (Imm == 1) {
562*9880d681SAndroid Build Coastguard Worker O << "P20";
563*9880d681SAndroid Build Coastguard Worker } else if (Imm == 0) {
564*9880d681SAndroid Build Coastguard Worker O << "P10";
565*9880d681SAndroid Build Coastguard Worker } else {
566*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Invalid interpolation parameter slot");
567*9880d681SAndroid Build Coastguard Worker }
568*9880d681SAndroid Build Coastguard Worker }
569*9880d681SAndroid Build Coastguard Worker
printMemOperand(const MCInst * MI,unsigned OpNo,raw_ostream & O)570*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printMemOperand(const MCInst *MI, unsigned OpNo,
571*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
572*9880d681SAndroid Build Coastguard Worker printOperand(MI, OpNo, O);
573*9880d681SAndroid Build Coastguard Worker O << ", ";
574*9880d681SAndroid Build Coastguard Worker printOperand(MI, OpNo + 1, O);
575*9880d681SAndroid Build Coastguard Worker }
576*9880d681SAndroid Build Coastguard Worker
printIfSet(const MCInst * MI,unsigned OpNo,raw_ostream & O,StringRef Asm,StringRef Default)577*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printIfSet(const MCInst *MI, unsigned OpNo,
578*9880d681SAndroid Build Coastguard Worker raw_ostream &O, StringRef Asm,
579*9880d681SAndroid Build Coastguard Worker StringRef Default) {
580*9880d681SAndroid Build Coastguard Worker const MCOperand &Op = MI->getOperand(OpNo);
581*9880d681SAndroid Build Coastguard Worker assert(Op.isImm());
582*9880d681SAndroid Build Coastguard Worker if (Op.getImm() == 1) {
583*9880d681SAndroid Build Coastguard Worker O << Asm;
584*9880d681SAndroid Build Coastguard Worker } else {
585*9880d681SAndroid Build Coastguard Worker O << Default;
586*9880d681SAndroid Build Coastguard Worker }
587*9880d681SAndroid Build Coastguard Worker }
588*9880d681SAndroid Build Coastguard Worker
printIfSet(const MCInst * MI,unsigned OpNo,raw_ostream & O,char Asm)589*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printIfSet(const MCInst *MI, unsigned OpNo,
590*9880d681SAndroid Build Coastguard Worker raw_ostream &O, char Asm) {
591*9880d681SAndroid Build Coastguard Worker const MCOperand &Op = MI->getOperand(OpNo);
592*9880d681SAndroid Build Coastguard Worker assert(Op.isImm());
593*9880d681SAndroid Build Coastguard Worker if (Op.getImm() == 1)
594*9880d681SAndroid Build Coastguard Worker O << Asm;
595*9880d681SAndroid Build Coastguard Worker }
596*9880d681SAndroid Build Coastguard Worker
printAbs(const MCInst * MI,unsigned OpNo,raw_ostream & O)597*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printAbs(const MCInst *MI, unsigned OpNo,
598*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
599*9880d681SAndroid Build Coastguard Worker printIfSet(MI, OpNo, O, '|');
600*9880d681SAndroid Build Coastguard Worker }
601*9880d681SAndroid Build Coastguard Worker
printClamp(const MCInst * MI,unsigned OpNo,raw_ostream & O)602*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printClamp(const MCInst *MI, unsigned OpNo,
603*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
604*9880d681SAndroid Build Coastguard Worker printIfSet(MI, OpNo, O, "_SAT");
605*9880d681SAndroid Build Coastguard Worker }
606*9880d681SAndroid Build Coastguard Worker
printClampSI(const MCInst * MI,unsigned OpNo,raw_ostream & O)607*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printClampSI(const MCInst *MI, unsigned OpNo,
608*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
609*9880d681SAndroid Build Coastguard Worker if (MI->getOperand(OpNo).getImm())
610*9880d681SAndroid Build Coastguard Worker O << " clamp";
611*9880d681SAndroid Build Coastguard Worker }
612*9880d681SAndroid Build Coastguard Worker
printOModSI(const MCInst * MI,unsigned OpNo,raw_ostream & O)613*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printOModSI(const MCInst *MI, unsigned OpNo,
614*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
615*9880d681SAndroid Build Coastguard Worker int Imm = MI->getOperand(OpNo).getImm();
616*9880d681SAndroid Build Coastguard Worker if (Imm == SIOutMods::MUL2)
617*9880d681SAndroid Build Coastguard Worker O << " mul:2";
618*9880d681SAndroid Build Coastguard Worker else if (Imm == SIOutMods::MUL4)
619*9880d681SAndroid Build Coastguard Worker O << " mul:4";
620*9880d681SAndroid Build Coastguard Worker else if (Imm == SIOutMods::DIV2)
621*9880d681SAndroid Build Coastguard Worker O << " div:2";
622*9880d681SAndroid Build Coastguard Worker }
623*9880d681SAndroid Build Coastguard Worker
printLiteral(const MCInst * MI,unsigned OpNo,raw_ostream & O)624*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printLiteral(const MCInst *MI, unsigned OpNo,
625*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
626*9880d681SAndroid Build Coastguard Worker const MCOperand &Op = MI->getOperand(OpNo);
627*9880d681SAndroid Build Coastguard Worker assert(Op.isImm() || Op.isExpr());
628*9880d681SAndroid Build Coastguard Worker if (Op.isImm()) {
629*9880d681SAndroid Build Coastguard Worker int64_t Imm = Op.getImm();
630*9880d681SAndroid Build Coastguard Worker O << Imm << '(' << BitsToFloat(Imm) << ')';
631*9880d681SAndroid Build Coastguard Worker }
632*9880d681SAndroid Build Coastguard Worker if (Op.isExpr()) {
633*9880d681SAndroid Build Coastguard Worker Op.getExpr()->print(O << '@', &MAI);
634*9880d681SAndroid Build Coastguard Worker }
635*9880d681SAndroid Build Coastguard Worker }
636*9880d681SAndroid Build Coastguard Worker
printLast(const MCInst * MI,unsigned OpNo,raw_ostream & O)637*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printLast(const MCInst *MI, unsigned OpNo,
638*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
639*9880d681SAndroid Build Coastguard Worker printIfSet(MI, OpNo, O, "*", " ");
640*9880d681SAndroid Build Coastguard Worker }
641*9880d681SAndroid Build Coastguard Worker
printNeg(const MCInst * MI,unsigned OpNo,raw_ostream & O)642*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printNeg(const MCInst *MI, unsigned OpNo,
643*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
644*9880d681SAndroid Build Coastguard Worker printIfSet(MI, OpNo, O, '-');
645*9880d681SAndroid Build Coastguard Worker }
646*9880d681SAndroid Build Coastguard Worker
printOMOD(const MCInst * MI,unsigned OpNo,raw_ostream & O)647*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printOMOD(const MCInst *MI, unsigned OpNo,
648*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
649*9880d681SAndroid Build Coastguard Worker switch (MI->getOperand(OpNo).getImm()) {
650*9880d681SAndroid Build Coastguard Worker default: break;
651*9880d681SAndroid Build Coastguard Worker case 1:
652*9880d681SAndroid Build Coastguard Worker O << " * 2.0";
653*9880d681SAndroid Build Coastguard Worker break;
654*9880d681SAndroid Build Coastguard Worker case 2:
655*9880d681SAndroid Build Coastguard Worker O << " * 4.0";
656*9880d681SAndroid Build Coastguard Worker break;
657*9880d681SAndroid Build Coastguard Worker case 3:
658*9880d681SAndroid Build Coastguard Worker O << " / 2.0";
659*9880d681SAndroid Build Coastguard Worker break;
660*9880d681SAndroid Build Coastguard Worker }
661*9880d681SAndroid Build Coastguard Worker }
662*9880d681SAndroid Build Coastguard Worker
printRel(const MCInst * MI,unsigned OpNo,raw_ostream & O)663*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printRel(const MCInst *MI, unsigned OpNo,
664*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
665*9880d681SAndroid Build Coastguard Worker printIfSet(MI, OpNo, O, '+');
666*9880d681SAndroid Build Coastguard Worker }
667*9880d681SAndroid Build Coastguard Worker
printUpdateExecMask(const MCInst * MI,unsigned OpNo,raw_ostream & O)668*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printUpdateExecMask(const MCInst *MI, unsigned OpNo,
669*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
670*9880d681SAndroid Build Coastguard Worker printIfSet(MI, OpNo, O, "ExecMask,");
671*9880d681SAndroid Build Coastguard Worker }
672*9880d681SAndroid Build Coastguard Worker
printUpdatePred(const MCInst * MI,unsigned OpNo,raw_ostream & O)673*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printUpdatePred(const MCInst *MI, unsigned OpNo,
674*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
675*9880d681SAndroid Build Coastguard Worker printIfSet(MI, OpNo, O, "Pred,");
676*9880d681SAndroid Build Coastguard Worker }
677*9880d681SAndroid Build Coastguard Worker
printWrite(const MCInst * MI,unsigned OpNo,raw_ostream & O)678*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printWrite(const MCInst *MI, unsigned OpNo,
679*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
680*9880d681SAndroid Build Coastguard Worker const MCOperand &Op = MI->getOperand(OpNo);
681*9880d681SAndroid Build Coastguard Worker if (Op.getImm() == 0) {
682*9880d681SAndroid Build Coastguard Worker O << " (MASKED)";
683*9880d681SAndroid Build Coastguard Worker }
684*9880d681SAndroid Build Coastguard Worker }
685*9880d681SAndroid Build Coastguard Worker
printSel(const MCInst * MI,unsigned OpNo,raw_ostream & O)686*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printSel(const MCInst *MI, unsigned OpNo,
687*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
688*9880d681SAndroid Build Coastguard Worker const char * chans = "XYZW";
689*9880d681SAndroid Build Coastguard Worker int sel = MI->getOperand(OpNo).getImm();
690*9880d681SAndroid Build Coastguard Worker
691*9880d681SAndroid Build Coastguard Worker int chan = sel & 3;
692*9880d681SAndroid Build Coastguard Worker sel >>= 2;
693*9880d681SAndroid Build Coastguard Worker
694*9880d681SAndroid Build Coastguard Worker if (sel >= 512) {
695*9880d681SAndroid Build Coastguard Worker sel -= 512;
696*9880d681SAndroid Build Coastguard Worker int cb = sel >> 12;
697*9880d681SAndroid Build Coastguard Worker sel &= 4095;
698*9880d681SAndroid Build Coastguard Worker O << cb << '[' << sel << ']';
699*9880d681SAndroid Build Coastguard Worker } else if (sel >= 448) {
700*9880d681SAndroid Build Coastguard Worker sel -= 448;
701*9880d681SAndroid Build Coastguard Worker O << sel;
702*9880d681SAndroid Build Coastguard Worker } else if (sel >= 0){
703*9880d681SAndroid Build Coastguard Worker O << sel;
704*9880d681SAndroid Build Coastguard Worker }
705*9880d681SAndroid Build Coastguard Worker
706*9880d681SAndroid Build Coastguard Worker if (sel >= 0)
707*9880d681SAndroid Build Coastguard Worker O << '.' << chans[chan];
708*9880d681SAndroid Build Coastguard Worker }
709*9880d681SAndroid Build Coastguard Worker
printBankSwizzle(const MCInst * MI,unsigned OpNo,raw_ostream & O)710*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printBankSwizzle(const MCInst *MI, unsigned OpNo,
711*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
712*9880d681SAndroid Build Coastguard Worker int BankSwizzle = MI->getOperand(OpNo).getImm();
713*9880d681SAndroid Build Coastguard Worker switch (BankSwizzle) {
714*9880d681SAndroid Build Coastguard Worker case 1:
715*9880d681SAndroid Build Coastguard Worker O << "BS:VEC_021/SCL_122";
716*9880d681SAndroid Build Coastguard Worker break;
717*9880d681SAndroid Build Coastguard Worker case 2:
718*9880d681SAndroid Build Coastguard Worker O << "BS:VEC_120/SCL_212";
719*9880d681SAndroid Build Coastguard Worker break;
720*9880d681SAndroid Build Coastguard Worker case 3:
721*9880d681SAndroid Build Coastguard Worker O << "BS:VEC_102/SCL_221";
722*9880d681SAndroid Build Coastguard Worker break;
723*9880d681SAndroid Build Coastguard Worker case 4:
724*9880d681SAndroid Build Coastguard Worker O << "BS:VEC_201";
725*9880d681SAndroid Build Coastguard Worker break;
726*9880d681SAndroid Build Coastguard Worker case 5:
727*9880d681SAndroid Build Coastguard Worker O << "BS:VEC_210";
728*9880d681SAndroid Build Coastguard Worker break;
729*9880d681SAndroid Build Coastguard Worker default:
730*9880d681SAndroid Build Coastguard Worker break;
731*9880d681SAndroid Build Coastguard Worker }
732*9880d681SAndroid Build Coastguard Worker return;
733*9880d681SAndroid Build Coastguard Worker }
734*9880d681SAndroid Build Coastguard Worker
printRSel(const MCInst * MI,unsigned OpNo,raw_ostream & O)735*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printRSel(const MCInst *MI, unsigned OpNo,
736*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
737*9880d681SAndroid Build Coastguard Worker unsigned Sel = MI->getOperand(OpNo).getImm();
738*9880d681SAndroid Build Coastguard Worker switch (Sel) {
739*9880d681SAndroid Build Coastguard Worker case 0:
740*9880d681SAndroid Build Coastguard Worker O << 'X';
741*9880d681SAndroid Build Coastguard Worker break;
742*9880d681SAndroid Build Coastguard Worker case 1:
743*9880d681SAndroid Build Coastguard Worker O << 'Y';
744*9880d681SAndroid Build Coastguard Worker break;
745*9880d681SAndroid Build Coastguard Worker case 2:
746*9880d681SAndroid Build Coastguard Worker O << 'Z';
747*9880d681SAndroid Build Coastguard Worker break;
748*9880d681SAndroid Build Coastguard Worker case 3:
749*9880d681SAndroid Build Coastguard Worker O << 'W';
750*9880d681SAndroid Build Coastguard Worker break;
751*9880d681SAndroid Build Coastguard Worker case 4:
752*9880d681SAndroid Build Coastguard Worker O << '0';
753*9880d681SAndroid Build Coastguard Worker break;
754*9880d681SAndroid Build Coastguard Worker case 5:
755*9880d681SAndroid Build Coastguard Worker O << '1';
756*9880d681SAndroid Build Coastguard Worker break;
757*9880d681SAndroid Build Coastguard Worker case 7:
758*9880d681SAndroid Build Coastguard Worker O << '_';
759*9880d681SAndroid Build Coastguard Worker break;
760*9880d681SAndroid Build Coastguard Worker default:
761*9880d681SAndroid Build Coastguard Worker break;
762*9880d681SAndroid Build Coastguard Worker }
763*9880d681SAndroid Build Coastguard Worker }
764*9880d681SAndroid Build Coastguard Worker
printCT(const MCInst * MI,unsigned OpNo,raw_ostream & O)765*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printCT(const MCInst *MI, unsigned OpNo,
766*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
767*9880d681SAndroid Build Coastguard Worker unsigned CT = MI->getOperand(OpNo).getImm();
768*9880d681SAndroid Build Coastguard Worker switch (CT) {
769*9880d681SAndroid Build Coastguard Worker case 0:
770*9880d681SAndroid Build Coastguard Worker O << 'U';
771*9880d681SAndroid Build Coastguard Worker break;
772*9880d681SAndroid Build Coastguard Worker case 1:
773*9880d681SAndroid Build Coastguard Worker O << 'N';
774*9880d681SAndroid Build Coastguard Worker break;
775*9880d681SAndroid Build Coastguard Worker default:
776*9880d681SAndroid Build Coastguard Worker break;
777*9880d681SAndroid Build Coastguard Worker }
778*9880d681SAndroid Build Coastguard Worker }
779*9880d681SAndroid Build Coastguard Worker
printKCache(const MCInst * MI,unsigned OpNo,raw_ostream & O)780*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printKCache(const MCInst *MI, unsigned OpNo,
781*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
782*9880d681SAndroid Build Coastguard Worker int KCacheMode = MI->getOperand(OpNo).getImm();
783*9880d681SAndroid Build Coastguard Worker if (KCacheMode > 0) {
784*9880d681SAndroid Build Coastguard Worker int KCacheBank = MI->getOperand(OpNo - 2).getImm();
785*9880d681SAndroid Build Coastguard Worker O << "CB" << KCacheBank << ':';
786*9880d681SAndroid Build Coastguard Worker int KCacheAddr = MI->getOperand(OpNo + 2).getImm();
787*9880d681SAndroid Build Coastguard Worker int LineSize = (KCacheMode == 1) ? 16 : 32;
788*9880d681SAndroid Build Coastguard Worker O << KCacheAddr * 16 << '-' << KCacheAddr * 16 + LineSize;
789*9880d681SAndroid Build Coastguard Worker }
790*9880d681SAndroid Build Coastguard Worker }
791*9880d681SAndroid Build Coastguard Worker
printSendMsg(const MCInst * MI,unsigned OpNo,raw_ostream & O)792*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printSendMsg(const MCInst *MI, unsigned OpNo,
793*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
794*9880d681SAndroid Build Coastguard Worker using namespace llvm::AMDGPU::SendMsg;
795*9880d681SAndroid Build Coastguard Worker
796*9880d681SAndroid Build Coastguard Worker const unsigned SImm16 = MI->getOperand(OpNo).getImm();
797*9880d681SAndroid Build Coastguard Worker const unsigned Id = SImm16 & ID_MASK_;
798*9880d681SAndroid Build Coastguard Worker do {
799*9880d681SAndroid Build Coastguard Worker if (Id == ID_INTERRUPT) {
800*9880d681SAndroid Build Coastguard Worker if ((SImm16 & ~ID_MASK_) != 0) // Unused/unknown bits must be 0.
801*9880d681SAndroid Build Coastguard Worker break;
802*9880d681SAndroid Build Coastguard Worker O << "sendmsg(" << IdSymbolic[Id] << ')';
803*9880d681SAndroid Build Coastguard Worker return;
804*9880d681SAndroid Build Coastguard Worker }
805*9880d681SAndroid Build Coastguard Worker if (Id == ID_GS || Id == ID_GS_DONE) {
806*9880d681SAndroid Build Coastguard Worker if ((SImm16 & ~(ID_MASK_|OP_GS_MASK_|STREAM_ID_MASK_)) != 0) // Unused/unknown bits must be 0.
807*9880d681SAndroid Build Coastguard Worker break;
808*9880d681SAndroid Build Coastguard Worker const unsigned OpGs = (SImm16 & OP_GS_MASK_) >> OP_SHIFT_;
809*9880d681SAndroid Build Coastguard Worker const unsigned StreamId = (SImm16 & STREAM_ID_MASK_) >> STREAM_ID_SHIFT_;
810*9880d681SAndroid Build Coastguard Worker if (OpGs == OP_GS_NOP && Id != ID_GS_DONE) // NOP to be used for GS_DONE only.
811*9880d681SAndroid Build Coastguard Worker break;
812*9880d681SAndroid Build Coastguard Worker if (OpGs == OP_GS_NOP && StreamId != 0) // NOP does not use/define stream id bits.
813*9880d681SAndroid Build Coastguard Worker break;
814*9880d681SAndroid Build Coastguard Worker O << "sendmsg(" << IdSymbolic[Id] << ", " << OpGsSymbolic[OpGs];
815*9880d681SAndroid Build Coastguard Worker if (OpGs != OP_GS_NOP) { O << ", " << StreamId; }
816*9880d681SAndroid Build Coastguard Worker O << ')';
817*9880d681SAndroid Build Coastguard Worker return;
818*9880d681SAndroid Build Coastguard Worker }
819*9880d681SAndroid Build Coastguard Worker if (Id == ID_SYSMSG) {
820*9880d681SAndroid Build Coastguard Worker if ((SImm16 & ~(ID_MASK_|OP_SYS_MASK_)) != 0) // Unused/unknown bits must be 0.
821*9880d681SAndroid Build Coastguard Worker break;
822*9880d681SAndroid Build Coastguard Worker const unsigned OpSys = (SImm16 & OP_SYS_MASK_) >> OP_SHIFT_;
823*9880d681SAndroid Build Coastguard Worker if (! (OP_SYS_FIRST_ <= OpSys && OpSys < OP_SYS_LAST_)) // Unused/unknown.
824*9880d681SAndroid Build Coastguard Worker break;
825*9880d681SAndroid Build Coastguard Worker O << "sendmsg(" << IdSymbolic[Id] << ", " << OpSysSymbolic[OpSys] << ')';
826*9880d681SAndroid Build Coastguard Worker return;
827*9880d681SAndroid Build Coastguard Worker }
828*9880d681SAndroid Build Coastguard Worker } while (0);
829*9880d681SAndroid Build Coastguard Worker O << SImm16; // Unknown simm16 code.
830*9880d681SAndroid Build Coastguard Worker }
831*9880d681SAndroid Build Coastguard Worker
printWaitFlag(const MCInst * MI,unsigned OpNo,raw_ostream & O)832*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printWaitFlag(const MCInst *MI, unsigned OpNo,
833*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
834*9880d681SAndroid Build Coastguard Worker unsigned SImm16 = MI->getOperand(OpNo).getImm();
835*9880d681SAndroid Build Coastguard Worker unsigned Vmcnt = SImm16 & 0xF;
836*9880d681SAndroid Build Coastguard Worker unsigned Expcnt = (SImm16 >> 4) & 0x7;
837*9880d681SAndroid Build Coastguard Worker unsigned Lgkmcnt = (SImm16 >> 8) & 0xF;
838*9880d681SAndroid Build Coastguard Worker
839*9880d681SAndroid Build Coastguard Worker bool NeedSpace = false;
840*9880d681SAndroid Build Coastguard Worker
841*9880d681SAndroid Build Coastguard Worker if (Vmcnt != 0xF) {
842*9880d681SAndroid Build Coastguard Worker O << "vmcnt(" << Vmcnt << ')';
843*9880d681SAndroid Build Coastguard Worker NeedSpace = true;
844*9880d681SAndroid Build Coastguard Worker }
845*9880d681SAndroid Build Coastguard Worker
846*9880d681SAndroid Build Coastguard Worker if (Expcnt != 0x7) {
847*9880d681SAndroid Build Coastguard Worker if (NeedSpace)
848*9880d681SAndroid Build Coastguard Worker O << ' ';
849*9880d681SAndroid Build Coastguard Worker O << "expcnt(" << Expcnt << ')';
850*9880d681SAndroid Build Coastguard Worker NeedSpace = true;
851*9880d681SAndroid Build Coastguard Worker }
852*9880d681SAndroid Build Coastguard Worker
853*9880d681SAndroid Build Coastguard Worker if (Lgkmcnt != 0xF) {
854*9880d681SAndroid Build Coastguard Worker if (NeedSpace)
855*9880d681SAndroid Build Coastguard Worker O << ' ';
856*9880d681SAndroid Build Coastguard Worker O << "lgkmcnt(" << Lgkmcnt << ')';
857*9880d681SAndroid Build Coastguard Worker }
858*9880d681SAndroid Build Coastguard Worker }
859*9880d681SAndroid Build Coastguard Worker
printHwreg(const MCInst * MI,unsigned OpNo,raw_ostream & O)860*9880d681SAndroid Build Coastguard Worker void AMDGPUInstPrinter::printHwreg(const MCInst *MI, unsigned OpNo,
861*9880d681SAndroid Build Coastguard Worker raw_ostream &O) {
862*9880d681SAndroid Build Coastguard Worker using namespace llvm::AMDGPU::Hwreg;
863*9880d681SAndroid Build Coastguard Worker
864*9880d681SAndroid Build Coastguard Worker unsigned SImm16 = MI->getOperand(OpNo).getImm();
865*9880d681SAndroid Build Coastguard Worker const unsigned Id = (SImm16 & ID_MASK_) >> ID_SHIFT_;
866*9880d681SAndroid Build Coastguard Worker const unsigned Offset = (SImm16 & OFFSET_MASK_) >> OFFSET_SHIFT_;
867*9880d681SAndroid Build Coastguard Worker const unsigned Width = ((SImm16 & WIDTH_M1_MASK_) >> WIDTH_M1_SHIFT_) + 1;
868*9880d681SAndroid Build Coastguard Worker
869*9880d681SAndroid Build Coastguard Worker O << "hwreg(";
870*9880d681SAndroid Build Coastguard Worker if (ID_SYMBOLIC_FIRST_ <= Id && Id < ID_SYMBOLIC_LAST_) {
871*9880d681SAndroid Build Coastguard Worker O << IdSymbolic[Id];
872*9880d681SAndroid Build Coastguard Worker } else {
873*9880d681SAndroid Build Coastguard Worker O << Id;
874*9880d681SAndroid Build Coastguard Worker }
875*9880d681SAndroid Build Coastguard Worker if (Width != WIDTH_M1_DEFAULT_ + 1 || Offset != OFFSET_DEFAULT_) {
876*9880d681SAndroid Build Coastguard Worker O << ", " << Offset << ", " << Width;
877*9880d681SAndroid Build Coastguard Worker }
878*9880d681SAndroid Build Coastguard Worker O << ')';
879*9880d681SAndroid Build Coastguard Worker }
880*9880d681SAndroid Build Coastguard Worker
881*9880d681SAndroid Build Coastguard Worker #include "AMDGPUGenAsmWriter.inc"
882