/* Copyright 2025 Joaquin M Lopez Munoz. * Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at * http://www.boost.org/LICENSE_1_0.txt) * * See https://www.boost.org/libs/bloom for library home page. */ #ifndef BOOST_BLOOM_DETAIL_FAST_MULTIBLOCK64_AVX2_HPP #define BOOST_BLOOM_DETAIL_FAST_MULTIBLOCK64_AVX2_HPP #include #include #include #include #include #include #include namespace boost{ namespace bloom{ #if defined(BOOST_MSVC) #pragma warning(push) #pragma warning(disable:4714) /* marked as __forceinline not inlined */ #endif namespace detail{ struct m256ix2 { __m256i lo,hi; }; } /* namespace detail */ template struct fast_multiblock64:detail::multiblock_fpr_base { static constexpr std::size_t k=K; using value_type=detail::m256ix2[(k+7)/8]; static constexpr std::size_t used_value_size=sizeof(std::uint64_t)*k; static BOOST_FORCEINLINE void mark(value_type& x,std::uint64_t hash) { for(int i=0;i4)x.hi=_mm256_or_si256(x.hi,h.hi); } #if BOOST_WORKAROUND(BOOST_MSVC,<=1900) /* 'int': forcing value to bool 'true' or 'false' */ #pragma warning(push) #pragma warning(disable:4800) #endif static BOOST_FORCEINLINE bool check_m256ix2( const detail::m256ix2& x,std::uint64_t hash,std::size_t kp) { detail::m256ix2 h=make_m256ix2(hash,kp); auto res=_mm256_testc_si256(x.lo,h.lo); if(kp>4)res&=_mm256_testc_si256(x.hi,h.hi); return res; } #if BOOST_WORKAROUND(BOOST_MSVC,<=1900) #pragma warning(pop) /* C4800 */ #endif }; #if defined(BOOST_MSVC) #pragma warning(pop) /* C4714 */ #endif } /* namespace bloom */ } /* namespace boost */ #endif