]> granicus.if.org Git - clang/commitdiff
Add plumbing to support programatically defining __SSE2__ and friends,
authorChris Lattner <sabre@nondot.org>
Mon, 2 Mar 2009 22:40:39 +0000 (22:40 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 2 Mar 2009 22:40:39 +0000 (22:40 +0000)
even though we still hard code sse2 for now.  No support for 3dnow or sse4a,
but someone could add that if they desired.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@65886 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Basic/Targets.cpp

index b983f26bb343ad16d0e43ccd3fb1294c8d8c59d8..bb9c861a17094821da0d56d6ee0684a81a78925b 100644 (file)
@@ -415,8 +415,12 @@ const TargetInfo::GCCRegAlias GCCRegAliases[] = {
 // X86 target abstract base class; x86-32 and x86-64 are very close, so
 // most of the implementation can be shared.
 class X86TargetInfo : public TargetInfo {
+  enum X86SSEEnum {
+    NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42
+  } SSELevel;
 public:
-  X86TargetInfo(const std::string& triple) : TargetInfo(triple) {
+  X86TargetInfo(const std::string& triple) 
+    : TargetInfo(triple), SSELevel(SSE2) {
     LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
   }
   virtual void getTargetBuiltins(const Builtin::Info *&Records,
@@ -485,12 +489,29 @@ void X86TargetInfo::getTargetDefines(std::vector<char> &Defs) const {
   Define(Defs, "__nocona");
   Define(Defs, "__nocona__");
   Define(Defs, "__tune_nocona__");
-  Define(Defs, "__SSE2_MATH__");
-  Define(Defs, "__SSE2__");
-  Define(Defs, "__SSE_MATH__");
-  Define(Defs, "__SSE__");
-  Define(Defs, "__MMX__");
   Define(Defs, "__REGISTER_PREFIX__", "");
+
+  // Each case falls through to the previous one here.
+  switch (SSELevel) {
+  case SSE42:
+    Define(Defs, "__SSE4_2__");
+  case SSE41:
+    Define(Defs, "__SSE4_1__");
+  case SSSE3:
+    Define(Defs, "__SSSE3__");
+  case SSE3:
+    Define(Defs, "__SSE3__");
+  case SSE2:
+    Define(Defs, "__SSE2__");
+    Define(Defs, "__SSE2_MATH__");  // -mfp-math=sse always implied.
+  case SSE1:
+    Define(Defs, "__SSE__");
+    Define(Defs, "__SSE_MATH__");   // -mfp-math=sse always implied.
+  case MMX:
+    Define(Defs, "__MMX__");
+  case NoMMXSSE:
+    break;
+  }
 }