1#ifndef _WDL_DENORMAL_H_
2#define _WDL_DENORMAL_H_
10#define WDL_DENORMAL_INLINE inline
11#elif defined(_MSC_VER)
12#define WDL_DENORMAL_INLINE __inline
14 #ifdef WDL_STATICFUNC_UNUSED
15 #define WDL_DENORMAL_INLINE WDL_STATICFUNC_UNUSED
17 #define WDL_DENORMAL_INLINE
24#define WDL_DENORMAL_DOUBLE_AGGRESSIVE_CUTOFF 0x3cA00000
25#define WDL_DENORMAL_FLOAT_AGGRESSIVE_CUTOFF 0x25000000
31#ifdef WDL_DENORMAL_WANTS_SCOPED_FTZ
33#if defined(__SSE2__) || _M_IX86_FP >= 2 || defined(_WIN64)
34 #define WDL_DENORMAL_FTZMODE
35 #define WDL_DENORMAL_FTZSTATE_TYPE unsigned int
39 #include <xmmintrin.h>
41 #define wdl_denorm_mm_getcsr() _mm_getcsr()
42 #define wdl_denorm_mm_setcsr(x) _mm_setcsr(x)
44 #define wdl_denorm_mm_csr_mask ((1<<15)|(1<<11) | (1<<8) | (1<<6))
46 #define wdl_denorm_mm_csr_mask ((1<<15)|(1<<11))
48#elif defined(__arm__) || defined(__aarch64__)
49 #define WDL_DENORMAL_FTZMODE
50 #define WDL_DENORMAL_FTZSTATE_TYPE unsigned long
51 static unsigned long __attribute__((unused)) wdl_denorm_mm_getcsr()
55 asm volatile (
"mrs %0, fpcr" :
"=r" (rv));
57 asm volatile (
"fmrx %0, fpscr" :
"=r" (rv));
61 static void __attribute__((unused)) wdl_denorm_mm_setcsr(
unsigned long v)
64 asm volatile (
"msr fpcr, %0" ::
"r"(
v));
66 asm volatile (
"fmxr fpscr, %0" ::
"r"(
v));
69 #define wdl_denorm_mm_csr_mask (1<<24)
72class WDL_denormal_ftz_scope
75 WDL_denormal_ftz_scope()
77#ifdef WDL_DENORMAL_FTZMODE
78 const WDL_DENORMAL_FTZSTATE_TYPE
b = wdl_denorm_mm_csr_mask;
79 old_state = wdl_denorm_mm_getcsr();
80 if ((need_restore = (old_state &
b) !=
b))
81 wdl_denorm_mm_setcsr(old_state|
b);
84 ~WDL_denormal_ftz_scope()
86#ifdef WDL_DENORMAL_FTZMODE
87 if (need_restore) wdl_denorm_mm_setcsr(old_state);
91#ifdef WDL_DENORMAL_FTZMODE
92 WDL_DENORMAL_FTZSTATE_TYPE old_state;
102#if !defined(WDL_DENORMAL_FTZMODE) && !defined(WDL_DENORMAL_DO_NOT_FILTER)
200#define denormal_filter(x) (x)
201#define denormal_filter2(x) (x)
202#define denormal_filter_double(x) (x)
203#define denormal_filter_double2(x) (x)
204#define denormal_filter_double_aggressive(x) (x)
205#define denormal_filter_float(x) (x)
206#define denormal_filter_float2(x) (x)
207#define denormal_filter_float_aggressive(x) (x)
208#define denormal_filter_aggressive(x) (x)
209#define denormal_fix(x) do { } while(0)
210#define denormal_fix_aggressive(x) do { } while(0)
211#define denormal_fix_double(x) do { } while(0)
212#define denormal_fix_double_aggressive(x) do { } while(0)
213#define denormal_fix_float(x) do { } while(0)
214#define denormal_fix_float_aggressive(x) do { } while(0)
uint8_t a
Definition Spc_Cpu.h:141
__attribute__((naked, target("arm")))
Definition asm-nseel-arm-gcc.c:66
unsigned v[N_MAX]
Definition inflate.c:1584
register unsigned i
Definition inflate.c:1575
static float WDL_DENORMAL_INLINE denormal_filter_float2(float a)
Definition denormal.h:124
static void WDL_DENORMAL_INLINE denormal_fix_float_aggressive(float *a)
Definition denormal.h:148
static float WDL_DENORMAL_INLINE denormal_filter_float_aggressive(float a)
Definition denormal.h:130
static double WDL_DENORMAL_INLINE denormal_filter_double(double a)
Definition denormal.h:104
static WDL_DENORMAL_INLINE unsigned int WDL_DENORMAL_DOUBLE_HW(const double *a)
Definition denormal.h:22
static void WDL_DENORMAL_INLINE GetDoubleMaxAbsValue(double *out, const double *in)
Definition denormal.h:222
#define WDL_DENORMAL_INLINE
Definition denormal.h:15
#define WDL_DENORMAL_DOUBLE_AGGRESSIVE_CUTOFF
Definition denormal.h:24
#define WDL_DENORMAL_FLOAT_AGGRESSIVE_CUTOFF
Definition denormal.h:25
static void WDL_DENORMAL_INLINE denormal_fix_double_aggressive(double *a)
Definition denormal.h:139
static float WDL_DENORMAL_INLINE denormal_filter_float(float a)
Definition denormal.h:119
static void WDL_DENORMAL_INLINE GetFloatMaxAbsValue(float *out, const float *in)
Definition denormal.h:231
static void WDL_DENORMAL_INLINE denormal_fix_float(float *a)
Definition denormal.h:144
static WDL_DENORMAL_INLINE unsigned int WDL_DENORMAL_FLOAT_W(const float *a)
Definition denormal.h:21
static double WDL_DENORMAL_INLINE denormal_filter_double2(double a)
Definition denormal.h:109
static double WDL_DENORMAL_INLINE denormal_filter_double_aggressive(double a)
Definition denormal.h:114
static void WDL_DENORMAL_INLINE denormal_fix_double(double *a)
Definition denormal.h:134
float in
Definition lilv_test.c:1460
float out
Definition lilv_test.c:1461
memcpy(hh, h, RAND_HEAD_LEN)
unsigned long long WDL_UINT64
Definition wdltypes.h:12
#define WDL_UINT64_CONST(x)
Definition wdltypes.h:20