| ... | @@ -187019,7 +187019,13 @@ const Temp = struct { | ... | @@ -187019,7 +187019,13 @@ const Temp = struct { |
| 187019 | }, | 187019 | }, |
| 187020 | .struct_type => { | 187020 | .struct_type => { |
| 187021 | assert(src_regs.len - part_index == std.math.divCeil(u32, src_abi_size, 8) catch unreachable); | 187021 | assert(src_regs.len - part_index == std.math.divCeil(u32, src_abi_size, 8) catch unreachable); |
| 187022 | break :part_ty .u64; | 187022 | break :part_ty switch (src_abi_size) { |
| | 187023 | 0, 3, 5...7 => unreachable, |
| | 187024 | 1 => .u8, |
| | 187025 | 2 => .u16, |
| | 187026 | 4 => .u32, |
| | 187027 | else => .u64, |
| | 187028 | }; |
| 187023 | }, | 187029 | }, |
| 187024 | .tuple_type => |tuple_type| { | 187030 | .tuple_type => |tuple_type| { |
| 187025 | assert(tuple_type.types.len == src_regs.len); | 187031 | assert(tuple_type.types.len == src_regs.len); |
| ... | @@ -187028,10 +187034,6 @@ const Temp = struct { | ... | @@ -187028,10 +187034,6 @@ const Temp = struct { |
| 187028 | }; | 187034 | }; |
| 187029 | const part_size: u31 = @intCast(part_ty.abiSize(zcu)); | 187035 | const part_size: u31 = @intCast(part_ty.abiSize(zcu)); |
| 187030 | const src_rc = src_reg.class(); | 187036 | const src_rc = src_reg.class(); |
| 187031 | const part_bit_size = switch (src_rc) { | | |
| 187032 | else => 8 * part_size, | | |
| 187033 | .x87 => part_ty.bitSize(zcu), | | |
| 187034 | }; | | |
| 187035 | if (src_rc == .x87 or std.math.isPowerOfTwo(part_size)) { | 187037 | if (src_rc == .x87 or std.math.isPowerOfTwo(part_size)) { |
| 187036 | // hack around linker relocation bugs | 187038 | // hack around linker relocation bugs |
| 187037 | switch (ptr.tracking(cg).short) { | 187039 | switch (ptr.tracking(cg).short) { |
| ... | @@ -187040,7 +187042,15 @@ const Temp = struct { | ... | @@ -187040,7 +187042,15 @@ const Temp = struct { |
| 187040 | } | 187042 | } |
| 187041 | const strat = try cg.moveStrategy(part_ty, src_rc, false); | 187043 | const strat = try cg.moveStrategy(part_ty, src_rc, false); |
| 187042 | try strat.write(cg, try ptr.tracking(cg).short.deref().mem(cg, .{ | 187044 | try strat.write(cg, try ptr.tracking(cg).short.deref().mem(cg, .{ |
| 187043 | .size = .fromBitSize(part_bit_size), | 187045 | .size = switch (src_rc) { |
| | 187046 | else => .fromBitSize(8 * part_size), |
| | 187047 | .x87 => switch (abi.classifySystemV(src_ty, zcu, cg.target, .other)[part_index]) { |
| | 187048 | else => unreachable, |
| | 187049 | .float => .dword, |
| | 187050 | .float_combine, .sse => .qword, |
| | 187051 | .x87 => .tbyte, |
| | 187052 | }, |
| | 187053 | }, |
| 187044 | .disp = part_disp, | 187054 | .disp = part_disp, |
| 187045 | }), registerAlias(src_reg, part_size)); | 187055 | }), registerAlias(src_reg, part_size)); |
| 187046 | } else { | 187056 | } else { |