1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
/***************************************************************************
*
* DetectMMX.cpp
* by Darryl Agostinelli March 4, 2000
*
* Code was adopted from Intel web page
*
*/
#include "Core/precomp.h"
#include "API/Core/System/system.h"
#include "API/Core/System/cl_assert.h"
static bool do_mmx_test();
bool CL_System::detect_mmx()
{
static bool has_mmx = false;
static bool first_time = true;
if (first_time)
{
first_time = false;
has_mmx = do_mmx_test();
}
return has_mmx;
}
static bool do_mmx_test()
{
#ifdef USE_I386_ASSEMBLER
#ifdef __MSC__
unsigned long RegEDX;
try
{
_asm
{
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
}
}
catch(...) // catch everything
{
return false; // processor does not support CPUID
}
if (RegEDX & 0x800000) // bit 23 is set for MMX technology
{
try { _asm {emms} } // try executing the MMX instruction "emms"
catch(...) { return false; }
}
else
return false; // processor supports CPUID but does not support MMX technology
// if we get here, it means the processor has MMX technology but
// floating-point emulation is on; so MMX technology is unavailable
return true;
#elif __GNUC__
int edx=0;
try
{
asm(
"mov 1,%%eax \n" //Get ready for CPUID
"CPUID \n" //Access CPUID
:"=d"(edx)
);
}
catch(...) //Catch all
{
return false;
}
if (edx & 0x800000)
{
try{ asm("emms"); }
catch(...) {return false;}
}
else
return false;
return true;
#elif __BORLANDC__
//This is for detecting assembly when using the Borland compilers
//If you do not have TASM then this will not compile
//If you do have TASM then uncomment the code below, otherwise ignore it
#ifdef USE_TASM
int RegEDX=0;
try
{
asm
{
mov eax, 1
CPUID
mov RegEDX, edx
}
}
catch(...) {return false;}
if (RegEDX & 0x800000)
{
try{asm{emms}}
catch(...) {return false;}
}
else
return false;
return true;
#else
std::cout<<"Support to detect this has not been compiled in. Please check source(detect_mmx.cpp)"<<std::endl;
return false;
#endif //Endif USE_TASM
#else
cl_info(0, "CL_System::detect_mmx() not implemented under your OS/Compiler/Architecture.");
return false;
#endif
#else
return false;
#endif //End USE_I386_ASSEMBLER
}
|