Skip to content

Commit edd8991

Browse files
committed
Separate vBoard union from V2DI; use scalar solid for non-SSE
1 parent 2e53e30 commit edd8991

6 files changed

Lines changed: 43 additions & 43 deletions

File tree

src/board.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@ typedef struct Board {
2424
unsigned long long player, opponent; /**< bitboard representation */
2525
} Board;
2626

27-
// MSVC can allocate VBoard var to SSE reg
27+
// MSVC can allocate vBoard var to SSE reg
2828
typedef union {
29-
Board board;
29+
Board bb;
3030
#ifdef hasSSE2
3131
__m128i v2;
3232
#endif
33-
} VBoard;
33+
} vBoard;
3434

3535
struct Move;
3636
struct Random;
@@ -91,7 +91,7 @@ int get_stability(const unsigned long long, const unsigned long long);
9191
#define vget_opp_statility_fulls(vboard,fulls) get_stability_PO_fulls((vboard).v2, (fulls))
9292
#else // Pass the Board, from opp view
9393
int get_stability_fulls(const unsigned long long, const unsigned long long, unsigned long long [5]);
94-
#define vget_opp_statility_fulls(vboard,fulls) get_stability_fulls((vboard).board.opponent, (vboard).board.player, (fulls))
94+
#define vget_opp_statility_fulls(vboard,fulls) get_stability_fulls((vboard).bb.opponent, (vboard).bb.player, (fulls))
9595
#endif
9696
int get_opp_edge_stability(const Board*);
9797
int get_corner_stability(const unsigned long long);
@@ -230,7 +230,7 @@ extern unsigned char edge_stability[256 * 256];
230230
#endif
231231

232232
#ifndef vboard_flip
233-
#define vboard_flip(vboard,x) board_flip(&(vboard).board, (x))
233+
#define vboard_flip(vboard,x) board_flip(&(vboard).bb, (x))
234234
#endif
235235

236236
// Use backup copy of search->board in a vector register if available (assume *pboard == vboard on entry)
@@ -251,7 +251,7 @@ extern unsigned char edge_stability[256 * 256];
251251
#define vboard_next(vboard,x,next) board_next_neon((vboard).v2, (x), (next))
252252
#else
253253
unsigned long long board_next(const Board *board, const int x, Board *next);
254-
#define vboard_next(vboard,x,next) board_next(&(vboard).board, (x), (next))
254+
#define vboard_next(vboard,x,next) board_next(&(vboard).bb, (x), (next))
255255
#endif
256256

257257
// Pass vboard to get_moves if vectorcall available, otherwise board
@@ -263,13 +263,13 @@ extern unsigned char edge_stability[256 * 256];
263263
#else
264264
unsigned long long get_moves(const unsigned long long, const unsigned long long);
265265
#define board_get_moves(board) get_moves((board)->player, (board)->opponent)
266-
#define vboard_get_moves(vboard) get_moves((vboard).board.player, (vboard).board.opponent)
266+
#define vboard_get_moves(vboard) get_moves((vboard).bb.player, (vboard).bb.opponent)
267267
#endif
268268

269269
#ifdef hasSSE2
270270
#define vboard_equal(v,b) (_mm_movemask_epi8(_mm_cmpeq_epi8((v).v2, _mm_loadu_si128((__m128i *) (b)))) == 0xFFFF)
271271
#else
272-
#define vboard_equal(v,b) board_equal(&(v).board, (b))
272+
#define vboard_equal(v,b) board_equal(&(v).bb, (b))
273273
#endif
274274

275275
#endif

src/endgame.c

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -355,7 +355,7 @@ static int search_shallow(Search *search, const int alpha, bool pass1)
355355
unsigned long long moves, prioritymoves;
356356
int x, prev, score, bestscore;
357357
// const int beta = alpha + 1;
358-
VBoard board0;
358+
vBoard board0;
359359
unsigned int parity0;
360360

361361
assert(SCORE_MIN <= alpha && alpha <= SCORE_MAX);
@@ -367,7 +367,7 @@ static int search_shallow(Search *search, const int alpha, bool pass1)
367367
// stability cutoff (try 8%, cut 7%)
368368
if (search_SC_NWS(search, alpha, &score)) return score;
369369

