summaryrefslogtreecommitdiff
path: root/src/codegen.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/codegen.zig')
-rw-r--r--src/codegen.zig28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/codegen.zig b/src/codegen.zig
index 49a07fe..ef65cf6 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -190,6 +190,32 @@ pub const Generator = struct {
}
}
+ fn genWhile(self: *Generator, stmt: parse.NodeStmt) CodegenError!void {
+ const whilekind = stmt.kind.whileStmt;
+ const block = whilekind.body;
+ const expr = whilekind.expr;
+
+ const condition = try self.genExpr(expr);
+ const func = self.currentFunc.?;
+
+ const then = core.LLVMAppendBasicBlock(func, "then");
+ const elsebb = core.LLVMAppendBasicBlock(func, "elsebb");
+ const cont = core.LLVMAppendBasicBlock(func, "continue");
+
+ _ = core.LLVMBuildCondBr(self.builder, condition, then, elsebb);
+
+ _ = core.LLVMPositionBuilderAtEnd(self.builder, then);
+ try self.genStmt(block.*);
+ const newcondition = try self.genExpr(expr);
+ _ = core.LLVMBuildCondBr(self.builder, newcondition, then, elsebb);
+ _ = core.LLVMBuildBr(self.builder, cont);
+
+ _ = core.LLVMPositionBuilderAtEnd(self.builder, elsebb);
+ _ = core.LLVMBuildBr(self.builder, cont);
+
+ _ = core.LLVMPositionBuilderAtEnd(self.builder, cont);
+ }
+
fn genIf(self: *Generator, stmt: parse.NodeStmt) CodegenError!void {
const ifkind = stmt.kind.ifstmt;
const block = ifkind.body;
@@ -223,6 +249,7 @@ pub const Generator = struct {
.defVar => self.genVar(stmt),
.assignVar => self.genAssign(stmt),
.ifstmt => self.genIf(stmt),
+ .whileStmt => self.genWhile(stmt),
.block => |blk| self.genBlock(blk),
.expr => |expression| {
_ = try self.genExpr(expression);
@@ -270,6 +297,7 @@ pub const Generator = struct {
.star => core.LLVMBuildMul(self.builder, lhs, rhs, "mul"),
.slash => core.LLVMBuildSDiv(self.builder, lhs, rhs, "div"),
.eqleql => core.LLVMBuildICmp(self.builder, types.LLVMIntPredicate.LLVMIntEQ, lhs, rhs, "eql"),
+ .lessthan => core.LLVMBuildICmp(self.builder, types.LLVMIntPredicate.LLVMIntSLT, lhs, rhs, "slt"),
else => return error.Unimplemented,
};
},