#define sha_384_512 1 #define W64 SHA64 /* useful abbreviations */ #define C64 SHA64_CONST #define SR64 SHA64_SHR #define SL64 SHA64_SHL #define ROTRQ(x, n) (SR64(x, n) | SL64(x, 64-(n))) #define SIGMAQ0(x) (ROTRQ(x, 28) ^ ROTRQ(x, 34) ^ ROTRQ(x, 39)) #define SIGMAQ1(x) (ROTRQ(x, 14) ^ ROTRQ(x, 18) ^ ROTRQ(x, 41)) #define sigmaQ0(x) (ROTRQ(x, 1) ^ ROTRQ(x, 8) ^ SR64(x, 7)) #define sigmaQ1(x) (ROTRQ(x, 19) ^ ROTRQ(x, 61) ^ SR64(x, 6)) static const W64 K512[80] = /* SHA-384/512 constants */ { C64(0x428a2f98d728ae22), C64(0x7137449123ef65cd), C64(0xb5c0fbcfec4d3b2f), C64(0xe9b5dba58189dbbc), C64(0x3956c25bf348b538), C64(0x59f111f1b605d019), C64(0x923f82a4af194f9b), C64(0xab1c5ed5da6d8118), C64(0xd807aa98a3030242), C64(0x12835b0145706fbe), C64(0x243185be4ee4b28c), C64(0x550c7dc3d5ffb4e2), C64(0x72be5d74f27b896f), C64(0x80deb1fe3b1696b1), C64(0x9bdc06a725c71235), C64(0xc19bf174cf692694), C64(0xe49b69c19ef14ad2), C64(0xefbe4786384f25e3), C64(0x0fc19dc68b8cd5b5), C64(0x240ca1cc77ac9c65), C64(0x2de92c6f592b0275), C64(0x4a7484aa6ea6e483), C64(0x5cb0a9dcbd41fbd4), C64(0x76f988da831153b5), C64(0x983e5152ee66dfab), C64(0xa831c66d2db43210), C64(0xb00327c898fb213f), C64(0xbf597fc7beef0ee4), C64(0xc6e00bf33da88fc2), C64(0xd5a79147930aa725), C64(0x06ca6351e003826f), C64(0x142929670a0e6e70), C64(0x27b70a8546d22ffc), C64(0x2e1b21385c26c926), C64(0x4d2c6dfc5ac42aed), C64(0x53380d139d95b3df), C64(0x650a73548baf63de), C64(0x766a0abb3c77b2a8), C64(0x81c2c92e47edaee6), C64(0x92722c851482353b), C64(0xa2bfe8a14cf10364), C64(0xa81a664bbc423001), C64(0xc24b8b70d0f89791), C64(0xc76c51a30654be30), C64(0xd192e819d6ef5218), C64(0xd69906245565a910), C64(0xf40e35855771202a), C64(0x106aa07032bbd1b8),
void initmagicmoves(void) { int i; //for bitscans : //initmagicmoves_bitpos64_database[(x*C64(0x07EDD5E59A4E28C2))>>58] int initmagicmoves_bitpos64_database[64]={ 63, 0, 58, 1, 59, 47, 53, 2, 60, 39, 48, 27, 54, 33, 42, 3, 61, 51, 37, 40, 49, 18, 28, 20, 55, 30, 34, 11, 43, 14, 22, 4, 62, 57, 46, 52, 38, 26, 32, 41, 50, 36, 17, 19, 29, 10, 13, 21, 56, 45, 25, 31, 35, 16, 9, 12, 44, 24, 15, 8, 23, 7, 6, 5}; #ifdef MINIMIZE_MAGIC //identical to magicmove_x_indices except without the const modifer U64* magicmoves_b_indices2[64]= { magicmovesbdb+4992, magicmovesbdb+2624, magicmovesbdb+256, magicmovesbdb+896, magicmovesbdb+1280, magicmovesbdb+1664, magicmovesbdb+4800, magicmovesbdb+5120, magicmovesbdb+2560, magicmovesbdb+2656, magicmovesbdb+288, magicmovesbdb+928, magicmovesbdb+1312, magicmovesbdb+1696, magicmovesbdb+4832, magicmovesbdb+4928, magicmovesbdb+0, magicmovesbdb+128, magicmovesbdb+320, magicmovesbdb+960, magicmovesbdb+1344, magicmovesbdb+1728, magicmovesbdb+2304, magicmovesbdb+2432, magicmovesbdb+32, magicmovesbdb+160, magicmovesbdb+448, magicmovesbdb+2752, magicmovesbdb+3776, magicmovesbdb+1856, magicmovesbdb+2336, magicmovesbdb+2464, magicmovesbdb+64, magicmovesbdb+192, magicmovesbdb+576, magicmovesbdb+3264, magicmovesbdb+4288, magicmovesbdb+1984, magicmovesbdb+2368, magicmovesbdb+2496, magicmovesbdb+96, magicmovesbdb+224, magicmovesbdb+704, magicmovesbdb+1088, magicmovesbdb+1472, magicmovesbdb+2112, magicmovesbdb+2400, magicmovesbdb+2528, magicmovesbdb+2592, magicmovesbdb+2688, magicmovesbdb+832, magicmovesbdb+1216, magicmovesbdb+1600, magicmovesbdb+2240, magicmovesbdb+4864, magicmovesbdb+4960, magicmovesbdb+5056, magicmovesbdb+2720, magicmovesbdb+864, magicmovesbdb+1248, magicmovesbdb+1632, magicmovesbdb+2272, magicmovesbdb+4896, magicmovesbdb+5184 }; U64* magicmoves_r_indices2[64]= { magicmovesrdb+86016, magicmovesrdb+73728, magicmovesrdb+36864, magicmovesrdb+43008, magicmovesrdb+47104, magicmovesrdb+51200, magicmovesrdb+77824, magicmovesrdb+94208, magicmovesrdb+69632, magicmovesrdb+32768, magicmovesrdb+38912, magicmovesrdb+10240, magicmovesrdb+14336, magicmovesrdb+53248, magicmovesrdb+57344, magicmovesrdb+81920, magicmovesrdb+24576, magicmovesrdb+33792, magicmovesrdb+6144, magicmovesrdb+11264, magicmovesrdb+15360, magicmovesrdb+18432, magicmovesrdb+58368, magicmovesrdb+61440, magicmovesrdb+26624, magicmovesrdb+4096, magicmovesrdb+7168, magicmovesrdb+0, magicmovesrdb+2048, magicmovesrdb+19456, magicmovesrdb+22528, magicmovesrdb+63488, magicmovesrdb+28672, magicmovesrdb+5120, magicmovesrdb+8192, magicmovesrdb+1024, magicmovesrdb+3072, magicmovesrdb+20480, magicmovesrdb+23552, magicmovesrdb+65536, magicmovesrdb+30720, magicmovesrdb+34816, magicmovesrdb+9216, magicmovesrdb+12288, magicmovesrdb+16384, magicmovesrdb+21504, magicmovesrdb+59392, magicmovesrdb+67584, magicmovesrdb+71680, magicmovesrdb+35840, magicmovesrdb+39936, magicmovesrdb+13312, magicmovesrdb+17408, magicmovesrdb+54272, magicmovesrdb+60416, magicmovesrdb+83968, magicmovesrdb+90112, magicmovesrdb+75776, magicmovesrdb+40960, magicmovesrdb+45056, magicmovesrdb+49152, magicmovesrdb+55296, magicmovesrdb+79872, magicmovesrdb+98304 }; #endif // MINIMIZE_MAGIC #ifdef PERFECT_MAGIC_HASH for(i=0;i<1428;i++) magicmovesbdb[i]=0; for(i=0;i<4900;i++) magicmovesrdb[i]=0; #endif for(i=0;i<64;i++) { int squares[64]; int numsquares=0; U64 temp=magicmoves_b_mask[i]; while(temp) { U64 bit=temp&-temp; squares[numsquares++]=initmagicmoves_bitpos64_database[(bit*C64(0x07EDD5E59A4E28C2))>>58]; temp^=bit; } for(temp=0;temp<(((U64)(1))<<numsquares);temp++) { U64 tempocc=initmagicmoves_occ(squares,numsquares,temp); #ifndef PERFECT_MAGIC_HASH BmagicNOMASK2(i,tempocc)=initmagicmoves_Bmoves(i,tempocc); #else U64 moves=initmagicmoves_Bmoves(i,tempocc); U64 index=(((tempocc)*magicmoves_b_magics[i])>>MINIMAL_B_BITS_SHIFT); int j; for(j=0;j<1428;j++) { if(!magicmovesbdb[j]) { magicmovesbdb[j]=moves; magicmoves_b_indices[i][index]=j; break; } else if(magicmovesbdb[j]==moves) { magicmoves_b_indices[i][index]=j; break; } } #endif } } for(i=0;i<64;i++) { int squares[64]; int numsquares=0; U64 temp=magicmoves_r_mask[i]; while(temp) { U64 bit=temp&-temp; squares[numsquares++]=initmagicmoves_bitpos64_database[(bit*C64(0x07EDD5E59A4E28C2))>>58]; temp^=bit; } for(temp=0;temp<(((U64)(1))<<numsquares);temp++) { U64 tempocc=initmagicmoves_occ(squares,numsquares,temp); #ifndef PERFECT_MAGIC_HASH RmagicNOMASK2(i,tempocc)=initmagicmoves_Rmoves(i,tempocc); #else U64 moves=initmagicmoves_Rmoves(i,tempocc); U64 index=(((tempocc)*magicmoves_r_magics[i])>>MINIMAL_R_BITS_SHIFT); int j; for(j=0;j<4900;j++) { if(!magicmovesrdb[j]) { magicmovesrdb[j]=moves; magicmoves_r_indices[i][index]=j; break; } else if(magicmovesrdb[j]==moves) { magicmoves_r_indices[i][index]=j; break; } } #endif } } }
* typedef struct transpositionTable { U64 hashValue; int bestmove; int depthValue; char flags; int nodeScore; } */ #include <stdlib.h> #include "defs.h" transpositionTable tt[TRANS_TBL_ENTRIES]; const U64 hashMask = C64(0x7fffffffffffffff); const int LOWERBOUND=0; const int UPPERBOUND=1; bool useTT; int probes=0, hits=0, stores=0, usefulScores=0, repetitionsFound=0; int tt_getIndex(U64 hash); int tt_getDepth(U64 hash2) { int index2=tt_getIndex(hash2); return tt[index2].depthValue; } int tt_getScore(U64 hash2) { int index2=tt_getIndex(hash2); return tt[index2].nodeScore;
const unsigned int magicmoves_r_shift[64]= { 52, 53, 53, 53, 53, 53, 53, 52, 53, 54, 54, 54, 54, 54, 54, 53, 53, 54, 54, 54, 54, 54, 54, 53, 53, 54, 54, 54, 54, 54, 54, 53, 53, 54, 54, 54, 54, 54, 54, 53, 53, 54, 54, 54, 54, 54, 54, 53, 53, 54, 54, 54, 54, 54, 54, 53, 53, 54, 54, 53, 53, 53, 53, 53 }; const U64 magicmoves_r_magics[64]= { C64(0x0080001020400080), C64(0x0040001000200040), C64(0x0080081000200080), C64(0x0080040800100080), C64(0x0080020400080080), C64(0x0080010200040080), C64(0x0080008001000200), C64(0x0080002040800100), C64(0x0000800020400080), C64(0x0000400020005000), C64(0x0000801000200080), C64(0x0000800800100080), C64(0x0000800400080080), C64(0x0000800200040080), C64(0x0000800100020080), C64(0x0000800040800100), C64(0x0000208000400080), C64(0x0000404000201000), C64(0x0000808010002000), C64(0x0000808008001000), C64(0x0000808004000800), C64(0x0000808002000400), C64(0x0000010100020004), C64(0x0000020000408104), C64(0x0000208080004000), C64(0x0000200040005000), C64(0x0000100080200080), C64(0x0000080080100080), C64(0x0000040080080080), C64(0x0000020080040080), C64(0x0000010080800200), C64(0x0000800080004100), C64(0x0000204000800080), C64(0x0000200040401000), C64(0x0000100080802000), C64(0x0000080080801000), C64(0x0000040080800800), C64(0x0000020080800400), C64(0x0000020001010004), C64(0x0000800040800100), C64(0x0000204000808000), C64(0x0000200040008080), C64(0x0000100020008080), C64(0x0000080010008080), C64(0x0000040008008080), C64(0x0000020004008080), C64(0x0000010002008080), C64(0x0000004081020004), C64(0x0000204000800080), C64(0x0000200040008080), C64(0x0000100020008080), C64(0x0000080010008080), C64(0x0000040008008080), C64(0x0000020004008080), C64(0x0000800100020080), C64(0x0000800041000080), C64(0x00FFFCDDFCED714A), C64(0x007FFCDDFCED714A), C64(0x003FFFCDFFD88096), C64(0x0000040810002101), C64(0x0001000204080011), C64(0x0001000204000801), C64(0x0001000082000401), C64(0x0001FFFAABFAD1A2)
void init_magic() { int i; //for bitscans : //initmagicmoves_bitpos64_database[(x*C64(0x07EDD5E59A4E28C2))>>58] int initmagicmoves_bitpos64_database[64] = { 63, 0, 58, 1, 59, 47, 53, 2, 60, 39, 48, 27, 54, 33, 42, 3, 61, 51, 37, 40, 49, 18, 28, 20, 55, 30, 34, 11, 43, 14, 22, 4, 62, 57, 46, 52, 38, 26, 32, 41, 50, 36, 17, 19, 29, 10, 13, 21, 56, 45, 25, 31, 35, 16, 9, 12, 44, 24, 15, 8, 23, 7, 6, 5 }; //identical to magicmove_x_indices except without the const modifer u64* bishop_indices2[64]= { magicmovesbdb+4992, magicmovesbdb+2624, magicmovesbdb+256, magicmovesbdb+896, magicmovesbdb+1280, magicmovesbdb+1664, magicmovesbdb+4800, magicmovesbdb+5120, magicmovesbdb+2560, magicmovesbdb+2656, magicmovesbdb+288, magicmovesbdb+928, magicmovesbdb+1312, magicmovesbdb+1696, magicmovesbdb+4832, magicmovesbdb+4928, magicmovesbdb+0, magicmovesbdb+128, magicmovesbdb+320, magicmovesbdb+960, magicmovesbdb+1344, magicmovesbdb+1728, magicmovesbdb+2304, magicmovesbdb+2432, magicmovesbdb+32, magicmovesbdb+160, magicmovesbdb+448, magicmovesbdb+2752, magicmovesbdb+3776, magicmovesbdb+1856, magicmovesbdb+2336, magicmovesbdb+2464, magicmovesbdb+64, magicmovesbdb+192, magicmovesbdb+576, magicmovesbdb+3264, magicmovesbdb+4288, magicmovesbdb+1984, magicmovesbdb+2368, magicmovesbdb+2496, magicmovesbdb+96, magicmovesbdb+224, magicmovesbdb+704, magicmovesbdb+1088, magicmovesbdb+1472, magicmovesbdb+2112, magicmovesbdb+2400, magicmovesbdb+2528, magicmovesbdb+2592, magicmovesbdb+2688, magicmovesbdb+832, magicmovesbdb+1216, magicmovesbdb+1600, magicmovesbdb+2240, magicmovesbdb+4864, magicmovesbdb+4960, magicmovesbdb+5056, magicmovesbdb+2720, magicmovesbdb+864, magicmovesbdb+1248, magicmovesbdb+1632, magicmovesbdb+2272, magicmovesbdb+4896, magicmovesbdb+5184 }; u64* rook_indices2[64]= { magicmovesrdb+86016, magicmovesrdb+73728, magicmovesrdb+36864, magicmovesrdb+43008, magicmovesrdb+47104, magicmovesrdb+51200, magicmovesrdb+77824, magicmovesrdb+94208, magicmovesrdb+69632, magicmovesrdb+32768, magicmovesrdb+38912, magicmovesrdb+10240, magicmovesrdb+14336, magicmovesrdb+53248, magicmovesrdb+57344, magicmovesrdb+81920, magicmovesrdb+24576, magicmovesrdb+33792, magicmovesrdb+6144, magicmovesrdb+11264, magicmovesrdb+15360, magicmovesrdb+18432, magicmovesrdb+58368, magicmovesrdb+61440, magicmovesrdb+26624, magicmovesrdb+4096, magicmovesrdb+7168, magicmovesrdb+0, magicmovesrdb+2048, magicmovesrdb+19456, magicmovesrdb+22528, magicmovesrdb+63488, magicmovesrdb+28672, magicmovesrdb+5120, magicmovesrdb+8192, magicmovesrdb+1024, magicmovesrdb+3072, magicmovesrdb+20480, magicmovesrdb+23552, magicmovesrdb+65536, magicmovesrdb+30720, magicmovesrdb+34816, magicmovesrdb+9216, magicmovesrdb+12288, magicmovesrdb+16384, magicmovesrdb+21504, magicmovesrdb+59392, magicmovesrdb+67584, magicmovesrdb+71680, magicmovesrdb+35840, magicmovesrdb+39936, magicmovesrdb+13312, magicmovesrdb+17408, magicmovesrdb+54272, magicmovesrdb+60416, magicmovesrdb+83968, magicmovesrdb+90112, magicmovesrdb+75776, magicmovesrdb+40960, magicmovesrdb+45056, magicmovesrdb+49152, magicmovesrdb+55296, magicmovesrdb+79872, magicmovesrdb+98304 }; for(i = 0; i < 64; i++) { int squares[64]; int numsquares = 0; u64 temp = bishop_mask[i]; while (temp) { u64 bit = temp & -temp; squares[numsquares++] = initmagicmoves_bitpos64_database[(bit * C64(0x07EDD5E59A4E28C2)) >> 58]; temp ^= bit; } for(temp = 0; temp < (((u64)(1)) << numsquares); temp++) { u64 tempocc = initmagicmoves_occ(squares, numsquares, temp); BmagicNOMASK2(i, tempocc) = initmagicmoves_Bmoves(i, tempocc); } } for(i = 0; i < 64; i++) { int squares[64]; int numsquares = 0; u64 temp = rook_mask[i]; while(temp) { u64 bit = temp & -temp; squares[numsquares++] = initmagicmoves_bitpos64_database[(bit * C64(0x07EDD5E59A4E28C2)) >> 58]; temp ^= bit; } for(temp = 0; temp < (((u64)(1)) << numsquares); temp++) { u64 tempocc = initmagicmoves_occ(squares, numsquares, temp); RmagicNOMASK2(i, tempocc) = initmagicmoves_Rmoves(i, tempocc); } } }