aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Lexer.zig6
-rw-r--r--src/codegen.zig4
-rw-r--r--src/compile.zig2
-rw-r--r--src/parse.zig3
4 files changed, 14 insertions, 1 deletions
diff --git a/src/Lexer.zig b/src/Lexer.zig
index 19e9cd4..64457bf 100644
--- a/src/Lexer.zig
+++ b/src/Lexer.zig
@@ -13,6 +13,7 @@ pub const Token = struct {
plus,
minus,
equal,
+ equal_equal,
colon,
invalid,
eof,
@@ -85,7 +86,10 @@ fn getNext(self: *Self) Token {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9' => self.integerLiteral(),
'+' => self.create(.plus),
'-' => self.create(.minus),
- '=' => self.create(.equal),
+ '=' => if (self.eatIfEqual('='))
+ self.create(.equal_equal)
+ else
+ self.create(.equal),
':' => self.create(.colon),
',' => self.create(.comma),
'<' => if (self.eatIfEqual('='))
diff --git a/src/codegen.zig b/src/codegen.zig
index 0dbf35e..bf84412 100644
--- a/src/codegen.zig
+++ b/src/codegen.zig
@@ -663,6 +663,10 @@ const ProcedureContext = struct {
try self.emit(.sltu(reg, r, l));
try self.emit(.xori(reg, reg, 1));
},
+ .equals => {
+ try self.emit(.xor(reg, lhs, rhs));
+ try self.emit(.sltiu(reg, reg, 1));
+ },
}
}
diff --git a/src/compile.zig b/src/compile.zig
index ded8a45..8c734c7 100644
--- a/src/compile.zig
+++ b/src/compile.zig
@@ -164,6 +164,7 @@ pub const Instr = struct {
greater_than,
less_or_equal,
greater_or_equal,
+ equals,
};
pub fn sources(self: BinOp) Sources {
@@ -516,6 +517,7 @@ const ProcedureContext = struct {
.right_angle => .greater_than,
.left_angle_equal => .less_or_equal,
.right_angle_equal => .greater_or_equal,
+ .equal_equal => .equals,
},
},
},
diff --git a/src/parse.zig b/src/parse.zig
index e22397f..3ecb93b 100644
--- a/src/parse.zig
+++ b/src/parse.zig
@@ -122,6 +122,7 @@ pub const Expr = struct {
right_angle,
left_angle_equal,
right_angle_equal,
+ equal_equal,
pub fn format(self: Op, comptime _: []const u8, _: std.fmt.FormatOptions, writer: anytype) !void {
try writer.writeAll(switch (self) {
@@ -131,6 +132,7 @@ pub const Expr = struct {
.right_angle => ">",
.left_angle_equal => "<=",
.right_angle_equal => ">=",
+ .equal_equal => "==",
});
}
};
@@ -298,6 +300,7 @@ fn parseComparisons(allocator: Allocator, lexer: *Lexer) ParseError!*Expr {
.right_angle => .right_angle,
.left_angle_equal => .left_angle_equal,
.right_angle_equal => .right_angle_equal,
+ .equal_equal => .equal_equal,
else => return lhs,
};
_ = lexer.next();