cpu.h

00001 #ifndef CRYPTOPP_CPU_H
00002 #define CRYPTOPP_CPU_H
00003 
00004 #include "config.h"
00005 
00006 #ifdef CRYPTOPP_MSVC6PP_OR_LATER
00007         #include <emmintrin.h>
00008 #endif
00009 
00010 NAMESPACE_BEGIN(CryptoPP)
00011 
00012 #if defined(CRYPTOPP_X86_ASM_AVAILABLE) || (_MSC_VER >= 1400 && CRYPTOPP_BOOL_X64)
00013 
00014 #define CRYPTOPP_CPUID_AVAILABLE
00015 
00016 // these should not be used directly
00017 extern CRYPTOPP_DLL bool g_x86DetectionDone;
00018 extern CRYPTOPP_DLL bool g_hasSSE2;
00019 extern CRYPTOPP_DLL bool g_hasMMX;
00020 extern CRYPTOPP_DLL bool g_hasSSSE3;
00021 extern CRYPTOPP_DLL bool g_isP4;
00022 extern CRYPTOPP_DLL word32 g_cacheLineSize;
00023 CRYPTOPP_DLL void DetectX86Features();
00024 
00025 CRYPTOPP_DLL bool CpuId(word32 input, word32 *output);
00026 
00027 #if CRYPTOPP_BOOL_X64
00028 inline bool HasSSE2()   {return true;}
00029 inline bool HasMMX()    {return true;}
00030 #else
00031 
00032 inline bool HasSSE2()
00033 {
00034         if (!g_x86DetectionDone)
00035                 DetectX86Features();
00036         return g_hasSSE2;
00037 }
00038 
00039 inline bool HasMMX()
00040 {
00041         if (!g_x86DetectionDone)
00042                 DetectX86Features();
00043         return g_hasMMX;
00044 }
00045 
00046 #endif
00047 
00048 inline bool HasSSSE3()
00049 {
00050         if (!g_x86DetectionDone)
00051                 DetectX86Features();
00052         return g_hasSSSE3;
00053 }
00054 
00055 inline bool IsP4()
00056 {
00057         if (!g_x86DetectionDone)
00058                 DetectX86Features();
00059         return g_isP4;
00060 }
00061 
00062 inline int GetCacheLineSize()
00063 {
00064         if (!g_x86DetectionDone)
00065                 DetectX86Features();
00066         return g_cacheLineSize;
00067 }
00068 
00069 #else
00070 
00071 inline int GetCacheLineSize()
00072 {
00073         return CRYPTOPP_L1_CACHE_LINE_SIZE;
00074 }
00075 
00076 inline bool HasSSSE3()  {return false;}
00077 inline bool IsP4()              {return false;}
00078 
00079 // assume MMX and SSE2 if intrinsics are enabled
00080 #if CRYPTOPP_BOOL_SSE2_INTRINSICS_AVAILABLE || CRYPTOPP_BOOL_X64
00081 inline bool HasSSE2()   {return true;}
00082 inline bool HasMMX()    {return true;}
00083 #else
00084 inline bool HasSSE2()   {return false;}
00085 inline bool HasMMX()    {return false;}
00086 #endif
00087 
00088 #endif          // #ifdef CRYPTOPP_X86_ASM_AVAILABLE || _MSC_VER >= 1400
00089 
00090 #if defined(__GNUC__)
00091         // define these in two steps to allow arguments to be expanded
00092         #define GNU_AS1(x) #x ";"
00093         #define GNU_AS2(x, y) #x ", " #y ";"
00094         #define GNU_AS3(x, y, z) #x ", " #y ", " #z ";"
00095         #define GNU_ASL(x) "\n" #x ":"
00096         #define GNU_ASJ(x, y, z) #x " " #y #z ";"
00097         #define AS1(x) GNU_AS1(x)
00098         #define AS2(x, y) GNU_AS2(x, y)
00099         #define AS3(x, y, z) GNU_AS3(x, y, z)
00100         #define ASS(x, y, a, b, c, d) #x ", " #y ", " #a "*64+" #b "*16+" #c "*4+" #d ";"
00101         #define ASL(x) GNU_ASL(x)
00102         #define ASJ(x, y, z) GNU_ASJ(x, y, z)
00103         #define ASC(x, y) #x " " #y ";"
00104         #define CRYPTOPP_NAKED
00105 #else
00106         #define AS1(x) __asm {x}
00107         #define AS2(x, y) __asm {x, y}
00108         #define AS3(x, y, z) __asm {x, y, z}
00109         #define ASS(x, y, a, b, c, d) __asm {x, y, _MM_SHUFFLE(a, b, c, d)}
00110         #define ASL(x) __asm {label##x:}
00111         #define ASJ(x, y, z) __asm {x label##y}
00112         #define ASC(x, y) __asm {x label##y}
00113         #define CRYPTOPP_NAKED __declspec(naked)
00114 #endif
00115 
00116 // GNU assembler doesn't seem to have mod operator
00117 #define ASM_MOD(x, y) ((x)-((x)/(y))*(y))
00118 
00119 #if CRYPTOPP_BOOL_X86
00120         #define WORD_SZ 4
00121         #define WORD_REG(x)     e##x
00122         #define WORD_PTR DWORD PTR
00123         #define AS_PUSH(x) AS1(push e##x)
00124         #define AS_POP(x) AS1(pop e##x)
00125 #elif CRYPTOPP_BOOL_X64
00126         #define WORD_SZ 8
00127         #define WORD_REG(x)     r##x
00128         #define WORD_PTR QWORD PTR
00129         #define AS_PUSH(x) AS1(pushq r##x)
00130         #define AS_POP(x) AS1(popq r##x)
00131 #endif
00132 
00133 NAMESPACE_END
00134 
00135 #endif

Generated on Fri Jun 1 11:11:20 2007 for Crypto++ by  doxygen 1.5.2