From caca8990fcab8267be3bd643c5b1f28ca0e4bcb5 Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Sun, 31 Mar 2024 20:27:04 -0700 Subject: [PATCH] Use union to swap [skip ci] --- src/halfvec.c | 62 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 48 insertions(+), 14 deletions(-) diff --git a/src/halfvec.c b/src/halfvec.c index 6edeb3d..36c1a85 100644 --- a/src/halfvec.c +++ b/src/halfvec.c @@ -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 }