| ... | @@ -4922,7 +4922,14 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void { | ... | @@ -4922,7 +4922,14 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void { |
| 4922 | } | 4922 | } |
| 4923 | | 4923 | |
| 4924 | if (field_extra_bits > 0) try self.truncateRegister(field_ty, dst_reg); | 4924 | if (field_extra_bits > 0) try self.truncateRegister(field_ty, dst_reg); |
| 4925 | break :result .{ .register = dst_reg }; | 4925 | |
| | 4926 | const dst_mcv = MCValue{ .register = dst_reg }; |
| | 4927 | const dst_rc = regClassForType(field_ty); |
| | 4928 | if (dst_rc.eql(gp)) break :result dst_mcv; |
| | 4929 | |
| | 4930 | const result_reg = try self.register_manager.allocReg(inst, dst_rc); |
| | 4931 | try self.genSetReg(result_reg, field_ty, dst_mcv); |
| | 4932 | break :result .{ .register = result_reg }; |
| 4926 | }, | 4933 | }, |
| 4927 | .register => |reg| { | 4934 | .register => |reg| { |
| 4928 | const reg_lock = self.register_manager.lockRegAssumeUnused(reg); | 4935 | const reg_lock = self.register_manager.lockRegAssumeUnused(reg); |
| ... | @@ -7896,7 +7903,8 @@ fn genCopy(self: *Self, ty: Type, dst_mcv: MCValue, src_mcv: MCValue) InnerError | ... | @@ -7896,7 +7903,8 @@ fn genCopy(self: *Self, ty: Type, dst_mcv: MCValue, src_mcv: MCValue) InnerError |
| 7896 | | 7903 | |
| 7897 | fn genSetReg(self: *Self, dst_reg: Register, ty: Type, src_mcv: MCValue) InnerError!void { | 7904 | fn genSetReg(self: *Self, dst_reg: Register, ty: Type, src_mcv: MCValue) InnerError!void { |
| 7898 | const abi_size = @intCast(u32, ty.abiSize(self.target.*)); | 7905 | const abi_size = @intCast(u32, ty.abiSize(self.target.*)); |
| 7899 | if (abi_size > 8) return self.fail("genSetReg called with a value larger than one register", .{}); | 7906 | if (abi_size * 8 > dst_reg.bitSize()) |
| | 7907 | return self.fail("genSetReg called with a value larger than dst_reg", .{}); |
| 7900 | switch (src_mcv) { | 7908 | switch (src_mcv) { |
| 7901 | .none, | 7909 | .none, |
| 7902 | .unreach, | 7910 | .unreach, |