use synth_backend::ArmEncoder;
use synth_synthesis::rules::{ArmOp, Condition, Reg};
fn enc(rd: Reg, rm: Reg, cond: Condition) -> Vec<u8> {
ArmEncoder::new_thumb2()
.encode(&ArmOp::SelectMove { rd, rm, cond })
.expect("encode SelectMove")
}
#[test]
fn select_move_signed_pair_lt_ge_bytes() {
assert_eq!(
enc(Reg::R4, Reg::R5, Condition::LT),
vec![0xB8, 0xBF, 0x2C, 0x46]
);
assert_eq!(
enc(Reg::R4, Reg::R5, Condition::GE),
vec![0xA8, 0xBF, 0x2C, 0x46]
);
}
#[test]
fn select_move_unsigned_pair_lo_hs_bytes() {
assert_eq!(
enc(Reg::R4, Reg::R6, Condition::LO),
vec![0x38, 0xBF, 0x34, 0x46]
);
assert_eq!(
enc(Reg::R4, Reg::R6, Condition::HS),
vec![0x28, 0xBF, 0x34, 0x46]
);
}
#[test]
fn select_move_all_ten_conditions_are_distinct_single_then_it_blocks() {
use Condition::*;
let conds = [EQ, NE, LT, LE, GT, GE, LO, LS, HI, HS];
let mut seen = std::collections::BTreeSet::new();
for c in conds {
let bytes = enc(Reg::R0, Reg::R1, c);
assert_eq!(bytes.len(), 4, "{c:?}: IT + MOV is 4 bytes");
let it = u16::from_le_bytes([bytes[0], bytes[1]]);
assert_eq!(it & 0xFF0F, 0xBF08, "{c:?}: not a single-Then IT block");
let firstcond = (it >> 4) & 0xF;
assert!(
seen.insert(firstcond),
"{c:?}: duplicate IT firstcond {firstcond:#x}"
);
}
assert_eq!(
seen.len(),
10,
"all 10 conditions encode to distinct firstcond"
);
}