diff --git a/include/boost/unordered/detail/foa.hpp b/include/boost/unordered/detail/foa.hpp index 666565f3..5f6f7fdd 100644 --- a/include/boost/unordered/detail/foa.hpp +++ b/include/boost/unordered/detail/foa.hpp @@ -580,27 +580,6 @@ private: #endif -inline unsigned int unchecked_countr_zero(int x) -{ -#if defined(BOOST_MSVC) - unsigned long r; - _BitScanForward(&r,(unsigned long)x); - return (unsigned int)r; -#else - BOOST_UNORDERED_ASSUME(x); - return (unsigned int)boost::core::countr_zero((unsigned int)x); -#endif -} - -inline void prefetch(const void* p) -{ -#if defined(BOOST_GCC)||defined(BOOST_CLANG) - __builtin_prefetch((const char*)p); -#elif defined(BOOST_UNORDERED_SSE2) - _mm_prefetch((const char*)p,_MM_HINT_T0); -#endif -} - /* foa::table uses a size policy to obtain the permissible sizes of the group * array (and, by implication, the element array) and to do the hash->group * mapping. @@ -701,6 +680,18 @@ struct xmx_mix } }; +inline unsigned int unchecked_countr_zero(int x) +{ +#if defined(BOOST_MSVC) + unsigned long r; + _BitScanForward(&r,(unsigned long)x); + return (unsigned int)r; +#else + BOOST_UNORDERED_ASSUME(x); + return (unsigned int)boost::core::countr_zero((unsigned int)x); +#endif +} + template class table; @@ -935,6 +926,16 @@ void swap_if(T& x,T& y){using std::swap; swap(x,y);} template::type* =nullptr> void swap_if(T&,T&){} +inline void prefetch(const void* p) +{ +#if defined(BOOST_GCC)||defined(BOOST_CLANG) + __builtin_prefetch((const char*)p); +#elif defined(BOOST_UNORDERED_SSE2) + _mm_prefetch((const char*)p,_MM_HINT_T0); +#endif +} + + // we pull this out so the tests don't have to rely on a magic constant or // instantiate the table class template as it can be quite gory //