Commit 5d115632d4

Jacob Young <jacobly0@users.noreply.github.com>
2025-03-08 05:58:23
x86_64: reuse single register code during register write splitting
1 parent 54ed627
Changed files (1)
src
arch
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;
         }