@@ -62,8 +62,12 @@ extern "C" {
62
62
#define AVX_SET_FLOAT (X ) _mm256_set1_ps(X)
63
63
64
64
/* returns Z + XY*/
65
+ #ifdef __FMA__
65
66
#define AVX_FMA_ADD_FLOATS (X ,Y ,Z ) _mm256_fmadd_ps(X,Y,Z)
66
- #define AVX_FMA_ADD_TRUNCATE_FLOATS (X ,Y ,Z ) _mm256_round_ps(_mm256_fmadd_ps(X,Y,Z),_MM_FROUND_TO_ZERO|_MM_FROUND_NO_EXC)
67
+ #else
68
+ #define AVX_FMA_ADD_FLOATS (X ,Y ,Z ) _mm256_add_ps(_mm256_mul_ps(X,Y),Z)
69
+ #endif
70
+ #define AVX_FMA_ADD_TRUNCATE_FLOATS (X ,Y ,Z ) _mm256_round_ps(AVX_FMA_ADD_FLOATS(X,Y,Z),_MM_FROUND_TO_ZERO|_MM_FROUND_NO_EXC)
67
71
68
72
// X OP Y
69
73
#define AVX_COMPARE_FLOATS (X ,Y ,OP ) _mm256_cmp_ps(X,Y,OP)
@@ -82,11 +86,11 @@ extern "C" {
82
86
#ifdef __INTEL_COMPILER
83
87
#define AVX_ARC_COSINE (X , order ) _mm256_acos_ps(X)
84
88
#else
85
- //Other compilers do not have the vectorized arc-cosine
89
+ //Other compilers do not have the vectorized arc-cosine
86
90
#define AVX_ARC_COSINE (X , order ) inv_cosine_avx(X, order)
87
91
#endif
88
92
89
- //Max
93
+ //Max
90
94
#define AVX_MAX_FLOATS (X ,Y ) _mm256_max_ps(X,Y)
91
95
92
96
@@ -127,8 +131,12 @@ extern "C" {
127
131
#define AVX_RECIPROCAL_FLOATS (X ) _mm256_rcp_pd(X)
128
132
129
133
/* returns Z + XY*/
134
+ #ifdef __FMA__
130
135
#define AVX_FMA_ADD_FLOATS (X ,Y ,Z ) _mm256_fmadd_pd(X,Y,Z)
131
- #define AVX_FMA_ADD_TRUNCATE_FLOATS (X ,Y ,Z ) _mm256_round_pd(_mm256_fmadd_pd(X,Y,Z),_MM_FROUND_TO_ZERO|_MM_FROUND_NO_EXC)
136
+ #else
137
+ #define AVX_FMA_ADD_FLOATS (X ,Y ,Z ) _mm256_add_pd(_mm256_mul_pd(X,Y),Z)
138
+ #endif
139
+ #define AVX_FMA_ADD_TRUNCATE_FLOATS (X ,Y ,Z ) _mm256_round_pd(AVX_FMA_ADD_FLOATS(X,Y,Z),_MM_FROUND_TO_ZERO|_MM_FROUND_NO_EXC)
132
140
133
141
// X OP Y
134
142
#define AVX_COMPARE_FLOATS (X ,Y ,OP ) _mm256_cmp_pd(X,Y,OP)
0 commit comments