Module Name: src Committed By: martin Date: Sun Mar 23 15:26:47 UTC 2014
Modified Files: src/lib/libm/noieee_src: n_exp2.c n_exp2f.c Log Message: Avoid strict aliasing problems To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/lib/libm/noieee_src/n_exp2.c cvs rdiff -u -r1.1 -r1.2 src/lib/libm/noieee_src/n_exp2f.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/lib/libm/noieee_src/n_exp2.c diff -u src/lib/libm/noieee_src/n_exp2.c:1.2 src/lib/libm/noieee_src/n_exp2.c:1.3 --- src/lib/libm/noieee_src/n_exp2.c:1.2 Wed Mar 12 19:42:18 2014 +++ src/lib/libm/noieee_src/n_exp2.c Sun Mar 23 15:26:47 2014 @@ -25,13 +25,14 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: n_exp2.c,v 1.2 2014/03/12 19:42:18 martin Exp $"); +__RCSID("$NetBSD: n_exp2.c,v 1.3 2014/03/23 15:26:47 martin Exp $"); #ifdef __FBSDID __FBSDID("$FreeBSD: src/lib/msun/src/s_exp2.c,v 1.7 2008/02/22 02:27:34 das Exp $"); #endif #include <stdint.h> #include <float.h> +#include <string.h> #include "math.h" @@ -344,11 +345,11 @@ double exp2(double x) { double r, t, twopk, z; - uint32_t hx, ix, i0; + uint32_t hx, ix, i0, temp; int k, big; /* Filter out exceptional cases. */ - hx = ((uint32_t*)&x)[0]; + memcpy(&hx, &x, sizeof(hx)); ix = hx & 0x7fffffff; /* high word of |x| */ if(ix >= 0x40900000) { /* |x| >= 1024 */ if(x >= 0x1.0p10) @@ -373,11 +374,13 @@ exp2(double x) z -= tbl[i0 + 1]; /* eps[i0] */ big = k >= -1021 << 20; if (big) { - ((uint32_t*)&twopk)[0] = 0x3ff00000+k; - ((uint32_t*)&twopk)[1] = 0; + temp = 0x3ff00000+k; + twopk = 0.0; + memcpy(&twopk, &temp, sizeof(temp)); } else { - ((uint32_t*)&twopk)[0] = 0x3ff00000+k + (1000 << 20); - ((uint32_t*)&twopk)[1] = 0; + temp = 0x3ff00000+k + (1000 << 20); + twopk = 0.0; + memcpy(&twopk, &temp, sizeof(temp)); } r = t + t * z * (P1 + z * (P2 + z * (P3 + z * (P4 + z * P5)))); Index: src/lib/libm/noieee_src/n_exp2f.c diff -u src/lib/libm/noieee_src/n_exp2f.c:1.1 src/lib/libm/noieee_src/n_exp2f.c:1.2 --- src/lib/libm/noieee_src/n_exp2f.c:1.1 Thu Mar 6 10:55:57 2014 +++ src/lib/libm/noieee_src/n_exp2f.c Sun Mar 23 15:26:47 2014 @@ -25,13 +25,14 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: n_exp2f.c,v 1.1 2014/03/06 10:55:57 martin Exp $"); +__RCSID("$NetBSD: n_exp2f.c,v 1.2 2014/03/23 15:26:47 martin Exp $"); #ifdef __FBSDID __FBSDID("$FreeBSD: src/lib/msun/src/s_exp2f.c,v 1.9 2008/02/22 02:27:34 das Exp $"); #endif #include <stdint.h> #include <float.h> +#include <string.h> #include "math.h" @@ -99,10 +100,10 @@ exp2f(float x) double tv, twopk, u, z; float t; uint32_t hx, ix, i0; - int32_t k; + int32_t k, temp; /* Filter out exceptional cases. */ - hx = *((uint32_t*)&x); + memcpy(&hx, &x, sizeof(hx)); ix = hx & 0x7fffffff; /* high word of |x| */ if(ix >= 0x43000000) { /* |x| >= 128 */ if(x >= 0x1.0p7f) @@ -114,15 +115,16 @@ exp2f(float x) } /* Reduce x, computing z, i0, and k. */ - *((volatile float*)&t) = x + redux; - i0 = *((uint32_t*)&t); + i0 = x + redux; + memcpy(&t, &i0, sizeof(t)); i0 += TBLSIZE / 2; k = (i0 >> TBLBITS) << 20; i0 &= TBLSIZE - 1; t -= redux; z = x - t; - ((uint32_t*)&twopk)[0] = 0x3ff00000+k; - ((uint32_t*)&twopk)[1] = 0; + temp = 0x3ff00000+k; + twopk = 0.0; + memcpy(&twopk, &temp, sizeof(temp)); /* Compute r = exp2(y) = exp2ft[i0] * p(z). */ tv = exp2ft[i0];