From: Craig Topper Date: Tue, 10 Sep 2013 06:55:47 +0000 (+0000) Subject: Separate popcnt and sse4.2 feature control somewhat to match gcc behavior. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=89a5e796bedcfbf6afd03654e75b9f7aa0a0b4f4;p=clang Separate popcnt and sse4.2 feature control somewhat to match gcc behavior. Enabling sse4.2 will implicitly enable popcnt unless popcnt is explicitly disabled. Disabling sse4.2 will not disable popcnt if popcnt is explicitly enabled. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@190387 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index 64b00d7fae..665f101633 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -2133,7 +2133,7 @@ void X86TargetInfo::setSSELevel(llvm::StringMap &Features, case AVX: Features["avx"] = true; case SSE42: - Features["popcnt"] = Features["sse4.2"] = true; + Features["sse4.2"] = true; case SSE41: Features["sse4.1"] = true; case SSSE3: @@ -2166,7 +2166,7 @@ void X86TargetInfo::setSSELevel(llvm::StringMap &Features, case SSE41: Features["sse4.1"] = false; case SSE42: - Features["popcnt"] = Features["sse4.2"] = false; + Features["sse4.2"] = false; case AVX: Features["fma"] = Features["avx"] = false; setXOPLevel(Features, FMA4, false); @@ -2406,6 +2406,15 @@ bool X86TargetInfo::HandleTargetFeatures(std::vector &Features, XOPLevel = std::max(XOPLevel, XLevel); } + // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled. + // Can't do this earlier because we need to be able to explicitly enable + // popcnt and still disable sse4.2. + if (!HasPOPCNT && SSELevel >= SSE42 && + std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){ + HasPOPCNT = true; + Features.push_back("+popcnt"); + } + // LLVM doesn't have a separate switch for fpmath, so only accept it if it // matches the selected sse level. if (FPMath == FP_SSE && SSELevel < SSE1) { diff --git a/test/Preprocessor/x86_target_features.c b/test/Preprocessor/x86_target_features.c index d6ddc01b53..48d5bcb65b 100644 --- a/test/Preprocessor/x86_target_features.c +++ b/test/Preprocessor/x86_target_features.c @@ -128,3 +128,15 @@ // AVX512F2: #define __SSE_MATH__ 1 // AVX512F2: #define __SSE__ 1 // AVX512F2: #define __SSSE3__ 1 + +// RUN: %clang -target i386-unknown-unknown -march=atom -msse4.2 -x c -E -dM -o - %s | FileCheck --check-prefix=SSE42POPCNT %s + +// SSE42POPCNT: #define __POPCNT__ 1 + +// RUN: %clang -target i386-unknown-unknown -march=atom -mno-popcnt -msse4.2 -x c -E -dM -o - %s | FileCheck --check-prefix=SSE42NOPOPCNT %s + +// SSE42NOPOPCNT-NOT: #define __POPCNT__ 1 + +// RUN: %clang -target i386-unknown-unknown -march=atom -mpopcnt -mno-sse4.2 -x c -E -dM -o - %s | FileCheck --check-prefix=NOSSE42POPCNT %s + +// NOSSE42POPCNT: #define __POPCNT__ 1