Rev 33 | Rev 154 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 33 | Rev 108 | ||
|---|---|---|---|
| Line 26... | Line 26... | ||
| 26 | #  if (CPUS > 1) | 26 | #  if (CPUS > 1) | 
| 27 | #    include <pthread.h> | 27 | #    include <pthread.h> | 
| 28 | #  endif | 28 | #  endif | 
| 29 | #  include <unistd.h> | 29 | #  include <unistd.h> | 
| 30 | #  include <sys/types.h> | 30 | #  include <sys/types.h> | 
| - | 31 | #  include <sys/stat.h> | |
| 31 | #endif | 32 | #endif | 
| 32 | #include <stdint.h> | 33 | #include <stdint.h> | 
| 33 | #ifdef _MSC_VER | - | |
| 34 | #include <stdint.h> // Pierre-Marie Baty -- Visual Studio lacks inttypes.h | - | |
| 35 | #define PRIu64 "I64u" // Pierre-Marie Baty -- missing definition | - | |
| 36 | #if !defined(INLINEASM) | - | |
| 37 | int MSB(uint64_t arg1); // Pierre-Marie Baty -- missing forward declaration | - | |
| 38 | int LSB(uint64_t arg1); // Pierre-Marie Baty -- missing forward declaration | - | |
| 39 | int PopCnt(uint64_t arg1); // Pierre-Marie Baty -- missing forward declaration | - | |
| 40 | #endif // !defined(INLINEASM) | - | |
| 41 | #else // !_MSC_VER | - | |
| 42 | #include <inttypes.h> | 34 | #include <inttypes.h> | 
| 43 | #endif // _MSC_VER | - | |
| 44 | #include <time.h> | 35 | #include <time.h> | 
| 45 | #include <stdio.h> | 36 | #include <stdio.h> | 
| 46 | #include <assert.h> | 37 | #include <assert.h> | 
| 47 | #include <stdlib.h> | 38 | #include <stdlib.h> | 
| 48 | #include <string.h> | 39 | #include <string.h> | 
| Line 70... | Line 61... | ||
| 70 | #      undef  CDECL | 61 | #      undef  CDECL | 
| 71 | #      define CDECL __cdecl | 62 | #      define CDECL __cdecl | 
| 72 | #    endif | 63 | #    endif | 
| 73 | #  endif | 64 | #  endif | 
| 74 | #  if !defined(BOOKDIR) | 65 | #  if !defined(BOOKDIR) | 
| 75 | #    define | 66 | #    define   BOOKDIR      "." | 
| 76 | #  endif | 67 | #  endif | 
| 77 | #  if !defined(LOGDIR) | 68 | #  if !defined(LOGDIR) | 
| 78 | #    define    | 69 | #    define   LOGDIR       "." | 
| 79 | #  endif | 70 | #  endif | 
| 80 | #  if !defined(TBDIR) | 71 | #  if !defined(TBDIR) | 
| 81 | #    define    | 72 | #    define   TBDIR        "./TB" | 
| 82 | #  endif | 73 | #  endif | 
| 83 | #  if !defined(RCDIR) | 74 | #  if !defined(RCDIR) | 
| 84 | #    define | 75 | #    define   RCDIR        "." | 
| 85 | #  endif | 76 | #  endif | 
| 86 | #  include "lock.h" | 77 | #  include "lock.h" | 
| 87 | #  define MAXPLY                                 129 | 78 | #  define MAXPLY                                 129 | 
| 88 | #  define MAX_TC_NODES                       | 79 | #  define MAX_TC_NODES                       3000000 | 
| 89 | #  define  | 80 | #  define MAX_BLOCKS                       64 * CPUS | 
| 90 | #  define MAX_BLOCKS         MAX_BLOCKS_PER_CPU*CPUS | - | |
| 91 | #  define BOOK_CLUSTER_SIZE                     8000 | 81 | #  define BOOK_CLUSTER_SIZE                     8000 | 
| 92 | #  define BOOK_POSITION_SIZE                      16 | - | |
| 93 | #  define MERGE_BLOCK                           1000 | 82 | #  define MERGE_BLOCK                           1000 | 
| 94 | #  define SORT_BLOCK                         4000000 | 83 | #  define SORT_BLOCK                         4000000 | 
| 95 | #  define LEARN_INTERVAL                          10 | 84 | #  define LEARN_INTERVAL                          10 | 
| 96 | #  define LEARN_COUNTER_BAD                      -80 | 85 | #  define LEARN_COUNTER_BAD                      -80 | 
| 97 | #  define LEARN_COUNTER_GOOD                    +100 | 86 | #  define LEARN_COUNTER_GOOD                    +100 | 
| 98 | #  define MATE                                 32768 | 87 | #  define MATE                                 32768 | 
| 99 | #  define PAWN_VALUE                             100 | 88 | #  define PAWN_VALUE                             100 | 
| 100 | #  define KNIGHT_VALUE                            | 89 | #  define KNIGHT_VALUE                           305 | 
| 101 | #  define BISHOP_VALUE                            | 90 | #  define BISHOP_VALUE                           305 | 
| 102 | #  define ROOK_VALUE                              | 91 | #  define ROOK_VALUE                             490 | 
| 103 | #  define QUEEN_VALUE                            | 92 | #  define QUEEN_VALUE                           1000 | 
| 104 | #  define KING_VALUE                           40000 | 93 | #  define KING_VALUE                           40000 | 
| 105 | #  define MAX_DRAFT                              256 | - | |
| 106 | #  if !defined(CLOCKS_PER_SEC) | 94 | #  if !defined(CLOCKS_PER_SEC) | 
| 107 | #    define CLOCKS_PER_SEC 1000000 | 95 | #    define CLOCKS_PER_SEC 1000000 | 
| 108 | #  endif | 96 | #  endif | 
| 109 | typedef enum { | 97 | typedef enum { | 
| 110 | A1, B1, C1, D1, E1, F1, G1, H1, | 98 | A1, B1, C1, D1, E1, F1, G1, H1, | 
| Line 123... | Line 111... | ||
| 123 | rook = 4, queen = 5, king = 6 | 111 | rook = 4, queen = 5, king = 6 | 
| 124 | } PIECE; | 112 | } PIECE; | 
| 125 | typedef enum { black = 0, white = 1 } COLOR; | 113 | typedef enum { black = 0, white = 1 } COLOR; | 
| 126 | typedef enum { mg = 0, eg = 1 } PHASE; | 114 | typedef enum { mg = 0, eg = 1 } PHASE; | 
| 127 | typedef enum { empty_v = 0, pawn_v = 1, knight_v = 3, | 115 | typedef enum { empty_v = 0, pawn_v = 1, knight_v = 3, | 
| 128 | bishop_v = 3, rook_v = 5, queen_v = 9, king_v = 99 | 116 | bishop_v = 3, rook_v = 5, queen_v = 9, king_v = 99 | 
| 129 | } PIECE_V; | 117 | } PIECE_V; | 
| - | 118 | typedef enum { serial = 0, parallel = 1} SEARCH_MODE; | |
| 130 | typedef enum { think = 1, puzzle = 2, book = 3, annotate = 4 } SEARCH_TYPE; | 119 | typedef enum { think = 1, puzzle = 2, book = 3, annotate = 4 } SEARCH_TYPE; | 
| 131 | typedef enum { normal_mode, tournament_mode } PLAYING_MODE; | 120 | typedef enum { normal_mode, tournament_mode } PLAYING_MODE; | 
| 132 | typedef struct { | 121 | typedef struct { | 
| 133 | int8_t castle[2]; | 122 | int8_t castle[2]; | 
| 134 | uint8_t enpassant_target; | 123 | uint8_t enpassant_target; | 
| Line 147... | Line 136... | ||
| 147 | uint64_t pawn_hash_key; | 136 | uint64_t pawn_hash_key; | 
| 148 | int material_evaluation; | 137 | int material_evaluation; | 
| 149 | int kingsq[2]; | 138 | int kingsq[2]; | 
| 150 | int8_t board[64]; | 139 | int8_t board[64]; | 
| 151 | char pieces[2][7]; | 140 | char pieces[2][7]; | 
| 152 | char majors[2]; | - | |
| 153 | char minors[2]; | - | |
| 154 | char total_all_pieces; | 141 | char total_all_pieces; | 
| 155 | } POSITION; | 142 | } POSITION; | 
| 156 | typedef struct { | 143 | typedef struct { | 
| 157 | uint64_t word1; | 144 | uint64_t word1; | 
| 158 | uint64_t word2; | 145 | uint64_t word2; | 
| 159 | } HASH_ENTRY; | 146 | } HASH_ENTRY; | 
| 160 | typedef struct { | 147 | typedef struct { | 
| 161 | uint64_t key; | 148 | uint64_t key; | 
| 162 | 
 | 149 | int32_t score_mg, score_eg; | 
| 163 | unsigned char defects_k[2]; | 150 | unsigned char defects_k[2]; | 
| 164 | unsigned char defects_e[2]; | - | |
| 165 | unsigned char | 151 | unsigned char defects_m[2]; | 
| 166 | unsigned char defects_q[2]; | 152 | unsigned char defects_q[2]; | 
| 167 | unsigned char all[2]; | - | |
| 168 | unsigned char passed[2]; | 153 | unsigned char passed[2]; | 
| 169 | unsigned char filler[4]; | - | |
| 170 | } PAWN_HASH_ENTRY; | 154 | } PAWN_HASH_ENTRY; | 
| 171 | typedef struct { | 155 | typedef struct { | 
| 172 | uint64_t entry[ | 156 | uint64_t entry[3]; | 
| 173 | } PXOR; | 157 | } PXOR; | 
| 174 | typedef struct { | 158 | typedef struct { | 
| 175 | int path[MAXPLY]; | 159 | int path[MAXPLY]; | 
| 176 | int pathh; | 160 | int pathh; | 
| 177 | int pathl; | 161 | int pathl; | 
| Line 184... | Line 168... | ||
| 184 | int hash_path_age; | 168 | int hash_path_age; | 
| 185 | int hash_path_moves[MAXPLY]; | 169 | int hash_path_moves[MAXPLY]; | 
| 186 | } HPATH_ENTRY; | 170 | } HPATH_ENTRY; | 
| 187 | typedef struct { | 171 | typedef struct { | 
| 188 | int phase; | 172 | int phase; | 
| - | 173 | int order; | |
| 189 | int remaining; | 174 | int remaining; | 
| 190 | 
 | 175 | unsigned *last; | 
| 191 | 
 | 176 | unsigned done[10]; | 
| 192 | 
 | 177 | unsigned *exclude; | 
| 193 | } NEXT_MOVE; | 178 | } NEXT_MOVE; | 
| - | 179 | /* | |
| - | 180 |    root_move.status: | |
| - | 181 | ||
| - | 182 |    xxx1 = failed low this iteration | |
| - | 183 |    xx1x = failed high this iteration | |
| - | 184 |    x1xx = don't search in parallel or reduce | |
| - | 185 |    1xxx = move has been searched | |
| - | 186 |  */ | |
| 194 | typedef struct { | 187 | typedef struct { | 
| 195 | int move; | 188 | int move; | 
| 196 | /* | - | |
| 197 |    x..xx xxxx xxx1 = failed low this iteration | - | |
| 198 |    x..xx xxxx xx1x = failed high this iteration | - | |
| 199 |    x..xx xxxx x1xx = don't search in parallel or reduce | - | |
| 200 |    x..xx xxxx 1xxx = move has been searched | - | |
| 201 |  */ | - | |
| 202 | unsigned | 189 | unsigned status; | 
| 203 | int bm_age; | 190 | int bm_age; | 
| - | 191 |   PATH path; | |
| 204 | } ROOT_MOVE; | 192 | } ROOT_MOVE; | 
| 205 | #  if !defined(UNIX) | 193 | #  if !defined(UNIX) | 
| 206 | #    pragma pack(4) | 194 | #    pragma pack(4) | 
| 207 | #  endif | 195 | #  endif | 
| 208 | typedef struct { | 196 | typedef struct { | 
| 209 | uint64_t position; | 197 | uint64_t position; | 
| 210 | unsigned | 198 | unsigned status_played; | 
| 211 | float learn; | 199 | float learn; | 
| 212 | } BOOK_POSITION; | 200 | } BOOK_POSITION; | 
| 213 | #  if !defined(UNIX) | 201 | #  if !defined(UNIX) | 
| 214 | #    pragma pack() | 202 | #    pragma pack() | 
| 215 | #  endif | 203 | #  endif | 
| Line 220... | Line 208... | ||
| 220 | } BB_POSITION; | 208 | } BB_POSITION; | 
| 221 | struct personality_term { | 209 | struct personality_term { | 
| 222 | char *description; | 210 | char *description; | 
| 223 | int type; | 211 | int type; | 
| 224 | int size; | 212 | int size; | 
| 225 | 
 | 213 | void *value; | 
| 226 | }; | 214 | }; | 
| 227 | struct | 215 | struct autotune { | 
| - | 216 | unsigned int min; | |
| - | 217 | unsigned int max; | |
| - | 218 | unsigned int increment; | |
| - | 219 | char description[64]; | |
| - | 220 | char command[16]; | |
| - | 221 | unsigned int *parameter; | |
| - | 222 | }; | |
| - | 223 | typedef struct tree { | |
| - | 224 | /* commonly used variables */ | |
| - | 225 | SEARCH_POSITION status[MAXPLY + 3]; | |
| - | 226 | NEXT_MOVE next_status[MAXPLY]; | |
| - | 227 | KILLER killers[MAXPLY]; | |
| 228 |   POSITION position; | 228 |   POSITION position; | 
| 229 | uint64_t save_hash_key[MAXPLY + 3]; | 229 | uint64_t save_hash_key[MAXPLY + 3]; | 
| 230 | uint64_t save_pawn_hash_key[MAXPLY + 3]; | 230 | uint64_t save_pawn_hash_key[MAXPLY + 3]; | 
| 231 | int rep_index; | - | |
| 232 | uint64_t rep_list[256]; | 231 | uint64_t rep_list[256]; | 
| 233 | uint64_t all_pawns; | - | |
| 234 | uint64_t nodes_searched; | - | |
| 235 | uint64_t cache_n[64]; | - | |
| 236 |   PAWN_HASH_ENTRY pawn_score; | - | |
| 237 | SEARCH_POSITION status[MAXPLY + 3]; | - | |
| 238 | NEXT_MOVE next_status[MAXPLY]; | - | |
| 239 | PATH pv[MAXPLY]; | - | |
| 240 | int cache_n_mobility[64]; | - | |
| 241 | int curmv[MAXPLY]; | 232 | int curmv[MAXPLY]; | 
| - | 233 | int phase[MAXPLY]; | |
| 242 | int hash_move[MAXPLY]; | 234 | int hash_move[MAXPLY]; | 
| 243 | 
 | 235 | unsigned *last[MAXPLY]; | 
| 244 | uint64_t fail_highs; | - | |
| 245 | uint64_t fail_high_first_move; | - | |
| 246 | unsigned | 236 | unsigned move_list[5120]; | 
| 247 | unsigned int egtb_probes; | - | |
| 248 | unsigned int egtb_probes_successful; | - | |
| 249 | unsigned int extensions_done; | - | |
| 250 | unsigned int qchecks_done; | - | |
| 251 | unsigned int reductions_done; | - | |
| 252 | unsigned int moves_fpruned; | - | |
| 253 | 
 | 237 | PATH pv[MAXPLY]; | 
| 254 | int move_list[5120]; | - | |
| 255 | 
 | 238 | /* variables used by Evaluate() */ | 
| 256 | 
 | 239 |   PAWN_HASH_ENTRY pawn_score; | 
| 257 | int phase[MAXPLY]; | - | |
| 258 | int tropism[2]; | 240 | int tropism[2]; | 
| 259 | int dangerous[2]; | 241 | int dangerous[2]; | 
| - | 242 | uint64_t all_pawns; | |
| 260 | int score_mg, score_eg; | 243 | int score_mg, score_eg; | 
| - | 244 | /* statistical counters */ | |
| - | 245 | uint64_t nodes_searched; | |
| - | 246 | uint64_t fail_highs; | |
| - | 247 | uint64_t fail_high_first_move; | |
| - | 248 | uint64_t evaluations; | |
| - | 249 | uint64_t egtb_probes; | |
| - | 250 | uint64_t egtb_hits; | |
| - | 251 | uint64_t extensions_done; | |
| - | 252 | uint64_t qchecks_done; | |
| - | 253 | uint64_t moves_fpruned; | |
| - | 254 | uint64_t moves_mpruned; | |
| - | 255 | uint64_t LMR_done[16]; | |
| - | 256 | uint64_t null_done[16]; | |
| 261 | 
 | 257 | /* thread stuff */ | 
| 262 |   lock_t lock; | 258 |   lock_t lock; | 
| 263 | #  endif | - | |
| 264 | int thread_id; | 259 | int thread_id; | 
| - | 260 | volatile int joinable; | |
| - | 261 | volatile int joined; | |
| 265 | volatile int stop; | 262 | volatile int stop; | 
| 266 | char root_move_text[16]; | - | |
| 267 | char remaining_moves_text[16]; | - | |
| 268 | struct tree *volatile siblings[CPUS], *parent; | - | |
| 269 | volatile int nprocs; | 263 | volatile int nprocs; | 
| 270 | int alpha; | 264 | int alpha; | 
| 271 | int beta; | 265 | int beta; | 
| 272 | volatile int value; | 266 | volatile int value; | 
| 273 | int | 267 | int wtm; | 
| 274 | int depth; | 268 | int depth; | 
| 275 | int ply; | 269 | int ply; | 
| - | 270 | int in_check; | |
| - | 271 | int *searched; | |
| 276 | int cutmove; | 272 | int cutmove; | 
| - | 273 | struct tree *volatile siblings[CPUS], *parent; | |
| 277 | 
 | 274 | /* rarely accessed */ | 
| - | 275 | char root_move_text[16]; | |
| 278 | 
 | 276 | char remaining_moves_text[16]; | 
| 279 | }; | 277 | } TREE; | 
| 280 | typedef struct | 278 | typedef struct thread { | 
| 281 | 
 | 279 | TREE *tree; | 
| - | 280 | uint64_t blocks; | |
| 282 | 
 | 281 | uint64_t max_blocks; | 
| 283 | 
 | 282 | unsigned int idle; | 
| - | 283 | volatile unsigned int terminate; | |
| 284 | char filler[ | 284 | char filler[40]; | 
| 285 | }; | 285 | } THREAD; | 
| 286 | typedef struct thread THREAD; | - | |
| 287 | /* | 286 | /* | 
| 288 |    DO NOT modify these.  these are constants, used in multiple modules. | 287 |    DO NOT modify these.  these are constants, used in multiple modules. | 
| 289 |    modification may corrupt the search in any number of ways, all bad. | 288 |    modification may corrupt the search in any number of ways, all bad. | 
| 290 |  */ | 289 |  */ | 
| 291 | #  define WORTHLESS                 0 | 290 | #  define WORTHLESS                    0 | 
| 292 | #  define  | 291 | #  define UPPER                        1 | 
| 293 | #  define  | 292 | #  define LOWER                        2 | 
| 294 | #  define EXACT                     3 | 293 | #  define EXACT                        3 | 
| 295 | #  define HASH_MISS                 0 | 294 | #  define HASH_MISS                    0 | 
| 296 | #  define HASH_HIT                  1 | 295 | #  define HASH_HIT                     1 | 
| 297 | #  define AVOID_NULL_MOVE           2 | 296 | #  define AVOID_NULL_MOVE              2 | 
| 298 | #  define NO_NULL                   0 | 297 | #  define NO_NULL                      0 | 
| 299 | #  define DO_NULL                   1 | 298 | #  define DO_NULL                      1 | 
| 300 | #  define NONE                      0 | 299 | #  define NONE                         0 | 
| 301 | #  define  | 300 | #  define NULL_MOVE                    1 | 
| 302 | #  define  | 301 | #  define DO_NOT_REDUCE                1 | 
| 303 | #  define  | 302 | #  define HASH                         2 | 
| 304 | #  define  | 303 | #  define GENERATE_CAPTURES            3 | 
| 305 | #  define  | 304 | #  define CAPTURES                     4 | 
| 306 | #  define  | 305 | #  define KILLER1                      5 | 
| 307 | #  define  | 306 | #  define KILLER2                      6 | 
| 308 | #  define  | 307 | #  define KILLER3                      7 | 
| - | 308 | #  define KILLER4                      8 | |
| - | 309 | #  define COUNTER_MOVE1                9 | |
| 309 | #  define  | 310 | #  define COUNTER_MOVE2               10 | 
| - | 311 | #  define MOVE_PAIR1                  11 | |
| - | 312 | #  define MOVE_PAIR2                  12 | |
| 310 | #  define  | 313 | #  define GENERATE_QUIET              13 | 
| - | 314 | #  define HISTORY                     14 | |
| 311 | #  define  | 315 | #  define REMAINING                   15 | 
| - | 316 | #  define EVALUATION                  16 | |
| - | 317 | #  define ILLEGAL                      0 | |
| - | 318 | #  define LEGAL                        1 | |
| 312 |  | 319 | #  define IN_WINDOW                    2 | 
| - | 320 | #  define FAIL_HIGH                    3 | |
| - | 321 | #if /*defined(UNIX) &&*/ !defined(INLINEASM) // Pierre-Marie Baty -- we also use them on Windows... | |
| 313 | int CDECL PopCnt(uint64_t); | 322 | int CDECL PopCnt(uint64_t); | 
| 314 | int CDECL MSB(uint64_t); | 323 | int CDECL MSB(uint64_t); | 
| 315 | int CDECL LSB(uint64_t); | 324 | int CDECL LSB(uint64_t); | 
| 316 | #endif | 325 | #endif | 
| 317 | void AlignedMalloc(void **, int, size_t); | 326 | void AlignedMalloc(void **, int, size_t); | 
| Line 323... | Line 332... | ||
| 323 | void AnnotatePositionHTML(TREE *RESTRICT, int, FILE *); | 332 | void AnnotatePositionHTML(TREE *RESTRICT, int, FILE *); | 
| 324 | char *AnnotateVtoNAG(int, int, int, int); | 333 | char *AnnotateVtoNAG(int, int, int, int); | 
| 325 | void AnnotateHeaderTeX(FILE *); | 334 | void AnnotateHeaderTeX(FILE *); | 
| 326 | void AnnotateFooterTeX(FILE *); | 335 | void AnnotateFooterTeX(FILE *); | 
| 327 | void AnnotatePositionTeX(TREE *, int, FILE *); | 336 | void AnnotatePositionTeX(TREE *, int, FILE *); | 
| 328 | uint64_t | 337 | uint64_t atoiKMB(char *); | 
| 329 | int Attacks(TREE *RESTRICT, int, int); | 338 | int Attacks(TREE *RESTRICT, int, int); | 
| - | 339 | uint64_t Attacked(TREE *RESTRICT, int, uint64_t); | |
| 330 | uint64_t AttacksFrom(TREE *RESTRICT, int, int); | 340 | uint64_t AttacksFrom(TREE *RESTRICT, int, int); | 
| 331 | uint64_t AttacksTo(TREE *RESTRICT, int); | 341 | uint64_t AttacksTo(TREE *RESTRICT, int); | 
| - | 342 | void AutoTune(int, char **); | |
| 332 | 
 | 343 | int Bench(int, int); | 
