From: Benjamin Kramer Date: Tue, 29 May 2012 17:48:39 +0000 (+0000) Subject: Define __SSE4A__ when targeting new AMD CPUs. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4dfa5ad7b1f70520f02c754750209138e94b6eb5;p=clang Define __SSE4A__ when targeting new AMD CPUs. This doesn't really fit the existing SSELevel so it gets an extra flag. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@157630 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index e5cbc3c0f4..21992363da 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -1242,6 +1242,7 @@ class X86TargetInfo : public TargetInfo { bool HasBMI; bool HasBMI2; bool HasPOPCNT; + bool HasSSE4a; bool HasFMA4; /// \brief Enumeration of all of the X86 CPUs supported by Clang. @@ -1388,7 +1389,7 @@ public: X86TargetInfo(const std::string& triple) : TargetInfo(triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow), HasAES(false), HasLZCNT(false), HasBMI(false), HasBMI2(false), - HasPOPCNT(false), HasFMA4(false), CPU(CK_Generic) { + HasPOPCNT(false), HasSSE4a(false), HasFMA4(false), CPU(CK_Generic) { BigEndian = false; LongDoubleFormat = &llvm::APFloat::x87DoubleExtended; } @@ -1843,6 +1844,11 @@ void X86TargetInfo::HandleTargetFeatures(std::vector &Features) { continue; } + if (Feature == "sse4a") { + HasSSE4a = true; + continue; + } + if (Feature == "fma4") { HasFMA4 = true; continue; @@ -2042,6 +2048,9 @@ void X86TargetInfo::getTargetDefines(const LangOptions &Opts, if (HasPOPCNT) Builder.defineMacro("__POPCNT__"); + if (HasSSE4a) + Builder.defineMacro("__SSE4A__"); + if (HasFMA4) Builder.defineMacro("__FMA4__"); @@ -2108,6 +2117,7 @@ bool X86TargetInfo::hasFeature(StringRef Feature) const { .Case("avx2", SSELevel >= AVX2) .Case("bmi", HasBMI) .Case("bmi2", HasBMI2) + .Case("sse4a", HasSSE4a) .Case("fma4", HasFMA4) .Case("lzcnt", HasLZCNT) .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow) diff --git a/test/Preprocessor/predefined-arch-macros.c b/test/Preprocessor/predefined-arch-macros.c index 0b9d343b24..f4def04378 100644 --- a/test/Preprocessor/predefined-arch-macros.c +++ b/test/Preprocessor/predefined-arch-macros.c @@ -940,5 +940,47 @@ // CHECK_ATHLON_FX_M64: #define __tune_k8__ 1 // CHECK_ATHLON_FX_M64: #define __x86_64 1 // CHECK_ATHLON_FX_M64: #define __x86_64__ 1 +// RUN: %clang -march=amdfam10 -m64 -E -dM %s -o - 2>&1 \ +// RUN: -target i386-unknown-linux \ +// RUN: | FileCheck %s -check-prefix=CHECK_AMDFAM10_M64 +// CHECK_AMDFAM10_M64: #define __3dNOW_A__ 1 +// CHECK_AMDFAM10_M64: #define __3dNOW__ 1 +// CHECK_AMDFAM10_M64: #define __MMX__ 1 +// CHECK_AMDFAM10_M64: #define __SSE2_MATH__ 1 +// CHECK_AMDFAM10_M64: #define __SSE2__ 1 +// CHECK_AMDFAM10_M64: #define __SSE3__ 1 +// CHECK_AMDFAM10_M64: #define __SSE4A__ 1 +// CHECK_AMDFAM10_M64: #define __SSE_MATH__ 1 +// CHECK_AMDFAM10_M64: #define __SSE__ 1 +// CHECK_AMDFAM10_M64: #define __amd64 1 +// CHECK_AMDFAM10_M64: #define __amd64__ 1 +// CHECK_AMDFAM10_M64: #define __amdfam10 1 +// CHECK_AMDFAM10_M64: #define __amdfam10__ 1 +// CHECK_AMDFAM10_M64: #define __tune_amdfam10__ 1 +// CHECK_AMDFAM10_M64: #define __x86_64 1 +// CHECK_AMDFAM10_M64: #define __x86_64__ 1 +// RUN: %clang -march=bdver1 -m64 -E -dM %s -o - 2>&1 \ +// RUN: -target i386-unknown-linux \ +// RUN: | FileCheck %s -check-prefix=CHECK_BDVER1_M64 +// CHECK_BDVER1_M64: #define __AVX__ 1 +// CHECK_BDVER1_M64-NOT: #define __3dNOW_A__ 1 +// CHECK_BDVER1_M64-NOT: #define __3dNOW__ 1 +// CHECK_BDVER1_M64: #define __MMX__ 1 +// CHECK_BDVER1_M64: #define __SSE2_MATH__ 1 +// CHECK_BDVER1_M64: #define __SSE2__ 1 +// CHECK_BDVER1_M64: #define __SSE3__ 1 +// CHECK_BDVER1_M64: #define __SSE4A__ 1 +// CHECK_BDVER1_M64: #define __SSE4_1__ 1 +// CHECK_BDVER1_M64: #define __SSE4_2__ 1 +// CHECK_BDVER1_M64: #define __SSE_MATH__ 1 +// CHECK_BDVER1_M64: #define __SSE__ 1 +// CHECK_BDVER1_M64: #define __SSSE3__ 1 +// CHECK_BDVER1_M64: #define __amd64 1 +// CHECK_BDVER1_M64: #define __amd64__ 1 +// CHECK_BDVER1_M64: #define __bdver1 1 +// CHECK_BDVER1_M64: #define __bdver1__ 1 +// CHECK_BDVER1_M64: #define __tune_bdver1__ 1 +// CHECK_BDVER1_M64: #define __x86_64 1 +// CHECK_BDVER1_M64: #define __x86_64__ 1 // // End X86/GCC/Linux tests ------------------