1*9880d681SAndroid Build Coastguard Worker //===-- X86MCTargetDesc.cpp - X86 Target Descriptions ---------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file provides X86 specific target descriptions.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker #include "X86MCTargetDesc.h"
15*9880d681SAndroid Build Coastguard Worker #include "InstPrinter/X86ATTInstPrinter.h"
16*9880d681SAndroid Build Coastguard Worker #include "InstPrinter/X86IntelInstPrinter.h"
17*9880d681SAndroid Build Coastguard Worker #include "X86MCAsmInfo.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/Triple.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCInstrAnalysis.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCInstrInfo.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCRegisterInfo.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCStreamer.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCSubtargetInfo.h"
24*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MachineLocation.h"
25*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorHandling.h"
26*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Host.h"
27*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/TargetRegistry.h"
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker #if _MSC_VER
30*9880d681SAndroid Build Coastguard Worker #include <intrin.h>
31*9880d681SAndroid Build Coastguard Worker #endif
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Worker using namespace llvm;
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker #define GET_REGINFO_MC_DESC
36*9880d681SAndroid Build Coastguard Worker #include "X86GenRegisterInfo.inc"
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker #define GET_INSTRINFO_MC_DESC
39*9880d681SAndroid Build Coastguard Worker #include "X86GenInstrInfo.inc"
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker #define GET_SUBTARGETINFO_MC_DESC
42*9880d681SAndroid Build Coastguard Worker #include "X86GenSubtargetInfo.inc"
43*9880d681SAndroid Build Coastguard Worker
ParseX86Triple(const Triple & TT)44*9880d681SAndroid Build Coastguard Worker std::string X86_MC::ParseX86Triple(const Triple &TT) {
45*9880d681SAndroid Build Coastguard Worker std::string FS;
46*9880d681SAndroid Build Coastguard Worker if (TT.getArch() == Triple::x86_64)
47*9880d681SAndroid Build Coastguard Worker FS = "+64bit-mode,-32bit-mode,-16bit-mode";
48*9880d681SAndroid Build Coastguard Worker else if (TT.getEnvironment() != Triple::CODE16)
49*9880d681SAndroid Build Coastguard Worker FS = "-64bit-mode,+32bit-mode,-16bit-mode";
50*9880d681SAndroid Build Coastguard Worker else
51*9880d681SAndroid Build Coastguard Worker FS = "-64bit-mode,-32bit-mode,+16bit-mode";
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Worker return FS;
54*9880d681SAndroid Build Coastguard Worker }
55*9880d681SAndroid Build Coastguard Worker
getDwarfRegFlavour(const Triple & TT,bool isEH)56*9880d681SAndroid Build Coastguard Worker unsigned X86_MC::getDwarfRegFlavour(const Triple &TT, bool isEH) {
57*9880d681SAndroid Build Coastguard Worker if (TT.getArch() == Triple::x86_64)
58*9880d681SAndroid Build Coastguard Worker return DWARFFlavour::X86_64;
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Worker if (TT.isOSDarwin())
61*9880d681SAndroid Build Coastguard Worker return isEH ? DWARFFlavour::X86_32_DarwinEH : DWARFFlavour::X86_32_Generic;
62*9880d681SAndroid Build Coastguard Worker if (TT.isOSCygMing())
63*9880d681SAndroid Build Coastguard Worker // Unsupported by now, just quick fallback
64*9880d681SAndroid Build Coastguard Worker return DWARFFlavour::X86_32_Generic;
65*9880d681SAndroid Build Coastguard Worker return DWARFFlavour::X86_32_Generic;
66*9880d681SAndroid Build Coastguard Worker }
67*9880d681SAndroid Build Coastguard Worker
initLLVMToSEHAndCVRegMapping(MCRegisterInfo * MRI)68*9880d681SAndroid Build Coastguard Worker void X86_MC::initLLVMToSEHAndCVRegMapping(MCRegisterInfo *MRI) {
69*9880d681SAndroid Build Coastguard Worker // FIXME: TableGen these.
70*9880d681SAndroid Build Coastguard Worker for (unsigned Reg = X86::NoRegister + 1; Reg < X86::NUM_TARGET_REGS; ++Reg) {
71*9880d681SAndroid Build Coastguard Worker unsigned SEH = MRI->getEncodingValue(Reg);
72*9880d681SAndroid Build Coastguard Worker MRI->mapLLVMRegToSEHReg(Reg, SEH);
73*9880d681SAndroid Build Coastguard Worker }
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker // These CodeView registers are numbered sequentially starting at value 1.
76*9880d681SAndroid Build Coastguard Worker static const MCPhysReg LowCVRegs[] = {
77*9880d681SAndroid Build Coastguard Worker X86::AL, X86::CL, X86::DL, X86::BL, X86::AH, X86::CH,
78*9880d681SAndroid Build Coastguard Worker X86::DH, X86::BH, X86::AX, X86::CX, X86::DX, X86::BX,
79*9880d681SAndroid Build Coastguard Worker X86::SP, X86::BP, X86::SI, X86::DI, X86::EAX, X86::ECX,
80*9880d681SAndroid Build Coastguard Worker X86::EDX, X86::EBX, X86::ESP, X86::EBP, X86::ESI, X86::EDI,
81*9880d681SAndroid Build Coastguard Worker };
82*9880d681SAndroid Build Coastguard Worker unsigned CVLowRegStart = 1;
83*9880d681SAndroid Build Coastguard Worker for (unsigned I = 0; I < array_lengthof(LowCVRegs); ++I)
84*9880d681SAndroid Build Coastguard Worker MRI->mapLLVMRegToCVReg(LowCVRegs[I], I + CVLowRegStart);
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Worker MRI->mapLLVMRegToCVReg(X86::EFLAGS, 34);
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Worker // The x87 registers start at 128 and are numbered sequentially.
89*9880d681SAndroid Build Coastguard Worker unsigned FP0Start = 128;
90*9880d681SAndroid Build Coastguard Worker for (unsigned I = 0; I < 8; ++I)
91*9880d681SAndroid Build Coastguard Worker MRI->mapLLVMRegToCVReg(X86::FP0 + I, FP0Start + I);
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Worker // The low 8 XMM registers start at 154 and are numbered sequentially.
94*9880d681SAndroid Build Coastguard Worker unsigned CVXMM0Start = 154;
95*9880d681SAndroid Build Coastguard Worker for (unsigned I = 0; I < 8; ++I)
96*9880d681SAndroid Build Coastguard Worker MRI->mapLLVMRegToCVReg(X86::XMM0 + I, CVXMM0Start + I);
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Worker // The high 8 XMM registers start at 252 and are numbered sequentially.
99*9880d681SAndroid Build Coastguard Worker unsigned CVXMM8Start = 252;
100*9880d681SAndroid Build Coastguard Worker for (unsigned I = 0; I < 8; ++I)
101*9880d681SAndroid Build Coastguard Worker MRI->mapLLVMRegToCVReg(X86::XMM8 + I, CVXMM8Start + I);
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Worker // FIXME: XMM16 and above from AVX512 not yet documented.
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Worker // AMD64 registers start at 324 and count up.
106*9880d681SAndroid Build Coastguard Worker unsigned CVX64RegStart = 324;
107*9880d681SAndroid Build Coastguard Worker static const MCPhysReg CVX64Regs[] = {
108*9880d681SAndroid Build Coastguard Worker X86::SIL, X86::DIL, X86::BPL, X86::SPL, X86::RAX, X86::RBX,
109*9880d681SAndroid Build Coastguard Worker X86::RCX, X86::RDX, X86::RSI, X86::RDI, X86::RBP, X86::RSP,
110*9880d681SAndroid Build Coastguard Worker X86::R8, X86::R9, X86::R10, X86::R11, X86::R12, X86::R13,
111*9880d681SAndroid Build Coastguard Worker X86::R14, X86::R15, X86::R8B, X86::R9B, X86::R10B, X86::R11B,
112*9880d681SAndroid Build Coastguard Worker X86::R12B, X86::R13B, X86::R14B, X86::R15B, X86::R8W, X86::R9W,
113*9880d681SAndroid Build Coastguard Worker X86::R10W, X86::R11W, X86::R12W, X86::R13W, X86::R14W, X86::R15W,
114*9880d681SAndroid Build Coastguard Worker X86::R8D, X86::R9D, X86::R10D, X86::R11D, X86::R12D, X86::R13D,
115*9880d681SAndroid Build Coastguard Worker X86::R14D, X86::R15D, X86::YMM0, X86::YMM1, X86::YMM2, X86::YMM3,
116*9880d681SAndroid Build Coastguard Worker X86::YMM4, X86::YMM5, X86::YMM6, X86::YMM7, X86::YMM8, X86::YMM9,
117*9880d681SAndroid Build Coastguard Worker X86::YMM10, X86::YMM11, X86::YMM12, X86::YMM13, X86::YMM14, X86::YMM15,
118*9880d681SAndroid Build Coastguard Worker };
119*9880d681SAndroid Build Coastguard Worker for (unsigned I = 0; I < array_lengthof(CVX64Regs); ++I)
120*9880d681SAndroid Build Coastguard Worker MRI->mapLLVMRegToCVReg(CVX64Regs[I], CVX64RegStart + I);
121*9880d681SAndroid Build Coastguard Worker }
122*9880d681SAndroid Build Coastguard Worker
createX86MCSubtargetInfo(const Triple & TT,StringRef CPU,StringRef FS)123*9880d681SAndroid Build Coastguard Worker MCSubtargetInfo *X86_MC::createX86MCSubtargetInfo(const Triple &TT,
124*9880d681SAndroid Build Coastguard Worker StringRef CPU, StringRef FS) {
125*9880d681SAndroid Build Coastguard Worker std::string ArchFS = X86_MC::ParseX86Triple(TT);
126*9880d681SAndroid Build Coastguard Worker if (!FS.empty()) {
127*9880d681SAndroid Build Coastguard Worker if (!ArchFS.empty())
128*9880d681SAndroid Build Coastguard Worker ArchFS = (Twine(ArchFS) + "," + FS).str();
129*9880d681SAndroid Build Coastguard Worker else
130*9880d681SAndroid Build Coastguard Worker ArchFS = FS;
131*9880d681SAndroid Build Coastguard Worker }
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Worker std::string CPUName = CPU;
134*9880d681SAndroid Build Coastguard Worker if (CPUName.empty())
135*9880d681SAndroid Build Coastguard Worker CPUName = "generic";
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Worker return createX86MCSubtargetInfoImpl(TT, CPUName, ArchFS);
138*9880d681SAndroid Build Coastguard Worker }
139*9880d681SAndroid Build Coastguard Worker
createX86MCInstrInfo()140*9880d681SAndroid Build Coastguard Worker static MCInstrInfo *createX86MCInstrInfo() {
141*9880d681SAndroid Build Coastguard Worker MCInstrInfo *X = new MCInstrInfo();
142*9880d681SAndroid Build Coastguard Worker InitX86MCInstrInfo(X);
143*9880d681SAndroid Build Coastguard Worker return X;
144*9880d681SAndroid Build Coastguard Worker }
145*9880d681SAndroid Build Coastguard Worker
createX86MCRegisterInfo(const Triple & TT)146*9880d681SAndroid Build Coastguard Worker static MCRegisterInfo *createX86MCRegisterInfo(const Triple &TT) {
147*9880d681SAndroid Build Coastguard Worker unsigned RA = (TT.getArch() == Triple::x86_64)
148*9880d681SAndroid Build Coastguard Worker ? X86::RIP // Should have dwarf #16.
149*9880d681SAndroid Build Coastguard Worker : X86::EIP; // Should have dwarf #8.
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Worker MCRegisterInfo *X = new MCRegisterInfo();
152*9880d681SAndroid Build Coastguard Worker InitX86MCRegisterInfo(X, RA, X86_MC::getDwarfRegFlavour(TT, false),
153*9880d681SAndroid Build Coastguard Worker X86_MC::getDwarfRegFlavour(TT, true), RA);
154*9880d681SAndroid Build Coastguard Worker X86_MC::initLLVMToSEHAndCVRegMapping(X);
155*9880d681SAndroid Build Coastguard Worker return X;
156*9880d681SAndroid Build Coastguard Worker }
157*9880d681SAndroid Build Coastguard Worker
createX86MCAsmInfo(const MCRegisterInfo & MRI,const Triple & TheTriple)158*9880d681SAndroid Build Coastguard Worker static MCAsmInfo *createX86MCAsmInfo(const MCRegisterInfo &MRI,
159*9880d681SAndroid Build Coastguard Worker const Triple &TheTriple) {
160*9880d681SAndroid Build Coastguard Worker bool is64Bit = TheTriple.getArch() == Triple::x86_64;
161*9880d681SAndroid Build Coastguard Worker
162*9880d681SAndroid Build Coastguard Worker MCAsmInfo *MAI;
163*9880d681SAndroid Build Coastguard Worker if (TheTriple.isOSBinFormatMachO()) {
164*9880d681SAndroid Build Coastguard Worker if (is64Bit)
165*9880d681SAndroid Build Coastguard Worker MAI = new X86_64MCAsmInfoDarwin(TheTriple);
166*9880d681SAndroid Build Coastguard Worker else
167*9880d681SAndroid Build Coastguard Worker MAI = new X86MCAsmInfoDarwin(TheTriple);
168*9880d681SAndroid Build Coastguard Worker } else if (TheTriple.isOSBinFormatELF()) {
169*9880d681SAndroid Build Coastguard Worker // Force the use of an ELF container.
170*9880d681SAndroid Build Coastguard Worker MAI = new X86ELFMCAsmInfo(TheTriple);
171*9880d681SAndroid Build Coastguard Worker } else if (TheTriple.isWindowsMSVCEnvironment() ||
172*9880d681SAndroid Build Coastguard Worker TheTriple.isWindowsCoreCLREnvironment()) {
173*9880d681SAndroid Build Coastguard Worker MAI = new X86MCAsmInfoMicrosoft(TheTriple);
174*9880d681SAndroid Build Coastguard Worker } else if (TheTriple.isOSCygMing() ||
175*9880d681SAndroid Build Coastguard Worker TheTriple.isWindowsItaniumEnvironment()) {
176*9880d681SAndroid Build Coastguard Worker MAI = new X86MCAsmInfoGNUCOFF(TheTriple);
177*9880d681SAndroid Build Coastguard Worker } else {
178*9880d681SAndroid Build Coastguard Worker // The default is ELF.
179*9880d681SAndroid Build Coastguard Worker MAI = new X86ELFMCAsmInfo(TheTriple);
180*9880d681SAndroid Build Coastguard Worker }
181*9880d681SAndroid Build Coastguard Worker
182*9880d681SAndroid Build Coastguard Worker // Initialize initial frame state.
183*9880d681SAndroid Build Coastguard Worker // Calculate amount of bytes used for return address storing
184*9880d681SAndroid Build Coastguard Worker int stackGrowth = is64Bit ? -8 : -4;
185*9880d681SAndroid Build Coastguard Worker
186*9880d681SAndroid Build Coastguard Worker // Initial state of the frame pointer is esp+stackGrowth.
187*9880d681SAndroid Build Coastguard Worker unsigned StackPtr = is64Bit ? X86::RSP : X86::ESP;
188*9880d681SAndroid Build Coastguard Worker MCCFIInstruction Inst = MCCFIInstruction::createDefCfa(
189*9880d681SAndroid Build Coastguard Worker nullptr, MRI.getDwarfRegNum(StackPtr, true), -stackGrowth);
190*9880d681SAndroid Build Coastguard Worker MAI->addInitialFrameState(Inst);
191*9880d681SAndroid Build Coastguard Worker
192*9880d681SAndroid Build Coastguard Worker // Add return address to move list
193*9880d681SAndroid Build Coastguard Worker unsigned InstPtr = is64Bit ? X86::RIP : X86::EIP;
194*9880d681SAndroid Build Coastguard Worker MCCFIInstruction Inst2 = MCCFIInstruction::createOffset(
195*9880d681SAndroid Build Coastguard Worker nullptr, MRI.getDwarfRegNum(InstPtr, true), stackGrowth);
196*9880d681SAndroid Build Coastguard Worker MAI->addInitialFrameState(Inst2);
197*9880d681SAndroid Build Coastguard Worker
198*9880d681SAndroid Build Coastguard Worker return MAI;
199*9880d681SAndroid Build Coastguard Worker }
200*9880d681SAndroid Build Coastguard Worker
adjustCodeGenOpts(const Triple & TT,Reloc::Model RM,CodeModel::Model & CM)201*9880d681SAndroid Build Coastguard Worker static void adjustCodeGenOpts(const Triple &TT, Reloc::Model RM,
202*9880d681SAndroid Build Coastguard Worker CodeModel::Model &CM) {
203*9880d681SAndroid Build Coastguard Worker bool is64Bit = TT.getArch() == Triple::x86_64;
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Worker // For static codegen, if we're not already set, use Small codegen.
206*9880d681SAndroid Build Coastguard Worker if (CM == CodeModel::Default)
207*9880d681SAndroid Build Coastguard Worker CM = CodeModel::Small;
208*9880d681SAndroid Build Coastguard Worker else if (CM == CodeModel::JITDefault)
209*9880d681SAndroid Build Coastguard Worker // 64-bit JIT places everything in the same buffer except external funcs.
210*9880d681SAndroid Build Coastguard Worker CM = is64Bit ? CodeModel::Large : CodeModel::Small;
211*9880d681SAndroid Build Coastguard Worker }
212*9880d681SAndroid Build Coastguard Worker
createX86MCInstPrinter(const Triple & T,unsigned SyntaxVariant,const MCAsmInfo & MAI,const MCInstrInfo & MII,const MCRegisterInfo & MRI)213*9880d681SAndroid Build Coastguard Worker static MCInstPrinter *createX86MCInstPrinter(const Triple &T,
214*9880d681SAndroid Build Coastguard Worker unsigned SyntaxVariant,
215*9880d681SAndroid Build Coastguard Worker const MCAsmInfo &MAI,
216*9880d681SAndroid Build Coastguard Worker const MCInstrInfo &MII,
217*9880d681SAndroid Build Coastguard Worker const MCRegisterInfo &MRI) {
218*9880d681SAndroid Build Coastguard Worker if (SyntaxVariant == 0)
219*9880d681SAndroid Build Coastguard Worker return new X86ATTInstPrinter(MAI, MII, MRI);
220*9880d681SAndroid Build Coastguard Worker if (SyntaxVariant == 1)
221*9880d681SAndroid Build Coastguard Worker return new X86IntelInstPrinter(MAI, MII, MRI);
222*9880d681SAndroid Build Coastguard Worker return nullptr;
223*9880d681SAndroid Build Coastguard Worker }
224*9880d681SAndroid Build Coastguard Worker
createX86MCRelocationInfo(const Triple & TheTriple,MCContext & Ctx)225*9880d681SAndroid Build Coastguard Worker static MCRelocationInfo *createX86MCRelocationInfo(const Triple &TheTriple,
226*9880d681SAndroid Build Coastguard Worker MCContext &Ctx) {
227*9880d681SAndroid Build Coastguard Worker // Default to the stock relocation info.
228*9880d681SAndroid Build Coastguard Worker return llvm::createMCRelocationInfo(TheTriple, Ctx);
229*9880d681SAndroid Build Coastguard Worker }
230*9880d681SAndroid Build Coastguard Worker
createX86MCInstrAnalysis(const MCInstrInfo * Info)231*9880d681SAndroid Build Coastguard Worker static MCInstrAnalysis *createX86MCInstrAnalysis(const MCInstrInfo *Info) {
232*9880d681SAndroid Build Coastguard Worker return new MCInstrAnalysis(Info);
233*9880d681SAndroid Build Coastguard Worker }
234*9880d681SAndroid Build Coastguard Worker
235*9880d681SAndroid Build Coastguard Worker // Force static initialization.
LLVMInitializeX86TargetMC()236*9880d681SAndroid Build Coastguard Worker extern "C" void LLVMInitializeX86TargetMC() {
237*9880d681SAndroid Build Coastguard Worker for (Target *T : {&TheX86_32Target, &TheX86_64Target}) {
238*9880d681SAndroid Build Coastguard Worker // Register the MC asm info.
239*9880d681SAndroid Build Coastguard Worker RegisterMCAsmInfoFn X(*T, createX86MCAsmInfo);
240*9880d681SAndroid Build Coastguard Worker
241*9880d681SAndroid Build Coastguard Worker // Register the MC codegen info.
242*9880d681SAndroid Build Coastguard Worker RegisterMCAdjustCodeGenOptsFn Y(*T, adjustCodeGenOpts);
243*9880d681SAndroid Build Coastguard Worker
244*9880d681SAndroid Build Coastguard Worker // Register the MC instruction info.
245*9880d681SAndroid Build Coastguard Worker TargetRegistry::RegisterMCInstrInfo(*T, createX86MCInstrInfo);
246*9880d681SAndroid Build Coastguard Worker
247*9880d681SAndroid Build Coastguard Worker // Register the MC register info.
248*9880d681SAndroid Build Coastguard Worker TargetRegistry::RegisterMCRegInfo(*T, createX86MCRegisterInfo);
249*9880d681SAndroid Build Coastguard Worker
250*9880d681SAndroid Build Coastguard Worker // Register the MC subtarget info.
251*9880d681SAndroid Build Coastguard Worker TargetRegistry::RegisterMCSubtargetInfo(*T,
252*9880d681SAndroid Build Coastguard Worker X86_MC::createX86MCSubtargetInfo);
253*9880d681SAndroid Build Coastguard Worker
254*9880d681SAndroid Build Coastguard Worker // Register the MC instruction analyzer.
255*9880d681SAndroid Build Coastguard Worker TargetRegistry::RegisterMCInstrAnalysis(*T, createX86MCInstrAnalysis);
256*9880d681SAndroid Build Coastguard Worker
257*9880d681SAndroid Build Coastguard Worker // Register the code emitter.
258*9880d681SAndroid Build Coastguard Worker TargetRegistry::RegisterMCCodeEmitter(*T, createX86MCCodeEmitter);
259*9880d681SAndroid Build Coastguard Worker
260*9880d681SAndroid Build Coastguard Worker // Register the object streamer.
261*9880d681SAndroid Build Coastguard Worker TargetRegistry::RegisterCOFFStreamer(*T, createX86WinCOFFStreamer);
262*9880d681SAndroid Build Coastguard Worker
263*9880d681SAndroid Build Coastguard Worker // Register the MCInstPrinter.
264*9880d681SAndroid Build Coastguard Worker TargetRegistry::RegisterMCInstPrinter(*T, createX86MCInstPrinter);
265*9880d681SAndroid Build Coastguard Worker
266*9880d681SAndroid Build Coastguard Worker // Register the MC relocation info.
267*9880d681SAndroid Build Coastguard Worker TargetRegistry::RegisterMCRelocationInfo(*T, createX86MCRelocationInfo);
268*9880d681SAndroid Build Coastguard Worker }
269*9880d681SAndroid Build Coastguard Worker
270*9880d681SAndroid Build Coastguard Worker // Register the asm backend.
271*9880d681SAndroid Build Coastguard Worker TargetRegistry::RegisterMCAsmBackend(TheX86_32Target,
272*9880d681SAndroid Build Coastguard Worker createX86_32AsmBackend);
273*9880d681SAndroid Build Coastguard Worker TargetRegistry::RegisterMCAsmBackend(TheX86_64Target,
274*9880d681SAndroid Build Coastguard Worker createX86_64AsmBackend);
275*9880d681SAndroid Build Coastguard Worker }
276*9880d681SAndroid Build Coastguard Worker
getX86SubSuperRegisterOrZero(unsigned Reg,unsigned Size,bool High)277*9880d681SAndroid Build Coastguard Worker unsigned llvm::getX86SubSuperRegisterOrZero(unsigned Reg, unsigned Size,
278*9880d681SAndroid Build Coastguard Worker bool High) {
279*9880d681SAndroid Build Coastguard Worker switch (Size) {
280*9880d681SAndroid Build Coastguard Worker default: return 0;
281*9880d681SAndroid Build Coastguard Worker case 8:
282*9880d681SAndroid Build Coastguard Worker if (High) {
283*9880d681SAndroid Build Coastguard Worker switch (Reg) {
284*9880d681SAndroid Build Coastguard Worker default: return getX86SubSuperRegisterOrZero(Reg, 64);
285*9880d681SAndroid Build Coastguard Worker case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
286*9880d681SAndroid Build Coastguard Worker return X86::SI;
287*9880d681SAndroid Build Coastguard Worker case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
288*9880d681SAndroid Build Coastguard Worker return X86::DI;
289*9880d681SAndroid Build Coastguard Worker case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
290*9880d681SAndroid Build Coastguard Worker return X86::BP;
291*9880d681SAndroid Build Coastguard Worker case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
292*9880d681SAndroid Build Coastguard Worker return X86::SP;
293*9880d681SAndroid Build Coastguard Worker case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
294*9880d681SAndroid Build Coastguard Worker return X86::AH;
295*9880d681SAndroid Build Coastguard Worker case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
296*9880d681SAndroid Build Coastguard Worker return X86::DH;
297*9880d681SAndroid Build Coastguard Worker case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
298*9880d681SAndroid Build Coastguard Worker return X86::CH;
299*9880d681SAndroid Build Coastguard Worker case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
300*9880d681SAndroid Build Coastguard Worker return X86::BH;
301*9880d681SAndroid Build Coastguard Worker }
302*9880d681SAndroid Build Coastguard Worker } else {
303*9880d681SAndroid Build Coastguard Worker switch (Reg) {
304*9880d681SAndroid Build Coastguard Worker default: return 0;
305*9880d681SAndroid Build Coastguard Worker case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
306*9880d681SAndroid Build Coastguard Worker return X86::AL;
307*9880d681SAndroid Build Coastguard Worker case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
308*9880d681SAndroid Build Coastguard Worker return X86::DL;
309*9880d681SAndroid Build Coastguard Worker case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
310*9880d681SAndroid Build Coastguard Worker return X86::CL;
311*9880d681SAndroid Build Coastguard Worker case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
312*9880d681SAndroid Build Coastguard Worker return X86::BL;
313*9880d681SAndroid Build Coastguard Worker case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
314*9880d681SAndroid Build Coastguard Worker return X86::SIL;
315*9880d681SAndroid Build Coastguard Worker case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
316*9880d681SAndroid Build Coastguard Worker return X86::DIL;
317*9880d681SAndroid Build Coastguard Worker case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
318*9880d681SAndroid Build Coastguard Worker return X86::BPL;
319*9880d681SAndroid Build Coastguard Worker case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
320*9880d681SAndroid Build Coastguard Worker return X86::SPL;
321*9880d681SAndroid Build Coastguard Worker case X86::R8B: case X86::R8W: case X86::R8D: case X86::R8:
322*9880d681SAndroid Build Coastguard Worker return X86::R8B;
323*9880d681SAndroid Build Coastguard Worker case X86::R9B: case X86::R9W: case X86::R9D: case X86::R9:
324*9880d681SAndroid Build Coastguard Worker return X86::R9B;
325*9880d681SAndroid Build Coastguard Worker case X86::R10B: case X86::R10W: case X86::R10D: case X86::R10:
326*9880d681SAndroid Build Coastguard Worker return X86::R10B;
327*9880d681SAndroid Build Coastguard Worker case X86::R11B: case X86::R11W: case X86::R11D: case X86::R11:
328*9880d681SAndroid Build Coastguard Worker return X86::R11B;
329*9880d681SAndroid Build Coastguard Worker case X86::R12B: case X86::R12W: case X86::R12D: case X86::R12:
330*9880d681SAndroid Build Coastguard Worker return X86::R12B;
331*9880d681SAndroid Build Coastguard Worker case X86::R13B: case X86::R13W: case X86::R13D: case X86::R13:
332*9880d681SAndroid Build Coastguard Worker return X86::R13B;
333*9880d681SAndroid Build Coastguard Worker case X86::R14B: case X86::R14W: case X86::R14D: case X86::R14:
334*9880d681SAndroid Build Coastguard Worker return X86::R14B;
335*9880d681SAndroid Build Coastguard Worker case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
336*9880d681SAndroid Build Coastguard Worker return X86::R15B;
337*9880d681SAndroid Build Coastguard Worker }
338*9880d681SAndroid Build Coastguard Worker }
339*9880d681SAndroid Build Coastguard Worker case 16:
340*9880d681SAndroid Build Coastguard Worker switch (Reg) {
341*9880d681SAndroid Build Coastguard Worker default: return 0;
342*9880d681SAndroid Build Coastguard Worker case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
343*9880d681SAndroid Build Coastguard Worker return X86::AX;
344*9880d681SAndroid Build Coastguard Worker case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
345*9880d681SAndroid Build Coastguard Worker return X86::DX;
346*9880d681SAndroid Build Coastguard Worker case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
347*9880d681SAndroid Build Coastguard Worker return X86::CX;
348*9880d681SAndroid Build Coastguard Worker case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
349*9880d681SAndroid Build Coastguard Worker return X86::BX;
350*9880d681SAndroid Build Coastguard Worker case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
351*9880d681SAndroid Build Coastguard Worker return X86::SI;
352*9880d681SAndroid Build Coastguard Worker case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
353*9880d681SAndroid Build Coastguard Worker return X86::DI;
354*9880d681SAndroid Build Coastguard Worker case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
355*9880d681SAndroid Build Coastguard Worker return X86::BP;
356*9880d681SAndroid Build Coastguard Worker case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
357*9880d681SAndroid Build Coastguard Worker return X86::SP;
358*9880d681SAndroid Build Coastguard Worker case X86::R8B: case X86::R8W: case X86::R8D: case X86::R8:
359*9880d681SAndroid Build Coastguard Worker return X86::R8W;
360*9880d681SAndroid Build Coastguard Worker case X86::R9B: case X86::R9W: case X86::R9D: case X86::R9:
361*9880d681SAndroid Build Coastguard Worker return X86::R9W;
362*9880d681SAndroid Build Coastguard Worker case X86::R10B: case X86::R10W: case X86::R10D: case X86::R10:
363*9880d681SAndroid Build Coastguard Worker return X86::R10W;
364*9880d681SAndroid Build Coastguard Worker case X86::R11B: case X86::R11W: case X86::R11D: case X86::R11:
365*9880d681SAndroid Build Coastguard Worker return X86::R11W;
366*9880d681SAndroid Build Coastguard Worker case X86::R12B: case X86::R12W: case X86::R12D: case X86::R12:
367*9880d681SAndroid Build Coastguard Worker return X86::R12W;
368*9880d681SAndroid Build Coastguard Worker case X86::R13B: case X86::R13W: case X86::R13D: case X86::R13:
369*9880d681SAndroid Build Coastguard Worker return X86::R13W;
370*9880d681SAndroid Build Coastguard Worker case X86::R14B: case X86::R14W: case X86::R14D: case X86::R14:
371*9880d681SAndroid Build Coastguard Worker return X86::R14W;
372*9880d681SAndroid Build Coastguard Worker case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
373*9880d681SAndroid Build Coastguard Worker return X86::R15W;
374*9880d681SAndroid Build Coastguard Worker }
375*9880d681SAndroid Build Coastguard Worker case 32:
376*9880d681SAndroid Build Coastguard Worker switch (Reg) {
377*9880d681SAndroid Build Coastguard Worker default: return 0;
378*9880d681SAndroid Build Coastguard Worker case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
379*9880d681SAndroid Build Coastguard Worker return X86::EAX;
380*9880d681SAndroid Build Coastguard Worker case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
381*9880d681SAndroid Build Coastguard Worker return X86::EDX;
382*9880d681SAndroid Build Coastguard Worker case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
383*9880d681SAndroid Build Coastguard Worker return X86::ECX;
384*9880d681SAndroid Build Coastguard Worker case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
385*9880d681SAndroid Build Coastguard Worker return X86::EBX;
386*9880d681SAndroid Build Coastguard Worker case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
387*9880d681SAndroid Build Coastguard Worker return X86::ESI;
388*9880d681SAndroid Build Coastguard Worker case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
389*9880d681SAndroid Build Coastguard Worker return X86::EDI;
390*9880d681SAndroid Build Coastguard Worker case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
391*9880d681SAndroid Build Coastguard Worker return X86::EBP;
392*9880d681SAndroid Build Coastguard Worker case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
393*9880d681SAndroid Build Coastguard Worker return X86::ESP;
394*9880d681SAndroid Build Coastguard Worker case X86::R8B: case X86::R8W: case X86::R8D: case X86::R8:
395*9880d681SAndroid Build Coastguard Worker return X86::R8D;
396*9880d681SAndroid Build Coastguard Worker case X86::R9B: case X86::R9W: case X86::R9D: case X86::R9:
397*9880d681SAndroid Build Coastguard Worker return X86::R9D;
398*9880d681SAndroid Build Coastguard Worker case X86::R10B: case X86::R10W: case X86::R10D: case X86::R10:
399*9880d681SAndroid Build Coastguard Worker return X86::R10D;
400*9880d681SAndroid Build Coastguard Worker case X86::R11B: case X86::R11W: case X86::R11D: case X86::R11:
401*9880d681SAndroid Build Coastguard Worker return X86::R11D;
402*9880d681SAndroid Build Coastguard Worker case X86::R12B: case X86::R12W: case X86::R12D: case X86::R12:
403*9880d681SAndroid Build Coastguard Worker return X86::R12D;
404*9880d681SAndroid Build Coastguard Worker case X86::R13B: case X86::R13W: case X86::R13D: case X86::R13:
405*9880d681SAndroid Build Coastguard Worker return X86::R13D;
406*9880d681SAndroid Build Coastguard Worker case X86::R14B: case X86::R14W: case X86::R14D: case X86::R14:
407*9880d681SAndroid Build Coastguard Worker return X86::R14D;
408*9880d681SAndroid Build Coastguard Worker case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
409*9880d681SAndroid Build Coastguard Worker return X86::R15D;
410*9880d681SAndroid Build Coastguard Worker }
411*9880d681SAndroid Build Coastguard Worker case 64:
412*9880d681SAndroid Build Coastguard Worker switch (Reg) {
413*9880d681SAndroid Build Coastguard Worker default: return 0;
414*9880d681SAndroid Build Coastguard Worker case X86::AH: case X86::AL: case X86::AX: case X86::EAX: case X86::RAX:
415*9880d681SAndroid Build Coastguard Worker return X86::RAX;
416*9880d681SAndroid Build Coastguard Worker case X86::DH: case X86::DL: case X86::DX: case X86::EDX: case X86::RDX:
417*9880d681SAndroid Build Coastguard Worker return X86::RDX;
418*9880d681SAndroid Build Coastguard Worker case X86::CH: case X86::CL: case X86::CX: case X86::ECX: case X86::RCX:
419*9880d681SAndroid Build Coastguard Worker return X86::RCX;
420*9880d681SAndroid Build Coastguard Worker case X86::BH: case X86::BL: case X86::BX: case X86::EBX: case X86::RBX:
421*9880d681SAndroid Build Coastguard Worker return X86::RBX;
422*9880d681SAndroid Build Coastguard Worker case X86::SIL: case X86::SI: case X86::ESI: case X86::RSI:
423*9880d681SAndroid Build Coastguard Worker return X86::RSI;
424*9880d681SAndroid Build Coastguard Worker case X86::DIL: case X86::DI: case X86::EDI: case X86::RDI:
425*9880d681SAndroid Build Coastguard Worker return X86::RDI;
426*9880d681SAndroid Build Coastguard Worker case X86::BPL: case X86::BP: case X86::EBP: case X86::RBP:
427*9880d681SAndroid Build Coastguard Worker return X86::RBP;
428*9880d681SAndroid Build Coastguard Worker case X86::SPL: case X86::SP: case X86::ESP: case X86::RSP:
429*9880d681SAndroid Build Coastguard Worker return X86::RSP;
430*9880d681SAndroid Build Coastguard Worker case X86::R8B: case X86::R8W: case X86::R8D: case X86::R8:
431*9880d681SAndroid Build Coastguard Worker return X86::R8;
432*9880d681SAndroid Build Coastguard Worker case X86::R9B: case X86::R9W: case X86::R9D: case X86::R9:
433*9880d681SAndroid Build Coastguard Worker return X86::R9;
434*9880d681SAndroid Build Coastguard Worker case X86::R10B: case X86::R10W: case X86::R10D: case X86::R10:
435*9880d681SAndroid Build Coastguard Worker return X86::R10;
436*9880d681SAndroid Build Coastguard Worker case X86::R11B: case X86::R11W: case X86::R11D: case X86::R11:
437*9880d681SAndroid Build Coastguard Worker return X86::R11;
438*9880d681SAndroid Build Coastguard Worker case X86::R12B: case X86::R12W: case X86::R12D: case X86::R12:
439*9880d681SAndroid Build Coastguard Worker return X86::R12;
440*9880d681SAndroid Build Coastguard Worker case X86::R13B: case X86::R13W: case X86::R13D: case X86::R13:
441*9880d681SAndroid Build Coastguard Worker return X86::R13;
442*9880d681SAndroid Build Coastguard Worker case X86::R14B: case X86::R14W: case X86::R14D: case X86::R14:
443*9880d681SAndroid Build Coastguard Worker return X86::R14;
444*9880d681SAndroid Build Coastguard Worker case X86::R15B: case X86::R15W: case X86::R15D: case X86::R15:
445*9880d681SAndroid Build Coastguard Worker return X86::R15;
446*9880d681SAndroid Build Coastguard Worker }
447*9880d681SAndroid Build Coastguard Worker }
448*9880d681SAndroid Build Coastguard Worker }
449*9880d681SAndroid Build Coastguard Worker
getX86SubSuperRegister(unsigned Reg,unsigned Size,bool High)450*9880d681SAndroid Build Coastguard Worker unsigned llvm::getX86SubSuperRegister(unsigned Reg, unsigned Size, bool High) {
451*9880d681SAndroid Build Coastguard Worker unsigned Res = getX86SubSuperRegisterOrZero(Reg, Size, High);
452*9880d681SAndroid Build Coastguard Worker assert(Res != 0 && "Unexpected register or VT");
453*9880d681SAndroid Build Coastguard Worker return Res;
454*9880d681SAndroid Build Coastguard Worker }
455*9880d681SAndroid Build Coastguard Worker
456*9880d681SAndroid Build Coastguard Worker
457