Mesa (gallium-strict-aliasing): mesa: fix strict aliasing issues in half-to-float/float-to-half conversions
Roland Scheidegger
sroland at kemper.freedesktop.org
Mon Dec 7 20:49:40 UTC 2009
Module: Mesa
Branch: gallium-strict-aliasing
Commit: c36d1aacf4c70d76165c91cd7048c0f9f43b8571
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=c36d1aacf4c70d76165c91cd7048c0f9f43b8571
Author: Roland Scheidegger <sroland at vmware.com>
Date: Mon Dec 7 20:11:46 2009 +0100
mesa: fix strict aliasing issues in half-to-float/float-to-half conversions
use union instead of casts
---
src/mesa/main/imports.c | 17 +++++++++--------
1 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/src/mesa/main/imports.c b/src/mesa/main/imports.c
index c9e00cf..f2ef84f 100644
--- a/src/mesa/main/imports.c
+++ b/src/mesa/main/imports.c
@@ -460,7 +460,7 @@ _mesa_inv_sqrtf(float n)
#if 0 /* not used, see below -BP */
float r3, x3, y3;
#endif
- union { float f; unsigned int i; } u;
+ fi_type u;
unsigned int magic;
/*
@@ -649,10 +649,10 @@ _mesa_bitcount(unsigned int n)
GLhalfARB
_mesa_float_to_half(float val)
{
- const int flt = *((int *) (void *) &val);
- const int flt_m = flt & 0x7fffff;
- const int flt_e = (flt >> 23) & 0xff;
- const int flt_s = (flt >> 31) & 0x1;
+ const fi_type fi = {val};
+ const int flt_m = fi.i & 0x7fffff;
+ const int flt_e = (fi.i >> 23) & 0xff;
+ const int flt_s = (fi.i >> 31) & 0x1;
int s, e, m = 0;
GLhalfARB result;
@@ -739,7 +739,8 @@ _mesa_half_to_float(GLhalfARB val)
const int m = val & 0x3ff;
const int e = (val >> 10) & 0x1f;
const int s = (val >> 15) & 0x1;
- int flt_m, flt_e, flt_s, flt;
+ int flt_m, flt_e, flt_s;
+ fi_type fi;
float result;
/* sign bit */
@@ -774,8 +775,8 @@ _mesa_half_to_float(GLhalfARB val)
flt_m = m << 13;
}
- flt = (flt_s << 31) | (flt_e << 23) | flt_m;
- result = *((float *) (void *) &flt);
+ fi.i = (flt_s << 31) | (flt_e << 23) | flt_m;
+ result = fi.f;
return result;
}
More information about the mesa-commit
mailing list