370-
board0.board = search->board;
370+
board0.bb = search->board;
371371
moves = vboard_get_moves(board0);
372372
if (moves == 0) { // pass (2%)
373373
if (pass1) // gameover (1%)
@@ -441,7 +441,7 @@ static int NWS_endgame_local(Search *search, const int alpha)
441441
int score, ofssolid, bestmove, bestscore;
442442
// const int beta = alpha + 1;
443443
Move *move;
444-
VBoard board0, hashboard;
444+
vBoard board0, hashboard;
445445
unsigned int parity0;
446446
MoveList movelist;
447447

@@ -452,7 +452,7 @@ static int NWS_endgame_local(Search *search, const int alpha)
452452
SEARCH_UPDATE_INTERNAL_NODES(search->n_nodes);
453453

454454
// stability cutoff
455-
board0.board = hashboard.board = search->board;
455+
board0.bb = hashboard.bb = search->board;
456456
ofssolid = 0;
457457
#ifdef USE_SOLID
458458
if (USE_SC && alpha >= NWS_STABILITY_SOLID_THRESHOLD) { // (7%)
@@ -473,10 +473,10 @@ static int NWS_endgame_local(Search *search, const int alpha)
473473
hashboard.v2 = _mm_xor_si128(hashboard.v2, _mm_unpacklo_epi64(solid, solid));
474474
ofssolid = bit_count_si64(solid) * 2;
475475
#else
476-
unsigned long long solid = full[4] & hashboard.board.player; // full[4] = all full
476+
unsigned long long solid = full[4] & hashboard.bb.player; // full[4] = all full
477477
if (solid) { // (72%)
478-
hashboard.board.player ^= solid; // normalize solid to opponent
479-
hashboard.board.opponent ^= solid;
478+
hashboard.bb.player ^= solid; // normalize solid to opponent
479+
hashboard.bb.opponent ^= solid;
480480
ofssolid = bit_count(solid) * 2; // hash score is ofssolid smaller than real
481481
}
482482
#endif
@@ -489,9 +489,9 @@ static int NWS_endgame_local(Search *search, const int alpha)
489489

490490
if (movelist.n_moves > 0) {
491491
// transposition cutoff
492-
// hash_get(&search->thread_hash, &hashboard.board, hash_code, &hash_data.data)
492+
// hash_get(&search->thread_hash, &hashboard.bb, hash_code, &hash_data.data)
493493
unsigned char hashmove[2] = { NOMOVE, NOMOVE };
494-
Hash *hash_entry = search->thread_hash.hash + (board_get_hash_code(&hashboard.board) & search->thread_hash.hash_mask);
494+
Hash *hash_entry = search->thread_hash.hash + (board_get_hash_code(&hashboard.bb) & search->thread_hash.hash_mask);
495495
if (vboard_equal(hashboard, &hash_entry->board)) { // (6%)
496496
hashmove[0] = hash_entry->data.move[0];
497497
// search_TC_NWS(&hash_data.data, search->eval.n_empties, NO_SELECTIVITY, alpha, &score)
@@ -529,7 +529,7 @@ static int NWS_endgame_local(Search *search, const int alpha)
529529
score = -NWS_endgame_local(search, ~alpha);
530530
empty_restore(search->empties, move->x);
531531
}
532-
search->board = board0.board;
532+
search->board = board0.bb;
533533

534534
if (score > bestscore) { // (63%)
535535
bestscore = score;
@@ -586,7 +586,7 @@ int NWS_endgame(Search *search, const int alpha)
586586
HashStoreData hash_data;
587587
Move *move;
588588
long long nodes_org;
589-
VBoard board0;
589+
vBoard board0;
590590
unsigned int parity0;
591591
MoveList movelist;
592592

@@ -608,7 +608,7 @@ int NWS_endgame(Search *search, const int alpha)
608608
hash_prefetch(&search->hash_table, hash_code);
609609

610610
search_get_movelist(search, &movelist);
611-
board0.board = search->board;
611+
board0.bb = search->board;
612612

613613
if (movelist.n_moves > 0) { // (96%)
614614
// transposition cutoff
@@ -630,7 +630,7 @@ int NWS_endgame(Search *search, const int alpha)
630630
vboard_update(&search->board, board0, move);
631631
score = -NWS_endgame(search, ~alpha);
632632
empty_restore(search->empties, move->x);
633-
search->board = board0.board;
633+
search->board = board0.bb;
634634

635635
if (score > bestscore) { // (63%)
636636
bestscore = score;

src/hash.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -550,7 +550,7 @@ void hash_store(HashTable *hash_table, const Board *board, const unsigned long l
550550
* @param score Best score found.
551551
* @param move Best move found.
552552
*/
553-
void hash_store_local(Hash *hash, VBoard vboard, int alpha, int beta, int score, int move)
553+
void hash_store_local(Hash *hash, vBoard vboard, int alpha, int beta, int score, int move)
554554
{
555555
if (vboard_equal(vboard, &hash->board)) { // data_update
556556
if (score < beta && score < hash->data.upper) hash->data.upper = score;
@@ -566,7 +566,7 @@ void hash_store_local(Hash *hash, VBoard vboard, int alpha, int beta, int score,
566566
score = SCORE_MIN;
567567
move = NOMOVE;
568568
}
569-
hash->board = vboard.board;
569+
hash->board = vboard.bb;
570570
hash->data.upper = upper;
571571
hash->data.lower = score;
572572
hash->data.move[0] = move;

src/hash.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ void hash_clear(HashTable*);
9494
void hash_free(HashTable*);
9595
void hash_feed(HashTable*, const Board *, const unsigned long long, HashStoreData *);
9696
void hash_store(HashTable*, const Board *, const unsigned long long, HashStoreData *);
97-
void hash_store_local(Hash*, VBoard, int, int, int, int);
97+
void hash_store_local(Hash*, vBoard, int, int, int, int);
9898
void hash_force(HashTable*, const Board *, const unsigned long long, HashStoreData *);
9999
bool hash_get(HashTable*, const Board *, const unsigned long long, HashData *);
100100
bool hash_get_from_board(HashTable*, const Board *, HashData *);

src/midgame.c

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ int search_eval_1(Search *search, int alpha, int beta, unsigned long long moves)
142142
int x, score, bestscore, alphathres;
143143
unsigned long long flipped;
144144
Eval Ev;
145-
VBoard board0;
145+
vBoard board0;
146146

147147
SEARCH_STATS(++statistics.n_search_eval_1);
148148
SEARCH_UPDATE_INTERNAL_NODES(search->n_nodes);
@@ -152,7 +152,7 @@ int search_eval_1(Search *search, int alpha, int beta, unsigned long long moves)
152152
if (alpha < SCORE_MIN + 1) alphathres = ((SCORE_MIN + 1) * 128) + 64;
153153
else alphathres = (alpha * 128) + 63 + (int) (alpha < 0); // highest score rounded to alpha
154154

155-
board0.board = search->board;
155+
board0.bb = search->board;
156156
x = NOMOVE;
157157
do {
158158
do {
@@ -210,7 +210,7 @@ int search_eval_2(Search *search, int alpha, int beta, unsigned long long moves)
210210
int x, bestscore, score;
211211
unsigned long long flipped;
212212
Eval eval0;
213-
VBoard board0;
213+
vBoard board0;
214214

215215
SEARCH_STATS(++statistics.n_search_eval_2);
216216
SEARCH_UPDATE_INTERNAL_NODES(search->n_nodes);
@@ -223,7 +223,7 @@ int search_eval_2(Search *search, int alpha, int beta, unsigned long long moves)
223223
bestscore = -SCORE_INF;
224224
eval0.feature = search->eval.feature;
225225
eval0.n_empties = search->eval.n_empties--;
226-
board0.board = search->board;
226+
board0.bb = search->board;
227227
x = NOMOVE;
228228
do {
229229
do {
@@ -245,7 +245,7 @@ int search_eval_2(Search *search, int alpha, int beta, unsigned long long moves)
245245
} while (moves);
246246
search->eval.feature = eval0.feature;
247247
search->eval.n_empties = eval0.n_empties;
248-
search->board = board0.board;
248+
search->board = board0.bb;
249249

250250
} else {
251251
moves = get_moves(search->board.opponent, search->board.player);
@@ -380,7 +380,7 @@ static int NWS_shallow(Search *search, const int alpha, int depth, HashTable *ha
380380
MoveList movelist;
381381
Move *move;
382382
Eval eval0;
383-
VBoard board0;
383+
vBoard board0;
384384
long long nodes_org;
385385

386386
if (depth == 2) return search_eval_2(search, alpha, alpha + 1, board_get_moves(&search->board));
@@ -400,7 +400,7 @@ static int NWS_shallow(Search *search, const int alpha, int depth, HashTable *ha
400400
if (search_SC_NWS(search, alpha, &score)) return score;
401401

402402
search_get_movelist(search, &movelist);
403-
board0.board = search->board;
403+
board0.bb = search->board;
404404
eval0 = search->eval;
405405

406406
if (movelist.n_moves > 1) {
@@ -418,7 +418,7 @@ static int NWS_shallow(Search *search, const int alpha, int depth, HashTable *ha
418418
search_update_midgame(search, move);
419419
score = -NWS_shallow(search, ~alpha, depth - 1, hash_table);
420420
search_restore_midgame(search, move->x, &eval0);
421-
search->board = board0.board;
421+
search->board = board0.bb;
422422
if (score > bestscore) {
423423
bestscore = score;
424424
hash_data.data.move[0] = move->x;
@@ -441,7 +441,7 @@ static int NWS_shallow(Search *search, const int alpha, int depth, HashTable *ha
441441
search_update_midgame(search, move);
442442
bestscore = -NWS_shallow(search, ~alpha, depth - 1, hash_table);
443443
search_restore_midgame(search, move->x, &eval0);
444-
search->board = board0.board;
444+
search->board = board0.bb;
445445

446446
} else { // no moves
447447
if (can_move(search->board.opponent, search->board.player)) { // pass ?
@@ -593,7 +593,7 @@ int NWS_midgame(Search *search, const int alpha, int depth, Node *parent)
593593
Move *move;
594594
Node node;
595595
Eval eval0;
596-
VBoard board0;
596+
vBoard board0;
597597
long long nodes_org;
598598

599599
assert(search->eval.n_empties == bit_count(~(search->board.player | search->board.opponent)));
@@ -659,14 +659,14 @@ int NWS_midgame(Search *search, const int alpha, int depth, Node *parent)
659659
node_init(&node, search, alpha, alpha + 1, depth, movelist.n_moves, parent);
660660

661661
// loop over all moves
662-
board0.board = search->board;
662+
board0.bb = search->board;
663663
eval0 = search->eval;
664664
for (move = node_first_move(&node, &movelist); move; move = node_next_move(&node)) {
665665
if (!node_split(&node, move)) {
666666
search_update_midgame(search, move);
667667
move->score = -NWS_midgame(search, ~alpha, depth - 1, &node);
668668
search_restore_midgame(search, move->x, &eval0);
669-
search->board = board0.board;
669+
search->board = board0.bb;
670670
node_update(&node, move);
671671
}
672672
}
@@ -843,18 +843,18 @@ int PVS_midgame(Search *search, const int alpha, const int beta, int depth, Node
843843

844844
// lacal hash (main thread only)
845845
if (search->eval.n_empties <= depth && depth <= DEPTH_TO_USE_LOCAL_HASH && depth > DEPTH_TO_SHALLOW_SEARCH) {
846-
VBoard hashboard;
846+
vBoard hashboard;
847847
#ifdef USE_SOLID
848848
unsigned long long solid = get_all_full_lines(search->board.player | search->board.opponent) & search->board.player;
849849
if (solid) {
850850
int ofssolid = bit_count(solid) * 2; // hash score is ofssolid smaller than real
851-
hashboard.board.player = search->board.player ^ solid; // normalize solid to opponent
852-
hashboard.board.opponent = search->board.opponent ^ solid;
853-
hash_store_local(search->thread_hash.hash + (board_get_hash_code(&hashboard.board) & search->thread_hash.hash_mask),
851+
hashboard.bb.player = search->board.player ^ solid; // normalize solid to opponent
852+
hashboard.bb.opponent = search->board.opponent ^ solid;
853+
hash_store_local(search->thread_hash.hash + (board_get_hash_code(&hashboard.bb) & search->thread_hash.hash_mask),
854854
hashboard, alpha - ofssolid, beta - ofssolid, node.bestscore - ofssolid, node.bestmove);
855855
}
856856
#endif
857-
hashboard.board = search->board;
857+
hashboard.bb = search->board;
858858
hash_store_local(search->thread_hash.hash + (hash_code & search->thread_hash.hash_mask),
859859
hashboard, alpha, beta, node.bestscore, node.bestmove);
860860
}

src/search.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -882,11 +882,11 @@ void search_get_movelist(const Search *search, MoveList *movelist)
882882
{
883883
Move *previous = movelist->move;
884884
Move *move = movelist->move + 1;
885-
VBoard vboard;
885+
vBoard vboard;
886886
unsigned long long moves;
887887
int x;
888888

889-
vboard.board = search->board;
889+
vboard.bb = search->board;
890890
moves = vboard_get_moves(vboard);
891891
movelist->n_moves = 0;
892892
foreach_bit(x, moves) {

0 commit comments

Comments
 (0)