From e76d294c1084bdb5c57465f0382b2171e3c3ba4f Mon Sep 17 00:00:00 2001 From: rubidium Date: Thu, 2 Jan 2014 08:55:32 +0000 Subject: (svn r26197) -Add: wrappers around cpuid --- src/cpu.cpp | 32 ++++++++++++++++++++++++++++++++ src/cpu.h | 7 +++++++ 2 files changed, 39 insertions(+) diff --git a/src/cpu.cpp b/src/cpu.cpp index a5715b829..ce923cfe9 100644 --- a/src/cpu.cpp +++ b/src/cpu.cpp @@ -74,3 +74,35 @@ uint64 ottd_rdtsc() # endif uint64 ottd_rdtsc() {return 0;} #endif + + +/** + * Definitions for CPU detection: + * + * MSVC offers cpu information while gcc only implements in gcc 4.8 + * __builtin_cpu_supports and friends + * http://msdn.microsoft.com/library/vstudio/hskdteyh%28v=vs.100%29.aspx + * http://gcc.gnu.org/onlinedocs/gcc/X86-Built-in-Functions.html + * + * Other platforms/architectures don't have CPUID, so zero the info and then + * most (if not all) of the features are set as if they do not exist. + */ +#if defined(_MSC_VER) +void ottd_cpuid(int info[4], int type) + __cpuiid(info, type); +} +#elif defined(__x86_64__) || defined(__i386) +void ottd_cpuid(int info[4], int type) +{ + __asm__ __volatile__ ( + "cpuid" + : "=a" (info[0]), "=b" (info[1]), "=c" (info[2]), "=d" (info[3]) + : "a" (type) + ); +} +#else +void ottd_cpuid(int info[4], int type) +{ + info[0] = info[1] = info[2] = info[3] = 0; +} +#endif diff --git a/src/cpu.h b/src/cpu.h index 528c87076..8ea95f5bb 100644 --- a/src/cpu.h +++ b/src/cpu.h @@ -18,4 +18,11 @@ */ uint64 ottd_rdtsc(); +/** + * Get the CPUID information from the CPU. + * @param info The retrieved info. All zeros on architectures without CPUID. + * @param type The information this instruction should retrieve. + */ +void ottd_cpuid(int info[4], int type); + #endif /* CPU_H */ -- cgit v1.2.3-54-g00ecf