AMDGPUInstPrinter.cpp revision 9f7818d9bdfce2e9c7a2cbe31490a135aa6d1211
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"
13f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "llvm/MC/MCInst.h"
14f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
15f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardusing namespace llvm;
16f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
17f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUInstPrinter::printInst(const MCInst *MI, raw_ostream &OS,
18f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                             StringRef Annot) {
19f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  printInstruction(MI, OS);
20f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
21f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  printAnnotation(OS, Annot);
22f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
23f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
24f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUInstPrinter::printOperand(const MCInst *MI, unsigned OpNo,
25f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                     raw_ostream &O) {
26f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
27f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  const MCOperand &Op = MI->getOperand(OpNo);
28f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  if (Op.isReg()) {
29f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    switch (Op.getReg()) {
30f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    // This is the default predicate state, so we don't need to print it.
31f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    case AMDGPU::PRED_SEL_OFF: break;
32f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    default: O << getRegisterName(Op.getReg()); break;
33f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    }
34f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  } else if (Op.isImm()) {
35f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    O << Op.getImm();
36f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  } else if (Op.isFPImm()) {
37f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    O << Op.getFPImm();
38f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  } else {
39f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    assert(!"unknown operand type in printOperand");
40f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
41f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
42f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
43f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUInstPrinter::printMemOperand(const MCInst *MI, unsigned OpNo,
44f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                        raw_ostream &O) {
45f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  printOperand(MI, OpNo, O);
46f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  O  << ", ";
47f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  printOperand(MI, OpNo + 1, O);
48f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
49f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
50f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUInstPrinter::printIfSet(const MCInst *MI, unsigned OpNo,
51f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                    raw_ostream &O, StringRef Asm) {
52f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  const MCOperand &Op = MI->getOperand(OpNo);
53f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  assert(Op.isImm());
54f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  if (Op.getImm() == 1) {
55f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    O << Asm;
56f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
57f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
58f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
59f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUInstPrinter::printAbs(const MCInst *MI, unsigned OpNo,
60f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                 raw_ostream &O) {
61f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  printIfSet(MI, OpNo, O, "|");
62f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
63f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
64f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUInstPrinter::printClamp(const MCInst *MI, unsigned OpNo,
65f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                   raw_ostream &O) {
66f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  printIfSet(MI, OpNo, O, "_SAT");
67f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
68f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
69f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUInstPrinter::printLiteral(const MCInst *MI, unsigned OpNo,
70f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                     raw_ostream &O) {
71f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  union Literal {
72f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    float f;
73f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    int32_t i;
74f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  } L;
75f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
76f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  L.i = MI->getOperand(OpNo).getImm();
77f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  O << L.i << "(" << L.f << ")";
78f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
79f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
80f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUInstPrinter::printLast(const MCInst *MI, unsigned OpNo,
81f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                  raw_ostream &O) {
82f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  printIfSet(MI, OpNo, O, " *");
83f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
84f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
85f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUInstPrinter::printNeg(const MCInst *MI, unsigned OpNo,
86f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                 raw_ostream &O) {
87f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  printIfSet(MI, OpNo, O, "-");
88f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
89f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
90f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUInstPrinter::printOMOD(const MCInst *MI, unsigned OpNo,
91f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                  raw_ostream &O) {
92f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  switch (MI->getOperand(OpNo).getImm()) {
93f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  default: break;
94f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  case 1:
95f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    O << " * 2.0";
96f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    break;
97f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  case 2:
98f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    O << " * 4.0";
99f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    break;
100f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  case 3:
101f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    O << " / 2.0";
102f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    break;
103f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
104f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
105f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
106f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUInstPrinter::printRel(const MCInst *MI, unsigned OpNo,
107f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                 raw_ostream &O) {
108f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  const MCOperand &Op = MI->getOperand(OpNo);
109f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  if (Op.getImm() != 0) {
110f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    O << " + " << Op.getImm();
111f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
112f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
113f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
114f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUInstPrinter::printUpdateExecMask(const MCInst *MI, unsigned OpNo,
115f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                            raw_ostream &O) {
116f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  printIfSet(MI, OpNo, O, "ExecMask,");
117f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
118f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
119f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUInstPrinter::printUpdatePred(const MCInst *MI, unsigned OpNo,
120f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                        raw_ostream &O) {
121f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  printIfSet(MI, OpNo, O, "Pred,");
122f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
123f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
124f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellardvoid AMDGPUInstPrinter::printWrite(const MCInst *MI, unsigned OpNo,
125f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard                                       raw_ostream &O) {
126f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  const MCOperand &Op = MI->getOperand(OpNo);
127f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  if (Op.getImm() == 0) {
128f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard    O << " (MASKED)";
129f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard  }
130f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard}
131f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard
1329f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellardvoid AMDGPUInstPrinter::printSel(const MCInst *MI, unsigned OpNo,
1339f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard                                  raw_ostream &O) {
1349f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard  const char * chans = "XYZW";
1359f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard  int sel = MI->getOperand(OpNo).getImm();
1369f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard
1379f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard  int chan = sel & 3;
1389f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard  sel >>= 2;
1399f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard
1409f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard  if (sel >= 512) {
1419f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard    sel -= 512;
1429f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard    int cb = sel >> 12;
1439f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard    sel &= 4095;
1449f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard    O << cb << "[" << sel << "]";
1459f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard  } else if (sel >= 448) {
1469f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard    sel -= 448;
1479f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard    O << sel;
1489f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard  } else if (sel >= 0){
1499f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard    O << sel;
1509f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard  }
1519f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard
1529f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard  if (sel >= 0)
1539f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard    O << "." << chans[chan];
1549f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard}
1559f7818d9bdfce2e9c7a2cbe31490a135aa6d1211Tom Stellard
156f98f2ce29e6e2996fa58f38979143eceaa818335Tom Stellard#include "AMDGPUGenAsmWriter.inc"
157