diff --git a/External/FEXCore/Source/Interface/Core/HostFeatures.cpp b/External/FEXCore/Source/Interface/Core/HostFeatures.cpp index 422f58b89..0c996081c 100644 --- a/External/FEXCore/Source/Interface/Core/HostFeatures.cpp +++ b/External/FEXCore/Source/Interface/Core/HostFeatures.cpp @@ -79,6 +79,7 @@ HostFeatures::HostFeatures() { SupportsSHA = true; SupportsBMI1 = true; SupportsBMI2 = true; + SupportsCLWB = true; if (!SupportsAtomics) { WARN_ONCE_FMT("Host CPU doesn't support atomics. Expect bad performance"); @@ -128,6 +129,7 @@ HostFeatures::HostFeatures() { SupportsSHA = Features.has(Xbyak::util::Cpu::tSHA); SupportsBMI1 = Features.has(Xbyak::util::Cpu::tBMI1); SupportsBMI2 = Features.has(Xbyak::util::Cpu::tBMI2); + SupportsBMI2 = Features.has(Xbyak::util::Cpu::tCLWB); SupportsPMULL_128Bit = Features.has(Xbyak::util::Cpu::tPCLMULQDQ); // xbyak doesn't know how to check for CLZero diff --git a/External/FEXCore/include/FEXCore/Core/HostFeatures.h b/External/FEXCore/include/FEXCore/Core/HostFeatures.h index 8f5278f54..0d213bcb6 100644 --- a/External/FEXCore/include/FEXCore/Core/HostFeatures.h +++ b/External/FEXCore/include/FEXCore/Core/HostFeatures.h @@ -27,6 +27,7 @@ class HostFeatures final { bool SupportsSHA{}; bool SupportsBMI1{}; bool SupportsBMI2{}; + bool SupportsCLWB{}; bool SupportsPMULL_128Bit{}; // Float exception behaviour diff --git a/Scripts/json_config_parse.py b/Scripts/json_config_parse.py index d31abbd9a..de30e020c 100644 --- a/Scripts/json_config_parse.py +++ b/Scripts/json_config_parse.py @@ -72,6 +72,7 @@ class HostFeatures(Flag) : FEATURE_CLZERO = (1 << 5) FEATURE_BMI1 = (1 << 6) FEATURE_BMI2 = (1 << 7) + FEATURE_CLWB = (1 << 8) RegStringLookup = { "NONE": Regs.REG_NONE, @@ -143,6 +144,7 @@ HostFeaturesLookup = { "CLZERO" : HostFeatures.FEATURE_CLZERO, "BMI1" : HostFeatures.FEATURE_BMI1, "BMI2" : HostFeatures.FEATURE_BMI2, + "CLWB" : HostFeatures.FEATURE_CLWB, } def parse_hexstring(s): diff --git a/Source/Tests/HarnessHelpers.h b/Source/Tests/HarnessHelpers.h index 2f035da1d..a2c553c71 100644 --- a/Source/Tests/HarnessHelpers.h +++ b/Source/Tests/HarnessHelpers.h @@ -385,6 +385,7 @@ namespace FEX::HarnessHelper { FEATURE_CLZERO = (1 << 5), FEATURE_BMI1 = (1 << 6), FEATURE_BMI2 = (1 << 7), + FEATURE_CLWB = (1 << 8), }; bool Requires3DNow() const { return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_3DNOW; } @@ -395,6 +396,7 @@ namespace FEX::HarnessHelper { bool RequiresCLZERO() const { return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_CLZERO; } bool RequiresBMI1() const { return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_BMI1; } bool RequiresBMI2() const { return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_BMI2; } + bool RequiresCLWB() const { return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_CLWB; } private: FEX_CONFIG_OPT(ConfigDumpGPRs, DUMPGPRS); @@ -534,6 +536,7 @@ namespace FEX::HarnessHelper { bool RequiresCLZERO() const { return Config.RequiresCLZERO(); } bool RequiresBMI1() const { return Config.RequiresBMI1(); } bool RequiresBMI2() const { return Config.RequiresBMI2(); } + bool RequiresCLWB() const { return Config.RequiresCLWB(); } private: constexpr static uint64_t STACK_SIZE = FHU::FEX_PAGE_SIZE; diff --git a/Source/Tests/TestHarnessRunner.cpp b/Source/Tests/TestHarnessRunner.cpp index a6d3a4ecc..f34c7f8be 100644 --- a/Source/Tests/TestHarnessRunner.cpp +++ b/Source/Tests/TestHarnessRunner.cpp @@ -178,7 +178,8 @@ int main(int argc, char **argv, char **const envp) { (!HostFeatures.SupportsSHA && Loader.RequiresSHA()) || (!HostFeatures.SupportsCLZERO && Loader.RequiresCLZERO()) || (!HostFeatures.SupportsBMI1 && Loader.RequiresBMI1()) || - (!HostFeatures.SupportsBMI2 && Loader.RequiresBMI2()); + (!HostFeatures.SupportsBMI2 && Loader.RequiresBMI2()) || + (!HostFeatures.SupportsCLWB && Loader.RequiresCLWB()); if (TestUnsupported) { FEXCore::Context::DestroyContext(CTX); diff --git a/unittests/ASM/Secondary/CLWB.asm b/unittests/ASM/Secondary/CLWB.asm index 1c4848647..65b88f583 100644 --- a/unittests/ASM/Secondary/CLWB.asm +++ b/unittests/ASM/Secondary/CLWB.asm @@ -2,7 +2,8 @@ { "RegData": { "RAX": "1" - } + }, + "HostFeatures": ["CLWB"] } %endif