compute-runtime/shared/source/utilities/x86_64/cpu_info_x86_64.cpp

146 lines
3.3 KiB
C++

/*
* Copyright (C) 2021 Intel Corporation
*
* SPDX-License-Identifier: MIT
*
*/
#include "shared/source/utilities/cpu_info.h"
#ifndef BIT
#define BIT(x) (1ull << (x))
#endif
namespace NEO {
void CpuInfo::detect() const {
uint32_t cpuInfo[4] = {};
cpuid(cpuInfo, 0u);
auto numFunctionIds = cpuInfo[0];
if (numFunctionIds >= 1u) {
cpuid(cpuInfo, 1u);
{
features |= cpuInfo[3] & BIT(0) ? featureFpu : featureNone;
}
{
features |= cpuInfo[3] & BIT(4) ? featureTsc : featureNone;
}
{
features |= cpuInfo[3] & BIT(15) ? featureCmov : featureNone;
}
{
features |= cpuInfo[3] & BIT(19) ? featureClflush : featureNone;
}
{
features |= cpuInfo[3] & BIT(23) ? featureMmx : featureNone;
}
{
features |= cpuInfo[3] & BIT(24) ? featureFxsave : featureNone;
}
{
features |= cpuInfo[3] & BIT(25) ? featureSse : featureNone;
}
{
features |= cpuInfo[3] & BIT(26) ? featureSsE2 : featureNone;
}
{
features |= cpuInfo[2] & BIT(0) ? featureSsE3 : featureNone;
}
{
features |= cpuInfo[2] & BIT(1) ? featurePclmulqdq : featureNone;
}
{
features |= cpuInfo[2] & BIT(9) ? featureSssE3 : featureNone;
}
{
features |= cpuInfo[2] & BIT(12) ? featureFma : featureNone;
}
{
features |= cpuInfo[2] & BIT(19) ? featureSsE41 : featureNone;
}
{
features |= cpuInfo[2] & BIT(20) ? featureSsE42 : featureNone;
}
{
features |= cpuInfo[2] & BIT(22) ? featureMovbe : featureNone;
}
{
features |= cpuInfo[2] & BIT(23) ? featurePopcnt : featureNone;
}
{
features |= cpuInfo[2] & BIT(25) ? featureAes : featureNone;
}
{
features |= cpuInfo[2] & BIT(28) ? featureAvx : featureNone;
}
{
features |= cpuInfo[2] & BIT(29) ? featureF16C : featureNone;
}
{
features |= cpuInfo[2] & BIT(30) ? featureRdrnd : featureNone;
}
}
if (numFunctionIds >= 7u) {
cpuid(cpuInfo, 7u);
{
auto mask = BIT(5) | BIT(3) | BIT(8);
features |= (cpuInfo[1] & mask) == mask ? featureAvX2 : featureNone;
}
{
auto mask = BIT(3) | BIT(8);
features |= (cpuInfo[1] & mask) == mask ? featureBmi : featureNone;
}
{
features |= cpuInfo[1] & BIT(4) ? featureHle : featureNone;
}
{
features |= cpuInfo[1] & BIT(11) ? featureRtm : featureNone;
}
}
cpuid(cpuInfo, 0x80000000);
auto maxExtendedId = cpuInfo[0];
if (maxExtendedId >= 0x80000001) {
cpuid(cpuInfo, 0x80000001);
{
features |= cpuInfo[2] & BIT(5) ? featureLzcnt : featureNone;
}
{
features |= cpuInfo[3] & BIT(27) ? featureRdtscp : featureNone;
}
}
if (maxExtendedId >= 0x80000008) {
cpuid(cpuInfo, 0x80000008);
{
virtualAddressSize = (cpuInfo[0] >> 8) & 0xFF;
}
}
}
} // namespace NEO