stellar

UCI Chess engine written in C++20
git clone git://git.dimitrijedobrota.com/stellar.git
Log | Files | Refs | README | LICENSE

commit 9ce8b54dde4118111d96fb90d307b9fa691c92f5
parent 6056b66a9b9eac41ea5d442fc9f877598e9a6eed
author Dimitrije Dobrota <mail@dimitrijedobrota.com>
date Mon, 31 Jul 2023 16:13:04 +0200

Use builtin bit instructions when available

Diffstat:
M CMakeLists.txt | + -
M src/include/utils.h | ++++ ----
M src/utils/utils.c | +++++++++++++++++++++++ --------------------------------------------

3 files changed, 28 insertions(+), 49 deletions(-)


diff --git a/ CMakeLists.txt b/ CMakeLists.txt

@@ -3,7 +3,7 @@ set(CMAKE_EXPORT_COMPILE_COMMANDS ON) project( Stellar
VERSION 0.0.5
VERSION 0.0.6
DESCRIPTION "Chess engine written in C" HOMEPAGE_URL https://git.dimitrijedobrota.com/stellar.git LANGUAGES C

diff --git a/ src/include/utils.h b/ src/include/utils.h

@@ -1,6 +1,8 @@ #ifndef STELLAR_UTILS_H #define STELLAR_UTILS_H
#include <inttypes.h>
// useful macros #define MAX(a, b) ((a > b) ? a : b) #define MIN(a, b) ((a < b) ? a : b)

@@ -21,14 +23,12 @@ extern const U64 notHFile; #define bit_get(bitboard, square) (((bitboard) >> (square)) & C64(1)) #define bit_set(bitboard, square) ((bitboard) |= C64(1) << (square)) #define bit_pop(bitboard, square) ((bitboard) &= ~(C64(1) << (square)))
int bit_count(U64 bitboard);
int bit_lsb_index(U64 bitboard);
uint8_t bit_count(U64 bitboard);
uint8_t bit_lsb_index(U64 bitboard);
#define bitboard_for_each_bit(var, bb) \ for (var = bit_lsb_index(bb); bb; bit_pop(bb, var), var = bit_lsb_index(bb))
void bitboard_print(U64 bitboard);
// squares // clang-format off enum enumSquare {

diff --git a/ src/utils/utils.c b/ src/utils/utils.c

@@ -1,15 +1,31 @@ #include <stdio.h>
#ifdef WIN64
#include <widnows.h>
#else
#include <sys/time.h>
#endif
#include "utils.h"
const U64 universe = C64(0xffffffffffffffff); //
const U64 notAFile = C64(0xfefefefefefefefe); // ~0x0101010101010101
const U64 notHFile = C64(0x7f7f7f7f7f7f7f7f); // ~0x8080808080808080
const U64 universe = C64(0xffffffffffffffff);
const U64 notAFile = C64(0xfefefefefefefefe);
const U64 notHFile = C64(0x7f7f7f7f7f7f7f7f);
inline uint8_t bit_count(U64 bitboard) {
#if __has_builtin(__builtin_popcountll)
return __builtin_popcountll(bitboard);
#endif
int count = 0;
for (; bitboard > 0; bitboard &= bitboard - 1)
count++;
return count;
}
inline uint8_t bit_lsb_index(U64 bitboard) {
#if __has_builtin(__builtin_ffsll)
return __builtin_ffsll(bitboard) - 1;
#endif
if (!bitboard) return -1;
return bit_count((bitboard & -bitboard) - 1);
}
U64 soutOne(U64 b) { return b >> 8; } U64 nortOne(U64 b) { return b << 8; }

@@ -41,45 +57,8 @@ Square coordinates_to_square(const char *cord) { return (cord[1] - '1') * 8 + (cord[0] - 'a'); }
int bit_count(U64 bitboard) {
int count = 0;
while (bitboard > 0) {
count++;
bitboard &= bitboard - 1;
}
return count;
}
int bit_lsb_index(U64 bitboard) {
if (!bitboard) return -1;
return bit_count((bitboard & -bitboard) - 1);
}
void bitboard_print(U64 bitboard) {
for (int rank = 0; rank < 8; rank++) {
for (int file = 0; file < 8; file++) {
Square square = (7 - rank) * 8 + file;
if (!file) printf(" %d ", 8 - rank);
printf("%d ", bit_get(bitboard, square) ? 1 : 0);
}
printf("\n");
}
printf("\n A B C D E F G H\n\n");
printf(" Bitboard: %llud\n\n", bitboard);
}
int get_time_ms(void) {
#ifdef WIN64
return GetTickCount();
#else
struct timeval time; gettimeofday(&time, NULL); return time.tv_sec * 1000 + time.tv_usec / 1000;
#endif
}