[MLton-user] ieee-fp flag
Matthew Fluet
fluet at tti-c.org
Thu Sep 13 08:52:52 PDT 2007
> Is there a description anywhere of exactly how MLton will deviate from
> the IEEE floating point standard when the -ieee-fp flag is enabled? I
> couldn't find any details on the internet.
With '-ieee-fp true' option, the native codegen acts similar to the
behavior of gcc with the '-ffloat-store' option. That is, floating-point
values are never cached in floating-point registers. For each operation,
floating-point values are fetched from memory and the result is
immediately written back to memory.
This is the well known problem of the x86 floating-point unit using 80bit
precision for all operations. If one performs a sequence of
floating-point operations, leaving intermediate results on the
floating-point stack, then one is actually computing the intermediate
results at 80bit precision, not the 64bit precision required of the
SML Real64.real type (and of the C double type).
So, with '-ieee-fp false' (the default), MLton will deviate from the IEEE
floating point standard by virtue of the fact that computations on 64-bit
floating point values may actually be performed at 80bit precision.
(MLton uses the floating-point hardware for arithmetic, comparisons, sqrt,
trig functions, exp, ln, log10 on the x86.) If and when a result is
rounded to 64bits depends on the vagaries of the register allocator and
when spilling is required by calling conventions, as the rounding will
only occur when a floating-point value is written to memory.
This computing at 80bit precision also affects the SML Real32.real type
(and the C float type).
It is possible to set the x86 processor in a mode that forces computations
to occur at 64bit (or 32bit precision, I believe), but that can have
undesirable consequences when calling into system libraries. FreeBSD sets
the processor to this mode by default; Linux does not. Also, note that
even in this mode, Real32.real computations are being done at 64bit
precision, so one can still get excess precision artifacts.
AFAIK, this is a problem that plagues most x86 compilers.
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=323
On amd64, MLton uses the SSE extensions, so all floating-point arithmetic,
comparisions, and sqrt are done in hardware at the required IEEE
precision. (On the other hand, the remaining floating-point operations
must call out to the system math library.)
More information about the MLton-user
mailing list