// Copyright 2013 Dolphin Emulator Project // Licensed under GPLv2 // Refer to the license.txt file included. #if defined(_WIN32) && defined(_ARCH_64) #include #include // 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