Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Programmer challenge

Author: Omid David Tabibi

Date: 04:05:47 02/20/03

Go up one level in this thread


On February 20, 2003 at 06:16:25, Tony Werten wrote:

>On February 20, 2003 at 06:12:05, Tony Werten wrote:
>
>>On February 20, 2003 at 03:16:58, Ed Schröder wrote:
>>
>>>Taken from my web-page:
>>>
>>>Contrary to most chess programs, when going one ply deeper in the chess tree
>>>REBEL generates all moves for the given (and new) ply. During move generation
>>>REBEL quickly evaluates each move generated by using the piece-square technique,
>>>this evaluation is only used for move ordering later, it is certainly not for
>>>evaluating the position.
>>>
>>>The advantage of this time consuming process is that it pays off later when move
>>>ordering becomes an issue, this provided you have created 12 reasonable
>>>organized piece-square tables for the move generator. REBEL's data structure for
>>>move generation looks as follows:
>>>
>>>static char move_from  [5000];
>>>static char move_to    [5000];
>>>static char move_value [5000];
>>>
>>>So when adding a new generated move to "move_from" and "move_to" REBEL also will
>>>fill "move_value" via the corresponding piece-square table using the formula:
>>>
>>>move_value = table[move_to] - table[move_from];
>>>
>>>
>>>http://members.home.nl/matador/chess840.htm
>>>
>>>==============
>>>
>>>Data structure of "move_value" :
>>>
>>>255   : end of move list.
>>>1-254 : move_value = table[move_to] - table[move_from];
>>>0     : move already searched.
>>>
>>>Now whenever the Search needs a (new) move a routine is called that gets the
>>>(next) highest move from the move list and then this move is marked (zeroed) as
>>>being searched.
>>>
>>>This is a costly operation, during the years this is the best (fastest) code I
>>>was able to produce. The question is if there are better (faster) methods to get
>>>the highest value from an unsorted table.
>>>
>>>The main loop:
>>>
>>>        value=1;                 // work variable
>>>        x=....                   // pointer to move list table
>>>        y=-1;                    // pointer to highest value
>>>
>>>loop:   x++; if (move_value[x] <= value) goto loop;
>>>        if (move_value[x] == 255) return y;
>>
>>If all is nice in cache then doing:
>>
>>if (move_value[x] == 255) {
>>   movevalue[y]=movevalue[x]
>>   move[y]=move[x];
>>   movevalue[x]=255
>>   return y }
>
>Oops, you'll probably want to save the move in y first. Add a tempvar :)

You can swap two variables without using a temporary variable:
a ^= b ^= a ^= b;


>
>Tony
>
>>
>>will reduce the number of compares.
>>
>>Tony
>>
>>>        value=move_value[x];
>>>        y=x;
>>>        goto loop;
>>>
>>>-> "y" is the highest move from the table.
>>>
>>>===================
>>>
>>>in ASM I have this:
>>>
>>>        mov     BL,1		   // work variable
>>>	mov	EDX,...            // pointer to move list table
>>>	mov	ESI,-1             // pointer to highest value
>>>
>>>loop:   mov     CL,move_value[EDX] // CL = move_value[x]
>>>        inc     EDX                // x++
>>>
>>>        cmp     CL,BL              // if (move_value[x] <= value)
>>>        jbe     loop
>>>
>>>        cmp     CL,0FFh            // if (move_value[x]==255)
>>>        je      done
>>>
>>>        mov     BL,CL              // value=move_value[x]
>>>        mov     ESI,EDX            // y=x
>>>
>>>        jmp     loop
>>>
>>>
>>>==============
>>>
>>>Any faster methods?
>>>
>>>Ed



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.