Add lower argument and return of device function
[oota-llvm.git] / lib / Target / PTX / AsmPrinter / PTXAsmPrinter.cpp
1 //===-- PTXAsmPrinter.cpp - PTX LLVM assembly writer ----------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file contains a printer that converts from our internal representation
11 // of machine-dependent LLVM code to PTX assembly language.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "PTX.h"
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"
23
24 using namespace llvm;
25
26 namespace {
27   class PTXAsmPrinter : public AsmPrinter {
28     public:
29       explicit PTXAsmPrinter(TargetMachine &TM, MCStreamer &Streamer) :
30         AsmPrinter(TM, Streamer) {}
31       const char *getPassName() const { return "PTX Assembly Printer"; }
32
33       virtual void EmitInstruction(const MachineInstr *MI);
34
35       void printOperand(const MachineInstr *MI, int opNum, raw_ostream &OS);
36
37       // autogen'd.
38       void printInstruction(const MachineInstr *MI, raw_ostream &OS);
39       static const char *getRegisterName(unsigned RegNo);
40   };
41 } // namespace
42
43 void PTXAsmPrinter::EmitInstruction(const MachineInstr *MI) {
44   SmallString<128> str;
45   raw_svector_ostream OS(str);
46   printInstruction(MI, OS);
47   OS << ';';
48   OutStreamer.EmitRawText(OS.str());
49 }
50
51 void PTXAsmPrinter::printOperand(const MachineInstr *MI, int opNum,
52                                  raw_ostream &OS) {
53   const MachineOperand &MO = MI->getOperand(opNum);
54
55   switch (MO.getType()) {
56     default:
57       llvm_unreachable("<unknown operand type>");
58       break;
59     case MachineOperand::MO_Register:
60       OS << getRegisterName(MO.getReg());
61       break;
62     case MachineOperand::MO_Immediate:
63       OS << (int) MO.getImm();
64       break;
65   }
66 }
67
68 #include "PTXGenAsmWriter.inc"
69
70 // Force static initialization.
71 extern "C" void LLVMInitializePTXAsmPrinter() {
72   RegisterAsmPrinter<PTXAsmPrinter> X(ThePTXTarget);
73 }