Skip to content

Commit 5d11563

Browse files
committed
x86_64: reuse single register code during register write splitting
1 parent 54ed627 commit 5d11563

File tree

1 file changed

+2
-31
lines changed

1 file changed

+2
-31
lines changed

src/arch/x86_64/CodeGen.zig

Lines changed: 2 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

0 commit comments

Comments
 (0)