[fpc-devel] Policy on platform-specific compiler code

J. Gareth Moreton gareth at moreton-family.com
Fri Oct 16 10:14:31 CEST 2020

Hi everyone,

Before I go optimising the wrong thing, I have a question to ask.  
What's the policy on platform-specific assembly language in the 
compiler, or any code designed to run on a specific (source) platform 
(and using a more generic implementation otherwise via $ifdef)?  I ask 
because I have a faster algorithm for "calc_divconst_magic_unsigned" in 
'compiler/cgutils.pas', but it's only able to work because it can take 
advantage of the x86 DIV instruction using RDX:RAX (or EDX:EAX) as a 
double-wide dividend. It is somewhat faster than what currently exists 
because of the lack of a loop whose iteration count is proportional to 
log2(d), where d is the desired divisor (in other words, it's slower the 
bigger the divisor is, whereas my algorithm is constant speed).

Speaking of "calc_divconst_magic_unsigned", exactly what is the function 
doing? I'm guessing it's something akin to Newton-Raphson division, but 
there's no comments on documentation explaining which algorithm is being 
used (although I can appreciate what "magic_add" is just from my own 
experiences).  On a related note, its partner function, 
"calc_divconst_magic_signed", uses 'assert' rather than an internal 
error, which is a bit against the code guidelines, right?

Gareth aka. Kit

This email has been checked for viruses by Avast antivirus software.

More information about the fpc-devel mailing list