[MLton] Re: [MLton-commit] r4672

Matthew Fluet fluet@cs.cornell.edu
Tue, 4 Jul 2006 17:55:41 -0400 (EDT)

> Went back to real primitives nextAfter{Down,Up} in place of nextAfter.
> These primitives work nicely without requiring the platform to have
> the C nextafter function (e.g. old Solaris).  And, they have a very
> simple implementation that meshes well with the SML code doing the
> special-case checks for nan, inf, and zero.  Someday, these C routines
> might go away when we have a faster PackReal and PackWord.  But the C
> code is so simple it will be impressive if we can ever get MLton to
> produce equivalently good code.

I don't see why MLton won't produce equivalently good code.  As I said 
before (http://mlton.org/pipermail/mlton/2006-May/028852.html):

   [BTW, what we really need are bitwise coercions between Real64.real and
   Word64.word and Real32.real and Word32.word.  Then the PackReal*
   structures can be implemented using the PackWord* structures.  Also, it
   would be nice to have the coercions for other things: doing sign and class
   functions in ML, rather than via C-functions.]

So, implementing nextAfter{Down,Up} wouldn't need to bounce through 
PackReal/PackWord ops:

fun nextAfterUp r =
   let val w = Primitive.Real64.toWord64 r
       val w' = Word64.+ (w, 0wx1)
       val r' = Primitive.Real64.fromWord64 w'

I think that will be just as good as the C-function (and better, since 
it'll be inlined).