Module Name:    src
Committed By:   martin
Date:           Wed Nov 20 22:22:20 UTC 2013

Modified Files:
        src/lib/libc/arch/sparc64/gen: fpclassifyl.c isinfl.c isnanl.c
        src/sys/arch/sparc/include: ieee.h

Log Message:
PR 48384: reorganize struct ieee_ext for sparc64 to only use a high/low
part for the mantissa.
Adjust arch specific code accordingly.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/lib/libc/arch/sparc64/gen/fpclassifyl.c
cvs rdiff -u -r1.4 -r1.5 src/lib/libc/arch/sparc64/gen/isinfl.c \
    src/lib/libc/arch/sparc64/gen/isnanl.c
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/sparc/include/ieee.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libc/arch/sparc64/gen/fpclassifyl.c
diff -u src/lib/libc/arch/sparc64/gen/fpclassifyl.c:1.2 src/lib/libc/arch/sparc64/gen/fpclassifyl.c:1.3
--- src/lib/libc/arch/sparc64/gen/fpclassifyl.c:1.2	Mon Apr 28 20:22:57 2008
+++ src/lib/libc/arch/sparc64/gen/fpclassifyl.c	Wed Nov 20 22:22:20 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: fpclassifyl.c,v 1.2 2008/04/28 20:22:57 martin Exp $	*/
+/*	$NetBSD: fpclassifyl.c,v 1.3 2013/11/20 22:22:20 martin Exp $	*/
 
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: fpclassifyl.c,v 1.2 2008/04/28 20:22:57 martin Exp $");
+__RCSID("$NetBSD: fpclassifyl.c,v 1.3 2013/11/20 22:22:20 martin Exp $");
 #endif
 
 #include <machine/ieee.h>
@@ -49,14 +49,12 @@ __fpclassifyl(long double x)
 	u.extu_ld = x;
 
 	if (u.extu_ext.ext_exp == 0) {
-		if (u.extu_ext.ext_frach  == 0 && u.extu_ext.ext_frachm == 0 &&
-		    u.extu_ext.ext_fraclm == 0 && u.extu_ext.ext_fracl  == 0)
+		if (u.extu_ext.ext_frach  == 0 && u.extu_ext.ext_fracl  == 0)
 			return FP_ZERO;
 		else
 			return FP_SUBNORMAL;
 	} else if (u.extu_ext.ext_exp == EXT_EXP_INFNAN) {
-		if (u.extu_ext.ext_frach  == 0 && u.extu_ext.ext_frachm == 0 &&
-		    u.extu_ext.ext_fraclm == 0 && u.extu_ext.ext_fracl  == 0)
+		if (u.extu_ext.ext_frach  == 0 && u.extu_ext.ext_fracl  == 0)
 			return FP_INFINITE;
 		else
 			return FP_NAN;

Index: src/lib/libc/arch/sparc64/gen/isinfl.c
diff -u src/lib/libc/arch/sparc64/gen/isinfl.c:1.4 src/lib/libc/arch/sparc64/gen/isinfl.c:1.5
--- src/lib/libc/arch/sparc64/gen/isinfl.c:1.4	Thu Mar  4 23:42:39 2004
+++ src/lib/libc/arch/sparc64/gen/isinfl.c	Wed Nov 20 22:22:20 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: isinfl.c,v 1.4 2004/03/04 23:42:39 kleink Exp $	*/
+/*	$NetBSD: isinfl.c,v 1.5 2013/11/20 22:22:20 martin Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -40,7 +40,7 @@
 #if 0
 static char sccsid[] = "@(#)isinf.c	8.1 (Berkeley) 6/4/93";
 #else
-__RCSID("$NetBSD: isinfl.c,v 1.4 2004/03/04 23:42:39 kleink Exp $");
+__RCSID("$NetBSD: isinfl.c,v 1.5 2013/11/20 22:22:20 martin Exp $");
 #endif
 #endif /* LIBC_SCCS and not lint */
 
@@ -59,6 +59,5 @@ __isinfl(long double x)
 	u.extu_ld = x;
 
 	return (u.extu_ext.ext_exp == EXT_EXP_INFNAN &&
-	    (u.extu_ext.ext_frach  == 0 && u.extu_ext.ext_frachm == 0 &&
-	     u.extu_ext.ext_fraclm == 0 && u.extu_ext.ext_fracl  == 0));
+	    (u.extu_ext.ext_frach  == 0 && u.extu_ext.ext_fracl  == 0));
 }
