From 89a5e796bedcfbf6afd03654e75b9f7aa0a0b4f4 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Tue, 10 Sep 2013 06:55:47 +0000 Subject: [PATCH] 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 --- lib/Basic/Targets.cpp | 13 +++++++++++-- test/Preprocessor/x86_target_features.c | 12 ++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) 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 -- 2.50.1