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}