Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 16 Mar 2004 10:22:51 +0100
From:      des@des.no (Dag-Erling =?iso-8859-1?q?Sm=F8rgrav?=)
To:        alpha@freebsd.org
Subject:   strict aliasing patches
Message-ID:  <xzp4qspkuxg.fsf@dwp.des.no>

next in thread | raw e-mail | index | archive | help
--=-=-=
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable

The attached patches are required to build alpha world with -O2.
Please review.

DES
--=20
Dag-Erling Sm=C3=B8rgrav - des@des.no


--=-=-=
Content-Type: text/x-patch
Content-Disposition: attachment; filename=alpha-O2.diff

Index: lib/libc/alpha/gen/flt_rounds.c
===================================================================
RCS file: /home/ncvs/src/lib/libc/alpha/gen/flt_rounds.c,v
retrieving revision 1.3
diff -u -r1.3 flt_rounds.c
--- lib/libc/alpha/gen/flt_rounds.c	7 Nov 2001 22:12:52 -0000	1.3
+++ lib/libc/alpha/gen/flt_rounds.c	16 Mar 2004 09:21:11 -0000
@@ -47,13 +47,14 @@
 int
 __flt_rounds()
 {
-	double fpcrval;
-	u_int64_t old;
+	union {
+		double fpcrval;
+		u_int64_t intval;
+	} u;
 
 	__asm__("trapb");
-	__asm__("mf_fpcr %0" : "=f" (fpcrval));
+	__asm__("mf_fpcr %0" : "=f" (u.fpcrval));
 	__asm__("trapb");
-	old = *(u_int64_t *)&fpcrval;
 
-	return map[(old >> 58) & 0x3];
+	return map[(u.intval >> 58) & 0x3];
 }
Index: lib/libc/alpha/gen/fpgetround.c
===================================================================
RCS file: /home/ncvs/src/lib/libc/alpha/gen/fpgetround.c,v
retrieving revision 1.5
diff -u -r1.5 fpgetround.c
--- lib/libc/alpha/gen/fpgetround.c	7 Nov 2001 22:12:52 -0000	1.5
+++ lib/libc/alpha/gen/fpgetround.c	16 Mar 2004 09:21:16 -0000
@@ -41,11 +41,12 @@
 fp_rnd_t
 fpgetround()
 {
-	double fpcrval;
-	u_int64_t old;
+	union {
+		double fpcrval;
+		u_int64_t intval;
+	} u;
 
-	GET_FPCR(fpcrval);
-	old = *(u_int64_t *)&fpcrval;
+	GET_FPCR(u.fpcrval);
 
-	return ((old & FPCR_DYN_MASK) >> FPCR_DYN_SHIFT);
+	return ((u.intval & FPCR_DYN_MASK) >> FPCR_DYN_SHIFT);
 }
Index: lib/libc/alpha/gen/fpgetsticky.c
===================================================================
RCS file: /home/ncvs/src/lib/libc/alpha/gen/fpgetsticky.c,v
retrieving revision 1.4
diff -u -r1.4 fpgetsticky.c
--- lib/libc/alpha/gen/fpgetsticky.c	7 Nov 2001 22:12:52 -0000	1.4
+++ lib/libc/alpha/gen/fpgetsticky.c	16 Mar 2004 09:21:22 -0000
@@ -41,11 +41,12 @@
 fp_except_t
 fpgetsticky()
 {
-	double fpcrval;
-	u_int64_t old;
+	union {
+		double fpcrval;
+		u_int64_t intval;
+	} u;
 
-	GET_FPCR(fpcrval);
-	old = *(u_int64_t *)&fpcrval;
-	return (((old >> IEEE_STATUS_TO_FPCR_SHIFT) & IEEE_STATUS_MASK)
+	GET_FPCR(u.fpcrval);
+	return (((u.intval >> IEEE_STATUS_TO_FPCR_SHIFT) & IEEE_STATUS_MASK)
 					 >> IEEE_STATUS_TO_EXCSUM_SHIFT);
 }
Index: lib/libc/alpha/gen/fpsetround.c
===================================================================
RCS file: /home/ncvs/src/lib/libc/alpha/gen/fpsetround.c,v
retrieving revision 1.5
diff -u -r1.5 fpsetround.c
--- lib/libc/alpha/gen/fpsetround.c	7 Nov 2001 22:12:52 -0000	1.5
+++ lib/libc/alpha/gen/fpsetround.c	16 Mar 2004 09:18:37 -0000
@@ -42,17 +42,20 @@
 fpsetround(rnd_dir)
 	fp_rnd_t rnd_dir;
 {
-	double fpcrval;
+	union {
+		double fpcrval;
+		u_int64_t intval;
+	} u;
 	u_int64_t old, new;
 
-	GET_FPCR(fpcrval);
-	old = *(u_int64_t *)&fpcrval;
+	GET_FPCR(u.fpcrval);
 
+	old = u.intval;
 	new = old & (~FPCR_DYN_MASK);
 	new |= ((long) rnd_dir << FPCR_DYN_SHIFT) & FPCR_DYN_MASK;
 
-	*(u_int64_t *)&fpcrval = new;
-	SET_FPCR(fpcrval);
+	u.intval = new;
+	SET_FPCR(u.fpcrval);
 
 	return ((old & FPCR_DYN_MASK) >> FPCR_DYN_SHIFT);
 }
Index: lib/libc/alpha/gen/fpsetsticky.c
===================================================================
RCS file: /home/ncvs/src/lib/libc/alpha/gen/fpsetsticky.c,v
retrieving revision 1.4
diff -u -r1.4 fpsetsticky.c
--- lib/libc/alpha/gen/fpsetsticky.c	7 Nov 2001 22:12:52 -0000	1.4
+++ lib/libc/alpha/gen/fpsetsticky.c	16 Mar 2004 09:19:10 -0000
@@ -42,16 +42,20 @@
 fpsetsticky(sticky)
 	fp_except_t sticky;
 {
-	double fpcrval;
-	u_int64_t old,new ;
+	union {
+		double fpcrval;
+		u_int64_t intval;
+	} u;
+	u_int64_t old, new;
 
-	GET_FPCR(fpcrval);
-	old = *(u_int64_t *)&fpcrval;
+	GET_FPCR(u.fpcrval);
+
+	old = u.intval;
 	new = old & ~ (IEEE_STATUS_MASK << IEEE_STATUS_TO_FPCR_SHIFT);
 	new |= ((sticky << IEEE_STATUS_TO_EXCSUM_SHIFT) & IEEE_STATUS_MASK)
 					<< IEEE_STATUS_TO_FPCR_SHIFT;
-	*(u_int64_t *)&fpcrval = new;
-	SET_FPCR(fpcrval);
+	u.intval = new;
+	SET_FPCR(u.fpcrval);
 
 	return (((old >> IEEE_STATUS_TO_FPCR_SHIFT) & IEEE_STATUS_MASK)
 					>> IEEE_STATUS_TO_EXCSUM_SHIFT);

--=-=-=--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?xzp4qspkuxg.fsf>