[fpc-devel] Double-checking an optimisation
Martin Frb
lazarus at mfriebe.de
Sun Jan 9 16:28:21 CET 2022
On 09/01/2022 04:53, J. Gareth Moreton via fpc-devel wrote:
>
> On 09/01/2022 01:47, Martin Frb via fpc-devel wrote:
>>
>> I take it, it also is one (or two?) bytes longer? If that is in a
>> loop, which otherwise is exactly within a 32 byte aligned block, then
>> that could cause a slow down too. (If the loop is 16 bytes long, but
>> aligned to a 32byte-bound+16, then it may slow down if the loop code
>> size goes from 16 to 17 bytes, because that is when it goes over the
>> boundary of the 32byte block.
>> This is a bit hard to predict. But within very small loops (even 2 or
>> maybe 3 blocks of 32 bytes), size may be as important. (Actually a
>> good question, what weighs more....)
>> _______________________________________________
>> fpc-devel maillist - fpc-devel at lists.freepascal.org
>> https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel
>>
> jng .Lj188 would be 2 bytes long here since it's a short jump, while
> setg %bl and movzbl %bl,%ebx are 3 bytes long apiece, so the code size
> goes grow by 4 bytes overall (it would grow by 6 bytes if a REX prefix
> has to be used to encode, say, %r8b etc.)
>
> Some sizes are very hard to predict, like some optimisations are not
> performed under -Os because it would increase code size, but in some
> cases it causes a cascade that ends up both shrinking the code size
> and making the block several cycles faster.
Btw, have you seen this?
https://www.agner.org/optimize/optimizing_assembly.pdf
Page 70, it says that under some conditions a branch may be faster than
a conditional move.
More information about the fpc-devel
mailing list