lib/choir/src/backends/wasm/emission/function/instruction/call.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const wasm = @import("../../../root.zig");
2 const ir = @import("../../../../../core/root.zig");
3 const dialects = @import("../../../../../dialects/root.zig");
4 const emission = @import("../../root.zig");
5 const instruction = @import("root.zig");
6
7 const FuncDialect = dialects.FuncDialect;
8
9 pub fn write(
10 comptime Out: type,
11 writer: *instruction.Writer(Out),
12 operation: *ir.Operation,
13 ) emission.Error!void {
14 const call = FuncDialect.CallOp{ .op = operation };
15 const callee = call.getCallee() orelse return error.CodeGenFailed;
16 const function_index = writer.plan.functionIndex(callee) orelse
17 return error.FunctionNotFound;
18 for (call.getOperands()) |operand| try writer.writeValue(operand);
19 try writer.out.writeByte(0x10);
20 try wasm.binary.writeUleb(writer.out, function_index);
21 var index = call.getNumResults();
22 while (index > 0) {
23 index -= 1;
24 const result = call.getResult(index) orelse return error.CodeGenFailed;
25 try writer.writeLocalSet(try writer.localFor(result));
26 }
27 }