Commit e140ac4e authored by Simon Gene Gottlieb's avatar Simon Gene Gottlieb Committed by Michael R. Crusoe

x86/avx512 fpclass: improve fallback implementation

parent 5950c402
...@@ -444,7 +444,7 @@ simde_math_fpclassify(double v) { ...@@ -444,7 +444,7 @@ simde_math_fpclassify(double v) {
#define SIMDE_MATH_FP_SNAN 0x80 #define SIMDE_MATH_FP_SNAN 0x80
static HEDLEY_INLINE static HEDLEY_INLINE
int8_t uint8_t
simde_math_fpclassf(float v, const int imm8) { simde_math_fpclassf(float v, const int imm8) {
union { union {
float f; float f;
...@@ -452,37 +452,37 @@ simde_math_fpclassf(float v, const int imm8) { ...@@ -452,37 +452,37 @@ simde_math_fpclassf(float v, const int imm8) {
} fu; } fu;
fu.f = v; fu.f = v;
uint32_t bits = fu.u; uint32_t bits = fu.u;
int8_t NegNum = (bits >> 31) & 1; uint8_t NegNum = (bits >> 31) & 1;
uint32_t const ExpMask = 0x3F800000; // [30:23] uint32_t const ExpMask = 0x3F800000; // [30:23]
uint32_t const MantMask = 0x007FFFFF; // [22:0] uint32_t const MantMask = 0x007FFFFF; // [22:0]
int8_t ExpAllOnes = ((bits & ExpMask) == ExpMask); uint8_t ExpAllOnes = ((bits & ExpMask) == ExpMask);
int8_t ExpAllZeros = ((bits & ExpMask) == 0); uint8_t ExpAllZeros = ((bits & ExpMask) == 0);
int8_t MantAllZeros = ((bits & MantMask) == 0); uint8_t MantAllZeros = ((bits & MantMask) == 0);
int8_t ZeroNumber = ExpAllZeros && MantAllZeros; uint8_t ZeroNumber = ExpAllZeros & MantAllZeros;
int8_t SignalingBit = (bits >> 22) & 1; uint8_t SignalingBit = (bits >> 22) & 1;
int8_t result = 0; uint8_t result = 0;
int8_t qNaN_res = ExpAllOnes && !MantAllZeros && SignalingBit; uint8_t qNaN_res = ExpAllOnes & (!MantAllZeros) & SignalingBit;
int8_t Pzero_res = !NegNum && ExpAllZeros && MantAllZeros; uint8_t Pzero_res = (!NegNum) & ExpAllZeros & MantAllZeros;
int8_t Nzero_res = NegNum && ExpAllZeros && MantAllZeros; uint8_t Nzero_res = NegNum & ExpAllZeros & MantAllZeros;
int8_t Pinf_res = !NegNum && ExpAllOnes && MantAllZeros; uint8_t Pinf_res = (!NegNum) & ExpAllOnes & MantAllZeros;
int8_t Ninf_res = NegNum && ExpAllOnes && MantAllZeros; uint8_t Ninf_res = NegNum & ExpAllOnes & MantAllZeros;
int8_t Denorm_res = ExpAllZeros && !MantAllZeros; uint8_t Denorm_res = ExpAllZeros & (!MantAllZeros);
int8_t FinNeg_res = NegNum && !ExpAllOnes && !ZeroNumber; uint8_t FinNeg_res = NegNum & (!ExpAllOnes) & (!ZeroNumber);
int8_t sNaN_res = ExpAllOnes && !MantAllZeros && !SignalingBit; uint8_t sNaN_res = ExpAllOnes & (!MantAllZeros) & (!SignalingBit);
result = ((((imm8 >> 0) & 1) && qNaN_res) || \ result = (((imm8 >> 0) & qNaN_res) | \
(((imm8 >> 1) & 1) && Pzero_res) || \ ((imm8 >> 1) & Pzero_res) | \
(((imm8 >> 2) & 1) && Nzero_res) || \ ((imm8 >> 2) & Nzero_res) | \
(((imm8 >> 3) & 1) && Pinf_res) || \ ((imm8 >> 3) & Pinf_res) | \
(((imm8 >> 4) & 1) && Ninf_res) || \ ((imm8 >> 4) & Ninf_res) | \
(((imm8 >> 5) & 1) && Denorm_res) || \ ((imm8 >> 5) & Denorm_res) | \
(((imm8 >> 6) & 1) && FinNeg_res) || \ ((imm8 >> 6) & FinNeg_res) | \
(((imm8 >> 7) & 1) && sNaN_res)); ((imm8 >> 7) & sNaN_res));
return result; return result;
} }
static HEDLEY_INLINE static HEDLEY_INLINE
int8_t uint8_t
simde_math_fpclass(double v, const int imm8) { simde_math_fpclass(double v, const int imm8) {
union { union {
double d; double d;
...@@ -490,32 +490,32 @@ simde_math_fpclass(double v, const int imm8) { ...@@ -490,32 +490,32 @@ simde_math_fpclass(double v, const int imm8) {
} du; } du;
du.d = v; du.d = v;
uint64_t bits = du.u; uint64_t bits = du.u;
int8_t NegNum = (bits >> 63) & 1; uint8_t NegNum = (bits >> 63) & 1;
uint64_t const ExpMask = 0x3FF0000000000000; // [62:52] uint64_t const ExpMask = 0x3FF0000000000000; // [62:52]
uint64_t const MantMask = 0x000FFFFFFFFFFFFF; // [51:0] uint64_t const MantMask = 0x000FFFFFFFFFFFFF; // [51:0]
int8_t ExpAllOnes = ((bits & ExpMask) == ExpMask); uint8_t ExpAllOnes = ((bits & ExpMask) == ExpMask);
int8_t ExpAllZeros = ((bits & ExpMask) == 0); uint8_t ExpAllZeros = ((bits & ExpMask) == 0);
int8_t MantAllZeros = ((bits & MantMask) == 0); uint8_t MantAllZeros = ((bits & MantMask) == 0);
int8_t ZeroNumber = ExpAllZeros && MantAllZeros; uint8_t ZeroNumber = ExpAllZeros & MantAllZeros;
int8_t SignalingBit = (bits >> 51) & 1; uint8_t SignalingBit = (bits >> 51) & 1;
int8_t result = 0; uint8_t result = 0;
int8_t qNaN_res = ExpAllOnes && !MantAllZeros && SignalingBit; uint8_t qNaN_res = ExpAllOnes & (!MantAllZeros) & SignalingBit;
int8_t Pzero_res = !NegNum && ExpAllZeros && MantAllZeros; uint8_t Pzero_res = (!NegNum) & ExpAllZeros & MantAllZeros;
int8_t Nzero_res = NegNum && ExpAllZeros && MantAllZeros; uint8_t Nzero_res = NegNum & ExpAllZeros & MantAllZeros;
int8_t Pinf_res = !NegNum && ExpAllOnes && MantAllZeros; uint8_t Pinf_res = (!NegNum) & ExpAllOnes & MantAllZeros;
int8_t Ninf_res = NegNum && ExpAllOnes && MantAllZeros; uint8_t Ninf_res = NegNum & ExpAllOnes & MantAllZeros;
int8_t Denorm_res = ExpAllZeros && !MantAllZeros; uint8_t Denorm_res = ExpAllZeros & (!MantAllZeros);
int8_t FinNeg_res = NegNum && !ExpAllOnes && !ZeroNumber; uint8_t FinNeg_res = NegNum & (!ExpAllOnes) & (!ZeroNumber);
int8_t sNaN_res = ExpAllOnes && !MantAllZeros && !SignalingBit; uint8_t sNaN_res = ExpAllOnes & (!MantAllZeros) & (!SignalingBit);
result = ((((imm8 >> 0) & 1) && qNaN_res) || \ result = (((imm8 >> 0) & qNaN_res) | \
(((imm8 >> 1) & 1) && Pzero_res) || \ ((imm8 >> 1) & Pzero_res) | \
(((imm8 >> 2) & 1) && Nzero_res) || \ ((imm8 >> 2) & Nzero_res) | \
(((imm8 >> 3) & 1) && Pinf_res) || \ ((imm8 >> 3) & Pinf_res) | \
(((imm8 >> 4) & 1) && Ninf_res) || \ ((imm8 >> 4) & Ninf_res) | \
(((imm8 >> 5) & 1) && Denorm_res) || \ ((imm8 >> 5) & Denorm_res) | \
(((imm8 >> 6) & 1) && FinNeg_res) || \ ((imm8 >> 6) & FinNeg_res) | \
(((imm8 >> 7) & 1) && sNaN_res)); ((imm8 >> 7) & sNaN_res));
return result; return result;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment