aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2022-03-02 14:53:02 +0100
committerJakub Konka <kubkon@jakubkonka.com>2022-03-02 14:53:02 +0100
commitc9d1db7e8eda6374bfc5ba51097e24d93ab91ddb (patch)
tree939a84bc006c6bbf24f89c050b95a3f577dc1b78 /src
parent350bf9db131dd5573da0d06d38e40746c99a8a34 (diff)
downloadzig-c9d1db7e8eda6374bfc5ba51097e24d93ab91ddb.tar.gz
zig-c9d1db7e8eda6374bfc5ba51097e24d93ab91ddb.zip
x64: fix incorrect calc of rdi spill stack loc for backpatching
Diffstat (limited to 'src')
-rw-r--r--src/arch/x86_64/CodeGen.zig7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig
index 8efb1042ef..da98c1c901 100644
--- a/src/arch/x86_64/CodeGen.zig
+++ b/src/arch/x86_64/CodeGen.zig
@@ -472,10 +472,14 @@ fn gen(self: *Self) InnerError!void {
.regs = 0,
.disp = mem.alignForwardGeneric(u32, self.next_stack_offset, 8),
};
+ var disp = data.disp + 8;
inline for (callee_preserved_regs) |reg, i| {
if (self.register_manager.isRegAllocated(reg)) {
if (reg.to64() == .rdi) {
for (self.ret_backpatches.items) |inst| {
+ log.debug(".rdi was spilled, backpatching with mov from stack at offset {}", .{
+ -@intCast(i32, disp),
+ });
const ops = Mir.Ops.decode(self.mir_instructions.items(.ops)[inst]);
self.mir_instructions.set(inst, Mir.Inst{
.tag = .mov,
@@ -484,12 +488,13 @@ fn gen(self: *Self) InnerError!void {
.reg2 = .rbp,
.flags = 0b01,
}).encode(),
- .data = .{ .imm = @bitCast(u32, -@intCast(i32, self.max_end_stack + 8)) },
+ .data = .{ .imm = @bitCast(u32, -@intCast(i32, disp)) },
});
}
}
data.regs |= 1 << @intCast(u5, i);
self.max_end_stack += 8;
+ disp += 8;
}
}
break :blk try self.addExtra(data);