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];