From d1dd98c17b4958ba5cd2276743e47e24eb1f3d5c Mon Sep 17 00:00:00 2001 From: Darryl Pogue Date: Sat, 15 Dec 2012 16:06:41 -0800 Subject: [PATCH] CoreLib fixes for Linux. --- CMakeLists.txt | 1 + Sources/Plasma/CoreLib/HeadSpin.h | 20 +++++++---- Sources/Plasma/CoreLib/hsCpuID.cpp | 54 +++++++++++++++++++++++------ Sources/Plasma/CoreLib/hsWide.h | 2 +- Sources/Plasma/CoreLib/plString.cpp | 4 +-- 5 files changed, 61 insertions(+), 20 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4e8dcf39..b3f43b77 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,6 +7,7 @@ if(WIN32 AND NOT CYGWIN) endif(WIN32 AND NOT CYGWIN) if(UNIX) add_definitions(-DHS_BUILD_FOR_UNIX) + add_definitions(-std=c++0x) endif(UNIX) # End HeadSpin Configuration diff --git a/Sources/Plasma/CoreLib/HeadSpin.h b/Sources/Plasma/CoreLib/HeadSpin.h index 08dc423e..80552eec 100644 --- a/Sources/Plasma/CoreLib/HeadSpin.h +++ b/Sources/Plasma/CoreLib/HeadSpin.h @@ -80,14 +80,8 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com # define NOMINMAX // Needed to prevent NxMath conflicts # endif # include +#endif - // Just some fun typedefs... - typedef HWND hsWindowHndl; - typedef HINSTANCE hsWindowInst; -#else - typedef int32_t* hsWindowHndl; - typedef int32_t* hsWindowInst; -#endif // HS_BUILD_FOR_WIN32 //====================================== // We don't want the Windows.h min/max! @@ -112,6 +106,18 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com #include +//====================================== +// Just some fun typedefs... +//====================================== +#ifdef HS_BUILD_FOR_WIN32 + typedef HWND hsWindowHndl; + typedef HINSTANCE hsWindowInst; +#else + typedef int32_t* hsWindowHndl; + typedef int32_t* hsWindowInst; +#endif // HS_BUILD_FOR_WIN32 + + //====================================== // Basic macros //====================================== diff --git a/Sources/Plasma/CoreLib/hsCpuID.cpp b/Sources/Plasma/CoreLib/hsCpuID.cpp index 12c99f9b..2944c3c4 100644 --- a/Sources/Plasma/CoreLib/hsCpuID.cpp +++ b/Sources/Plasma/CoreLib/hsCpuID.cpp @@ -40,7 +40,13 @@ You can contact Cyan Worlds, Inc. by email legal@cyan.com *==LICENSE==*/ -#include +#if defined(_MSC_VER) || ((defined(_WIN32) || defined(_WIN64)) && defined(__INTEL_COMPILER)) +# include +# define MSC_COMPATIBLE +#elif defined(__GNUC__) +# include +# define GCC_COMPATIBLE +#endif #include "hsCpuID.h" @@ -53,15 +59,43 @@ hsCpuId::hsCpuId() { const unsigned int sse42_flag = 1<<20; const unsigned int avx_flag = 1 << 28; - unsigned int cpu_info[4]; - __cpuid((int*)cpu_info, 1); - has_sse1 = (cpu_info[3] & sse1_flag) || false; - has_sse2 = (cpu_info[3] & sse2_flag) || false; - has_sse3 = (cpu_info[2] & sse3_flag) || false; - has_ssse3 = (cpu_info[2] & ssse3_flag) || false; - has_sse41 = (cpu_info[2] & sse41_flag) || false; - has_sse42 = (cpu_info[2] & sse42_flag) || false; - has_avx = (cpu_info[2] & avx_flag) || false; + unsigned int ax = 0, bx = 0, cx = 0, dx = 0; + + + /** + * Portable implementation of CPUID, successfully tested with: + * - Microsoft Visual Studio 2010, + * - GNU GCC 4.5, + * - Intel C++ Compiler 12.0 + * - Sun Studio 12, + * - AMD x86 Open64 Compiler Suite. + * + * Ref: http://primesieve.googlecode.com/svn-history/r388/trunk/soe/cpuid.h + */ + #if defined(MSC_COMPATIBLE) + int CPUInfo[4] = {ax, bx, cx, dx}; + __cpuid(CPUInfo, 0); + + // check if the CPU supports the cpuid instruction. + if (CPUInfo[0] != 0) { + __cpuid(CPUInfo, 1); + ax = CPUInfo[0]; + bx = CPUInfo[1]; + cx = CPUInfo[2]; + dx = CPUInfo[3]; + } + #elif defined(GCC_COMPATIBLE) + __get_cpuid(1, &ax, &bx, &cx, &dx); + #endif + + + has_sse1 = (dx & sse1_flag) || false; + has_sse2 = (dx & sse2_flag) || false; + has_sse3 = (cx & sse3_flag) || false; + has_ssse3 = (cx & ssse3_flag) || false; + has_sse41 = (cx & sse41_flag) || false; + has_sse42 = (cx & sse42_flag) || false; + has_avx = (cx & avx_flag) || false; } const hsCpuId& hsCpuId::instance() diff --git a/Sources/Plasma/CoreLib/hsWide.h b/Sources/Plasma/CoreLib/hsWide.h index e436f3dd..150348f4 100644 --- a/Sources/Plasma/CoreLib/hsWide.h +++ b/Sources/Plasma/CoreLib/hsWide.h @@ -98,7 +98,7 @@ struct hsWide { }; const hsWide kPosInfinity64 = { kPosInfinity32, 0xffffffff }; -const hsWide kNegInfinity64 = { kNegInfinity32, 0 }; +const hsWide kNegInfinity64 = { static_cast(kNegInfinity32), 0 }; /////////////////////// Inline implementations /////////////////////// diff --git a/Sources/Plasma/CoreLib/plString.cpp b/Sources/Plasma/CoreLib/plString.cpp index c60440c9..dedbf7d1 100644 --- a/Sources/Plasma/CoreLib/plString.cpp +++ b/Sources/Plasma/CoreLib/plString.cpp @@ -361,7 +361,7 @@ plStringBuffer plString::ToWchar() const plStringBuffer utf16 = ToUtf16(); return *reinterpret_cast*>(&utf16); #else - plStringBuffer result; + plStringBuffer result; if (IsEmpty()) return result; @@ -527,7 +527,7 @@ plString plString::IFormat(const char *fmt, va_list vptr) } } else if (chars >= 256) { va_copy(vptr, vptr_save); - std::auto_ptr bigbuffer(new char[chars+1]); + std::unique_ptr bigbuffer(new char[chars+1]); vsnprintf(bigbuffer.get(), chars+1, fmt, vptr); return plString::FromUtf8(bigbuffer.get(), chars); }