blob: 9762e938964ea4dfa063b7b442a11ef20cca4b38 [file] [log] [blame]
Dan Gohmanf17a25c2007-07-18 16:29:46 +00001//===-- X86IntelAsmPrinter.h - Convert X86 LLVM code to Intel assembly ----===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner081ce942007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Dan Gohmanf17a25c2007-07-18 16:29:46 +00007//
8//===----------------------------------------------------------------------===//
9//
10// Intel assembly code printer class.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef X86INTELASMPRINTER_H
15#define X86INTELASMPRINTER_H
16
Cédric Venet96125062008-08-17 18:24:26 +000017#include "../X86.h"
18#include "../X86MachineFunctionInfo.h"
19#include "../X86TargetMachine.h"
Anton Korobeynikov2e7832f2008-06-28 11:07:54 +000020#include "llvm/CodeGen/AsmPrinter.h"
21#include "llvm/ADT/StringSet.h"
22#include "llvm/Support/Compiler.h"
Owen Anderson847b99b2008-08-21 00:14:44 +000023#include "llvm/Support/raw_ostream.h"
Dan Gohmanf17a25c2007-07-18 16:29:46 +000024
25namespace llvm {
26
Anton Korobeynikov2e7832f2008-06-28 11:07:54 +000027struct VISIBILITY_HIDDEN X86IntelAsmPrinter : public AsmPrinter {
Owen Anderson847b99b2008-08-21 00:14:44 +000028 X86IntelAsmPrinter(raw_ostream &O, X86TargetMachine &TM,
Dan Gohmanf17a25c2007-07-18 16:29:46 +000029 const TargetAsmInfo *T)
Anton Korobeynikov2e7832f2008-06-28 11:07:54 +000030 : AsmPrinter(O, TM, T) {
Dan Gohmanf17a25c2007-07-18 16:29:46 +000031 }
32
33 virtual const char *getPassName() const {
34 return "X86 Intel-Style Assembly Printer";
35 }
36
37 /// printInstruction - This method is automatically generated by tablegen
38 /// from the instruction set description. This method returns true if the
39 /// machine instruction was sufficiently described to print it, otherwise it
40 /// returns false.
41 bool printInstruction(const MachineInstr *MI);
42
43 // This method is used by the tablegen'erated instruction printer.
44 void printOperand(const MachineInstr *MI, unsigned OpNo,
45 const char *Modifier = 0) {
46 const MachineOperand &MO = MI->getOperand(OpNo);
Dan Gohmanb9f4fa72008-10-03 15:45:36 +000047 if (MO.isReg()) {
Dan Gohman1e57df32008-02-10 18:45:23 +000048 assert(TargetRegisterInfo::isPhysicalRegister(MO.getReg()) &&
49 "Not physreg??");
Evan Cheng00d04a72008-07-07 22:21:06 +000050 O << TM.getRegisterInfo()->get(MO.getReg()).Name; // Capitalized names
Dan Gohmanf17a25c2007-07-18 16:29:46 +000051 } else {
52 printOp(MO, Modifier);
53 }
54 }
55
56 void printi8mem(const MachineInstr *MI, unsigned OpNo) {
57 O << "BYTE PTR ";
58 printMemReference(MI, OpNo);
59 }
60 void printi16mem(const MachineInstr *MI, unsigned OpNo) {
61 O << "WORD PTR ";
62 printMemReference(MI, OpNo);
63 }
64 void printi32mem(const MachineInstr *MI, unsigned OpNo) {
65 O << "DWORD PTR ";
66 printMemReference(MI, OpNo);
67 }
68 void printi64mem(const MachineInstr *MI, unsigned OpNo) {
69 O << "QWORD PTR ";
70 printMemReference(MI, OpNo);
71 }
72 void printi128mem(const MachineInstr *MI, unsigned OpNo) {
73 O << "XMMWORD PTR ";
74 printMemReference(MI, OpNo);
75 }
76 void printf32mem(const MachineInstr *MI, unsigned OpNo) {
77 O << "DWORD PTR ";
78 printMemReference(MI, OpNo);
79 }
80 void printf64mem(const MachineInstr *MI, unsigned OpNo) {
81 O << "QWORD PTR ";
82 printMemReference(MI, OpNo);
83 }
Dale Johannesen4ab00bd2007-08-05 18:49:15 +000084 void printf80mem(const MachineInstr *MI, unsigned OpNo) {
85 O << "XWORD PTR ";
86 printMemReference(MI, OpNo);
87 }
Dan Gohmanf17a25c2007-07-18 16:29:46 +000088 void printf128mem(const MachineInstr *MI, unsigned OpNo) {
89 O << "XMMWORD PTR ";
90 printMemReference(MI, OpNo);
91 }
92 void printlea64_32mem(const MachineInstr *MI, unsigned OpNo) {
93 O << "QWORD PTR ";
94 printMemReference(MI, OpNo, "subreg64");
95 }
96
97 bool printAsmMRegister(const MachineOperand &MO, const char Mode);
98 bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
99 unsigned AsmVariant, const char *ExtraCode);
100 bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNo,
101 unsigned AsmVariant, const char *ExtraCode);
102 void printMachineInstruction(const MachineInstr *MI);
103 void printOp(const MachineOperand &MO, const char *Modifier = 0);
104 void printSSECC(const MachineInstr *MI, unsigned Op);
105 void printMemReference(const MachineInstr *MI, unsigned Op,
106 const char *Modifier=NULL);
Evan Cheng6fb06762007-11-09 01:32:10 +0000107 void printPICJumpTableSetLabel(unsigned uid,
108 const MachineBasicBlock *MBB) const;
109 void printPICJumpTableSetLabel(unsigned uid, unsigned uid2,
110 const MachineBasicBlock *MBB) const {
111 AsmPrinter::printPICJumpTableSetLabel(uid, uid2, MBB);
112 }
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000113 void printPICLabel(const MachineInstr *MI, unsigned Op);
114 bool runOnMachineFunction(MachineFunction &F);
115 bool doInitialization(Module &M);
116 bool doFinalization(Module &M);
Anton Korobeynikov2e7832f2008-06-28 11:07:54 +0000117
118 // We have to propagate some information about MachineFunction to
119 // AsmPrinter. It's ok, when we're printing the function, since we have
120 // access to MachineFunction and can get the appropriate MachineFunctionInfo.
121 // Unfortunately, this is not possible when we're printing reference to
122 // Function (e.g. calling it and so on). Even more, there is no way to get the
123 // corresponding MachineFunctions: it can even be not created at all. That's
124 // why we should use additional structure, when we're collecting all necessary
125 // information.
126 //
127 // This structure is using e.g. for name decoration for stdcall & fastcall'ed
128 // function, since we have to use arguments' size for decoration.
129 typedef std::map<const Function*, X86MachineFunctionInfo> FMFInfoMap;
130 FMFInfoMap FunctionInfoMap;
131
132 void decorateName(std::string& Name, const GlobalValue* GV);
133
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000134 virtual void EmitString(const ConstantArray *CVA) const;
Anton Korobeynikov2e7832f2008-06-28 11:07:54 +0000135
136 // Necessary for dllexport support
137 StringSet<> DLLExportedFns, DLLExportedGVs;
Dan Gohmanf17a25c2007-07-18 16:29:46 +0000138};
139
140} // end namespace llvm
141
142#endif