|
|
@@ -3,7 +3,9 @@
|
|
|
|
|
|
#include <array>
|
|
|
#include <cstring>
|
|
|
+#include <iterator>
|
|
|
#include <span>
|
|
|
+#include <string_view>
|
|
|
#include "common/bit_util.h"
|
|
|
#include "common/common_types.h"
|
|
|
#include "common/x64/cpu_detect.h"
|
|
|
@@ -47,6 +49,17 @@ static inline u64 _xgetbv(u32 index) {
|
|
|
|
|
|
namespace Common {
|
|
|
|
|
|
+CPUCaps::Manufacturer CPUCaps::ParseManufacturer(std::string_view brand_string) {
|
|
|
+ if (brand_string == "GenuineIntel") {
|
|
|
+ return Manufacturer::Intel;
|
|
|
+ } else if (brand_string == "AuthenticAMD") {
|
|
|
+ return Manufacturer::AMD;
|
|
|
+ } else if (brand_string == "HygonGenuine") {
|
|
|
+ return Manufacturer::Hygon;
|
|
|
+ }
|
|
|
+ return Manufacturer::Unknown;
|
|
|
+}
|
|
|
+
|
|
|
// Detects the various CPU features
|
|
|
static CPUCaps Detect() {
|
|
|
CPUCaps caps = {};
|
|
|
@@ -55,30 +68,24 @@ static CPUCaps Detect() {
|
|
|
// yuzu at all anyway
|
|
|
|
|
|
std::array<u32, 4> cpu_id;
|
|
|
- std::memset(caps.brand_string, 0, sizeof(caps.brand_string));
|
|
|
|
|
|
- // Detect CPU's CPUID capabilities and grab CPU string
|
|
|
+ // Detect CPU's CPUID capabilities and grab manufacturer string
|
|
|
__cpuid(cpu_id, 0x00000000);
|
|
|
- u32 max_std_fn = cpu_id[0]; // EAX
|
|
|
+ const u32 max_std_fn = cpu_id[0]; // EAX
|
|
|
|
|
|
+ std::memset(caps.brand_string, 0, std::size(caps.brand_string));
|
|
|
std::memcpy(&caps.brand_string[0], &cpu_id[1], sizeof(u32));
|
|
|
std::memcpy(&caps.brand_string[4], &cpu_id[3], sizeof(u32));
|
|
|
std::memcpy(&caps.brand_string[8], &cpu_id[2], sizeof(u32));
|
|
|
- if (cpu_id[1] == 0x756e6547 && cpu_id[2] == 0x6c65746e && cpu_id[3] == 0x49656e69)
|
|
|
- caps.manufacturer = Manufacturer::Intel;
|
|
|
- else if (cpu_id[1] == 0x68747541 && cpu_id[2] == 0x444d4163 && cpu_id[3] == 0x69746e65)
|
|
|
- caps.manufacturer = Manufacturer::AMD;
|
|
|
- else if (cpu_id[1] == 0x6f677948 && cpu_id[2] == 0x656e6975 && cpu_id[3] == 0x6e65476e)
|
|
|
- caps.manufacturer = Manufacturer::Hygon;
|
|
|
- else
|
|
|
- caps.manufacturer = Manufacturer::Unknown;
|
|
|
|
|
|
- __cpuid(cpu_id, 0x80000000);
|
|
|
+ caps.manufacturer = CPUCaps::ParseManufacturer(caps.brand_string);
|
|
|
+
|
|
|
+ // Set reasonable default cpu string even if brand string not available
|
|
|
+ std::strncpy(caps.cpu_string, caps.brand_string, std::size(caps.brand_string));
|
|
|
|
|
|
- u32 max_ex_fn = cpu_id[0];
|
|
|
+ __cpuid(cpu_id, 0x80000000);
|
|
|
|
|
|
- // Set reasonable default brand string even if brand string not available
|
|
|
- std::strcpy(caps.cpu_string, caps.brand_string);
|
|
|
+ const u32 max_ex_fn = cpu_id[0];
|
|
|
|
|
|
// Detect family and other miscellaneous features
|
|
|
if (max_std_fn >= 1) {
|