zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

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 }