diff options
| author | Jacob Young <jacobly0@users.noreply.github.com> | 2025-03-07 23:58:23 -0500 |
|---|---|---|
| committer | Jacob Young <jacobly0@users.noreply.github.com> | 2025-03-07 23:59:38 -0500 |
| commit | 5d115632d4e458e7e9154f14856fb29935315cb2 (patch) | |
| tree | 2fc580273f28d0a818ec4101e4271a6e8c082245 /src | |
| parent | 54ed62755f26e491978fef275e2cf2fe0dc14508 (diff) | |
| download | zig-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.zig | 33 |
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; } |
