From 6e92f207f6b9f8ad02b908c1a2256cc7832888d0 Mon Sep 17 00:00:00 2001 From: primenumber Date: Thu, 9 Nov 2023 09:31:47 +0900 Subject: [PATCH] Optimize for AVX512 --- src/engine/board.rs | 8 +++++++- src/main.rs | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/engine/board.rs b/src/engine/board.rs index 7776d09..2289413 100644 --- a/src/engine/board.rs +++ b/src/engine/board.rs @@ -33,6 +33,12 @@ pub struct PlayIterator { pub const BOARD_SIZE: usize = 64; +unsafe fn avx512_upper_bit(mut x: __m256i) -> __m256i { + let y = _mm256_sub_epi64(_mm256_set1_epi64x(63), _mm256_lzcnt_epi64(x)); + _mm256_sllv_epi64(_mm256_set1_epi64x(1), y) +} + +#[allow(dead_code)] unsafe fn smart_upper_bit(mut x: __m256i) -> __m256i { x = _mm256_or_si256(x, _mm256_srlv_epi64(x, _mm256_setr_epi64x(8, 1, 7, 9))); x = _mm256_or_si256(x, _mm256_srlv_epi64(x, _mm256_setr_epi64x(16, 2, 14, 18))); @@ -95,7 +101,7 @@ impl Board { 0x0040201008040201u64 as i64, ); let mut mask = _mm256_srlv_epi64(mask1, _mm256_set1_epi64x((63 - pos) as i64)); - let mut outflank = _mm256_and_si256(smart_upper_bit(_mm256_andnot_si256(om, mask)), p); + let mut outflank = _mm256_and_si256(avx512_upper_bit(_mm256_andnot_si256(om, mask)), p); let mut flipped = _mm256_and_si256( _mm256_slli_epi64(_mm256_sub_epi64(_mm256_setzero_si256(), outflank), 1), mask, diff --git a/src/main.rs b/src/main.rs index bd47684..c40f3bd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,5 @@ #![feature(test)] +#![feature(stdsimd)] mod book; mod engine; mod play;