diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig index 317a50e0ec..7cf6865053 100644 --- a/src/arch/x86_64/CodeGen.zig +++ b/src/arch/x86_64/CodeGen.zig @@ -4119,12 +4119,19 @@ fn airBreakpoint(self: *Self) !void { } fn airRetAddr(self: *Self, inst: Air.Inst.Index) !void { - const result: MCValue = if (self.liveness.isUnused(inst)) .dead else return self.fail("TODO implement airRetAddr for x86_64", .{}); + const result: MCValue = if (self.liveness.isUnused(inst)) + .dead + else + .{ .stack_offset = -@as(i32, @divExact(self.target.cpu.arch.ptrBitWidth(), 8)) }; return self.finishAir(inst, result, .{ .none, .none, .none }); } fn airFrameAddress(self: *Self, inst: Air.Inst.Index) !void { - const result: MCValue = if (self.liveness.isUnused(inst)) .dead else return self.fail("TODO implement airFrameAddress for x86_64", .{}); + const result = if (self.liveness.isUnused(inst)) .dead else result: { + const dst_mcv = try self.allocRegOrMem(inst, true); + try self.genBinOpMir(.mov, Type.usize, dst_mcv, .{ .register = .rbp }); + break :result dst_mcv; + }; return self.finishAir(inst, result, .{ .none, .none, .none }); } diff --git a/test/behavior/return_address.zig b/test/behavior/return_address.zig index fe48f21ec2..123b90a66e 100644 --- a/test/behavior/return_address.zig +++ b/test/behavior/return_address.zig @@ -7,7 +7,6 @@ fn retAddr() usize { test "return address" { if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO