x86_64: fix miscompilation regression in package fetching code

This commit is contained in:
Jacob Young 2024-04-16 15:04:41 -04:00
parent a2b834e8c7
commit 77abd3a96a

View file

@ -15050,10 +15050,11 @@ fn genSetMem(
.general_purpose, .segment, .x87 => @divExact(src_alias.bitSize(), 8), .general_purpose, .segment, .x87 => @divExact(src_alias.bitSize(), 8),
.mmx, .sse => abi_size, .mmx, .sse => abi_size,
}); });
const src_align = Alignment.fromNonzeroByteUnits(math.ceilPowerOfTwoAssert(u32, src_size));
if (src_size > mem_size) { if (src_size > mem_size) {
const frame_index = try self.allocFrameIndex(FrameAlloc.init(.{ const frame_index = try self.allocFrameIndex(FrameAlloc.init(.{
.size = src_size, .size = src_size,
.alignment = Alignment.fromNonzeroByteUnits(src_size), .alignment = src_align,
})); }));
const frame_mcv: MCValue = .{ .load_frame = .{ .index = frame_index } }; const frame_mcv: MCValue = .{ .load_frame = .{ .index = frame_index } };
try (try self.moveStrategy(ty, src_alias.class(), true)).write( try (try self.moveStrategy(ty, src_alias.class(), true)).write(
@ -15066,14 +15067,15 @@ fn genSetMem(
try self.genSetMem(base, disp, ty, frame_mcv, opts); try self.genSetMem(base, disp, ty, frame_mcv, opts);
try self.freeValue(frame_mcv); try self.freeValue(frame_mcv);
} else try (try self.moveStrategy(ty, src_alias.class(), switch (base) { } else try (try self.moveStrategy(ty, src_alias.class(), switch (base) {
.none => ty.abiAlignment(mod).check(@as(u32, @bitCast(disp))), .none => src_align.check(@as(u32, @bitCast(disp))),
.reg => |reg| switch (reg) { .reg => |reg| switch (reg) {
.es, .cs, .ss, .ds => ty.abiAlignment(mod).check(@as(u32, @bitCast(disp))), .es, .cs, .ss, .ds => src_align.check(@as(u32, @bitCast(disp))),
else => false, else => false,
}, },
.frame => |frame_index| self.getFrameAddrAlignment( .frame => |frame_index| self.getFrameAddrAlignment(.{
.{ .index = frame_index, .off = disp }, .index = frame_index,
).compare(.gte, ty.abiAlignment(mod)), .off = disp,
}).compare(.gte, src_align),
.reloc => false, .reloc => false,
})).write( })).write(
self, self,