aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJacob Young <jacobly0@users.noreply.github.com>2025-03-07 23:58:23 -0500
committerJacob Young <jacobly0@users.noreply.github.com>2025-03-07 23:59:38 -0500
commit5d115632d4e458e7e9154f14856fb29935315cb2 (patch)
tree2fc580273f28d0a818ec4101e4271a6e8c082245 /src
parent54ed62755f26e491978fef275e2cf2fe0dc14508 (diff)
downloadzig-5d115632d4e458e7e9154f14856fb29935315cb2.tar.gz
zig-5d115632d4e458e7e9154f14856fb29935315cb2.zip
x86_64: reuse single register code during register write splitting
Diffstat (limited to 'src')
-rw-r--r--src/arch/x86_64/CodeGen.zig33
1 files changed, 2 insertions, 31 deletions
diff --git a/src/arch/x86_64/CodeGen.zig b/src/arch/x86_64/CodeGen.zig
index 187a57e67f..9141646e4d 100644
--- a/src/arch/x86_64/CodeGen.zig
+++ b/src/arch/x86_64/CodeGen.zig
@@ -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;
}