|
|
| #pragma optimize( "", off ) | |
#pragma warning( disable: 4800 ) //'int' : forcing value to bool 'true' or 'false' (performance warning) | |
typedef unsigned int DWORD; | |
#ifndef EXCEPTION_EXECUTE_HANDLER | |
#define EXCEPTION_EXECUTE_HANDLER 1 | |
// -------------------------------------------------------------------------- | |
bool CheckMMXTechnology(void) | |
BOOL retval = TRUE; | |
DWORD RegEDX; | |
__try | |
_asm | |
xor edx, edx // Clue the compiler that EDX is about to be used. | |
mov eax, 1 // set up CPUID to return processor version and features | |
// 0 = vendor string, 1 = version info, 2 = cache info | |
CPUID // code bytes = 0fh, 0a2h | |
mov RegEDX, edx // features returned in edx | |
} | |
__except(EXCEPTION_EXECUTE_HANDLER) | |
// If CPUID not supported, then certainly no MMX extensions. | |
if (retval) | |
if (RegEDX & 0x800000) // bit 23 is set for MMX technology | |
// try executing the MMX instruction "emms" | |
__except(EXCEPTION_EXECUTE_HANDLER) | |
retval = FALSE; | |
retval = FALSE; // processor supports CPUID but does not support MMX technology | |
// if retval == 0 here, it means the processor has MMX technology but | |
// floating-point emulation is on; so MMX technology is unavailable | |
return retval; | |
// -------------------------------------------------------------------------- | |
bool CheckSSETechnology(void) | |
BOOL retval = TRUE; | |
DWORD RegEDX; | |
// Do we have support for the CPUID function? | |
__try | |
_asm | |
xor edx, edx // Clue the compiler that EDX is about to be used. | |
mov eax, 1 // set up CPUID to return processor version and features | |
// 0 = vendor string, 1 = version info, 2 = cache info | |
CPUID // code bytes = 0fh, 0a2h | |
mov RegEDX, edx // features returned in edx | |
} | |
__except(EXCEPTION_EXECUTE_HANDLER) | |
// If CPUID not supported, then certainly no SSE extensions. | |
if (retval) | |
// Do we have support for SSE in this processor? | |
if ( RegEDX & 0x2000000L ) // bit 25 is set for SSE technology | |
// Make sure that SSE is supported by executing an inline SSE instruction | |
// BUGBUG, FIXME - Visual C Version 6.0 does not support SSE inline code YET (No macros from Intel either) | |
// Fix this if VC7 supports inline SSE instructinons like "xorps" as shown below. | |
// Attempt execution of a SSE instruction to make sure OS supports SSE FPU context switches | |
// This will work on Win2k+ (Including masking SSE FPU exception to "normalized" values) | |
// This will work on Win98+ (But no "masking" of FPU exceptions provided) | |
__except(EXCEPTION_EXECUTE_HANDLER) | |
return retval; | |
bool CheckSSE2Technology(void) | |
BOOL retval = TRUE; | |
DWORD RegEDX; | |
// Do we have support for the CPUID function? | |
__try | |
_asm | |
xor edx, edx // Clue the compiler that EDX is about to be used. | |
mov eax, 1 // set up CPUID to return processor version and features | |
// 0 = vendor string, 1 = version info, 2 = cache info | |
CPUID // code bytes = 0fh, 0a2h | |
mov RegEDX, edx // features returned in edx | |
} | |
__except(EXCEPTION_EXECUTE_HANDLER) | |
// If CPUID not supported, then certainly no SSE extensions. | |
if (retval) | |
// Do we have support for SSE in this processor? | |
if ( RegEDX & 0x04000000 ) // bit 26 is set for SSE2 technology | |