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 /src | |
| parent | d98147414d084bc41b00ba9c0be8c7b82ad4e76c (diff) | |
| download | zig-614c8077027767063f399d3dbb5d478deebf37c3.tar.gz zig-614c8077027767063f399d3dbb5d478deebf37c3.zip | |
x86_64: fix packed store crash
Diffstat (limited to 'src')
| -rw-r--r-- | src/arch/x86_64/CodeGen.zig | 9 |
1 files changed, 5 insertions, 4 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, |
