[fpc-devel] Pure function Wiki page

J. Gareth Moreton gareth at moreton-family.com
Mon Jul 9 13:11:36 CEST 2018


I meant to say tan(Pi / 4) in that 
example. Sorry. Trying to assign tan(Pi / 
2) to something will probably cause an 
error, or at the very least be an 
interesting test case, because the result 
is undefined.

Gareth aka. Kit

On Mon 09/07/18 12:00 , "J. Gareth 
Moreton" gareth at moreton-family.com sent:
> Besides being able to assign the 
function 
> 
> result to constants, the main benefit is 
> 
> that, for constant inputs, the result is 
> 
> deterministic and so the compiler can 
> 
> calculate this beforehand and replace a 
> 
> function call with an assignment. For 
> 
> example, if tan was a regular function, 
x 
> 
> := tan(Pi / 2) might look like this in 
> 
> assembly:
> 
> 
> 
> MOVAPD XMM0, Pi
> 
> DIVSD XMM0, TwoConstant
> 
> CALL tan ; Result is now in XMM0, which 
is 
> 
> 1
> 
> 
> 
> It won't be exactly that, but you get 
the 
> 
> idea. If tan is defined as a pure 
> 
> function, then the result can be pre-
> 
> calculated and the entire block changed 
to 
> 
> a simple assignment:
> 
> 
> 
> MOVAPD XMM0, OneConstant ; value of 
tan(Pi 
> 
> / 2)
> 
> 
> 
> It doesn't take a genius to know that 
that 
> 
> is faster by several orders of 
magnitude.
> 
> 
> 
> More subtly, if it turns out that the 
> 
> function is never called with variable 
> 
> arguments, the entire function can be 
> 
> removed from the compiled binary, 
reducing 
> 
> its size.
> 
> 
> 
> Gareth aka. Kit
> 
> 
> 
> On Mon 09/07/18 10:25 , Sven Barth via 
> 
> fpc-devel fpc-devel at lists.freepascal.org 
> sent:
> 
> > Ryan Joseph  schrieb am Mo., 9. Juli 
> 
> 2018, 08:45:
> 
> > 
> 
> > > On Jul 8, 2018, at 8:50 AM, J. 
Gareth 
> 
> Moreton  wrote:
> 
> > > 
> 
> > > With some blessing from Florian on 
the 
> 
> concept, I've set up a Wiki page
> 
> > discussing the design proposals for 
the 
> 
> support of pure functions, as well
> 
> > as some explanation on what they 
> 
> actually are.
> 
> > > 
> 
> > 
> 
> > What are the performance benefits? It 
> 
> sounds like this is a proposal for a
> 
> > compiler optimization which we can 
> 
> explicitly opt in to, but what exactly
> 
> > is the optimization?
> 
> > 
> 
> > If nothing else I like the idea as a 
way 
> 
> to enforce a function is not
> 
> > accessing global state. Kind of like 
> 
> const for functions.
> 
> > 
> 
> > It would allow you to declare 
constants 
> 
> that use those functions with the
> 
> > compiler evaluating them at compile 
> 
> time. Also the compiler might be able
> 
> > to optimize such functions better 
> 
> especially if they're inlined. *shrugs*
> 
> > Regards,  Sven   
> 
> 
__________________________________________
> 
> _____
> 
> > fpc-devel maillist - fpc-
> 
> de
> vel at lists.freepascal.org
> > http://lists.freepascal.org/cgi-
> bin/mailman/listinfo/fpc-devel [1]
> 
> > 
> 
> > 
> 
> > 
> 
> > Links:
> 
> > ------
> 
> > [1]
> 
> > 
http://secureweb.fast.net.uk/parse.php?
> redirect=http://lists.freepascal.org
> > /cgi-bin/mailman/listinfo/fpc-devel
> 
> > 
> 
> 
> 
> 
__________________________________________
_____
> 
> fpc-devel maillist  -  fpc-
devel at lists.freepascal.org
> http://lists.freepascal.org/cgi-
bin/mailman/listinfo/fpc-devel
> 
> 
> 
> 




More information about the fpc-devel mailing list