Helper function to compute superclasses for a register class.
(class: RegClass, reginfo: &impl RegInfo)
| 199 | |
| 200 | /// Helper function to compute superclasses for a register class. |
| 201 | fn superclasses(class: RegClass, reginfo: &impl RegInfo) -> RegClassSet { |
| 202 | // Collect all transitive superclass: all classes that have this class as |
| 203 | // a subclass. |
| 204 | let mut superclasses = RegClassSet::new(); |
| 205 | for superclass in reginfo.classes() { |
| 206 | // Exclude the current class. |
| 207 | if superclass == class { |
| 208 | break; |
| 209 | } |
| 210 | |
| 211 | if reginfo.sub_classes(superclass).contains(class) { |
| 212 | superclasses.insert(superclass); |
| 213 | } |
| 214 | } |
| 215 | |
| 216 | // Only keep direct superclasses: if a superclass includes a different |
| 217 | // superclass then it is redundant. |
| 218 | let mut direct_superclasses = superclasses; |
| 219 | for superclass in superclasses { |
| 220 | if (reginfo.sub_classes(superclass) & superclasses).count() > 1 { |
| 221 | direct_superclasses.remove(superclass); |
| 222 | } |
| 223 | } |
| 224 | |
| 225 | direct_superclasses |
| 226 | } |
| 227 | |
| 228 | impl<R: RegInfo> fmt::Display for DisplayRegInfo<'_, R> { |
| 229 | fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |