authorgravatar for 81774659+gracefuu@users.noreply.github.comgracefu <81774659+gracefuu@users.noreply.github.com> 2021-04-02 22:57:36+08:00
committergravatar for 81774659+gracefuu@users.noreply.github.comgracefu <81774659+gracefuu@users.noreply.github.com> 2021-04-05 14:37:04+08:00
logd1244d3608361d416e9a2b58b58b67985650165c
tree36eb6ce2633fb47b5b6e0d32cd820e2a5504c5f8
parent83a2665772578f6262afc858613023738a7d25ef
signature Commit is signed but in an unrecognized format.

stage2 wasm: codegen `sub` op


2 files changed, 40 insertions(+), 0 deletions(-)

src/codegen/wasm.zig+20
......@@ -225,6 +225,7 @@ pub const Context = struct {
225225 .ret => self.genRet(inst.castTag(.ret).?),
226226 .retvoid => WValue.none,
227227 .store => self.genStore(inst.castTag(.store).?),
228 .sub => self.genSub(inst.castTag(.sub).?),
228229 .unreach => self.genUnreachable(inst.castTag(.unreach).?),
229230 else => self.fail(inst.src, "TODO: Implement wasm inst: {s}", .{inst.tag}),
230231 };
......@@ -324,6 +325,25 @@ pub const Context = struct {
324325 return .none;
325326 }
326327
328 fn genSub(self: *Context, inst: *Inst.BinOp) InnerError!WValue {
329 const lhs = self.resolveInst(inst.lhs);
330 const rhs = self.resolveInst(inst.rhs);
331
332 try self.emitWValue(lhs);
333 try self.emitWValue(rhs);
334
335 const opcode: wasm.Opcode = switch (inst.base.ty.tag()) {
336 .u32, .i32 => .i32_sub,
337 .u64, .i64 => .i64_sub,
338 .f32 => .f32_sub,
339 .f64 => .f64_sub,
340 else => return self.fail(inst.base.src, "TODO - Implement wasm genSub for type '{s}'", .{inst.base.ty.tag()}),
341 };
342
343 try self.code.append(wasm.opcode(opcode));
344 return .none;
345 }
346
327347 fn emitConstant(self: *Context, inst: *Inst.Constant) InnerError!void {
328348 const writer = self.code.writer();
329349 switch (inst.base.ty.tag()) {
test/stage2/wasm.zig+20
......@@ -121,6 +121,26 @@ pub fn addCases(ctx: *TestContext) !void {
121121 \\ return x + y;
122122 \\}
123123 , "35\n");
124
125 case.addCompareOutput(
126 \\export fn _start() u32 {
127 \\ var i: u32 = 20;
128 \\ i -= 5;
129 \\ return i;
130 \\}
131 , "15\n");
132
133 case.addCompareOutput(
134 \\export fn _start() u32 {
135 \\ var i: u32 = 5;
136 \\ i -= 3;
137 \\ var result: u32 = foo(i, 10);
138 \\ return result;
139 \\}
140 \\fn foo(x: u32, y: u32) u32 {
141 \\ return y - x;
142 \\}
143 , "8\n");
124144 }
125145
126146 {