| ... | ... | @@ -2765,7 +2765,9 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type |
| 2765 | 2765 | |
| 2766 | 2766 | switch (value) { |
| 2767 | 2767 | .dead => unreachable, |
| 2768 | | .undef => unreachable, |
| 2768 | .undef => { |
| 2769 | try self.genSetReg(value_ty, addr_reg, value); |
| 2770 | }, |
| 2769 | 2771 | .register => |value_reg| { |
| 2770 | 2772 | try self.genStrRegister(value_reg, addr_reg, value_ty); |
| 2771 | 2773 | }, |
| ... | ... | @@ -5816,7 +5818,24 @@ fn airPtrToInt(self: *Self, inst: Air.Inst.Index) !void { |
| 5816 | 5818 | |
| 5817 | 5819 | fn airBitCast(self: *Self, inst: Air.Inst.Index) !void { |
| 5818 | 5820 | const ty_op = self.air.instructions.items(.data)[inst].ty_op; |
| 5819 | | const result = try self.resolveInst(ty_op.operand); |
| 5821 | const result = if (self.liveness.isUnused(inst)) .dead else result: { |
| 5822 | const operand = try self.resolveInst(ty_op.operand); |
| 5823 | if (self.reuseOperand(inst, ty_op.operand, 0, operand)) break :result operand; |
| 5824 | |
| 5825 | const operand_lock = switch (operand) { |
| 5826 | .register, |
| 5827 | .register_c_flag, |
| 5828 | .register_v_flag, |
| 5829 | => |reg| self.register_manager.lockReg(reg), |
| 5830 | else => null, |
| 5831 | }; |
| 5832 | defer if (operand_lock) |lock| self.register_manager.unlockReg(lock); |
| 5833 | |
| 5834 | const dest_ty = self.air.typeOfIndex(inst); |
| 5835 | const dest = try self.allocRegOrMem(dest_ty, true, inst); |
| 5836 | try self.setRegOrMem(dest_ty, dest, operand); |
| 5837 | break :result dest; |
| 5838 | }; |
| 5820 | 5839 | return self.finishAir(inst, result, .{ ty_op.operand, .none, .none }); |
| 5821 | 5840 | } |
| 5822 | 5841 | |