authorgravatar for jacoblevgw@gmail.comJacob G-W <jacoblevgw@gmail.com> 2021-11-12 18:10:13-05:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-11-19 09:38:36+01:00
logf950d763a160d7ee333dde75ff61c9ac6597c803
treee5f3b1dca3dbb9fda897f1807c1c1b0c39270e93
parent6cf8a49bb0e5a6df3154aa7c41602ef21057ce50

stage2 x86_64 codegen: don't count return registers as callee-preserved


2 files changed, 11 insertions(+), 12 deletions(-)

src/arch/x86_64/CodeGen.zig+2-2
...@@ -1902,10 +1902,10 @@ fn airCall(self: *Self, inst: Air.Inst.Index) !void {...@@ -1902,10 +1902,10 @@ fn airCall(self: *Self, inst: Air.Inst.Index) !void {
1902 try self.register_manager.getReg(reg, null);1902 try self.register_manager.getReg(reg, null);
1903 try self.genSetReg(arg_ty, reg, arg_mcv);1903 try self.genSetReg(arg_ty, reg, arg_mcv);
1904 },1904 },
1905 .stack_offset => {1905 .stack_offset => |off| {
1906 // Here we need to emit instructions like this:1906 // Here we need to emit instructions like this:
1907 // mov qword ptr [rsp + stack_offset], x1907 // mov qword ptr [rsp + stack_offset], x
1908 return self.fail("TODO implement calling with parameters in memory", .{});1908 try self.genSetStack(arg_ty, off, arg_mcv);
1909 },1909 },
1910 .ptr_stack_offset => {1910 .ptr_stack_offset => {
1911 return self.fail("TODO implement calling with MCValue.ptr_stack_offset arg", .{});1911 return self.fail("TODO implement calling with MCValue.ptr_stack_offset arg", .{});
src/arch/x86_64/bits.zig+9-10
...@@ -84,15 +84,13 @@ pub const Register = enum(u7) {...@@ -84,15 +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 .rax, .eax, .ax, .al => 0,87 .rcx, .ecx, .cx, .cl => 0,
88 .rcx, .ecx, .cx, .cl => 1,88 .rsi, .esi, .si => 1,
89 .rdx, .edx, .dx, .dl => 2,89 .rdi, .edi, .di => 2,
90 .rsi, .esi, .si => 3,90 .r8, .r8d, .r8w, .r8b => 3,
91 .rdi, .edi, .di => 4,91 .r9, .r9d, .r9w, .r9b => 4,
92 .r8, .r8d, .r8w, .r8b => 5,92 .r10, .r10d, .r10w, .r10b => 5,
93 .r9, .r9d, .r9w, .r9b => 6,93 .r11, .r11d, .r11w, .r11b => 6,
94 .r10, .r10d, .r10w, .r10b => 7,
95 .r11, .r11d, .r11w, .r11b => 8,
96 else => null,94 else => null,
97 };95 };
98 }96 }
...@@ -145,7 +143,8 @@ pub const Register = enum(u7) {...@@ -145,7 +143,8 @@ pub const Register = enum(u7) {
145// zig fmt: on143// zig fmt: on
146144
147/// These registers belong to the called function.145/// These registers belong to the called function.
148pub const callee_preserved_regs = [_]Register{ .rax, .rcx, .rdx, .rsi, .rdi, .r8, .r9, .r10, .r11 };146/// TODO should the return_regs be in this array?
147pub const callee_preserved_regs = [_]Register{ .rcx, .rsi, .rdi, .r8, .r9, .r10, .r11 };
149pub const c_abi_int_param_regs = [_]Register{ .rdi, .rsi, .rdx, .rcx, .r8, .r9 };148pub const c_abi_int_param_regs = [_]Register{ .rdi, .rsi, .rdx, .rcx, .r8, .r9 };
150pub const c_abi_int_return_regs = [_]Register{ .rax, .rdx };149pub const c_abi_int_return_regs = [_]Register{ .rax, .rdx };
151150