blob: 23bffb9bc01459f8a491b48c5e3d009ef507e4da [file] [log] [blame]
Craig Topperf3f66502012-03-17 09:39:20 +00001//===-- HexagonMCTargetDesc.cpp - Hexagon Target Descriptions -------------===//
Tony Linthicumb3705e02011-12-15 22:29:08 +00002//
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//
Craig Topperbc3168b2012-03-17 09:28:37 +000010// This file provides Hexagon specific target descriptions.
Tony Linthicumb3705e02011-12-15 22:29:08 +000011//
12//===----------------------------------------------------------------------===//
13
Eugene Zelenko401f3812016-12-17 01:29:35 +000014#include "Hexagon.h"
Eugene Zelenko58655bb2016-12-17 01:09:05 +000015#include "HexagonTargetStreamer.h"
Colin LeMahieuff062612014-11-20 21:56:35 +000016#include "MCTargetDesc/HexagonInstPrinter.h"
Eugene Zelenko58655bb2016-12-17 01:09:05 +000017#include "MCTargetDesc/HexagonMCAsmInfo.h"
18#include "MCTargetDesc/HexagonMCELFStreamer.h"
Eugene Zelenko50156892016-12-17 01:17:18 +000019#include "MCTargetDesc/HexagonMCInstrInfo.h"
Eugene Zelenko58655bb2016-12-17 01:09:05 +000020#include "MCTargetDesc/HexagonMCTargetDesc.h"
21#include "llvm/ADT/StringRef.h"
Colin LeMahieube99a022015-06-17 03:06:16 +000022#include "llvm/MC/MCContext.h"
Eugene Zelenko58655bb2016-12-17 01:09:05 +000023#include "llvm/MC/MCDwarf.h"
Colin LeMahieu2c769202014-11-06 17:05:51 +000024#include "llvm/MC/MCELFStreamer.h"
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +000025#include "llvm/MC/MCInstrAnalysis.h"
Tony Linthicumb3705e02011-12-15 22:29:08 +000026#include "llvm/MC/MCInstrInfo.h"
27#include "llvm/MC/MCRegisterInfo.h"
Jyotsna Verma7503a622013-02-20 16:13:27 +000028#include "llvm/MC/MCStreamer.h"
Tony Linthicumb3705e02011-12-15 22:29:08 +000029#include "llvm/MC/MCSubtargetInfo.h"
Colin LeMahieube99a022015-06-17 03:06:16 +000030#include "llvm/Support/ELF.h"
Craig Topperc4965bc2012-02-05 07:21:30 +000031#include "llvm/Support/ErrorHandling.h"
Eugene Zelenko58655bb2016-12-17 01:09:05 +000032#include "llvm/Support/raw_ostream.h"
Tony Linthicumb3705e02011-12-15 22:29:08 +000033#include "llvm/Support/TargetRegistry.h"
Eugene Zelenko58655bb2016-12-17 01:09:05 +000034#include <cassert>
35#include <cstdint>
36#include <new>
37#include <string>
Tony Linthicumb3705e02011-12-15 22:29:08 +000038
Chandler Carruthd174b722014-04-22 02:03:14 +000039using namespace llvm;
40
Tony Linthicumb3705e02011-12-15 22:29:08 +000041#define GET_INSTRINFO_MC_DESC
42#include "HexagonGenInstrInfo.inc"
43
44#define GET_SUBTARGETINFO_MC_DESC
45#include "HexagonGenSubtargetInfo.inc"
46
47#define GET_REGINFO_MC_DESC
48#include "HexagonGenRegisterInfo.inc"
49
Colin LeMahieu7cd08922015-11-09 04:07:48 +000050cl::opt<bool> llvm::HexagonDisableCompound
51 ("mno-compound",
52 cl::desc("Disable looking for compound instructions for Hexagon"));
53
54cl::opt<bool> llvm::HexagonDisableDuplex
55 ("mno-pairing",
56 cl::desc("Disable looking for duplex instructions for Hexagon"));
57
Krzysztof Parzyszek64d4e2b2016-04-20 21:17:40 +000058static cl::opt<bool> HexagonV4ArchVariant("mv4", cl::Hidden, cl::init(false),
59 cl::desc("Build for Hexagon V4"));
60
61static cl::opt<bool> HexagonV5ArchVariant("mv5", cl::Hidden, cl::init(false),
62 cl::desc("Build for Hexagon V5"));
63
64static cl::opt<bool> HexagonV55ArchVariant("mv55", cl::Hidden, cl::init(false),
65 cl::desc("Build for Hexagon V55"));
66
67static cl::opt<bool> HexagonV60ArchVariant("mv60", cl::Hidden, cl::init(false),
68 cl::desc("Build for Hexagon V60"));
69
Krzysztof Parzyszekf9015e62017-02-10 23:46:45 +000070static cl::opt<bool> HexagonV62ArchVariant("mv62", cl::Hidden, cl::init(false),
71 cl::desc("Build for Hexagon V62"));
72
Krzysztof Parzyszek64d4e2b2016-04-20 21:17:40 +000073static StringRef DefaultArch = "hexagonv60";
74
75static StringRef HexagonGetArchVariant() {
76 if (HexagonV4ArchVariant)
77 return "hexagonv4";
78 if (HexagonV5ArchVariant)
79 return "hexagonv5";
80 if (HexagonV55ArchVariant)
81 return "hexagonv55";
82 if (HexagonV60ArchVariant)
83 return "hexagonv60";
Krzysztof Parzyszekf9015e62017-02-10 23:46:45 +000084 if (HexagonV62ArchVariant)
85 return "hexagonv62";
Krzysztof Parzyszek64d4e2b2016-04-20 21:17:40 +000086 return "";
87}
88
Krzysztof Parzyszek75e74ee2016-08-19 14:09:47 +000089StringRef Hexagon_MC::selectHexagonCPU(const Triple &TT, StringRef CPU) {
Krzysztof Parzyszek64d4e2b2016-04-20 21:17:40 +000090 StringRef ArchV = HexagonGetArchVariant();
91 if (!ArchV.empty() && !CPU.empty()) {
92 if (ArchV != CPU)
93 report_fatal_error("conflicting architectures specified.");
94 return CPU;
95 }
96 if (ArchV.empty()) {
97 if (CPU.empty())
98 CPU = DefaultArch;
99 return CPU;
100 }
101 return ArchV;
Krzysztof Parzyszek759a7d02015-12-14 15:03:54 +0000102}
103
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000104unsigned HexagonGetLastSlot() {
105 return HexagonItinerariesV4FU::SLOT3;
Tony Linthicumb3705e02011-12-15 22:29:08 +0000106}
107
Tony Linthicumb3705e02011-12-15 22:29:08 +0000108
Colin LeMahieube99a022015-06-17 03:06:16 +0000109namespace {
Eugene Zelenko58655bb2016-12-17 01:09:05 +0000110
Colin LeMahieud2158752015-06-18 20:43:50 +0000111class HexagonTargetAsmStreamer : public HexagonTargetStreamer {
Colin LeMahieud2158752015-06-18 20:43:50 +0000112public:
113 HexagonTargetAsmStreamer(MCStreamer &S,
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000114 formatted_raw_ostream &OS,
115 bool isVerboseAsm,
116 MCInstPrinter &IP)
Colin LeMahieufa389722015-06-18 21:03:13 +0000117 : HexagonTargetStreamer(S) {}
Eugene Zelenko58655bb2016-12-17 01:09:05 +0000118
Colin LeMahieud2158752015-06-18 20:43:50 +0000119 void prettyPrintAsm(MCInstPrinter &InstPrinter, raw_ostream &OS,
120 const MCInst &Inst, const MCSubtargetInfo &STI) override {
121 assert(HexagonMCInstrInfo::isBundle(Inst));
122 assert(HexagonMCInstrInfo::bundleSize(Inst) <= HEXAGON_PACKET_SIZE);
123 std::string Buffer;
124 {
125 raw_string_ostream TempStream(Buffer);
126 InstPrinter.printInst(&Inst, TempStream, "", STI);
127 }
128 StringRef Contents(Buffer);
129 auto PacketBundle = Contents.rsplit('\n');
130 auto HeadTail = PacketBundle.first.split('\n');
Colin LeMahieub7a5f9f2015-11-10 00:22:00 +0000131 StringRef Separator = "\n";
132 StringRef Indent = "\t\t";
133 OS << "\t{\n";
134 while (!HeadTail.first.empty()) {
135 StringRef InstTxt;
Colin LeMahieud2158752015-06-18 20:43:50 +0000136 auto Duplex = HeadTail.first.split('\v');
Colin LeMahieub7a5f9f2015-11-10 00:22:00 +0000137 if (!Duplex.second.empty()) {
138 OS << Indent << Duplex.first << Separator;
139 InstTxt = Duplex.second;
140 } else if (!HeadTail.first.trim().startswith("immext")) {
141 InstTxt = Duplex.first;
Colin LeMahieud2158752015-06-18 20:43:50 +0000142 }
Colin LeMahieub7a5f9f2015-11-10 00:22:00 +0000143 if (!InstTxt.empty())
144 OS << Indent << InstTxt << Separator;
Colin LeMahieud2158752015-06-18 20:43:50 +0000145 HeadTail = HeadTail.second.split('\n');
Colin LeMahieud2158752015-06-18 20:43:50 +0000146 }
Colin LeMahieub7a5f9f2015-11-10 00:22:00 +0000147 OS << "\t}" << PacketBundle.second;
Colin LeMahieud2158752015-06-18 20:43:50 +0000148 }
149};
Colin LeMahieud2158752015-06-18 20:43:50 +0000150
Colin LeMahieube99a022015-06-17 03:06:16 +0000151class HexagonTargetELFStreamer : public HexagonTargetStreamer {
152public:
Eugene Zelenko58655bb2016-12-17 01:09:05 +0000153 MCELFStreamer &getStreamer() {
154 return static_cast<MCELFStreamer &>(Streamer);
155 }
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000156 HexagonTargetELFStreamer(MCStreamer &S, MCSubtargetInfo const &STI)
157 : HexagonTargetStreamer(S) {
158 MCAssembler &MCA = getStreamer().getAssembler();
159 MCA.setELFHeaderEFlags(Hexagon_MC::GetELFFlags(STI));
160 }
161
Eugene Zelenko58655bb2016-12-17 01:09:05 +0000162
Colin LeMahieube99a022015-06-17 03:06:16 +0000163 void EmitCommonSymbolSorted(MCSymbol *Symbol, uint64_t Size,
164 unsigned ByteAlignment,
165 unsigned AccessSize) override {
166 HexagonMCELFStreamer &HexagonELFStreamer =
167 static_cast<HexagonMCELFStreamer &>(getStreamer());
168 HexagonELFStreamer.HexagonMCEmitCommonSymbol(Symbol, Size, ByteAlignment,
169 AccessSize);
170 }
Eugene Zelenko58655bb2016-12-17 01:09:05 +0000171
Colin LeMahieube99a022015-06-17 03:06:16 +0000172 void EmitLocalCommonSymbolSorted(MCSymbol *Symbol, uint64_t Size,
173 unsigned ByteAlignment,
174 unsigned AccessSize) override {
175 HexagonMCELFStreamer &HexagonELFStreamer =
176 static_cast<HexagonMCELFStreamer &>(getStreamer());
177 HexagonELFStreamer.HexagonMCEmitLocalCommonSymbol(
178 Symbol, Size, ByteAlignment, AccessSize);
179 }
180};
Eugene Zelenko58655bb2016-12-17 01:09:05 +0000181
182} // end anonymous namespace
Colin LeMahieube99a022015-06-17 03:06:16 +0000183
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000184llvm::MCInstrInfo *llvm::createHexagonMCInstrInfo() {
185 MCInstrInfo *X = new MCInstrInfo();
186 InitHexagonMCInstrInfo(X);
187 return X;
188}
189
190static MCRegisterInfo *createHexagonMCRegisterInfo(const Triple &TT) {
191 MCRegisterInfo *X = new MCRegisterInfo();
192 InitHexagonMCRegisterInfo(X, Hexagon::R31);
193 return X;
194}
195
Rafael Espindola227144c2013-05-13 01:16:13 +0000196static MCAsmInfo *createHexagonMCAsmInfo(const MCRegisterInfo &MRI,
Daniel Sanders50f17232015-09-15 16:17:27 +0000197 const Triple &TT) {
Rafael Espindola140a8372013-05-10 18:16:59 +0000198 MCAsmInfo *MAI = new HexagonMCAsmInfo(TT);
Tony Linthicumb3705e02011-12-15 22:29:08 +0000199
200 // VirtualFP = (R30 + #0).
Sid Manning7da3f9a2014-10-03 13:18:11 +0000201 MCCFIInstruction Inst =
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000202 MCCFIInstruction::createDefCfa(nullptr,
203 MRI.getDwarfRegNum(Hexagon::R30, true), 0);
Rafael Espindola227144c2013-05-13 01:16:13 +0000204 MAI->addInitialFrameState(Inst);
Tony Linthicumb3705e02011-12-15 22:29:08 +0000205
206 return MAI;
207}
208
Daniel Sanders50f17232015-09-15 16:17:27 +0000209static MCInstPrinter *createHexagonMCInstPrinter(const Triple &T,
Eric Christopherf8019402015-03-31 00:10:04 +0000210 unsigned SyntaxVariant,
Sid Manning12cd21a2014-10-15 18:27:40 +0000211 const MCAsmInfo &MAI,
212 const MCInstrInfo &MII,
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000213 const MCRegisterInfo &MRI)
214{
Eric Christopherfbe80f52015-04-09 19:20:37 +0000215 if (SyntaxVariant == 0)
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000216 return new HexagonInstPrinter(MAI, MII, MRI);
Eric Christopherfbe80f52015-04-09 19:20:37 +0000217 else
Colin LeMahieube99a022015-06-17 03:06:16 +0000218 return nullptr;
219}
220
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000221static MCTargetStreamer *
222createMCAsmTargetStreamer(MCStreamer &S, formatted_raw_ostream &OS,
223 MCInstPrinter *IP, bool IsVerboseAsm) {
224 return new HexagonTargetAsmStreamer(S, OS, IsVerboseAsm, *IP);
Colin LeMahieud2158752015-06-18 20:43:50 +0000225}
226
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000227static MCStreamer *createMCStreamer(Triple const &T,
228 MCContext &Context,
229 MCAsmBackend &MAB,
230 raw_pwrite_stream &OS,
231 MCCodeEmitter *Emitter,
232 bool RelaxAll) {
233 return createHexagonELFStreamer(T, Context, MAB, OS, Emitter);
Colin LeMahieube99a022015-06-17 03:06:16 +0000234}
235
236static MCTargetStreamer *
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000237createHexagonObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) {
Colin LeMahieube99a022015-06-17 03:06:16 +0000238 return new HexagonTargetELFStreamer(S, STI);
Sid Manning12cd21a2014-10-15 18:27:40 +0000239}
Tony Linthicumb3705e02011-12-15 22:29:08 +0000240
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000241static void LLVM_ATTRIBUTE_UNUSED clearFeature(MCSubtargetInfo* STI, uint64_t F) {
242 uint64_t FB = STI->getFeatureBits().to_ullong();
243 if (FB & (1ULL << F))
244 STI->ToggleFeature(F);
245}
246
247static bool LLVM_ATTRIBUTE_UNUSED checkFeature(MCSubtargetInfo* STI, uint64_t F) {
248 uint64_t FB = STI->getFeatureBits().to_ullong();
249 return (FB & (1ULL << F)) != 0;
250}
251
252StringRef Hexagon_MC::ParseHexagonTriple(const Triple &TT, StringRef CPU) {
253 StringRef CPUName = Hexagon_MC::selectHexagonCPU(TT, CPU);
254 StringRef FS = "";
Krzysztof Parzyszekf9015e62017-02-10 23:46:45 +0000255 if (CPUName.equals_lower("hexagonv60") || CPUName.equals_lower("hexagonv62"))
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000256 FS = "+hvx";
257 return FS;
258}
259
260static bool isCPUValid(std::string CPU)
261{
262 std::vector<std::string> table
263 {
264 "hexagonv4",
265 "hexagonv5",
266 "hexagonv55",
267 "hexagonv60",
Krzysztof Parzyszekf9015e62017-02-10 23:46:45 +0000268 "hexagonv62",
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000269 };
270
271 return std::find(table.begin(), table.end(), CPU) != table.end();
272}
273
274MCSubtargetInfo *Hexagon_MC::createHexagonMCSubtargetInfo(const Triple &TT,
275 StringRef CPU,
276 StringRef FS) {
277 StringRef ArchFS = (FS.size()) ? FS : Hexagon_MC::ParseHexagonTriple(TT, CPU);
278 StringRef CPUName = Hexagon_MC::selectHexagonCPU(TT, CPU);
Krzysztof Parzyszekf9015e62017-02-10 23:46:45 +0000279 if (!isCPUValid(CPUName.str())) {
280 errs() << "error: invalid CPU \"" << CPUName.str().c_str()
281 << "\" specified\n";
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000282 return nullptr;
283 }
284
285 MCSubtargetInfo *X = createHexagonMCSubtargetInfoImpl(TT, CPUName, ArchFS);
286 if (X->getFeatureBits()[Hexagon::ExtensionHVXDbl]) {
287 llvm::FeatureBitset Features = X->getFeatureBits();
288 X->setFeatureBits(Features.set(Hexagon::ExtensionHVX));
289 }
290 return X;
291}
292
293unsigned Hexagon_MC::GetELFFlags(const MCSubtargetInfo &STI) {
294 static std::map<StringRef,unsigned> ElfFlags = {
295 {"hexagonv4", ELF::EF_HEXAGON_MACH_V4},
296 {"hexagonv5", ELF::EF_HEXAGON_MACH_V5},
297 {"hexagonv55", ELF::EF_HEXAGON_MACH_V55},
298 {"hexagonv60", ELF::EF_HEXAGON_MACH_V60},
Krzysztof Parzyszekf9015e62017-02-10 23:46:45 +0000299 {"hexagonv62", ELF::EF_HEXAGON_MACH_V62},
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000300 };
301
302 auto F = ElfFlags.find(STI.getCPU());
303 assert(F != ElfFlags.end() && "Unrecognized Architecture");
304 return F->second;
305}
306
307namespace {
308class HexagonMCInstrAnalysis : public MCInstrAnalysis {
309public:
310 HexagonMCInstrAnalysis(MCInstrInfo const *Info) : MCInstrAnalysis(Info) {}
311
312 bool isUnconditionalBranch(MCInst const &Inst) const override {
313 //assert(!HexagonMCInstrInfo::isBundle(Inst));
314 return MCInstrAnalysis::isUnconditionalBranch(Inst);
315 }
316
317 bool isConditionalBranch(MCInst const &Inst) const override {
318 //assert(!HexagonMCInstrInfo::isBundle(Inst));
319 return MCInstrAnalysis::isConditionalBranch(Inst);
320 }
321
322 bool evaluateBranch(MCInst const &Inst, uint64_t Addr,
323 uint64_t Size, uint64_t &Target) const override {
324 //assert(!HexagonMCInstrInfo::isBundle(Inst));
325 if(!HexagonMCInstrInfo::isExtendable(*Info, Inst))
326 return false;
327 auto const &Extended(HexagonMCInstrInfo::getExtendableOperand(*Info, Inst));
328 assert(Extended.isExpr());
329 int64_t Value;
330 if(!Extended.getExpr()->evaluateAsAbsolute(Value))
331 return false;
332 Target = Value;
333 return true;
334 }
335};
336}
337
338static MCInstrAnalysis *createHexagonMCInstrAnalysis(const MCInstrInfo *Info) {
339 return new HexagonMCInstrAnalysis(Info);
340}
341
Tony Linthicumb3705e02011-12-15 22:29:08 +0000342// Force static initialization.
343extern "C" void LLVMInitializeHexagonTargetMC() {
344 // Register the MC asm info.
Mehdi Aminif42454b2016-10-09 23:00:34 +0000345 RegisterMCAsmInfoFn X(getTheHexagonTarget(), createHexagonMCAsmInfo);
Tony Linthicumb3705e02011-12-15 22:29:08 +0000346
Tony Linthicumb3705e02011-12-15 22:29:08 +0000347 // Register the MC instruction info.
Mehdi Aminif42454b2016-10-09 23:00:34 +0000348 TargetRegistry::RegisterMCInstrInfo(getTheHexagonTarget(),
Sid Manning7da3f9a2014-10-03 13:18:11 +0000349 createHexagonMCInstrInfo);
Tony Linthicumb3705e02011-12-15 22:29:08 +0000350
351 // Register the MC register info.
Mehdi Aminif42454b2016-10-09 23:00:34 +0000352 TargetRegistry::RegisterMCRegInfo(getTheHexagonTarget(),
Tony Linthicumb3705e02011-12-15 22:29:08 +0000353 createHexagonMCRegisterInfo);
354
355 // Register the MC subtarget info.
Mehdi Aminif42454b2016-10-09 23:00:34 +0000356 TargetRegistry::RegisterMCSubtargetInfo(getTheHexagonTarget(),
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000357 Hexagon_MC::createHexagonMCSubtargetInfo);
Sid Manning7da3f9a2014-10-03 13:18:11 +0000358
359 // Register the MC Code Emitter
Mehdi Aminif42454b2016-10-09 23:00:34 +0000360 TargetRegistry::RegisterMCCodeEmitter(getTheHexagonTarget(),
Sid Manning7da3f9a2014-10-03 13:18:11 +0000361 createHexagonMCCodeEmitter);
Sid Manning12cd21a2014-10-15 18:27:40 +0000362
Colin LeMahieua6750772015-06-03 17:34:16 +0000363 // Register the asm backend
Mehdi Aminif42454b2016-10-09 23:00:34 +0000364 TargetRegistry::RegisterMCAsmBackend(getTheHexagonTarget(),
Colin LeMahieua6750772015-06-03 17:34:16 +0000365 createHexagonAsmBackend);
366
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000367
368 // Register the MC instruction analyzer.
369 TargetRegistry::RegisterMCInstrAnalysis(getTheHexagonTarget(),
370 createHexagonMCInstrAnalysis);
371
Colin LeMahieube99a022015-06-17 03:06:16 +0000372 // Register the obj streamer
Krzysztof Parzyszek8cdfe8e2017-02-06 19:35:46 +0000373 TargetRegistry::RegisterELFStreamer(getTheHexagonTarget(),
374 createMCStreamer);
375
376 // Register the obj target streamer
377 TargetRegistry::RegisterObjectTargetStreamer(getTheHexagonTarget(),
378 createHexagonObjectTargetStreamer);
Colin LeMahieube99a022015-06-17 03:06:16 +0000379
Colin LeMahieud2158752015-06-18 20:43:50 +0000380 // Register the asm streamer
Mehdi Aminif42454b2016-10-09 23:00:34 +0000381 TargetRegistry::RegisterAsmTargetStreamer(getTheHexagonTarget(),
Colin LeMahieud2158752015-06-18 20:43:50 +0000382 createMCAsmTargetStreamer);
383
Sid Manning12cd21a2014-10-15 18:27:40 +0000384 // Register the MC Inst Printer
Mehdi Aminif42454b2016-10-09 23:00:34 +0000385 TargetRegistry::RegisterMCInstPrinter(getTheHexagonTarget(),
Sid Manning12cd21a2014-10-15 18:27:40 +0000386 createHexagonMCInstPrinter);
Tony Linthicumb3705e02011-12-15 22:29:08 +0000387}