Implement ExactSizeIterator for RegSetIter.
The set of available registers in a register class is known ahead of time. It can be computed with pop-count.
This commit is contained in:
@@ -5,8 +5,9 @@
|
|||||||
//! "register unit" abstraction. Every register contains one or more register units. Registers that
|
//! "register unit" abstraction. Every register contains one or more register units. Registers that
|
||||||
//! share a register unit can't be in use at the same time.
|
//! share a register unit can't be in use at the same time.
|
||||||
|
|
||||||
use std::mem::size_of_val;
|
|
||||||
use isa::registers::{RegUnit, RegUnitMask, RegClass};
|
use isa::registers::{RegUnit, RegUnitMask, RegClass};
|
||||||
|
use std::iter::ExactSizeIterator;
|
||||||
|
use std::mem::size_of_val;
|
||||||
|
|
||||||
/// Set of registers available for allocation.
|
/// Set of registers available for allocation.
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
@@ -128,8 +129,15 @@ impl Iterator for RegSetIter {
|
|||||||
// All of `self.regs` is 0.
|
// All of `self.regs` is 0.
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn size_hint(&self) -> (usize, Option<usize>) {
|
||||||
|
let bits = self.regs.iter().map(|&w| w.count_ones() as usize).sum();
|
||||||
|
(bits, Some(bits))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ExactSizeIterator for RegSetIter {}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
@@ -162,6 +170,7 @@ mod tests {
|
|||||||
let mut regs = AllocatableSet::new();
|
let mut regs = AllocatableSet::new();
|
||||||
|
|
||||||
// `GPR` has units 28-36.
|
// `GPR` has units 28-36.
|
||||||
|
assert_eq!(regs.iter(GPR).len(), 8);
|
||||||
assert_eq!(regs.iter(GPR).count(), 8);
|
assert_eq!(regs.iter(GPR).count(), 8);
|
||||||
assert_eq!(regs.iter(DPR).collect::<Vec<_>>(), [28, 30, 33, 35]);
|
assert_eq!(regs.iter(DPR).collect::<Vec<_>>(), [28, 30, 33, 35]);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user