diff options
-rw-r--r-- | src/Lexer.zig | 6 | ||||
-rw-r--r-- | src/codegen.zig | 4 | ||||
-rw-r--r-- | src/compile.zig | 2 | ||||
-rw-r--r-- | src/parse.zig | 3 |
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(); |