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 } } }
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); } } }