aboutsummaryrefslogtreecommitdiff
path: root/crowbar_reference_compiler/ssagen.py
diff options
context:
space:
mode:
Diffstat (limited to 'crowbar_reference_compiler/ssagen.py')
-rw-r--r--crowbar_reference_compiler/ssagen.py23
1 files changed, 22 insertions, 1 deletions
diff --git a/crowbar_reference_compiler/ssagen.py b/crowbar_reference_compiler/ssagen.py
index 5212440..c71ddc4 100644
--- a/crowbar_reference_compiler/ssagen.py
+++ b/crowbar_reference_compiler/ssagen.py
@@ -7,7 +7,8 @@ from .ast import ImplementationFile, FunctionDefinition, ExpressionStatement, Fu
VariableExpression, ConstantExpression, ReturnStatement, BasicType, IfStatement, ComparisonExpression, \
AddExpression, StructPointerElementExpression, Declaration, PointerType, StructDeclaration, VariableDefinition, \
MultiplyExpression, LogicalNotExpression, DirectAssignment, UpdateAssignment, SizeofExpression, Expression, \
- ConstType, ArrayIndexExpression, ArrayType, NegativeExpression, SubtractExpression, AddressOfExpression
+ ConstType, ArrayIndexExpression, ArrayType, NegativeExpression, SubtractExpression, AddressOfExpression, \
+ WhileStatement
@dataclass
@@ -182,6 +183,26 @@ def _(target: IfStatement, context: CompileContext) -> SsaResult:
@compile_to_ssa.register
+def _(target: WhileStatement, context: CompileContext) -> SsaResult:
+ start_label = context.next_label
+ context.next_label += 1
+ result = SsaResult([], [f"@l{start_label}"])
+ body_label = context.next_label
+ context.next_label += 1
+ end_label = context.next_label
+ context.next_label += 1
+ result += compile_to_ssa(target.condition, context)
+ condition_dest = context.next_temp - 1
+ result.code.append(f"jnz %t{condition_dest}, @l{body_label}, @l{end_label}")
+ result.code.append(f"@l{body_label}")
+ for statement in target.body:
+ result += compile_to_ssa(statement, context)
+ result.code.append(f"jmp @l{start_label}")
+ result.code.append(f"@l{end_label}")
+ return result
+
+
+@compile_to_ssa.register
def _(target: ComparisonExpression, context: CompileContext) -> SsaResult:
result = compile_to_ssa(target.value1, context)
value1_dest = context.next_temp - 1