Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 13 Jan 2012 19:54:25 -0700
From:      Ian Lepore <freebsd@damnhippie.dyndns.org>
To:        freebsd-arm@freebsd.org
Cc:        David Schultz <das@freebsd.org>
Subject:   Re: fenv.h fixes for softfloat
Message-ID:  <1326509665.48691.96.camel@revolution.hippie.lan>
In-Reply-To: <20120111175516.GA99475@zim.MIT.EDU>
References:  <20120108183605.GA36775@zim.MIT.EDU> <1326144525.2199.32.camel@revolution.hippie.lan> <20120111052634.GA96534@zim.MIT.EDU> <20120111101833.GA88428@ci0.org> <1326291254.2419.55.camel@revolution.hippie.lan> <20120111175516.GA99475@zim.MIT.EDU>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, 2012-01-11 at 12:55 -0500, David Schultz wrote:
> On Wed, Jan 11, 2012, Ian Lepore wrote:
> > I can probably find time to work with it a bit more, I just wanted to
> > quickly post the initial results, especially in case the feedback was
> > along the lines of "thanks, but testing in an 8.2 environment won't
> > work."  We rely pretty heavily on floating point math on ARM at work, so
> > I may even be able to dedicate some non-hobbyist cycles to it (it occurs
> > to me that running the whole suite of regression tests now that we've
> > upgraded from 6.2->8.2 would probably be wise).
> 
> That would be great.  A few of the libm regression tests and libm
> functions depend on fenv.h working, by the way.  But most of the
> important stuff should work.

Now we have real progress.  Your code just needed a couple little
tweaks, and we needed an arm implementation of __flt_rounds() for
FLT_ROUNDS to work right.  This gets most of the regression suite
working (I'll post a log of results separately).

Here are the patches (apply these on top of your original patches, but
from /usr/src since it has to reach into sys/)...


diff -r a617cd67f1b1 -r 27a0ad9ff826 lib/libc/arm/gen/Makefile.inc
--- lib/libc/arm/gen/Makefile.inc	Fri Jan 13 19:21:01 2012 -0700
+++ lib/libc/arm/gen/Makefile.inc	Fri Jan 13 19:28:16 2012 -0700
@@ -3,4 +3,4 @@
 
 SRCS+=	_ctx_start.S _setjmp.S _set_tp.c alloca.S fabs.c \
 	infinity.c ldexp.c makecontext.c modf.c \
-	setjmp.S signalcontext.c sigsetjmp.S divsi3.S
+	setjmp.S signalcontext.c sigsetjmp.S divsi3.S flt_rounds.c
diff -r a617cd67f1b1 -r 27a0ad9ff826 lib/libc/arm/gen/flt_rounds.c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ lib/libc/arm/gen/flt_rounds.c	Fri Jan 13 19:28:16 2012 -0700
@@ -0,0 +1,69 @@
+/*-
+ * Copyright (c) 2011 David Schultz <das@FreeBSD.ORG>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD:  $
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD:  $");
+
+#include <machine/float.h>
+#include <fenv.h>
+
+#ifndef ARM_HARD_FLOAT
+
+int
+__flt_rounds(void)
+{
+
+	/*
+	 * Translate our rounding modes to the unnamed
+	 * manifest constants required by C99 et. al.
+	 */
+	switch (__softfloat_float_rounding_mode) {
+		case  FE_TOWARDZERO: return (0);
+		case  FE_TONEAREST:  return (1);
+		case  FE_UPWARD:     return (2);
+		case  FE_DOWNWARD:   return (3);
+	}
+	return (-1);
+}
+
+#else /* ARM_HARD_FLOAT */
+
+int
+__flt_rounds(void)
+{
+
+	/*
+	 * Apparently, the rounding mode is specified as part of the
+	 * instruction format on ARM, so the dynamic rounding mode is
+	 * indeterminate.  Some FPUs may differ.
+	 */
+	return (-1);
+}
+
+#endif /* ARM_HARD_FLOAT */
+
diff -r a617cd67f1b1 -r 27a0ad9ff826 lib/msun/src/fenv-softfloat.h
--- lib/msun/src/fenv-softfloat.h	Fri Jan 13 19:21:01 2012 -0700
+++ lib/msun/src/fenv-softfloat.h	Fri Jan 13 19:28:16 2012 -0700
@@ -77,6 +77,7 @@ __fenv_static inline int
 fesetexceptflag(const fexcept_t *__flagp, int __excepts)
 {
 
+	__softfloat_float_exception_flags &= ~__excepts;
 	__softfloat_float_exception_flags |= *__flagp & __excepts;
 	return (0);
 }
@@ -126,6 +127,7 @@ feholdexcept(fenv_t *__envp)
 	fenv_t __env;
 
 	fegetenv(__envp);
+	__softfloat_float_exception_flags = 0;
 	__softfloat_float_exception_mask = 0;
 	return (0);
 }
diff -r a617cd67f1b1 -r 27a0ad9ff826 sys/arm/include/float.h
--- sys/arm/include/float.h	Fri Jan 13 19:21:01 2012 -0700
+++ sys/arm/include/float.h	Fri Jan 13 19:28:16 2012 -0700
@@ -44,7 +44,7 @@ extern int __flt_rounds(void);
 __END_DECLS
 
 #define FLT_RADIX	2		/* b */
-#define FLT_ROUNDS	-1
+#define FLT_ROUNDS	__flt_rounds()
 #define	FLT_EVAL_METHOD	(-1)		/* XXX */
 #define	DECIMAL_DIG	17		/* max precision in decimal digits */
 






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