[llvm-commits] CVS: llvm/lib/Target/X86/Makefile X86.h X86.td X86Subtarget.cpp X86Subtarget.h X86TargetMachine.cpp

Evan Cheng evan.cheng at apple.com
Thu Jan 26 01:53:17 PST 2006



Changes in directory llvm/lib/Target/X86:

Makefile updated: 1.24 -> 1.25
X86.h updated: 1.39 -> 1.40
X86.td updated: 1.16 -> 1.17
X86Subtarget.cpp updated: 1.8 -> 1.9
X86Subtarget.h updated: 1.7 -> 1.8
X86TargetMachine.cpp updated: 1.97 -> 1.98
---
Log message:

Added preliminary x86 subtarget support.


---
Diffs of the changes:  (+158 -4)

 Makefile             |    3 +-
 X86.h                |    2 -
 X86.td               |   69 +++++++++++++++++++++++++++++++++++++++++++++++++++
 X86Subtarget.cpp     |   53 +++++++++++++++++++++++++++++++++++++++
 X86Subtarget.h       |   21 +++++++++++++++
 X86TargetMachine.cpp |   14 ++++++++--
 6 files changed, 158 insertions(+), 4 deletions(-)


Index: llvm/lib/Target/X86/Makefile
diff -u llvm/lib/Target/X86/Makefile:1.24 llvm/lib/Target/X86/Makefile:1.25
--- llvm/lib/Target/X86/Makefile:1.24	Tue Nov 15 19:54:32 2005
+++ llvm/lib/Target/X86/Makefile	Thu Jan 26 03:53:06 2006
@@ -13,7 +13,8 @@
 BUILT_SOURCES = X86GenRegisterInfo.h.inc X86GenRegisterNames.inc \
                 X86GenRegisterInfo.inc X86GenInstrNames.inc \
                 X86GenInstrInfo.inc X86GenAsmWriter.inc \
-                X86GenAsmWriter1.inc X86GenDAGISel.inc 
+                X86GenAsmWriter1.inc X86GenDAGISel.inc  \
+                X86GenSubtarget.inc
 
 include $(LEVEL)/Makefile.common
 


Index: llvm/lib/Target/X86/X86.h
diff -u llvm/lib/Target/X86/X86.h:1.39 llvm/lib/Target/X86/X86.h:1.40
--- llvm/lib/Target/X86/X86.h:1.39	Fri Dec 16 19:22:13 2005
+++ llvm/lib/Target/X86/X86.h	Thu Jan 26 03:53:06 2006
@@ -26,7 +26,7 @@
 class MachineCodeEmitter;
 
 enum X86VectorEnum {
-  NoSSE, SSE, SSE2, SSE3
+  AutoDetect, NoSSE, SSE, SSE2, SSE3
 };
 
 extern X86VectorEnum X86Vector;


Index: llvm/lib/Target/X86/X86.td
diff -u llvm/lib/Target/X86/X86.td:1.16 llvm/lib/Target/X86/X86.td:1.17
--- llvm/lib/Target/X86/X86.td:1.16	Thu Jul 14 19:38:55 2005
+++ llvm/lib/Target/X86/X86.td	Thu Jan 26 03:53:06 2006
@@ -17,6 +17,75 @@
 include "../Target.td"
 
 //===----------------------------------------------------------------------===//
