quick question, probably of little importance...
Cecil Ward
cecil at cecilward.com
Mon May 1 03:53:24 UTC 2023
On Wednesday, 26 April 2023 at 23:07:39 UTC, WhatMeWorry wrote:
> On Wednesday, 26 April 2023 at 23:02:07 UTC, Richard (Rikki)
> Andrew Cattermole wrote:
>> Don't forget ``num % 2 == 0``.
>>
>> None should matter, pretty much all production compilers
>> within the last 30 years should recognize all forms of this
>> and do the right thing.
>
> Thanks. Fastest reply ever! And I believe across the world? I
> suppose my examples required overhead of a function call. So
> maybe num % 2 == 0 is fastest?
I made a small change, making the retval a bool rather than an
int. I got slightly better code generation with the int, as it
seems that some of the compilers have not yet got all the good
tricks they should be using when manipulating bool-typed
expressions and also it can be one extra instruction converting
values to bool strictly zero or one, not zero or any non-zero
value. Here’s the D, enlarged a little so that we can see your
routine in action, inlined. Your isEven boils down to two
instructions with a seriously optimising compiler. I’ve included
the x86-64 machine code generated by the GDC and LDC compilers so
you can see how fast it is. GDC made a bit of a dog’s breakfast
of my longer routine whereas LDC performed superbly. GDC
generated twice as much code, but its excellent instruction
scheduler and what looks like an awareness of ILP mean that the
two streams of instructions will be carried out in parallel so
the two streams will only take three instruction times - ie
whatever the total time is for those three instruction in the one
stream - not six.
bool isEven( int num )
{
return ! ( num & 1 );
}
bool AreBothEven( int a, int b ) // returns true if both
arguments are even
{
return isEven( a ) && isEven( b );
}
===
Compiler output:: GDC:: x86-64: -O3 -mcpu=native -frelease
bool isEven( int ):
mov eax, edi
not eax
and eax, 1
ret
bool AreBothEven( int, int ):
mov eax, edi
not esi
not eax
and esi, 1
and eax, 1
cmovne eax, esi
ret
===
Compiler LDC: x86-64: -O3 -mcpu=native -release
bool isEven( int ):
test dil, 1
sete al
ret
bool AreBothEven( int, int ):
or edi, esi
test dil, 1
sete al
ret
More information about the Digitalmars-d-learn
mailing list