From owner-freebsd-arm@FreeBSD.ORG Sat Jan 14 02:54:29 2012 Return-Path: Delivered-To: freebsd-arm@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 1800F1065670 for ; Sat, 14 Jan 2012 02:54:29 +0000 (UTC) (envelope-from freebsd@damnhippie.dyndns.org) Received: from qmta01.emeryville.ca.mail.comcast.net (qmta01.emeryville.ca.mail.comcast.net [76.96.30.16]) by mx1.freebsd.org (Postfix) with ESMTP id EE4EA8FC13 for ; Sat, 14 Jan 2012 02:54:28 +0000 (UTC) Received: from omta15.emeryville.ca.mail.comcast.net ([76.96.30.71]) by qmta01.emeryville.ca.mail.comcast.net with comcast id MEkN1i0061Y3wxoA1EuUDV; Sat, 14 Jan 2012 02:54:28 +0000 Received: from damnhippie.dyndns.org ([24.8.232.202]) by omta15.emeryville.ca.mail.comcast.net with comcast id MEuT1i01P4NgCEG8bEuUFZ; Sat, 14 Jan 2012 02:54:28 +0000 Received: from [172.22.42.240] (revolution.hippie.lan [172.22.42.240]) by damnhippie.dyndns.org (8.14.3/8.14.3) with ESMTP id q0E2sQHS001295; Fri, 13 Jan 2012 19:54:26 -0700 (MST) (envelope-from freebsd@damnhippie.dyndns.org) From: Ian Lepore To: freebsd-arm@freebsd.org 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> Content-Type: text/plain Date: Fri, 13 Jan 2012 19:54:25 -0700 Message-Id: <1326509665.48691.96.camel@revolution.hippie.lan> Mime-Version: 1.0 X-Mailer: Evolution 2.26.0 FreeBSD GNOME Team Port Content-Transfer-Encoding: 7bit Cc: David Schultz Subject: Re: fenv.h fixes for softfloat X-BeenThere: freebsd-arm@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Porting FreeBSD to the StrongARM Processor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 14 Jan 2012 02:54:29 -0000 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 + * 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 +__FBSDID("$FreeBSD: $"); + +#include +#include + +#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 */