Use union to swap [skip ci]

This commit is contained in:
Andrew Kane
2024-03-31 20:27:04 -07:00
parent b640d84381
commit caca8990fc

View File

@@ -104,13 +104,30 @@ HalfToFloat4(half num)
/* TODO Improve performance */ /* TODO Improve performance */
/* Assumes same endianness for floats and integers */ /* Assumes same endianness for floats and integers */
/* TODO Use union to swap */ union
uint16 bin = *((uint16 *) &num); {
uint32 exponent = (bin & 0x7C00) >> 10; float f;
uint32 mantissa = bin & 0x03FF; uint32 i;
} swapfloat;
union
{
half h;
uint16 i;
} swaphalf;
uint16 bin;
uint32 exponent;
uint32 mantissa;
uint32 result;
swaphalf.h = num;
bin = swaphalf.i;
exponent = (bin & 0x7C00) >> 10;
mantissa = bin & 0x03FF;
/* Sign */ /* Sign */
uint32 result = (bin & 0x8000) << 16; result = (bin & 0x8000) << 16;
if (exponent == 31) if (exponent == 31)
{ {
@@ -156,8 +173,8 @@ HalfToFloat4(half num)
result |= mantissa << 13; result |= mantissa << 13;
} }
/* TODO Use union to swap */ swapfloat.i = result;
return *((float *) &result); return swapfloat.f;
#endif #endif
} }
@@ -173,13 +190,30 @@ Float4ToHalfUnchecked(float num)
/* TODO Improve performance */ /* TODO Improve performance */
/* Assumes same endianness for floats and integers */ /* Assumes same endianness for floats and integers */
/* TODO Use union to swap */ union
uint32 bin = *((uint32 *) &num); {
int exponent = (bin & 0x7F800000) >> 23; float f;
int mantissa = bin & 0x007FFFFF; uint32 i;
} swapfloat;
union
{
half h;
uint16 i;
} swaphalf;
uint32 bin;
int exponent;
int mantissa;
uint16 result;
swapfloat.f = num;
bin = swapfloat.i;
exponent = (bin & 0x7F800000) >> 23;
mantissa = bin & 0x007FFFFF;
/* Sign */ /* Sign */
uint16 result = (bin & 0x80000000) >> 16; result = (bin & 0x80000000) >> 16;
if (isinf(num)) if (isinf(num))
{ {
@@ -238,8 +272,8 @@ Float4ToHalfUnchecked(float num)
} }
} }
/* TODO Use union to swap */ swaphalf.i = result;
return *((half *) & result); return swaphalf.h;
#endif #endif
} }