1263320SdimPull in r198028 from upstream llvm trunk (by Venkatraman Govindaraju):
2263320Sdim
3263320Sdim  [Sparc] Add MCInstPrinter implementation for SPARC.
4263320Sdim
5263320SdimIntroduced here: http://svn.freebsd.org/changeset/base/262261
6263320Sdim
7263320SdimIndex: lib/Target/Sparc/InstPrinter/LLVMBuild.txt
8263320Sdim===================================================================
9263320Sdim--- lib/Target/Sparc/InstPrinter/LLVMBuild.txt
10263320Sdim+++ lib/Target/Sparc/InstPrinter/LLVMBuild.txt
11263320Sdim@@ -0,0 +1,23 @@
12263320Sdim+;===- ./lib/Target/Sparc/InstPrinter/LLVMBuild.txt -------------*- Conf -*--===;
13263320Sdim+;
14263320Sdim+;                     The LLVM Compiler Infrastructure
15263320Sdim+;
16263320Sdim+; This file is distributed under the University of Illinois Open Source
17263320Sdim+; License. See LICENSE.TXT for details.
18263320Sdim+;
19263320Sdim+;===------------------------------------------------------------------------===;
20263320Sdim+;
21263320Sdim+; This is an LLVMBuild description file for the components in this subdirectory.
22263320Sdim+;
23263320Sdim+; For more information on the LLVMBuild system, please see:
24263320Sdim+;
25263320Sdim+;   http://llvm.org/docs/LLVMBuild.html
26263320Sdim+;
27263320Sdim+;===------------------------------------------------------------------------===;
28263320Sdim+
29263320Sdim+[component_0]
30263320Sdim+type = Library
31263320Sdim+name = SparcAsmPrinter
32263320Sdim+parent = Sparc
33263320Sdim+required_libraries = MC Support
34263320Sdim+add_to_library_groups = Sparc
35263320SdimIndex: lib/Target/Sparc/InstPrinter/SparcInstPrinter.cpp
36263320Sdim===================================================================
37263320Sdim--- lib/Target/Sparc/InstPrinter/SparcInstPrinter.cpp
38263320Sdim+++ lib/Target/Sparc/InstPrinter/SparcInstPrinter.cpp
39263320Sdim@@ -0,0 +1,95 @@
40263320Sdim+//===-- SparcInstPrinter.cpp - Convert Sparc MCInst to assembly syntax -----==//
41263320Sdim+//
42263320Sdim+//                     The LLVM Compiler Infrastructure
43263320Sdim+//
44263320Sdim+// This file is distributed under the University of Illinois Open Source
45263320Sdim+// License. See LICENSE.TXT for details.
46263320Sdim+//
47263320Sdim+//===----------------------------------------------------------------------===//
48263320Sdim+//
49263320Sdim+// This class prints an Sparc MCInst to a .s file.
50263320Sdim+//
51263320Sdim+//===----------------------------------------------------------------------===//
52263320Sdim+
53263320Sdim+#define DEBUG_TYPE "asm-printer"
54263320Sdim+#include "SparcInstPrinter.h"
55263320Sdim+
56263320Sdim+#include "Sparc.h"
57263320Sdim+#include "MCTargetDesc/SparcBaseInfo.h"
58263320Sdim+#include "llvm/MC/MCExpr.h"
59263320Sdim+#include "llvm/MC/MCInst.h"
60263320Sdim+#include "llvm/MC/MCSymbol.h"
61263320Sdim+#include "llvm/Support/raw_ostream.h"
62263320Sdim+using namespace llvm;
63263320Sdim+
64263320Sdim+#define GET_INSTRUCTION_NAME
65263320Sdim+// Uncomment the following line once we are ready to use MCAsmWriter.
66263320Sdim+//#include "SparcGenAsmWriter.inc"
67263320Sdim+
68263320Sdim+void SparcInstPrinter::printRegName(raw_ostream &OS, unsigned RegNo) const
69263320Sdim+{
70263320Sdim+  OS << '%' << StringRef(getRegisterName(RegNo)).lower();
71263320Sdim+}
72263320Sdim+
73263320Sdim+void SparcInstPrinter::printInst(const MCInst *MI, raw_ostream &O,
74263320Sdim+                               StringRef Annot)
75263320Sdim+{
76263320Sdim+  printInstruction(MI, O);
77263320Sdim+  printAnnotation(O, Annot);
78263320Sdim+}
79263320Sdim+
80263320Sdim+void SparcInstPrinter::printOperand(const MCInst *MI, int opNum,
81263320Sdim+                                    raw_ostream &O)
82263320Sdim+{
83263320Sdim+  const MCOperand &MO = MI->getOperand (opNum);
84263320Sdim+
85263320Sdim+  if (MO.isReg()) {
86263320Sdim+    printRegName(O, MO.getReg());
87263320Sdim+    return ;
88263320Sdim+  }
89263320Sdim+
90263320Sdim+  if (MO.isImm()) {
91263320Sdim+    O << (int)MO.getImm();
92263320Sdim+    return;
93263320Sdim+  }
94263320Sdim+
95263320Sdim+  assert(MO.isExpr() && "Unknown operand kind in printOperand");
96263320Sdim+  MO.getExpr()->print(O);
97263320Sdim+}
98263320Sdim+
99263320Sdim+void SparcInstPrinter::printMemOperand(const MCInst *MI, int opNum,
100263320Sdim+                                      raw_ostream &O, const char *Modifier)
101263320Sdim+{
102263320Sdim+  printOperand(MI, opNum, O);
103263320Sdim+
104263320Sdim+  // If this is an ADD operand, emit it like normal operands.
105263320Sdim+  if (Modifier && !strcmp(Modifier, "arith")) {
106263320Sdim+    O << ", ";
107263320Sdim+    printOperand(MI, opNum+1, O);
108263320Sdim+    return;
109263320Sdim+  }
110263320Sdim+  const MCOperand &MO = MI->getOperand(opNum+1);
111263320Sdim+
112263320Sdim+  if (MO.isReg() && MO.getReg() == SP::G0)
113263320Sdim+    return;   // don't print "+%g0"
114263320Sdim+  if (MO.isImm() && MO.getImm() == 0)
115263320Sdim+    return;   // don't print "+0"
116263320Sdim+
117263320Sdim+  O << "+";
118263320Sdim+
119263320Sdim+  printOperand(MI, opNum+1, O);
120263320Sdim+}
121263320Sdim+
122263320Sdim+void SparcInstPrinter::printCCOperand(const MCInst *MI, int opNum,
123263320Sdim+                                     raw_ostream &O)
124263320Sdim+{
125263320Sdim+  int CC = (int)MI->getOperand(opNum).getImm();
126263320Sdim+  O << SPARCCondCodeToString((SPCC::CondCodes)CC);
127263320Sdim+}
128263320Sdim+
129263320Sdim+bool SparcInstPrinter::printGetPCX(const MCInst *MI, unsigned opNum,
130263320Sdim+                                  raw_ostream &O)
131263320Sdim+{
132263320Sdim+  assert(0 && "FIXME: Implement SparcInstPrinter::printGetPCX.");
133263320Sdim+  return true;
134263320Sdim+}
135263320SdimIndex: lib/Target/Sparc/InstPrinter/CMakeLists.txt
136263320Sdim===================================================================
137263320Sdim--- lib/Target/Sparc/InstPrinter/CMakeLists.txt
138263320Sdim+++ lib/Target/Sparc/InstPrinter/CMakeLists.txt
139263320Sdim@@ -0,0 +1,3 @@
140263320Sdim+add_llvm_library(LLVMSparcAsmPrinter
141263320Sdim+  SparcInstPrinter.cpp
142263320Sdim+  )
143263320SdimIndex: lib/Target/Sparc/InstPrinter/Makefile
144263320Sdim===================================================================
145263320Sdim--- lib/Target/Sparc/InstPrinter/Makefile
146263320Sdim+++ lib/Target/Sparc/InstPrinter/Makefile
147263320Sdim@@ -0,0 +1,16 @@
148263320Sdim+##===- lib/Target/Sparc/InstPrinter/Makefile ---------------*- Makefile -*-===##
149263320Sdim+#
150263320Sdim+#                     The LLVM Compiler Infrastructure
151263320Sdim+#
152263320Sdim+# This file is distributed under the University of Illinois Open Source
153263320Sdim+# License. See LICENSE.TXT for details.
154263320Sdim+#
155263320Sdim+##===----------------------------------------------------------------------===##
156263320Sdim+
157263320Sdim+LEVEL = ../../../..
158263320Sdim+LIBRARYNAME = LLVMSparcAsmPrinter
159263320Sdim+
160263320Sdim+# Hack: we need to include 'main'  target directory to grab private headers
161263320Sdim+CPP.Flags += -I$(PROJ_OBJ_DIR)/.. -I$(PROJ_SRC_DIR)/..
162263320Sdim+
163263320Sdim+include $(LEVEL)/Makefile.common
164263320SdimIndex: lib/Target/Sparc/InstPrinter/SparcInstPrinter.h
165263320Sdim===================================================================
166263320Sdim--- lib/Target/Sparc/InstPrinter/SparcInstPrinter.h
167263320Sdim+++ lib/Target/Sparc/InstPrinter/SparcInstPrinter.h
168263320Sdim@@ -0,0 +1,46 @@
169263320Sdim+//===-- SparcInstPrinter.h - Convert Sparc MCInst to assembly syntax ------===//
170263320Sdim+//
171263320Sdim+//                     The LLVM Compiler Infrastructure
172263320Sdim+//
173263320Sdim+// This file is distributed under the University of Illinois Open Source
174263320Sdim+// License. See LICENSE.TXT for details.
175263320Sdim+//
176263320Sdim+//===----------------------------------------------------------------------===//
177263320Sdim+//
178263320Sdim+// This class prints an Sparc MCInst to a .s file.
179263320Sdim+//
180263320Sdim+//===----------------------------------------------------------------------===//
181263320Sdim+
182263320Sdim+#ifndef SparcINSTPRINTER_H
183263320Sdim+#define SparcINSTPRINTER_H
184263320Sdim+
185263320Sdim+#include "llvm/MC/MCInstPrinter.h"
186263320Sdim+
187263320Sdim+namespace llvm {
188263320Sdim+
189263320Sdim+class MCOperand;
190263320Sdim+
191263320Sdim+class SparcInstPrinter : public MCInstPrinter {
192263320Sdim+public:
193263320Sdim+ SparcInstPrinter(const MCAsmInfo &MAI,
194263320Sdim+                  const MCInstrInfo &MII,
195263320Sdim+                  const MCRegisterInfo &MRI)
196263320Sdim+   : MCInstPrinter(MAI, MII, MRI) {}
197263320Sdim+
198263320Sdim+  virtual void printRegName(raw_ostream &OS, unsigned RegNo) const;
199263320Sdim+  virtual void printInst(const MCInst *MI, raw_ostream &O, StringRef Annot);
200263320Sdim+
201263320Sdim+  // Autogenerated by tblgen.
202263320Sdim+  void printInstruction(const MCInst *MI, raw_ostream &O);
203263320Sdim+  static const char *getRegisterName(unsigned RegNo);
204263320Sdim+
205263320Sdim+  void printOperand(const MCInst *MI, int opNum, raw_ostream &OS);
206263320Sdim+  void printMemOperand(const MCInst *MI, int opNum, raw_ostream &OS,
207263320Sdim+                       const char *Modifier = 0);
208263320Sdim+  void printCCOperand(const MCInst *MI, int opNum, raw_ostream &OS);
209263320Sdim+  bool printGetPCX(const MCInst *MI, unsigned OpNo, raw_ostream &OS);
210263320Sdim+
211263320Sdim+};
212263320Sdim+} // end namespace llvm
213263320Sdim+
214263320Sdim+#endif
215263320SdimIndex: lib/Target/Sparc/LLVMBuild.txt
216263320Sdim===================================================================
217263320Sdim--- lib/Target/Sparc/LLVMBuild.txt
218263320Sdim+++ lib/Target/Sparc/LLVMBuild.txt
219263320Sdim@@ -16,7 +16,7 @@
220263320Sdim ;===------------------------------------------------------------------------===;
221263320Sdim 
222263320Sdim [common]
223263320Sdim-subdirectories = MCTargetDesc TargetInfo
224263320Sdim+subdirectories = InstPrinter MCTargetDesc TargetInfo
225263320Sdim 
226263320Sdim [component_0]
227263320Sdim type = TargetGroup
228263320Sdim@@ -29,6 +29,6 @@ has_jit = 1
229263320Sdim type = Library
230263320Sdim name = SparcCodeGen
231263320Sdim parent = Sparc
232263320Sdim-required_libraries = AsmPrinter CodeGen Core MC SelectionDAG SparcDesc
233263320Sdim-                     SparcInfo Support Target
234263320Sdim+required_libraries = AsmPrinter CodeGen Core MC SelectionDAG SparcAsmPrinter
235263320Sdim+                     SparcDesc SparcInfo Support Target
236263320Sdim add_to_library_groups = Sparc
237263320SdimIndex: lib/Target/Sparc/CMakeLists.txt
238263320Sdim===================================================================
239263320Sdim--- lib/Target/Sparc/CMakeLists.txt
240263320Sdim+++ lib/Target/Sparc/CMakeLists.txt
241263320Sdim@@ -29,3 +29,4 @@ add_dependencies(LLVMSparcCodeGen SparcCommonTable
242263320Sdim 
243263320Sdim add_subdirectory(TargetInfo)
244263320Sdim add_subdirectory(MCTargetDesc)
245263320Sdim+add_subdirectory(InstPrinter)
246263320SdimIndex: lib/Target/Sparc/Makefile
247263320Sdim===================================================================
248263320Sdim--- lib/Target/Sparc/Makefile
249263320Sdim+++ lib/Target/Sparc/Makefile
250263320Sdim@@ -17,7 +17,7 @@ BUILT_SOURCES = SparcGenRegisterInfo.inc SparcGenI
251263320Sdim 		SparcGenSubtargetInfo.inc SparcGenCallingConv.inc \
252263320Sdim 		SparcGenCodeEmitter.inc
253263320Sdim 
254263320Sdim-DIRS = TargetInfo MCTargetDesc
255263320Sdim+DIRS = InstPrinter TargetInfo MCTargetDesc
256263320Sdim 
257263320Sdim include $(LEVEL)/Makefile.common
258263320Sdim 
259