zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit d1244d3608361d416e9a2b58b58b67985650165c (tree)
parent 83a2665772578f6262afc858613023738a7d25ef
Author: gracefu <81774659+gracefuu@users.noreply.github.com>
Date:   Fri,  2 Apr 2021 22:57:36 +0800

stage2 wasm: codegen `sub` op

Diffstat:
Msrc/codegen/wasm.zig | 20++++++++++++++++++++
Mtest/stage2/wasm.zig | 20++++++++++++++++++++
2 files changed, 40 insertions(+), 0 deletions(-)

diff --git a/src/codegen/wasm.zig b/src/codegen/wasm.zig @@ -225,6 +225,7 @@ pub const Context = struct { .ret => self.genRet(inst.castTag(.ret).?), .retvoid => WValue.none, .store => self.genStore(inst.castTag(.store).?), + .sub => self.genSub(inst.castTag(.sub).?), .unreach => self.genUnreachable(inst.castTag(.unreach).?), else => self.fail(inst.src, "TODO: Implement wasm inst: {s}", .{inst.tag}), }; @@ -324,6 +325,25 @@ pub const Context = struct { return .none; } + fn genSub(self: *Context, inst: *Inst.BinOp) InnerError!WValue { + const lhs = self.resolveInst(inst.lhs); + const rhs = self.resolveInst(inst.rhs); + + try self.emitWValue(lhs); + try self.emitWValue(rhs); + + const opcode: wasm.Opcode = switch (inst.base.ty.tag()) { + .u32, .i32 => .i32_sub, + .u64, .i64 => .i64_sub, + .f32 => .f32_sub, + .f64 => .f64_sub, + else => return self.fail(inst.base.src, "TODO - Implement wasm genSub for type '{s}'", .{inst.base.ty.tag()}), + }; + + try self.code.append(wasm.opcode(opcode)); + return .none; + } + fn emitConstant(self: *Context, inst: *Inst.Constant) InnerError!void { const writer = self.code.writer(); switch (inst.base.ty.tag()) { diff --git a/test/stage2/wasm.zig b/test/stage2/wasm.zig @@ -121,6 +121,26 @@ pub fn addCases(ctx: *TestContext) !void { \\ return x + y; \\} , "35\n"); + + case.addCompareOutput( + \\export fn _start() u32 { + \\ var i: u32 = 20; + \\ i -= 5; + \\ return i; + \\} + , "15\n"); + + case.addCompareOutput( + \\export fn _start() u32 { + \\ var i: u32 = 5; + \\ i -= 3; + \\ var result: u32 = foo(i, 10); + \\ return result; + \\} + \\fn foo(x: u32, y: u32) u32 { + \\ return y - x; + \\} + , "8\n"); } {