[fpc-devel] Broken frac functionin FPC3.1.1 / Windows x86_64

Sven Barth pascaldragon at googlemail.com
Wed May 2 07:55:52 CEST 2018

J. Gareth Moreton <gareth at moreton-family.com> schrieb am Di., 1. Mai 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.

Thank you for the work so far. Does it also work correctly when exceptions
are disabled?


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20180502/caef16b9/attachment.html>

More information about the fpc-devel mailing list