+// X86 Subtarget features.
+//
+ 
+def Feature64Bit     : SubtargetFeature<"64bit", "bool", "Is64Bit",
+                                        "Enable 64-bit instructions">;
+def FeatureMMX       : SubtargetFeature<"mmx", "bool", "HasMMX",
+                                        "Enable MMX instructions">;
+def FeatureSSE       : SubtargetFeature<"sse", "bool", "HasSSE",
+                                        "Enable SSE instructions">;
+def FeatureSSE2      : SubtargetFeature<"sse2", "bool", "HasSSE2",
+                                        "Enable SSE2 instructions">;
+def FeatureSSE3      : SubtargetFeature<"sse3", "bool", "HasSSE3",
+                                        "Enable SSE3 instructions">;
+def Feature3DNow     : SubtargetFeature<"3dnow", "bool", "Has3DNow",
+                                        "Enable 3DNow! instructions">;
+def Feature3DNowA    : SubtargetFeature<"3dnowa", "bool", "Has3DNowA",
+                                        "Enable 3DNow! Athlon instructions">;
+
+//===----------------------------------------------------------------------===//
+// X86 processors supported.
+//===----------------------------------------------------------------------===//
+
+class Proc<string Name, list<SubtargetFeature> Features>
+ : Processor<Name, NoItineraries, Features>;
+
+def : Proc<"generic",         []>;
+def : Proc<"i386",            []>;
+def : Proc<"i486",            []>;
+def : Proc<"i586",            []>;
+def : Proc<"pentium",         []>;
+def : Proc<"pentium-mmx",     [FeatureMMX]>;
+def : Proc<"i686",            []>;
+def : Proc<"pentiumpro",      []>;
+def : Proc<"pentium2",        [FeatureMMX]>;
+def : Proc<"celeron",         [FeatureMMX]>;
+def : Proc<"pentium3",        [FeatureMMX, FeatureSSE]>;
+def : Proc<"pentium3m",       [FeatureMMX, FeatureSSE]>;
+def : Proc<"pentium-m",       [FeatureMMX, FeatureSSE, FeatureSSE2]>;
+def : Proc<"pentium4",        [FeatureMMX, FeatureSSE, FeatureSSE2]>;
+def : Proc<"pentium4m",       [FeatureMMX, FeatureSSE, FeatureSSE2]>;
+def : Proc<"prescott",        [FeatureMMX, FeatureSSE, FeatureSSE2,
+                               FeatureSSE3]>;
+def : Proc<"x86-64",          [FeatureMMX, FeatureSSE, FeatureSSE2, Feature64Bit]>;
+def : Proc<"nocona",          [FeatureMMX, FeatureSSE, FeatureSSE2,
+                               FeatureSSE3, Feature64Bit]>;
+
+def : Proc<"k6",              [FeatureMMX]>;
+def : Proc<"k6-2",            [FeatureMMX, Feature3DNow]>;
+def : Proc<"k6-3",            [FeatureMMX, Feature3DNow]>;
+def : Proc<"athlon",          [FeatureMMX, Feature3DNow, Feature3DNowA]>;
+def : Proc<"athlon-tbird",    [FeatureMMX, Feature3DNow, Feature3DNowA]>;
+def : Proc<"athlon-4",        [FeatureMMX, FeatureSSE, Feature3DNow, Feature3DNowA]>;
+def : Proc<"athlon-xp",       [FeatureMMX, FeatureSSE, Feature3DNow, Feature3DNowA]>;
+def : Proc<"athlon-mp",       [FeatureMMX, FeatureSSE, Feature3DNow, Feature3DNowA]>;
+def : Proc<"k8",              [FeatureMMX, FeatureSSE, FeatureSSE2, Feature3DNow,
+                               Feature3DNowA, Feature64Bit]>;
+def : Proc<"opteron",         [FeatureMMX, FeatureSSE, FeatureSSE2, Feature3DNow,
+                               Feature3DNowA, Feature64Bit]>;
+def : Proc<"athlon64",        [FeatureMMX, FeatureSSE, FeatureSSE2, Feature3DNow,
+                               Feature3DNowA, Feature64Bit]>;
+def : Proc<"athlon-fx",       [FeatureMMX, FeatureSSE, FeatureSSE2, Feature3DNow,
+                               Feature3DNowA, Feature64Bit]>;
+
+def : Proc<"winchip-c6",      [FeatureMMX]>;
+def : Proc<"winchip2",        [FeatureMMX, Feature3DNow]>;
+def : Proc<"c3",              [FeatureMMX, Feature3DNow]>;
+def : Proc<"c3-2",            [FeatureMMX, FeatureSSE]>;
+
+//===----------------------------------------------------------------------===//
 // Register File Description
 //===----------------------------------------------------------------------===//
 


Index: llvm/lib/Target/X86/X86Subtarget.cpp
diff -u llvm/lib/Target/X86/X86Subtarget.cpp:1.8 llvm/lib/Target/X86/X86Subtarget.cpp:1.9
--- llvm/lib/Target/X86/X86Subtarget.cpp:1.8	Mon Nov 21 16:43:58 2005
+++ llvm/lib/Target/X86/X86Subtarget.cpp	Thu Jan 26 03:53:06 2006
@@ -13,11 +13,64 @@
 
 #include "X86Subtarget.h"
 #include "llvm/Module.h"
+#include "X86GenSubtarget.inc"
 using namespace llvm;
 
