Changed: Use same _mm_getcsr and __cpuid intrinsics everywhere
This commit is contained in:
parent
ece27e054f
commit
89ee8c80e4
1 changed files with 5 additions and 80 deletions
|
@ -955,19 +955,8 @@ static bool DetectSSE()
|
|||
// check OS support for SSE
|
||||
try
|
||||
{
|
||||
#ifdef NL_OS_WINDOWS
|
||||
#ifdef NL_NO_ASM
|
||||
unsigned int tmp = _mm_getcsr();
|
||||
nlunreferenced(tmp);
|
||||
#else
|
||||
__asm
|
||||
{
|
||||
xorps xmm0, xmm0 // Streaming SIMD Extension
|
||||
}
|
||||
#endif // NL_NO_ASM
|
||||
#elif NL_OS_UNIX
|
||||
__asm__ __volatile__ ("xorps %xmm0, %xmm0;");
|
||||
#endif // NL_OS_UNIX
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
|
@ -989,74 +978,10 @@ bool CSystemInfo::_HaveSSE = DetectSSE ();
|
|||
bool CSystemInfo::hasCPUID ()
|
||||
{
|
||||
#ifdef NL_CPU_INTEL
|
||||
uint32 result = 0;
|
||||
#ifdef NL_OS_WINDOWS
|
||||
#ifdef NL_NO_ASM
|
||||
sint32 CPUInfo[4] = {-1};
|
||||
nlcpuid(CPUInfo, 0);
|
||||
if (CPUInfo[3] != -1) result = 1;
|
||||
#else
|
||||
__asm
|
||||
{
|
||||
pushad
|
||||
pushfd
|
||||
// If ID bit of EFLAGS can change, then cpuid is available
|
||||
pushfd
|
||||
pop eax // Get EFLAG
|
||||
mov ecx,eax
|
||||
xor eax,0x200000 // Flip ID bit
|
||||
push eax
|
||||
popfd // Write EFLAGS
|
||||
pushfd
|
||||
pop eax // read back EFLAG
|
||||
xor eax,ecx
|
||||
je noCpuid // no flip -> no CPUID instr.
|
||||
|
||||
popfd // restore state
|
||||
popad
|
||||
mov result, 1
|
||||
jmp CPUIDPresent
|
||||
|
||||
noCpuid:
|
||||
popfd // restore state
|
||||
popad
|
||||
mov result, 0
|
||||
CPUIDPresent:
|
||||
}
|
||||
#endif // NL_NO_ASM
|
||||
#elif NL_OS_UNIX // NL_OS_WINDOWS
|
||||
__asm__ __volatile__ (
|
||||
/* Save Register */
|
||||
"pushl %%ebp;"
|
||||
"pushl %%ebx;"
|
||||
"pushl %%edx;"
|
||||
|
||||
/* Check if this CPU supports cpuid */
|
||||
"pushf;"
|
||||
"pushf;"
|
||||
"popl %%eax;"
|
||||
"movl %%eax, %%ebx;"
|
||||
"xorl $(1 << 21), %%eax;" // CPUID bit
|
||||
"pushl %%eax;"
|
||||
"popf;"
|
||||
"pushf;"
|
||||
"popl %%eax;"
|
||||
"popf;" // Restore flags
|
||||
"xorl %%ebx, %%eax;"
|
||||
"jz NoCPUID;"
|
||||
"movl $1, %0;"
|
||||
"jmp CPUID;"
|
||||
|
||||
"NoCPUID:;"
|
||||
"movl $0, %0;"
|
||||
"CPUID:;"
|
||||
"popl %%edx;"
|
||||
"popl %%ebx;"
|
||||
"popl %%ebp;"
|
||||
|
||||
:"=a"(result)
|
||||
);
|
||||
#endif // NL_OS_UNIX
|
||||
uint32 result = 0;
|
||||
sint32 CPUInfo[4] = {-1};
|
||||
nlcpuid(CPUInfo, 0);
|
||||
if (CPUInfo[3] != -1) result = 1;
|
||||
return result == 1;
|
||||
#else
|
||||
return false;
|
||||
|
@ -1067,7 +992,7 @@ bool CSystemInfo::hasCPUID ()
|
|||
uint32 CSystemInfo::getCPUID()
|
||||
{
|
||||
#ifdef NL_CPU_INTEL
|
||||
if(hasCPUID())
|
||||
if (hasCPUID())
|
||||
{
|
||||
uint32 result = 0;
|
||||
sint32 CPUInfo[4];
|
||||
|
|
Loading…
Reference in a new issue