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