From: Craig Topper Date: Sun, 25 Dec 2011 05:06:45 +0000 (+0000) Subject: Add BMI, BMI2, and LZCNT feature flags to enable adding intrinsics. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=31ceea096563c42e083eded27f6fe19ed244c0a1;p=clang Add BMI, BMI2, and LZCNT feature flags to enable adding intrinsics. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@147262 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td index 331b248bf9..aafea88a0f 100644 --- a/include/clang/Driver/Options.td +++ b/include/clang/Driver/Options.td @@ -612,6 +612,9 @@ def mno_ssse3 : Flag<"-mno-ssse3">, Group; def mno_aes : Flag<"-mno-aes">, Group; def mno_avx : Flag<"-mno-avx">, Group; def mno_avx2 : Flag<"-mno-avx2">, Group; +def mno_lzcnt : Flag<"-mno-lzcnt">, Group; +def mno_bmi : Flag<"-mno-bmi">, Group; +def mno_bmi2 : Flag<"-mno-bmi2">, Group; def mno_thumb : Flag<"-mno-thumb">, Group; def marm : Flag<"-marm">, Alias; @@ -637,6 +640,9 @@ def mssse3 : Flag<"-mssse3">, Group; def maes : Flag<"-maes">, Group; def mavx : Flag<"-mavx">, Group; def mavx2 : Flag<"-mavx2">, Group; +def mlzcnt : Flag<"-mlzcnt">, Group; +def mbmi : Flag<"-mbmi">, Group; +def mbmi2 : Flag<"-mbmi2">, Group; def mthumb : Flag<"-mthumb">, Group; def mtune_EQ : Joined<"-mtune=">, Group; def multi__module : Flag<"-multi_module">; diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index d61d3cd7cf..34258c1054 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -1195,6 +1195,9 @@ class X86TargetInfo : public TargetInfo { bool HasAES; bool HasAVX; bool HasAVX2; + bool HasLZCNT; + bool HasBMI; + bool HasBMI2; /// \brief Enumeration of all of the X86 CPUs supported by Clang. /// @@ -1331,7 +1334,8 @@ class X86TargetInfo : public TargetInfo { public: X86TargetInfo(const std::string& triple) : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow), - HasAES(false), HasAVX(false), HasAVX2(false), CPU(CK_Generic) { + HasAES(false), HasAVX(false), HasAVX2(false), HasLZCNT(false), + HasBMI(false), HasBMI2(false), CPU(CK_Generic) { BigEndian = false; LongDoubleFormat = &llvm::APFloat::x87DoubleExtended; } @@ -1508,6 +1512,9 @@ void X86TargetInfo::getDefaultFeatures(llvm::StringMap &Features) const { Features["aes"] = false; Features["avx"] = false; Features["avx2"] = false; + Features["lzcnt"] = false; + Features["bmi"] = false; + Features["bmi2"] = false; // FIXME: This *really* should not be here. @@ -1575,6 +1582,9 @@ void X86TargetInfo::getDefaultFeatures(llvm::StringMap &Features) const { setFeatureEnabled(Features, "mmx", true); setFeatureEnabled(Features, "sse4", true); setFeatureEnabled(Features, "aes", true); + setFeatureEnabled(Features, "lzcnt", true); + setFeatureEnabled(Features, "bmi", true); + setFeatureEnabled(Features, "bmi2", true); //setFeatureEnabled(Features, "avx2", true); break; case CK_K6: @@ -1675,6 +1685,12 @@ bool X86TargetInfo::setFeatureEnabled(llvm::StringMap &Features, Features["avx"] = Features["avx2"] = true; else if (Name == "sse4a") Features["mmx"] = Features["sse4a"] = true; + else if (Name == "lzcnt") + Features["lzcnt"] = true; + else if (Name == "bmi") + Features["bmi"] = true; + else if (Name == "bmi2") + Features["bmi2"] = true; } else { if (Name == "mmx") Features["mmx"] = Features["3dnow"] = Features["3dnowa"] = false; @@ -1705,6 +1721,12 @@ bool X86TargetInfo::setFeatureEnabled(llvm::StringMap &Features, Features["avx2"] = false; else if (Name == "sse4a") Features["sse4a"] = false; + else if (Name == "lzcnt") + Features["lzcnt"] = false; + else if (Name == "bmi") + Features["bmi"] = false; + else if (Name == "bmi2") + Features["bmi2"] = false; } return true; @@ -1724,6 +1746,21 @@ void X86TargetInfo::HandleTargetFeatures(std::vector &Features) { continue; } + if (Features[i].substr(1) == "lzcnt") { + HasLZCNT = true; + continue; + } + + if (Features[i].substr(1) == "bmi") { + HasBMI = true; + continue; + } + + if (Features[i].substr(1) == "bmi2") { + HasBMI2 = true; + continue; + } + // FIXME: Not sure yet how to treat AVX in regard to SSE levels. // For now let it be enabled together with other SSE levels. if (Features[i].substr(1) == "avx2") { @@ -1946,6 +1983,15 @@ void X86TargetInfo::getTargetDefines(const LangOptions &Opts, if (HasAVX2) Builder.defineMacro("__AVX2__"); + if (HasLZCNT) + Builder.defineMacro("__LZCNT__"); + + if (HasBMI) + Builder.defineMacro("__BMI__"); + + if (HasBMI2) + Builder.defineMacro("__BMI2__"); + // Each case falls through to the previous one here. switch (SSELevel) { case SSE42: diff --git a/lib/Headers/immintrin.h b/lib/Headers/immintrin.h index 80b24484a6..53838ec78b 100644 --- a/lib/Headers/immintrin.h +++ b/lib/Headers/immintrin.h @@ -48,7 +48,7 @@ #include #endif -#if defined (__AES__) || defined (__PCLMUL__) +#if defined (__AES__) #include #endif