Rybka-Crafty Evidence IV
Home * Organizations * ICGA * Investigations * Rybka Controversy * Pre-Fruit Rybka and Crafty * Rybka-Crafty Evidence IV
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.