authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-06-24 22:51:29-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-06-25 19:14:03-04:00
log614c8077027767063f399d3dbb5d478deebf37c3
tree4dea450c209cf91c599271fb32906d172bb31475
parentd98147414d084bc41b00ba9c0be8c7b82ad4e76c

x86_64: fix packed store crash


3 files changed, 5 insertions(+), 6 deletions(-)

src/arch/x86_64/CodeGen.zig+5-4
...@@ -5404,6 +5404,7 @@ fn packedStore(self: *Self, ptr_ty: Type, ptr_mcv: MCValue, src_mcv: MCValue) In...@@ -5404,6 +5404,7 @@ fn packedStore(self: *Self, ptr_ty: Type, ptr_mcv: MCValue, src_mcv: MCValue) In
54045404
5405 const limb_abi_size: u16 = @min(ptr_info.packed_offset.host_size, 8);5405 const limb_abi_size: u16 = @min(ptr_info.packed_offset.host_size, 8);
5406 const limb_abi_bits = limb_abi_size * 8;5406 const limb_abi_bits = limb_abi_size * 8;
5407 const limb_ty = try mod.intType(.unsigned, limb_abi_bits);
54075408
5408 const src_bit_size = src_ty.bitSize(mod);5409 const src_bit_size = src_ty.bitSize(mod);
5409 const src_byte_off = @as(i32, @intCast(ptr_info.packed_offset.bit_offset / limb_abi_bits * limb_abi_size));5410 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...@@ -5443,23 +5444,23 @@ fn packedStore(self: *Self, ptr_ty: Type, ptr_mcv: MCValue, src_mcv: MCValue) In
5443 const tmp_lock = self.register_manager.lockRegAssumeUnused(tmp_reg);5444 const tmp_lock = self.register_manager.lockRegAssumeUnused(tmp_reg);
5444 defer self.register_manager.unlockReg(tmp_lock);5445 defer self.register_manager.unlockReg(tmp_lock);
54455446
5446 try self.genSetReg(tmp_reg, src_ty, src_mcv);5447 try self.genSetReg(tmp_reg, limb_ty, src_mcv);
5447 switch (limb_i) {5448 switch (limb_i) {
5448 0 => try self.genShiftBinOpMir(5449 0 => try self.genShiftBinOpMir(
5449 .{ ._l, .sh },5450 .{ ._l, .sh },
5450 src_ty,5451 limb_ty,
5451 tmp_mcv,5452 tmp_mcv,
5452 .{ .immediate = src_bit_off },5453 .{ .immediate = src_bit_off },
5453 ),5454 ),
5454 1 => try self.genShiftBinOpMir(5455 1 => try self.genShiftBinOpMir(
5455 .{ ._r, .sh },5456 .{ ._r, .sh },
5456 src_ty,5457 limb_ty,
5457 tmp_mcv,5458 tmp_mcv,
5458 .{ .immediate = limb_abi_bits - src_bit_off },5459 .{ .immediate = limb_abi_bits - src_bit_off },
5459 ),5460 ),
5460 else => unreachable,5461 else => unreachable,
5461 }5462 }
5462 try self.genBinOpMir(.{ ._, .@"and" }, src_ty, tmp_mcv, .{ .immediate = part_mask });5463 try self.genBinOpMir(.{ ._, .@"and" }, limb_ty, tmp_mcv, .{ .immediate = part_mask });
5463 try self.asmMemoryRegister(5464 try self.asmMemoryRegister(
5464 .{ ._, .@"or" },5465 .{ ._, .@"or" },
5465 limb_mem,5466 limb_mem,
test/behavior/bugs/13664.zig-1
...@@ -13,7 +13,6 @@ fn value() i64 {...@@ -13,7 +13,6 @@ fn value() i64 {
13 return 1341;13 return 1341;
14}14}
15test {15test {
16 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
17 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO16 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
18 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO17 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
19 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO18 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
test/behavior/struct.zig-1
...@@ -530,7 +530,6 @@ test "packed struct fields are ordered from LSB to MSB" {...@@ -530,7 +530,6 @@ test "packed struct fields are ordered from LSB to MSB" {
530test "implicit cast packed struct field to const ptr" {530test "implicit cast packed struct field to const ptr" {
531 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;531 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
532 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO532 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
533 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
534 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO533 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
535 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;534 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
536535