From 5043d0977166d1b428fad7eb44c27529d202c3a9 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Wed, 17 Jul 2024 15:28:30 -0400 Subject: [PATCH 1/4] json_ir_generator: use textwrap.dedent, f-string for size Signed-off-by: Alyssa Rosenzweig --- FEXCore/Scripts/json_ir_generator.py | 50 ++++++++++------------------ 1 file changed, 18 insertions(+), 32 deletions(-) diff --git a/FEXCore/Scripts/json_ir_generator.py b/FEXCore/Scripts/json_ir_generator.py index e666e2714..fa986d47e 100755 --- a/FEXCore/Scripts/json_ir_generator.py +++ b/FEXCore/Scripts/json_ir_generator.py @@ -2,6 +2,7 @@ import json import sys from dataclasses import dataclass, field +import textwrap def ExitError(msg): print(msg) @@ -377,42 +378,27 @@ def print_ir_sizes(): if op.Name == "Last": output_file.write("\t-1ULL,\n") else: - output_file.write("\tsizeof(IROp_{}),\n".format(op.Name)) + output_file.write(f"\tsizeof(IROp_{op.Name}),\n") - output_file.write("};\n\n") + output_file.write(textwrap.dedent(""" + }; - output_file.write("// Make sure our array maps directly to the IROps enum\n") - output_file.write("static_assert(IRSizes[IROps::OP_LAST] == -1ULL);\n\n") + // Make sure our array maps directly to the IROps enum + static_assert(IRSizes[IROps::OP_LAST] == -1ULL); - output_file.write("[[maybe_unused, nodiscard]] static size_t GetSize(IROps Op) { return IRSizes[Op]; }\n\n") + [[maybe_unused, nodiscard]] static size_t GetSize(IROps Op) { return IRSizes[Op]; } + [[nodiscard, gnu::const, gnu::visibility("default")]] std::string_view const& GetName(IROps Op); + [[nodiscard, gnu::const, gnu::visibility("default")]] uint8_t GetArgs(IROps Op); + [[nodiscard, gnu::const, gnu::visibility("default")]] uint8_t GetRAArgs(IROps Op); + [[nodiscard, gnu::const, gnu::visibility("default")]] FEXCore::IR::RegisterClassType GetRegClass(IROps Op); + [[nodiscard, gnu::const, gnu::visibility("default")]] bool HasSideEffects(IROps Op); + [[nodiscard, gnu::const, gnu::visibility("default")]] bool ImplicitFlagClobber(IROps Op); + [[nodiscard, gnu::const, gnu::visibility("default")]] bool GetHasDest(IROps Op); + [[nodiscard, gnu::const, gnu::visibility("default")]] int8_t TiedSource(IROps Op); - output_file.write( - '[[nodiscard, gnu::const, gnu::visibility("default")]] std::string_view const& GetName(IROps Op);\n' - ) - output_file.write( - '[[nodiscard, gnu::const, gnu::visibility("default")]] uint8_t GetArgs(IROps Op);\n' - ) - output_file.write( - '[[nodiscard, gnu::const, gnu::visibility("default")]] uint8_t GetRAArgs(IROps Op);\n' - ) - output_file.write( - '[[nodiscard, gnu::const, gnu::visibility("default")]] FEXCore::IR::RegisterClassType GetRegClass(IROps Op);\n\n' - ) - output_file.write( - '[[nodiscard, gnu::const, gnu::visibility("default")]] bool HasSideEffects(IROps Op);\n' - ) - output_file.write( - '[[nodiscard, gnu::const, gnu::visibility("default")]] bool ImplicitFlagClobber(IROps Op);\n' - ) - output_file.write( - '[[nodiscard, gnu::const, gnu::visibility("default")]] bool GetHasDest(IROps Op);\n' - ) - output_file.write( - '[[nodiscard, gnu::const, gnu::visibility("default")]] int8_t TiedSource(IROps Op);\n' - ) - - output_file.write("#undef IROP_SIZES\n") - output_file.write("#endif\n\n") + #undef IROP_SIZES + #endif + """)) def print_ir_reg_classes(): output_file.write("#ifdef IROP_REG_CLASSES_IMPL\n") From bdb890a8b05923f6c7c6cc6e113eed4d43f84c7b Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Wed, 17 Jul 2024 15:31:14 -0400 Subject: [PATCH 2/4] json_ir_generator: rename X87 -> LoweredX87 to reflect its actual meaning Signed-off-by: Alyssa Rosenzweig --- FEXCore/Scripts/json_ir_generator.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/FEXCore/Scripts/json_ir_generator.py b/FEXCore/Scripts/json_ir_generator.py index fa986d47e..e8c73f496 100755 --- a/FEXCore/Scripts/json_ir_generator.py +++ b/FEXCore/Scripts/json_ir_generator.py @@ -54,7 +54,7 @@ class OpDefinition: SSAArgNum: int NonSSAArgNum: int DynamicDispatch: bool - X87: bool + LoweredX87: bool JITDispatch: bool JITDispatchOverride: str TiedSource: int @@ -78,7 +78,7 @@ class OpDefinition: self.SSAArgNum = 0 self.NonSSAArgNum = 0 self.DynamicDispatch = False - self.X87 = False + self.LoweredX87 = False self.JITDispatch = True self.JITDispatchOverride = None self.TiedSource = -1 @@ -254,7 +254,7 @@ def parse_ops(ops): OpDef.JITDispatchOverride = op_val["JITDispatchOverride"] if "X87" in op_val: - OpDef.X87 = op_val["X87"] + OpDef.LoweredX87 = op_val["X87"] # X87 implies !JITDispatch assert("JITDispatch" not in op_val) @@ -686,7 +686,7 @@ def print_ir_allocator_helpers(): # We gather the "has x87?" flag as we go. This saves the user from # having to keep track of whether they emitted any x87. - if op.X87: + if op.LoweredX87: output_file.write("\t\tRecordX87Use();\n") output_file.write("\t\tauto Op = AllocateOp();\n".format(op.Name, op.Name.upper())) From 9fd5c736339c120d57132718b21c4209d77aa53c Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Wed, 17 Jul 2024 15:31:46 -0400 Subject: [PATCH 3/4] json_ir_generator: generate IsLoweredX87 helper X87 pass will use this query. Signed-off-by: Alyssa Rosenzweig --- FEXCore/Scripts/json_ir_generator.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/FEXCore/Scripts/json_ir_generator.py b/FEXCore/Scripts/json_ir_generator.py index e8c73f496..22e771f31 100755 --- a/FEXCore/Scripts/json_ir_generator.py +++ b/FEXCore/Scripts/json_ir_generator.py @@ -394,6 +394,7 @@ def print_ir_sizes(): [[nodiscard, gnu::const, gnu::visibility("default")]] bool HasSideEffects(IROps Op); [[nodiscard, gnu::const, gnu::visibility("default")]] bool ImplicitFlagClobber(IROps Op); [[nodiscard, gnu::const, gnu::visibility("default")]] bool GetHasDest(IROps Op); + [[nodiscard, gnu::const, gnu::visibility("default")]] bool LoweredX87(IROps Op); [[nodiscard, gnu::const, gnu::visibility("default")]] int8_t TiedSource(IROps Op); #undef IROP_SIZES @@ -491,6 +492,7 @@ def print_ir_hassideeffects(): for array, prop, T in [ ("SideEffects", "HasSideEffects", "bool"), ("ImplicitFlagClobbers", "ImplicitFlagClobber", "bool"), + ("IsLoweredX87", "LoweredX87", "bool"), ("TiedSources", "TiedSource", "int8_t"), ]: output_file.write( From dedec83881d11f722e93350aa1f902de8d1f7fe0 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Wed, 17 Jul 2024 15:32:51 -0400 Subject: [PATCH 4/4] json_ir_generator: autoderive array names these are purely internal. Signed-off-by: Alyssa Rosenzweig --- FEXCore/Scripts/json_ir_generator.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/FEXCore/Scripts/json_ir_generator.py b/FEXCore/Scripts/json_ir_generator.py index 22e771f31..73a220ae5 100755 --- a/FEXCore/Scripts/json_ir_generator.py +++ b/FEXCore/Scripts/json_ir_generator.py @@ -489,14 +489,14 @@ def print_ir_getraargs(): def print_ir_hassideeffects(): output_file.write("#ifdef IROP_HASSIDEEFFECTS_IMPL\n") - for array, prop, T in [ - ("SideEffects", "HasSideEffects", "bool"), - ("ImplicitFlagClobbers", "ImplicitFlagClobber", "bool"), - ("IsLoweredX87", "LoweredX87", "bool"), - ("TiedSources", "TiedSource", "int8_t"), + for prop, T in [ + ("HasSideEffects", "bool"), + ("ImplicitFlagClobber", "bool"), + ("LoweredX87", "bool"), + ("TiedSource", "int8_t"), ]: output_file.write( - f"constexpr std::array<{'uint8_t' if T == 'bool' else T}, OP_LAST + 1> {array} = {{\n" + f"constexpr std::array<{'uint8_t' if T == 'bool' else T}, OP_LAST + 1> {prop}_ = {{\n" ) for op in IROps: if T == "bool": @@ -509,7 +509,7 @@ def print_ir_hassideeffects(): output_file.write("};\n\n") output_file.write(f"{T} {prop}(IROps Op) {{\n") - output_file.write(f" return {array}[Op];\n") + output_file.write(f" return {prop}_[Op];\n") output_file.write("}\n") output_file.write("#undef IROP_HASSIDEEFFECTS_IMPL\n")