Check a register.
(&mut self, reg: PhysReg)
| 318 | |
| 319 | /// Check a register. |
| 320 | fn check_reg(&mut self, reg: PhysReg) -> Result<()> { |
| 321 | // Non-allocatable registers have no constraints. |
| 322 | if let Some(bank) = self.reginfo.bank_for_reg(reg) { |
| 323 | self.check_entity(Entity::RegBank(bank))?; |
| 324 | ensure!( |
| 325 | self.reginfo.reg_units(reg).count() != 0, |
| 326 | "{reg}: Allocatable register must have at least 1 register unit" |
| 327 | ); |
| 328 | |
| 329 | ensure!( |
| 330 | self.reginfo.reg_units(reg).count() <= MAX_UNITS_PER_REG, |
| 331 | "{reg} has too many register units (max is {MAX_UNITS_PER_REG})" |
| 332 | ); |
| 333 | |
| 334 | for unit in self.reginfo.reg_units(reg) { |
| 335 | self.check_entity(Entity::RegUnit(unit))?; |
| 336 | ensure!( |
| 337 | !self.bank_units[bank].contains(unit), |
| 338 | "{unit} in {reg} overlaps with other registers in {bank}" |
| 339 | ); |
| 340 | self.bank_units[bank].insert(unit); |
| 341 | } |
| 342 | } |
| 343 | |
| 344 | Ok(()) |
| 345 | } |
| 346 | |
| 347 | /// Check a register group. |
| 348 | fn check_reg_group(&mut self, group: RegGroup) -> Result<()> { |
no test coverage detected