authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-03-07 23:58:23-05:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2025-03-07 23:59:38-05:00
log5d115632d4e458e7e9154f14856fb29935315cb2
tree2fc580273f28d0a818ec4101e4271a6e8c082245
parent54ed62755f26e491978fef275e2cf2fe0dc14508

x86_64: reuse single register code during register write splitting


1 files changed, 2 insertions(+), 31 deletions(-)

src/arch/x86_64/CodeGen.zig+2-31
......@@ -101617,7 +101617,7 @@ const Temp = struct {
101617101617 .float_combine => 8,
101618101618 .sseup, .x87up, .complex_x87, .none, .win_i128, .integer_per_element => unreachable,
101619101619 };
101620 const part_ty: Type = switch (class) {
101620 try dst.writeReg(part_disp, switch (class) {
101621101621 .integer => .u64,
101622101622 .sse => switch (part_size) {
101623101623 else => unreachable,
......@@ -101629,36 +101629,7 @@ const Temp = struct {
101629101629 .float => .f32,
101630101630 .float_combine => .vector_2_f32,
101631101631 .sseup, .x87up, .complex_x87, .memory, .none, .win_i128, .integer_per_element => unreachable,
101632 };
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 }
101632 }, src_reg, cg);
101662101633 part_disp += part_size;
101663101634 remaining_abi_size -= part_size;
101664101635 }