From: Craig Topper Date: Wed, 21 Aug 2013 05:29:10 +0000 (+0000) Subject: Add avx512cd, avx512er, avx512pf feature flags and enable them on KNL CPU. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bca2c4fab5c67a9121c96f15fb5caf09c25cf8f6;p=clang Add avx512cd, avx512er, avx512pf feature flags and enable them on KNL CPU. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@188867 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td index 1a98b7d22c..5bb63cb522 100644 --- a/include/clang/Driver/Options.td +++ b/include/clang/Driver/Options.td @@ -969,6 +969,9 @@ def mno_aes : Flag<["-"], "mno-aes">, Group; def mno_avx : Flag<["-"], "mno-avx">, Group; def mno_avx2 : Flag<["-"], "mno-avx2">, Group; def mno_avx512f : Flag<["-"], "mno-avx512f">, Group; +def mno_avx512cd : Flag<["-"], "mno-avx512cd">, Group; +def mno_avx512er : Flag<["-"], "mno-avx512er">, Group; +def mno_avx512pd : Flag<["-"], "mno-avx512pd">, Group; def mno_pclmul : Flag<["-"], "mno-pclmul">, Group; def mno_lzcnt : Flag<["-"], "mno-lzcnt">, Group; def mno_rdrnd : Flag<["-"], "mno-rdrnd">, Group; @@ -1016,6 +1019,9 @@ def maes : Flag<["-"], "maes">, Group; def mavx : Flag<["-"], "mavx">, Group; def mavx2 : Flag<["-"], "mavx2">, Group; def mavx512f : Flag<["-"], "mavx512f">, Group; +def mavx512cd : Flag<["-"], "mavx512cd">, Group; +def mavx512er : Flag<["-"], "mavx512er">, Group; +def mavx512pd : Flag<["-"], "mavx512pd">, Group; def mpclmul : Flag<["-"], "mpclmul">, Group; def mlzcnt : Flag<["-"], "mlzcnt">, Group; def mrdrnd : Flag<["-"], "mrdrnd">, Group; diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index 8816ac3bb4..d5392fb238 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -1562,6 +1562,7 @@ class X86TargetInfo : public TargetInfo { bool HasRDSEED; bool HasFMA; bool HasF16C; + bool HasAVX512CD, HasAVX512ER, HasAVX512PF; /// \brief Enumeration of all of the X86 CPUs supported by Clang. /// @@ -1714,7 +1715,8 @@ public: XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false), HasRDRND(false), HasBMI(false), HasBMI2(false), HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false), HasFMA(false), - HasF16C(false), CPU(CK_Generic) { + HasF16C(false), HasAVX512CD(false), HasAVX512ER(false), + HasAVX512PF(false), CPU(CK_Generic) { BigEndian = false; LongDoubleFormat = &llvm::APFloat::x87DoubleExtended; } @@ -1980,7 +1982,10 @@ void X86TargetInfo::getDefaultFeatures(llvm::StringMap &Features) const { setFeatureEnabled(Features, "fma", true); break; case CK_KNL: - setFeatureEnabled(Features, "avx-512", true); + setFeatureEnabled(Features, "avx512f", true); + setFeatureEnabled(Features, "avx512cd", true); + setFeatureEnabled(Features, "avx512er", true); + setFeatureEnabled(Features, "avx512pf", true); setFeatureEnabled(Features, "aes", true); setFeatureEnabled(Features, "pclmul", true); setFeatureEnabled(Features, "lzcnt", true); @@ -2119,7 +2124,8 @@ void X86TargetInfo::setSSELevel(llvm::StringMap &Features, case AVX2: Features["avx2"] = false; case AVX512F: - Features["avx512f"] = false; + Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] = + Features["avx512pf"] = false; } } @@ -2221,9 +2227,12 @@ void X86TargetInfo::setFeatureEnabled(llvm::StringMap &Features, setSSELevel(Features, AVX, Enabled); else if (Name == "avx2") setSSELevel(Features, AVX2, Enabled); - else if (Name == "avx-512") + else if (Name == "avx512f") setSSELevel(Features, AVX512F, Enabled); - else if (Name == "fma") { + else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf") { + if (Enabled) + setSSELevel(Features, AVX512F, Enabled); + } else if (Name == "fma") { if (Enabled) setSSELevel(Features, AVX, Enabled); } else if (Name == "fma4") { @@ -2306,9 +2315,24 @@ void X86TargetInfo::HandleTargetFeatures(std::vector &Features) { continue; } + if (Feature == "avx512cd") { + HasAVX512CD = true; + continue; + } + + if (Feature == "avx512er") { + HasAVX512ER = true; + continue; + } + + if (Feature == "avx512pf") { + HasAVX512PF = true; + continue; + } + assert(Features[i][0] == '+' && "Invalid target feature!"); X86SSEEnum Level = llvm::StringSwitch(Feature) - .Case("avx-512", AVX512F) + .Case("avx512f", AVX512F) .Case("avx2", AVX2) .Case("avx", AVX) .Case("sse42", SSE42) @@ -2541,6 +2565,13 @@ void X86TargetInfo::getTargetDefines(const LangOptions &Opts, if (HasF16C) Builder.defineMacro("__F16C__"); + if (HasAVX512CD) + Builder.defineMacro("__AVX512CD__"); + if (HasAVX512ER) + Builder.defineMacro("__AVX512ER__"); + if (HasAVX512PF) + Builder.defineMacro("__AVX512PF__"); + // Each case falls through to the previous one here. switch (SSELevel) { case AVX512F: @@ -2614,6 +2645,9 @@ bool X86TargetInfo::hasFeature(StringRef Feature) const { .Case("avx", SSELevel >= AVX) .Case("avx2", SSELevel >= AVX2) .Case("avx512f", SSELevel >= AVX512F) + .Case("avx512cd", HasAVX512CD) + .Case("avx512er", HasAVX512ER) + .Case("avx512pf", HasAVX512PF) .Case("bmi", HasBMI) .Case("bmi2", HasBMI2) .Case("fma", HasFMA) diff --git a/test/Preprocessor/predefined-arch-macros.c b/test/Preprocessor/predefined-arch-macros.c index 5d20ca012a..57b819f333 100644 --- a/test/Preprocessor/predefined-arch-macros.c +++ b/test/Preprocessor/predefined-arch-macros.c @@ -570,7 +570,10 @@ // RUN: | FileCheck %s -check-prefix=CHECK_KNL_M32 // CHECK_KNL_M32: #define __AES__ 1 // CHECK_KNL_M32: #define __AVX2__ 1 +// CHECK_KNL_M32: #define __AVX512CD__ 1 +// CHECK_KNL_M32: #define __AVX512ER__ 1 // CHECK_KNL_M32: #define __AVX512F__ 1 +// CHECK_KNL_M32: #define __AVX512PF__ 1 // CHECK_KNL_M32: #define __AVX__ 1 // CHECK_KNL_M32: #define __BMI2__ 1 // CHECK_KNL_M32: #define __BMI__ 1 @@ -599,7 +602,10 @@ // RUN: | FileCheck %s -check-prefix=CHECK_KNL_M64 // CHECK_KNL_M64: #define __AES__ 1 // CHECK_KNL_M64: #define __AVX2__ 1 +// CHECK_KNL_M64: #define __AVX512CD__ 1 +// CHECK_KNL_M64: #define __AVX512ER__ 1 // CHECK_KNL_M64: #define __AVX512F__ 1 +// CHECK_KNL_M64: #define __AVX512PF__ 1 // CHECK_KNL_M64: #define __AVX__ 1 // CHECK_KNL_M64: #define __BMI2__ 1 // CHECK_KNL_M64: #define __BMI__ 1