aboutsummaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
authorJacob Young <jacobly0@users.noreply.github.com>2023-05-13 02:24:41 -0400
committerJacob Young <jacobly0@users.noreply.github.com>2023-05-15 03:07:51 -0400
commit57c38f6433c8024d1946bcf1b5b7d0892fc751a7 (patch)
treef5e338f3f13c91420b112c9ff39f8128335c2806 /src/arch
parent2cbd442a9df16ab2d13d03041631f516269c9f64 (diff)
downloadzig-57c38f6433c8024d1946bcf1b5b7d0892fc751a7.tar.gz
zig-57c38f6433c8024d1946bcf1b5b7d0892fc751a7.zip
x86_64: implement global payload pointers
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/x86_64/CodeGen.zig7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig
index c04bb1d2a5..4aa2443295 100644
--- a/src/arch/x86_64/CodeGen.zig
+++ b/src/arch/x86_64/CodeGen.zig
@@ -3467,14 +3467,17 @@ fn airOptionalPayloadPtrSet(self: *Self, inst: Air.Inst.Index) !void {
try self.copyToRegisterWithInstTracking(inst, dst_ty, src_mcv);
}
- const dst_mcv = if (src_mcv.isRegister() and self.reuseOperand(inst, ty_op.operand, 0, src_mcv))
+ const dst_mcv: MCValue = if (src_mcv.isRegister() and
+ self.reuseOperand(inst, ty_op.operand, 0, src_mcv))
src_mcv
+ else if (self.liveness.isUnused(inst))
+ .{ .register = try self.copyToTmpRegister(dst_ty, src_mcv) }
else
try self.copyToRegisterWithInstTracking(inst, dst_ty, src_mcv);
const pl_ty = dst_ty.childType();
const pl_abi_size = @intCast(i32, pl_ty.abiSize(self.target.*));
- try self.genSetMem(.{ .reg = dst_mcv.register }, pl_abi_size, Type.bool, .{ .immediate = 1 });
+ try self.genSetMem(.{ .reg = dst_mcv.getReg().? }, pl_abi_size, Type.bool, .{ .immediate = 1 });
break :result if (self.liveness.isUnused(inst)) .unreach else dst_mcv;
};
return self.finishAir(inst, result, .{ ty_op.operand, .none, .none });