Author: Walter Faxon
Date: 12:32:40 01/04/03
Go up one level in this thread
On January 03, 2003 at 19:52:06, Matt Taylor wrote:
>On January 03, 2003 at 12:03:45, Uri Blass wrote:
>
>>code B is slightly faster than code A.
>>I know that side can get only 0 or 1(something that the compiler does not know)
>>and B is eqvivalent to A if you assume that side gets only 0 or 1.
>>
>>Is it possible to write a third code that will be even faster than B?
>>
>>I think that if the compiler can know that side is or 0 or 1 it can do B even
>>faster.
>>
>>code A:
>>
>>if (side==LIGHT)
>>{
>> if (to>=56)
>> {
>> gen_promote(from,to,bits);
>> return;
>> }
>>}
>>else
>>{
>> if (to<=7)
>> {
>> gen_promote(from,to,bits);
>> return;
>> }
>>}
>>
>>code B:
>>if ((to+side*(63-2*to))>=56)
>>{
>> gen_promote(from,to,bits);
>> return;
>>}
>>
>>Uri
>
>Try this:
>if ((to + (-side & (63 - 2 * to))) >= 56)
>{
> gen_promote(from,to,bits);
> return;
>}
>
>If side is 0 or 1, -side will be 0 or -1 and can be used as a mask here. It is
>cheaper to do one's compliment and a bitwise and operation than a
>multiplication.
>
>The compiler -should- recognize that 2 * to = to << 1
ONLY IF 'to' is guaranteed positive. Try: "2 * (unsigned)to". Or explicit
shifting is always ok in my book. Use a comment or #if'ed-out debug code if you
want to keep things clear.
-- Walter
>
>FYI my gut instinct is that there is still potential for more optimization in
>the code that I posted. I believe one could reduce either the number of ops
>spent, data dependency, or something similar. I can't see it right now.
>
>-Matt
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.