| ... | ... | @@ -637,6 +637,9 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void { |
| 637 | 637 | .wrap_errunion_err => try self.airWrapErrUnionErr(inst), |
| 638 | 638 | // zig fmt: on |
| 639 | 639 | } |
| 640 | |
| 641 | assert(!self.register_manager.frozenRegsExist()); |
| 642 | |
| 640 | 643 | if (std.debug.runtime_safety) { |
| 641 | 644 | if (self.air_bookkeeping < old_air_bookkeeping + 1) { |
| 642 | 645 | std.debug.panic("in codegen.zig, handling of AIR instruction %{d} ('{}') did not do proper bookkeeping. Look for a missing call to finishAir.", .{ inst, air_tags[inst] }); |
| ... | ... | @@ -1264,14 +1267,16 @@ fn load(self: *Self, dst_mcv: MCValue, ptr: MCValue, ptr_ty: Type) InnerError!vo |
| 1264 | 1267 | .register => { |
| 1265 | 1268 | return self.fail("TODO implement loading from MCValue.register for {}", .{self.target.cpu.arch}); |
| 1266 | 1269 | }, |
| 1267 | | .memory => |addr| { |
| 1270 | .memory, |
| 1271 | .stack_offset, |
| 1272 | => { |
| 1268 | 1273 | const reg = try self.register_manager.allocReg(null, &.{}); |
| 1269 | | try self.genSetReg(ptr_ty, reg, .{ .memory = addr }); |
| 1274 | self.register_manager.freezeRegs(&.{reg}); |
| 1275 | defer self.register_manager.unfreezeRegs(&.{reg}); |
| 1276 | |
| 1277 | try self.genSetReg(ptr_ty, reg, ptr); |
| 1270 | 1278 | try self.load(dst_mcv, .{ .register = reg }, ptr_ty); |
| 1271 | 1279 | }, |
| 1272 | | .stack_offset => { |
| 1273 | | return self.fail("TODO implement loading from MCValue.stack_offset", .{}); |
| 1274 | | }, |
| 1275 | 1280 | } |
| 1276 | 1281 | } |
| 1277 | 1282 | |
| ... | ... | @@ -1711,6 +1716,11 @@ fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void { |
| 1711 | 1716 | else => true, |
| 1712 | 1717 | }; |
| 1713 | 1718 | |
| 1719 | if (lhs_is_register) self.register_manager.freezeRegs(&.{lhs.register}); |
| 1720 | defer if (lhs_is_register) self.register_manager.unfreezeRegs(&.{lhs.register}); |
| 1721 | if (rhs_is_register) self.register_manager.freezeRegs(&.{rhs.register}); |
| 1722 | defer if (rhs_is_register) self.register_manager.unfreezeRegs(&.{rhs.register}); |
| 1723 | |
| 1714 | 1724 | var lhs_mcv = lhs; |
| 1715 | 1725 | var rhs_mcv = rhs; |
| 1716 | 1726 | |