Skip to content

Commit

Permalink
[rtextures] Fix HalfToFloat() and FloatToHalf() dereferencing iss…
Browse files Browse the repository at this point in the history
…ues with an union (#4729)

* Fix HalfToFloat() and FloatToHalf() dereferencing issues with an union

* Remove unnecessary initialization

* Moved the union to inside the functions
  • Loading branch information
Asdqwe authored Jan 26, 2025
1 parent 53ea275 commit f6f31a9
Showing 1 changed file with 18 additions and 5 deletions.
23 changes: 18 additions & 5 deletions src/rtextures.c
Original file line number Diff line number Diff line change
Expand Up @@ -5390,13 +5390,19 @@ static float HalfToFloat(unsigned short x)
{
float result = 0.0f;

union
{
float fm;
unsigned int ui;
} uni;

const unsigned int e = (x & 0x7C00) >> 10; // Exponent
const unsigned int m = (x & 0x03FF) << 13; // Mantissa
const float fm = (float)m;
const unsigned int v = (*(unsigned int *)&fm) >> 23; // Evil log2 bit hack to count leading zeros in denormalized format
const unsigned int r = (x & 0x8000) << 16 | (e != 0)*((e + 112) << 23 | m) | ((e == 0)&(m != 0))*((v - 37) << 23 | ((m << (150 - v)) & 0x007FE000)); // sign : normalized : denormalized
uni.fm = (float)m;
const unsigned int v = uni.ui >> 23; // Evil log2 bit hack to count leading zeros in denormalized format
uni.ui = (x & 0x8000) << 16 | (e != 0)*((e + 112) << 23 | m) | ((e == 0)&(m != 0))*((v - 37) << 23 | ((m << (150 - v)) & 0x007FE000)); // sign : normalized : denormalized

result = *(float *)&r;
result = uni.fm;

return result;
}
Expand All @@ -5406,7 +5412,14 @@ static unsigned short FloatToHalf(float x)
{
unsigned short result = 0;

const unsigned int b = (*(unsigned int *) & x) + 0x00001000; // Round-to-nearest-even: add last bit after truncated mantissa
union
{
float fm;
unsigned int ui;
} uni;
uni.fm = x;

const unsigned int b = uni.ui + 0x00001000; // Round-to-nearest-even: add last bit after truncated mantissa
const unsigned int e = (b & 0x7F800000) >> 23; // Exponent
const unsigned int m = b & 0x007FFFFF; // Mantissa; in line below: 0x007FF000 = 0x00800000-0x00001000 = decimal indicator flag - initial rounding

Expand Down

0 comments on commit f6f31a9

Please sign in to comment.