| ... | ... | @@ -5411,6 +5411,7 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void { |
| 5411 | 5411 | const field_ty = container_ty.structFieldType(index); |
| 5412 | 5412 | if (!field_ty.hasRuntimeBitsIgnoreComptime()) break :result .none; |
| 5413 | 5413 | const field_rc = regClassForType(field_ty); |
| 5414 | const field_is_gp = field_rc.supersetOf(gp); |
| 5414 | 5415 | |
| 5415 | 5416 | const src_mcv = try self.resolveInst(operand); |
| 5416 | 5417 | const field_off = switch (container_ty.containerLayout()) { |
| ... | ... | @@ -5443,7 +5444,7 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void { |
| 5443 | 5444 | return self.fail("TODO implement struct_field_val with large packed field", .{}); |
| 5444 | 5445 | } |
| 5445 | 5446 | |
| 5446 | | const dst_reg = try self.register_manager.allocReg(inst, gp); |
| 5447 | const dst_reg = try self.register_manager.allocReg(if (field_is_gp) inst else null, gp); |
| 5447 | 5448 | const field_extra_bits = self.regExtraBits(field_ty); |
| 5448 | 5449 | const load_abi_size = |
| 5449 | 5450 | if (field_bit_off < field_extra_bits) field_abi_size else field_abi_size * 2; |
| ... | ... | @@ -5494,7 +5495,7 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void { |
| 5494 | 5495 | if (field_extra_bits > 0) try self.truncateRegister(field_ty, dst_reg); |
| 5495 | 5496 | |
| 5496 | 5497 | const dst_mcv = MCValue{ .register = dst_reg }; |
| 5497 | | break :result if (field_rc.supersetOf(gp)) |
| 5498 | break :result if (field_is_gp) |
| 5498 | 5499 | dst_mcv |
| 5499 | 5500 | else |
| 5500 | 5501 | try self.copyToRegisterWithInstTracking(inst, field_ty, dst_mcv); |