Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions src/arch/x86_64/CodeGen.zig
Original file line number Diff line number Diff line change
Expand Up @@ -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 });
Expand Down
28 changes: 28 additions & 0 deletions test/behavior/packed-struct.zig
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}