From 25eb85f80e2767f519d933d7af7dbe1d7ea88bcb Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Mon, 19 Oct 2026 14:27:19 -0700 Subject: [PATCH] HostRunner: Support checking for SERIALIZE --- Scripts/json_config_parse.py | 104 +++++++++--------- Source/Common/X86Features.h | 2 + Source/Tools/CommonTools/HarnessHelpers.h | 7 ++ .../TestHarnessRunner/TestHarnessRunner.cpp | 2 + unittests/ASM/Secondary/07_XX_05.asm | 3 +- 5 files changed, 66 insertions(+), 52 deletions(-) diff --git a/Scripts/json_config_parse.py b/Scripts/json_config_parse.py index c707ef891..79263101c 100644 --- a/Scripts/json_config_parse.py +++ b/Scripts/json_config_parse.py @@ -62,32 +62,33 @@ class Mode(Flag) : MODE_64 = 1 class HostFeatures(Flag) : - FEATURE_ANY = 0 - FEATURE_3DNOW = (1 << 0) - FEATURE_SSE4A = (1 << 1) - FEATURE_AVX = (1 << 2) - FEATURE_RAND = (1 << 3) - FEATURE_SHA = (1 << 4) - FEATURE_CLZERO = (1 << 5) - FEATURE_BMI1 = (1 << 6) - FEATURE_BMI2 = (1 << 7) - FEATURE_CLWB = (1 << 8) - FEATURE_LINUX = (1 << 9) - FEATURE_AES256 = (1 << 10) - FEATURE_AFP = (1 << 11) - FEATURE_SSSE3 = (1 << 12) - FEATURE_SSE4_1 = (1 << 13) - FEATURE_SSE4_2 = (1 << 14) - FEATURE_AES = (1 << 15) - FEATURE_PCLMUL = (1 << 16) - FEATURE_MOVBE = (1 << 17) - FEATURE_ADX = (1 << 18) - FEATURE_XSAVE = (1 << 19) - FEATURE_RDPID = (1 << 20) - FEATURE_CLFLOPT = (1 << 21) - FEATURE_FSGSBASE = (1 << 22) - FEATURE_EMMI = (1 << 23) - FEATURE_AVX_VNNI = (1 << 24) + FEATURE_ANY = 0 + FEATURE_3DNOW = (1 << 0) + FEATURE_SSE4A = (1 << 1) + FEATURE_AVX = (1 << 2) + FEATURE_RAND = (1 << 3) + FEATURE_SHA = (1 << 4) + FEATURE_CLZERO = (1 << 5) + FEATURE_BMI1 = (1 << 6) + FEATURE_BMI2 = (1 << 7) + FEATURE_CLWB = (1 << 8) + FEATURE_LINUX = (1 << 9) + FEATURE_AES256 = (1 << 10) + FEATURE_AFP = (1 << 11) + FEATURE_SSSE3 = (1 << 12) + FEATURE_SSE4_1 = (1 << 13) + FEATURE_SSE4_2 = (1 << 14) + FEATURE_AES = (1 << 15) + FEATURE_PCLMUL = (1 << 16) + FEATURE_MOVBE = (1 << 17) + FEATURE_ADX = (1 << 18) + FEATURE_XSAVE = (1 << 19) + FEATURE_RDPID = (1 << 20) + FEATURE_CLFLOPT = (1 << 21) + FEATURE_FSGSBASE = (1 << 22) + FEATURE_EMMI = (1 << 23) + FEATURE_AVX_VNNI = (1 << 24) + FEATURE_SERIALIZE = (1 << 25) RegStringLookup = { "NONE": Regs.REG_NONE, @@ -150,31 +151,32 @@ ModeStringLookup = { } HostFeaturesLookup = { - "3DNOW" : HostFeatures.FEATURE_3DNOW, - "SSE4A" : HostFeatures.FEATURE_SSE4A, - "AVX" : HostFeatures.FEATURE_AVX, - "RAND" : HostFeatures.FEATURE_RAND, - "SHA" : HostFeatures.FEATURE_SHA, - "CLZERO" : HostFeatures.FEATURE_CLZERO, - "BMI1" : HostFeatures.FEATURE_BMI1, - "BMI2" : HostFeatures.FEATURE_BMI2, - "CLWB" : HostFeatures.FEATURE_CLWB, - "LINUX" : HostFeatures.FEATURE_LINUX, - "AES256" : HostFeatures.FEATURE_AES256, - "AFP" : HostFeatures.FEATURE_AFP, - "SSSE3" : HostFeatures.FEATURE_SSSE3, - "SSE4.1" : HostFeatures.FEATURE_SSE4_1, - "SSE4.2" : HostFeatures.FEATURE_SSE4_2, - "AES" : HostFeatures.FEATURE_AES, - "PCLMUL" : HostFeatures.FEATURE_PCLMUL, - "MOVBE" : HostFeatures.FEATURE_MOVBE, - "ADX" : HostFeatures.FEATURE_ADX, - "XSAVE" : HostFeatures.FEATURE_XSAVE, - "RDPID" : HostFeatures.FEATURE_RDPID, - "CLFLOPT" : HostFeatures.FEATURE_CLFLOPT, - "FSGSBASE" : HostFeatures.FEATURE_FSGSBASE, - "EMMI" : HostFeatures.FEATURE_EMMI, - "AVX_VNNI" : HostFeatures.FEATURE_AVX_VNNI, + "3DNOW" : HostFeatures.FEATURE_3DNOW, + "SSE4A" : HostFeatures.FEATURE_SSE4A, + "AVX" : HostFeatures.FEATURE_AVX, + "RAND" : HostFeatures.FEATURE_RAND, + "SHA" : HostFeatures.FEATURE_SHA, + "CLZERO" : HostFeatures.FEATURE_CLZERO, + "BMI1" : HostFeatures.FEATURE_BMI1, + "BMI2" : HostFeatures.FEATURE_BMI2, + "CLWB" : HostFeatures.FEATURE_CLWB, + "LINUX" : HostFeatures.FEATURE_LINUX, + "AES256" : HostFeatures.FEATURE_AES256, + "AFP" : HostFeatures.FEATURE_AFP, + "SSSE3" : HostFeatures.FEATURE_SSSE3, + "SSE4.1" : HostFeatures.FEATURE_SSE4_1, + "SSE4.2" : HostFeatures.FEATURE_SSE4_2, + "AES" : HostFeatures.FEATURE_AES, + "PCLMUL" : HostFeatures.FEATURE_PCLMUL, + "MOVBE" : HostFeatures.FEATURE_MOVBE, + "ADX" : HostFeatures.FEATURE_ADX, + "XSAVE" : HostFeatures.FEATURE_XSAVE, + "RDPID" : HostFeatures.FEATURE_RDPID, + "CLFLOPT" : HostFeatures.FEATURE_CLFLOPT, + "FSGSBASE" : HostFeatures.FEATURE_FSGSBASE, + "EMMI" : HostFeatures.FEATURE_EMMI, + "AVX_VNNI" : HostFeatures.FEATURE_AVX_VNNI, + "SERIALIZE" : HostFeatures.FEATURE_SERIALIZE, } def parse_hexstring(s): diff --git a/Source/Common/X86Features.h b/Source/Common/X86Features.h index 684c75754..b97a6cdb9 100644 --- a/Source/Common/X86Features.h +++ b/Source/Common/X86Features.h @@ -40,6 +40,7 @@ public: Feat_vaes = data_7.ecx & (1U << 9); Feat_pclmulqdq = Feat_pclmulqdq && (data_7.ecx & (1U << 10)); Feat_rdpid = data_7.ecx & (1U << 22); + Feat_serialize = data_7.edx & (1U << 14); if (data_7.eax >= 1) { auto data_7_1 = cpuid(0x7, 0x1); @@ -85,6 +86,7 @@ public: bool Feat_clflopt {}; bool Feat_fsgsbase {}; bool Feat_avx_vnni {}; + bool Feat_serialize {}; private: struct cpuid_data { diff --git a/Source/Tools/CommonTools/HarnessHelpers.h b/Source/Tools/CommonTools/HarnessHelpers.h index 47a45d305..c0d27307d 100644 --- a/Source/Tools/CommonTools/HarnessHelpers.h +++ b/Source/Tools/CommonTools/HarnessHelpers.h @@ -322,6 +322,7 @@ public: FEATURE_FSGSBASE = (1 << 22), FEATURE_EMMI = (1 << 23), FEATURE_AVX_VNNI = (1 << 24), + FEATURE_SERIALIZE = (1 << 25), }; bool Requires3DNow() const { @@ -399,6 +400,9 @@ public: bool RequiresAVXVNNI() const { return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_AVX_VNNI; } + bool RequiresSerialize() const { + return BaseConfig.OptionHostFeatures & HostFeatures::FEATURE_SERIALIZE; + } private: FEX_CONFIG_OPT(ConfigDumpGPRs, DUMPGPRS); @@ -609,6 +613,9 @@ public: bool RequiresAVXVNNI() const { return Config.RequiresAVXVNNI(); } + bool RequiresSerialize() const { + return Config.RequiresSerialize(); + } private: constexpr static uint64_t STACK_OFFSET = 0xc000'0000; diff --git a/Source/Tools/TestHarnessRunner/TestHarnessRunner.cpp b/Source/Tools/TestHarnessRunner/TestHarnessRunner.cpp index 94742a1b1..20ee43b0c 100644 --- a/Source/Tools/TestHarnessRunner/TestHarnessRunner.cpp +++ b/Source/Tools/TestHarnessRunner/TestHarnessRunner.cpp @@ -288,6 +288,7 @@ int main(int argc, char** argv, char** const envp) { const bool SupportsCLFLOPT = Feature.Feat_clflopt; const bool SupportsFSGSBase = Feature.Feat_fsgsbase; const bool SupportsAVXVNNI = Feature.Feat_avx_vnni; + const bool SupportsSerialize = Feature.Feat_serialize; TestUnsupported |= (!Supports3DNow && Loader.Requires3DNow()) || (!SupportsSSE4A && Loader.RequiresSSE4A()) || (!SupportsBMI1 && Loader.RequiresBMI1()) || @@ -297,6 +298,7 @@ int main(int argc, char** argv, char** const envp) { (!SupportsADX && Loader.RequiresADX()) || (!SupportsXSAVE && Loader.RequiresXSAVE()) || (!SupportsRDPID && Loader.RequiresRDPID()) || (!SupportsCLFLOPT && Loader.RequiresCLFLOPT()) || (!SupportsFSGSBase && Loader.RequiresFSGSBase()) || Loader.RequiresEMMI(); TestUnsupported |= !SupportsAVXVNNI && Loader.RequiresAVXVNNI(); + TestUnsupported |= !SupportsSerialize && Loader.RequiresSerialize(); #endif #ifdef _WIN32 diff --git a/unittests/ASM/Secondary/07_XX_05.asm b/unittests/ASM/Secondary/07_XX_05.asm index ccb2015ec..67410958c 100644 --- a/unittests/ASM/Secondary/07_XX_05.asm +++ b/unittests/ASM/Secondary/07_XX_05.asm @@ -2,7 +2,8 @@ { "RegData": { "RAX": "1" - } + }, + "HostFeatures": ["SERIALIZE"] } %endif