[fpc-devel] Broken frac functionin FPC3.1.1 / Windows x86_64
J. Gareth Moreton
gareth at moreton-family.com
Tue May 1 23:38:58 CEST 2018
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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20180501/df0b514d/attachment.html>
More information about the fpc-devel
mailing list