diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2023-06-24 22:51:29 -0400 |
|---|---|---|
| committer | Jacob Young <jacobly0@users.noreply.github.com> | 2023-06-25 19:14:03 -0400 |
| commit | 614c8077027767063f399d3dbb5d478deebf37c3 (patch) | |
| tree | 4dea450c209cf91c599271fb32906d172bb31475 | |
| parent | d98147414d084bc41b00ba9c0be8c7b82ad4e76c (diff) | |
| download | zig-614c8077027767063f399d3dbb5d478deebf37c3.tar.gz zig-614c8077027767063f399d3dbb5d478deebf37c3.zip | |
x86_64: fix packed store crash
| -rw-r--r-- | src/arch/x86_64/CodeGen.zig | 9 | ||||
| -rw-r--r-- | test/behavior/bugs/13664.zig | 1 | ||||
| -rw-r--r-- | test/behavior/struct.zig | 1 |
3 files changed, 5 insertions, 6 deletions
diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig index 134a6859ef..6fd136684a 100644 --- a/src/arch/x86_64/CodeGen.zig +++ b/src/arch/x86_64/CodeGen.zig @@ -5404,6 +5404,7 @@ fn packedStore(self: *Self, ptr_ty: Type, ptr_mcv: MCValue, src_mcv: MCValue) In const limb_abi_size: u16 = @min(ptr_info.packed_offset.host_size, 8); const limb_abi_bits = limb_abi_size * 8; + const limb_ty = try mod.intType(.unsigned, limb_abi_bits); const src_bit_size = src_ty.bitSize(mod); const src_byte_off = @as(i32, @intCast(ptr_info.packed_offset.bit_offset / limb_abi_bits * limb_abi_size)); @@ -5443,23 +5444,23 @@ fn packedStore(self: *Self, ptr_ty: Type, ptr_mcv: MCValue, src_mcv: MCValue) In const tmp_lock = self.register_manager.lockRegAssumeUnused(tmp_reg); defer self.register_manager.unlockReg(tmp_lock); - try self.genSetReg(tmp_reg, src_ty, src_mcv); + try self.genSetReg(tmp_reg, limb_ty, src_mcv); switch (limb_i) { 0 => try self.genShiftBinOpMir( .{ ._l, .sh }, - src_ty, + limb_ty, tmp_mcv, .{ .immediate = src_bit_off }, ), 1 => try self.genShiftBinOpMir( .{ ._r, .sh }, - src_ty, + limb_ty, tmp_mcv, .{ .immediate = limb_abi_bits - src_bit_off }, ), else => unreachable, } - try self.genBinOpMir(.{ ._, .@"and" }, src_ty, tmp_mcv, .{ .immediate = part_mask }); + try self.genBinOpMir(.{ ._, .@"and" }, limb_ty, tmp_mcv, .{ .immediate = part_mask }); try self.asmMemoryRegister( .{ ._, .@"or" }, limb_mem, diff --git a/test/behavior/bugs/13664.zig b/test/behavior/bugs/13664.zig index b0ea3f70af..828408510d 100644 --- a/test/behavior/bugs/13664.zig +++ b/test/behavior/bugs/13664.zig @@ -13,7 +13,6 @@ fn value() i64 { return 1341; } test { - if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO diff --git a/test/behavior/struct.zig b/test/behavior/struct.zig index 95b2718efd..3210e0c112 100644 --- a/test/behavior/struct.zig +++ b/test/behavior/struct.zig @@ -530,7 +530,6 @@ test "packed struct fields are ordered from LSB to MSB" { test "implicit cast packed struct field to const ptr" { if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO - if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
