| ... | @@ -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, |