Creates register groups from the given registers.
(&mut self, group_size: usize, members: &[PhysReg])
| 260 | |
| 261 | /// Creates register groups from the given registers. |
| 262 | fn gen_groups(&mut self, group_size: usize, members: &[PhysReg]) -> Result<Vec<RegGroup>> { |
| 263 | // Start with all members at every group index. |
| 264 | let mut all = vec![members.to_vec(); group_size]; |
| 265 | |
| 266 | // Fix up lists to ensure that the same register is not used multiple |
| 267 | // times in a group. |
| 268 | let mut temp = vec![]; |
| 269 | for group_idx in 1..group_size { |
| 270 | for idx in 0..members.len() { |
| 271 | while (0..group_idx) |
| 272 | .map(|i| all[i][idx]) |
| 273 | .any(|r| r == all[group_idx][idx]) |
| 274 | { |
| 275 | temp.push(all[group_idx].swap_remove(idx)); |
| 276 | } |
| 277 | all[group_idx].append(&mut temp); |
| 278 | } |
| 279 | } |
| 280 | |
| 281 | // Create the register groups |
| 282 | let mut out = vec![]; |
| 283 | #[allow(clippy::needless_range_loop)] |
| 284 | for i in 0..all.len() { |
| 285 | let regs = (0..group_size).map(|group_idx| all[group_idx][i]).collect(); |
| 286 | let group = self.reginfo.groups.push(RegGroupData { regs }); |
| 287 | out.push(group); |
| 288 | } |
| 289 | |
| 290 | Ok(out) |
| 291 | } |
| 292 | |
| 293 | /// Creates a new register in a bank, making sure it doesn't share a unit |
| 294 | /// with an existing register in the bank. |
no test coverage detected