|
|
|
//========= 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 (__aarch64__)
|
|
|
|
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
|