Ian Lynagh wrote: > > Hi Brad, > > On Tue, Nov 20, 2007 at 09:50:02PM +1000, Brad Clow wrote: > > > > $ ./test > > 23 > > 24 > > I can't reproduce this. Can you please tell us what platform you are on > (e.g. x86_64 Linux) and what gcc --version says?
I see a bug that only affects x86_32. The native code generator (compiler/nativeGen/PprMach.hs) generates a simple fistp instruction for converting floats or doubles to int. with the usual default rounding mode (round) that means numbers between n+1/2 and n are rounded up instead of truncated. (relevant Code: pprInstr g@(GDTOI src dst) = pprG g (hcat [gtab, text "subl $4, %esp ; ", gpush src 0, gsemi, text "fistpl 0(%esp) ; popl ", pprReg I32 dst]) ) What's missing is the FPU control word manipulation to set the rounding mode appropriately, say pprinstr g@(GDTOI src dst) = pprG g (hcat [gtab, gpush src 0, text " ; subl $4, %esp ; fstcw 0(%esp) ; movl $0xC00, ", reg, text " ; orl 0(%esp), ", reg, text " ; pushl ", reg, text " ; fldcw 0(%esp) ; fistpl 0(%esp) ; popl ", reg, text " ; addl $4, %esp"]) where reg = pprReg I32 dst For reference, see http://www.eglibc.org/cgi-bin/viewcvs.cgi/fsf/glibc-2_3-branch/libc/sysdeps/i386/fpu/s_truncf.S?rev=10&sortby=date&view=markup HTH, Bertram _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe