Browse Source

added check for existence of __builtin_popcountll

Former-commit-id: 65f94a6d6e
tempestpy_adaptions
TimQu 9 years ago
parent
commit
30bcfcad0e
  1. 4
      CMakeLists.txt
  2. 16
      src/storage/BitVector.cpp
  3. 3
      storm-config.h.in

4
CMakeLists.txt

@ -13,6 +13,7 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/resources/cmak
include(ExternalProject) include(ExternalProject)
include(CheckFunctionExists)
############################################################# #############################################################
## ##
## CMake options of StoRM ## CMake options of StoRM
@ -105,6 +106,9 @@ message(STATUS "Assuming extension for static libraries: ${STATIC_EXT}")
## Compiler specific settings and definitions ## Compiler specific settings and definitions
## ##
############################################################# #############################################################
CHECK_FUNCTION_EXISTS(__builtin_popcountll, STORM_HAS_BUILTIN_POPCOUNT)
# Path to the no-strict-aliasing target # Path to the no-strict-aliasing target
set(CONVERSIONHELPER_TARGET "${PROJECT_SOURCE_DIR}/src/utility/ConversionHelper.cpp") set(CONVERSIONHELPER_TARGET "${PROJECT_SOURCE_DIR}/src/utility/ConversionHelper.cpp")

16
src/storage/BitVector.cpp

@ -549,13 +549,13 @@ namespace storm {
// First, count all full buckets. // First, count all full buckets.
uint_fast64_t bucket = index >> 6; uint_fast64_t bucket = index >> 6;
for (uint_fast64_t i = 0; i < bucket; ++i) { 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 <nmmintrin.h> #include <nmmintrin.h>
// If the target machine does not support SSE4, this will fail. // If the target machine does not support SSE4, this will fail.
result += _mm_popcnt_u64(bucketVector[i]); result += _mm_popcnt_u64(bucketVector[i]);
#elif defined STORM_HAS_BUILTIN_POPCOUNT
result += __builtin_popcountll(buckets[i]);
#else #else
uint_fast32_t cnt; uint_fast32_t cnt;
uint_fast64_t bitset = buckets[i]; uint_fast64_t bitset = buckets[i];
@ -571,8 +571,12 @@ namespace storm {
if (tmp != 0) { if (tmp != 0) {
tmp = ~((1ll << (64 - (tmp & mod64mask))) - 1ll); tmp = ~((1ll << (64 - (tmp & mod64mask))) - 1ll);
tmp &= buckets[bucket]; 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 <nmmintrin.h>
// 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); result += __builtin_popcountll(tmp);
#else #else
uint_fast32_t cnt; uint_fast32_t cnt;

3
storm-config.h.in

@ -51,4 +51,7 @@
#cmakedefine STORM_LOG_DISABLE_DEBUG #cmakedefine STORM_LOG_DISABLE_DEBUG
// Check whether machine supports builtin_popcount
#cmakedefine STORM_HAS_BUILTIN_POPCOUNT
#endif // STORM_GENERATED_STORMCONFIG_H_ #endif // STORM_GENERATED_STORMCONFIG_H_
Loading…
Cancel
Save