|
|
//========= Copyright � 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose: linux dependant ASM code for CPU capability detection
//
// $Workfile: $
// $NoKeywords: $
//=============================================================================//
// NOTE: This has to be the last file included! (turned off below, since this is included like a header)
#include "tier0/memdbgon.h"
// Turn off memdbg macros (turned on up top) since this is included like a header
#include "tier0/memdbgoff.h"
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; }
|