+#if defined(__APPLE__)
+#include <mach/mach.h>
+#include <mach/mach_host.h>
+#include <mach/host_info.h>
+#include <mach/machine.h>
+
+/// GetCurrentX86CPU - Returns the current CPUs features.
+static const char *GetCurrentX86CPU() {
+  host_basic_info_data_t hostInfo;
+  mach_msg_type_number_t infoCount;
+
+  infoCount = HOST_BASIC_INFO_COUNT;
+  host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&hostInfo, 
+            &infoCount);
+            
+  if (hostInfo.cpu_type != CPU_TYPE_I386) return "generic";
+
+  switch(hostInfo.cpu_subtype) {
+  case CPU_SUBTYPE_386:            return "i386";
+  case CPU_SUBTYPE_486:
+  case CPU_SUBTYPE_486SX:          return "i486";
+  case CPU_SUBTYPE_PENT:           return "pentium";
+  case CPU_SUBTYPE_PENTPRO:        return "pentiumpro";
+  case CPU_SUBTYPE_PENTII_M3:      return "pentium2";
+  case CPU_SUBTYPE_PENTII_M5:      return "pentium2";
+  case CPU_SUBTYPE_CELERON:
+  case CPU_SUBTYPE_CELERON_MOBILE: return "celeron";
+  case CPU_SUBTYPE_PENTIUM_3:      return "pentium3";
+  case CPU_SUBTYPE_PENTIUM_3_M:    return "pentium3m";
+  case CPU_SUBTYPE_PENTIUM_3_XEON: return "pentium3";   // FIXME: not sure.
+  case CPU_SUBTYPE_PENTIUM_M:      return "pentium-m";
+  case CPU_SUBTYPE_PENTIUM_4:      return "pentium4";
+  case CPU_SUBTYPE_PENTIUM_4_M:    return "pentium4m";
+  // FIXME: prescott, yonah? Check CPU_THREADTYPE_INTEL_HTT?
+  case CPU_SUBTYPE_XEON:
+  case CPU_SUBTYPE_XEON_MP:        return "nocona";
+  default: ;
+  }
+  
+  return "generic";
+}
+#endif
+
 X86Subtarget::X86Subtarget(const Module &M, const std::string &FS)
   : stackAlignment(8), indirectExternAndWeakGlobals(false) {
       
+  // Determine default and user specified characteristics
+  std::string CPU = "generic";
+#if defined(__APPLE__)
+  CPU = GetCurrentX86CPU();
+#endif
+
+  // Parse features string.
+  ParseSubtargetFeatures(FS, CPU);
+
   // Default to ELF unless otherwise specified.
   TargetType = isELF;
       


Index: llvm/lib/Target/X86/X86Subtarget.h
diff -u llvm/lib/Target/X86/X86Subtarget.h:1.7 llvm/lib/Target/X86/X86Subtarget.h:1.8
--- llvm/lib/Target/X86/X86Subtarget.h:1.7	Mon Nov 21 16:43:58 2005
+++ llvm/lib/Target/X86/X86Subtarget.h	Thu Jan 26 03:53:06 2006
@@ -30,6 +30,14 @@
   /// Used by instruction selector
   bool indirectExternAndWeakGlobals;
 
+  /// Arch. features used by isel.
+  bool Is64Bit;
+  bool HasMMX;
+  bool HasSSE;
+  bool HasSSE2;
+  bool HasSSE3;
+  bool Has3DNow;
+  bool Has3DNowA;
 public:
   enum {
     isELF, isCygwin, isDarwin, isWindows
@@ -51,6 +59,19 @@
   bool getIndirectExternAndWeakGlobals() const {
     return indirectExternAndWeakGlobals;
   }
+
+  /// ParseSubtargetFeatures - Parses features string setting specified 
+  /// subtarget options.  Definition of function is auto generated by tblgen.
+  void ParseSubtargetFeatures(const std::string &FS, const std::string &CPU);
+
+  bool is64Bit() const { return Is64Bit; }
+
+  bool hasMMX() const { return HasMMX; }
+  bool hasSSE() const { return HasSSE; }
+  bool hasSSE2() const { return HasSSE2; }
+  bool hasSSE3() const { return HasSSE3; }
+  bool has3DNow() const { return Has3DNow; }
+  bool has3DNowA() const { return Has3DNowA; }
 };
 } // End llvm namespace
 


Index: llvm/lib/Target/X86/X86TargetMachine.cpp
diff -u llvm/lib/Target/X86/X86TargetMachine.cpp:1.97 llvm/lib/Target/X86/X86TargetMachine.cpp:1.98
--- llvm/lib/Target/X86/X86TargetMachine.cpp:1.97	Sun Jan 22 17:37:17 2006
+++ llvm/lib/Target/X86/X86TargetMachine.cpp	Thu Jan 26 03:53:06 2006
@@ -26,7 +26,7 @@
 #include <iostream>
 using namespace llvm;
 
-X86VectorEnum llvm::X86Vector = NoSSE;
+X86VectorEnum llvm::X86Vector = AutoDetect;
 bool llvm::X86ScalarSSE = false;
 bool llvm::X86DAGIsel = false;
 
@@ -61,7 +61,7 @@
        clEnumValN(SSE2, "sse2", "  Enable SSE and SSE2 support"),
        clEnumValN(SSE3, "sse3", "  Enable SSE, SSE2, and SSE3 support"),
        clEnumValEnd),
-    cl::location(X86Vector), cl::init(NoSSE));
+    cl::location(X86Vector), cl::init(AutoDetect));
 
   // Register the target.
   RegisterTarget<X86TargetMachine> X("x86", "  IA-32 (Pentium and above)");
@@ -102,6 +102,16 @@
     FrameInfo(TargetFrameInfo::StackGrowsDown,
               Subtarget.getStackAlignment(), -4),
     JITInfo(*this) {
+  if (X86Vector == AutoDetect) {
+      X86Vector = NoSSE;
+    if (Subtarget.hasSSE())
+      X86Vector = SSE;
+    if (Subtarget.hasSSE2())
+      X86Vector = SSE2;
+    if (Subtarget.hasSSE3())
+      X86Vector = SSE3;
+  }
+
   // Scalar SSE FP requires at least SSE2
   X86ScalarSSE &= X86Vector >= SSE2;
 






More information about the llvm-commits mailing list