mirror of
https://github.com/ziglang/zig.git
synced 2026-02-13 04:48:20 +00:00
x86_64: reuse single register code during register write splitting
This commit is contained in:
parent
54ed62755f
commit
5d115632d4
@ -101617,7 +101617,7 @@ const Temp = struct {
|
||||
.float_combine => 8,
|
||||
.sseup, .x87up, .complex_x87, .none, .win_i128, .integer_per_element => unreachable,
|
||||
};
|
||||
const part_ty: Type = switch (class) {
|
||||
try dst.writeReg(part_disp, switch (class) {
|
||||
.integer => .u64,
|
||||
.sse => switch (part_size) {
|
||||
else => unreachable,
|
||||
@ -101629,36 +101629,7 @@ const Temp = struct {
|
||||
.float => .f32,
|
||||
.float_combine => .vector_2_f32,
|
||||
.sseup, .x87up, .complex_x87, .memory, .none, .win_i128, .integer_per_element => unreachable,
|
||||
};
|
||||
if (class == .x87 or std.math.isPowerOfTwo(part_size)) {
|
||||
const strat = try cg.moveStrategy(part_ty, src_reg.class(), false);
|
||||
try strat.write(cg, try dst.tracking(cg).short.mem(cg, .{
|
||||
.size = switch (class) {
|
||||
else => .fromSize(part_size),
|
||||
.x87 => .tbyte,
|
||||
},
|
||||
.disp = part_disp,
|
||||
}), registerAlias(src_reg, part_size));
|
||||
} else {
|
||||
const frame_size = std.math.ceilPowerOfTwoAssert(u32, part_size);
|
||||
const frame_index = try cg.allocFrameIndex(.init(.{
|
||||
.size = frame_size,
|
||||
.alignment = .fromNonzeroByteUnits(frame_size),
|
||||
}));
|
||||
const strat = try cg.moveStrategy(part_ty, src_reg.class(), true);
|
||||
try strat.write(cg, .{
|
||||
.base = .{ .frame = frame_index },
|
||||
.mod = .{ .rm = .{ .size = .fromSize(frame_size) } },
|
||||
}, registerAlias(src_reg, frame_size));
|
||||
var dst_ptr = try cg.tempInit(.usize, dst.tracking(cg).short.address());
|
||||
try dst_ptr.toOffset(part_disp, cg);
|
||||
var src_ptr = try cg.tempInit(.usize, .{ .lea_frame = .{ .index = frame_index } });
|
||||
var len = try cg.tempInit(.usize, .{ .immediate = part_size });
|
||||
try dst_ptr.memcpy(&src_ptr, &len, cg);
|
||||
try dst_ptr.die(cg);
|
||||
try src_ptr.die(cg);
|
||||
try len.die(cg);
|
||||
}
|
||||
}, src_reg, cg);
|
||||
part_disp += part_size;
|
||||
remaining_abi_size -= part_size;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user