Fixed Rgb9E5F decoding. Removed union cast in favor of bx::bitCast.

This commit is contained in:
Бранимир Караџић
2024-11-19 22:23:44 -08:00
parent 98b36f44ca
commit 04464c4188
5 changed files with 91 additions and 76 deletions

View File

@@ -606,12 +606,6 @@ namespace bx
#define DOUBLE_PLUS_INFINITY UINT64_C(0x7ff0000000000000)
#define DOUBLE_MINUS_INFINITY UINT64_C(0xfff0000000000000)
union HexDouble
{
double d;
uint64_t u;
};
#define lsr96(s2, s1, s0, d2, d1, d0) \
d0 = ( (s0) >> 1) | ( ( (s1) & 1) << 31); \
d1 = ( (s1) >> 1) | ( ( (s2) & 1) << 31); \
@@ -932,13 +926,12 @@ namespace bx
static double converter(PrepNumber* _pn)
{
int binexp = 92;
HexDouble hd;
uint32_t s2, s1, s0; /* 96-bit precision integer */
uint32_t q2, q1, q0; /* 96-bit precision integer */
uint32_t r2, r1, r0; /* 96-bit precision integer */
uint32_t mask28 = UINT32_C(0xf) << 28;
hd.u = 0;
uint64_t hdu = 0;
s0 = (uint32_t)(_pn->mantissa & UINT32_MAX);
s1 = (uint32_t)(_pn->mantissa >> 32);
@@ -1011,18 +1004,18 @@ namespace bx
{
if (_pn->negative)
{
hd.u = DOUBLE_MINUS_INFINITY;
hdu = DOUBLE_MINUS_INFINITY;
}
else
{
hd.u = DOUBLE_PLUS_INFINITY;
hdu = DOUBLE_PLUS_INFINITY;
}
}
else if (binexp < 1)
{
if (_pn->negative)
{
hd.u = DOUBLE_MINUS_ZERO;
hdu = DOUBLE_MINUS_ZERO;
}
}
else if (s2)
@@ -1039,10 +1032,10 @@ namespace bx
q |= (1ULL << 63);
}
hd.u = q;
hdu = q;
}
return hd.d;
return bitCast<double>(hdu);
}
int32_t toString(char* _out, int32_t _max, bool _value)
@@ -1074,9 +1067,6 @@ namespace bx
pn.negative = 0;
pn.exponent = 0;
HexDouble hd;
hd.u = DOUBLE_PLUS_ZERO;
switch (parser(_str.getPtr(), _str.getTerm(), &pn) )
{
case PARSER_OK:
@@ -1084,22 +1074,19 @@ namespace bx
break;
case PARSER_PZERO:
*_out = hd.d;
*_out = bitCast<double>(DOUBLE_PLUS_ZERO);
break;
case PARSER_MZERO:
hd.u = DOUBLE_MINUS_ZERO;
*_out = hd.d;
*_out = bitCast<double>(DOUBLE_MINUS_ZERO);
break;
case PARSER_PINF:
hd.u = DOUBLE_PLUS_INFINITY;
*_out = hd.d;
*_out = bitCast<double>(DOUBLE_PLUS_INFINITY);
break;
case PARSER_MINF:
hd.u = DOUBLE_MINUS_INFINITY;
*_out = hd.d;
*_out = bitCast<double>(DOUBLE_MINUS_INFINITY);
break;
}