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...@@ -7276,7 +7276,20 @@ fn packedLoad(self: *Self, dst_mcv: MCValue, ptr_ty: Type, ptr_mcv: MCValue) Inn
7276 else => |vector_index| @intFromEnum(vector_index) * val_bit_size,7276 else => |vector_index| @intFromEnum(vector_index) * val_bit_size,
7277 };7277 };
7278 if (ptr_bit_off % 8 == 0) {7278 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
7280 if (val_abi_size * 8 > val_bit_size) {7293 if (val_abi_size * 8 > val_bit_size) {
7281 if (dst_mcv.isRegister()) {7294 if (dst_mcv.isRegister()) {
7282 try self.truncateRegister(val_ty, dst_mcv.getReg().?);7295 try self.truncateRegister(val_ty, dst_mcv.getReg().?);