From: Fabian Fichter Date: Sun, 5 May 2019 12:26:21 +0000 (+0200) Subject: Split rook magics into horizontal and vertical X-Git-Url: http://winboard.nl/cgi-bin?a=commitdiff_plain;h=f9a0f19070adb5ad74c53edf6644dbeb36e99234;p=fairystockfish.git Split rook magics into horizontal and vertical --- diff --git a/src/bitboard.cpp b/src/bitboard.cpp index 0c4c3d9..6aef4f2 100644 --- a/src/bitboard.cpp +++ b/src/bitboard.cpp @@ -22,6 +22,7 @@ #include #include "bitboard.h" +#include "magic.h" #include "misc.h" #include "piece.h" @@ -38,271 +39,23 @@ Bitboard BoardSizeBB[FILE_NB][RANK_NB]; RiderType AttackRiderTypes[PIECE_TYPE_NB]; RiderType MoveRiderTypes[PIECE_TYPE_NB]; -Magic RookMagics[SQUARE_NB]; +Magic RookMagicsH[SQUARE_NB]; +Magic RookMagicsV[SQUARE_NB]; Magic BishopMagics[SQUARE_NB]; namespace { #ifdef LARGEBOARDS - Bitboard RookTable[0xA80000]; // To store rook attacks + Bitboard RookTableH[0x11800]; // To store rook attacks + Bitboard RookTableV[0x4800]; // To store rook attacks Bitboard BishopTable[0x33C00]; // To store bishop attacks #else - Bitboard RookTable[0x19000]; // To store rook attacks + Bitboard RookTableH[0xA00]; // To store rook attacks + Bitboard RookTableV[0xA00]; // To store rook attacks Bitboard BishopTable[0x1480]; // To store bishop attacks #endif #ifdef PRECOMPUTED_MAGICS -#define B(a, b) (Bitboard(a) << 64) ^ Bitboard(b) - // Use precomputed magics if pext is not avaible, - // since the magics generation is very slow. - Bitboard RookMagicInit[SQUARE_NB] = { - B(0x4068000028000894, 0x20006051028), - B(0x2004000042000004, 0x2810000008004000), - B(0x1020000220004000, 0x8004290180020200), - B(0x4310000101000020, 0x8020100004002000), - B(0x38000080211108, 0x118000104000000), - B(0x4050000080400004, 0x2011040500118010), - B(0x4010000048100200, 0x100000840204000), - B(0x4020000820000100, 0x410106024000804), - B(0x910000008D00021, 0x800004400100010), - B(0x6830000821080004, 0x80C00010100000), - B(0x8040000040500008, 0x200031840804901), - B(0x4018000042201000, 0x8300002D80000841), - B(0x100008000044000, 0x1980020094A89400), - B(0x1000004000082000, 0x4408540710000181), - B(0x1206010001100802, 0x40004100048), - B(0x984010000410001, 0x208080028AE), - B(0x411210000261014, 0x8000414100011208), - B(0x8200100000B0002, 0x1082008404000008), - B(0x5004090000400096, 0x10004020001000E2), - B(0x8899220000020001, 0x8401004904082000), - B(0x801720000080040, 0x101000200082020), - B(0x800060000102411, 0xA8200008808400), - B(0x30C0000081004, 0x1004200082100418), - B(0x1018010000020102, 0x4100000040014082), - B(0x24000008000001, 0x4080041809020000), - B(0x3011200814000104, 0x2110004020000000), - B(0x1814410050000800, 0x4041010220000400), - B(0x20B002010000211, 0x100104188808), - B(0x821020000114, 0x22080A0200304020), - B(0xC0E0020000082, 0x1004108210042000), - B(0x9010010000084, 0x2000011014020406), - B(0x400208018000040, 0x20D000052800018), - B(0x108008000080, 0x240400000104), - B(0x8012001080004400, 0x102010420201000), - B(0x1000000C0001210, 0x821000080441200), - B(0x1C500000200004D0, 0x20042084400410), - B(0x4000284000108000, 0x1809420810080140), - B(0x40804004000, 0x2220005410000000), - B(0x4007080A1020000, 0x8004020D41200020), - B(0x1080000800008000, 0x4080210000002002), - B(0x400000400250000, 0x8000001100410000), - B(0xC8010090010001, 0x2004000068009022), - B(0x8300200008210000, 0x410804100111004), - B(0x42150008210000, 0x81100004A400200), - B(0x2C1410001810001, 0x8200800000411020), - B(0x28420004020000, 0x409002880830900), - B(0x200028000008000, 0x8100000040200004), - B(0x4001030120000, 0x41008A020140404), - B(0x288000004240804, 0x2410020000090), - B(0x104202000004004, 0x2008010000040), - B(0x800A020008022020, 0x4112108040400), - B(0x90044001082420, 0x239806020040A), - B(0x4018000414800030, 0x2001100010000), - B(0x102820010088120, 0x8002004090008), - B(0x280100200000410, 0x840441100000), - B(0x4A020000040020, 0x10820040C0881), - B(0x20000010020, 0x21000800402010), - B(0x161A0400212C80, 0x42000400203002), - B(0xAB00800181208440, 0x3120A01004040), - B(0x261100084025060, 0x81800A2100400), - B(0x1008000000A02000, 0x940000010040910), - B(0x1406400004A010, 0x100011080188C05), - B(0x400002000011000, 0x2080005008080002), - B(0x402C1004012, 0x600004200488003), - B(0x1800080802000409, 0x200012061200104), - B(0x843020018100800, 0xE2000040100E0A04), - B(0xA0010200005048, 0x80000851000012), - B(0x20000900041, 0x200006904002024), - B(0x20010000080002, 0x100000490211000), - B(0x1000018070C, 0x4100008200400010), - B(0x40000004101060, 0x40000109A800112), - B(0x44000908010404, 0x2200000420010409), - B(0x169D042288081204, 0x18000040A000), - B(0x1000041002000, 0x6040040001208000), - B(0x130040088200DA, 0x81600004010300), - B(0x3000062004000220, 0x8404200010200020), - B(0xC000102000020A, 0x108200004001000), - B(0x2000008606120000, 0xC010200008010821), - B(0x80040200000100, 0x80080000800440), - B(0x508028000040100, 0x4280000800124), - B(0x5AA422000B810100, 0xA802200002004404), - B(0x10000A0000012100, 0x8080200000400802), - B(0x240048004008102, 0x200400010800100), - B(0x4140030108004, 0x8C012000024909A0), - B(0x1400018A0A8000, 0x90841080008200), - B(0xA500120088001010, 0x4040020200008042), - B(0x5008024008888001, 0x1A0200A00005000), - B(0x4004D13000026, 0x800008008000A012), - B(0x201501022901000E, 0x8000024100001102), - B(0xE80010140000800C, 0x20004B1080000820), - B(0x8011010100046A00, 0x90010000C021), - B(0x1008020008401440, 0x80900020000E088), - B(0x100088000040000, 0x8124800080002200), - B(0x12C04120401200, 0x410500E80004040B), - B(0x9904A0100020008, 0x800108400020040), - B(0x4000842405D0004, 0x10220200000080), - B(0x4000001080802010, 0x4040880A00200001), - B(0x4000001080802010, 0x4040880A00200001), - B(0x800002021008000, 0xA04000420020000C), - B(0x12A6020000304, 0x8290144200000), - B(0x102803020008, 0x40824014A0200000), - B(0x1400020080210008, 0x8001004000500000), - B(0x120000148212, 0x801C001003A00000), - B(0x2020002908040, 0x2000804140200000), - B(0x820000010080, 0x10A2020420200000), - B(0x508200022440, 0xB004001108800040), - B(0x8202004084010C81, 0xC081A03000400008), - B(0xB04080040204050, 0x1810028080200000), - B(0xAA20014010120001, 0x80308004022200), - B(0xAA20014010120001, 0x80308004022200), - B(0x208018020814020, 0x2004020200410A00), - B(0x6000801000002800, 0xC80121082004080), - B(0x84002080140202, 0x8000004100090100), - B(0x3100114050000, 0x2000818014000100), - B(0x280805000008A400, 0x401042000000300), - B(0x245A20000040401, 0x1000850102080200), - B(0x4010430000D00240, 0xD0800001201100), - B(0x20000080040, 0x9053000880500600), - B(0x1840000610021088, 0x440801002428400), - B(0x448814040010, 0x8410085020500600) - }; - Bitboard BishopMagicInit[SQUARE_NB] = { - B(0x2001040305000010, 0x830200040400082), - B(0x1042400080E01200, 0x2004904010811400), - B(0x400010120200, 0x880080D080018000), - B(0x240190C00100040, 0x100A020140044404), - B(0x1018010404010004, 0x1001010018081E0), - B(0x41200A804C0904, 0x40000322000008), - B(0x4001180A004, 0x8000001106000000), - B(0x6006020020030600, 0x1840002100004841), - B(0x4200200100, 0x4001041808002000), - B(0x4100020050124600, 0x1001802902400CA0), - B(0x448C0081440161, 0x200206010008000), - B(0x400008008008408, 0x1000080210100080), - B(0x200280C01008200, 0x210200813000080), - B(0x1A000204400, 0x222200401023000), - B(0x10081040640A00, 0x8410021881400000), - B(0x1840400318080008, 0x800800840080000), - B(0x4204050C040, 0x6500600200140000), - B(0x1012100040204, 0x402404444400000), - B(0x6000012680008240, 0x410140000004220), - B(0x1000020810040008, 0x2D0011000060000), - B(0x1020020400, 0x400108059001001), - B(0x400020001100808, 0x480204800200000B), - B(0x10000010030084, 0x2042000848900022), - B(0x10000010030084, 0x2042000848900022), - B(0x100D801402400, 0x1512404009000400), - B(0x8000208005112400, 0xA02040401000000), - B(0x1000420002800200, 0x4CA000183020000), - B(0x800811480020, 0x408801010224001), - B(0xC805200810900100, 0x9000084204004020), - B(0x8200160204100004, 0x8040004004002022), - B(0x104514013080080, 0x146410040001000), - B(0x140844000080002, 0x1008102020040001), - B(0x4040400041A2002, 0x8040000A8802510), - B(0x801014041008002, 0x80068008025200), - B(0xA00540A414040, 0x4101040010A0000), - B(0x6484008010810002, 0x1100506884024000), - B(0x2800401008006000, 0x1005420884029020), - B(0x6822091010004421, 0x2000458080480), - B(0x40101000200101, 0x10020100001C4E0), - B(0x100400008C42, 0x4000100009008000), - B(0x851220018800400, 0x1681800040080080), - B(0x64200002010, 0x900020200040002), - B(0x20800080000022, 0x80040810002010), - B(0xA88408000802080, 0x20808001000000), - B(0x200000400C005040, 0x100140020290108), - B(0x224100000800408, 0x4204802004400020), - B(0x80080620010210, 0x91080088804040), - B(0x4008002100010, 0x80AC201001000001), - B(0x10008200902C046, 0x8080D03004000010), - B(0x3002100081000180, 0x2210002121528408), - B(0x8C101800804420, 0x1019880200043008), - B(0x200022000920D0, 0x8000800081300020), - B(0x1D40800880000, 0x400040001400050), - B(0x2020004100040, 0x200008040008008), - B(0x4840800040100001, 0x100100040203040), - B(0x40084001105, 0x8800080088000089), - B(0x4000128008020008, 0x4004200200440020), - B(0x210040008520000, 0x820219001080022), - B(0x1494040018002116, 0x400101047020008), - B(0x510008001910C224, 0x80200148118000), - B(0xC0301002301000, 0x4211A08004801), - B(0x50008E0C01001080, 0x100C004102845100), - B(0x400600020060400, 0x88024100250050), - B(0x8202920002002040, 0x810012000003), - B(0x800004208800200, 0x18AA00201000048), - B(0x402100800100002, 0x411000081000400), - B(0x101000022004044, 0x9000100040000), - B(0x41068001001, 0xC00400010001), - B(0x310210001040, 0x1A1200020010000), - B(0xA082409200004048, 0x490040800124101), - B(0x18844820E0040212, 0x1000404420D10000), - B(0x802908A40003348, 0x20200040104140), - B(0x1800404028205003, 0xC020010401089020), - B(0x802100044D01000, 0x8C41888000800040), - B(0x1D0161011410081, 0x10008000100200), - B(0x401000480040100, 0x286800404002212), - B(0x821030000100009, 0x2000090200A00000), - B(0x200020800200800, 0x2000480900841012), - B(0x80A000048030080, 0x200000120200008), - B(0x40B1400008020020, 0x148000200008004), - B(0xA021700002002010, 0x3040E400040100), - B(0x400242C200200640, 0x20440210200281), - B(0x80AC140040206240, 0x120000102801401), - B(0x2020340040832040, 0x10402100A44000), - B(0x420100400040220, 0x80014C8004000106), - B(0x504300822421120, 0x8004004008400100), - B(0x2001100008040, 0x2020104302000000), - B(0xA500802000A, 0x2008008000114100), - B(0x8A0020000200, 0x9C00101001002408), - B(0x104000001001008, 0x9001000204040060), - B(0x1000820080108200, 0xA401000008100001), - B(0x2008600009000480, 0x9008020001400000), - B(0x4000800200040200, 0xA00030400308082), - B(0x4004300202004709, 0x1000100180010020), - B(0xC014800100440010, 0x402020280002C010), - B(0x220208010884680, 0x1040280000042110), - B(0x40B0018019202801, 0x1008408000100040), - B(0x8269010206080044, 0x8001810000000040), - B(0x4000020880081040, 0x208A44000028000), - B(0x4004004E9004220A, 0x2104004001400024), - B(0x8035006008C0904, 0x402002001080120), - B(0x1800884002, 0x404400820000000), - B(0x8088000004008910, 0x8024100401000000), - B(0x142200086000100, 0x28021040020002E), - B(0x1000409141004018, 0x100410820080040A), - B(0x1800801800140, 0x810801060C0801), - B(0x1000C00100402220, 0x808023420000000), - B(0x8A0A202414305008, 0x100040200000021), - B(0xC0208024050, 0x8003088008020401), - B(0x8044004201440101, 0x400820080C024022), - B(0x406018884120099, 0xB00088018002000), - B(0x2000800010403010, 0xC5A002002010010), - B(0x800020040840, 0x201800202800200), - B(0x201280120020008D, 0x258809001000040), - B(0x9100002020181, 0x80400082204000), - B(0x104010080201001, 0x40080080181080), - B(0x8440248092000430, 0xA200804900100000), - B(0x2031010C01000C20, 0x200310A560082008), - B(0x400202081811400, 0x40081802050000C), - B(0x1011002100821300, 0x2400825040804100) - }; -#undef B -#endif - -#ifdef PRECOMPUTED_MAGICS void init_magics(Bitboard table[], Magic magics[], std::vector directions, Bitboard magicsInit[]); #else void init_magics(Bitboard table[], Magic magics[], std::vector directions); @@ -361,15 +114,19 @@ void Bitboards::init() { { if (d == NORTH_EAST || d == SOUTH_WEST || d == NORTH_WEST || d == SOUTH_EAST) AttackRiderTypes[pt] |= RIDER_BISHOP; - if (d == NORTH || d == SOUTH || d == EAST || d == WEST) - AttackRiderTypes[pt] |= RIDER_ROOK; + if (d == EAST || d == WEST) + AttackRiderTypes[pt] |= RIDER_ROOK_H; + if (d == NORTH || d == SOUTH) + AttackRiderTypes[pt] |= RIDER_ROOK_V; } for (Direction d : pi->sliderQuiet) { if (d == NORTH_EAST || d == SOUTH_WEST || d == NORTH_WEST || d == SOUTH_EAST) MoveRiderTypes[pt] |= RIDER_BISHOP; - if (d == NORTH || d == SOUTH || d == EAST || d == WEST) - MoveRiderTypes[pt] |= RIDER_ROOK; + if (d == EAST || d == WEST) + MoveRiderTypes[pt] |= RIDER_ROOK_H; + if (d == NORTH || d == SOUTH) + MoveRiderTypes[pt] |= RIDER_ROOK_V; } } @@ -388,14 +145,17 @@ void Bitboards::init() { SquareDistance[s1][s2] = std::max(distance(s1, s2), distance(s1, s2)); // Piece moves - std::vector RookDirections = { NORTH, EAST, SOUTH, WEST }; + std::vector RookDirectionsV = { NORTH, SOUTH}; + std::vector RookDirectionsH = { EAST, WEST }; std::vector BishopDirections = { NORTH_EAST, SOUTH_EAST, SOUTH_WEST, NORTH_WEST }; #ifdef PRECOMPUTED_MAGICS - init_magics(RookTable, RookMagics, RookDirections, RookMagicInit); + init_magics(RookTableH, RookMagicsH, RookDirectionsH, RookMagicHInit); + init_magics(RookTableV, RookMagicsV, RookDirectionsV, RookMagicVInit); init_magics(BishopTable, BishopMagics, BishopDirections, BishopMagicInit); #else - init_magics(RookTable, RookMagics, RookDirections); + init_magics(RookTableH, RookMagicsH, RookDirectionsH); + init_magics(RookTableV, RookMagicsV, RookDirectionsV); init_magics(BishopTable, BishopMagics, BishopDirections); #endif @@ -519,7 +279,7 @@ namespace { // until we find the one that passes the verification test. for (int i = 0; i < size; ) { - for (m.magic = 0; popcount(((m.magic * m.mask) & AllSquares) >> (SQUARE_NB - FILE_NB)) < FILE_NB - 2; ) + for (m.magic = 0; popcount((m.magic * m.mask) >> (SQUARE_NB - FILE_NB)) < FILE_NB - 2; ) { #ifdef LARGEBOARDS #ifdef PRECOMPUTED_MAGICS diff --git a/src/bitboard.h b/src/bitboard.h index 83ae696..3987999 100644 --- a/src/bitboard.h +++ b/src/bitboard.h @@ -140,7 +140,8 @@ struct Magic { } }; -extern Magic RookMagics[SQUARE_NB]; +extern Magic RookMagicsH[SQUARE_NB]; +extern Magic RookMagicsV[SQUARE_NB]; extern Magic BishopMagics[SQUARE_NB]; inline Bitboard square_bb(Square s) { @@ -337,6 +338,17 @@ template constexpr const T& clamp(const T& v, const T& lo, const T& hi return v < lo ? lo : v > hi ? hi : v; } + +template +inline Bitboard rider_attacks_bb(Square s, Bitboard occupied) { + + assert(R == RIDER_BISHOP || R == RIDER_ROOK_H || R == RIDER_ROOK_V); + const Magic& m = R == RIDER_ROOK_H ? RookMagicsH[s] + : R == RIDER_ROOK_V ? RookMagicsV[s] + : BishopMagics[s]; + return m.attacks[m.index(occupied)]; +} + /// attacks_bb() returns a bitboard representing all the squares attacked by a /// piece of type Pt (bishop or rook) placed on 's'. @@ -344,25 +356,29 @@ template inline Bitboard attacks_bb(Square s, Bitboard occupied) { assert(Pt == BISHOP || Pt == ROOK); - const Magic& m = Pt == ROOK ? RookMagics[s] : BishopMagics[s]; - return m.attacks[m.index(occupied)]; + return Pt == BISHOP ? rider_attacks_bb(s, occupied) + : rider_attacks_bb(s, occupied) | rider_attacks_bb(s, occupied); } inline Bitboard attacks_bb(Color c, PieceType pt, Square s, Bitboard occupied) { Bitboard b = LeaperAttacks[c][pt][s]; if (AttackRiderTypes[pt] & RIDER_BISHOP) - b |= attacks_bb(s, occupied); - if (AttackRiderTypes[pt] & RIDER_ROOK) - b |= attacks_bb(s, occupied); + b |= rider_attacks_bb(s, occupied); + if (AttackRiderTypes[pt] & RIDER_ROOK_H) + b |= rider_attacks_bb(s, occupied); + if (AttackRiderTypes[pt] & RIDER_ROOK_V) + b |= rider_attacks_bb(s, occupied); return b & PseudoAttacks[c][pt][s]; } inline Bitboard moves_bb(Color c, PieceType pt, Square s, Bitboard occupied) { Bitboard b = LeaperMoves[c][pt][s]; if (MoveRiderTypes[pt] & RIDER_BISHOP) - b |= attacks_bb(s, occupied); - if (MoveRiderTypes[pt] & RIDER_ROOK) - b |= attacks_bb(s, occupied); + b |= rider_attacks_bb(s, occupied); + if (MoveRiderTypes[pt] & RIDER_ROOK_H) + b |= rider_attacks_bb(s, occupied); + if (MoveRiderTypes[pt] & RIDER_ROOK_V) + b |= rider_attacks_bb(s, occupied); return b & PseudoMoves[c][pt][s]; } diff --git a/src/magic.h b/src/magic.h new file mode 100644 index 0000000..5610b19 --- /dev/null +++ b/src/magic.h @@ -0,0 +1,395 @@ +/* + Fairy-Stockfish, a UCI chess variant playing engine derived from Stockfish + Copyright (C) 2018-2019 Fabian Fichter + + Fairy-Stockfish is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Fairy-Stockfish is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef MAGIC_H_INCLUDED +#define MAGIC_H_INCLUDED + +#ifdef PRECOMPUTED_MAGICS +#define B(a, b) (Bitboard(a) << 64) ^ Bitboard(b) + // Use precomputed magics if pext is not avaible, + // since the magics generation is very slow. + Bitboard RookMagicHInit[SQUARE_NB] = { + B(0x120000880110000, 0x1008000000020020), + B(0x24200C080840A052, 0x2004004000010008), + B(0xC030024000228800, 0x4000010400000020), + B(0x1A0020802008802, 0x206010208000), + B(0x12002000D001024, 0x80100800090138), + B(0x4220010000241010, 0x3098000602001500), + B(0x401010004801040, 0x8000280480100000), + B(0x820082024921836, 0x220028000), + B(0x100400502411400, 0x220402120240D14), + B(0x880202020010404, 0xA80202510000), + B(0x140002801000018, 0x1000346490040), + B(0x120000880110000, 0x1008000000020020), + B(0xD01004008030400, 0x104000408104420), + B(0x8420060100020000, 0x800280400000120), + B(0x4010020018010, 0x40A00001100000), + B(0x40006A0004000200, 0x40000000110), + B(0xD01004008030400, 0x104000408104420), + B(0x8908A20028110011, 0x800080000001A114), + B(0x200042000080F009, 0x20001000004000), + B(0x2820008820100, 0x10002400058000B9), + B(0x6083100420008050, 0x4040012600280080), + B(0x216020000000446, 0x4080204000000211), + B(0x340140003002089, 0x2402008000000911), + B(0xD01004008030400, 0x104000408104420), + B(0x1404040B20001000, 0x8000824010800011), + B(0x8C0488120024214, 0x8414880202291), + B(0x1010000060050000, 0x4000004050002602), + B(0x4022983A0060000, 0x80000040010400), + B(0x1404040B20001000, 0x8000824010800011), + B(0x6020101802002840, 0x31000003000004), + B(0x9000420008840, 0x4881300000000210), + B(0xA200808865, 0x41C0048023000128), + B(0x31801100400000, 0x8802DC001221240), + B(0x884000080200920, 0x1004002410401001), + B(0x2400040000884, 0x421006208040C0), + B(0x1404040B20001000, 0x8000824010800011), + B(0x24100400060009, 0x112008025042410), + B(0x1800040009040200, 0x180000A1004E408A), + B(0x24100400060009, 0x112008025042410), + B(0x4060402008080, 0xC240080000110000), + B(0x20080100920020, 0x2002248010242052), + B(0x10001010802050, 0x880000001C98420), + B(0x4000800100420022, 0x502022010A00D0), + B(0x4C18104500200885, 0x400880800), + B(0x8080810081020090, 0x8000000000000), + B(0x8000062812080201, 0x8004C8300800), + B(0xC010220920198, 0x85000A08000), + B(0x24100400060009, 0x112008025042410), + B(0x80102204040, 0x1000000900000000), + B(0x2080000004202804, 0x120880003461), + B(0x102004090A4030, 0x801020589240), + B(0x20001100814000A0, 0x420202000820004), + B(0x100800000A000120, 0x208000800010000), + B(0x1008205000040802, 0x80002000400040), + B(0x1480000098008401, 0xA0010000581010), + B(0x30C0008200100820, 0x102800080904834), + B(0x4810821884000500, 0x4400000200000212), + B(0x1811D00128A0180, 0x2500848803000000), + B(0x41618A0300040040, 0x21200200A421801), + B(0x80102204040, 0x1000000900000000), + B(0xA1808E0100108000, 0x2008000505000002), + B(0x8C890020410000A0, 0xA010000048000400), + B(0x40006002210044, 0x600008000408000), + B(0x1200447220090042, 0x80001000160012), + B(0x48410010AB000000, 0x9200600000000100), + B(0x2040000000240003, 0x8020080288000600), + B(0x9080000088848088, 0x4010210500000041), + B(0xA1808E0100108000, 0x2008000505000002), + B(0x480100400024, 0x1004800018200000), + B(0x808403080080200, 0x802601000000500), + B(0x8C890020410000A0, 0xA010000048000400), + B(0xA1808E0100108000, 0x2008000505000002), + B(0x100A40000004008, 0x2800200400200480), + B(0x100A40000004008, 0x2800200400200480), + B(0x400014006000000, 0x10006000810001F5), + B(0xC410062001414, 0x820080041B01044), + B(0x20000800310, 0x430040000201000), + B(0xA40010008000008, 0x4002200028000040), + B(0xC00102000008021C, 0x10C2000A010E024), + B(0x80004200104008, 0x50A00800C400020), + B(0x20200080012542, 0x910F0040000402C0), + B(0xB040100504000300, 0x24802002000040), + B(0x800001000014008, 0x400031004000), + B(0x100A40000004008, 0x2800200400200480), + B(0x84008002041081C0, 0x8080500200000000), + B(0x440090001012001, 0x4020004010), + B(0x100A0028088020, 0x80040E00010020), + B(0x2180808000810, 0xB018040A00040000), + B(0x40C80920304C4001, 0x42800B200800000), + B(0x85000425001000, 0x4810048020001100), + B(0x600C000801000004, 0x8015084010200020), + B(0x20020050000240C0, 0x100202008600800), + B(0x38000050001220, 0x9200010200145900), + B(0x1042108040005, 0x1402A0802201001), + B(0x824240000C20400, 0x1000000400080010), + B(0x84008002041081C0, 0x8080500200000000), + B(0x400804A1000008, 0x1024104A0200010), + B(0x8000402308483, 0x20006020100100), + B(0x80880120000080, 0x8000240100084), + B(0x5840020004882001, 0x1004528000A00010), + B(0x8001018800300002, 0x84010040804), + B(0x180D10004000A008, 0xA001080008020004), + B(0x400080B, 0x10A0000004010000), + B(0x8080000200000, 0x2001000082004E0), + B(0x40040001000C2000, 0x2024800001004008), + B(0x400804A1000008, 0x1024104A0200010), + B(0x8000402308483, 0x20006020100100), + B(0x400804A1000008, 0x1024104A0200010), + B(0x2000200000, 0x1201011000802), + B(0x100100000000C4, 0x208004084048201), + B(0x400084000044, 0x100810140300), + B(0x29040C0C01010, 0x300204010820080), + B(0x1A808000020200, 0x1000000005210040), + B(0x20000400150000, 0x85008020), + B(0x40C040008184014, 0x8002AA00024010), + B(0x202000081B00804, 0x10001002008), + B(0x40011000210060, 0x6080C40000021004), + B(0x2000200000, 0x1201011000802), + B(0x4100480203840, 0x300080100804), + B(0x2000200000, 0x1201011000802), + }; + Bitboard RookMagicVInit[SQUARE_NB] = { + B(0x202000812104400, 0x24800B01C0000303), + B(0x340020400010D, 0x88060150C00400), + B(0x400802040609, 0x49010200501A0002), + B(0x8002680301000208, 0x628006C0C020200), + B(0x20400209001C0804, 0xA044000800143110), + B(0xC400082060010202, 0x4000480401014000), + B(0x22500200144040, 0x8204820084704C00), + B(0x8C1204009030020, 0x328400805000000), + B(0x84800800D0001640, 0x200080040060108), + B(0x804810208020040, 0x140010108020000), + B(0x1102010B008004, 0x300208006220020), + B(0x140080404A0A2428, 0x6308010100080), + B(0x20444002120408, 0xA080010508010001), + B(0x82011044000D02, 0x4112028620110809), + B(0x81010831000C02, 0x408802085000000), + B(0x81010831000C02, 0x408802085000000), + B(0x920008920600040, 0x8053801004000028), + B(0x81140283208300, 0x10040C004200420), + B(0x103080022201, 0xC01000081312620), + B(0x2200221100008, 0x1000408104000A4), + B(0x4402088080042008, 0x210401501040340), + B(0x898400202170001, 0x80040404208000), + B(0x20080004051012, 0x5100048200081800), + B(0x2320020000401018, 0x108501021040210), + B(0x21080410A422021, 0x83040180008800), + B(0x44E8100000408224, 0x20010008040400), + B(0x1800240002810405, 0x23004820000020), + B(0x80A0100400110, 0x80104020100C4028), + B(0x1002050001222C0, 0x5100818004024020), + B(0x104000200040, 0xC010A09800102000), + B(0x1020003A058120, 0x450900809000302), + B(0x40040045008B1, 0x202800400383010), + B(0x4640200220034, 0x8800485420304000), + B(0x5001042100084288, 0x110820001240080A), + B(0x2002C04004010120, 0xA15008020880001), + B(0x2800004080C4190, 0x890808280020080), + B(0x40C0401000104000, 0x2020880008002580), + B(0x40020C002400802, 0x801104010000000), + B(0x44842000040080, 0x2050011084000400), + B(0x4110040800000401, 0x2023810029008000), + B(0x20884000840, 0x8017102004008000), + B(0x10411104000480, 0x1414042000201001), + B(0x220040000008, 0x800306021000000), + B(0x41400A0008080, 0x501000298ACAD10), + B(0x800240012831810, 0x80120004468050E), + B(0x800005020801008, 0x20102400240000), + B(0x20C00040C114C010, 0x88080820200C00), + B(0x1044010100820081, 0x20080841004000), + B(0x8041048400022, 0x8020836040005002), + B(0x2001004010205, 0x8001002884042009), + B(0x128088400087, 0x20008002201002), + B(0x8084108040402000, 0x80809000A080400), + B(0x408081840880, 0x201002088000040), + B(0xA40180010280, 0x241004006000010), + B(0x4204100080048140, 0x2002C4F104202020), + B(0x100140A10204, 0x980200800840060), + B(0x1005140010202048, 0x1442280800202815), + B(0x2000082025008600, 0x1108400040600003), + B(0x1005050648000, 0x200020240008002), + B(0x202010208044000, 0x8210404060008), + B(0x8011040402000210, 0xC840180408016004), + B(0x404098801028, 0x80020A0001000400), + B(0x404098801028, 0x80020A0001000400), + B(0x80101002180140, 0x40C2080820000C0), + B(0x208202081260800, 0x14090E4C04000050), + B(0x4221201084004C2, 0x110480A011060), + B(0x8000008421090204, 0x1C01010800024), + B(0x8000008421090204, 0x1C01010800024), + B(0x200180C840088A0, 0x401100400820000), + B(0x10084043A021070, 0x202041600080200), + B(0x210E6202001040C, 0x10100800080B0), + B(0x848008021204002, 0x801004308100BAD), + B(0xC082C0390A000601, 0x4040080189008), + B(0x431200240210402D, 0x58102820000), + B(0x202020100A0019B0, 0x4010C0D018000000), + B(0x800800908402203, 0x102948C84C184), + B(0x26801100080845, 0x4009702022A00820), + B(0x8880520010401040, 0x1060084832052000), + B(0x100100022042081, 0x10000600008C121), + B(0x46020384100040, 0x800200320882021), + B(0xC0002010148, 0x4200800800040003), + B(0x2002208020090040, 0x40820210021410), + B(0x9000A41160002004, 0x2A09000100080043), + B(0x800004010008001, 0x1108002020104600), + B(0x800540C000A4E041, 0x18021180000401), + B(0x808200900A900202, 0x8364202140012005), + B(0x1DBA52000081010, 0x4008000023000010), + B(0x4100110204401481, 0x800040091020001C), + B(0x4100110204401481, 0x800040091020001C), + B(0x4101100020400482, 0x2000402302100120), + B(0x100408000A020212, 0xA000400111000020), + B(0x2000010488080104, 0x3000404410208100), + B(0x2684220180008DD0, 0x422040200004000A), + B(0x2021200C0424, 0x1010100000080200), + B(0x8908020020801006, 0x3010800020C2000), + B(0x4000030008062044, 0x244010202688000), + B(0x242101200408009, 0x8150040000200015), + B(0x42004C02180204, 0x210208014241040), + B(0x4E1A01C208410804, 0x8890041000012004), + B(0x2080200401000080, 0x8001098429008004), + B(0xA01400121804104, 0x280200C400000500), + B(0xD0080408040420, 0x1006040100224000), + B(0x28400205000800C9, 0x6021101401040075), + B(0x4000900040020104, 0x88129801100D0C), + B(0x8000004002180410, 0x400380200400204), + B(0x4002A430043008, 0x400200340100020), + B(0x401960004140A42, 0x100880710000464), + B(0x58014090102, 0xB8D30004010080), + B(0xA004C08000244000, 0x11280100E0000040), + B(0x2102008089208804, 0x110001004080040), + B(0x700010084E003004, 0x8080864112000D40), + B(0x4080881000200C20, 0x30324040880E0600), + B(0x2024A40401810820, 0x3000888002000000), + B(0x8200100400014, 0x4400340800252844), + B(0x24A00804288281, 0x410103002201140), + B(0x4080005022A08, 0x1000402200100264), + B(0x200080032244040, 0x200502189010001), + B(0x28108110404001, 0x400600120008412), + B(0xA00002102810020, 0xB1080240015408), + B(0x810080200806, 0x410440804080046) + }; + Bitboard BishopMagicInit[SQUARE_NB] = { + B(0x2001040305000010, 0x830200040400082), + B(0x1042400080E01200, 0x2004904010811400), + B(0x400010120200, 0x880080D080018000), + B(0x240190C00100040, 0x100A020140044404), + B(0x1018010404010004, 0x1001010018081E0), + B(0x41200A804C0904, 0x40000322000008), + B(0x4001180A004, 0x8000001106000000), + B(0x6006020020030600, 0x1840002100004841), + B(0x4200200100, 0x4001041808002000), + B(0x4100020050124600, 0x1001802902400CA0), + B(0x448C0081440161, 0x200206010008000), + B(0x400008008008408, 0x1000080210100080), + B(0x200280C01008200, 0x210200813000080), + B(0x1A000204400, 0x222200401023000), + B(0x10081040640A00, 0x8410021881400000), + B(0x1840400318080008, 0x800800840080000), + B(0x4204050C040, 0x6500600200140000), + B(0x1012100040204, 0x402404444400000), + B(0x6000012680008240, 0x410140000004220), + B(0x1000020810040008, 0x2D0011000060000), + B(0x1020020400, 0x400108059001001), + B(0x400020001100808, 0x480204800200000B), + B(0x10000010030084, 0x2042000848900022), + B(0x10000010030084, 0x2042000848900022), + B(0x100D801402400, 0x1512404009000400), + B(0x8000208005112400, 0xA02040401000000), + B(0x1000420002800200, 0x4CA000183020000), + B(0x800811480020, 0x408801010224001), + B(0xC805200810900100, 0x9000084204004020), + B(0x8200160204100004, 0x8040004004002022), + B(0x104514013080080, 0x146410040001000), + B(0x140844000080002, 0x1008102020040001), + B(0x4040400041A2002, 0x8040000A8802510), + B(0x801014041008002, 0x80068008025200), + B(0xA00540A414040, 0x4101040010A0000), + B(0x6484008010810002, 0x1100506884024000), + B(0x2800401008006000, 0x1005420884029020), + B(0x6822091010004421, 0x2000458080480), + B(0x40101000200101, 0x10020100001C4E0), + B(0x100400008C42, 0x4000100009008000), + B(0x851220018800400, 0x1681800040080080), + B(0x64200002010, 0x900020200040002), + B(0x20800080000022, 0x80040810002010), + B(0xA88408000802080, 0x20808001000000), + B(0x200000400C005040, 0x100140020290108), + B(0x224100000800408, 0x4204802004400020), + B(0x80080620010210, 0x91080088804040), + B(0x4008002100010, 0x80AC201001000001), + B(0x10008200902C046, 0x8080D03004000010), + B(0x3002100081000180, 0x2210002121528408), + B(0x8C101800804420, 0x1019880200043008), + B(0x200022000920D0, 0x8000800081300020), + B(0x1D40800880000, 0x400040001400050), + B(0x2020004100040, 0x200008040008008), + B(0x4840800040100001, 0x100100040203040), + B(0x40084001105, 0x8800080088000089), + B(0x4000128008020008, 0x4004200200440020), + B(0x210040008520000, 0x820219001080022), + B(0x1494040018002116, 0x400101047020008), + B(0x510008001910C224, 0x80200148118000), + B(0xC0301002301000, 0x4211A08004801), + B(0x50008E0C01001080, 0x100C004102845100), + B(0x400600020060400, 0x88024100250050), + B(0x8202920002002040, 0x810012000003), + B(0x800004208800200, 0x18AA00201000048), + B(0x402100800100002, 0x411000081000400), + B(0x101000022004044, 0x9000100040000), + B(0x41068001001, 0xC00400010001), + B(0x310210001040, 0x1A1200020010000), + B(0xA082409200004048, 0x490040800124101), + B(0x18844820E0040212, 0x1000404420D10000), + B(0x802908A40003348, 0x20200040104140), + B(0x1800404028205003, 0xC020010401089020), + B(0x802100044D01000, 0x8C41888000800040), + B(0x1D0161011410081, 0x10008000100200), + B(0x401000480040100, 0x286800404002212), + B(0x821030000100009, 0x2000090200A00000), + B(0x200020800200800, 0x2000480900841012), + B(0x80A000048030080, 0x200000120200008), + B(0x40B1400008020020, 0x148000200008004), + B(0xA021700002002010, 0x3040E400040100), + B(0x400242C200200640, 0x20440210200281), + B(0x80AC140040206240, 0x120000102801401), + B(0x2020340040832040, 0x10402100A44000), + B(0x420100400040220, 0x80014C8004000106), + B(0x504300822421120, 0x8004004008400100), + B(0x2001100008040, 0x2020104302000000), + B(0xA500802000A, 0x2008008000114100), + B(0x8A0020000200, 0x9C00101001002408), + B(0x104000001001008, 0x9001000204040060), + B(0x1000820080108200, 0xA401000008100001), + B(0x2008600009000480, 0x9008020001400000), + B(0x4000800200040200, 0xA00030400308082), + B(0x4004300202004709, 0x1000100180010020), + B(0xC014800100440010, 0x402020280002C010), + B(0x220208010884680, 0x1040280000042110), + B(0x40B0018019202801, 0x1008408000100040), + B(0x8269010206080044, 0x8001810000000040), + B(0x4000020880081040, 0x208A44000028000), + B(0x4004004E9004220A, 0x2104004001400024), + B(0x8035006008C0904, 0x402002001080120), + B(0x1800884002, 0x404400820000000), + B(0x8088000004008910, 0x8024100401000000), + B(0x142200086000100, 0x28021040020002E), + B(0x1000409141004018, 0x100410820080040A), + B(0x1800801800140, 0x810801060C0801), + B(0x1000C00100402220, 0x808023420000000), + B(0x8A0A202414305008, 0x100040200000021), + B(0xC0208024050, 0x8003088008020401), + B(0x8044004201440101, 0x400820080C024022), + B(0x406018884120099, 0xB00088018002000), + B(0x2000800010403010, 0xC5A002002010010), + B(0x800020040840, 0x201800202800200), + B(0x201280120020008D, 0x258809001000040), + B(0x9100002020181, 0x80400082204000), + B(0x104010080201001, 0x40080080181080), + B(0x8440248092000430, 0xA200804900100000), + B(0x2031010C01000C20, 0x200310A560082008), + B(0x400202081811400, 0x40081802050000C), + B(0x1011002100821300, 0x2400825040804100) + }; +#undef B +#endif + +#endif // #ifndef MAGIC_H_INCLUDED \ No newline at end of file diff --git a/src/types.h b/src/types.h index 725827a..2c7899b 100644 --- a/src/types.h +++ b/src/types.h @@ -365,7 +365,8 @@ enum Piece { enum RiderType { NO_RIDER = 0, RIDER_BISHOP = 1 << 0, - RIDER_ROOK = 1 << 1, + RIDER_ROOK_H = 1 << 1, + RIDER_ROOK_V = 1 << 2, }; extern Value PieceValue[PHASE_NB][PIECE_NB];