use crate::RegisterFile;
use crate::rv64::test_utils::{execute, initialize_state};
use ab_riscv_primitives::prelude::*;
#[test]
fn test_xperm4_basic() {
let mut state = initialize_state([Rv64ZbkxInstruction::Xperm4 {
rd: Reg::A2,
rs1: Reg::A0,
rs2: Reg::A1,
}]);
state.regs.write(Reg::A0, 0xFEDCBA9876543210u64);
state.regs.write(Reg::A1, 0xFEDCBA9876543210u64);
execute(&mut state).unwrap();
assert_eq!(state.regs.read(Reg::A2), 0xFEDCBA9876543210u64);
}
#[test]
fn test_xperm4_constant_index() {
let mut state = initialize_state([Rv64ZbkxInstruction::Xperm4 {
rd: Reg::A2,
rs1: Reg::A0,
rs2: Reg::A1,
}]);
state.regs.write(Reg::A0, 0x000000000000A000u64);
state.regs.write(Reg::A1, 0x3333333333333333u64);
execute(&mut state).unwrap();
assert_eq!(state.regs.read(Reg::A2), 0xAAAAAAAAAAAAAAAAu64);
}
#[test]
fn test_xperm4_no_out_of_bounds() {
let mut state = initialize_state([Rv64ZbkxInstruction::Xperm4 {
rd: Reg::A2,
rs1: Reg::A0,
rs2: Reg::A1,
}]);
state.regs.write(Reg::A0, 0xFEDCBA9876543210u64);
state.regs.write(Reg::A1, 0xFFFFFFFFFFFFFFFFu64);
execute(&mut state).unwrap();
assert_eq!(state.regs.read(Reg::A2), 0xFFFFFFFFFFFFFFFFu64);
}
#[test]
fn test_xperm4_zero_lut() {
let mut state = initialize_state([Rv64ZbkxInstruction::Xperm4 {
rd: Reg::A2,
rs1: Reg::A0,
rs2: Reg::A1,
}]);
state.regs.write(Reg::A0, 0x0u64);
state.regs.write(Reg::A1, 0xFEDCBA9876543210u64);
execute(&mut state).unwrap();
assert_eq!(state.regs.read(Reg::A2), 0x0u64);
}
#[test]
fn test_xperm8_basic() {
let mut state = initialize_state([Rv64ZbkxInstruction::Xperm8 {
rd: Reg::A2,
rs1: Reg::A0,
rs2: Reg::A1,
}]);
state.regs.write(Reg::A0, 0x80_70_60_50_40_30_20_10u64);
state.regs.write(Reg::A1, 0x03_02_01_00_03_02_01_00u64);
execute(&mut state).unwrap();
assert_eq!(state.regs.read(Reg::A2), 0x40_30_20_10_40_30_20_10u64);
}
#[test]
fn test_xperm8_out_of_bounds_zeroed() {
let mut state = initialize_state([Rv64ZbkxInstruction::Xperm8 {
rd: Reg::A2,
rs1: Reg::A0,
rs2: Reg::A1,
}]);
state.regs.write(Reg::A0, 0x08_07_06_05_04_03_02_01u64);
state.regs.write(Reg::A1, 0xFF_10_09_08_00_00_00_00u64);
execute(&mut state).unwrap();
assert_eq!(state.regs.read(Reg::A2), 0x00_00_00_00_01_01_01_01u64);
}
#[test]
fn test_xperm8_identity() {
let mut state = initialize_state([Rv64ZbkxInstruction::Xperm8 {
rd: Reg::A2,
rs1: Reg::A0,
rs2: Reg::A1,
}]);
let lut = 0xDE_AD_BE_EF_CA_FE_BA_BEu64;
state.regs.write(Reg::A0, lut);
state.regs.write(Reg::A1, 0x07_06_05_04_03_02_01_00u64);
execute(&mut state).unwrap();
assert_eq!(state.regs.read(Reg::A2), lut);
}
#[test]
fn test_xperm8_reverse() {
let mut state = initialize_state([Rv64ZbkxInstruction::Xperm8 {
rd: Reg::A2,
rs1: Reg::A0,
rs2: Reg::A1,
}]);
state.regs.write(Reg::A0, 0x08_07_06_05_04_03_02_01u64);
state.regs.write(Reg::A1, 0x00_01_02_03_04_05_06_07u64);
execute(&mut state).unwrap();
assert_eq!(state.regs.read(Reg::A2), 0x01_02_03_04_05_06_07_08u64);
}