131d157ae1ac2cd9c787dc3c1d28e64c682803844Jia Liu//===-- PPCMCTargetDesc.cpp - PowerPC Target Descriptions -----------------===//
2c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng//
3c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng//                     The LLVM Compiler Infrastructure
4c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng//
5c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// This file is distributed under the University of Illinois Open Source
6c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// License. See LICENSE.TXT for details.
7c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng//
8c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng//===----------------------------------------------------------------------===//
9c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng//
10c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng// This file provides PowerPC specific target descriptions.
11c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng//
12c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng//===----------------------------------------------------------------------===//
13c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng
14c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#include "PPCMCTargetDesc.h"
154b64e8a9e13ba782da2034e1dee52f077bdb759cEvan Cheng#include "InstPrinter/PPCInstPrinter.h"
16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "PPCMCAsmInfo.h"
177801136b95d1fbe515b9655b73ada39b05a33559Evan Cheng#include "llvm/MC/MCCodeGenInfo.h"
18c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#include "llvm/MC/MCInstrInfo.h"
19c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#include "llvm/MC/MCRegisterInfo.h"
20966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng#include "llvm/MC/MCStreamer.h"
21c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#include "llvm/MC/MCSubtargetInfo.h"
22d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/MC/MachineLocation.h"
23655b8de7b2ab773a977e0c524307e71354d8af29Craig Topper#include "llvm/Support/ErrorHandling.h"
243e74d6fdd248e20a280f1dff3da9a6c689c2c4c3Evan Cheng#include "llvm/Support/TargetRegistry.h"
25c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng
26c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#define GET_INSTRINFO_MC_DESC
27c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#include "PPCGenInstrInfo.inc"
28c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng
29c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#define GET_SUBTARGETINFO_MC_DESC
30c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#include "PPCGenSubtargetInfo.inc"
31c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng
32c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#define GET_REGINFO_MC_DESC
33c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng#include "PPCGenRegisterInfo.inc"
34c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng
35c60f9b752381baa6c4b80c0739034660f1748c84Evan Chengusing namespace llvm;
36c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng
371abf2cb59b8d63415780a03329307c0997b2670cEvan Chengstatic MCInstrInfo *createPPCMCInstrInfo() {
38c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng  MCInstrInfo *X = new MCInstrInfo();
39c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng  InitPPCMCInstrInfo(X);
40c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng  return X;
41c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng}
42c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng
430e6a052331f674dd70e28af41f654a7874405eabEvan Chengstatic MCRegisterInfo *createPPCMCRegisterInfo(StringRef TT) {
440e6a052331f674dd70e28af41f654a7874405eabEvan Cheng  Triple TheTriple(TT);
45f38cc38fa647d4e72c053c39bbe0cdec1342535fBill Schmidt  bool isPPC64 = (TheTriple.getArch() == Triple::ppc64 ||
46f38cc38fa647d4e72c053c39bbe0cdec1342535fBill Schmidt                  TheTriple.getArch() == Triple::ppc64le);
470e6a052331f674dd70e28af41f654a7874405eabEvan Cheng  unsigned Flavour = isPPC64 ? 0 : 1;
480e6a052331f674dd70e28af41f654a7874405eabEvan Cheng  unsigned RA = isPPC64 ? PPC::LR8 : PPC::LR;
490e6a052331f674dd70e28af41f654a7874405eabEvan Cheng
500e6a052331f674dd70e28af41f654a7874405eabEvan Cheng  MCRegisterInfo *X = new MCRegisterInfo();
510e6a052331f674dd70e28af41f654a7874405eabEvan Cheng  InitPPCMCRegisterInfo(X, RA, Flavour, Flavour);
520e6a052331f674dd70e28af41f654a7874405eabEvan Cheng  return X;
530e6a052331f674dd70e28af41f654a7874405eabEvan Cheng}
540e6a052331f674dd70e28af41f654a7874405eabEvan Cheng
551abf2cb59b8d63415780a03329307c0997b2670cEvan Chengstatic MCSubtargetInfo *createPPCMCSubtargetInfo(StringRef TT, StringRef CPU,
561abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng                                                 StringRef FS) {
57c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng  MCSubtargetInfo *X = new MCSubtargetInfo();
58c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng  InitPPCMCSubtargetInfo(X, TT, CPU, FS);
59c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng  return X;
60c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng}
61c60f9b752381baa6c4b80c0739034660f1748c84Evan Cheng
624a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindolastatic MCAsmInfo *createPPCMCAsmInfo(const MCRegisterInfo &MRI, StringRef TT) {
631abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng  Triple TheTriple(TT);
64f38cc38fa647d4e72c053c39bbe0cdec1342535fBill Schmidt  bool isPPC64 = (TheTriple.getArch() == Triple::ppc64 ||
65f38cc38fa647d4e72c053c39bbe0cdec1342535fBill Schmidt                  TheTriple.getArch() == Triple::ppc64le);
662d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng
672d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng  MCAsmInfo *MAI;
681abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng  if (TheTriple.isOSDarwin())
692d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng    MAI = new PPCMCAsmInfoDarwin(isPPC64);
702d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng  else
712d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng    MAI = new PPCLinuxMCAsmInfo(isPPC64);
722d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng
732d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng  // Initial state of the frame pointer is R1.
744a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola  unsigned Reg = isPPC64 ? PPC::X1 : PPC::R1;
754a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola  MCCFIInstruction Inst =
764a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola      MCCFIInstruction::createDefCfa(0, MRI.getDwarfRegNum(Reg, true), 0);
774a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola  MAI->addInitialFrameState(Inst);
782d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng
792d28617de2b0b731c08d1af9e830f31e14ac75b4Evan Cheng  return MAI;
801abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng}
811abf2cb59b8d63415780a03329307c0997b2670cEvan Cheng
827f8dff65717b1e4090ba4a648f9ec4f037a66c1eEvan Chengstatic MCCodeGenInfo *createPPCMCCodeGenInfo(StringRef TT, Reloc::Model RM,
83b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                                             CodeModel::Model CM,
84b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng                                             CodeGenOpt::Level OL) {
85439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  MCCodeGenInfo *X = new MCCodeGenInfo();
86439661395fd2a2a832dba01c65bc88718528313cEvan Cheng
87439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  if (RM == Reloc::Default) {
88439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    Triple T(TT);
89439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    if (T.isOSDarwin())
90439661395fd2a2a832dba01c65bc88718528313cEvan Cheng      RM = Reloc::DynamicNoPIC;
91439661395fd2a2a832dba01c65bc88718528313cEvan Cheng    else
92439661395fd2a2a832dba01c65bc88718528313cEvan Cheng      RM = Reloc::Static;
93439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  }
94daa65f5e08e19b1fac5f476cef45223b1b4e5a8eBill Schmidt  if (CM == CodeModel::Default) {
95daa65f5e08e19b1fac5f476cef45223b1b4e5a8eBill Schmidt    Triple T(TT);
96f38cc38fa647d4e72c053c39bbe0cdec1342535fBill Schmidt    if (!T.isOSDarwin() &&
97f38cc38fa647d4e72c053c39bbe0cdec1342535fBill Schmidt        (T.getArch() == Triple::ppc64 || T.getArch() == Triple::ppc64le))
98daa65f5e08e19b1fac5f476cef45223b1b4e5a8eBill Schmidt      CM = CodeModel::Medium;
99daa65f5e08e19b1fac5f476cef45223b1b4e5a8eBill Schmidt  }
100b95fc31aa2e5a0a0b9ee1909d1cb949577c5aa16Evan Cheng  X->InitMCCodeGenInfo(RM, CM, OL);
101439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  return X;
102439661395fd2a2a832dba01c65bc88718528313cEvan Cheng}
103439661395fd2a2a832dba01c65bc88718528313cEvan Cheng
104966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng// This is duplicated code. Refactor this.
10528c85a81a17dd719a254dc00cbeb484774893197Evan Chengstatic MCStreamer *createMCStreamer(const Target &T, StringRef TT,
10678c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng                                    MCContext &Ctx, MCAsmBackend &MAB,
107966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng                                    raw_ostream &OS,
108966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng                                    MCCodeEmitter *Emitter,
109966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng                                    bool RelaxAll,
110966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng                                    bool NoExecStack) {
111966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng  if (Triple(TT).isOSDarwin())
11278c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng    return createMachOStreamer(Ctx, MAB, OS, Emitter, RelaxAll);
113966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng
11429630ff214085365d11f1a58251ba07326e21398Roman Divacky  return createELFStreamer(Ctx, MAB, OS, Emitter, RelaxAll, NoExecStack);
115966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng}
116966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng
1174b64e8a9e13ba782da2034e1dee52f077bdb759cEvan Chengstatic MCInstPrinter *createPPCMCInstPrinter(const Target &T,
1184b64e8a9e13ba782da2034e1dee52f077bdb759cEvan Cheng                                             unsigned SyntaxVariant,
119b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy                                             const MCAsmInfo &MAI,
12017463b3ef1a3d39b10619254f12e806c8c43f9e7Craig Topper                                             const MCInstrInfo &MII,
121c6449b636f4984be88f128d0375c056ad05e7e8fJim Grosbach                                             const MCRegisterInfo &MRI,
122b950585cc5a0d665e9accfe5ce490cd269756f2eJames Molloy                                             const MCSubtargetInfo &STI) {
123a68f58ab2bec6a024afae498e4082ddd8b01f178Ulrich Weigand  bool isDarwin = Triple(STI.getTargetTriple()).isOSDarwin();
124a68f58ab2bec6a024afae498e4082ddd8b01f178Ulrich Weigand  return new PPCInstPrinter(MAI, MII, MRI, isDarwin);
1254b64e8a9e13ba782da2034e1dee52f077bdb759cEvan Cheng}
1264b64e8a9e13ba782da2034e1dee52f077bdb759cEvan Cheng
127e78085a3c03de648a481e9751c3094c517bd7123Evan Chengextern "C" void LLVMInitializePowerPCTargetMC() {
128e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng  // Register the MC asm info.
129e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng  RegisterMCAsmInfoFn C(ThePPC32Target, createPPCMCAsmInfo);
130e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng  RegisterMCAsmInfoFn D(ThePPC64Target, createPPCMCAsmInfo);
131f38cc38fa647d4e72c053c39bbe0cdec1342535fBill Schmidt  RegisterMCAsmInfoFn E(ThePPC64LETarget, createPPCMCAsmInfo);
132e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng
133e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng  // Register the MC codegen info.
134439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  TargetRegistry::RegisterMCCodeGenInfo(ThePPC32Target, createPPCMCCodeGenInfo);
135439661395fd2a2a832dba01c65bc88718528313cEvan Cheng  TargetRegistry::RegisterMCCodeGenInfo(ThePPC64Target, createPPCMCCodeGenInfo);
136f38cc38fa647d4e72c053c39bbe0cdec1342535fBill Schmidt  TargetRegistry::RegisterMCCodeGenInfo(ThePPC64LETarget,
137f38cc38fa647d4e72c053c39bbe0cdec1342535fBill Schmidt                                        createPPCMCCodeGenInfo);
138e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng
139e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng  // Register the MC instruction info.
140e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng  TargetRegistry::RegisterMCInstrInfo(ThePPC32Target, createPPCMCInstrInfo);
141e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng  TargetRegistry::RegisterMCInstrInfo(ThePPC64Target, createPPCMCInstrInfo);
142f38cc38fa647d4e72c053c39bbe0cdec1342535fBill Schmidt  TargetRegistry::RegisterMCInstrInfo(ThePPC64LETarget,
143f38cc38fa647d4e72c053c39bbe0cdec1342535fBill Schmidt                                      createPPCMCInstrInfo);
144e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng
145e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng  // Register the MC register info.
146e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng  TargetRegistry::RegisterMCRegInfo(ThePPC32Target, createPPCMCRegisterInfo);
147e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng  TargetRegistry::RegisterMCRegInfo(ThePPC64Target, createPPCMCRegisterInfo);
148f38cc38fa647d4e72c053c39bbe0cdec1342535fBill Schmidt  TargetRegistry::RegisterMCRegInfo(ThePPC64LETarget, createPPCMCRegisterInfo);
149e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng
150e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng  // Register the MC subtarget info.
151e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng  TargetRegistry::RegisterMCSubtargetInfo(ThePPC32Target,
152e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng                                          createPPCMCSubtargetInfo);
153e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng  TargetRegistry::RegisterMCSubtargetInfo(ThePPC64Target,
154e78085a3c03de648a481e9751c3094c517bd7123Evan Cheng                                          createPPCMCSubtargetInfo);
155f38cc38fa647d4e72c053c39bbe0cdec1342535fBill Schmidt  TargetRegistry::RegisterMCSubtargetInfo(ThePPC64LETarget,
156f38cc38fa647d4e72c053c39bbe0cdec1342535fBill Schmidt                                          createPPCMCSubtargetInfo);
157966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng
158966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng  // Register the MC Code Emitter
15928c85a81a17dd719a254dc00cbeb484774893197Evan Cheng  TargetRegistry::RegisterMCCodeEmitter(ThePPC32Target, createPPCMCCodeEmitter);
16028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng  TargetRegistry::RegisterMCCodeEmitter(ThePPC64Target, createPPCMCCodeEmitter);
161f38cc38fa647d4e72c053c39bbe0cdec1342535fBill Schmidt  TargetRegistry::RegisterMCCodeEmitter(ThePPC64LETarget,
162f38cc38fa647d4e72c053c39bbe0cdec1342535fBill Schmidt                                        createPPCMCCodeEmitter);
163966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng
164966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng    // Register the asm backend.
16578c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng  TargetRegistry::RegisterMCAsmBackend(ThePPC32Target, createPPCAsmBackend);
16678c10eeaa57d1c6c4b7781d3c0bcb0cfbbc43b5cEvan Cheng  TargetRegistry::RegisterMCAsmBackend(ThePPC64Target, createPPCAsmBackend);
167f38cc38fa647d4e72c053c39bbe0cdec1342535fBill Schmidt  TargetRegistry::RegisterMCAsmBackend(ThePPC64LETarget, createPPCAsmBackend);
168966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng
169966aeb5788c242cfaca35c56c0ddc0ff778d4376Evan Cheng  // Register the object streamer.
17028c85a81a17dd719a254dc00cbeb484774893197Evan Cheng  TargetRegistry::RegisterMCObjectStreamer(ThePPC32Target, createMCStreamer);
17128c85a81a17dd719a254dc00cbeb484774893197Evan Cheng  TargetRegistry::RegisterMCObjectStreamer(ThePPC64Target, createMCStreamer);
172f38cc38fa647d4e72c053c39bbe0cdec1342535fBill Schmidt  TargetRegistry::RegisterMCObjectStreamer(ThePPC64LETarget, createMCStreamer);
1734b64e8a9e13ba782da2034e1dee52f077bdb759cEvan Cheng
1744b64e8a9e13ba782da2034e1dee52f077bdb759cEvan Cheng  // Register the MCInstPrinter.
1754b64e8a9e13ba782da2034e1dee52f077bdb759cEvan Cheng  TargetRegistry::RegisterMCInstPrinter(ThePPC32Target, createPPCMCInstPrinter);
1764b64e8a9e13ba782da2034e1dee52f077bdb759cEvan Cheng  TargetRegistry::RegisterMCInstPrinter(ThePPC64Target, createPPCMCInstPrinter);
177f38cc38fa647d4e72c053c39bbe0cdec1342535fBill Schmidt  TargetRegistry::RegisterMCInstPrinter(ThePPC64LETarget,
178f38cc38fa647d4e72c053c39bbe0cdec1342535fBill Schmidt                                        createPPCMCInstPrinter);
179439661395fd2a2a832dba01c65bc88718528313cEvan Cheng}
180