authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-12-04 13:31:34-05:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-12-04 13:31:54-05:00
logc70c33359498bfe33a2f60cfcc5ea401a277d5bf
tree8c63d76b33589df5aaa418b9c3ebc37dece594e8
parentbdb6546a8f753fff65790fd289e35b1d5ba6cd5b

x86_64: fix packed struct field reuse


2 files changed, 5 insertions(+), 4 deletions(-)

src/arch/x86_64/CodeGen.zig+5-3
......@@ -7324,8 +7324,8 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void {
73247324 .load_frame => |frame_addr| {
73257325 const field_abi_size: u32 = @intCast(field_ty.abiSize(mod));
73267326 if (field_off % 8 == 0) {
7327 const off_mcv =
7328 src_mcv.address().offset(@intCast(@divExact(field_off, 8))).deref();
7327 const field_byte_off = @divExact(field_off, 8);
7328 const off_mcv = src_mcv.address().offset(@intCast(field_byte_off)).deref();
73297329 const field_bit_size = field_ty.bitSize(mod);
73307330
73317331 if (field_abi_size <= 8) {
......@@ -7350,7 +7350,9 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void {
73507350 try self.copyToRegisterWithInstTracking(inst, field_ty, dst_mcv);
73517351 }
73527352
7353 const dst_mcv = if (self.reuseOperand(inst, operand, 0, src_mcv))
7353 const container_abi_size: u32 = @intCast(container_ty.abiSize(mod));
7354 const dst_mcv = if (field_byte_off + field_abi_size <= container_abi_size and
7355 self.reuseOperand(inst, operand, 0, src_mcv))
73547356 off_mcv
73557357 else dst: {
73567358 const dst_mcv = try self.allocRegOrMem(inst, true);
test/behavior/packed-struct.zig-1
......@@ -804,7 +804,6 @@ test "nested packed struct at non-zero offset" {
804804}
805805
806806test "nested packed struct at non-zero offset 2" {
807 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
808807 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
809808 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
810809 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO