diff options
author | Roland Scheidegger <[email protected]> | 2011-06-09 01:11:52 +0200 |
---|---|---|
committer | Roland Scheidegger <[email protected]> | 2011-06-09 01:14:51 +0200 |
commit | d302804debeed13ced27fce222110c629e55d6f9 (patch) | |
tree | a5489be089d31f8ecb3a9adad18cd8ab1d34399f /src/gallium/auxiliary | |
parent | c1090f3019bbe0ff92455e4a9268f8957af9cda0 (diff) |
util: fix strict aliasing issues in u_format_r11g11b10f.h
Diffstat (limited to 'src/gallium/auxiliary')
-rw-r--r-- | src/gallium/auxiliary/util/u_format_r11g11b10f.h | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/src/gallium/auxiliary/util/u_format_r11g11b10f.h b/src/gallium/auxiliary/util/u_format_r11g11b10f.h index c4181d0e34e..8e0572aa7ce 100644 --- a/src/gallium/auxiliary/util/u_format_r11g11b10f.h +++ b/src/gallium/auxiliary/util/u_format_r11g11b10f.h @@ -45,14 +45,18 @@ static INLINE unsigned f32_to_uf11(float val) { - uint32_t f32 = (*(uint32_t *) &val); + union { + float f; + uint32_t ui; + } f32 = {val}; + uint16_t uf11 = 0; /* Decode little-endian 32-bit floating-point value */ - int sign = (f32 >> 16) & 0x8000; + int sign = (f32.ui >> 16) & 0x8000; /* Map exponent to the range [-127,128] */ - int exponent = ((f32 >> 23) & 0xff) - 127; - int mantissa = f32 & 0x007fffff; + int exponent = ((f32.ui >> 23) & 0xff) - 127; + int mantissa = f32.ui & 0x007fffff; if (sign) return 0; @@ -111,14 +115,18 @@ static INLINE float uf11_to_f32(uint16_t val) static INLINE unsigned f32_to_uf10(float val) { - uint32_t f32 = (*(uint32_t *) &val); + union { + float f; + uint32_t ui; + } f32 = {val}; + uint16_t uf10 = 0; /* Decode little-endian 32-bit floating-point value */ - int sign = (f32 >> 16) & 0x8000; + int sign = (f32.ui >> 16) & 0x8000; /* Map exponent to the range [-127,128] */ - int exponent = ((f32 >> 23) & 0xff) - 127; - int mantissa = f32 & 0x007fffff; + int exponent = ((f32.ui >> 23) & 0xff) - 127; + int mantissa = f32.ui & 0x007fffff; if (sign) return 0; |