Skip to content

Commit 77abd3a

Browse files
committed
x86_64: fix miscompilation regression in package fetching code
1 parent a2b834e commit 77abd3a

File tree

1 file changed

+8
-6
lines changed

1 file changed

+8
-6
lines changed

src/arch/x86_64/CodeGen.zig

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15050,10 +15050,11 @@ fn genSetMem(
1505015050
.general_purpose, .segment, .x87 => @divExact(src_alias.bitSize(), 8),
1505115051
.mmx, .sse => abi_size,
1505215052
});
15053+
const src_align = Alignment.fromNonzeroByteUnits(math.ceilPowerOfTwoAssert(u32, src_size));
1505315054
if (src_size > mem_size) {
1505415055
const frame_index = try self.allocFrameIndex(FrameAlloc.init(.{
1505515056
.size = src_size,
15056-
.alignment = Alignment.fromNonzeroByteUnits(src_size),
15057+
.alignment = src_align,
1505715058
}));
1505815059
const frame_mcv: MCValue = .{ .load_frame = .{ .index = frame_index } };
1505915060
try (try self.moveStrategy(ty, src_alias.class(), true)).write(
@@ -15066,14 +15067,15 @@ fn genSetMem(
1506615067
try self.genSetMem(base, disp, ty, frame_mcv, opts);
1506715068
try self.freeValue(frame_mcv);
1506815069
} 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))),
1507015071
.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))),
1507215073
else => false,
1507315074
},
15074-
.frame => |frame_index| self.getFrameAddrAlignment(
15075-
.{ .index = frame_index, .off = disp },
15076-
).compare(.gte, ty.abiAlignment(mod)),
15075+
.frame => |frame_index| self.getFrameAddrAlignment(.{
15076+
.index = frame_index,
15077+
.off = disp,
15078+
}).compare(.gte, src_align),
1507715079
.reloc => false,
1507815080
})).write(
1507915081
self,

0 commit comments

Comments
 (0)