From ab1e6f3f53a7c33a8ed8ba389631a585422c3759 Mon Sep 17 00:00:00 2001 From: Tom Lally Date: Tue, 30 Aug 2022 13:42:36 +0100 Subject: [PATCH] Added __cpuid and __cpuidex wrappers, and fixed wrong argument order in __cpuid. --- src/Cafe/HW/Espresso/PPCTimer.cpp | 2 +- .../HW/Espresso/Recompiler/PPCRecompiler.cpp | 6 ++--- src/Common/precompiled.h | 24 +++++++++++++++++++ src/Common/unix/platform.cpp | 18 +------------- src/Common/unix/platform.h | 4 ---- src/main.cpp | 8 +++---- src/util/crypto/aes128.cpp | 2 +- 7 files changed, 34 insertions(+), 30 deletions(-) diff --git a/src/Cafe/HW/Espresso/PPCTimer.cpp b/src/Cafe/HW/Espresso/PPCTimer.cpp index 9d23700e..bcf1a58d 100644 --- a/src/Cafe/HW/Espresso/PPCTimer.cpp +++ b/src/Cafe/HW/Espresso/PPCTimer.cpp @@ -32,7 +32,7 @@ uint64 muldiv64(uint64 a, uint64 b, uint64 d) bool PPCTimer_hasInvariantRDTSCSupport() { uint32 cpuv[4]; - __cpuid((int*)cpuv, 0x80000007); + cpuid((int*)cpuv, 0x80000007); return ((cpuv[3] >> 8) & 1); } diff --git a/src/Cafe/HW/Espresso/Recompiler/PPCRecompiler.cpp b/src/Cafe/HW/Espresso/Recompiler/PPCRecompiler.cpp index 376172f2..61aa11ca 100644 --- a/src/Cafe/HW/Espresso/Recompiler/PPCRecompiler.cpp +++ b/src/Cafe/HW/Espresso/Recompiler/PPCRecompiler.cpp @@ -575,12 +575,12 @@ void PPCRecompiler_init() // query processor extensions int cpuInfo[4]; - __cpuid(cpuInfo, 0x80000001); + cpuid(cpuInfo, 0x80000001); hasLZCNTSupport = ((cpuInfo[2] >> 5) & 1) != 0; - __cpuid(cpuInfo, 0x1); + cpuid(cpuInfo, 0x1); hasMOVBESupport = ((cpuInfo[2] >> 22) & 1) != 0; hasAVXSupport = ((cpuInfo[2] >> 28) & 1) != 0; - __cpuidex(cpuInfo, 0x7, 0); + cpuidex(cpuInfo, 0x7, 0); hasBMI2Support = ((cpuInfo[1] >> 8) & 1) != 0; forceLog_printf("Recompiler initialized. CPU extensions: %s%s%s", hasLZCNTSupport ? "LZCNT " : "", hasMOVBESupport ? "MOVBE " : "", hasAVXSupport ? "AVX " : ""); diff --git a/src/Common/precompiled.h b/src/Common/precompiled.h index 73cd04b7..7bcb2b34 100644 --- a/src/Common/precompiled.h +++ b/src/Common/precompiled.h @@ -237,6 +237,30 @@ typedef union _LARGE_INTEGER { #error No definition for DLLEXPORT #endif +#ifdef __GNUC__ +#include +#endif + +inline void cpuid(int cpuInfo[4], unsigned int functionId) { +#if defined(_MSC_VER) + __cpuid(cpuInfo, functionId); +#elif defined(__GNUC__) + __cpuid(functionId, cpuInfo[0], cpuInfo[1], cpuInfo[2], cpuInfo[3]); +#else + #error No definition for cpuid +#endif +} + +inline void cpuidex(int cpuInfo[4], int functionId, int subFunctionId) { +#if defined(_MSC_VER) + __cpuidex(cpuInfo, functionId, subFunctionId); +#elif defined(__GNUC__) + __cpuid_count(functionId, subFunctionId, cpuInfo[0], cpuInfo[1], cpuInfo[2], cpuInfo[3]); +#else + #error No definition for cpuidex +#endif +} + // MEMPTR #include "Common/MemPtr.h" diff --git a/src/Common/unix/platform.cpp b/src/Common/unix/platform.cpp index f0fc52a8..d97f4e65 100644 --- a/src/Common/unix/platform.cpp +++ b/src/Common/unix/platform.cpp @@ -6,20 +6,4 @@ uint32_t GetTickCount() struct timespec ts; clock_gettime(CLOCK_MONOTONIC, &ts); return (1000 * ts.tv_sec + ts.tv_nsec / 1000000); -} - -#include - -void (__cpuid)(int __cpuVal[4], unsigned int __leaf) -{ - __cpuid(__cpuVal[0], __cpuVal[1], __cpuVal[2], __cpuVal[3], __leaf); -} -#undef __cpuid - -#ifdef __clang__ -void __cpuidex(int __cpuid_info[4], int __leaf, int __subleaf) -{ - __cpuid_count (__leaf, __subleaf, __cpuid_info[0], __cpuid_info[1], - __cpuid_info[2], __cpuid_info[3]); -} -#endif \ No newline at end of file +} \ No newline at end of file diff --git a/src/Common/unix/platform.h b/src/Common/unix/platform.h index d7522200..dc17edcc 100644 --- a/src/Common/unix/platform.h +++ b/src/Common/unix/platform.h @@ -40,10 +40,6 @@ inline uint32_t GetExceptionError() #undef Success #undef ClientMessage -// cpu id (somewhat hacky, reorganize later) -void (__cpuid)(int __cpuVal[4], unsigned int __leaf); -void __cpuidex (int __cpuid_info[4], int __leaf, int __subleaf); - // placeholder uint32_t GetTickCount(); diff --git a/src/main.cpp b/src/main.cpp index e6529391..56ea1e05 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -62,11 +62,11 @@ void logCPUAndMemoryInfo() unsigned nExIds, i = 0; char CPUBrandString[0x40]; // Get the information associated with each extended ID. - __cpuid(CPUInfo, 0x80000000); + cpuid(CPUInfo, 0x80000000); nExIds = CPUInfo[0]; for (i = 0x80000000; i <= nExIds; ++i) { - __cpuid(CPUInfo, i); + cpuid(CPUInfo, i); // Interpret CPU brand string if (i == 0x80000002) memcpy(CPUBrandString, CPUInfo, sizeof(CPUInfo)); @@ -194,11 +194,11 @@ void mainEmulatorCommonInit() PPCTimer_init(); // check available CPU extensions int cpuInfo[4]; - __cpuid(cpuInfo, 0x1); + cpuid(cpuInfo, 0x1); _cpuExtension_SSSE3 = ((cpuInfo[2] >> 9) & 1) != 0; _cpuExtension_SSE4_1 = ((cpuInfo[2] >> 19) & 1) != 0; - __cpuidex(cpuInfo, 0x7, 0); + cpuidex(cpuInfo, 0x7, 0); _cpuExtension_AVX2 = ((cpuInfo[1] >> 5) & 1) != 0; #if BOOST_OS_WINDOWS diff --git a/src/util/crypto/aes128.cpp b/src/util/crypto/aes128.cpp index 45a1d837..48aa8334 100644 --- a/src/util/crypto/aes128.cpp +++ b/src/util/crypto/aes128.cpp @@ -837,7 +837,7 @@ void AES128_init() } // check if AES-NI is available int v[4]; - __cpuid(v, 1); + cpuid(v, 1); useAESNI = (v[2] & 0x2000000) != 0; if (useAESNI) {