diff --git a/CMakeLists.txt b/CMakeLists.txt index f2621cf4d..42525ae36 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -13,6 +13,7 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/resources/cmak include(ExternalProject) +include(CheckFunctionExists) ############################################################# ## ## CMake options of StoRM @@ -105,6 +106,9 @@ message(STATUS "Assuming extension for static libraries: ${STATIC_EXT}") ## Compiler specific settings and definitions ## ############################################################# + +CHECK_FUNCTION_EXISTS(__builtin_popcountll, STORM_HAS_BUILTIN_POPCOUNT) + # Path to the no-strict-aliasing target set(CONVERSIONHELPER_TARGET "${PROJECT_SOURCE_DIR}/src/utility/ConversionHelper.cpp") diff --git a/src/storage/BitVector.cpp b/src/storage/BitVector.cpp index a60b8c10c..a40c89a2d 100644 --- a/src/storage/BitVector.cpp +++ b/src/storage/BitVector.cpp @@ -549,13 +549,13 @@ namespace storm { // First, count all full buckets. uint_fast64_t bucket = index >> 6; for (uint_fast64_t i = 0; i < bucket; ++i) { - // Check if we are using g++ or clang++ and, if so, use the built-in function -#if (defined (__GNUG__) || defined(__clang__)) - result += __builtin_popcountll(buckets[i]); -#elif defined WINDOWS + // Check how to determine the number of set bits in a bucket +#ifdef WINDOWS #include // If the target machine does not support SSE4, this will fail. result += _mm_popcnt_u64(bucketVector[i]); +#elif defined STORM_HAS_BUILTIN_POPCOUNT + result += __builtin_popcountll(buckets[i]); #else uint_fast32_t cnt; uint_fast64_t bitset = buckets[i]; @@ -571,8 +571,12 @@ namespace storm { if (tmp != 0) { tmp = ~((1ll << (64 - (tmp & mod64mask))) - 1ll); tmp &= buckets[bucket]; - // Check if we are using g++ or clang++ and, if so, use the built-in function -#if (defined (__GNUG__) || defined(__clang__)) + // Check how to determine the number of set bits in a bucket +#ifdef WINDOWS +#include + // If the target machine does not support SSE4, this will fail. + result += _mm_popcnt_u64(tmp); +#elif defined STORM_HAS_BUILTIN_POPCOUNT result += __builtin_popcountll(tmp); #else uint_fast32_t cnt; diff --git a/storm-config.h.in b/storm-config.h.in index 1bc2eac7d..539d75a55 100644 --- a/storm-config.h.in +++ b/storm-config.h.in @@ -51,4 +51,7 @@ #cmakedefine STORM_LOG_DISABLE_DEBUG +// Check whether machine supports builtin_popcount +#cmakedefine STORM_HAS_BUILTIN_POPCOUNT + #endif // STORM_GENERATED_STORMCONFIG_H_