| ... | @@ -101617,7 +101617,7 @@ const Temp = struct { | ... | @@ -101617,7 +101617,7 @@ const Temp = struct { |
| 101617 | .float_combine => 8, | 101617 | .float_combine => 8, |
| 101618 | .sseup, .x87up, .complex_x87, .none, .win_i128, .integer_per_element => unreachable, | 101618 | .sseup, .x87up, .complex_x87, .none, .win_i128, .integer_per_element => unreachable, |
| 101619 | }; | 101619 | }; |
| 101620 | const part_ty: Type = switch (class) { | 101620 | try dst.writeReg(part_disp, switch (class) { |
| 101621 | .integer => .u64, | 101621 | .integer => .u64, |
| 101622 | .sse => switch (part_size) { | 101622 | .sse => switch (part_size) { |
| 101623 | else => unreachable, | 101623 | else => unreachable, |
| ... | @@ -101629,36 +101629,7 @@ const Temp = struct { | ... | @@ -101629,36 +101629,7 @@ const Temp = struct { |
| 101629 | .float => .f32, | 101629 | .float => .f32, |
| 101630 | .float_combine => .vector_2_f32, | 101630 | .float_combine => .vector_2_f32, |
| 101631 | .sseup, .x87up, .complex_x87, .memory, .none, .win_i128, .integer_per_element => unreachable, | 101631 | .sseup, .x87up, .complex_x87, .memory, .none, .win_i128, .integer_per_element => unreachable, |
| 101632 | }; | 101632 | }, src_reg, cg); |
| 101633 | if (class == .x87 or std.math.isPowerOfTwo(part_size)) { | | |
| 101634 | const strat = try cg.moveStrategy(part_ty, src_reg.class(), false); | | |
| 101635 | try strat.write(cg, try dst.tracking(cg).short.mem(cg, .{ | | |
| 101636 | .size = switch (class) { | | |
| 101637 | else => .fromSize(part_size), | | |
| 101638 | .x87 => .tbyte, | | |
| 101639 | }, | | |
| 101640 | .disp = part_disp, | | |
| 101641 | }), registerAlias(src_reg, part_size)); | | |
| 101642 | } else { | | |
| 101643 | const frame_size = std.math.ceilPowerOfTwoAssert(u32, part_size); | | |
| 101644 | const frame_index = try cg.allocFrameIndex(.init(.{ | | |
| 101645 | .size = frame_size, | | |
| 101646 | .alignment = .fromNonzeroByteUnits(frame_size), | | |
| 101647 | })); | | |
| 101648 | const strat = try cg.moveStrategy(part_ty, src_reg.class(), true); | | |
| 101649 | try strat.write(cg, .{ | | |
| 101650 | .base = .{ .frame = frame_index }, | | |
| 101651 | .mod = .{ .rm = .{ .size = .fromSize(frame_size) } }, | | |
| 101652 | }, registerAlias(src_reg, frame_size)); | | |
| 101653 | var dst_ptr = try cg.tempInit(.usize, dst.tracking(cg).short.address()); | | |
| 101654 | try dst_ptr.toOffset(part_disp, cg); | | |
| 101655 | var src_ptr = try cg.tempInit(.usize, .{ .lea_frame = .{ .index = frame_index } }); | | |
| 101656 | var len = try cg.tempInit(.usize, .{ .immediate = part_size }); | | |
| 101657 | try dst_ptr.memcpy(&src_ptr, &len, cg); | | |
| 101658 | try dst_ptr.die(cg); | | |
| 101659 | try src_ptr.die(cg); | | |
| 101660 | try len.die(cg); | | |
| 101661 | } | | |
| 101662 | part_disp += part_size; | 101633 | part_disp += part_size; |
| 101663 | remaining_abi_size -= part_size; | 101634 | remaining_abi_size -= part_size; |
| 101664 | } | 101635 | } |