mirror of
https://github.com/sockspls/badfish
synced 2025-05-01 09:13:08 +00:00
Add ARCH x86-64-bmi2 support
Intel Haswell and newer CPUs can calculate sliders attacks using special PEXT asm instructions instead of magic bitboards. This gives a +3% speed up. To enable it just compile with ARCH=x86-64-bmi2 No functional change.
This commit is contained in:
parent
da2f8880b9
commit
226bbc1e63
3 changed files with 28 additions and 6 deletions
28
src/Makefile
28
src/Makefile
|
@ -60,21 +60,22 @@ OBJS = benchmark.o bitbase.o bitboard.o book.o endgame.o evaluate.o main.o \
|
||||||
# with GCC and ICC 64-bit)
|
# with GCC and ICC 64-bit)
|
||||||
# popcnt = yes/no --- -DUSE_POPCNT --- Use popcnt x86_64 asm-instruction
|
# popcnt = yes/no --- -DUSE_POPCNT --- Use popcnt x86_64 asm-instruction
|
||||||
# sse = yes/no --- -msse --- Use Intel Streaming SIMD Extensions
|
# sse = yes/no --- -msse --- Use Intel Streaming SIMD Extensions
|
||||||
|
# pext = yes/no --- -DUSE_PEXT --- Use pext x86_64 asm-instruction
|
||||||
#
|
#
|
||||||
# Note that Makefile is space sensitive, so when adding new architectures
|
# Note that Makefile is space sensitive, so when adding new architectures
|
||||||
# or modifying existing flags, you have to make sure there are no extra spaces
|
# or modifying existing flags, you have to make sure there are no extra spaces
|
||||||
# at the end of the line for flag values.
|
# at the end of the line for flag values.
|
||||||
|
|
||||||
### 2.1. General and architecture defaults
|
### 2.1. General and architecture defaults
|
||||||
debug = no
|
|
||||||
optimize = yes
|
optimize = yes
|
||||||
|
debug = no
|
||||||
os = any
|
os = any
|
||||||
bits = 32
|
bits = 32
|
||||||
prefetch = no
|
prefetch = no
|
||||||
bsfq = no
|
bsfq = no
|
||||||
popcnt = no
|
popcnt = no
|
||||||
sse = no
|
sse = no
|
||||||
|
pext = no
|
||||||
|
|
||||||
### 2.2 Architecture specific
|
### 2.2 Architecture specific
|
||||||
|
|
||||||
|
@ -114,6 +115,16 @@ ifeq ($(ARCH),x86-64-modern)
|
||||||
sse = yes
|
sse = yes
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifeq ($(ARCH),x86-64-bmi2)
|
||||||
|
arch = x86_64
|
||||||
|
bits = 64
|
||||||
|
prefetch = yes
|
||||||
|
bsfq = yes
|
||||||
|
popcnt = yes
|
||||||
|
sse = yes
|
||||||
|
pext = yes
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(ARCH),armv7)
|
ifeq ($(ARCH),armv7)
|
||||||
arch = armv7
|
arch = armv7
|
||||||
prefetch = yes
|
prefetch = yes
|
||||||
|
@ -310,7 +321,15 @@ ifeq ($(popcnt),yes)
|
||||||
CXXFLAGS += -msse3 -DUSE_POPCNT
|
CXXFLAGS += -msse3 -DUSE_POPCNT
|
||||||
endif
|
endif
|
||||||
|
|
||||||
### 3.10 Link Time Optimization, it works since gcc 4.5 but not on mingw.
|
### 3.10 pext
|
||||||
|
ifeq ($(pext),yes)
|
||||||
|
CXXFLAGS += -DUSE_PEXT
|
||||||
|
ifeq ($(comp),$(filter $(comp),gcc clang mingw))
|
||||||
|
CXXFLAGS += -mbmi2
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
|
### 3.11 Link Time Optimization, it works since gcc 4.5 but not on mingw.
|
||||||
### This is a mix of compile and link time options because the lto link phase
|
### This is a mix of compile and link time options because the lto link phase
|
||||||
### needs access to the optimization flags.
|
### needs access to the optimization flags.
|
||||||
ifeq ($(comp),gcc)
|
ifeq ($(comp),gcc)
|
||||||
|
@ -350,6 +369,7 @@ help:
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo "x86-64 > x86 64-bit"
|
@echo "x86-64 > x86 64-bit"
|
||||||
@echo "x86-64-modern > x86 64-bit with popcnt support"
|
@echo "x86-64-modern > x86 64-bit with popcnt support"
|
||||||
|
@echo "x86-64-bmi2 > x86 64-bit with pext support"
|
||||||
@echo "x86-32 > x86 32-bit with SSE support"
|
@echo "x86-32 > x86 32-bit with SSE support"
|
||||||
@echo "x86-32-old > x86 32-bit fall back for old hardware"
|
@echo "x86-32-old > x86 32-bit fall back for old hardware"
|
||||||
@echo "linux-ppc-64 > PPC-Linux 64 bit"
|
@echo "linux-ppc-64 > PPC-Linux 64 bit"
|
||||||
|
@ -448,6 +468,7 @@ config-sanity:
|
||||||
@echo "bsfq: '$(bsfq)'"
|
@echo "bsfq: '$(bsfq)'"
|
||||||
@echo "popcnt: '$(popcnt)'"
|
@echo "popcnt: '$(popcnt)'"
|
||||||
@echo "sse: '$(sse)'"
|
@echo "sse: '$(sse)'"
|
||||||
|
@echo "pext: '$(pext)'"
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo "Flags:"
|
@echo "Flags:"
|
||||||
@echo "CXX: $(CXX)"
|
@echo "CXX: $(CXX)"
|
||||||
|
@ -466,6 +487,7 @@ config-sanity:
|
||||||
@test "$(bsfq)" = "yes" || test "$(bsfq)" = "no"
|
@test "$(bsfq)" = "yes" || test "$(bsfq)" = "no"
|
||||||
@test "$(popcnt)" = "yes" || test "$(popcnt)" = "no"
|
@test "$(popcnt)" = "yes" || test "$(popcnt)" = "no"
|
||||||
@test "$(sse)" = "yes" || test "$(sse)" = "no"
|
@test "$(sse)" = "yes" || test "$(sse)" = "no"
|
||||||
|
@test "$(pext)" = "yes" || test "$(pext)" = "no"
|
||||||
@test "$(comp)" = "gcc" || test "$(comp)" = "icc" || test "$(comp)" = "mingw" || test "$(comp)" = "clang"
|
@test "$(comp)" = "gcc" || test "$(comp)" = "icc" || test "$(comp)" = "mingw" || test "$(comp)" = "clang"
|
||||||
|
|
||||||
$(EXE): $(OBJS)
|
$(EXE): $(OBJS)
|
||||||
|
|
|
@ -51,7 +51,7 @@ const string engine_info(bool to_uci) {
|
||||||
}
|
}
|
||||||
|
|
||||||
ss << (Is64Bit ? " 64" : "")
|
ss << (Is64Bit ? " 64" : "")
|
||||||
<< (HasPopCnt ? " SSE4.2" : "")
|
<< (HasPext ? " BMI2" : (HasPopCnt ? " SSE4.2" : ""))
|
||||||
<< (to_uci ? "\nid author ": " by ")
|
<< (to_uci ? "\nid author ": " by ")
|
||||||
<< "Tord Romstad, Marco Costalba and Joona Kiiski";
|
<< "Tord Romstad, Marco Costalba and Joona Kiiski";
|
||||||
|
|
||||||
|
|
|
@ -55,7 +55,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(USE_PEXT)
|
#if defined(USE_PEXT)
|
||||||
# include <x86intrin.h> // Gcc header for _pext_u64() intrinsic
|
# include <immintrin.h> // Header for _pext_u64() intrinsic
|
||||||
#else
|
#else
|
||||||
# define _pext_u64(b, m) (0)
|
# define _pext_u64(b, m) (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Reference in a new issue