Module Name: src Committed By: martin Date: Sun Mar 6 10:32:48 UTC 2011
Modified Files: src/lib/libc/arch/sparc64: Makefile.inc src/lib/libc/arch/sparc64/gen: fpgetsticky.c fpsetmask.c fpsetsticky.c Log Message: While we use hardware (for float and double), but cooperate with softfloat (to do long double), we need to not only handle the hardware exception mask and cummulated flags, but also update/query the softfloat variables. Since this may go away sometime (to make us psABI compliant), ifdef it properly. To generate a diff of this commit: cvs rdiff -u -r1.13 -r1.14 src/lib/libc/arch/sparc64/Makefile.inc cvs rdiff -u -r1.4 -r1.5 src/lib/libc/arch/sparc64/gen/fpgetsticky.c \ src/lib/libc/arch/sparc64/gen/fpsetmask.c \ src/lib/libc/arch/sparc64/gen/fpsetsticky.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/libc/arch/sparc64/Makefile.inc diff -u src/lib/libc/arch/sparc64/Makefile.inc:1.13 src/lib/libc/arch/sparc64/Makefile.inc:1.14 --- src/lib/libc/arch/sparc64/Makefile.inc:1.13 Sun Dec 6 07:05:50 2009 +++ src/lib/libc/arch/sparc64/Makefile.inc Sun Mar 6 10:32:47 2011 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile.inc,v 1.13 2009/12/06 07:05:50 uebayasi Exp $ +# $NetBSD: Makefile.inc,v 1.14 2011/03/06 10:32:47 martin Exp $ SRCS+= __sigaction14_sigtramp.c __sigtramp2.S @@ -36,7 +36,7 @@ .PATH: ${ARCHDIR}/softfloat SRCS+= qp.c -CPPFLAGS+= -DSOFTFLOATSPARC64_FOR_GCC +CPPFLAGS+= -DSOFTFLOATSPARC64_FOR_GCC -DEXCEPTIONS_WITH_SOFTFLOAT .if ${MKSOFTFLOAT} != "no" .include <softfloat/Makefile.inc> .else Index: src/lib/libc/arch/sparc64/gen/fpgetsticky.c diff -u src/lib/libc/arch/sparc64/gen/fpgetsticky.c:1.4 src/lib/libc/arch/sparc64/gen/fpgetsticky.c:1.5 --- src/lib/libc/arch/sparc64/gen/fpgetsticky.c:1.4 Sat Dec 24 23:10:08 2005 +++ src/lib/libc/arch/sparc64/gen/fpgetsticky.c Sun Mar 6 10:32:47 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: fpgetsticky.c,v 1.4 2005/12/24 23:10:08 perry Exp $ */ +/* $NetBSD: fpgetsticky.c,v 1.5 2011/03/06 10:32:47 martin Exp $ */ /* * Written by J.T. Conklin, Apr 10, 1995 @@ -7,7 +7,7 @@ #include <sys/cdefs.h> #if defined(LIBC_SCCS) && !defined(lint) -__RCSID("$NetBSD: fpgetsticky.c,v 1.4 2005/12/24 23:10:08 perry Exp $"); +__RCSID("$NetBSD: fpgetsticky.c,v 1.5 2011/03/06 10:32:47 martin Exp $"); #endif /* LIBC_SCCS and not lint */ #include "namespace.h" @@ -18,11 +18,22 @@ __weak_alias(fpgetsticky,_fpgetsticky) #endif +#ifdef EXCEPTIONS_WITH_SOFTFLOAT +extern fp_except _softfloat_float_exception_flags; +#endif + fp_except fpgetsticky() { int x; + fp_except res; __asm("st %%fsr,%0" : "=m" (*&x)); - return (x >> 5) & 0x1f; + res = (x >> 5) & 0x1f; + +#ifdef EXCEPTIONS_WITH_SOFTFLOAT + res |= _softfloat_float_exception_flags; +#endif + + return res; } Index: src/lib/libc/arch/sparc64/gen/fpsetmask.c diff -u src/lib/libc/arch/sparc64/gen/fpsetmask.c:1.4 src/lib/libc/arch/sparc64/gen/fpsetmask.c:1.5 --- src/lib/libc/arch/sparc64/gen/fpsetmask.c:1.4 Sat Dec 24 23:10:08 2005 +++ src/lib/libc/arch/sparc64/gen/fpsetmask.c Sun Mar 6 10:32:47 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: fpsetmask.c,v 1.4 2005/12/24 23:10:08 perry Exp $ */ +/* $NetBSD: fpsetmask.c,v 1.5 2011/03/06 10:32:47 martin Exp $ */ /* * Written by J.T. Conklin, Apr 10, 1995 @@ -7,7 +7,7 @@ #include <sys/cdefs.h> #if defined(LIBC_SCCS) && !defined(lint) -__RCSID("$NetBSD: fpsetmask.c,v 1.4 2005/12/24 23:10:08 perry Exp $"); +__RCSID("$NetBSD: fpsetmask.c,v 1.5 2011/03/06 10:32:47 martin Exp $"); #endif /* LIBC_SCCS and not lint */ #include "namespace.h" @@ -18,6 +18,10 @@ __weak_alias(fpsetmask,_fpsetmask) #endif +#ifdef EXCEPTIONS_WITH_SOFTFLOAT +extern fp_except _softfloat_float_exception_mask; +#endif + fp_except fpsetmask(mask) fp_except mask; @@ -33,5 +37,13 @@ __asm("ld %0,%%fsr" : : "m" (*&new)); - return (old >> 23) & 0x1f; + old = (old >> 23) & 0x1f; + +#ifdef EXCEPTIONS_WITH_SOFTFLOAT + /* update softfloat mask as well */ + old |= _softfloat_float_exception_mask; + _softfloat_float_exception_mask = mask; +#endif + + return old; } Index: src/lib/libc/arch/sparc64/gen/fpsetsticky.c diff -u src/lib/libc/arch/sparc64/gen/fpsetsticky.c:1.4 src/lib/libc/arch/sparc64/gen/fpsetsticky.c:1.5 --- src/lib/libc/arch/sparc64/gen/fpsetsticky.c:1.4 Sat Dec 24 23:10:08 2005 +++ src/lib/libc/arch/sparc64/gen/fpsetsticky.c Sun Mar 6 10:32:47 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: fpsetsticky.c,v 1.4 2005/12/24 23:10:08 perry Exp $ */ +/* $NetBSD: fpsetsticky.c,v 1.5 2011/03/06 10:32:47 martin Exp $ */ /* * Written by J.T. Conklin, Apr 10, 1995 @@ -7,7 +7,7 @@ #include <sys/cdefs.h> #if defined(LIBC_SCCS) && !defined(lint) -__RCSID("$NetBSD: fpsetsticky.c,v 1.4 2005/12/24 23:10:08 perry Exp $"); +__RCSID("$NetBSD: fpsetsticky.c,v 1.5 2011/03/06 10:32:47 martin Exp $"); #endif /* LIBC_SCCS and not lint */ #include "namespace.h" @@ -18,6 +18,10 @@ __weak_alias(fpsetsticky,_fpsetsticky) #endif +#ifdef EXCEPTIONS_WITH_SOFTFLOAT +extern fp_except _softfloat_float_exception_flags; +#endif + fp_except fpsetsticky(sticky) fp_except sticky; @@ -33,5 +37,11 @@ __asm("ld %0,%%fsr" : : "m" (*&new)); - return (old >> 5) & 0x1f; + old = (old >> 5) & 0x1f; + +#ifdef EXCEPTIONS_WITH_SOFTFLOAT + old |= _softfloat_float_exception_flags; + _softfloat_float_exception_flags = sticky; +#endif + return old; }