123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- #include "Hardware.h"
- #include <array>
- #include <vector>
- #include <bitset>
- #include <cstring>
- #ifdef __GNUC__
- #include <cpuid.h>
- #else
- #include <intrin.h>
- #endif
- using mnd::CpuInfo;
- CpuInfo::CpuInfo(void)
- {
- std::array<unsigned int, 4> dat;
- std::vector<std::array<unsigned int, 4>> cpuData;
- std::vector<std::array<unsigned int, 4>> extData;
- unsigned int nData;
- unsigned int nExtData;
- #ifdef __GNUC__
- __cpuid(0, dat[0], dat[1], dat[2], dat[3]);
- nData = dat[0];
- __cpuid(0x80000000, dat[0], dat[1], dat[2], dat[3]);
- nExtData = dat[0];
- #else
- __cpuid((int*) dat.data(), 0);
- nData = dat[0];
- __cpuid((int*) dat.data(), 0x80000000);
- nExtData = dat[0];
- #endif
- for (int i = 0; i <= nData; i++) {
- #ifdef __GNUC__
- __get_cpuid(i, &dat[0], &dat[1], &dat[2], &dat[3]);
- #else
- __cpuidex((int*) dat.data(), i, 0);
- #endif
- cpuData.push_back(dat);
- }
- for (int i = 0x80000000; i <= nExtData; i++) {
- #ifdef __GNUC__
- __get_cpuid(i, &dat[0], &dat[1], &dat[2], &dat[3]);
- #else
- __cpuidex((int*) dat.data(), i, 0);
- #endif
- extData.push_back(dat);
- }
- char vendor[32];
- memset(vendor, 0, sizeof vendor);
- *reinterpret_cast<int*>(vendor) = cpuData[0][1];
- *reinterpret_cast<int*>(vendor + 4) = cpuData[0][3];
- *reinterpret_cast<int*>(vendor + 8) = cpuData[0][2];
- this->vendor = vendor;
- char brand[64];
- memset(brand, 0, sizeof brand);
- if (nExtData >= 0x80000004) {
- memcpy(brand, extData[2].data(), sizeof(dat));
- memcpy(brand + 16, extData[3].data(), sizeof(dat));
- memcpy(brand + 32, extData[4].data(), sizeof(dat));
- this->brand = brand;
- // trim
- this->brand.erase(0, this->brand.find_first_not_of(" \n\r\t"));
- this->brand.erase(this->brand.find_last_not_of(" \n\r\t") + 1);
- }
- std::bitset<32> ecx1 = 0;
- std::bitset<32> edx1 = 0;
- std::bitset<32> ebx7 = 0;
- std::bitset<32> ecx7 = 0;
- if (nData >= 1) {
- ecx1 = cpuData[1][2];
- edx1 = cpuData[1][3];
- }
- if (nData >= 7) {
- ebx7 = cpuData[7][1];
- ecx7 = cpuData[7][2];
- }
- sse2 = edx1[26];
- avx = ecx1[28];
- avx512 = ebx7[16];
- }
|