| author | |
| committer | |
| log | ad5533fdfb37a04f3fa938673dff931225457708 |
| tree | 3908e080ee1fd9fee22ab20a4e651f48eba5da87 |
| parent | 18a909f61d87d6b8e89147b7b46d8d0785b24b4d |
This will require further rework in the codegen so reverting for now.3 files changed, 25 insertions(+), 29 deletions(-)
src/arch/x86/bits.zig+7-8| ... | @@ -32,9 +32,11 @@ pub const Register = enum(u8) { | ... | @@ -32,9 +32,11 @@ pub const Register = enum(u8) { |
| 32 | /// Returns the index into `callee_preserved_regs`. | 32 | /// Returns the index into `callee_preserved_regs`. |
| 33 | pub fn allocIndex(self: Register) ?u4 { | 33 | pub fn allocIndex(self: Register) ?u4 { |
| 34 | return switch (self) { | 34 | return switch (self) { |
| 35 | .ebx, .bx, .bl => 0, | 35 | .eax, .ax, .al => 0, |
| 36 | .esi, .si => 1, | 36 | .ecx, .cx, .cl => 1, |
| 37 | .edi, .di => 2, | 37 | .edx, .dx, .dl => 2, |
| 38 | .esi, .si => 3, | ||
| 39 | .edi, .di => 4, | ||
| 38 | else => null, | 40 | else => null, |
| 39 | }; | 41 | }; |
| 40 | } | 42 | } |
| ... | @@ -72,11 +74,8 @@ pub const Register = enum(u8) { | ... | @@ -72,11 +74,8 @@ pub const Register = enum(u8) { |
| 72 | 74 | ||
| 73 | // zig fmt: on | 75 | // zig fmt: on |
| 74 | 76 | ||
| 75 | /// These registers need to be preserved (saved on the stack) and restored by the callee before getting clobbered | 77 | /// TODO this set is actually a set of caller-saved registers. |
| 76 | /// and when the callee returns. | 78 | pub const callee_preserved_regs = [_]Register{ .eax, .ecx, .edx, .esi, .edi }; |
| 77 | /// Note that .esp and .ebp also belong to this set, however, we never expect to use them | ||
| 78 | /// for anything else but stack offset tracking therefore we exclude them from this set. | ||
| 79 | pub const callee_preserved_regs = [_]Register{ .ebx, .esi, .edi }; | ||
| 80 | 79 | ||
| 81 | // TODO add these to Register enum and corresponding dwarfLocOp | 80 | // TODO add these to Register enum and corresponding dwarfLocOp |
| 82 | // // Return Address register. This is stored in `0(%esp, "")` and is not a physical register. | 81 | // // Return Address register. This is stored in `0(%esp, "")` and is not a physical register. |
src/arch/x86_64/bits.zig+9-12| ... | @@ -84,11 +84,13 @@ pub const Register = enum(u7) { | ... | @@ -84,11 +84,13 @@ pub const Register = enum(u7) { |
| 84 | /// Returns the index into `callee_preserved_regs`. | 84 | /// Returns the index into `callee_preserved_regs`. |
| 85 | pub fn allocIndex(self: Register) ?u4 { | 85 | pub fn allocIndex(self: Register) ?u4 { |
| 86 | return switch (self) { | 86 | return switch (self) { |
| 87 | .rbx, .ebx, .bx, .bl => 0, | 87 | .rcx, .ecx, .cx, .cl => 0, |
| 88 | .r12, .r12d, .r12w, .r12b => 1, | 88 | .rsi, .esi, .si => 1, |
| 89 | .r13, .r13d, .r13w, .r13b => 2, | 89 | .rdi, .edi, .di => 2, |
| 90 | .r14, .r14d, .r14w, .r14b => 3, | 90 | .r8, .r8d, .r8w, .r8b => 3, |
| 91 | .r15, .r15d, .r15w, .r15b => 4, | 91 | .r9, .r9d, .r9w, .r9b => 4, |
| 92 | .r10, .r10d, .r10w, .r10b => 5, | ||
| 93 | .r11, .r11d, .r11w, .r11b => 6, | ||
| 92 | else => null, | 94 | else => null, |
| 93 | }; | 95 | }; |
| 94 | } | 96 | } |
| ... | @@ -140,15 +142,10 @@ pub const Register = enum(u7) { | ... | @@ -140,15 +142,10 @@ pub const Register = enum(u7) { |
| 140 | 142 | ||
| 141 | // zig fmt: on | 143 | // zig fmt: on |
| 142 | 144 | ||
| 145 | /// TODO this set is actually a set of caller-saved registers. | ||
| 143 | /// These registers need to be preserved (saved on the stack) and restored by the callee before getting clobbered | 146 | /// These registers need to be preserved (saved on the stack) and restored by the callee before getting clobbered |
| 144 | /// and when the callee returns. | 147 | /// and when the callee returns. |
| 145 | /// Note that .rsp and .rbp also belong to this set, however, we never expect to use them | 148 | pub const callee_preserved_regs = [_]Register{ .rcx, .rsi, .rdi, .r8, .r9, .r10, .r11 }; |
| 146 | /// for anything else but stack offset tracking therefore we exclude them from this set. | ||
| 147 | pub const callee_preserved_regs = [_]Register{ .rbx, .r12, .r13, .r14, .r15 }; | ||
| 148 | /// These registers need to be preserved (saved on the stack) and restored by the caller before | ||
| 149 | /// the caller relinquishes control to a subroutine via call instruction (or similar). | ||
| 150 | /// In other words, these registers are free to use by the callee. | ||
| 151 | pub const caller_preserved_regs = [_]Register{ .rax, .rcx, .rdx, .rsi, .rdi, .r8, .r9, .r10, .r11 }; | ||
| 152 | pub const c_abi_int_param_regs = [_]Register{ .rdi, .rsi, .rdx, .rcx, .r8, .r9 }; | 149 | pub const c_abi_int_param_regs = [_]Register{ .rdi, .rsi, .rdx, .rcx, .r8, .r9 }; |
| 153 | pub const c_abi_int_return_regs = [_]Register{ .rax, .rdx }; | 150 | pub const c_abi_int_return_regs = [_]Register{ .rax, .rdx }; |
| 154 | 151 |
test/cases.zig+9-9| ... | @@ -12,15 +12,15 @@ const linux_x64 = std.zig.CrossTarget{ | ... | @@ -12,15 +12,15 @@ const linux_x64 = std.zig.CrossTarget{ |
| 12 | }; | 12 | }; |
| 13 | 13 | ||
| 14 | pub fn addCases(ctx: *TestContext) !void { | 14 | pub fn addCases(ctx: *TestContext) !void { |
| 15 | try @import("compile_errors.zig").addCases(ctx); | 15 | // try @import("compile_errors.zig").addCases(ctx); |
| 16 | try @import("stage2/cbe.zig").addCases(ctx); | 16 | // try @import("stage2/cbe.zig").addCases(ctx); |
| 17 | try @import("stage2/arm.zig").addCases(ctx); | 17 | // try @import("stage2/arm.zig").addCases(ctx); |
| 18 | try @import("stage2/aarch64.zig").addCases(ctx); | 18 | // try @import("stage2/aarch64.zig").addCases(ctx); |
| 19 | try @import("stage2/llvm.zig").addCases(ctx); | 19 | // try @import("stage2/llvm.zig").addCases(ctx); |
| 20 | try @import("stage2/wasm.zig").addCases(ctx); | 20 | // try @import("stage2/wasm.zig").addCases(ctx); |
| 21 | try @import("stage2/darwin.zig").addCases(ctx); | 21 | // try @import("stage2/darwin.zig").addCases(ctx); |
| 22 | try @import("stage2/riscv64.zig").addCases(ctx); | 22 | // try @import("stage2/riscv64.zig").addCases(ctx); |
| 23 | try @import("stage2/plan9.zig").addCases(ctx); | 23 | // try @import("stage2/plan9.zig").addCases(ctx); |
| 24 | 24 | ||
| 25 | { | 25 | { |
| 26 | var case = ctx.exe("hello world with updates", linux_x64); | 26 | var case = ctx.exe("hello world with updates", linux_x64); |