authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2024-04-16 15:04:41-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2024-04-16 20:12:30-04:00
log77abd3a96aa8c8c1277cdbb33d88149d4674d389
treede5ca57f58721502d3fd4c5cbb983e6f4282a009
parenta2b834e8c7152f70d71c71107db40b9182909647

x86_64: fix miscompilation regression in package fetching code


1 files changed, 8 insertions(+), 6 deletions(-)

src/arch/x86_64/CodeGen.zig+8-6
...@@ -15050,10 +15050,11 @@ fn genSetMem(...@@ -15050,10 +15050,11 @@ fn genSetMem(
15050 .general_purpose, .segment, .x87 => @divExact(src_alias.bitSize(), 8),15050 .general_purpose, .segment, .x87 => @divExact(src_alias.bitSize(), 8),
15051 .mmx, .sse => abi_size,15051 .mmx, .sse => abi_size,
15052 });15052 });
15053 const src_align = Alignment.fromNonzeroByteUnits(math.ceilPowerOfTwoAssert(u32, src_size));
15053 if (src_size > mem_size) {15054 if (src_size > mem_size) {
15054 const frame_index = try self.allocFrameIndex(FrameAlloc.init(.{15055 const frame_index = try self.allocFrameIndex(FrameAlloc.init(.{
15055 .size = src_size,15056 .size = src_size,
15056 .alignment = Alignment.fromNonzeroByteUnits(src_size),15057 .alignment = src_align,
15057 }));15058 }));
15058 const frame_mcv: MCValue = .{ .load_frame = .{ .index = frame_index } };15059 const frame_mcv: MCValue = .{ .load_frame = .{ .index = frame_index } };
15059 try (try self.moveStrategy(ty, src_alias.class(), true)).write(15060 try (try self.moveStrategy(ty, src_alias.class(), true)).write(
...@@ -15066,14 +15067,15 @@ fn genSetMem(...@@ -15066,14 +15067,15 @@ fn genSetMem(
15066 try self.genSetMem(base, disp, ty, frame_mcv, opts);15067 try self.genSetMem(base, disp, ty, frame_mcv, opts);
15067 try self.freeValue(frame_mcv);15068 try self.freeValue(frame_mcv);
15068 } else try (try self.moveStrategy(ty, src_alias.class(), switch (base) {15069 } else try (try self.moveStrategy(ty, src_alias.class(), switch (base) {
15069 .none => ty.abiAlignment(mod).check(@as(u32, @bitCast(disp))),15070 .none => src_align.check(@as(u32, @bitCast(disp))),
15070 .reg => |reg| switch (reg) {15071 .reg => |reg| switch (reg) {
15071 .es, .cs, .ss, .ds => ty.abiAlignment(mod).check(@as(u32, @bitCast(disp))),15072 .es, .cs, .ss, .ds => src_align.check(@as(u32, @bitCast(disp))),
15072 else => false,15073 else => false,
15073 },15074 },
15074 .frame => |frame_index| self.getFrameAddrAlignment(15075 .frame => |frame_index| self.getFrameAddrAlignment(.{
15075 .{ .index = frame_index, .off = disp },15076 .index = frame_index,
15076 ).compare(.gte, ty.abiAlignment(mod)),15077 .off = disp,
15078 }).compare(.gte, src_align),
15077 .reloc => false,15079 .reloc => false,
15078 })).write(15080 })).write(
15079 self,15081 self,