namespace libtorrent { namespace aux { namespace { // internal void cpuid(unsigned int info[4], int type) { #if TORRENT_HAS_SSE && defined _MSC_VER __cpuid((int*)info, type); #elif TORRENT_HAS_SSE && defined __GNUC__ __get_cpuid(type, &info[0], &info[1], &info[2], &info[3]); #else // for non-x86 and non-amd64, just return zeroes std::memset(&info[0], 0, sizeof(unsigned int) * 4); #endif } bool supports_sse42() { #if TORRENT_HAS_SSE unsigned int cpui[4]; cpuid(cpui, 1); return (cpui[2] & (1 << 20)) != 0; #else return false; #endif } bool supports_mmx() { #if TORRENT_HAS_SSE unsigned int cpui[4]; cpuid(cpui, 1); return (cpui[2] & (1 << 23)) != 0; #else return false; #endif } } // anonymous namespace bool sse42_support = supports_sse42(); bool mmx_support = supports_mmx(); } }
namespace libtorrent { namespace aux { namespace { #if TORRENT_HAS_SSE // internal void cpuid(std::uint32_t* info, int type) { #if defined _MSC_VER __cpuid((int*)info, type); #elif defined __GNUC__ __get_cpuid(type, &info[0], &info[1], &info[2], &info[3]); #else TORRENT_UNUSED(type); // for non-x86 and non-amd64, just return zeroes std::memset(&info[0], 0, sizeof(std::uint32_t) * 4); #endif } #endif bool supports_sse42() { #if TORRENT_HAS_SSE std::uint32_t cpui[4] = {0}; cpuid(cpui, 1); return (cpui[2] & (1 << 20)) != 0; #else return false; #endif } bool supports_mmx() { #if TORRENT_HAS_SSE std::uint32_t cpui[4] = {0}; cpuid(cpui, 1); return (cpui[2] & (1 << 23)) != 0; #else return false; #endif } bool supports_arm_neon() { #if TORRENT_HAS_ARM_NEON #if defined __arm__ //return (getauxval(AT_HWCAP) & HWCAP_NEON); return (getauxval(16) & (1 << 12)); #elif defined __aarch64__ //return (getauxval(AT_HWCAP) & HWCAP_ASIMD); return (getauxval(16) & (1 << 1)); #endif #else return false; #endif } bool supports_arm_crc32c() { #if TORRENT_HAS_ARM_CRC32 #if defined TORRENT_FORCE_ARM_CRC32 return true; #elif defined __arm__ //return (getauxval(AT_HWCAP2) & HWCAP2_CRC32); return (getauxval(26) & (1 << 4)); #elif defined __aarch64__ //return (getauxval(AT_HWCAP) & HWCAP_CRC32); return (getauxval(16) & (1 << 7)); #endif #else return false; #endif } } // anonymous namespace bool const sse42_support = supports_sse42(); bool const mmx_support = supports_mmx(); bool const arm_neon_support = supports_arm_neon(); bool const arm_crc32c_support = supports_arm_crc32c(); } }