X86JITInfo::getLazyResolverFunction() should not read cpu id to determine whether...
[oota-llvm.git] / lib / Target / X86 / X86Subtarget.cpp
1 //===-- X86Subtarget.cpp - X86 Subtarget Information ------------*- C++ -*-===//
2 //
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 //
10 // This file implements the X86 specific subclass of TargetSubtarget.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #define DEBUG_TYPE "subtarget"
15 #include "X86Subtarget.h"
16 #include "X86InstrInfo.h"
17 #include "X86GenSubtarget.inc"
18 #include "llvm/GlobalValue.h"
19 #include "llvm/Support/Debug.h"
20 #include "llvm/Support/raw_ostream.h"
21 #include "llvm/Target/TargetMachine.h"
22 #include "llvm/Target/TargetOptions.h"
23 using namespace llvm;
24
25 #if defined(_MSC_VER)
26 #include <intrin.h>
27 #endif
28
29 /// ClassifyGlobalReference - Classify a global variable reference for the
30 /// current subtarget according to how we should reference it in a non-pcrel
31 /// context.
32 unsigned char X86Subtarget::
33 ClassifyGlobalReference(const GlobalValue *GV, const TargetMachine &TM) const {
34   // DLLImport only exists on windows, it is implemented as a load from a
35   // DLLIMPORT stub.
36   if (GV->hasDLLImportLinkage())
37     return X86II::MO_DLLIMPORT;
38
39   // GV with ghost linkage (in JIT lazy compilation mode) do not require an
40   // extra load from stub.
41   bool isDecl = GV->isDeclaration() && !GV->hasNotBeenReadFromBitcode();
42
43   // X86-64 in PIC mode.
44   if (isPICStyleRIPRel()) {
45     // Large model never uses stubs.
46     if (TM.getCodeModel() == CodeModel::Large)
47       return X86II::MO_NO_FLAG;
48       
49     if (isTargetDarwin()) {
50       // If symbol visibility is hidden, the extra load is not needed if
51       // target is x86-64 or the symbol is definitely defined in the current
52       // translation unit.
53       if (GV->hasDefaultVisibility() &&
54           (isDecl || GV->isWeakForLinker()))
55         return X86II::MO_GOTPCREL;
56     } else {
57       assert(isTargetELF() && "Unknown rip-relative target");
58
59       // Extra load is needed for all externally visible.
60       if (!GV->hasLocalLinkage() && GV->hasDefaultVisibility())
61         return X86II::MO_GOTPCREL;
62     }
63
64     return X86II::MO_NO_FLAG;
65   }
66   
67   if (isPICStyleGOT()) {   // 32-bit ELF targets.
68     // Extra load is needed for all externally visible.
69     if (GV->hasLocalLinkage() || GV->hasHiddenVisibility())
70       return X86II::MO_GOTOFF;
71     return X86II::MO_GOT;
72   }
73   
74   if (isPICStyleStubPIC()) {  // Darwin/32 in PIC mode.
75     // Determine whether we have a stub reference and/or whether the reference
76     // is relative to the PIC base or not.
77     
78     // If this is a strong reference to a definition, it is definitely not
79     // through a stub.
80     if (!isDecl && !GV->isWeakForLinker())
81       return X86II::MO_PIC_BASE_OFFSET;
82
83     // Unless we have a symbol with hidden visibility, we have to go through a
84     // normal $non_lazy_ptr stub because this symbol might be resolved late.
85     if (!GV->hasHiddenVisibility())  // Non-hidden $non_lazy_ptr reference.
86       return X86II::MO_DARWIN_NONLAZY_PIC_BASE;
87     
88     // If symbol visibility is hidden, we have a stub for common symbol
89     // references and external declarations.
90     if (isDecl || GV->hasCommonLinkage()) {
91       // Hidden $non_lazy_ptr reference.
92       return X86II::MO_DARWIN_HIDDEN_NONLAZY_PIC_BASE;
93     }
94     
95     // Otherwise, no stub.
96     return X86II::MO_PIC_BASE_OFFSET;
97   }
98   
99   if (isPICStyleStubNoDynamic()) {  // Darwin/32 in -mdynamic-no-pic mode.
100     // Determine whether we have a stub reference.
101     
102     // If this is a strong reference to a definition, it is definitely not
103     // through a stub.
104     if (!isDecl && !GV->isWeakForLinker())
105       return X86II::MO_NO_FLAG;
106     
107     // Unless we have a symbol with hidden visibility, we have to go through a
108     // normal $non_lazy_ptr stub because this symbol might be resolved late.
109     if (!GV->hasHiddenVisibility())  // Non-hidden $non_lazy_ptr reference.
110       return X86II::MO_DARWIN_NONLAZY;
111     
112     // If symbol visibility is hidden, we have a stub for common symbol
113     // references and external declarations.
114     if (isDecl || GV->hasCommonLinkage()) {
115       // Hidden $non_lazy_ptr reference.
116       return X86II::MO_DARWIN_HIDDEN_NONLAZY;
117     }
118     
119     // Otherwise, no stub.
120     return X86II::MO_NO_FLAG;
121   }
122   
123   // Direct static reference to global.
124   return X86II::MO_NO_FLAG;
125 }
126
127
128 /// getBZeroEntry - This function returns the name of a function which has an
129 /// interface like the non-standard bzero function, if such a function exists on
130 /// the current subtarget and it is considered prefereable over memset with zero
131 /// passed as the second argument. Otherwise it returns null.
132 const char *X86Subtarget::getBZeroEntry() const {
133   // Darwin 10 has a __bzero entry point for this purpose.
134   if (getDarwinVers() >= 10)
135     return "__bzero";
136
137   return 0;
138 }
139
140 /// IsLegalToCallImmediateAddr - Return true if the subtarget allows calls
141 /// to immediate address.
142 bool X86Subtarget::IsLegalToCallImmediateAddr(const TargetMachine &TM) const {
143   if (Is64Bit)
144     return false;
145   return isTargetELF() || TM.getRelocationModel() == Reloc::Static;
146 }
147
148 /// getSpecialAddressLatency - For targets where it is beneficial to
149 /// backschedule instructions that compute addresses, return a value
150 /// indicating the number of scheduling cycles of backscheduling that
151 /// should be attempted.
152 unsigned X86Subtarget::getSpecialAddressLatency() const {
153   // For x86 out-of-order targets, back-schedule address computations so
154   // that loads and stores aren't blocked.
155   // This value was chosen arbitrarily.
156   return 200;
157 }
158
159 /// GetCpuIDAndInfo - Execute the specified cpuid and return the 4 values in the
160 /// specified arguments.  If we can't run cpuid on the host, return true.
161 bool
162 X86Subtarget::GetCpuIDAndInfo(unsigned value, unsigned *rEAX,
163                               unsigned *rEBX, unsigned *rECX, unsigned *rEDX) {
164 #if defined(__x86_64__) || defined(_M_AMD64) || defined (_M_X64)
165   #if defined(__GNUC__)
166     // gcc doesn't know cpuid would clobber ebx/rbx. Preseve it manually.
167     asm ("movq\t%%rbx, %%rsi\n\t"
168          "cpuid\n\t"
169          "xchgq\t%%rbx, %%rsi\n\t"
170          : "=a" (*rEAX),
171            "=S" (*rEBX),
172            "=c" (*rECX),
173            "=d" (*rEDX)
174          :  "a" (value));
175     return false;
176   #elif defined(_MSC_VER)
177     int registers[4];
178     __cpuid(registers, value);
179     *rEAX = registers[0];
180     *rEBX = registers[1];
181     *rECX = registers[2];
182     *rEDX = registers[3];
183     return false;
184   #endif
185 #elif defined(i386) || defined(__i386__) || defined(__x86__) || defined(_M_IX86)
186   #if defined(__GNUC__)
187     asm ("movl\t%%ebx, %%esi\n\t"
188          "cpuid\n\t"
189          "xchgl\t%%ebx, %%esi\n\t"
190          : "=a" (*rEAX),
191            "=S" (*rEBX),
192            "=c" (*rECX),
193            "=d" (*rEDX)
194          :  "a" (value));
195     return false;
196   #elif defined(_MSC_VER)
197     __asm {
198       mov   eax,value
199       cpuid
200       mov   esi,rEAX
201       mov   dword ptr [esi],eax
202       mov   esi,rEBX
203       mov   dword ptr [esi],ebx
204       mov   esi,rECX
205       mov   dword ptr [esi],ecx
206       mov   esi,rEDX
207       mov   dword ptr [esi],edx
208     }
209     return false;
210   #endif
211 #endif
212   return true;
213 }
214
215 static void DetectFamilyModel(unsigned EAX, unsigned &Family, unsigned &Model) {
216   Family = (EAX >> 8) & 0xf; // Bits 8 - 11
217   Model  = (EAX >> 4) & 0xf; // Bits 4 - 7
218   if (Family == 6 || Family == 0xf) {
219     if (Family == 0xf)
220       // Examine extended family ID if family ID is F.
221       Family += (EAX >> 20) & 0xff;    // Bits 20 - 27
222     // Examine extended model ID if family ID is 6 or F.
223     Model += ((EAX >> 16) & 0xf) << 4; // Bits 16 - 19
224   }
225 }
226
227 void X86Subtarget::AutoDetectSubtargetFeatures() {
228   unsigned EAX = 0, EBX = 0, ECX = 0, EDX = 0;
229   union {
230     unsigned u[3];
231     char     c[12];
232   } text;
233   
234   if (GetCpuIDAndInfo(0, &EAX, text.u+0, text.u+2, text.u+1))
235     return;
236
237   GetCpuIDAndInfo(0x1, &EAX, &EBX, &ECX, &EDX);
238   
239   if ((EDX >> 15) & 1) HasCMov = true;
240   if ((EDX >> 23) & 1) X86SSELevel = MMX;
241   if ((EDX >> 25) & 1) X86SSELevel = SSE1;
242   if ((EDX >> 26) & 1) X86SSELevel = SSE2;
243   if (ECX & 0x1)         X86SSELevel = SSE3;
244   if ((ECX >> 9)  & 1) X86SSELevel = SSSE3;
245   if ((ECX >> 19) & 1) X86SSELevel = SSE41;
246   if ((ECX >> 20) & 1) X86SSELevel = SSE42;
247
248   bool IsIntel = memcmp(text.c, "GenuineIntel", 12) == 0;
249   bool IsAMD   = !IsIntel && memcmp(text.c, "AuthenticAMD", 12) == 0;
250
251   HasFMA3 = IsIntel && ((ECX >> 12) & 0x1);
252   HasAVX = ((ECX >> 28) & 0x1);
253
254   if (IsIntel || IsAMD) {
255     // Determine if bit test memory instructions are slow.
256     unsigned Family = 0;
257     unsigned Model  = 0;
258     DetectFamilyModel(EAX, Family, Model);
259     IsBTMemSlow = IsAMD || (Family == 6 && Model >= 13);
260
261     GetCpuIDAndInfo(0x80000001, &EAX, &EBX, &ECX, &EDX);
262     HasX86_64 = (EDX >> 29) & 0x1;
263     HasSSE4A = IsAMD && ((ECX >> 6) & 0x1);
264     HasFMA4 = IsAMD && ((ECX >> 16) & 0x1);
265   }
266 }
267
268 const char *X86Subtarget::GetCurrentX86CPU() {
269   unsigned EAX = 0, EBX = 0, ECX = 0, EDX = 0;
270   if (GetCpuIDAndInfo(0x1, &EAX, &EBX, &ECX, &EDX))
271     return "generic";
272   unsigned Family = 0;
273   unsigned Model  = 0;
274   DetectFamilyModel(EAX, Family, Model);
275
276   GetCpuIDAndInfo(0x80000001, &EAX, &EBX, &ECX, &EDX);
277   bool Em64T = (EDX >> 29) & 0x1;
278   bool HasSSE3 = (ECX & 0x1);
279
280   union {
281     unsigned u[3];
282     char     c[12];
283   } text;
284
285   GetCpuIDAndInfo(0, &EAX, text.u+0, text.u+2, text.u+1);
286   if (memcmp(text.c, "GenuineIntel", 12) == 0) {
287     switch (Family) {
288       case 3:
289         return "i386";
290       case 4:
291         return "i486";
292       case 5:
293         switch (Model) {
294         case 4:  return "pentium-mmx";
295         default: return "pentium";
296         }
297       case 6:
298         switch (Model) {
299         case 1:  return "pentiumpro";
300         case 3:
301         case 5:
302         case 6:  return "pentium2";
303         case 7:
304         case 8:
305         case 10:
306         case 11: return "pentium3";
307         case 9:
308         case 13: return "pentium-m";
309         case 14: return "yonah";
310         case 15:
311         case 22: // Celeron M 540
312           return "core2";
313         case 23: // 45nm: Penryn , Wolfdale, Yorkfield (XE)
314           return "penryn";
315         default: return "i686";
316         }
317       case 15: {
318         switch (Model) {
319         case 3:  
320         case 4:
321         case 6: // same as 4, but 65nm
322           return (Em64T) ? "nocona" : "prescott";
323         case 26:
324           return "corei7";
325         case 28:
326           return "atom";
327         default:
328           return (Em64T) ? "x86-64" : "pentium4";
329         }
330       }
331         
332     default:
333       return "generic";
334     }
335   } else if (memcmp(text.c, "AuthenticAMD", 12) == 0) {
336     // FIXME: this poorly matches the generated SubtargetFeatureKV table.  There
337     // appears to be no way to generate the wide variety of AMD-specific targets
338     // from the information returned from CPUID.
339     switch (Family) {
340       case 4:
341         return "i486";
342       case 5:
343         switch (Model) {
344         case 6:
345         case 7:  return "k6";
346         case 8:  return "k6-2";
347         case 9:
348         case 13: return "k6-3";
349         default: return "pentium";
350         }
351       case 6:
352         switch (Model) {
353         case 4:  return "athlon-tbird";
354         case 6:
355         case 7:
356         case 8:  return "athlon-mp";
357         case 10: return "athlon-xp";
358         default: return "athlon";
359         }
360       case 15:
361         if (HasSSE3) {
362           return "k8-sse3";
363         } else {
364           switch (Model) {
365           case 1:  return "opteron";
366           case 5:  return "athlon-fx"; // also opteron
367           default: return "athlon64";
368           }
369         }
370       case 16:
371         return "amdfam10";
372     default:
373       return "generic";
374     }
375   } else {
376     return "generic";
377   }
378 }
379
380 X86Subtarget::X86Subtarget(const std::string &TT, const std::string &FS, 
381                            bool is64Bit)
382   : PICStyle(PICStyles::None)
383   , X86SSELevel(NoMMXSSE)
384   , X863DNowLevel(NoThreeDNow)
385   , HasCMov(false)
386   , HasX86_64(false)
387   , HasSSE4A(false)
388   , HasAVX(false)
389   , HasFMA3(false)
390   , HasFMA4(false)
391   , IsBTMemSlow(false)
392   , DarwinVers(0)
393   , IsLinux(false)
394   , stackAlignment(8)
395   // FIXME: this is a known good value for Yonah. How about others?
396   , MaxInlineSizeThreshold(128)
397   , Is64Bit(is64Bit)
398   , TargetType(isELF) { // Default to ELF unless otherwise specified.
399
400   // default to hard float ABI
401   if (FloatABIType == FloatABI::Default)
402     FloatABIType = FloatABI::Hard;
403     
404   // Determine default and user specified characteristics
405   if (!FS.empty()) {
406     // If feature string is not empty, parse features string.
407     std::string CPU = GetCurrentX86CPU();
408     ParseSubtargetFeatures(FS, CPU);
409     // All X86-64 CPUs also have SSE2, however user might request no SSE via 
410     // -mattr, so don't force SSELevel here.
411   } else {
412     // Otherwise, use CPUID to auto-detect feature set.
413     AutoDetectSubtargetFeatures();
414     // Make sure SSE2 is enabled; it is available on all X86-64 CPUs.
415     if (Is64Bit && X86SSELevel < SSE2)
416       X86SSELevel = SSE2;
417   }
418
419   // If requesting codegen for X86-64, make sure that 64-bit features
420   // are enabled.
421   if (Is64Bit)
422     HasX86_64 = true;
423
424   DEBUG(errs() << "Subtarget features: SSELevel " << X86SSELevel
425                << ", 3DNowLevel " << X863DNowLevel
426                << ", 64bit " << HasX86_64 << "\n");
427   assert((!Is64Bit || HasX86_64) &&
428          "64-bit code requested on a subtarget that doesn't support it!");
429
430   // Set the boolean corresponding to the current target triple, or the default
431   // if one cannot be determined, to true.
432   if (TT.length() > 5) {
433     size_t Pos;
434     if ((Pos = TT.find("-darwin")) != std::string::npos) {
435       TargetType = isDarwin;
436       
437       // Compute the darwin version number.
438       if (isdigit(TT[Pos+7]))
439         DarwinVers = atoi(&TT[Pos+7]);
440       else
441         DarwinVers = 8;  // Minimum supported darwin is Tiger.
442     } else if (TT.find("linux") != std::string::npos) {
443       // Linux doesn't imply ELF, but we don't currently support anything else.
444       TargetType = isELF;
445       IsLinux = true;
446     } else if (TT.find("cygwin") != std::string::npos) {
447       TargetType = isCygwin;
448     } else if (TT.find("mingw") != std::string::npos) {
449       TargetType = isMingw;
450     } else if (TT.find("win32") != std::string::npos) {
451       TargetType = isWindows;
452     } else if (TT.find("windows") != std::string::npos) {
453       TargetType = isWindows;
454     } else if (TT.find("-cl") != std::string::npos) {
455       TargetType = isDarwin;
456       DarwinVers = 9;
457     }
458   }
459
460   // Stack alignment is 16 bytes on Darwin (both 32 and 64 bit) and for all 64
461   // bit targets.
462   if (TargetType == isDarwin || Is64Bit)
463     stackAlignment = 16;
464
465   if (StackAlignment)
466     stackAlignment = StackAlignment;
467 }