Date: Wed, 30 Oct 2002 16:22:39 -0700 (MST) From: "M. Warner Losh" <imp@bsdimp.com> To: bde@zeta.org.au Cc: rittle@labs.mot.com, rittle@latour.rsch.comm.mot.com, current@FreeBSD.ORG, dschultz@uclink.Berkeley.EDU Subject: Re: Lack of real long double support Message-ID: <20021030.162239.52163953.imp@bsdimp.com> In-Reply-To: <20021030215500.E5692-100000@gamplex.bde.org> References: <20021030.012222.123041962.imp@bsdimp.com> <20021030215500.E5692-100000@gamplex.bde.org>
next in thread | previous in thread | raw e-mail | index | archive | help
In message: <20021030215500.E5692-100000@gamplex.bde.org>
Bruce Evans <bde@zeta.org.au> writes:
: The reasons are the same as they used to be: incomplete language support
: and incomplete library support. Language support is being completed but
: is far from here yet. See the paper referenced in Loren's reply for more
: details than anyone should want to know.
OK. I'll have to go back and find that reference. I'd really like to
change the __INITIAL_NPXCW__ from 0x127f to 0x137f in npx.h. I think
that we can get the library support in place over time, as this
already is a bullet item in the standards todo list web page. The gcc
3.2 compiler does a decent, but not perfect, job of dealing with the
floating point stuff.
I'll have to dive into the archive to find said paper.
: > : > : gcc 3.3 will support a framework in which such changes would be easy
: > : > : to convey at compile-time but, to my knowledge, there is no support
: > : > : yet to obtain e.g. the precision setting at run-time. I.e. <float.h>
: > :
: > : FreeBSD (on i386's) has fpgetprec() to get it and fpsetprec() to set it,
: > : but these are nonstandard and won't become standard. They don't exist
: > : on most or all non-i386's now, unlike fpget/setround() which will become
: > : the standard feget/setround().
: >
: > Is there some reason we can't just put them into the machine specific
: > startup code like I've done with the tree.
:
: Putting them there would just blow away the kernel default. There are
: arguments for putting the in both places, but not at the same time.
: Linux seems to have gone the other way and move the initialization
: from crt to the kernel. I'm not sure what happened to moves to set the
: Linux default for Linux applications in the kernel.
Yea, putting it in crt is bogus. Forget I suggested it.
: C99 encourages having a behaviour that is known at compile time and
: telling applications about it in FLT_EVAL_METHOD (this can be set to
: -1 == indeterminable, but that would not be very useful although it
: is the only correct setting now). The compiler should implement the
: system implementor's choice or enforce its own choice. gcc doesn't
: really understand this this. gcc-3.2 thinks that it implementing
: method 0 (no extension of precision) but the npx hardware is nothing
: like that.
I don't understand this completely. ARe you saying that gcc is doing
something worng?
: The compiler doesn't have any special problems knowing the state of
: the precision control on entry to functions. It just needs the initial
: value to be set correctly and the state to not change underneath it
: like it already requires for other aspects of the state. Changing the
: state using fpset*() counts as changing the state underneath it here.
I do understand this, which is why changing the defaults seems
reasonable to me.
BTW, NetBSD is kinda schizophrenic about this:
/*
* The i387 defaults to Intel extended precision mode and round to nearest,
* with all exceptions masked.
*/
#define __INITIAL_NPXCW__ 0x037f
/* NetBSD uses IEEE double precision. */
#define __NetBSD_NPXCW__ 0x127f
/* FreeBSD leaves some exceptions unmasked as well. */
#define __FreeBSD_NPXCW__ 0x1272
/* iBCS2 goes a bit further and leaves the underflow exception unmasked. */
#define __iBCS2_NPXCW__ 0x0262
/* Linux just uses the default control word. */
#define __Linux_NPXCW__ 0x037f
/* SVR4 uses the same control word as iBCS2. */
#define __SVR4_NPXCW__ 0x0262
So their float.h values are correct only for Linux binaries and
emulation. Also, it looks like FreeBSD_NPXCW is incorrect, since we
have:
#define __INITIAL_NPXCW__ 0x127F
And there's a comment:
* 64-bit precision often gives bad results with high level languages
* because it makes the results of calculations depend on whether
* intermediate values are stored in memory or in FPU registers.
which seems like a compiler issue, not an OS issue to me.
Warner
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20021030.162239.52163953.imp>
