You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.1 KiB
85 lines
2.1 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: linux dependant ASM code for CPU capability detection |
|
// |
|
// $Workfile: $ |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#include "platform.h" |
|
|
|
#if defined __SANITIZE_ADDRESS__ |
|
bool CheckMMXTechnology(void) { return false; } |
|
bool CheckSSETechnology(void) { return false; } |
|
bool CheckSSE2Technology(void) { return false; } |
|
bool Check3DNowTechnology(void) { return false; } |
|
#elif defined (__arm__) || defined (__arm64__) |
|
bool CheckMMXTechnology(void) { return false; } |
|
bool CheckSSETechnology(void) { return false; } |
|
bool CheckSSE2Technology(void) { return false; } |
|
bool Check3DNowTechnology(void) { return false; } |
|
#else |
|
|
|
static void cpuid(uint32 function, uint32& out_eax, uint32& out_ebx, uint32& out_ecx, uint32& out_edx) |
|
{ |
|
#if defined(PLATFORM_64BITS) |
|
asm("mov %%rbx, %%rsi\n\t" |
|
"cpuid\n\t" |
|
"xchg %%rsi, %%rbx" |
|
: "=a" (out_eax), |
|
"=S" (out_ebx), |
|
"=c" (out_ecx), |
|
"=d" (out_edx) |
|
: "a" (function) |
|
); |
|
#else |
|
asm("mov %%ebx, %%esi\n\t" |
|
"cpuid\n\t" |
|
"xchg %%esi, %%ebx" |
|
: "=a" (out_eax), |
|
"=S" (out_ebx), |
|
"=c" (out_ecx), |
|
"=d" (out_edx) |
|
: "a" (function) |
|
); |
|
#endif |
|
} |
|
|
|
bool CheckMMXTechnology(void) |
|
{ |
|
uint32 eax,ebx,edx,unused; |
|
cpuid(1,eax,ebx,unused,edx); |
|
|
|
return edx & 0x800000; |
|
} |
|
|
|
bool CheckSSETechnology(void) |
|
{ |
|
uint32 eax,ebx,edx,unused; |
|
cpuid(1,eax,ebx,unused,edx); |
|
|
|
return edx & 0x2000000L; |
|
} |
|
|
|
bool CheckSSE2Technology(void) |
|
{ |
|
uint32 eax,ebx,edx,unused; |
|
cpuid(1,eax,ebx,unused,edx); |
|
|
|
return edx & 0x04000000; |
|
} |
|
|
|
bool Check3DNowTechnology(void) |
|
{ |
|
uint32 eax, unused; |
|
cpuid(0x80000000,eax,unused,unused,unused); |
|
|
|
if ( eax > 0x80000000L ) |
|
{ |
|
cpuid(0x80000001,unused,unused,unused,eax); |
|
return ( eax & 1<<31 ); |
|
} |
|
return false; |
|
} |
|
|
|
#endif
|
|
|