use crate::rv64::test_utils::{execute, initialize_state};
use ab_riscv_primitives::prelude::*;
#[test]
fn test_pack() {
let mut state = initialize_state([Rv64ZbkbInstruction::Pack {
rd: Reg::A2,
rs1: Reg::A0,
rs2: Reg::A1,
}]);
state.regs.write(Reg::A0, 0xDEAD_BEEF_1234_5678u64);
state.regs.write(Reg::A1, 0xCAFE_BABE_ABCD_EF01u64);
execute(&mut state).unwrap();
assert_eq!(state.regs.read(Reg::A2), 0xABCD_EF01_1234_5678u64);
}
#[test]
fn test_pack_zeros() {
let mut state = initialize_state([Rv64ZbkbInstruction::Pack {
rd: Reg::A2,
rs1: Reg::A0,
rs2: Reg::A1,
}]);
state.regs.write(Reg::A0, 0);
state.regs.write(Reg::A1, 0);
execute(&mut state).unwrap();
assert_eq!(state.regs.read(Reg::A2), 0);
}
#[test]
fn test_packh() {
let mut state = initialize_state([Rv64ZbkbInstruction::Packh {
rd: Reg::A2,
rs1: Reg::A0,
rs2: Reg::A1,
}]);
state.regs.write(Reg::A0, 0xFFFF_FFFF_FFFF_FF42u64);
state.regs.write(Reg::A1, 0xFFFF_FFFF_FFFF_FF37u64);
execute(&mut state).unwrap();
assert_eq!(state.regs.read(Reg::A2), 0x0000_0000_0000_3742u64);
}
#[test]
fn test_packh_only_low_bytes() {
let mut state = initialize_state([Rv64ZbkbInstruction::Packh {
rd: Reg::A2,
rs1: Reg::A0,
rs2: Reg::A1,
}]);
state.regs.write(Reg::A0, 0xAB);
state.regs.write(Reg::A1, 0xCD);
execute(&mut state).unwrap();
assert_eq!(state.regs.read(Reg::A2), 0xCDABu64);
}
#[test]
fn test_packw() {
let mut state = initialize_state([Rv64ZbkbInstruction::Packw {
rd: Reg::A2,
rs1: Reg::A0,
rs2: Reg::A1,
}]);
state.regs.write(Reg::A0, 0xFFFF_FFFF_FFFF_1234u64);
state.regs.write(Reg::A1, 0xFFFF_FFFF_FFFF_5678u64);
execute(&mut state).unwrap();
assert_eq!(state.regs.read(Reg::A2), 0x0000_0000_5678_1234u64);
}
#[test]
fn test_packw_sign_extension() {
let mut state = initialize_state([Rv64ZbkbInstruction::Packw {
rd: Reg::A2,
rs1: Reg::A0,
rs2: Reg::A1,
}]);
state.regs.write(Reg::A0, 0x0000u64);
state.regs.write(Reg::A1, 0x8000u64);
execute(&mut state).unwrap();
assert_eq!(state.regs.read(Reg::A2), 0xFFFF_FFFF_8000_0000u64);
}
#[test]
fn test_brev8() {
let mut state = initialize_state([Rv64ZbkbInstruction::Brev8 {
rd: Reg::A2,
rs1: Reg::A0,
}]);
state.regs.write(Reg::A0, 0x0807_0605_0403_0201u64);
execute(&mut state).unwrap();
assert_eq!(state.regs.read(Reg::A2), 0x10E0_60A0_20C0_4080u64);
}
#[test]
fn test_brev8_all_ones() {
let mut state = initialize_state([Rv64ZbkbInstruction::Brev8 {
rd: Reg::A2,
rs1: Reg::A0,
}]);
state.regs.write(Reg::A0, 0xFFFF_FFFF_FFFF_FFFFu64);
execute(&mut state).unwrap();
assert_eq!(state.regs.read(Reg::A2), 0xFFFF_FFFF_FFFF_FFFFu64);
}
#[test]
fn test_brev8_single_byte() {
let mut state = initialize_state([Rv64ZbkbInstruction::Brev8 {
rd: Reg::A2,
rs1: Reg::A0,
}]);
state.regs.write(Reg::A0, 0x01u64);
execute(&mut state).unwrap();
assert_eq!(state.regs.read(Reg::A2), 0x80u64);
}
#[test]
fn test_brev8_zero() {
let mut state = initialize_state([Rv64ZbkbInstruction::Brev8 {
rd: Reg::A2,
rs1: Reg::A0,
}]);
state.regs.write(Reg::A0, 0u64);
execute(&mut state).unwrap();
assert_eq!(state.regs.read(Reg::A2), 0u64);
}