diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig index 2a9e25500cc6..079008298501 100644 --- a/src/arch/x86_64/CodeGen.zig +++ b/src/arch/x86_64/CodeGen.zig @@ -88178,12 +88178,15 @@ fn airStore(self: *CodeGen, inst: Air.Inst.Index, safety: bool) !void { const reg_locks = self.register_manager.lockRegsAssumeUnused(3, .{ .rdi, .rsi, .rcx }); defer for (reg_locks) |lock| self.register_manager.unlockReg(lock); + const ptr_ty = self.typeOf(bin_op.lhs); + const ptr_info = ptr_ty.ptrInfo(zcu); + const is_packed = ptr_info.flags.vector_index != .none or ptr_info.packed_offset.host_size > 0; + if (is_packed) try self.spillEflagsIfOccupied(); + const src_mcv = try self.resolveInst(bin_op.rhs); const ptr_mcv = try self.resolveInst(bin_op.lhs); - const ptr_ty = self.typeOf(bin_op.lhs); - const ptr_info = ptr_ty.ptrInfo(zcu); - if (ptr_info.flags.vector_index != .none or ptr_info.packed_offset.host_size > 0) { + if (is_packed) { try self.packedStore(ptr_ty, ptr_mcv, src_mcv); } else { try self.store(ptr_ty, ptr_mcv, src_mcv, .{ .safety = safety }); diff --git a/test/behavior/packed-struct.zig b/test/behavior/packed-struct.zig index 592d9fa2bd5c..900657bb060d 100644 --- a/test/behavior/packed-struct.zig +++ b/test/behavior/packed-struct.zig @@ -1335,3 +1335,31 @@ test "assign packed struct initialized with RLS to packed struct literal field" try expect(outer.inner.x == x); try expect(outer.x == x); } + +test "packed struct store of comparison result" { + if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; + + const S1 = packed struct { + val1: u3, + val2: u3, + }; + const S2 = packed struct { + a: bool, + b: bool, + }; + + var A: S1 = .{ .val1 = 1, .val2 = 1 }; + A.val2 += 1; + try expectEqual(1, A.val1); + try expectEqual(2, A.val2); + try expect((A.val2 & 1) != 1); + const result1: S2 = .{ .a = (A.val2 & 1) != 1, .b = (A.val1 & 1) != 1 }; + try expect(result1.a); + try expect(!result1.b); + + try expect((A.val2 == 3) == false); + try expect((A.val2 == 2) == true); + const result2: S2 = .{ .a = !(A.val2 == 3), .b = (A.val1 == 2) }; + try expect(result2.a); + try expect(!result2.b); +}