Exemplo n.º 1
0
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();
} }
Exemplo n.º 2
0
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();
} }