// // Copyright (c) 2017 Vinnie Falco (vinnie dot falco at gmail dot com) // // 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) // // Official repository: https://github.com/boostorg/beast // #ifndef BOOST_BEAST_DETAIL_CPU_INFO_HPP #define BOOST_BEAST_DETAIL_CPU_INFO_HPP #include #ifndef BOOST_BEAST_NO_INTRINSICS # if defined(BOOST_MSVC) || ((defined(BOOST_GCC) || defined(BOOST_CLANG)) && defined(__SSE4_2__)) # define BOOST_BEAST_NO_INTRINSICS 0 # else # define BOOST_BEAST_NO_INTRINSICS 1 # endif #endif #if ! BOOST_BEAST_NO_INTRINSICS #ifdef BOOST_MSVC #include // __cpuid #else #include // __get_cpuid #endif namespace boost { namespace beast { namespace detail { /* Portions from Boost, Copyright Andrey Semashev 2007 - 2015. */ template void cpuid( std::uint32_t id, std::uint32_t& eax, std::uint32_t& ebx, std::uint32_t& ecx, std::uint32_t& edx) { #ifdef BOOST_MSVC int regs[4]; __cpuid(regs, id); eax = regs[0]; ebx = regs[1]; ecx = regs[2]; edx = regs[3]; #else __get_cpuid(id, &eax, &ebx, &ecx, &edx); #endif } struct cpu_info { bool sse42 = false; cpu_info(); }; inline cpu_info:: cpu_info() { constexpr std::uint32_t SSE42 = 1 << 20; std::uint32_t eax = 0; std::uint32_t ebx = 0; std::uint32_t ecx = 0; std::uint32_t edx = 0; cpuid(0, eax, ebx, ecx, edx); if(eax >= 1) { cpuid(1, eax, ebx, ecx, edx); sse42 = (ecx & SSE42) != 0; } } template cpu_info const& get_cpu_info() { static cpu_info const ci; return ci; } } // detail } // beast } // boost #endif #endif