From 869fc06c57bca38f1af16f54453a9468603b22a0 Mon Sep 17 00:00:00 2001 From: gracefu <81774659+gracefuu@users.noreply.github.com> Date: Fri, 2 Apr 2021 22:57:44 +0800 Subject: [PATCH] stage2 wasm: codegen `mul` op --- src/codegen/wasm.zig | 20 ++++++++++++++++++++ test/stage2/wasm.zig | 12 ++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/codegen/wasm.zig b/src/codegen/wasm.zig index 2d69dc6bba9de397cf474ceb61e5d04008fad36c..e720872f0e9dd9b7c1eca2bebb1f77fdf9ded1f8 100644 --- a/src/codegen/wasm.zig +++ b/src/codegen/wasm.zig @@ -221,6 +221,7 @@ pub const Context = struct { .dbg_stmt => WValue.none, .load => self.genLoad(inst.castTag(.load).?), .loop => self.genLoop(inst.castTag(.loop).?), + .mul => self.genMul(inst.castTag(.mul).?), .not => self.genNot(inst.castTag(.not).?), .ret => self.genRet(inst.castTag(.ret).?), .retvoid => WValue.none, @@ -344,6 +345,25 @@ pub const Context = struct { return .none; } + fn genMul(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_mul, + .u64, .i64 => .i64_mul, + .f32 => .f32_mul, + .f64 => .f64_mul, + else => return self.fail(inst.base.src, "TODO - Implement wasm genMul 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 index d49598c8556b70819ee3b2ba993d980e70bc2007..b585ddc56bf5876061498461de1c0d24ffb3944c 100644 --- a/test/stage2/wasm.zig +++ b/test/stage2/wasm.zig @@ -141,6 +141,18 @@ pub fn addCases(ctx: *TestContext) !void { \\ return y - x; \\} , "8\n"); + + case.addCompareOutput( + \\export fn _start() u32 { + \\ var i: u32 = 5; + \\ i *= 7; + \\ var result: u32 = foo(i, 10); + \\ return result; + \\} + \\fn foo(x: u32, y: u32) u32 { + \\ return x * y; + \\} + , "350\n"); } { -- 2.54.0