| use super::*; |
| |
| #[test] |
| fn simple_direct() { |
| let mut value = cache::Initializer::default(); |
| value.set(Feature::f as u32); |
| // F (and other extensions with CSRs) -> Zicsr |
| assert!(imply_features(value).test(Feature::zicsr as u32)); |
| } |
| |
| #[test] |
| fn simple_indirect() { |
| let mut value = cache::Initializer::default(); |
| value.set(Feature::q as u32); |
| // Q -> D, D -> F, F -> Zicsr |
| assert!(imply_features(value).test(Feature::zicsr as u32)); |
| } |
| |
| #[test] |
| fn complex_zcd() { |
| let mut value = cache::Initializer::default(); |
| // C & D -> Zcd |
| value.set(Feature::c as u32); |
| assert!(!imply_features(value).test(Feature::zcd as u32)); |
| value.set(Feature::d as u32); |
| assert!(imply_features(value).test(Feature::zcd as u32)); |
| } |
| |
| #[test] |
| fn group_simple_forward() { |
| let mut value = cache::Initializer::default(); |
| // A -> Zalrsc & Zaamo (forward implication) |
| value.set(Feature::a as u32); |
| let value = imply_features(value); |
| assert!(value.test(Feature::zalrsc as u32)); |
| assert!(value.test(Feature::zaamo as u32)); |
| } |
| |
| #[test] |
| fn group_simple_backward() { |
| let mut value = cache::Initializer::default(); |
| // Zalrsc & Zaamo -> A (reverse implication) |
| value.set(Feature::zalrsc as u32); |
| value.set(Feature::zaamo as u32); |
| assert!(imply_features(value).test(Feature::a as u32)); |
| } |
| |
| #[test] |
| fn group_complex_convergence() { |
| let mut value = cache::Initializer::default(); |
| // Needs 3 iterations to converge |
| // (and 4th iteration for convergence checking): |
| // 1. [Zvksc] -> Zvks & Zvbc |
| // 2. Zvks -> Zvksed & Zvksh & Zvkb & Zvkt |
| // 3a. [Zvkned] & [Zvknhb] & [Zvkb] & Zvkt -> {Zvkn} |
| // 3b. Zvkn & Zvbc -> {Zvknc} |
| value.set(Feature::zvksc as u32); |
| value.set(Feature::zvkned as u32); |
| value.set(Feature::zvknhb as u32); |
| value.set(Feature::zvkb as u32); |
| let value = imply_features(value); |
| assert!(value.test(Feature::zvkn as u32)); |
| assert!(value.test(Feature::zvknc as u32)); |
| } |