diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2022-05-19 15:34:13 +0200 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2022-05-19 19:39:34 +0200 |
| commit | 283f40e4e9c44986353ba8abcc760684e9adf6cc (patch) | |
| tree | 1c46fba4df6ea88b7d375b26c54058cc088aa74f /src/arch | |
| parent | 080d138b9d06402a8fbb70b4addc90751c6b798e (diff) | |
| download | zig-283f40e4e9c44986353ba8abcc760684e9adf6cc.tar.gz zig-283f40e4e9c44986353ba8abcc760684e9adf6cc.zip | |
x64: use StaticBitSet instead of an integer internally in RegisterManager
Diffstat (limited to 'src/arch')
| -rw-r--r-- | src/arch/x86_64/CodeGen.zig | 11 | ||||
| -rw-r--r-- | src/arch/x86_64/abi.zig | 35 |
2 files changed, 31 insertions, 15 deletions
diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig index 0cae799e02..3109470620 100644 --- a/src/arch/x86_64/CodeGen.zig +++ b/src/arch/x86_64/CodeGen.zig @@ -21,7 +21,6 @@ const Emit = @import("Emit.zig"); const Liveness = @import("../../Liveness.zig"); const Mir = @import("Mir.zig"); const Module = @import("../../Module.zig"); -const RegisterManagerFn = @import("../../register_manager.zig").RegisterManager; const Target = std.Target; const Type = @import("../../type.zig").Type; const TypedValue = @import("../../TypedValue.zig"); @@ -32,15 +31,15 @@ const abi = @import("abi.zig"); const callee_preserved_regs = abi.callee_preserved_regs; const caller_preserved_regs = abi.caller_preserved_regs; -const allocatable_registers = abi.allocatable_registers; const c_abi_int_param_regs = abi.c_abi_int_param_regs; const c_abi_int_return_regs = abi.c_abi_int_return_regs; -const RegisterManager = RegisterManagerFn(Self, Register, &allocatable_registers); + +const RegisterManager = abi.RegisterManager; const RegisterLock = RegisterManager.RegisterLock; const Register = bits.Register; -const RegisterClass = abi.RegisterClass; -const gp = RegisterClass.gp; -const avx = RegisterClass.avx; + +const gp = abi.RegisterClass.gp; +const avx = abi.RegisterClass.avx; const InnerError = error{ OutOfMemory, diff --git a/src/arch/x86_64/abi.zig b/src/arch/x86_64/abi.zig index 046948ff68..bf85f002d1 100644 --- a/src/arch/x86_64/abi.zig +++ b/src/arch/x86_64/abi.zig @@ -3,6 +3,7 @@ const Type = @import("../../type.zig").Type; const Target = std.Target; const assert = std.debug.assert; const Register = @import("bits.zig").Register; +const RegisterManagerFn = @import("../../register_manager.zig").RegisterManager; pub const Class = enum { integer, sse, sseup, x87, x87up, complex_x87, memory, none }; @@ -378,18 +379,34 @@ pub const callee_preserved_regs = [_]Register{ .rbx, .r12, .r13, .r14, .r15 }; /// the caller relinquishes control to a subroutine via call instruction (or similar). /// In other words, these registers are free to use by the callee. pub const caller_preserved_regs = [_]Register{ .rax, .rcx, .rdx, .rsi, .rdi, .r8, .r9, .r10, .r11 }; -pub const avx_regs = [_]Register{ - .ymm0, .ymm1, .ymm2, .ymm3, .ymm4, .ymm5, .ymm6, .ymm7, - .ymm8, .ymm9, .ymm10, .ymm11, .ymm12, .ymm13, .ymm14, .ymm15, -}; -pub const allocatable_registers = callee_preserved_regs ++ caller_preserved_regs ++ avx_regs; pub const c_abi_int_param_regs = [_]Register{ .rdi, .rsi, .rdx, .rcx, .r8, .r9 }; pub const c_abi_int_return_regs = [_]Register{ .rax, .rdx }; -// Masks for register manager -const FreeRegInt = std.meta.Int(.unsigned, allocatable_registers.len); +const avx_regs = [_]Register{ + .ymm0, .ymm1, .ymm2, .ymm3, .ymm4, .ymm5, .ymm6, .ymm7, + .ymm8, .ymm9, .ymm10, .ymm11, .ymm12, .ymm13, .ymm14, .ymm15, +}; +const allocatable_registers = callee_preserved_regs ++ caller_preserved_regs ++ avx_regs; +pub const RegisterManager = RegisterManagerFn(@import("CodeGen.zig"), Register, &allocatable_registers); + +// Register classes +const RegisterBitSet = RegisterManager.RegisterBitSet; pub const RegisterClass = struct { - pub const gp: FreeRegInt = 0x3fff; - pub const avx: FreeRegInt = 0x3fff_c000; + pub const gp: RegisterBitSet = blk: { + var set = RegisterBitSet.initEmpty(); + set.setRangeValue(.{ + .start = 0, + .end = caller_preserved_regs.len + callee_preserved_regs.len, + }, true); + break :blk set; + }; + pub const avx: RegisterBitSet = blk: { + var set = RegisterBitSet.initEmpty(); + set.setRangeValue(.{ + .start = caller_preserved_regs.len + callee_preserved_regs.len, + .end = allocatable_registers.len, + }, true); + break :blk set; + }; }; |
