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