Line data Source code
1 : /** 2 : * \file FlushToZero.cpp 3 : */ 4 : 5 : #include "FlushToZero.h" 6 : 7 : #if defined(__APPLE__) 8 : #elif defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__)) 9 : /* GCC-compatible compiler, targeting x86/x86-64 */ 10 : # include <x86intrin.h> 11 : # ifndef _MM_DENORMALS_ZERO_OFF 12 : # define _MM_DENORMALS_ZERO_MASK 0x0040 13 : # define _MM_DENORMALS_ZERO_ON 0x0040 14 : # define _MM_DENORMALS_ZERO_OFF 0x0000 15 : # endif 16 : #endif 17 : 18 : namespace ATK 19 : { 20 0 : FlushToZero::FlushToZero() 21 : { 22 : #if defined(_MSC_VER) && !defined(__INTEL_COMPILER) 23 : _controlfp_s(&previous_state, _MCW_DN, _DN_FLUSH); 24 : #elif defined(__APPLE__) 25 : fegetenv(&previous_state); 26 : fesetenv(FE_DFL_DISABLE_SSE_DENORMS_ENV); 27 : #elif defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__)) 28 0 : previous_state = _mm_getcsr() & _MM_DENORMALS_ZERO_MASK; 29 0 : _mm_setcsr(_mm_getcsr() | (_MM_DENORMALS_ZERO_ON)); 30 : #endif 31 0 : } 32 : 33 0 : FlushToZero::~FlushToZero() 34 : { 35 : #if defined(_MSC_VER) && !defined(__INTEL_COMPILER) 36 : unsigned int new_state; 37 : _controlfp_s(&new_state, _MCW_DN, previous_state); 38 : #elif defined(__APPLE__) 39 : fesetenv(&previous_state); 40 : #elif defined(__GNUC__) && (defined(__x86_64__) || defined(__i386__)) 41 0 : _mm_setcsr(_mm_getcsr() & ~_MM_DENORMALS_ZERO_MASK); 42 : #endif 43 0 : } 44 : }