Renderer.zig (2110B) - Raw
1 const std = @import("std"); 2 const Allocator = std.mem.Allocator; 3 const assert = std.debug.assert; 4 const Interner = @import("../../Interner.zig"); 5 const Ir = @import("../../Ir.zig"); 6 const BaseRenderer = Ir.Renderer; 7 const zig = @import("zig"); 8 const abi = zig.arch.x86_64.abi; 9 const bits = zig.arch.x86_64.bits; 10 11 const Condition = bits.Condition; 12 const Immediate = bits.Immediate; 13 const Memory = bits.Memory; 14 const Register = bits.Register; 15 const RegisterLock = RegisterManager.RegisterLock; 16 const FrameIndex = bits.FrameIndex; 17 18 const RegisterManager = zig.RegisterManager(Renderer, Register, Ir.Ref, abi.allocatable_regs); 19 20 // Register classes 21 const RegisterBitSet = RegisterManager.RegisterBitSet; 22 const 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 40 const Renderer = @This(); 41 42 base: *BaseRenderer, 43 interner: *Interner, 44 45 register_manager: RegisterManager = .{}, 46 47 pub 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 62 fn renderFn(r: *Renderer, name: []const u8, decl: Ir.Decl) !void { 63 _ = decl; 64 return r.base.fail(name, "TODO implement lowering functions", .{}); 65 }