authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2024-02-14 07:37:16+01:00
committergravatar for igor.anic@gmail.comIgor Anić <igor.anic@gmail.com> 2024-02-14 18:28:20+01:00
logcb3fe277bbbdcf432530cd0a1f3d05d3d924675b
tree450eb988285306ebb8dc07e617a2714087faa1da
parent0cba50d73e46a9ff6547c37d34d100d2295f15dc

x86_64: fix crash loading a packed value from a spilled pointer

Unblocks #18923

1 files changed, 14 insertions(+), 1 deletions(-)

src/arch/x86_64/CodeGen.zig+14-1
......@@ -7276,7 +7276,20 @@ fn packedLoad(self: *Self, dst_mcv: MCValue, ptr_ty: Type, ptr_mcv: MCValue) Inn
72767276 else => |vector_index| @intFromEnum(vector_index) * val_bit_size,
72777277 };
72787278 if (ptr_bit_off % 8 == 0) {
7279 try self.load(dst_mcv, ptr_ty, ptr_mcv.offset(@intCast(@divExact(ptr_bit_off, 8))));
7279 {
7280 const mat_ptr_mcv: MCValue = switch (ptr_mcv) {
7281 .immediate, .register, .register_offset, .lea_frame => ptr_mcv,
7282 else => .{ .register = try self.copyToTmpRegister(ptr_ty, ptr_mcv) },
7283 };
7284 const mat_ptr_lock = switch (mat_ptr_mcv) {
7285 .register => |mat_ptr_reg| self.register_manager.lockReg(mat_ptr_reg),
7286 else => null,
7287 };
7288 defer if (mat_ptr_lock) |lock| self.register_manager.unlockReg(lock);
7289
7290 try self.load(dst_mcv, ptr_ty, mat_ptr_mcv.offset(@intCast(@divExact(ptr_bit_off, 8))));
7291 }
7292
72807293 if (val_abi_size * 8 > val_bit_size) {
72817294 if (dst_mcv.isRegister()) {
72827295 try self.truncateRegister(val_ty, dst_mcv.getReg().?);