Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: bool versus BOOL in C++

Author: Gerd Isenberg

Date: 23:10:16 09/27/03

Go up one level in this thread


On September 27, 2003 at 14:08:58, Koundinya Veluri wrote:

>On September 27, 2003 at 03:42:07, Gerd Isenberg wrote:
>
>>I use color (WHITE, BLACK) with int type, e.g. as array index.
>>Is there a way in C++ to assign the color to a bool (bool isBlack(int color))
>>only by moving or using a partial byte register, e.g. color is in EAX, so the
>>bool is already in AL?
>>
>>The compiler is not aware of the value range with only two values even with enum
>>(int) type, which map perfectly to bool. Therefore the compiler will perform
>>additional TEST and SETNZ instructions.
>>
>>If you use an int-BOOL and stay with probably ambiguous "TRUE"-values (all != 0)
>>that is not necessary.
>
>It's the compiler's fault if it can't recognize the enum case :). But anyway
>using my compiler I tested some things. The same assembly code is generated for
>these two functions:
>
>#define WHITE (0)
>#define BLACK (1)
>
>int isBlack1(int c)
>{
>    return c != WHITE;
>}
>
>bool isBlack2(int c)
>{
>    return c != WHITE;
>}
>
>The code generated is:
>
>; c = ecx
>	xor	eax, eax
>	test	ecx, ecx
>	setne	al
>
>For the function returning bool, the best I could do is return c & 1, which
>generates one and operation. Since the same code is generated for isBlack1() and
>isBlack2(), I see no advantage in using BOOL.

Ok, it may depend on the callee with inlined functions.
IIRC the ms-compiler does some optimization with int:

if ( isBlack(c))
...
; c = ecx
    test	ecx, ecx
    jnz         _isblack

instead of
; c = ecx
    xor	eax, eax
    test	ecx, ecx
    setne	al
    ....
    test    al, al
    jnz     _isblack

I agree that it is a compiler "fault" not to use the zero flag immediatly.
Same for boolean mapping with bit testing.

>
>If you are saying that no test is necessary for isBlack1(), then that's the same
>as returning c. But then there is no point to the function isBlack1(). You can
>just use the color directly in the calling function.

You are right, a dumb sample...
I mean immediate conditional statements with these boolean inliners,
instead
if ( color == WHITE )
if ( color.isWhite() )

>Also, there will be a
>problem in isWhite1() where basically a conversion to bool will be necessary.
>

Yes, one may use "!c" or "c^1" or "1-c".
My point with "bool" is, that there are often not necessary SETxx instructions.

>I also tried making the colors bool but when I use a bool as an array index,
>this compiler generates a movzx to zero the rest of the register and then uses
>the whole register as the index. Instead couldn't it just use the partial
>register as the index? That would be a possible solution too, if that worked.
>

No, x86 addressing modes only use 32-bit registers in 32-bit mode.
On Opteron one may use 32- and 64-bit registers in 64-bit mode.
Signed int32 is sign extended at runtime and need some extra time.

Gerd

>Koundinya



This page took 0 seconds to execute

Last modified: Thu, 15 Apr 21 08:11:13 -0700

Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.