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