use crate::instructions::Instruction;
use crate::instructions::test_utils::make_r_type;
use crate::instructions::zicond::ZicondInstruction;
use crate::registers::general_purpose::Reg;
#[test]
fn test_czero_eqz() {
let inst = make_r_type(0b011_0011, 12, 0b101, 10, 11, 0b000_0111);
let decoded = ZicondInstruction::<Reg<u64>>::try_decode(inst);
assert_eq!(
decoded,
Some(ZicondInstruction::CzeroEqz {
rd: Reg::A2,
rs1: Reg::A0,
rs2: Reg::A1,
})
);
}
#[test]
fn test_czero_nez() {
let inst = make_r_type(0b011_0011, 12, 0b111, 10, 11, 0b000_0111);
let decoded = ZicondInstruction::<Reg<u64>>::try_decode(inst);
assert_eq!(
decoded,
Some(ZicondInstruction::CzeroNez {
rd: Reg::A2,
rs1: Reg::A0,
rs2: Reg::A1,
})
);
}
#[test]
fn test_czero_eqz_zero_registers() {
let inst = make_r_type(0b011_0011, 0, 0b101, 0, 0, 0b000_0111);
let decoded = ZicondInstruction::<Reg<u64>>::try_decode(inst);
assert_eq!(
decoded,
Some(ZicondInstruction::CzeroEqz {
rd: Reg::Zero,
rs1: Reg::Zero,
rs2: Reg::Zero,
})
);
}
#[test]
fn test_czero_nez_zero_registers() {
let inst = make_r_type(0b011_0011, 0, 0b111, 0, 0, 0b000_0111);
let decoded = ZicondInstruction::<Reg<u64>>::try_decode(inst);
assert_eq!(
decoded,
Some(ZicondInstruction::CzeroNez {
rd: Reg::Zero,
rs1: Reg::Zero,
rs2: Reg::Zero,
})
);
}
#[test]
fn test_invalid_opcode() {
let inst = make_r_type(0b001_0011, 12, 0b101, 10, 11, 0b000_0111);
let decoded = ZicondInstruction::<Reg<u64>>::try_decode(inst);
assert_eq!(decoded, None);
}
#[test]
fn test_invalid_funct7() {
let inst = make_r_type(0b011_0011, 12, 0b101, 10, 11, 0b000_0000);
let decoded = ZicondInstruction::<Reg<u64>>::try_decode(inst);
assert_eq!(decoded, None);
}
#[test]
fn test_invalid_funct3() {
let inst = make_r_type(0b011_0011, 12, 0b001, 10, 11, 0b000_0111);
let decoded = ZicondInstruction::<Reg<u64>>::try_decode(inst);
assert_eq!(decoded, None);
}