master
 1const std = @import("std");
 2const Allocator = std.mem.Allocator;
 3const assert = std.debug.assert;
 4const Interner = @import("../../Interner.zig");
 5const Ir = @import("../../Ir.zig");
 6const BaseRenderer = Ir.Renderer;
 7const zig = @import("zig");
 8const abi = zig.arch.x86_64.abi;
 9const bits = zig.arch.x86_64.bits;
10
11const Condition = bits.Condition;
12const Immediate = bits.Immediate;
13const Memory = bits.Memory;
14const Register = bits.Register;
15const RegisterLock = RegisterManager.RegisterLock;
16const FrameIndex = bits.FrameIndex;
17
18const RegisterManager = zig.RegisterManager(Renderer, Register, Ir.Ref, abi.allocatable_regs);
19
20// Register classes
21const RegisterBitSet = RegisterManager.RegisterBitSet;
22const RegisterClass = struct {
23    const gp: RegisterBitSet = blk: {
24        var set = RegisterBitSet.initEmpty();
25        for (abi.allocatable_regs, 0..) |reg, index| if (reg.class() == .general_purpose) set.set(index);
26        break :blk set;
27    };
28    const x87: RegisterBitSet = blk: {
29        var set = RegisterBitSet.initEmpty();
30        for (abi.allocatable_regs, 0..) |reg, index| if (reg.class() == .x87) set.set(index);
31        break :blk set;
32    };
33    const sse: RegisterBitSet = blk: {
34        var set = RegisterBitSet.initEmpty();
35        for (abi.allocatable_regs, 0..) |reg, index| if (reg.class() == .sse) set.set(index);
36        break :blk set;
37    };
38};
39
40const Renderer = @This();
41
42base: *BaseRenderer,
43interner: *Interner,
44
45register_manager: RegisterManager = .{},
46
47pub fn render(base: *BaseRenderer) !void {
48    var renderer: Renderer = .{
49        .base = base,
50        .interner = base.ir.interner,
51    };
52
53    for (renderer.base.ir.decls.keys(), renderer.base.ir.decls.values()) |name, decl| {
54        renderer.renderFn(name, decl) catch |e| switch (e) {
55            error.OutOfMemory => return e,
56            error.LowerFail => continue,
57        };
58    }
59    if (renderer.base.errors.entries.len != 0) return error.LowerFail;
60}
61
62fn renderFn(r: *Renderer, name: []const u8, decl: Ir.Decl) !void {
63    _ = decl;
64    return r.base.fail(name, "TODO implement lowering functions", .{});
65}