Implement workaround for Windows versions which do not support XSAVE.

Fixes CRT math routines using FMA instructions from causing illegal instructions.
This commit is contained in:
Shawn Hoffman 2014-03-06 14:38:10 -08:00
parent 8995d299f2
commit 932945d480
3 changed files with 42 additions and 0 deletions

View File

@ -125,6 +125,7 @@
<ClCompile Include="x64CPUDetect.cpp" />
<ClCompile Include="x64Emitter.cpp" />
<ClCompile Include="x64FPURoundMode.cpp" />
<ClCompile Include="XSaveWorkaround.cpp" />
</ItemGroup>
<ItemGroup>
<Text Include="CMakeLists.txt" />

View File

@ -103,6 +103,7 @@
<Filter>Logging</Filter>
</ClCompile>
<ClCompile Include="stdafx.cpp" />
<ClCompile Include="XSaveWorkaround.cpp" />
</ItemGroup>
<ItemGroup>
<Text Include="CMakeLists.txt" />

View File

@ -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