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>