41 lines
1.1 KiB
C++
41 lines
1.1 KiB
C++
// 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
|