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