00001
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "stdmisc.h"
00027
00028 #include "nel/misc/cpu_info.h"
00029
00030
00031 namespace NLMISC
00032 {
00033
00034 static bool DetectMMX(void)
00035 {
00036 #ifdef NL_OS_WINDOWS
00037 if (!CCpuInfo___::hasCPUID()) return false;
00038
00039 uint32 result = 0;
00040 __asm
00041 {
00042 mov eax,1
00043 cpuid
00044 test edx,0x800000
00045 je noMMX
00046 mov result, 1
00047 noMMX:
00048 }
00049
00050 return result == 1;
00051
00052
00053
00054 #else
00055 return false;
00056 #endif
00057 }
00058
00059
00060 static bool DetectSSE(void)
00061 {
00062 #ifdef NL_OS_WINDOWS
00063 if (!CCpuInfo___::hasCPUID()) return false;
00064
00065 uint32 result = 0;
00066 __asm
00067 {
00068 mov eax, 1
00069 cpuid
00070 test EDX, 002000000h
00071 je noSSE
00072 mov result, 1
00073 noSSE:
00074 }
00075
00076
00077 if (result)
00078 {
00079
00080 try
00081 {
00082 __asm
00083 {
00084 xorps xmm0, xmm0
00085 }
00086 }
00087 catch(...)
00088 {
00089 return false;
00090 }
00091
00092
00093
00094 return true;
00095 }
00096 else
00097 {
00098 return false;
00099 }
00100 #else
00101 return false;
00102 #endif
00103 }
00104
00105 bool HasMMX = DetectMMX();
00106 bool HasSSE = DetectSSE();
00107
00108 bool CCpuInfo___::hasCPUID(void)
00109 {
00110 #ifdef NL_OS_WINDOWS
00111 uint32 result;
00112 __asm
00113 {
00114 pushad
00115 pushfd
00116
00117 pushfd
00118 pop eax
00119 mov ecx,eax
00120 xor eax,0x200000
00121 push eax
00122 popfd
00123 pushfd
00124 pop eax
00125 xor eax,ecx
00126 je noCpuid
00127
00128 popfd
00129 popad
00130 mov result, 1
00131 jmp CPUIDPresent
00132
00133 noCpuid:
00134 popfd
00135 popad
00136 mov result, 0
00137 CPUIDPresent:
00138 }
00139 return result == 1;
00140 #else
00141 return false;
00142 #endif
00143 }
00144 bool CCpuInfo___::hasMMX(void) { return HasMMX; }
00145 bool CCpuInfo___::hasSSE(void) { return HasSSE; }
00146
00147 }