| ... | ... | @@ -3958,7 +3958,9 @@ fn store(self: *Self, ptr: MCValue, value: MCValue, ptr_ty: Type, value_ty: Type |
| 3958 | 3958 | |
| 3959 | 3959 | switch (value) { |
| 3960 | 3960 | .dead => unreachable, |
| 3961 | | .undef => unreachable, |
| 3961 | .undef => { |
| 3962 | try self.genSetReg(value_ty, addr_reg, value); |
| 3963 | }, |
| 3962 | 3964 | .register => |value_reg| { |
| 3963 | 3965 | log.debug("store: register {} to {}", .{ value_reg, addr_reg }); |
| 3964 | 3966 | try self.genStrRegister(value_reg, addr_reg, value_ty); |
| ... | ... | @@ -5870,7 +5872,22 @@ fn airPtrToInt(self: *Self, inst: Air.Inst.Index) !void { |
| 5870 | 5872 | |
| 5871 | 5873 | fn airBitCast(self: *Self, inst: Air.Inst.Index) !void { |
| 5872 | 5874 | const ty_op = self.air.instructions.items(.data)[inst].ty_op; |
| 5873 | | const result = try self.resolveInst(ty_op.operand); |
| 5875 | const result = if (self.liveness.isUnused(inst)) .dead else result: { |
| 5876 | const operand = try self.resolveInst(ty_op.operand); |
| 5877 | if (self.reuseOperand(inst, ty_op.operand, 0, operand)) break :result operand; |
| 5878 | |
| 5879 | const operand_lock = switch (operand) { |
| 5880 | .register => |reg| self.register_manager.lockReg(reg), |
| 5881 | .register_with_overflow => |rwo| self.register_manager.lockReg(rwo.reg), |
| 5882 | else => null, |
| 5883 | }; |
| 5884 | defer if (operand_lock) |lock| self.register_manager.unlockReg(lock); |
| 5885 | |
| 5886 | const dest_ty = self.air.typeOfIndex(inst); |
| 5887 | const dest = try self.allocRegOrMem(dest_ty, true, inst); |
| 5888 | try self.setRegOrMem(dest_ty, dest, operand); |
| 5889 | break :result dest; |
| 5890 | }; |
| 5874 | 5891 | return self.finishAir(inst, result, .{ ty_op.operand, .none, .none }); |
| 5875 | 5892 | } |
| 5876 | 5893 | |