summaryrefslogtreecommitdiffstats
path: root/Tools/cases_generator/generate_cases.py
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/cases_generator/generate_cases.py')
-rw-r--r--Tools/cases_generator/generate_cases.py14
1 files changed, 12 insertions, 2 deletions
diff --git a/Tools/cases_generator/generate_cases.py b/Tools/cases_generator/generate_cases.py
index 608df6b..4bd99b7 100644
--- a/Tools/cases_generator/generate_cases.py
+++ b/Tools/cases_generator/generate_cases.py
@@ -168,9 +168,14 @@ class Instruction:
break
self.unmoved_names = frozenset(unmoved_names)
if self.register:
- fmt = "IBBB"
+ num_regs = len(self.input_effects) + len(self.output_effects)
+ num_dummies = (num_regs // 2) * 2 + 1 - num_regs
+ fmt = "I" + "B"*num_regs + "X"*num_dummies
else:
- fmt = "IB"
+ if variable_used(inst.block, "oparg"):
+ fmt = "IB"
+ else:
+ fmt = "IX"
cache = "C"
for ce in self.cache_effects:
for _ in range(ce.size):
@@ -894,6 +899,11 @@ def always_exits(lines: list[str]) -> bool:
)
+def variable_used(block: parser.Block, name: str) -> bool:
+ """Determine whether a variable with a given name is used in a block."""
+ return any(token.kind == "IDENTIFIER" and token.text == name for token in block.tokens)
+
+
def main():
"""Parse command line, parse input, analyze, write output."""
args = arg_parser.parse_args() # Prints message and sys.exit(2) on error