[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