1 //===-- PTXAsmPrinter.cpp - PTX LLVM assembly writer ----------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file contains a printer that converts from our internal representation
11 // of machine-dependent LLVM code to PTX assembly language.
13 //===----------------------------------------------------------------------===//
16 #include "PTXTargetMachine.h"
17 #include "llvm/Support/raw_ostream.h"
18 #include "llvm/ADT/SmallString.h"
19 #include "llvm/CodeGen/AsmPrinter.h"
20 #include "llvm/CodeGen/MachineInstr.h"
21 #include "llvm/MC/MCStreamer.h"
22 #include "llvm/Target/TargetRegistry.h"
27 class PTXAsmPrinter : public AsmPrinter {
29 explicit PTXAsmPrinter(TargetMachine &TM, MCStreamer &Streamer) :
30 AsmPrinter(TM, Streamer) {}
31 const char *getPassName() const { return "PTX Assembly Printer"; }
33 virtual void EmitInstruction(const MachineInstr *MI);
35 void printOperand(const MachineInstr *MI, int opNum, raw_ostream &OS);
38 void printInstruction(const MachineInstr *MI, raw_ostream &OS);
39 static const char *getRegisterName(unsigned RegNo);
43 void PTXAsmPrinter::EmitInstruction(const MachineInstr *MI) {
45 raw_svector_ostream OS(str);
46 printInstruction(MI, OS);
48 OutStreamer.EmitRawText(OS.str());
51 void PTXAsmPrinter::printOperand(const MachineInstr *MI, int opNum,
53 const MachineOperand &MO = MI->getOperand(opNum);
55 switch (MO.getType()) {
57 llvm_unreachable("<unknown operand type>");
59 case MachineOperand::MO_Register:
60 OS << getRegisterName(MO.getReg());
62 case MachineOperand::MO_Immediate:
63 OS << (int) MO.getImm();
68 #include "PTXGenAsmWriter.inc"
70 // Force static initialization.
71 extern "C" void LLVMInitializePTXAsmPrinter() {
72 RegisterAsmPrinter<PTXAsmPrinter> X(ThePTXTarget);