summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormartin <martin@NetBSD.org>2013-11-20 22:22:20 +0000
committermartin <martin@NetBSD.org>2013-11-20 22:22:20 +0000
commit6219794ab9a3cbbe906c9791106b48cd5707fc0c (patch)
treed9e7af7f9973bfb9b6af0e50721c9fe2f5e22c1b
parent5471305928d770453dfdc3c52b688eab4b4be7c7 (diff)
PR 48384: reorganize struct ieee_ext for sparc64 to only use a high/low
part for the mantissa. Adjust arch specific code accordingly.
-rw-r--r--lib/libc/arch/sparc64/gen/fpclassifyl.c10
-rw-r--r--lib/libc/arch/sparc64/gen/isinfl.c7
-rw-r--r--lib/libc/arch/sparc64/gen/isnanl.c7
-rw-r--r--sys/arch/sparc/include/ieee.h39
4 files changed, 30 insertions, 33 deletions
diff --git a/lib/libc/arch/sparc64/gen/fpclassifyl.c b/lib/libc/arch/sparc64/gen/fpclassifyl.c
index 613798a7181..1a745bb5f85 100644
--- a/lib/libc/arch/sparc64/gen/fpclassifyl.c
+++ b/lib/libc/arch/sparc64/gen/fpclassifyl.c
@@ -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;
diff --git a/lib/libc/arch/sparc64/gen/isinfl.c b/lib/libc/arch/sparc64/gen/isinfl.c
index 8d7acc6ddc5..5ce6731799a 100644
--- a/lib/libc/arch/sparc64/gen/isinfl.c
+++ b/lib/libc/arch/sparc64/gen/isinfl.c
@@ -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));
}
diff --git a/lib/libc/arch/sparc64/gen/isnanl.c b/lib/libc/arch/sparc64/gen/isnanl.c
index 2b67f0866db..efa59d531ae 100644
--- a/lib/libc/arch/sparc64/gen/isnanl.c
+++ b/lib/libc/arch/sparc64/gen/isnanl.c
@@ -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));
}
diff --git a/sys/arch/sparc/include/ieee.h b/sys/arch/sparc/include/ieee.h
index 04080e2c588..4d26fba28a3 100644
--- a/sys/arch/sparc/include/ieee.h
+++ b/sys/arch/sparc/include/ieee.h
@@ -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