Author: Matt Taylor
Date: 17:56:05 01/03/03
Go up one level in this thread
On January 03, 2003 at 20:42:40, Robert Hyatt wrote:
>On January 03, 2003 at 20:23:59, Matt Taylor wrote:
>
>>On January 03, 2003 at 13:21:40, Robert Hyatt 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
>>>
>>>
>>>Why not something like this:
>>>
>>>rank=to>>3; (now we know the rank and only care if it is zero or seven, and
>>>it can't be zero for white or seven for black so side to move is not important).
>>>
>>>So, you end up with one line:
>>>
>>>
>>>if (to>>3==0 || to>>3==7) gen_promote();
>>>
>>>The compiler will only compute to>>3 once, although you end up with two
>>>branches.
>>>However with the newer pentium's clever "pattern matching branch prediction" it
>>>will
>>>tend to predict correctly most of the time since the above is not commonly going
>>>to be
>>>happening...
>>>
>>>I would always try the shortest/simplest approach first to let the compiler and
>>>the hardware
>>>try to do the right thing.
>>
>>Or simplify:
>>if ((to >> 3) == (7 & side)) gen_promote();
>>
>>The two expressions get computed in parallel and you end up with 1 branch.
>>
>>-Matt
>
>
>That won't work. 7&side won't give you what you are thinking. You will get
>zero or one, not zero or seven...
I meant to write 7 & -side. You will then get 0 or 7.
if ((to >> 3) == (7 & -side)) gen_promote();
-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.