Merge pull request #140 from shuffle2/master
Implement workaround for Windows versions which do not support XSAVE.
This commit is contained in:
commit
c7b8c75d38
|
@ -101,20 +101,6 @@ private:
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Architecture detection for Windows
|
|
||||||
// Architecture detection is done in cmake on all other platforms
|
|
||||||
// Windows is built on only x86/x86_64
|
|
||||||
#if _WIN32 || _WIN64
|
|
||||||
#define _M_X86 1
|
|
||||||
#if _WIN64
|
|
||||||
#define _ARCH_64 1
|
|
||||||
#define _M_X86_64 1
|
|
||||||
#else
|
|
||||||
#define _ARCH_32 1
|
|
||||||
#define _M_X86_32 1
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Windows compatibility
|
// Windows compatibility
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
|
|
@ -125,6 +125,7 @@
|
||||||
<ClCompile Include="x64CPUDetect.cpp" />
|
<ClCompile Include="x64CPUDetect.cpp" />
|
||||||
<ClCompile Include="x64Emitter.cpp" />
|
<ClCompile Include="x64Emitter.cpp" />
|
||||||
<ClCompile Include="x64FPURoundMode.cpp" />
|
<ClCompile Include="x64FPURoundMode.cpp" />
|
||||||
|
<ClCompile Include="XSaveWorkaround.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Text Include="CMakeLists.txt" />
|
<Text Include="CMakeLists.txt" />
|
||||||
|
|
|
@ -103,6 +103,7 @@
|
||||||
<Filter>Logging</Filter>
|
<Filter>Logging</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="stdafx.cpp" />
|
<ClCompile Include="stdafx.cpp" />
|
||||||
|
<ClCompile Include="XSaveWorkaround.cpp" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Text Include="CMakeLists.txt" />
|
<Text Include="CMakeLists.txt" />
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
// Copyright 2013 Dolphin Emulator Project
|
||||||
|
// Licensed under GPLv2
|
||||||
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#if defined(_WIN32) && defined(_ARCH_64)
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <Windows.h>
|
||||||
|
|
||||||
|
// This puts the rest of this translation unit into a segment which is
|
||||||
|
// initialized by the CRT *before* any of the other code (including C++
|
||||||
|
// static initializers).
|
||||||
|
#pragma warning(disable : 4075)
|
||||||
|
#pragma init_seg(".CRT$XCB")
|
||||||
|
|
||||||
|
struct EnableXSaveWorkaround
|
||||||
|
{
|
||||||
|
EnableXSaveWorkaround()
|
||||||
|
{
|
||||||
|
// Some Windows environments may have hardware support for AVX/FMA,
|
||||||
|
// but the OS does not support it. The CRT math library does not support
|
||||||
|
// this scenario, so we have to manually tell it not to use FMA3
|
||||||
|
// instructions.
|
||||||
|
|
||||||
|
// The API name is somewhat misleading - we're testing for OS support
|
||||||
|
// here.
|
||||||
|
if (!IsProcessorFeaturePresent(PF_XSAVE_ENABLED))
|
||||||
|
{
|
||||||
|
_set_FMA3_enable(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static EnableXSaveWorkaround enableXSaveWorkaround;
|
||||||
|
|
||||||
|
// N.B. Any code after this will still be in the .CRT$XCB segment. Please just
|
||||||
|
// do not append any code here unless it is intended to be executed before
|
||||||
|
// static initializers.
|
||||||
|
|
||||||
|
#endif
|
|
@ -57,7 +57,9 @@
|
||||||
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
<RuntimeTypeInfo>false</RuntimeTypeInfo>
|
||||||
<MinimalRebuild>false</MinimalRebuild>
|
<MinimalRebuild>false</MinimalRebuild>
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||||
<AdditionalOptions>/d2Zi+ /volatile:iso /D PSAPI_VERSION=1 %(AdditionalOptions)</AdditionalOptions>
|
<AdditionalOptions>/d2Zi+ /volatile:iso /D PSAPI_VERSION=1 /D _M_X86=1 %(AdditionalOptions)</AdditionalOptions>
|
||||||
|
<AdditionalOptions Condition="'$(Platform)'=='Win32'">/D _ARCH_32=1 /D _M_X86_32=1 %(AdditionalOptions)</AdditionalOptions>
|
||||||
|
<AdditionalOptions Condition="'$(Platform)'=='x64'">/D _ARCH_64=1 /D _M_X86_64=1 %(AdditionalOptions)</AdditionalOptions>
|
||||||
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||||
<!--
|
<!--
|
||||||
This is for GetVersionEx being marked as depreciated - which is idiotic and there's
|
This is for GetVersionEx being marked as depreciated - which is idiotic and there's
|
||||||
|
|
Loading…
Reference in New Issue