use superh::{BranchTarget, Ins, Options, Reg, Version, parse};
fn opts() -> Options {
Options::default()
}
fn dis(word: u16) -> String {
let ins = parse(word, 0, &opts());
format!("{}", ins.display(&opts()))
}
#[test]
#[cfg(feature = "sh2")]
fn dt() {
let ins = parse(0x4210, 0, &opts());
assert_eq!(ins, Ins::DtRn { rn: Reg::R2 });
assert_eq!(dis(0x4210), "dt r2");
}
#[test]
#[cfg(feature = "sh2")]
fn bts() {
let ins = parse(0x8d03, 0, &opts());
assert_eq!(ins, Ins::Bts { disp: BranchTarget { addr: 10 } });
assert_eq!(dis(0x8d03), "bt.s 0xa");
}
#[test]
#[cfg(feature = "sh2")]
fn braf() {
let ins = parse(0x0023, 0, &opts());
assert_eq!(ins, Ins::BrafRn { rn: Reg::R0 });
assert_eq!(dis(0x0023), "braf r0");
}
#[test]
#[cfg(feature = "sh2")]
fn mul_l() {
let ins = parse(0x0437, 0, &opts());
assert_eq!(ins, Ins::MullRmRn { rn: Reg::R4, rm: Reg::R3 });
}
#[test]
#[cfg(feature = "sh3")]
fn shad() {
let ins = parse(0x432c, 0, &opts());
assert_eq!(ins, Ins::ShadRmRn { rn: Reg::R3, rm: Reg::R2 });
assert_eq!(dis(0x432c), "shad r2, r3");
}
#[test]
#[cfg(feature = "sh3")]
fn shld() {
assert_eq!(dis(0x421d), "shld r1, r2");
}
#[test]
#[cfg(feature = "sh3")]
fn pref() {
let ins = parse(0x0183, 0, &opts());
assert_eq!(ins, Ins::PrefAtRn { rn: Reg::R1 });
}
#[test]
#[cfg(feature = "sh4")]
fn fadd() {
use superh::FReg;
let ins = parse(0xf020, 0, &opts());
assert_eq!(ins, Ins::FaddFrmFrn { frn: FReg::Fr0, frm: FReg::Fr2 });
assert_eq!(dis(0xf020), "fadd fr2, fr0");
}
#[test]
#[cfg(feature = "sh4")]
fn fmov_frm_frn() {
use superh::FReg;
let ins = parse(0xf01c, 0, &opts());
assert_eq!(ins, Ins::FmovFrmFrn { frn: FReg::Fr0, frm: FReg::Fr1 });
assert_eq!(dis(0xf01c), "fmov fr1, fr0");
}
#[test]
#[cfg(feature = "sh4")]
fn fldi0() {
use superh::FReg;
let ins = parse(0xf48d, 0, &opts());
assert_eq!(ins, Ins::Fldi0Frn { frn: FReg::Fr4 });
assert_eq!(dis(0xf48d), "fldi0 fr4");
}
#[test]
#[cfg(feature = "sh4")]
fn float_fpul_frn() {
use superh::FReg;
let ins = parse(0xf02d, 0, &opts());
assert_eq!(ins, Ins::FloatFpulFrn { frn: FReg::Fr0 });
assert_eq!(dis(0xf02d), "float fpul, fr0");
}
#[test]
#[cfg(feature = "sh4")]
fn fschg() {
let ins = parse(0xf3fd, 0, &opts());
assert_eq!(ins, Ins::Fschg);
assert_eq!(dis(0xf3fd), "fschg");
}
#[test]
#[cfg(feature = "sh4")]
fn frchg() {
let ins = parse(0xfbfd, 0, &opts());
assert_eq!(ins, Ins::Frchg);
}
#[test]
#[cfg(feature = "sh4")]
fn fsrra() {
use superh::FReg;
let ins = parse(0xf07d, 0, &opts());
assert_eq!(ins, Ins::FsrraFrn { frn: FReg::Fr0 });
assert_eq!(dis(0xf07d), "fsrra fr0");
}
#[test]
#[cfg(feature = "sh4")]
fn fsca() {
use superh::DReg;
let ins = parse(0xf0fd, 0, &opts());
assert_eq!(ins, Ins::FscaFpulDrn { drn: DReg::Dr0 });
assert_eq!(dis(0xf0fd), "fsca fpul, dr0");
}
#[test]
#[cfg(feature = "sh4")]
fn fcmp_eq() {
use superh::FReg;
let ins = parse(0xf014, 0, &opts());
assert_eq!(ins, Ins::FcmpeqFrmFrn { frn: FReg::Fr0, frm: FReg::Fr1 });
assert_eq!(format!("{}", ins.display(&opts())), "fcmp/eq fr1, fr0");
}
#[test]
#[cfg(feature = "sh4")]
fn fmov_at_rm_frn() {
assert_eq!(format!("{}", parse(0xf018, 0, &opts()).display(&opts())), "fmov @r1, fr0");
}
#[test]
#[cfg(feature = "sh4")]
fn fmov_at_r0_rm_frn_display() {
assert_eq!(format!("{}", parse(0xf016, 0, &opts()).display(&opts())), "fmov @(r0, r1), fr0");
}
#[test]
#[cfg(feature = "sh4")]
fn fmov_frm_at_r0_rn_display() {
assert_eq!(format!("{}", parse(0xf107, 0, &opts()).display(&opts())), "fmov fr0, @(r0, r1)");
}
#[test]
#[cfg(feature = "sh4")]
fn fipr() {
use superh::VecReg;
let ins = parse(0xf1ed, 0, &opts());
assert_eq!(ins, Ins::FiprFvmFvn { fvn: VecReg::Fv0, fvm: VecReg::Fv4 });
assert_eq!(format!("{}", ins.display(&opts())), "fipr fv4, fv0");
}
#[test]
#[cfg(feature = "sh4")]
fn ftrv() {
use superh::VecReg;
let ins = parse(0xf1fd, 0, &opts());
assert_eq!(ins, Ins::FtrvXmtrxFvn { fvn: VecReg::Fv0 });
assert_eq!(format!("{}", ins.display(&opts())), "ftrv xmtrx, fv0");
}
#[test]
#[cfg(feature = "sh4")]
fn runtime_version_filters_sh4_when_set_to_sh2() {
let opts = Options { version: Version::Sh2, ..Options::default() };
let ins = parse(0xf020, 0, &opts);
assert_eq!(ins, Ins::Word(0xf020));
}
#[test]
#[cfg(feature = "sh4")]
fn runtime_version_allows_sh2_instruction_when_set_to_sh4() {
let opts = Options { version: Version::Sh4, ..Options::default() };
let ins = parse(0x4210, 0, &opts);
assert_eq!(ins, Ins::DtRn { rn: Reg::R2 });
}
#[test]
#[cfg(feature = "sh3")]
fn runtime_version_filters_sh3_when_set_to_sh1() {
let opts = Options { version: Version::Sh1, ..Options::default() };
let ins = parse(0x432c, 0, &opts);
assert_eq!(ins, Ins::Word(0x432c));
}