1f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//===-- AMDGPUInstPrinter.cpp - AMDGPU MC Inst -> ASM ---------------------===//
2f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//
3f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//                     The LLVM Compiler Infrastructure
4f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//
5f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard// This file is distributed under the University of Illinois Open Source
6f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard// License. See LICENSE.TXT for details.
7f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//
8f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard// \file
9f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard//===----------------------------------------------------------------------===//
10f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
11f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "AMDGPUInstPrinter.h"
12f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "MCTargetDesc/AMDGPUMCTargetDesc.h"
1353f22df199542f6fc4e0edc5b7cecbeacea11adaChristian Konig#include "llvm/MC/MCExpr.h"
145c35290fa35ae234fed02496404cb0fc37e1c8a5Benjamin Kramer#include "llvm/MC/MCInst.h"
15f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
16f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardusing namespace llvm;
17f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
18f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUInstPrinter::printInst(const MCInst *MI, raw_ostream &OS,
19f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                             StringRef Annot) {
2092f24d403f16ab2ee4598e32c926acc9c2344140Vincent Lejeune  OS.flush();
21f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  printInstruction(MI, OS);
22f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
23f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  printAnnotation(OS, Annot);
24f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
25f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
26f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUInstPrinter::printOperand(const MCInst *MI, unsigned OpNo,
27f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                     raw_ostream &O) {
28f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
29f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  const MCOperand &Op = MI->getOperand(OpNo);
30f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  if (Op.isReg()) {
31f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    switch (Op.getReg()) {
32f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    // This is the default predicate state, so we don't need to print it.
33f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    case AMDGPU::PRED_SEL_OFF: break;
34f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    default: O << getRegisterName(Op.getReg()); break;
35f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    }
36f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  } else if (Op.isImm()) {
37f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    O << Op.getImm();
38f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  } else if (Op.isFPImm()) {
39f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    O << Op.getFPImm();
4053f22df199542f6fc4e0edc5b7cecbeacea11adaChristian Konig  } else if (Op.isExpr()) {
4153f22df199542f6fc4e0edc5b7cecbeacea11adaChristian Konig    const MCExpr *Exp = Op.getExpr();
4253f22df199542f6fc4e0edc5b7cecbeacea11adaChristian Konig    Exp->print(O);
43f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  } else {
44f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    assert(!"unknown operand type in printOperand");
45f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
46f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
47f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
4801115b1f5032b848659669b161af1bdd9e646208Michel Danzervoid AMDGPUInstPrinter::printInterpSlot(const MCInst *MI, unsigned OpNum,
4901115b1f5032b848659669b161af1bdd9e646208Michel Danzer                                        raw_ostream &O) {
5001115b1f5032b848659669b161af1bdd9e646208Michel Danzer  unsigned Imm = MI->getOperand(OpNum).getImm();
5101115b1f5032b848659669b161af1bdd9e646208Michel Danzer
5201115b1f5032b848659669b161af1bdd9e646208Michel Danzer  if (Imm == 2) {
5301115b1f5032b848659669b161af1bdd9e646208Michel Danzer    O << "P0";
5401115b1f5032b848659669b161af1bdd9e646208Michel Danzer  } else if (Imm == 1) {
5501115b1f5032b848659669b161af1bdd9e646208Michel Danzer    O << "P20";
5601115b1f5032b848659669b161af1bdd9e646208Michel Danzer  } else if (Imm == 0) {
5701115b1f5032b848659669b161af1bdd9e646208Michel Danzer    O << "P10";
5801115b1f5032b848659669b161af1bdd9e646208Michel Danzer  } else {
5901115b1f5032b848659669b161af1bdd9e646208Michel Danzer    assert(!"Invalid interpolation parameter slot");
6001115b1f5032b848659669b161af1bdd9e646208Michel Danzer  }
6101115b1f5032b848659669b161af1bdd9e646208Michel Danzer}
6201115b1f5032b848659669b161af1bdd9e646208Michel Danzer
63f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUInstPrinter::printMemOperand(const MCInst *MI, unsigned OpNo,
64f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                        raw_ostream &O) {
65f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  printOperand(MI, OpNo, O);
66f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  O  << ", ";
67f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  printOperand(MI, OpNo + 1, O);
68f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
69f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
70f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUInstPrinter::printIfSet(const MCInst *MI, unsigned OpNo,
7192f24d403f16ab2ee4598e32c926acc9c2344140Vincent Lejeune                                   raw_ostream &O, StringRef Asm,
7292f24d403f16ab2ee4598e32c926acc9c2344140Vincent Lejeune                                   StringRef Default) {
73f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  const MCOperand &Op = MI->getOperand(OpNo);
74f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  assert(Op.isImm());
75f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  if (Op.getImm() == 1) {
76f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    O << Asm;
7792f24d403f16ab2ee4598e32c926acc9c2344140Vincent Lejeune  } else {
7892f24d403f16ab2ee4598e32c926acc9c2344140Vincent Lejeune    O << Default;
79f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
80f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
81f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
82f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUInstPrinter::printAbs(const MCInst *MI, unsigned OpNo,
83f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                 raw_ostream &O) {
84f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  printIfSet(MI, OpNo, O, "|");
85f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
86f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
87f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUInstPrinter::printClamp(const MCInst *MI, unsigned OpNo,
88f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                   raw_ostream &O) {
89f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  printIfSet(MI, OpNo, O, "_SAT");
90f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
91f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
92f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUInstPrinter::printLiteral(const MCInst *MI, unsigned OpNo,
93f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                     raw_ostream &O) {
94f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  union Literal {
95f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    float f;
96f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    int32_t i;
97f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  } L;
98f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
99f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  L.i = MI->getOperand(OpNo).getImm();
100f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  O << L.i << "(" << L.f << ")";
101f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
102f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
103f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUInstPrinter::printLast(const MCInst *MI, unsigned OpNo,
104f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                  raw_ostream &O) {
1059a9e936650bb82244f38dbddf6c4e427c2ae49f9Vincent Lejeune  printIfSet(MI, OpNo, O.indent(25 - O.GetNumBytesInBuffer()), "*", " ");
106f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
107f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
108f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUInstPrinter::printNeg(const MCInst *MI, unsigned OpNo,
109f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                 raw_ostream &O) {
110f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  printIfSet(MI, OpNo, O, "-");
111f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
112f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
113f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUInstPrinter::printOMOD(const MCInst *MI, unsigned OpNo,
114f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                  raw_ostream &O) {
115f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  switch (MI->getOperand(OpNo).getImm()) {
116f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  default: break;
117f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  case 1:
118f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    O << " * 2.0";
119f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    break;
120f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  case 2:
121f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    O << " * 4.0";
122f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    break;
123f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  case 3:
124f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    O << " / 2.0";
125f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    break;
126f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
127f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
128f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
129f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUInstPrinter::printRel(const MCInst *MI, unsigned OpNo,
130f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                 raw_ostream &O) {
131c0b0c677a1138f0a5ce1435fc1e70cef38fd95c8Tom Stellard  printIfSet(MI, OpNo, O, "+");
132f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
133f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
134f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUInstPrinter::printUpdateExecMask(const MCInst *MI, unsigned OpNo,
135f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                            raw_ostream &O) {
136f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  printIfSet(MI, OpNo, O, "ExecMask,");
137f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
138f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
139f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUInstPrinter::printUpdatePred(const MCInst *MI, unsigned OpNo,
140f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                        raw_ostream &O) {
141f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  printIfSet(MI, OpNo, O, "Pred,");
142f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
143f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
144f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUInstPrinter::printWrite(const MCInst *MI, unsigned OpNo,
145f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                       raw_ostream &O) {
146f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  const MCOperand &Op = MI->getOperand(OpNo);
147f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  if (Op.getImm() == 0) {
148f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    O << " (MASKED)";
149f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
150f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
151f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
1529f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellardvoid AMDGPUInstPrinter::printSel(const MCInst *MI, unsigned OpNo,
1539f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard                                  raw_ostream &O) {
1549f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard  const char * chans = "XYZW";
1559f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard  int sel = MI->getOperand(OpNo).getImm();
1569f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard
1579f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard  int chan = sel & 3;
1589f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard  sel >>= 2;
1599f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard
1609f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard  if (sel >= 512) {
1619f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard    sel -= 512;
1629f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard    int cb = sel >> 12;
1639f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard    sel &= 4095;
1649f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard    O << cb << "[" << sel << "]";
1659f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard  } else if (sel >= 448) {
1669f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard    sel -= 448;
1679f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard    O << sel;
1689f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard  } else if (sel >= 0){
1699f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard    O << sel;
1709f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard  }
1719f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard
1729f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard  if (sel >= 0)
1739f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard    O << "." << chans[chan];
1749f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard}
1759f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard
17692f24d403f16ab2ee4598e32c926acc9c2344140Vincent Lejeunevoid AMDGPUInstPrinter::printBankSwizzle(const MCInst *MI, unsigned OpNo,
17792f24d403f16ab2ee4598e32c926acc9c2344140Vincent Lejeune                                         raw_ostream &O) {
17892f24d403f16ab2ee4598e32c926acc9c2344140Vincent Lejeune  int BankSwizzle = MI->getOperand(OpNo).getImm();
17992f24d403f16ab2ee4598e32c926acc9c2344140Vincent Lejeune  switch (BankSwizzle) {
18092f24d403f16ab2ee4598e32c926acc9c2344140Vincent Lejeune  case 1:
1817d1a0d4e3ebf058a8b1d0dea9b6119444ed041c8Vincent Lejeune    O << "BS:VEC_021/SCL_122";
18292f24d403f16ab2ee4598e32c926acc9c2344140Vincent Lejeune    break;
18392f24d403f16ab2ee4598e32c926acc9c2344140Vincent Lejeune  case 2:
1847d1a0d4e3ebf058a8b1d0dea9b6119444ed041c8Vincent Lejeune    O << "BS:VEC_120/SCL_212";
18592f24d403f16ab2ee4598e32c926acc9c2344140Vincent Lejeune    break;
18692f24d403f16ab2ee4598e32c926acc9c2344140Vincent Lejeune  case 3:
1877d1a0d4e3ebf058a8b1d0dea9b6119444ed041c8Vincent Lejeune    O << "BS:VEC_102/SCL_221";
18892f24d403f16ab2ee4598e32c926acc9c2344140Vincent Lejeune    break;
18992f24d403f16ab2ee4598e32c926acc9c2344140Vincent Lejeune  case 4:
19092f24d403f16ab2ee4598e32c926acc9c2344140Vincent Lejeune    O << "BS:VEC_201";
19192f24d403f16ab2ee4598e32c926acc9c2344140Vincent Lejeune    break;
19292f24d403f16ab2ee4598e32c926acc9c2344140Vincent Lejeune  case 5:
19392f24d403f16ab2ee4598e32c926acc9c2344140Vincent Lejeune    O << "BS:VEC_210";
19492f24d403f16ab2ee4598e32c926acc9c2344140Vincent Lejeune    break;
19592f24d403f16ab2ee4598e32c926acc9c2344140Vincent Lejeune  default:
19692f24d403f16ab2ee4598e32c926acc9c2344140Vincent Lejeune    break;
19792f24d403f16ab2ee4598e32c926acc9c2344140Vincent Lejeune  }
19892f24d403f16ab2ee4598e32c926acc9c2344140Vincent Lejeune  return;
19992f24d403f16ab2ee4598e32c926acc9c2344140Vincent Lejeune}
20092f24d403f16ab2ee4598e32c926acc9c2344140Vincent Lejeune
201d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeunevoid AMDGPUInstPrinter::printRSel(const MCInst *MI, unsigned OpNo,
202d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune                                  raw_ostream &O) {
203d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune  unsigned Sel = MI->getOperand(OpNo).getImm();
204d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune  switch (Sel) {
205d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune  case 0:
206d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune    O << "X";
207d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune    break;
208d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune  case 1:
209d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune    O << "Y";
210d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune    break;
211d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune  case 2:
212d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune    O << "Z";
213d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune    break;
214d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune  case 3:
215d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune    O << "W";
216d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune    break;
217d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune  case 4:
218d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune    O << "0";
219d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune    break;
220d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune  case 5:
221d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune    O << "1";
222d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune    break;
223d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune  case 7:
224d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune    O << "_";
225d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune    break;
226d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune  default:
227d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune    break;
228d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune  }
229d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune}
230d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune
231d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeunevoid AMDGPUInstPrinter::printCT(const MCInst *MI, unsigned OpNo,
232d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune                                  raw_ostream &O) {
233d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune  unsigned CT = MI->getOperand(OpNo).getImm();
234d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune  switch (CT) {
235d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune  case 0:
236d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune    O << "U";
237d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune    break;
238d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune  case 1:
239d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune    O << "N";
240d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune    break;
241d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune  default:
242d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune    break;
243d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune  }
244d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune}
245d3293b49f9c7af741d2edd3062499fb50db0e89bVincent Lejeune
2469e1808733eeea4f248eeef35ba06ee3f7aa5707dVincent Lejeunevoid AMDGPUInstPrinter::printKCache(const MCInst *MI, unsigned OpNo,
2479e1808733eeea4f248eeef35ba06ee3f7aa5707dVincent Lejeune                                    raw_ostream &O) {
2489e1808733eeea4f248eeef35ba06ee3f7aa5707dVincent Lejeune  int KCacheMode = MI->getOperand(OpNo).getImm();
2499e1808733eeea4f248eeef35ba06ee3f7aa5707dVincent Lejeune  if (KCacheMode > 0) {
2509e1808733eeea4f248eeef35ba06ee3f7aa5707dVincent Lejeune    int KCacheBank = MI->getOperand(OpNo - 2).getImm();
2519e1808733eeea4f248eeef35ba06ee3f7aa5707dVincent Lejeune    O << "CB" << KCacheBank <<":";
2529e1808733eeea4f248eeef35ba06ee3f7aa5707dVincent Lejeune    int KCacheAddr = MI->getOperand(OpNo + 2).getImm();
2539e1808733eeea4f248eeef35ba06ee3f7aa5707dVincent Lejeune    int LineSize = (KCacheMode == 1)?16:32;
2549e1808733eeea4f248eeef35ba06ee3f7aa5707dVincent Lejeune    O << KCacheAddr * 16 << "-" << KCacheAddr * 16 + LineSize;
2559e1808733eeea4f248eeef35ba06ee3f7aa5707dVincent Lejeune  }
2569e1808733eeea4f248eeef35ba06ee3f7aa5707dVincent Lejeune}
2579e1808733eeea4f248eeef35ba06ee3f7aa5707dVincent Lejeune
258f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "AMDGPUGenAsmWriter.inc"
259