23 #ifndef AAX_DENORMAL_H
24 #define AAX_DENORMAL_H
32 #if ! defined( _TMS320C6X )
56 #if defined( _TMS320C6X )
59 #define AAX_SCOPE_COMPUTE_DENORMALS() do {} while(0)
60 #define AAX_SCOPE_DENORMALS_AS_ZERO() do {} while(0)
62 #elif ((defined _MSC_VER) || defined(WINDOWS_VERSION))
68 #define AAX_SCOPE_COMPUTE_DENORMALS() do {} while(0)
69 #define AAX_SCOPE_DENORMALS_AS_ZERO() do {} while(0)
148 #elif defined(LINUX_VERSION)
152 #define AAX_SCOPE_COMPUTE_DENORMALS() do {} while(0)
153 #define AAX_SCOPE_DENORMALS_AS_ZERO() do {} while(0)
155 #elif (defined (__GNUC__) || defined(MAC_VERSION))
160 #define AAX_SCOPE_COMPUTE_DENORMALS() AAX_StDenormalAsZeroFlagsOff computeDenormalFlagsScope ## __LINE__ ; do {} while (0)
161 #define AAX_SCOPE_DENORMALS_AS_ZERO() AAX_StDenormalAsZeroFlagsOn denormalAsZeroFlagsScope ## __LINE__ ; do {} while (0)
164 struct AAX_StDenormalAsZeroFlagsOn
167 AAX_StDenormalAsZeroFlagsOn() { set_flags(); }
168 ~AAX_StDenormalAsZeroFlagsOn() { reset_flags(); }
171 #if !defined(__arm64__)
172 void set_flags() { fegetenv(&mPrevFlags); fesetenv(FE_DFL_DISABLE_SSE_DENORMS_ENV); }
174 void set_flags() { fegetenv(&mPrevFlags); fesetenv(FE_DFL_DISABLE_DENORMS_ENV); }
176 void reset_flags() { fesetenv(&mPrevFlags); }
179 struct AAX_StDenormalAsZeroFlagsOff
182 AAX_StDenormalAsZeroFlagsOff() { set_flags(); }
183 ~AAX_StDenormalAsZeroFlagsOff() { reset_flags(); }
186 void set_flags() { fegetenv(&mPrevFlags); fesetenv(FE_DFL_ENV); }
187 void reset_flags() { fesetenv(&mPrevFlags); }
195 #error AAX_SCOPE_COMPUTE_DENORMALS is not defined for this compiler
196 #error AAX_SCOPE_DENORMALS_AS_ZERO is not defined for this compiler
199 #define AAX_SCOPE_COMPUTE_DENORMALS() do {} while(0)
200 #define AAX_SCOPE_DENORMALS_AS_ZERO() do {} while(0)
212 #if ! defined( _TMS320C6X )
213 static const float cMinimumNormalFloat = std::numeric_limits<float>::min();
227 #if defined(WINDOWS_VERSION) || defined(MAC_VERSION) || defined(LINUX_VERSION)
236 #if defined(WINDOWS_VERSION) || defined(MAC_VERSION) || defined(LINUX_VERSION)
241 #if AAX_CPP11_SUPPORT
246 #if defined(WINDOWS_VERSION) || defined(MAC_VERSION) || defined(LINUX_VERSION)
258 #if ! defined( _TMS320C6X )
259 if(iValue < cMinimumNormalFloat && iValue > -cMinimumNormalFloat) iValue=0.0f;
276 #if ! defined( _TMS320C6X )
277 for( int32_t i = 0; i < inLength; ++i )
279 float curFloat = *inSamples;
280 if(
fabsf(curFloat) < cMinimumNormalFloat )
282 *(inSamples++) = curFloat;
Various utility definitions for AAX.
Definition: AAX_Exception.h:42
const double cDenormalAvoidanceOffset
Definition: AAX_Denormal.h:209
void FilterDenormals(float *inSamples, int32_t inLength)
Round all denormal/subnormal samples in a buffer to zero.
Definition: AAX_Denormal.h:273
float fabsf(float iVal)
Definition: AAX_MiscUtils.h:185
void DeDenormal(double &iValue)
Clamps very small floating point values to zero.
Definition: AAX_Denormal.h:225
void DeDenormalFine(float &iValue)
Definition: AAX_Denormal.h:256
const float cFloatDenormalAvoidanceOffset
Definition: AAX_Denormal.h:210