Changed: Use same _mm_getcsr and __cpuid intrinsics everywhere
This commit is contained in:
parent
6dde138039
commit
8c3da3d5d7
1 changed files with 5 additions and 80 deletions
|
@ -955,19 +955,8 @@ static bool DetectSSE()
|
||||||
// check OS support for SSE
|
// check OS support for SSE
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
#ifdef NL_OS_WINDOWS
|
|
||||||
#ifdef NL_NO_ASM
|
|
||||||
unsigned int tmp = _mm_getcsr();
|
unsigned int tmp = _mm_getcsr();
|
||||||
nlunreferenced(tmp);
|
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(...)
|
catch(...)
|
||||||
{
|
{
|
||||||
|
@ -990,73 +979,9 @@ bool CSystemInfo::hasCPUID ()
|
||||||
{
|
{
|
||||||
#ifdef NL_CPU_INTEL
|
#ifdef NL_CPU_INTEL
|
||||||
uint32 result = 0;
|
uint32 result = 0;
|
||||||
#ifdef NL_OS_WINDOWS
|
|
||||||
#ifdef NL_NO_ASM
|
|
||||||
sint32 CPUInfo[4] = {-1};
|
sint32 CPUInfo[4] = {-1};
|
||||||
nlcpuid(CPUInfo, 0);
|
nlcpuid(CPUInfo, 0);
|
||||||
if (CPUInfo[3] != -1) result = 1;
|
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
|
|
||||||
return result == 1;
|
return result == 1;
|
||||||
#else
|
#else
|
||||||
return false;
|
return false;
|
||||||
|
@ -1067,7 +992,7 @@ bool CSystemInfo::hasCPUID ()
|
||||||
uint32 CSystemInfo::getCPUID()
|
uint32 CSystemInfo::getCPUID()
|
||||||
{
|
{
|
||||||
#ifdef NL_CPU_INTEL
|
#ifdef NL_CPU_INTEL
|
||||||
if(hasCPUID())
|
if (hasCPUID())
|
||||||
{
|
{
|
||||||
uint32 result = 0;
|
uint32 result = 0;
|
||||||
sint32 CPUInfo[4];
|
sint32 CPUInfo[4];
|
||||||
|
|
Loading…
Reference in a new issue