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) {
#define SIMDE_MATH_FP_SNAN 0x80
static HEDLEY_INLINE
int8_t
uint8_t
simde_math_fpclassf(float v, const int imm8) {
union {
float f;
......@@ -452,37 +452,37 @@ simde_math_fpclassf(float v, const int imm8) {
} fu;
fu.f = v;
uint32_t bits = fu.u;
int8_t NegNum = (bits >> 31) & 1;
uint32_t const ExpMask = 0x3F800000; // [30:23]
uint8_t NegNum = (bits >> 31) & 1;
uint32_t const ExpMask = 0x3F800000; // [30:23]
uint32_t const MantMask = 0x007FFFFF; // [22:0]
int8_t ExpAllOnes = ((bits & ExpMask) == ExpMask);
int8_t ExpAllZeros = ((bits & ExpMask) == 0);
int8_t MantAllZeros = ((bits & MantMask) == 0);
int8_t ZeroNumber = ExpAllZeros && MantAllZeros;
int8_t SignalingBit = (bits >> 22) & 1;
int8_t result = 0;
int8_t qNaN_res = ExpAllOnes && !MantAllZeros && SignalingBit;
int8_t Pzero_res = !NegNum && ExpAllZeros && MantAllZeros;
int8_t Nzero_res = NegNum && ExpAllZeros && MantAllZeros;
int8_t Pinf_res = !NegNum && ExpAllOnes && MantAllZeros;
int8_t Ninf_res = NegNum && ExpAllOnes && MantAllZeros;
int8_t Denorm_res = ExpAllZeros && !MantAllZeros;
int8_t FinNeg_res = NegNum && !ExpAllOnes && !ZeroNumber;
int8_t sNaN_res = ExpAllOnes && !MantAllZeros && !SignalingBit;
result = ((((imm8 >> 0) & 1) && qNaN_res) || \
(((imm8 >> 1) & 1) && Pzero_res) || \
(((imm8 >> 2) & 1) && Nzero_res) || \
(((imm8 >> 3) & 1) && Pinf_res) || \
(((imm8 >> 4) & 1) && Ninf_res) || \
(((imm8 >> 5) & 1) && Denorm_res) || \
(((imm8 >> 6) & 1) && FinNeg_res) || \
(((imm8 >> 7) & 1) && sNaN_res));
uint8_t ExpAllOnes = ((bits & ExpMask) == ExpMask);
uint8_t ExpAllZeros = ((bits & ExpMask) == 0);
uint8_t MantAllZeros = ((bits & MantMask) == 0);
uint8_t ZeroNumber = ExpAllZeros & MantAllZeros;
uint8_t SignalingBit = (bits >> 22) & 1;
uint8_t result = 0;
uint8_t qNaN_res = ExpAllOnes & (!MantAllZeros) & SignalingBit;
uint8_t Pzero_res = (!NegNum) & ExpAllZeros & MantAllZeros;
uint8_t Nzero_res = NegNum & ExpAllZeros & MantAllZeros;
uint8_t Pinf_res = (!NegNum) & ExpAllOnes & MantAllZeros;
uint8_t Ninf_res = NegNum & ExpAllOnes & MantAllZeros;
uint8_t Denorm_res = ExpAllZeros & (!MantAllZeros);
uint8_t FinNeg_res = NegNum & (!ExpAllOnes) & (!ZeroNumber);
uint8_t sNaN_res = ExpAllOnes & (!MantAllZeros) & (!SignalingBit);
result = (((imm8 >> 0) & qNaN_res) | \
((imm8 >> 1) & Pzero_res) | \
((imm8 >> 2) & Nzero_res) | \
((imm8 >> 3) & Pinf_res) | \
((imm8 >> 4) & Ninf_res) | \
((imm8 >> 5) & Denorm_res) | \
((imm8 >> 6) & FinNeg_res) | \
((imm8 >> 7) & sNaN_res));
return result;
}
static HEDLEY_INLINE
int8_t
uint8_t
simde_math_fpclass(double v, const int imm8) {
union {
double d;
......@@ -490,32 +490,32 @@ simde_math_fpclass(double v, const int imm8) {
} du;
du.d = v;
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 MantMask = 0x000FFFFFFFFFFFFF; // [51:0]
int8_t ExpAllOnes = ((bits & ExpMask) == ExpMask);
int8_t ExpAllZeros = ((bits & ExpMask) == 0);
int8_t MantAllZeros = ((bits & MantMask) == 0);
int8_t ZeroNumber = ExpAllZeros && MantAllZeros;
int8_t SignalingBit = (bits >> 51) & 1;
int8_t result = 0;
int8_t qNaN_res = ExpAllOnes && !MantAllZeros && SignalingBit;
int8_t Pzero_res = !NegNum && ExpAllZeros && MantAllZeros;
int8_t Nzero_res = NegNum && ExpAllZeros && MantAllZeros;
int8_t Pinf_res = !NegNum && ExpAllOnes && MantAllZeros;
int8_t Ninf_res = NegNum && ExpAllOnes && MantAllZeros;
int8_t Denorm_res = ExpAllZeros && !MantAllZeros;
int8_t FinNeg_res = NegNum && !ExpAllOnes && !ZeroNumber;
int8_t sNaN_res = ExpAllOnes && !MantAllZeros && !SignalingBit;
result = ((((imm8 >> 0) & 1) && qNaN_res) || \
(((imm8 >> 1) & 1) && Pzero_res) || \
(((imm8 >> 2) & 1) && Nzero_res) || \
(((imm8 >> 3) & 1) && Pinf_res) || \
(((imm8 >> 4) & 1) && Ninf_res) || \
(((imm8 >> 5) & 1) && Denorm_res) || \
(((imm8 >> 6) & 1) && FinNeg_res) || \
(((imm8 >> 7) & 1) && sNaN_res));
uint8_t ExpAllOnes = ((bits & ExpMask) == ExpMask);
uint8_t ExpAllZeros = ((bits & ExpMask) == 0);
uint8_t MantAllZeros = ((bits & MantMask) == 0);
uint8_t ZeroNumber = ExpAllZeros & MantAllZeros;
uint8_t SignalingBit = (bits >> 51) & 1;
uint8_t result = 0;
uint8_t qNaN_res = ExpAllOnes & (!MantAllZeros) & SignalingBit;
uint8_t Pzero_res = (!NegNum) & ExpAllZeros & MantAllZeros;
uint8_t Nzero_res = NegNum & ExpAllZeros & MantAllZeros;
uint8_t Pinf_res = (!NegNum) & ExpAllOnes & MantAllZeros;
uint8_t Ninf_res = NegNum & ExpAllOnes & MantAllZeros;
uint8_t Denorm_res = ExpAllZeros & (!MantAllZeros);
uint8_t FinNeg_res = NegNum & (!ExpAllOnes) & (!ZeroNumber);
uint8_t sNaN_res = ExpAllOnes & (!MantAllZeros) & (!SignalingBit);
result = (((imm8 >> 0) & qNaN_res) | \
((imm8 >> 1) & Pzero_res) | \
((imm8 >> 2) & Nzero_res) | \
((imm8 >> 3) & Pinf_res) | \
((imm8 >> 4) & Ninf_res) | \
((imm8 >> 5) & Denorm_res) | \
((imm8 >> 6) & FinNeg_res) | \
((imm8 >> 7) & sNaN_res));
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