From 69e01a1a7f4a1b001a1f383ac02d619f2a717014 Mon Sep 17 00:00:00 2001 From: David Gonzalez Martin Date: Sat, 1 Jun 2024 11:07:25 -0600 Subject: [PATCH] Nested if --- bootstrap/compiler.zig | 29 +++++++++++++++++++++++----- retest/standalone/nested_if/main.nat | 18 +++++++++++++++++ 2 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 retest/standalone/nested_if/main.nat diff --git a/bootstrap/compiler.zig b/bootstrap/compiler.zig index 5afe753..24650ba 100644 --- a/bootstrap/compiler.zig +++ b/bootstrap/compiler.zig @@ -749,6 +749,10 @@ const Parser = struct{ compare_unsigned_greater_equal, compare_signed_greater, compare_signed_greater_equal, + compare_unsigned_less, + compare_unsigned_less_equal, + compare_signed_less, + compare_signed_less_equal, }; fn parse_expression(parser: *Parser, analyzer: *Analyzer, thread: *Thread, file: *File, ty: ?*Type, side: Side) *Value { @@ -778,10 +782,10 @@ const Parser = struct{ .none => { previous_value = current_value; }, - .compare_equal, .compare_unsigned_greater, .compare_unsigned_greater_equal, .compare_signed_greater, .compare_signed_greater_equal => { + .compare_equal, .compare_unsigned_greater, .compare_unsigned_greater_equal, .compare_signed_greater, .compare_signed_greater_equal, .compare_unsigned_less, .compare_unsigned_less_equal, .compare_signed_less, .compare_signed_less_equal => { switch (current_operation) { else => unreachable, - inline .compare_equal, .compare_unsigned_greater, .compare_unsigned_greater_equal, .compare_signed_greater, .compare_signed_greater_equal => |co| { + inline .compare_equal, .compare_unsigned_greater, .compare_unsigned_greater_equal, .compare_signed_greater, .compare_signed_greater_equal, .compare_unsigned_less, .compare_unsigned_less_equal, .compare_signed_less, .compare_signed_less_equal => |co| { const string = @tagName(co)["compare_".len..]; const comparison = @field(IntegerCompare.Id, string); const compare = thread.integer_compares.append(.{ @@ -965,8 +969,12 @@ const Parser = struct{ parser.skip_space(src); }, '<' => { - // TODO - current_operation = undefined; + const int_ty = it_ty orelse previous_value.get_type(); + const integer_type = int_ty.get_payload(.integer); + current_operation = switch (integer_type.signedness) { + .unsigned => .compare_unsigned_less, + .signed => .compare_signed_less, + }; parser.i += 1; switch (src[parser.i]) { @@ -982,7 +990,10 @@ const Parser = struct{ else => {}, } }, - else => unreachable, + '=' => { + unreachable; + }, + else => {}, } parser.skip_space(src); @@ -1604,6 +1615,10 @@ const IntegerCompare = struct { unsigned_greater_equal, signed_greater, signed_greater_equal, + unsigned_less, + unsigned_less_equal, + signed_less, + signed_less_equal, equal, not_equal, not_zero, @@ -2961,6 +2976,10 @@ fn worker_thread(thread_index: u32, cpu_count: *u32) void { .unsigned_greater => .ugt, .signed_greater_equal => .sge, .signed_greater => .sgt, + .unsigned_less_equal => .uge, + .unsigned_less => .ugt, + .signed_less_equal => .sge, + .signed_less => .sgt, }; const cmp = builder.createICmp(comparison, left, right, name, name.len); diff --git a/retest/standalone/nested_if/main.nat b/retest/standalone/nested_if/main.nat new file mode 100644 index 0000000..d4848a8 --- /dev/null +++ b/retest/standalone/nested_if/main.nat @@ -0,0 +1,18 @@ +fn foo (arg: s32) s32 { + if (arg > 1) { + if (arg < 5) { + return 6; + } else { + return 5; + } + } else { + return 0; + } +} + +fn[cc(.c)] main[export] () s32 { + >a = foo(5); + >b = foo(5); + return a - b; +} +