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

J. Gareth Moreton gareth at moreton-family.com
Sun Apr 29 23:56:58 CEST 2018

 Hi Florian.  Thorsten and I got down to a fairly optimised version of
Frac, in both speed and size:


 function Frac(const X: ValReal): ValReal; assembler; nostackframe;
   movq      rax,  xmm0
   shr       rax,  48
   and       ax,   $7FF0
   cmp       ax,   $4330
   jge       @@zero
   cvttsd2si rax,  xmm0
   cvtsi2sd  xmm4, rax
   subsd     xmm0, xmm4
   xorpd     xmm0, xmm0


 It fits into just three 16-byte blocks and is the fastest overall from our
tests, although there's a slight penalty if it jumps to @@zero that seems
to be architecture-dependent (e.g. it slows down for me, but Thorsten
didn't see much). Aligning @@zero to a 16-byte boundary may fix this for
some, but it doesn't for me.  Oh the joy of processor intracacies!

 Gareth aka. Kit.

 On Sun 29/04/18 19:28 , Florian Klaempfl florian at freepascal.org sent:
 Am 28.04.2018 um 17:57 schrieb Thorsten Engler: 
 >> -----Original Message----- 
 >> From: fpc-devel  On Behalf 
 >> Of Florian Klämpfl 
 >> So something like 
 >> cmp edx, $43300000 
 >> jge @@zero 
 >> cmp edx, $3FE00000 
 >> .align 16 
 >> jbe @@skip 
 >> might be much better. 
 > That ended up making things worse in some cases. 

 Can you take a look at the generated machine code if delphi uses proper 
 multi byte nops. If not, the align might make things indeed worse. 
 fpc-devel maillist - fpc-devel at lists.freepascal.org [2] 


[1] mailto:fpc-devel-bounces at lists.freepascal.org
[2] mailto:fpc-devel at lists.freepascal.org
[3] http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20180429/ded890ad/attachment.html>

More information about the fpc-devel mailing list