Home * Organizations * ICGA * Investigations * Rybka Controversy * Pre-Fruit Rybka and Crafty * Rybka-Crafty Evidence IV
< Prev Next >

by Mark Watkins

Copied code from the start of Crafty's Evaluate in pre-Beta Rybka.

Crafty Source

Here is the start of the Evaluate() code in Crafty 19.1, with some comments removed:
int Evaluate(TREE * RESTRICT tree, int ply, int wtm, int alpha, int beta) {
  register BITBOARD temp;
  register int square, file, score, tscore, w_tropism=0, b_tropism=0;
  register int w_spread, b_spread, trop, can_win=3;
// ... comments and #if stuff omitted
  if (TotalWhitePieces<13 && TotalBlackPieces<13) {
    can_win=EvaluateWinner(tree);
    if (EvaluateStalemate(tree,wtm)) can_win=0;
  }
  if (can_win == 0) return(DrawScore(wtm));

Pre-Beta Rybka Assembly

Here is the comparative code for pre-Beta Rybka:
0x00402a00:     push   %ebp                   # start of pre-Beta Rybka Evaluate()
0x00402a01:     mov    %esp,%ebp
0x00402a03:     sub    $0x44,%esp
0x00402a06:     push   %ebx
0x00402a07:     mov    0x10(%ebp),%ebx
0x00402a0a:     push   %esi
0x00402a0b:     mov    0x8(%ebp),%esi
0x00402a0e:     mov    0xb0a(%esi),%cl        # load "TotalWhitePieces"
0x00402a14:     mov    $0xd,%al               # 0xd is 13
0x00402a16:     cmp    %al,%cl                # compare "TotalWhitePieces" to 13
0x00402a18:     push   %edi
0x00402a19:     movl   $0x3,-0x1c(%ebp)       # set "can_win" to 3
0x00402a20:     jge    0x402a53
0x00402a22:     cmp    %al,0xb0b(%esi)        # compare "TotalBlackPieces" to 13
0x00402a28:     jge    0x402a53               # if both < 13
0x00402a2a:     push   %esi                       
0x00402a2b:     call   0x401630                 # call EvaluateWinner()
0x00402a30:     mov    %eax,%edi
0x00402a32:     push   %ebx
0x00402a33:     push   %esi
0x00402a34:     mov    %edi,-0x1c(%ebp)         # store function result in "can_win"
0x00402a37:     call   0x401130                 # call EvaluateStalemate()
0x00402a3c:     add    $0xc,%esp
0x00402a3f:     test   %eax,%eax                # if EvaluateStalemate() result is nonzero
0x00402a41:     jne    0x402a47                   # jump to loading DrawScore(wtm) and returning
0x00402a43:     test   %edi,%edi                # if "can_win" is now zero
0x00402a45:     jne    0x402a53                 # then do the next two lines (else skip)
0x00402a47:     mov    0x6b8d78(,%ebx,4),%eax   # get DrawScore(wtm), it seems
0x00402a4e:     jmp    0x402b9a                 # jump to function exit...
As can be seen, the use of "can_win" is the same (see also the page regarding 99999), as is the comparison to 13.

ToDo

Either Zach or Mark will disentangle EvaluateWinner() and EvaluateStalemate() to strengthen the evidence here.

Sidenote

As noted by Zach, this pre-Beta Rybka does not return the DrawScore(wtm) value directly, but first does some manipulations with it.
0x00402b9a:     cltd   
0x00402b9b:     sub    %edx,%eax
0x00402b9d:     sar    %eax
0x00402b9f:     test   %eax,%eax
0x00402ba1:     jle    0x404519
0x00402ba7:     cmp    $0x80,%eax
0x00402bac:     jl     0x404531
0x00402bb2:     add    $0xffffff80,%eax
0x00402bb5:     cltd   
0x00402bb6:     and    $0xf,%edx
0x00402bb9:     add    %edx,%eax
0x00402bbc:     sar    $0x4,%eax
0x00402bc0:     add    $0x80,%eax
0x00402bc9:     ret   
[...]
0x00404519:     cmp    $0xffffff80,%eax
0x0040451c:     jg     0x404531
0x0040451e:     add    $0x80,%eax
0x00404523:     cltd   
0x00404524:     and    $0xf,%edx
0x00404527:     add    %edx,%eax
0x00404529:     sar    $0x4,%eax
0x0040452c:     sub    $0x80,%eax
0x00404537:     ret  
I omitted the "pop" and %esp instructions in the last here, as they only have to do with preparing the stack for subroutine exit.

What links here?


Up one level