| - | 344 | int Bench_PGO(int, int); | |
| 333 | int Book(TREE *RESTRICT, | 345 | int Book(TREE *RESTRICT, int); | 
| 334 | void BookClusterIn(FILE *, int, BOOK_POSITION *); | 346 | void BookClusterIn(FILE *, int, BOOK_POSITION *); | 
| 335 | void BookClusterOut(FILE *, int, BOOK_POSITION *); | 347 | void BookClusterOut(FILE *, int, BOOK_POSITION *); | 
| 336 | int BookIn32(unsigned char *); | 348 | int BookIn32(unsigned char *); | 
| 337 | float BookIn32f(unsigned char *); | 349 | float BookIn32f(unsigned char *); | 
| 338 | uint64_t BookIn64(unsigned char *); | 350 | uint64_t BookIn64(unsigned char *); | 
| 339 | int BookMask(char *); | 351 | int BookMask(char *); | 
| 340 | unsigned char *BookOut32(int); | 352 | unsigned char *BookOut32(int); | 
| 341 | unsigned char *BookOut32f(float); | 353 | unsigned char *BookOut32f(float); | 
| 342 | unsigned char *BookOut64(uint64_t); | 354 | unsigned char *BookOut64(uint64_t); | 
| 343 | int BookPonderMove(TREE *RESTRICT, int); | 355 | int BookPonderMove(TREE *RESTRICT, int); | 
| 344 | void | 356 | void Bookup(TREE *RESTRICT, int, char **); | 
| 345 | void BookSort(BB_POSITION *, int, int); | 357 | void BookSort(BB_POSITION *, int, int); | 
| 346 | int | 358 | int BookupCompare(const void *, const void *); | 
| 347 | BB_POSITION | 359 | BB_POSITION BookupNextPosition(int, int); | 
| 348 | int CheckInput(void); | 360 | int CheckInput(void); | 
| 349 | void ClearHashTableScores(void); | 361 | void ClearHashTableScores(void); | 
| 350 | int ComputeDifficulty(int, int); | 362 | int ComputeDifficulty(int, int); | 
| - | 363 | void CopyFromParent(TREE *RESTRICT); | |
| 351 | void CopyToParent(TREE *RESTRICT, TREE *RESTRICT, int); | 364 | void CopyToParent(TREE *RESTRICT, TREE *RESTRICT, int); | 
| 352 | void CopyToChild(TREE *RESTRICT, int); | - | |
| 353 | void CraftyExit(int); | 365 | void CraftyExit(int); | 
| 354 | void DisplayArray(int *, int); | 366 | void DisplayArray(int *, int); | 
| 355 | void DisplayArrayX2(int *, int *, int); | 367 | void DisplayArrayX2(int *, int *, int); | 
| 356 | void DisplayBitBoard(uint64_t); | 368 | void DisplayBitBoard(uint64_t); | 
| 357 | void Display2BitBoards(uint64_t, uint64_t); | 369 | void Display2BitBoards(uint64_t, uint64_t); | 
| 358 | void DisplayChessBoard(FILE *, POSITION); | 370 | void DisplayChessBoard(FILE *, POSITION); | 
| 359 | char *DisplayEvaluation(int, int); | 371 | char *DisplayEvaluation(int, int); | 
| 360 | char *DisplayEvaluationKibitz(int, int); | 372 | char *DisplayEvaluationKibitz(int, int); | 
| 361 | void DisplayFT(int, int, int); | 373 | void DisplayFT(int, int, int); | 
| 362 | char *DisplayHHMM(unsigned | 374 | char *DisplayHHMM(unsigned); | 
| 363 | char *DisplayHHMMSS(unsigned | 375 | char *DisplayHHMMSS(unsigned); | 
| 364 | char *DisplayKMB(uint64_t); | 376 | char *DisplayKMB(uint64_t, int); | 
| - | 377 | void DisplayFail(TREE *RESTRICT, int, int, int, int, int, int, int); | |
| - | 378 | char *DisplayPath(TREE *RESTRICT, int, PATH *); | |
| 365 | void DisplayPV(TREE *RESTRICT, int, int, int, PATH *); | 379 | void DisplayPV(TREE *RESTRICT, int, int, int, PATH *, int); | 
| 366 | char *DisplayTime(unsigned | 380 | char *DisplayTime(unsigned); | 
| 367 | char *Display2Times(unsigned | 381 | char *Display2Times(unsigned); | 
| 368 | char *DisplayTimeKibitz(unsigned | 382 | char *DisplayTimeKibitz(unsigned); | 
| 369 | void DisplayTreeState(TREE *RESTRICT, int, int, int); | - | |
| 370 | void DisplayChessMove(char *, int); | 383 | void DisplayChessMove(char *, int); | 
| 371 | int Drawn(TREE *RESTRICT, int); | 384 | int Drawn(TREE *RESTRICT, int); | 
| 372 | void DisplayType3(int *, int *); | - | |
| 373 | void DisplayType4(int *, int *); | - | |
| 374 | void DisplayType5(int *, int); | - | |
| 375 | void DisplayType6(int *); | - | |
| 376 | void Edit(void); | 385 | void Edit(void); | 
| 377 | #  if !defined(NOEGTB) | 386 | #  if !defined(NOEGTB) | 
| 378 | int EGTBProbe(TREE *RESTRICT, int, int, int *); | 387 | int EGTBProbe(TREE *RESTRICT, int, int, int *); | 
| 379 | void EGTBPV(TREE *RESTRICT, int); | 388 | void EGTBPV(TREE *RESTRICT, int); | 
| 380 | #  endif | 389 | #  endif | 
| 381 | int Evaluate(TREE *RESTRICT, int, int, int, int); | 390 | int Evaluate(TREE *RESTRICT, int, int, int, int); | 
| 382 | void EvaluateBishops(TREE *RESTRICT, int); | 391 | void EvaluateBishops(TREE *RESTRICT, int); | 
| 383 | void | 392 | void EvaluateCastling(TREE *RESTRICT, int, int); | 
| 384 | int EvaluateDraws(TREE *RESTRICT, int, int, int); | 393 | int EvaluateDraws(TREE *RESTRICT, int, int, int); | 
| 385 | int EvaluateHasOpposition(int, int, int); | 394 | int EvaluateHasOpposition(int, int, int); | 
| 386 | void | 395 | void EvaluateKing(TREE *RESTRICT, int, int); | 
| 387 | int EvaluateKingsFile(TREE *RESTRICT, int, int); | 396 | int EvaluateKingsFile(TREE * RESTRICT, int, int, int); | 
| 388 | void EvaluateKnights(TREE *RESTRICT, int); | 397 | void EvaluateKnights(TREE *RESTRICT, int); | 
| 389 | void EvaluateMate(TREE *RESTRICT, int); | 398 | void EvaluateMate(TREE *RESTRICT, int); | 
| 390 | void EvaluateMaterial(TREE *RESTRICT, int); | 399 | void EvaluateMaterial(TREE *RESTRICT, int); | 
| 391 | void EvaluatePassedPawns(TREE *RESTRICT, int, int); | 400 | void EvaluatePassedPawns(TREE *RESTRICT, int, int); | 
| 392 | void EvaluatePassedPawnRaces(TREE *RESTRICT, int); | 401 | void EvaluatePassedPawnRaces(TREE *RESTRICT, int); | 
| Line 398... | Line 407... | ||
| 398 | int Exclude(TREE *RESTRICT, int, int); | 407 | int Exclude(TREE *RESTRICT, int, int); | 
| 399 | int FindBlockID(TREE *RESTRICT); | 408 | int FindBlockID(TREE *RESTRICT); | 
| 400 | char *FormatPV(TREE *RESTRICT, int, PATH); | 409 | char *FormatPV(TREE *RESTRICT, int, PATH); | 
| 401 | int FTbSetCacheSize(void *, unsigned long); | 410 | int FTbSetCacheSize(void *, unsigned long); | 
| 402 | int GameOver(int); | 411 | int GameOver(int); | 
| 403 | 
 | 412 | unsigned *GenerateCaptures(TREE *RESTRICT, int, int, unsigned *); | 
| 404 | 
 | 413 | unsigned *GenerateCheckEvasions(TREE *RESTRICT, int, int, unsigned *); | 
| 405 | 
 | 414 | unsigned *GenerateChecks(TREE *RESTRICT, int, unsigned *); | 
| 406 | 
 | 415 | unsigned *GenerateNoncaptures(TREE *RESTRICT, int, int, unsigned *); | 
| 407 | int HashProbe(TREE *RESTRICT, int, int, int, int, int, int*); | - | |
| 408 | void HashStore(TREE *RESTRICT, int, int, int, int, int, int); | - | |
| 409 | 
 | 416 | TREE *GetBlock(TREE *, int); | 
| 410 | int IInitializeTb(char *); | - | |
| 411 | void Initialize(void); | 417 | void Initialize(void); | 
| 412 | void InitializeAttackBoards(void); | 418 | void InitializeAttackBoards(void); | 
| 413 | void InitializeChessBoard(TREE *); | 419 | void InitializeChessBoard(TREE *); | 
| 414 | int InitializeGetLogID(); | 420 | int InitializeGetLogID(); | 
| 415 | void InitializeHashTables( | 421 | void InitializeHashTables(int); | 
| 416 | void InitializeKillers(void); | 422 | void InitializeKillers(void); | 
| 417 | void InitializeKingSafety(void); | 423 | void InitializeKingSafety(void); | 
| 418 | void InitializeMagic(void); | 424 | void InitializeMagic(void); | 
| 419 | uint64_t InitializeMagicBishop(int, uint64_t); | 425 | uint64_t InitializeMagicBishop(int, uint64_t); | 
| 420 | uint64_t InitializeMagicRook(int, uint64_t); | 426 | uint64_t InitializeMagicRook(int, uint64_t); | 
| 421 | uint64_t InitializeMagicOccupied(int *, int, uint64_t); | 427 | uint64_t InitializeMagicOccupied(int *, int, uint64_t); | 
| 422 | void InitializeMasks(void); | 428 | void InitializeMasks(void); | 
| 423 | void InitializePawnMasks(void); | 429 | void InitializePawnMasks(void); | 
| - | 430 | void InitializeReductions(void); | |
| 424 | void InitializeSMP(void); | 431 | void InitializeSMP(void); | 
| - | 432 | int IInitializeTb(char *); | |
| 425 | int InputMove(TREE *RESTRICT, | 433 | int InputMove(TREE *RESTRICT, int, int, int, int, char *); | 
| 426 | int InputMoveICS(TREE *RESTRICT, | 434 | int InputMoveICS(TREE *RESTRICT, int, int, int, int, char *); | 
| 427 | uint64_t InterposeSquares(int, int, int); | 435 | uint64_t InterposeSquares(int, int, int); | 
| 428 | void Interrupt(int); | 436 | void Interrupt(int); | 
| 429 | int InvalidPosition(TREE *RESTRICT); | 437 | int InvalidPosition(TREE *RESTRICT); | 
| 430 | int Iterate(int, int, int); | 438 | int Iterate(int, int, int); | 
| - | 439 | int Join(int64_t); | |
| 431 | void Kibitz(int, int, int, int, int, uint64_t, int, int, char *); | 440 | void Kibitz(int, int, int, int, int, uint64_t, int, int, char *); | 
| 432 | void | 441 | void History(TREE *RESTRICT, int, int, int, int, int*); | 
| 433 | int KingPawnSquare(int, int, int, int); | 442 | int KingPawnSquare(int, int, int, int); | 
| 434 | int LearnAdjust(int); | 443 | int LearnAdjust(int); | 
| 435 | void LearnBook(void); | 444 | void LearnBook(void); | 
| 436 | int LearnFunction(int, int, int, int); | 445 | int LearnFunction(int, int, int, int); | 
| 437 | void LearnValue(int, int); | 446 | void LearnValue(int, int); | 
| 438 | void MakeMove(TREE *RESTRICT, int, int, int); | 447 | void MakeMove(TREE *RESTRICT, int, int, int); | 
| 439 | void MakeMoveRoot(TREE *RESTRICT, int, int); | 448 | void MakeMoveRoot(TREE *RESTRICT, int, int); | 
| 440 | void NewGame(int); | 449 | void NewGame(int); | 
| 441 | int NextEvasion(TREE *RESTRICT, int, int); | - | |
| 442 | int NextMove(TREE *RESTRICT, int, int); | 450 | int NextMove(TREE *RESTRICT, int, int, int, int); | 
| 443 | int NextRootMove(TREE *RESTRICT, TREE *RESTRICT, int); | 451 | int NextRootMove(TREE *RESTRICT, TREE *RESTRICT, int); | 
| 444 | int NextRootMoveParallel(void); | 452 | int NextRootMoveParallel(void); | 
| - | 453 | void NextSort(TREE *RESTRICT, int); | |
| 445 | int Option(TREE *RESTRICT); | 454 | int Option(TREE *RESTRICT); | 
| 446 | int OptionMatch(char *, char *); | 455 | int OptionMatch(char *, char *); | 
| 447 | void OptionPerft(TREE *RESTRICT, int, int, int); | 456 | void OptionPerft(TREE *RESTRICT, int, int, int); | 
| 448 | void Output(TREE * | 457 | void Output(TREE *RESTRICT); | 
| 449 | char *OutputMove(TREE *RESTRICT, int, int, int); | 458 | char *OutputMove(TREE *RESTRICT, int, int, int); | 
| 450 | int ParseTime(char *); | 459 | int ParseTime(char *); | 
| 451 | void Pass(void); | 460 | void Pass(void); | 
| 452 | int PinnedOnKing(TREE *RESTRICT, int, int); | 461 | int PinnedOnKing(TREE *RESTRICT, int, int); | 
| 453 | int Ponder(int); | 462 | int Ponder(int); | 
| 454 | void Print(int, char *, ...); | 463 | void Print(int, char *, ...); | 
| - | 464 | int HashProbe(TREE *RESTRICT, int, int, int, int, int, int*); | |
| - | 465 | void HashStore(TREE *RESTRICT, int, int, int, int, int, int); | |
| 455 | 
 | 466 | void HashStorePV(TREE *RESTRICT, int, int); | 
| 456 | int Quiesce(TREE *RESTRICT, int, int, int, int, int); | 467 | int Quiesce(TREE *RESTRICT, int, int, int, int, int); | 
| 457 | int QuiesceEvasions(TREE *RESTRICT, int, int, int, int); | 468 | int QuiesceEvasions(TREE *RESTRICT, int, int, int, int); | 
| 458 | unsigned | 469 | unsigned Random32(void); | 
| 459 | uint64_t Random64(void); | 470 | uint64_t Random64(void); | 
| 460 | int Read(int, char * | 471 | int Read(int, char *); | 
| 461 | int ReadChessMove(TREE *RESTRICT, FILE *, int, int); | 472 | int ReadChessMove(TREE *RESTRICT, FILE *, int, int); | 
| 462 | void ReadClear(void); | 473 | void ReadClear(void); | 
| 463 | unsigned | 474 | unsigned ReadClock(void); | 
| 464 | int ReadPGN(FILE *, int); | 475 | int ReadPGN(FILE *, int); | 
| 465 | int ReadNextMove(TREE *RESTRICT, char *, int, int); | 476 | int ReadNextMove(TREE *RESTRICT, char *, int, int); | 
| 466 | int ReadParse(char *, char *args[], char *); | 477 | int ReadParse(char *, char *args[], char *); | 
| 467 | int ReadInput(void); | 478 | int ReadInput(void); | 
| 468 | int Repeat(TREE *RESTRICT, int); | 479 | int Repeat(TREE *RESTRICT, int); | 
| 469 | int Repeat3x(TREE * | 480 | int Repeat3x(TREE *RESTRICT); | 
| 470 | void ResignOrDraw(TREE *RESTRICT, int); | 481 | void ResignOrDraw(TREE *RESTRICT, int); | 
| 471 | void RestoreGame(void); | 482 | void RestoreGame(void); | 
| 472 | void RootMoveList(int); | 483 | void RootMoveList(int); | 
| 473 | int Search(TREE *RESTRICT, int, int, int, int, int, int); | 484 | int Search(TREE *RESTRICT, int, int, int, int, int, int, int); | 
| - | 485 | int SearchMove(TREE *RESTRICT, int, int, int, int, int, int, int, int, int); | |
| - | 486 | int SearchMoveList(TREE *RESTRICT, int, int, int, int, int, int *, int, int, int); | |
| 474 | int | 487 | int SearchNull(TREE * RESTRICT, int, int, int, int); | 
| 475 | void Trace(TREE *RESTRICT, int, int, int, int, int, const char *, int); | 488 | void Trace(TREE *RESTRICT, int, int, int, int, int, const char *, int, int, int); | 
| 476 | void SetBoard(TREE *, int, char **, int); | 489 | void SetBoard(TREE *, int, char **, int); | 
| 477 | void SetChessBitBoards(TREE *); | 490 | void SetChessBitBoards(TREE *); | 
| 478 | void SharedFree(void *address); | 491 | void SharedFree(void *address); | 
| - | 492 | void SortRootMoves(void); | |
| - | 493 | int Split(TREE *RESTRICT); | |
| 479 | int StrCnt(char *, char); | 494 | int StrCnt(char *, char); | 
| 480 | int | 495 | int SEE(TREE *RESTRICT, int, int); | 
| 481 | int | 496 | int SEEO(TREE *RESTRICT, int, int); | 
| 482 | void Test(char *); | 497 | void Test(char *, FILE *, int, int); | 
| 483 | void TestEPD(char *); | 498 | void TestEPD(char *, FILE *, int, int); | 
| 484 | 
 | 499 | void ThreadAffinity(int); | 
| 485 | void WaitForAllThreadsInitialized(void); | - | |
| 486 | void *STDCALL ThreadInit(void *); | 500 | void *STDCALL ThreadInit(void *); | 
| 487 | #  if !defined(UNIX) | 501 | #  if !defined(UNIX) | 
| 488 | void ThreadMalloc(int64_t); | 502 | void ThreadMalloc(int64_t); | 
| 489 | #  endif | 503 | #  endif | 
| - | 504 | int ThreadSplit(TREE *RESTRICT, int, int, int, int, int); | |
| 490 | void ThreadStop(TREE *RESTRICT); | 505 | void ThreadStop(TREE *RESTRICT); | 
| - | 506 | void ThreadTrace(TREE * RESTRICT, int, int); | |
| 491 | int ThreadWait( | 507 | int ThreadWait(int, TREE *RESTRICT); | 
| - | 508 | int Threat(TREE *, int, int, int, int); | |
| 492 | void TimeAdjust(int, int); | 509 | void TimeAdjust(int, int); | 
| 493 | int TimeCheck(TREE *RESTRICT, int); | 510 | int TimeCheck(TREE *RESTRICT, int); | 
| 494 | void TimeSet(int); | 511 | void TimeSet(int); | 
| 495 | void UnmakeMove(TREE *RESTRICT, int, int, int); | 512 | void UnmakeMove(TREE *RESTRICT, int, int, int); | 
| 496 | int ValidMove(TREE *RESTRICT, int, int, int); | 513 | int ValidMove(TREE *RESTRICT, int, int, int); | 
| 497 | int VerifyMove(TREE *RESTRICT, int, int, int); | 514 | int VerifyMove(TREE *RESTRICT, int, int, int); | 
| 498 | void ValidatePosition(TREE *RESTRICT, int, int, char *); | 515 | void ValidatePosition(TREE *RESTRICT, int, int, char *); | 
| - | 516 | void WaitForAllThreadsInitialized(void); | |
| 499 | #  if !defined(UNIX) | 517 | #  if !defined(UNIX) | 
| 500 | extern void *WinMallocInterleaved(size_t, int); | 518 | extern void *WinMallocInterleaved(size_t, int); | 
| 501 | extern void WinFreeInterleaved(void *, size_t); | 519 | extern void WinFreeInterleaved(void *, size_t); | 
| 502 | #    define MallocInterleaved(cBytes, cThreads)\ | 520 | #    define MallocInterleaved(cBytes, cThreads)     \ | 
| 503 |     WinMallocInterleaved(cBytes, cThreads) | 521 |        WinMallocInterleaved(cBytes, cThreads) | 
| 504 | #    define FreeInterleaved(pMemory, cBytes)\ | 522 | #    define FreeInterleaved(pMemory, cBytes)        \ | 
| 505 |     WinFreeInterleaved(pMemory, cBytes) | 523 |        WinFreeInterleaved(pMemory, cBytes) | 
| 506 | #  else | 524 | #  else | 
| 507 | #    if defined(NUMA) | 525 | #    if defined(NUMA) | 
| 508 | #      define MallocInterleaved(cBytes, cThreads) numa_alloc_interleaved(cBytes) | 526 | #      define MallocInterleaved(cBytes, cThreads) numa_alloc_interleaved(cBytes) | 
| 509 | #      define FreeInterleaved(pMemory, cBytes)    numa_free(pMemory, 1) | 527 | #      define FreeInterleaved(pMemory, cBytes)          numa_free(pMemory, 1) | 
| 510 | #    else | 528 | #    else | 
| 511 | #      define MallocInterleaved(cBytes, cThreads) malloc(cBytes) | 529 | #      define MallocInterleaved(cBytes, cThreads) malloc(cBytes) | 
| 512 | #      define FreeInterleaved(pMemory, cBytes)    free(pMemory) | 530 | #      define FreeInterleaved(pMemory, cBytes)          free(pMemory) | 
| 513 | #    endif | 531 | #    endif | 
| 514 | #  endif | 532 | #  endif | 
| 515 | #  define Abs(a)    (((a) > 0) ? (a) : -(a)) | 533 | #  define Abs(a)    (((a) > 0) ? (a) : -(a)) | 
| 516 | #  define Max(a,b)  (((a) > (b)) ? (a) : (b)) | 534 | #  define Max(a,b)  (((a) > (b)) ? (a) : (b)) | 
| 517 | #  define Min(a,b)  (((a) < (b)) ? (a) : (b)) | 535 | #  define Min(a,b)  (((a) < (b)) ? (a) : (b)) | 
| - | 536 | #  define Sign(a)   ((a) < 0 ? -1 : +1) | |
| 518 | #  define FileDistance(a,b) abs(File(a) - File(b)) | 537 | #  define FileDistance(a,b) abs(File(a) - File(b)) | 
| 519 | #  define RankDistance(a,b) abs(Rank(a) - Rank(b)) | 538 | #  define RankDistance(a,b) abs(Rank(a) - Rank(b)) | 
| 520 | #  define Distance(a,b) Max(FileDistance(a,b), RankDistance(a,b)) | 539 | #  define Distance(a,b) Max(FileDistance(a,b), RankDistance(a,b)) | 
| 521 | #  define DrawScore(side)                 (draw_score[side]) | 540 | #  define DrawScore(side)                  (draw_score[side]) | 
| 522 | #  define PopCnt8Bit(a) (pop_cnt_8bit[a]) | 541 | #  define PopCnt8Bit(a) (pop_cnt_8bit[a]) | 
| 523 | #  define MSB8Bit(a) (msb_8bit[a]) | 542 | #  define MSB8Bit(a) (msb_8bit[a]) | 
| 524 | #  define LSB8Bit(a) (lsb_8bit[a]) | 543 | #  define LSB8Bit(a) (lsb_8bit[a]) | 
| - | 544 | #  define HistoryIndex(side, m) ((side << 9) + (Piece(m) << 6) + To(m)) | |
| 525 | /* | 545 | /* | 
| 526 |   side = side to move | 546 |    side = side to move | 
| 527 |   mptr = pointer into move list | 547 |    mptr = pointer into move list | 
| 528 |   m = bit vector of to squares to unpack | 548 |    m = bit vector of to squares to unpack | 
| 529 |   t = pre-computed from + moving piece | 549 |    t = pre-computed from + moving piece | 
| 530 |  */ | 550 |  */ | 
| 531 | #  define Extract(side, mptr, m, t)                                        \ | 551 | #  define Extract(side, mptr, m, t)                                         \ | 
| 532 |   for ( ; m ; Clear(to, m)) {                                              \ | 552 |   for ( ; m ; Clear(to, m)) {                                               \ | 
| 533 |     to =  | 553 |     to = MostAdvanced(side, m);                                             \ | 
| 534 |     *mptr++ = t | (to << 6) | (Abs(PcOnSq(to)) << 15);                     \ | 554 |     *mptr++ = t | (to << 6) | (Abs(PcOnSq(to)) << 15);                      \ | 
| 535 |   } | 555 |   } | 
| 536 | #  define Check(side) Attacks(tree, Flip(side), KingSQ(side)) | 556 | #  define Check(side) Attacks(tree, Flip(side), KingSQ(side)) | 
| 537 | #  define Attack(from,to) (!(intervening[from][to] & OccupiedSquares)) | 557 | #  define Attack(from,to) (!(intervening[from][to] & OccupiedSquares)) | 
| 538 | #  define BishopAttacks(square, occ) *(magic_bishop_indices[square]+((((occ)&magic_bishop_mask[square])*magic_bishop[square])>>magic_bishop_shift[square])) | 558 | #  define BishopAttacks(square, occ) *(magic_bishop_indices[square]+((((occ)&magic_bishop_mask[square])*magic_bishop[square])>>magic_bishop_shift[square])) | 
| 539 | #  define BishopMobility(square, occ) *(magic_bishop_mobility_indices[square]+((((occ)&magic_bishop_mask[square])*magic_bishop[square])>>magic_bishop_shift[square])) | 559 | #  define BishopMobility(square, occ) *(magic_bishop_mobility_indices[square]+((((occ)&magic_bishop_mask[square])*magic_bishop[square])>>magic_bishop_shift[square])) | 
| Line 542... | Line 562... | ||
| 542 | #  define PawnAttacks(side, square)   pawn_attacks[side][square] | 562 | #  define PawnAttacks(side, square)   pawn_attacks[side][square] | 
| 543 | #  define Reversible(p)               (tree->status[p].reversible) | 563 | #  define Reversible(p)               (tree->status[p].reversible) | 
| 544 | #  define RookAttacks(square, occ) *(magic_rook_indices[square]+((((occ)&magic_rook_mask[square])*magic_rook[square])>>magic_rook_shift[square])) | 564 | #  define RookAttacks(square, occ) *(magic_rook_indices[square]+((((occ)&magic_rook_mask[square])*magic_rook[square])>>magic_rook_shift[square])) | 
| 545 | #  define RookMobility(square, occ) *(magic_rook_mobility_indices[square]+((((occ)&magic_rook_mask[square])*magic_rook[square])>>magic_rook_shift[square])) | 565 | #  define RookMobility(square, occ) *(magic_rook_mobility_indices[square]+((((occ)&magic_rook_mask[square])*magic_rook[square])>>magic_rook_shift[square])) | 
| 546 | #  define QueenAttacks(square, occ)   (BishopAttacks(square, occ)|RookAttacks(square, occ)) | 566 | #  define QueenAttacks(square, occ)   (BishopAttacks(square, occ)|RookAttacks(square, occ)) | 
| 547 | #  define Rank(x)       ((x)>>3) | 567 | #  define Rank(x)        ((x)>>3) | 
| 548 | #  define File(x)       ((x)&7) | 568 | #  define File(x)        ((x)&7) | 
| 549 | #  define Flip(x)       ((x)^1) | 569 | #  define Flip(x)        ((x)^1) | 
| 550 | #  define  | 570 | #  define MostAdvanced(side, squares) ((side) ? MSB(squares) : LSB(squares)) | 
| - | 571 | #  define LeastAdvanced(side, squares) ((side) ? LSB(squares) : MSB(squares)) | |
| 551 | #  define MinMax(side, v1, v2) ((side) ? Min((v1), (v2)) : Max((v1), (v2))) | 572 | #  define MinMax(side, v1, v2) ((side) ? Min((v1), (v2)) : Max((v1), (v2))) | 
| 552 | #  define InFront(side, k, p) ((side) ? k > p : k < p) | 573 | #  define InFront(side, k, p) ((side) ? k > p : k < p) | 
| 553 | #  define Behind(side, k, p) ((side) ? k < p : k > p) | 574 | #  define Behind(side, k, p) ((side) ? k < p : k > p) | 
| - | 575 | #  define Passed(sq, wtm)        (!(mask_passed[wtm][sq] & Pawns(Flip(wtm)))) | |
| 554 | #  define RankAttacks(a) (RookAttacks(a, OccupiedSquares) & rank_mask[Rank(a)]) | 576 | #  define RankAttacks(a) (RookAttacks(a, OccupiedSquares) & rank_mask[Rank(a)]) | 
| 555 | #  define FileAttacks(a) (RookAttacks(a, OccupiedSquares) & file_mask[File(a)]) | 577 | #  define FileAttacks(a) (RookAttacks(a, OccupiedSquares) & file_mask[File(a)]) | 
| 556 | #  define Diaga1Attacks(a) (BishopAttacks(a, OccupiedSquares) & (plus9dir[a] | minus9dir[a])) | 578 | #  define Diaga1Attacks(a) (BishopAttacks(a, OccupiedSquares) & (plus9dir[a] | minus9dir[a])) | 
| 557 | #  define Diagh1Attacks(a) (BishopAttacks(a, OccupiedSquares) & (plus7dir[a] | minus7dir[a])) | 579 | #  define Diagh1Attacks(a) (BishopAttacks(a, OccupiedSquares) & (plus7dir[a] | minus7dir[a])) | 
| 558 | #  define InterposeSquares(kingsq, checksq) intervening[kingsq][checksq] | 580 | #  define InterposeSquares(kingsq, checksq) intervening[kingsq][checksq] | 
| 559 | /* | 581 | /* | 
| 560 |    the following macros are used to extract the pieces of a move that are | 582 |    the following macros are used to extract the pieces of a move that are | 
| 561 |    kept compressed into the rightmost 21 bits of a simple integer. | 583 |    kept compressed into the rightmost 21 bits of a simple integer. | 
| 562 |  */ | 584 |  */ | 
| 563 | #  define Passed(sq, wtm)       (!(mask_passed[wtm][sq] & Pawns(Flip(wtm)))) | - | |
| 564 | #  define From(a)               ((a) & 63) | 585 | #  define From(a)               ((a) & 63) | 
| 565 | #  define To(a)                 (((a)>>6) & 63) | 586 | #  define To(a)                 (((a)>>6) & 63) | 
| 566 | #  define Piece(a)              (((a)>>12) & 7) | 587 | #  define Piece(a)              (((a)>>12) & 7) | 
| 567 | #  define Captured(a)           (((a)>>15) & 7) | 588 | #  define Captured(a)           (((a)>>15) & 7) | 
| 568 | #  define Promote(a)            (((a)>>18) & 7) | 589 | #  define Promote(a)            (((a)>>18) & 7) | 
| - | 590 | #  define Move(a)               (a & 0x1fffff) | |
| - | 591 | #  define SortV(a)              (a >> 21) | |
| 569 | #  define CaptureOrPromote(a)   (((a)>>15) & 63) | 592 | #  define CaptureOrPromote(a)   (((a)>>15) & 63) | 
| - | 593 | #  define PawnPush(c, a)        (Piece(a) == pawn &&                          \ | |
| - | 594 |                                      rankflip[c][Rank(To(a))] >= RANK6        \ | |
| - | 595 |                                      && !(mask_passed[c][To(a)] &             \ | |
| - | 596 |                                           Pawns(Flip(c)))) | |
| - | 597 | #  define CastleMove(c, a)       (Piece(a) == king && Abs(File(To(a)) -       \ | |
| - | 598 |                                      File(From(a))) > 1) | |
| 570 | #  define SetMask(a)            (set_mask[a]) | 599 | #  define SetMask(a)             (set_mask[a]) | 
| 571 | #  define ClearMask(a)          (clear_mask[a]) | 600 | #  define ClearMask(a)           (clear_mask[a]) | 
| 572 | #  define Pawns(c)              (tree->position.color[c].pieces[pawn]) | 601 | #  define Pawns(c)               (tree->position.color[c].pieces[pawn]) | 
| 573 | #  define Knights(c)            (tree->position.color[c].pieces[knight]) | 602 | #  define Knights(c)             (tree->position.color[c].pieces[knight]) | 
| 574 | #  define Bishops(c)            (tree->position.color[c].pieces[bishop]) | 603 | #  define Bishops(c)             (tree->position.color[c].pieces[bishop]) | 
| 575 | #  define Rooks(c)              (tree->position.color[c].pieces[rook]) | 604 | #  define Rooks(c)               (tree->position.color[c].pieces[rook]) | 
| 576 | #  define Queens(c)             (tree->position.color[c].pieces[queen]) | 605 | #  define Queens(c)              (tree->position.color[c].pieces[queen]) | 
| 577 | #  define Kings(c)              (tree->position.color[c].pieces[king]) | 606 | #  define Kings(c)               (tree->position.color[c].pieces[king]) | 
| 578 | #  define KingSQ(c)             (tree->position.kingsq[c]) | 607 | #  define KingSQ(c)              (tree->position.kingsq[c]) | 
| 579 | #  define Occupied(c)           (tree->position.color[c].pieces[occupied]) | 608 | #  define Occupied(c)            (tree->position.color[c].pieces[occupied]) | 
| 580 | #  define Pieces(c, p)          (tree->position.color[c].pieces[p]) | 609 | #  define Pieces(c, p)           (tree->position.color[c].pieces[p]) | 
| 581 | #  define TotalPieces(c, p)     (tree->position.pieces[c][p]) | 610 | #  define TotalPieces(c, p)      (tree->position.pieces[c][p]) | 
| 582 | #  define TotalMinors(c)        (tree->position.minors[c]) | - | |
| 583 | #  define TotalMajors(c)        (tree->position.majors[c]) | - | |
| 584 | #  define PieceValues(c, p)     (piece_values[ | 611 | #  define PieceValues(c, p)      (piece_values[c][p]) | 
| 585 | #  define TotalAllPieces        (tree->position.total_all_pieces) | 612 | #  define TotalAllPieces         (tree->position.total_all_pieces) | 
| 586 | #  define Material              (tree->position.material_evaluation) | 613 | #  define Material               (tree->position.material_evaluation) | 
| 587 | #  define MaterialSTM(side)     ((side) ? Material : -Material) | 614 | #  define MaterialSTM(side)      ((side) ? Material : -Material) | 
| 588 | #  define MateScore(s)          (Abs(s) > 32000) | 615 | #  define MateScore(s)           (Abs(s) > 32000) | 
| 589 | #  define Castle(ply, c)        (tree->status[ply].castle[c]) | 616 | #  define Castle(ply, c)         (tree->status[ply].castle[c]) | 
| 590 | #  define HashKey               (tree->position.hash_key) | 617 | #  define HashKey                (tree->position.hash_key) | 
| 591 | #  define PawnHashKey           (tree->position.pawn_hash_key) | 618 | #  define PawnHashKey            (tree->position.pawn_hash_key) | 
| 592 | #  define EnPassant(ply)        (tree->status[ply].enpassant_target) | 619 | #  define EnPassant(ply)         (tree->status[ply].enpassant_target) | 
| 593 | #  define EnPassantTarget(ply)  (EnPassant(ply) ? SetMask(EnPassant(ply)) : 0) | 620 | #  define EnPassantTarget(ply)   (EnPassant(ply) ? SetMask(EnPassant(ply)) : 0) | 
| 594 | #  define PcOnSq(sq)            (tree->position.board[sq]) | 621 | #  define PcOnSq(sq)             (tree->position.board[sq]) | 
| 595 | #  define OccupiedSquares       (Occupied(white) | Occupied(black)) | 622 | #  define OccupiedSquares        (Occupied(white) | Occupied(black)) | 
| 596 | #  define Color(square) | 623 | #  define Color(square)       (square_color[square] ? dark_squares : ~dark_squares) | 
| 597 | #  define SideToMove(c)         ((c) ? "White" : "Black") | 624 | #  define SideToMove(c)          ((c) ? "White" : "Black") | 
| 598 | /* | 625 | /* | 
| 599 |    the following macros are used to Set and Clear a specific bit in the | 626 |    the following macros are used to Set and Clear a specific bit in the | 
| 600 |    second argument.  this is done to make the code more readable, rather | 627 |    second argument.  this is done to make the code more readable, rather | 
| 601 |    than to make it faster. | 628 |    than to make it faster. | 
| 602 |  */ | 629 |  */ | 
| Line 608... | Line 635... | ||
| 608 |  */ | 635 |  */ | 
| 609 | #  define Hash(stm,piece,square)     (HashKey^=randoms[stm][piece][square]) | 636 | #  define Hash(stm,piece,square)     (HashKey^=randoms[stm][piece][square]) | 
| 610 | #  define HashP(stm,square)          (PawnHashKey^=randoms[stm][pawn][square]) | 637 | #  define HashP(stm,square)          (PawnHashKey^=randoms[stm][pawn][square]) | 
| 611 | #  define HashCastle(stm,direction)  (HashKey^=castle_random[stm][direction]) | 638 | #  define HashCastle(stm,direction)  (HashKey^=castle_random[stm][direction]) | 
| 612 | #  define HashEP(sq)                 (HashKey^=enpassant_random[sq]) | 639 | #  define HashEP(sq)                 (HashKey^=enpassant_random[sq]) | 
| 613 | #  define SavePV(tree,ply,ph)    | 640 | #  define SavePV(tree,ply,ph)        do {                                     \ | 
| 614 |         tree->pv[ply-1].path[ply-1]=tree->curmv[ply-1];                     \ | 641 |         tree->pv[ply-1].path[ply-1]=tree->curmv[ply-1];                       \ | 
| 615 |         tree->pv[ply-1].pathl=ply;                          \ | 642 |         tree->pv[ply-1].pathl=ply;                                            \ | 
| 616 |         tree->pv[ply-1].pathh=ph;                           \ | 643 |         tree->pv[ply-1].pathh=ph;                                             \ | 
| 617 |         tree->pv[ply-1]. | 644 |         tree->pv[ply-1].pathd=iteration;} while(0) | 
| 618 | #  if defined(INLINEASM) | 645 | #  if defined(INLINEASM) | 
| 619 | #    include "inline.h" | 646 | #    include "inline.h" | 
| 620 | #  endif | - | |
| 621 | #  if defined(UNIX) | - | |
| 622 | #    define SPEAK "./speak " | - | |
| 623 | #  else | - | |
| 624 | #    define SPEAK ".\\Speak.exe " | - | |
| 625 | #  endif | 647 | #  endif | 
| 626 | #endif | 648 | #endif | 
| 627 | /* *INDENT-ON* */ | 649 | /* *INDENT-ON* */ |