J. Gareth Moreton <gar...@moreton-family.com> schrieb am Di., 1. Mai 2018, 23:39:
> 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. > Thank you for the work so far. Does it also work correctly when exceptions are disabled? Regards, Sven >
_______________________________________________ fpc-devel maillist - fpc-devel@lists.freepascal.org http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel