| ... | @@ -637,6 +637,9 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void { | ... | @@ -637,6 +637,9 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void { |
| 637 | .wrap_errunion_err => try self.airWrapErrUnionErr(inst), | 637 | .wrap_errunion_err => try self.airWrapErrUnionErr(inst), |
| 638 | // zig fmt: on | 638 | // zig fmt: on |
| 639 | } | 639 | } |
| | 640 | |
| | 641 | assert(!self.register_manager.frozenRegsExist()); |
| | 642 | |
| 640 | if (std.debug.runtime_safety) { | 643 | if (std.debug.runtime_safety) { |
| 641 | if (self.air_bookkeeping < old_air_bookkeeping + 1) { | 644 | if (self.air_bookkeeping < old_air_bookkeeping + 1) { |
| 642 | 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] }); | 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,14 +1267,16 @@ fn load(self: *Self, dst_mcv: MCValue, ptr: MCValue, ptr_ty: Type) InnerError!vo |
| 1264 | .register => { | 1267 | .register => { |
| 1265 | return self.fail("TODO implement loading from MCValue.register for {}", .{self.target.cpu.arch}); | 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 | const reg = try self.register_manager.allocReg(null, &.{}); | 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 | try self.load(dst_mcv, .{ .register = reg }, ptr_ty); | 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,6 +1716,11 @@ fn airCmp(self: *Self, inst: Air.Inst.Index, op: math.CompareOperator) !void { |
| 1711 | else => true, | 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 | var lhs_mcv = lhs; | 1724 | var lhs_mcv = lhs; |
| 1715 | var rhs_mcv = rhs; | 1725 | var rhs_mcv = rhs; |
| 1716 | | 1726 | |