It turns out I did over-engineer the solution somewhat - this version is far more efficient, honours NaNs and triggers SIGFPE if infinity is passed in (subsd triggers it), hence there are no regressions.
**** function fpc_frac_real(d: ValReal): ValReal; compilerproc; assembler; nostackframe; asm movq %xmm0, %rax movapd %xmm0, %xmm4 shr $48, %rax and $0x7ff0,%ax cmp $0x4330,%ax jge .L0 cvttsd2si %xmm0, %rax cvtsi2sd %rax, %xmm4 .L0: subsd %xmm4, %xmm0 end; **** This is effectively "x - Int(x)" with some opcode reordering to take advantage of the multiple SSE ports present in a processor (hence the positioning of "movapd %xmm0,%xmm4" in between "movq %xmm0,%rax" and "shr $48,%rax") - it is generally equal in speed to my last routine and is faster when dealing with numbers that don't have fractional components. It is also only 38 bytes in size. New patch coming soon once I test it properly. Gareth aka. Kit
_______________________________________________ fpc-devel maillist - [email protected] http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel
