summaryrefslogtreecommitdiffstats
path: root/Tools/cases_generator/stack.py
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/cases_generator/stack.py')
-rw-r--r--Tools/cases_generator/stack.py31
1 files changed, 29 insertions, 2 deletions
diff --git a/Tools/cases_generator/stack.py b/Tools/cases_generator/stack.py
index 4e9a312..5121837 100644
--- a/Tools/cases_generator/stack.py
+++ b/Tools/cases_generator/stack.py
@@ -24,7 +24,17 @@ def maybe_parenthesize(sym: str) -> str:
def var_size(var: StackItem) -> str:
- if var.size:
+ if var.condition:
+ # Special case simplifications
+ if var.condition == "0":
+ return "0"
+ elif var.condition == "1":
+ return var.get_size()
+ elif var.condition == "oparg & 1" and not var.size:
+ return f"({var.condition})"
+ else:
+ return f"(({var.condition}) ? {var.get_size()} : 0)"
+ elif var.size:
return var.size
else:
return "1"
@@ -80,6 +90,10 @@ class Local:
def name(self) -> str:
return self.item.name
+ @property
+ def condition(self) -> str | None:
+ return self.item.condition
+
def is_array(self) -> bool:
return self.item.is_array()
@@ -260,7 +274,16 @@ class Stack:
self.defined.add(var.name)
cast = f"({var.type})" if (not indirect and var.type) else ""
bits = ".bits" if cast and self.extract_bits else ""
- assign = f"{var.name} = {cast}{indirect}stack_pointer[{self.base_offset.to_c()}]{bits};\n"
+ assign = f"{var.name} = {cast}{indirect}stack_pointer[{self.base_offset.to_c()}]{bits};"
+ if var.condition:
+ if var.condition == "1":
+ assign = f"{assign}\n"
+ elif var.condition == "0":
+ return "", Local.unused(var)
+ else:
+ assign = f"if ({var.condition}) {{ {assign} }}\n"
+ else:
+ assign = f"{assign}\n"
return assign, Local.from_memory(var)
def push(self, var: Local) -> None:
@@ -280,6 +303,10 @@ class Stack:
) -> None:
cast = f"({cast_type})" if var.type else ""
bits = ".bits" if cast and extract_bits else ""
+ if var.condition == "0":
+ return
+ if var.condition and var.condition != "1":
+ out.emit(f"if ({var.condition}) ")
out.emit(f"stack_pointer[{base_offset.to_c()}]{bits} = {cast}{var.name};\n")
def _adjust_stack_pointer(self, out: CWriter, number: str) -> None: