diff options
| author | iximeow <me@iximeow.net> | 2026-07-28 02:53:04 +0000 |
|---|---|---|
| committer | iximeow <me@iximeow.net> | 2026-07-28 07:28:15 +0000 |
| commit | 1c03f9be10d03c63d9c6eed1e56333763fee628d (patch) | |
| tree | 59ddcdce9e6d52c0aaf80465f637363569050890 /differential-tests | |
| parent | 5581435b4edc8836e172a5088d74d2ec97b2bc99 (diff) | |
temp, armv8-thumb
Diffstat (limited to 'differential-tests')
| -rw-r--r-- | differential-tests/tests/differential-v7-thumb.rs | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/differential-tests/tests/differential-v7-thumb.rs b/differential-tests/tests/differential-v7-thumb.rs index 84f8afc..86804a1 100644 --- a/differential-tests/tests/differential-v7-thumb.rs +++ b/differential-tests/tests/differential-v7-thumb.rs @@ -488,7 +488,7 @@ fn capstone_differential_thumb() { let i = i as u32; let bytes = &i.to_le_bytes(); if i % 0x01_00_00_00 == 0 { - eprintln!("case {:08x}", i); +// eprintln!("case {:08x}", i); } // let res = cs.disasm_all(bytes, 0); @@ -529,7 +529,7 @@ fn capstone_differential_thumb() { if let Ok(inst) = yax_res { write!(yax_text, "{}", inst).unwrap(); } else if let Err(yaxpeax_arm::armv7::DecodeError::Incomplete) = yax_res { - stats.missed_incomplete.fetch_add(1, Ordering::Relaxed); + // stats.missed_incomplete.fetch_add(1, Ordering::Relaxed); continue; } else { let word = i; @@ -644,7 +644,24 @@ fn capstone_differential_thumb() { } } - if true { + // TODO: yax probably should simply write `stm` in this case like the + // manual implies and capstone does. + if parsed_yax.opcode == "stmia" && parsed_cs.opcode == "stm" + && parsed_yax.operands == parsed_cs.operands { + return true; + } + + static BRANCHES: &'static [&'static str] = &[ + "bgt", "bhi", "b", "ble", "bge", "blt", "bge", + "bhs", "blo", "beq", "bne", "bpl", "bmi", "bvc", + "bvs", "bls", "bfi", "b.w","blx.w", + ]; + if BRANCHES.contains(&parsed_yax.opcode.as_str()) && parsed_yax.opcode == parsed_cs.opcode { + // TODO: the harness doesn't relativeizie branch targets? + return true; + } + + if false { eprintln!("yax: {} -> {:?}", yax_text, parsed_yax); eprintln!("cs: {} -> {:?}", cs_text, parsed_cs); } @@ -654,8 +671,8 @@ fn capstone_differential_thumb() { // eprintln!("{}", yax_text); if !acceptable_match(i, &yax_text, &cs_text) { - eprintln!("disassembly mismatch: {} != {}. bytes: {:x?}", yax_text, cs_text, bytes); - std::process::abort(); +// eprintln!("disassembly mismatch: {} != {}. bytes: {:x?}", yax_text, cs_text, bytes); +// std::process::abort(); stats.mismatch.fetch_add(1, Ordering::Relaxed); } else { stats.good.fetch_add(1, Ordering::Relaxed); @@ -684,7 +701,7 @@ fn capstone_differential_thumb() { let stats = Arc::new(stats); -// test_range(0x00_00_00_00, 0xff_ff_ff_ff, Arc::clone(&stats)); + // test_range(0x00_00_00_00, 0xff_ff_ff_ff, Arc::clone(&stats)); for i in 0..NR_THREADS { let stats = Arc::clone(&stats); |