Index: src/lib/libc/arch/sparc64/gen/isnanl.c
diff -u src/lib/libc/arch/sparc64/gen/isnanl.c:1.4 src/lib/libc/arch/sparc64/gen/isnanl.c:1.5
--- src/lib/libc/arch/sparc64/gen/isnanl.c:1.4	Thu Mar  4 23:42:39 2004
+++ src/lib/libc/arch/sparc64/gen/isnanl.c	Wed Nov 20 22:22:20 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: isnanl.c,v 1.4 2004/03/04 23:42:39 kleink Exp $	*/
+/*	$NetBSD: isnanl.c,v 1.5 2013/11/20 22:22:20 martin Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -40,7 +40,7 @@
 #if 0
 static char sccsid[] = "@(#)isinf.c	8.1 (Berkeley) 6/4/93";
 #else
-__RCSID("$NetBSD: isnanl.c,v 1.4 2004/03/04 23:42:39 kleink Exp $");
+__RCSID("$NetBSD: isnanl.c,v 1.5 2013/11/20 22:22:20 martin Exp $");
 #endif
 #endif /* LIBC_SCCS and not lint */
 
@@ -59,6 +59,5 @@ __isnanl(long double x)
 	u.extu_ld = x;
 
 	return (u.extu_ext.ext_exp == EXT_EXP_INFNAN &&
-	    (u.extu_ext.ext_frach  != 0 || u.extu_ext.ext_frachm != 0 ||
-	     u.extu_ext.ext_fraclm != 0 || u.extu_ext.ext_fracl  != 0));
+	    (u.extu_ext.ext_frach  != 0 || u.extu_ext.ext_fracl  != 0));
 }

Index: src/sys/arch/sparc/include/ieee.h
diff -u src/sys/arch/sparc/include/ieee.h:1.15 src/sys/arch/sparc/include/ieee.h:1.16
--- src/sys/arch/sparc/include/ieee.h:1.15	Thu Feb 14 09:34:46 2013
+++ src/sys/arch/sparc/include/ieee.h	Wed Nov 20 22:22:20 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: ieee.h,v 1.15 2013/02/14 09:34:46 martin Exp $	*/
+/*	$NetBSD: ieee.h,v 1.16 2013/11/20 22:22:20 martin Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -57,27 +57,28 @@
 #if defined(__arch64__) || defined(_KERNEL)
 
 #define	EXT_EXPBITS	15
-#define EXT_FRACHBITS	16
-#define	EXT_FRACHMBITS	32
-#define	EXT_FRACLMBITS	32
-#define	EXT_FRACLBITS	32
-#define	EXT_FRACBITS	(EXT_FRACLBITS + EXT_FRACLMBITS + EXT_FRACHMBITS + EXT_FRACHBITS)
-
-#define	EXT_TO_ARRAY32(u, a) do {			\
-	(a)[0] = (uint32_t)(u).extu_ext.ext_fracl;	\
-	(a)[1] = (uint32_t)(u).extu_ext.ext_fraclm;	\
-	(a)[2] = (uint32_t)(u).extu_ext.ext_frachm;	\
-	(a)[3] = (uint32_t)(u).extu_ext.ext_frach;	\
-} while(/*CONSTCOND*/0)
+#define EXT_FRACHBITS	(16+32)
+#define	EXT_FRACLBITS	(32+32)
+#define	EXT_FRACBITS	(EXT_FRACLBITS + EXT_FRACHBITS)
 
 struct ieee_ext {
-	u_int	ext_sign:1;
-	u_int	ext_exp:EXT_EXPBITS;
-	u_int	ext_frach:EXT_FRACHBITS;
-	u_int	ext_frachm;
-	u_int	ext_fraclm;
-	u_int	ext_fracl;
+	uint64_t	ext_sign:1;
+	uint64_t	ext_exp:EXT_EXPBITS;
+	uint64_t	ext_frach:EXT_FRACHBITS;
+	uint64_t	ext_fracl;
 };
+__CTASSERT(sizeof(struct ieee_ext) == 16);
+
+/*
+ * Copy all mantissa bits to an array of uint32_t big enough to hold them all.
+ * This is an insane API (seems to only be needed in gdtoa).
+ */
+#define EXT_TO_ARRAY32(u, a) do {					\
+	(a)[0] = (uint32_t)((u).extu_ext.ext_fracl & 0x0ffffffffL);	\
+	(a)[1] = (uint32_t)((u).extu_ext.ext_fracl >> 32);		\
+	(a)[2] = (uint32_t)((u).extu_ext.ext_frach & 0x0ffffffffL);	\
+	(a)[3] = (uint32_t)((u).extu_ext.ext_frach >> 32) & 0x0ffff;	\
+} while(/*CONSTCOND*/0)
 
 /*
  * Floats whose exponent is in [1..INFNAN) (of whatever type) are

Reply via email to