123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- //
- // 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 <boost/config.hpp>
- #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 <intrin.h> // __cpuid
- #else
- #include <cpuid.h> // __get_cpuid
- #endif
- namespace boost {
- namespace beast {
- namespace detail {
- /* Portions from Boost,
- Copyright Andrey Semashev 2007 - 2015.
- */
- template<class = void>
- 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<class = void>
- cpu_info const&
- get_cpu_info()
- {
- static cpu_info const ci;
- return ci;
- }
- } // detail
- } // beast
- } // boost
- #endif
- #endif
|