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 }