use crate::rv64::test_utils::{TestInterpreterState, initialize_state};
use crate::v::vector_registers::{VectorRegisters, VectorRegistersExt};
use crate::{ExecutableInstruction, ExecutionError};
use ab_riscv_primitives::prelude::*;
fn encode_vtype(vsew: Vsew, vlmul: Vlmul) -> u64 {
(vlmul.to_bits() as u64) | ((vsew.to_bits() as u64) << 3)
}
fn setup(
vl: u32,
vsew: Vsew,
vlmul: Vlmul,
) -> TestInterpreterState<Zve64xWidenNarrowInstruction<Reg<u64>>> {
let mut state = initialize_state([]);
state.ext_state.init_vector_csrs();
let vtype = Vtype::from_raw::<Reg<u64>>(encode_vtype(vsew, vlmul)).unwrap();
state.ext_state.set_vtype(Some(vtype));
state.ext_state.set_vl(vl);
state.ext_state.set_vstart(0);
state
}
fn exec(
state: &mut TestInterpreterState<Zve64xWidenNarrowInstruction<Reg<u64>>>,
instr: Zve64xWidenNarrowInstruction<Reg<u64>>,
) -> Result<(), ExecutionError<u64>> {
instr.execute(state).map(|_| ())
}
fn read_elem(
state: &TestInterpreterState<Zve64xWidenNarrowInstruction<Reg<u64>>>,
base_reg: VReg,
elem_i: usize,
sew: Vsew,
) -> u64 {
let sew_bytes = usize::from(sew.bytes());
let elems_per_reg = 16 / sew_bytes;
let reg_off = elem_i / elems_per_reg;
let byte_off = (elem_i % elems_per_reg) * sew_bytes;
let reg = &state.ext_state.read_vreg()[usize::from(base_reg.bits()) + reg_off];
let mut buf = [0u8; 8];
buf[..sew_bytes].copy_from_slice(®[byte_off..byte_off + sew_bytes]);
u64::from_le_bytes(buf)
}
fn write_elem(
state: &mut TestInterpreterState<Zve64xWidenNarrowInstruction<Reg<u64>>>,
base_reg: VReg,
elem_i: usize,
sew: Vsew,
value: u64,
) {
let sew_bytes = usize::from(sew.bytes());
let elems_per_reg = 16 / sew_bytes;
let reg_off = elem_i / elems_per_reg;
let byte_off = (elem_i % elems_per_reg) * sew_bytes;
let reg = &mut state.ext_state.write_vreg()[usize::from(base_reg.bits()) + reg_off];
let buf = value.to_le_bytes();
reg[byte_off..byte_off + sew_bytes].copy_from_slice(&buf[..sew_bytes]);
}
fn write_mask(state: &mut TestInterpreterState<Zve64xWidenNarrowInstruction<Reg<u64>>>, bits: u32) {
let reg = &mut state.ext_state.write_vreg()[0];
reg.fill(0);
for i in 0..32 {
if (bits >> i) & 1 != 0 {
reg[(i / u8::BITS) as usize] |= 1 << (i % u8::BITS);
}
}
}
#[test]
fn vwaddu_vv_e8_m1_zero_extends() {
let mut state = setup(4, Vsew::E8, Vlmul::M1);
for i in 0..4usize {
write_elem(&mut state, VReg::V2, i, Vsew::E8, 0xff);
write_elem(&mut state, VReg::V4, i, Vsew::E8, 1);
}
exec(
&mut state,
Zve64xWidenNarrowInstruction::VwadduVv {
vd: VReg::V8,
vs2: VReg::V2,
vs1: VReg::V4,
vm: true,
},
)
.unwrap();
for i in 0..4usize {
assert_eq!(
read_elem(&state, VReg::V8, i, Vsew::E16),
0x0100u64,
"elem {i}"
);
}
assert_eq!(state.ext_state.vs_dirty_count(), 1);
assert_eq!(state.ext_state.vstart(), 0);
}
#[test]
fn vwaddu_vv_e16_m1_basic() {
let mut state = setup(4, Vsew::E16, Vlmul::M1);
for i in 0..4usize {
write_elem(&mut state, VReg::V2, i, Vsew::E16, 1000);
write_elem(&mut state, VReg::V4, i, Vsew::E16, 2000);
}
exec(
&mut state,
Zve64xWidenNarrowInstruction::VwadduVv {
vd: VReg::V8,
vs2: VReg::V2,
vs1: VReg::V4,
vm: true,
},
)
.unwrap();
for i in 0..4usize {
assert_eq!(read_elem(&state, VReg::V8, i, Vsew::E32), 3000, "elem {i}");
}
}
#[test]
fn vwaddu_vv_e32_m1_basic() {
let mut state = setup(2, Vsew::E32, Vlmul::M1);
write_elem(&mut state, VReg::V2, 0, Vsew::E32, 0xffff_ffff);
write_elem(&mut state, VReg::V4, 0, Vsew::E32, 1);
write_elem(&mut state, VReg::V2, 1, Vsew::E32, 0xffff_ffff);
write_elem(&mut state, VReg::V4, 1, Vsew::E32, 0xffff_ffff);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VwadduVv {
vd: VReg::V8,
vs2: VReg::V2,
vs1: VReg::V4,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V8, 0, Vsew::E64), 0x1_0000_0000u64);
assert_eq!(read_elem(&state, VReg::V8, 1, Vsew::E64), 0x1_ffff_fffe);
}
#[test]
fn vwaddu_vx_e8_m1_zero_extends_scalar() {
let mut state = setup(2, Vsew::E8, Vlmul::M1);
write_elem(&mut state, VReg::V2, 0, Vsew::E8, 0x80);
write_elem(&mut state, VReg::V2, 1, Vsew::E8, 0x01);
state.regs.write(Reg::A0, 0x80u64);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VwadduVx {
vd: VReg::V8,
vs2: VReg::V2,
rs1: Reg::A0,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V8, 0, Vsew::E16), 0x100u64);
assert_eq!(read_elem(&state, VReg::V8, 1, Vsew::E16), 0x81u64);
}
#[test]
fn vwaddu_vx_e8_m1_scalar_not_truncated_to_sew() {
let mut state = setup(2, Vsew::E8, Vlmul::M1);
write_elem(&mut state, VReg::V2, 0, Vsew::E8, 0x01);
write_elem(&mut state, VReg::V2, 1, Vsew::E8, 0x00);
state.regs.write(Reg::A0, 0x1ffu64);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VwadduVx {
vd: VReg::V8,
vs2: VReg::V2,
rs1: Reg::A0,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V8, 0, Vsew::E16), 0x200u64);
assert_eq!(read_elem(&state, VReg::V8, 1, Vsew::E16), 0x1ffu64);
}
#[test]
fn vwadd_vv_e8_m1_sign_extends() {
let mut state = setup(2, Vsew::E8, Vlmul::M1);
write_elem(&mut state, VReg::V2, 0, Vsew::E8, 0xff);
write_elem(&mut state, VReg::V4, 0, Vsew::E8, 0xff);
write_elem(&mut state, VReg::V2, 1, Vsew::E8, 0x7f);
write_elem(&mut state, VReg::V4, 1, Vsew::E8, 0x01);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VwaddVv {
vd: VReg::V8,
vs2: VReg::V2,
vs1: VReg::V4,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V8, 0, Vsew::E16), 0xfffeu64);
assert_eq!(read_elem(&state, VReg::V8, 1, Vsew::E16), 0x0080u64);
}
#[test]
fn vwadd_vv_e32_m1_sign_extends() {
let mut state = setup(2, Vsew::E32, Vlmul::M1);
write_elem(&mut state, VReg::V2, 0, Vsew::E32, 0xffff_ffff);
write_elem(&mut state, VReg::V4, 0, Vsew::E32, 1);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VwaddVv {
vd: VReg::V8,
vs2: VReg::V2,
vs1: VReg::V4,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V8, 0, Vsew::E64), 0u64);
}
#[test]
fn vwadd_vx_e16_m1_sign_extends_scalar() {
let mut state = setup(2, Vsew::E16, Vlmul::M1);
write_elem(&mut state, VReg::V2, 0, Vsew::E16, 0x8000);
state.regs.write(Reg::A1, u64::MAX);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VwaddVx {
vd: VReg::V8,
vs2: VReg::V2,
rs1: Reg::A1,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V8, 0, Vsew::E32), 0xffff_7fffu64);
}
#[test]
fn vwadd_vx_e8_m1_scalar_sign_extended_from_xlen_not_sew() {
let mut state = setup(1, Vsew::E8, Vlmul::M1);
write_elem(&mut state, VReg::V2, 0, Vsew::E8, 0x01);
state.regs.write(Reg::A0, 0x1ffu64);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VwaddVx {
vd: VReg::V8,
vs2: VReg::V2,
rs1: Reg::A0,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V8, 0, Vsew::E16), 0x0200u64);
}
#[test]
fn vwadd_vx_e8_m1_negative_xlen_scalar() {
let mut state = setup(1, Vsew::E8, Vlmul::M1);
write_elem(&mut state, VReg::V2, 0, Vsew::E8, 0x01);
state.regs.write(Reg::A0, u64::MAX);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VwaddVx {
vd: VReg::V8,
vs2: VReg::V2,
rs1: Reg::A0,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V8, 0, Vsew::E16), 0u64);
}
#[test]
fn vwsubu_vv_e8_m1_zero_extends() {
let mut state = setup(2, Vsew::E8, Vlmul::M1);
write_elem(&mut state, VReg::V2, 0, Vsew::E8, 1);
write_elem(&mut state, VReg::V4, 0, Vsew::E8, 2);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VwsubuVv {
vd: VReg::V8,
vs2: VReg::V2,
vs1: VReg::V4,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V8, 0, Vsew::E16), 0xffffu64);
}
#[test]
fn vwsub_vv_e8_m1_sign_extends() {
let mut state = setup(2, Vsew::E8, Vlmul::M1);
write_elem(&mut state, VReg::V2, 0, Vsew::E8, 0x80);
write_elem(&mut state, VReg::V4, 0, Vsew::E8, 0x81);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VwsubVv {
vd: VReg::V8,
vs2: VReg::V2,
vs1: VReg::V4,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V8, 0, Vsew::E16), 0xffffu64);
}
#[test]
fn vwsub_vx_e32_m1_sign_extends() {
let mut state = setup(1, Vsew::E32, Vlmul::M1);
write_elem(&mut state, VReg::V2, 0, Vsew::E32, 0x8000_0000);
state.regs.write(Reg::A0, u64::MAX);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VwsubVx {
vd: VReg::V8,
vs2: VReg::V2,
rs1: Reg::A0,
vm: true,
},
)
.unwrap();
assert_eq!(
read_elem(&state, VReg::V8, 0, Vsew::E64),
0xffff_ffff_8000_0001u64
);
}
#[test]
fn vwaddu_wv_e8_m1_wide_plus_narrow() {
let mut state = setup(4, Vsew::E8, Vlmul::M1);
for i in 0..4usize {
write_elem(&mut state, VReg::V8, i, Vsew::E16, 1000);
write_elem(&mut state, VReg::V4, i, Vsew::E8, 0xff);
}
exec(
&mut state,
Zve64xWidenNarrowInstruction::VwadduWv {
vd: VReg::V16,
vs2: VReg::V8,
vs1: VReg::V4,
vm: true,
},
)
.unwrap();
for i in 0..4usize {
assert_eq!(read_elem(&state, VReg::V16, i, Vsew::E16), 1255, "elem {i}");
}
}
#[test]
fn vwaddu_wx_e16_m1_wide_plus_scalar() {
let mut state = setup(4, Vsew::E16, Vlmul::M1);
for i in 0..4usize {
write_elem(&mut state, VReg::V8, i, Vsew::E32, 0x1_0000u64);
}
state.regs.write(Reg::A0, 1u64);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VwadduWx {
vd: VReg::V16,
vs2: VReg::V8,
rs1: Reg::A0,
vm: true,
},
)
.unwrap();
for i in 0..4usize {
assert_eq!(
read_elem(&state, VReg::V16, i, Vsew::E32),
0x1_0001u64,
"elem {i}"
);
}
}
#[test]
fn vwaddu_wx_e8_m1_scalar_not_truncated() {
let mut state = setup(1, Vsew::E8, Vlmul::M1);
write_elem(&mut state, VReg::V8, 0, Vsew::E16, 0x200u64);
state.regs.write(Reg::A0, 0x1ffu64);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VwadduWx {
vd: VReg::V16,
vs2: VReg::V8,
rs1: Reg::A0,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V16, 0, Vsew::E16), 0x3ffu64);
}
#[test]
fn vwadd_wv_e8_m1_sign_extends_narrow() {
let mut state = setup(2, Vsew::E8, Vlmul::M1);
for i in 0..2usize {
write_elem(&mut state, VReg::V8, i, Vsew::E16, 0u64);
write_elem(&mut state, VReg::V4, i, Vsew::E8, 0xff);
}
exec(
&mut state,
Zve64xWidenNarrowInstruction::VwaddWv {
vd: VReg::V16,
vs2: VReg::V8,
vs1: VReg::V4,
vm: true,
},
)
.unwrap();
for i in 0..2usize {
assert_eq!(
read_elem(&state, VReg::V16, i, Vsew::E16),
0xffffu64,
"elem {i}"
);
}
}
#[test]
fn vwadd_wx_e32_m1_sign_extends_scalar() {
let mut state = setup(1, Vsew::E32, Vlmul::M1);
write_elem(&mut state, VReg::V8, 0, Vsew::E64, 0u64);
state.regs.write(Reg::A0, u64::MAX);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VwaddWx {
vd: VReg::V16,
vs2: VReg::V8,
rs1: Reg::A0,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V16, 0, Vsew::E64), u64::MAX);
}
#[test]
fn vwsubu_wv_e8_m1_zero_extends_narrow() {
let mut state = setup(2, Vsew::E8, Vlmul::M1);
write_elem(&mut state, VReg::V8, 0, Vsew::E16, 0x200u64);
write_elem(&mut state, VReg::V8, 1, Vsew::E16, 0x100u64);
write_elem(&mut state, VReg::V4, 0, Vsew::E8, 0xff);
write_elem(&mut state, VReg::V4, 1, Vsew::E8, 0x01);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VwsubuWv {
vd: VReg::V16,
vs2: VReg::V8,
vs1: VReg::V4,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V16, 0, Vsew::E16), 0x101u64);
assert_eq!(read_elem(&state, VReg::V16, 1, Vsew::E16), 0xffu64);
}
#[test]
fn vwsubu_wx_e16_m1_scalar() {
let mut state = setup(2, Vsew::E16, Vlmul::M1);
write_elem(&mut state, VReg::V8, 0, Vsew::E32, 0x1_0000u64);
write_elem(&mut state, VReg::V8, 1, Vsew::E32, 5u64);
state.regs.write(Reg::A0, 1u64);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VwsubuWx {
vd: VReg::V16,
vs2: VReg::V8,
rs1: Reg::A0,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V16, 0, Vsew::E32), 0xffffu64);
assert_eq!(read_elem(&state, VReg::V16, 1, Vsew::E32), 4u64);
}
#[test]
fn vwsub_wv_e8_m1_sign_extends_narrow() {
let mut state = setup(1, Vsew::E8, Vlmul::M1);
write_elem(&mut state, VReg::V8, 0, Vsew::E16, 0u64);
write_elem(&mut state, VReg::V4, 0, Vsew::E8, 0x80);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VwsubWv {
vd: VReg::V16,
vs2: VReg::V8,
vs1: VReg::V4,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V16, 0, Vsew::E16), 0x0080u64);
}
#[test]
fn vwsub_wx_e32_m1_sign_extends_scalar() {
let mut state = setup(1, Vsew::E32, Vlmul::M1);
write_elem(&mut state, VReg::V8, 0, Vsew::E64, 0u64);
state.regs.write(Reg::A0, u64::MAX);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VwsubWx {
vd: VReg::V16,
vs2: VReg::V8,
rs1: Reg::A0,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V16, 0, Vsew::E64), 1u64);
}
#[test]
fn vnsrl_wv_e8_m1_logical_shift() {
let mut state = setup(4, Vsew::E8, Vlmul::M1);
for i in 0..4usize {
write_elem(&mut state, VReg::V8, i, Vsew::E16, 0xab00u64);
write_elem(&mut state, VReg::V4, i, Vsew::E8, 4);
}
exec(
&mut state,
Zve64xWidenNarrowInstruction::VnsrlWv {
vd: VReg::V2,
vs2: VReg::V8,
vs1: VReg::V4,
vm: true,
},
)
.unwrap();
for i in 0..4usize {
assert_eq!(
read_elem(&state, VReg::V2, i, Vsew::E8),
0xb0u64,
"elem {i}"
);
}
assert_eq!(state.ext_state.vstart(), 0);
}
#[test]
fn vnsrl_wv_e16_m1_shamt_masked_to_5_bits() {
let mut state = setup(2, Vsew::E16, Vlmul::M1);
write_elem(&mut state, VReg::V8, 0, Vsew::E32, 0xffff_ffffu64);
write_elem(&mut state, VReg::V8, 1, Vsew::E32, 0x0002_0000u64);
write_elem(&mut state, VReg::V4, 0, Vsew::E16, 33);
write_elem(&mut state, VReg::V4, 1, Vsew::E16, 33);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VnsrlWv {
vd: VReg::V2,
vs2: VReg::V8,
vs1: VReg::V4,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V2, 0, Vsew::E16), 0xffffu64);
assert_eq!(read_elem(&state, VReg::V2, 1, Vsew::E16), 0x0000u64);
}
#[test]
fn vnsrl_wx_e32_m1_logical_no_sign_fill() {
let mut state = setup(1, Vsew::E32, Vlmul::M1);
write_elem(&mut state, VReg::V8, 0, Vsew::E64, 0x8000_0000_0000_0000u64);
state.regs.write(Reg::A0, 1u64);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VnsrlWx {
vd: VReg::V2,
vs2: VReg::V8,
rs1: Reg::A0,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V2, 0, Vsew::E32), 0u64);
}
#[test]
fn vnsrl_wi_e8_m1_immediate_shift() {
let mut state = setup(2, Vsew::E8, Vlmul::M1);
write_elem(&mut state, VReg::V8, 0, Vsew::E16, 0xff00u64);
write_elem(&mut state, VReg::V8, 1, Vsew::E16, 0x00ffu64);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VnsrlWi {
vd: VReg::V2,
vs2: VReg::V8,
uimm: 8,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V2, 0, Vsew::E8), 0xffu64);
assert_eq!(read_elem(&state, VReg::V2, 1, Vsew::E8), 0x00u64);
}
#[test]
fn vnsra_wv_e8_m1_arithmetic_sign_fills() {
let mut state = setup(2, Vsew::E8, Vlmul::M1);
write_elem(&mut state, VReg::V8, 0, Vsew::E16, 0xff00u64);
write_elem(&mut state, VReg::V8, 1, Vsew::E16, 0x7f00u64);
write_elem(&mut state, VReg::V4, 0, Vsew::E8, 4);
write_elem(&mut state, VReg::V4, 1, Vsew::E8, 4);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VnsraWv {
vd: VReg::V2,
vs2: VReg::V8,
vs1: VReg::V4,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V2, 0, Vsew::E8), 0xf0u64);
assert_eq!(read_elem(&state, VReg::V2, 1, Vsew::E8), 0xf0u64);
}
#[test]
fn vnsra_wx_e32_m1_sign_fills() {
let mut state = setup(1, Vsew::E32, Vlmul::M1);
write_elem(&mut state, VReg::V8, 0, Vsew::E64, 0x8000_0000_0000_0000u64);
state.regs.write(Reg::A0, 1u64);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VnsraWx {
vd: VReg::V2,
vs2: VReg::V8,
rs1: Reg::A0,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V2, 0, Vsew::E32), 0u64);
}
#[test]
fn vnsra_wx_e16_m1_sign_fills_into_result() {
let mut state = setup(2, Vsew::E16, Vlmul::M1);
write_elem(&mut state, VReg::V8, 0, Vsew::E32, 0x8000_0000u64);
write_elem(&mut state, VReg::V8, 1, Vsew::E32, 0x0001_0000u64);
state.regs.write(Reg::A0, 16u64);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VnsraWx {
vd: VReg::V2,
vs2: VReg::V8,
rs1: Reg::A0,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V2, 0, Vsew::E16), 0x8000u64);
assert_eq!(read_elem(&state, VReg::V2, 1, Vsew::E16), 1u64);
}
#[test]
fn vnsra_wi_e8_m1_immediate() {
let mut state = setup(2, Vsew::E8, Vlmul::M1);
write_elem(&mut state, VReg::V8, 0, Vsew::E16, 0x8000u64);
write_elem(&mut state, VReg::V8, 1, Vsew::E16, 0x0080u64);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VnsraWi {
vd: VReg::V2,
vs2: VReg::V8,
uimm: 8,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V2, 0, Vsew::E8), 0x80u64);
assert_eq!(read_elem(&state, VReg::V2, 1, Vsew::E8), 0x00u64);
}
#[test]
fn vzext_vf2_e16_m1_zero_extends() {
let mut state = setup(4, Vsew::E16, Vlmul::M1);
for i in 0..4usize {
write_elem(&mut state, VReg::V4, i, Vsew::E8, 0xff);
}
exec(
&mut state,
Zve64xWidenNarrowInstruction::VzextVf2 {
vd: VReg::V8,
vs2: VReg::V4,
vm: true,
},
)
.unwrap();
for i in 0..4usize {
assert_eq!(
read_elem(&state, VReg::V8, i, Vsew::E16),
0x00ffu64,
"elem {i}"
);
}
assert_eq!(state.ext_state.vs_dirty_count(), 1);
assert_eq!(state.ext_state.vstart(), 0);
}
#[test]
fn vzext_vf2_e32_m1_zero_extends() {
let mut state = setup(2, Vsew::E32, Vlmul::M1);
write_elem(&mut state, VReg::V4, 0, Vsew::E16, 0xffff);
write_elem(&mut state, VReg::V4, 1, Vsew::E16, 0x1234);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VzextVf2 {
vd: VReg::V8,
vs2: VReg::V4,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V8, 0, Vsew::E32), 0x0000_ffffu64);
assert_eq!(read_elem(&state, VReg::V8, 1, Vsew::E32), 0x1234u64);
}
#[test]
fn vzext_vf2_e64_m1_zero_extends() {
let mut state = setup(2, Vsew::E64, Vlmul::M1);
write_elem(&mut state, VReg::V4, 0, Vsew::E32, 0xffff_ffff);
write_elem(&mut state, VReg::V4, 1, Vsew::E32, 0);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VzextVf2 {
vd: VReg::V8,
vs2: VReg::V4,
vm: true,
},
)
.unwrap();
assert_eq!(
read_elem(&state, VReg::V8, 0, Vsew::E64),
0x0000_0000_ffff_ffffu64
);
assert_eq!(read_elem(&state, VReg::V8, 1, Vsew::E64), 0u64);
}
#[test]
fn vzext_vf4_e32_m1_zero_extends() {
let mut state = setup(4, Vsew::E32, Vlmul::M1);
for i in 0..4usize {
write_elem(&mut state, VReg::V4, i, Vsew::E8, 0xff);
}
exec(
&mut state,
Zve64xWidenNarrowInstruction::VzextVf4 {
vd: VReg::V8,
vs2: VReg::V4,
vm: true,
},
)
.unwrap();
for i in 0..4usize {
assert_eq!(
read_elem(&state, VReg::V8, i, Vsew::E32),
0x0000_00ffu64,
"elem {i}"
);
}
}
#[test]
fn vzext_vf4_e64_m1_zero_extends() {
let mut state = setup(2, Vsew::E64, Vlmul::M1);
write_elem(&mut state, VReg::V4, 0, Vsew::E16, 0xffff);
write_elem(&mut state, VReg::V4, 1, Vsew::E16, 0x0001);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VzextVf4 {
vd: VReg::V8,
vs2: VReg::V4,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V8, 0, Vsew::E64), 0x0000_ffffu64);
assert_eq!(read_elem(&state, VReg::V8, 1, Vsew::E64), 1u64);
}
#[test]
fn vzext_vf8_e64_m1_zero_extends() {
let mut state = setup(2, Vsew::E64, Vlmul::M1);
write_elem(&mut state, VReg::V4, 0, Vsew::E8, 0xff);
write_elem(&mut state, VReg::V4, 1, Vsew::E8, 0x42);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VzextVf8 {
vd: VReg::V8,
vs2: VReg::V4,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V8, 0, Vsew::E64), 0xffu64);
assert_eq!(read_elem(&state, VReg::V8, 1, Vsew::E64), 0x42u64);
}
#[test]
fn vsext_vf2_e16_m1_sign_extends() {
let mut state = setup(4, Vsew::E16, Vlmul::M1);
for i in 0..4usize {
write_elem(&mut state, VReg::V4, i, Vsew::E8, 0xff);
}
exec(
&mut state,
Zve64xWidenNarrowInstruction::VsextVf2 {
vd: VReg::V8,
vs2: VReg::V4,
vm: true,
},
)
.unwrap();
for i in 0..4usize {
assert_eq!(
read_elem(&state, VReg::V8, i, Vsew::E16),
0xffffu64,
"elem {i}"
);
}
assert_eq!(state.ext_state.vs_dirty_count(), 1);
assert_eq!(state.ext_state.vstart(), 0);
}
#[test]
fn vsext_vf2_e32_m1_positive_unchanged() {
let mut state = setup(2, Vsew::E32, Vlmul::M1);
write_elem(&mut state, VReg::V4, 0, Vsew::E16, 0x7fff);
write_elem(&mut state, VReg::V4, 1, Vsew::E16, 0x8000);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VsextVf2 {
vd: VReg::V8,
vs2: VReg::V4,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V8, 0, Vsew::E32), 0x0000_7fffu64);
assert_eq!(read_elem(&state, VReg::V8, 1, Vsew::E32), 0xffff_8000u64);
}
#[test]
fn vsext_vf2_e64_m1_sign_extends() {
let mut state = setup(2, Vsew::E64, Vlmul::M1);
write_elem(&mut state, VReg::V4, 0, Vsew::E32, 0x8000_0000);
write_elem(&mut state, VReg::V4, 1, Vsew::E32, 0x7fff_ffff);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VsextVf2 {
vd: VReg::V8,
vs2: VReg::V4,
vm: true,
},
)
.unwrap();
assert_eq!(
read_elem(&state, VReg::V8, 0, Vsew::E64),
0xffff_ffff_8000_0000u64
);
assert_eq!(
read_elem(&state, VReg::V8, 1, Vsew::E64),
0x0000_0000_7fff_ffffu64
);
}
#[test]
fn vsext_vf4_e32_m1_sign_extends() {
let mut state = setup(2, Vsew::E32, Vlmul::M1);
write_elem(&mut state, VReg::V4, 0, Vsew::E8, 0x80);
write_elem(&mut state, VReg::V4, 1, Vsew::E8, 0x7f);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VsextVf4 {
vd: VReg::V8,
vs2: VReg::V4,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V8, 0, Vsew::E32), 0xffff_ff80u64);
assert_eq!(read_elem(&state, VReg::V8, 1, Vsew::E32), 0x0000_007fu64);
}
#[test]
fn vsext_vf4_e64_m1_sign_extends() {
let mut state = setup(2, Vsew::E64, Vlmul::M1);
write_elem(&mut state, VReg::V4, 0, Vsew::E16, 0x8000);
write_elem(&mut state, VReg::V4, 1, Vsew::E16, 0x0001);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VsextVf4 {
vd: VReg::V8,
vs2: VReg::V4,
vm: true,
},
)
.unwrap();
assert_eq!(
read_elem(&state, VReg::V8, 0, Vsew::E64),
0xffff_ffff_ffff_8000u64
);
assert_eq!(read_elem(&state, VReg::V8, 1, Vsew::E64), 1u64);
}
#[test]
fn vsext_vf8_e64_m1_sign_extends() {
let mut state = setup(2, Vsew::E64, Vlmul::M1);
write_elem(&mut state, VReg::V4, 0, Vsew::E8, 0x80);
write_elem(&mut state, VReg::V4, 1, Vsew::E8, 0x42);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VsextVf8 {
vd: VReg::V8,
vs2: VReg::V4,
vm: true,
},
)
.unwrap();
assert_eq!(
read_elem(&state, VReg::V8, 0, Vsew::E64),
0xffff_ffff_ffff_ff80u64
);
assert_eq!(read_elem(&state, VReg::V8, 1, Vsew::E64), 0x42u64);
}
#[test]
fn vwaddu_vv_e8_m1_masked_skips_inactive() {
let mut state = setup(4, Vsew::E8, Vlmul::M1);
write_mask(&mut state, 0b0101);
for i in 0..4usize {
write_elem(&mut state, VReg::V2, i, Vsew::E8, 10);
write_elem(&mut state, VReg::V4, i, Vsew::E8, 20);
write_elem(&mut state, VReg::V8, i, Vsew::E16, 0xdeadu64);
}
exec(
&mut state,
Zve64xWidenNarrowInstruction::VwadduVv {
vd: VReg::V8,
vs2: VReg::V2,
vs1: VReg::V4,
vm: false,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V8, 0, Vsew::E16), 30u64);
assert_eq!(read_elem(&state, VReg::V8, 1, Vsew::E16), 0xdeadu64);
assert_eq!(read_elem(&state, VReg::V8, 2, Vsew::E16), 30u64);
assert_eq!(read_elem(&state, VReg::V8, 3, Vsew::E16), 0xdeadu64);
}
#[test]
fn vnsrl_wv_e8_m1_masked_skips_inactive() {
let mut state = setup(4, Vsew::E8, Vlmul::M1);
write_mask(&mut state, 0b0010);
for i in 0..4usize {
write_elem(&mut state, VReg::V8, i, Vsew::E16, 0xff00u64);
write_elem(&mut state, VReg::V4, i, Vsew::E8, 8);
write_elem(&mut state, VReg::V2, i, Vsew::E8, 0xabu64);
}
exec(
&mut state,
Zve64xWidenNarrowInstruction::VnsrlWv {
vd: VReg::V2,
vs2: VReg::V8,
vs1: VReg::V4,
vm: false,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V2, 0, Vsew::E8), 0xabu64);
assert_eq!(read_elem(&state, VReg::V2, 1, Vsew::E8), 0xffu64);
assert_eq!(read_elem(&state, VReg::V2, 2, Vsew::E8), 0xabu64);
assert_eq!(read_elem(&state, VReg::V2, 3, Vsew::E8), 0xabu64);
}
#[test]
fn vsext_vf2_e16_m1_masked_skips_inactive() {
let mut state = setup(4, Vsew::E16, Vlmul::M1);
write_mask(&mut state, 0b1001);
for i in 0..4usize {
write_elem(&mut state, VReg::V4, i, Vsew::E8, 0x80);
write_elem(&mut state, VReg::V8, i, Vsew::E16, 0x1234u64);
}
exec(
&mut state,
Zve64xWidenNarrowInstruction::VsextVf2 {
vd: VReg::V8,
vs2: VReg::V4,
vm: false,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V8, 0, Vsew::E16), 0xff80u64);
assert_eq!(read_elem(&state, VReg::V8, 1, Vsew::E16), 0x1234u64);
assert_eq!(read_elem(&state, VReg::V8, 2, Vsew::E16), 0x1234u64);
assert_eq!(read_elem(&state, VReg::V8, 3, Vsew::E16), 0xff80u64);
}
#[test]
fn vwaddu_vv_e8_m1_vstart_skips_early_elements() {
let mut state = setup(4, Vsew::E8, Vlmul::M1);
for i in 0..4usize {
write_elem(&mut state, VReg::V2, i, Vsew::E8, 1);
write_elem(&mut state, VReg::V4, i, Vsew::E8, 2);
write_elem(&mut state, VReg::V8, i, Vsew::E16, 0xdead);
}
state.ext_state.set_vstart(2);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VwadduVv {
vd: VReg::V8,
vs2: VReg::V2,
vs1: VReg::V4,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V8, 0, Vsew::E16), 0xdeadu64);
assert_eq!(read_elem(&state, VReg::V8, 1, Vsew::E16), 0xdeadu64);
assert_eq!(read_elem(&state, VReg::V8, 2, Vsew::E16), 3u64);
assert_eq!(read_elem(&state, VReg::V8, 3, Vsew::E16), 3u64);
assert_eq!(state.ext_state.vstart(), 0);
}
#[test]
fn vwaddu_vv_e64_m1_illegal() {
let mut state = setup(1, Vsew::E64, Vlmul::M1);
let result = exec(
&mut state,
Zve64xWidenNarrowInstruction::VwadduVv {
vd: VReg::V8,
vs2: VReg::V2,
vs1: VReg::V4,
vm: true,
},
);
assert!(matches!(
result,
Err(ExecutionError::IllegalInstruction { .. })
));
}
#[test]
fn vwadd_vv_e64_m1_illegal() {
let mut state = setup(1, Vsew::E64, Vlmul::M1);
let result = exec(
&mut state,
Zve64xWidenNarrowInstruction::VwaddVv {
vd: VReg::V8,
vs2: VReg::V2,
vs1: VReg::V4,
vm: true,
},
);
assert!(matches!(
result,
Err(ExecutionError::IllegalInstruction { .. })
));
}
#[test]
fn vwsubu_vv_e64_m1_illegal() {
let mut state = setup(1, Vsew::E64, Vlmul::M1);
let result = exec(
&mut state,
Zve64xWidenNarrowInstruction::VwsubuVv {
vd: VReg::V8,
vs2: VReg::V2,
vs1: VReg::V4,
vm: true,
},
);
assert!(matches!(
result,
Err(ExecutionError::IllegalInstruction { .. })
));
}
#[test]
fn vnsrl_e64_m1_illegal() {
let mut state = setup(1, Vsew::E64, Vlmul::M1);
let result = exec(
&mut state,
Zve64xWidenNarrowInstruction::VnsrlWi {
vd: VReg::V2,
vs2: VReg::V8,
uimm: 0,
vm: true,
},
);
assert!(matches!(
result,
Err(ExecutionError::IllegalInstruction { .. })
));
}
#[test]
fn vnsra_e64_m1_illegal() {
let mut state = setup(1, Vsew::E64, Vlmul::M1);
let result = exec(
&mut state,
Zve64xWidenNarrowInstruction::VnsraWi {
vd: VReg::V2,
vs2: VReg::V8,
uimm: 0,
vm: true,
},
);
assert!(matches!(
result,
Err(ExecutionError::IllegalInstruction { .. })
));
}
#[test]
fn vzext_vf4_e16_illegal_sew_too_small() {
let mut state = setup(4, Vsew::E16, Vlmul::M1);
let result = exec(
&mut state,
Zve64xWidenNarrowInstruction::VzextVf4 {
vd: VReg::V8,
vs2: VReg::V4,
vm: true,
},
);
assert!(matches!(
result,
Err(ExecutionError::IllegalInstruction { .. })
));
}
#[test]
fn vsext_vf4_e16_illegal_sew_too_small() {
let mut state = setup(4, Vsew::E16, Vlmul::M1);
let result = exec(
&mut state,
Zve64xWidenNarrowInstruction::VsextVf4 {
vd: VReg::V8,
vs2: VReg::V4,
vm: true,
},
);
assert!(matches!(
result,
Err(ExecutionError::IllegalInstruction { .. })
));
}
#[test]
fn vzext_vf8_e32_illegal_sew_too_small() {
let mut state = setup(2, Vsew::E32, Vlmul::M1);
let result = exec(
&mut state,
Zve64xWidenNarrowInstruction::VzextVf8 {
vd: VReg::V8,
vs2: VReg::V4,
vm: true,
},
);
assert!(matches!(
result,
Err(ExecutionError::IllegalInstruction { .. })
));
}
#[test]
fn vsext_vf8_e32_illegal_sew_too_small() {
let mut state = setup(2, Vsew::E32, Vlmul::M1);
let result = exec(
&mut state,
Zve64xWidenNarrowInstruction::VsextVf8 {
vd: VReg::V8,
vs2: VReg::V4,
vm: true,
},
);
assert!(matches!(
result,
Err(ExecutionError::IllegalInstruction { .. })
));
}
#[test]
fn vzext_vf2_e8_illegal_sew_too_small() {
let mut state = setup(4, Vsew::E8, Vlmul::M1);
let result = exec(
&mut state,
Zve64xWidenNarrowInstruction::VzextVf2 {
vd: VReg::V8,
vs2: VReg::V4,
vm: true,
},
);
assert!(matches!(
result,
Err(ExecutionError::IllegalInstruction { .. })
));
}
#[test]
fn vwaddu_vv_masked_vd_v0_illegal() {
let mut state = setup(2, Vsew::E8, Vlmul::M1);
let result = exec(
&mut state,
Zve64xWidenNarrowInstruction::VwadduVv {
vd: VReg::V0,
vs2: VReg::V4,
vs1: VReg::V8,
vm: false,
},
);
assert!(matches!(
result,
Err(ExecutionError::IllegalInstruction { .. })
));
}
#[test]
fn vnsrl_masked_vd_v0_illegal() {
let mut state = setup(2, Vsew::E8, Vlmul::M1);
let result = exec(
&mut state,
Zve64xWidenNarrowInstruction::VnsrlWi {
vd: VReg::V0,
vs2: VReg::V4,
uimm: 0,
vm: false,
},
);
assert!(matches!(
result,
Err(ExecutionError::IllegalInstruction { .. })
));
}
#[test]
fn vzext_vf2_masked_vd_v0_illegal() {
let mut state = setup(2, Vsew::E16, Vlmul::M1);
let result = exec(
&mut state,
Zve64xWidenNarrowInstruction::VzextVf2 {
vd: VReg::V0,
vs2: VReg::V4,
vm: false,
},
);
assert!(matches!(
result,
Err(ExecutionError::IllegalInstruction { .. })
));
}
#[test]
fn vwaddu_vv_vtype_not_set_illegal() {
let mut state = setup(2, Vsew::E8, Vlmul::M1);
state.ext_state.set_vtype(None);
let result = exec(
&mut state,
Zve64xWidenNarrowInstruction::VwadduVv {
vd: VReg::V8,
vs2: VReg::V2,
vs1: VReg::V4,
vm: true,
},
);
assert!(matches!(
result,
Err(ExecutionError::IllegalInstruction { .. })
));
}
#[test]
fn vnsrl_vtype_not_set_illegal() {
let mut state = setup(2, Vsew::E8, Vlmul::M1);
state.ext_state.set_vtype(None);
let result = exec(
&mut state,
Zve64xWidenNarrowInstruction::VnsrlWi {
vd: VReg::V2,
vs2: VReg::V8,
uimm: 0,
vm: true,
},
);
assert!(matches!(
result,
Err(ExecutionError::IllegalInstruction { .. })
));
}
#[test]
fn vwaddu_vv_not_allowed_illegal() {
let mut state = setup(2, Vsew::E8, Vlmul::M1);
state.ext_state.set_vector_allowed(false);
let result = exec(
&mut state,
Zve64xWidenNarrowInstruction::VwadduVv {
vd: VReg::V8,
vs2: VReg::V2,
vs1: VReg::V4,
vm: true,
},
);
assert!(matches!(
result,
Err(ExecutionError::IllegalInstruction { .. })
));
}
#[test]
fn vsext_vf2_not_allowed_illegal() {
let mut state = setup(2, Vsew::E16, Vlmul::M1);
state.ext_state.set_vector_allowed(false);
let result = exec(
&mut state,
Zve64xWidenNarrowInstruction::VsextVf2 {
vd: VReg::V8,
vs2: VReg::V4,
vm: true,
},
);
assert!(matches!(
result,
Err(ExecutionError::IllegalInstruction { .. })
));
}
#[test]
fn vwaddu_vv_vd_misaligned_illegal() {
let mut state = setup(4, Vsew::E8, Vlmul::M1);
let result = exec(
&mut state,
Zve64xWidenNarrowInstruction::VwadduVv {
vd: VReg::V1,
vs2: VReg::V2,
vs1: VReg::V4,
vm: true,
},
);
assert!(matches!(
result,
Err(ExecutionError::IllegalInstruction { .. })
));
}
#[test]
fn vwaddu_vv_vd_overlaps_vs2_illegal() {
let mut state = setup(4, Vsew::E8, Vlmul::M1);
let result = exec(
&mut state,
Zve64xWidenNarrowInstruction::VwadduVv {
vd: VReg::V2,
vs2: VReg::V2,
vs1: VReg::V4,
vm: true,
},
);
assert!(matches!(
result,
Err(ExecutionError::IllegalInstruction { .. })
));
}
#[test]
fn vwaddu_vv_vd_overlaps_vs1_illegal() {
let mut state = setup(4, Vsew::E8, Vlmul::M1);
let result = exec(
&mut state,
Zve64xWidenNarrowInstruction::VwadduVv {
vd: VReg::V4,
vs2: VReg::V2,
vs1: VReg::V4,
vm: true,
},
);
assert!(matches!(
result,
Err(ExecutionError::IllegalInstruction { .. })
));
}
#[test]
fn vzext_vf2_vd_overlaps_vs2_illegal() {
let mut state = setup(4, Vsew::E16, Vlmul::M1);
let result = exec(
&mut state,
Zve64xWidenNarrowInstruction::VzextVf2 {
vd: VReg::V8,
vs2: VReg::V8,
vm: true,
},
);
assert!(matches!(
result,
Err(ExecutionError::IllegalInstruction { .. })
));
}
#[test]
fn vwaddu_vv_e8_m2_multi_register_group() {
let mut state = setup(8, Vsew::E8, Vlmul::M2);
for i in 0..8usize {
write_elem(&mut state, VReg::V8, i, Vsew::E8, 100u64);
write_elem(&mut state, VReg::V12, i, Vsew::E8, 200u64);
}
exec(
&mut state,
Zve64xWidenNarrowInstruction::VwadduVv {
vd: VReg::V16,
vs2: VReg::V8,
vs1: VReg::V12,
vm: true,
},
)
.unwrap();
for i in 0..8usize {
assert_eq!(
read_elem(&state, VReg::V16, i, Vsew::E16),
300u64,
"elem {i}"
);
}
}
#[test]
fn vnsrl_e16_m2_multi_register_group() {
let mut state = setup(8, Vsew::E16, Vlmul::M2);
for i in 0..8usize {
write_elem(&mut state, VReg::V16, i, Vsew::E32, 0xffff_0000u64);
}
state.regs.write(Reg::A0, 16u64);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VnsrlWx {
vd: VReg::V8,
vs2: VReg::V16,
rs1: Reg::A0,
vm: true,
},
)
.unwrap();
for i in 0..8usize {
assert_eq!(
read_elem(&state, VReg::V8, i, Vsew::E16),
0xffffu64,
"elem {i}"
);
}
}
#[test]
fn vwaddu_vv_vl_zero_nop() {
let mut state = setup(0, Vsew::E8, Vlmul::M1);
for i in 0..4usize {
write_elem(&mut state, VReg::V8, i, Vsew::E16, 0xdeadu64);
}
exec(
&mut state,
Zve64xWidenNarrowInstruction::VwadduVv {
vd: VReg::V8,
vs2: VReg::V2,
vs1: VReg::V4,
vm: true,
},
)
.unwrap();
for i in 0..4usize {
assert_eq!(
read_elem(&state, VReg::V8, i, Vsew::E16),
0xdeadu64,
"elem {i}"
);
}
assert_eq!(state.ext_state.vs_dirty_count(), 1);
assert_eq!(state.ext_state.vstart(), 0);
}
#[test]
fn vnsrl_wi_e8_m1_uimm_masked_to_log2_2sew() {
let mut state = setup(1, Vsew::E8, Vlmul::M1);
write_elem(&mut state, VReg::V8, 0, Vsew::E16, 0xab_cdu64);
exec(
&mut state,
Zve64xWidenNarrowInstruction::VnsrlWi {
vd: VReg::V2,
vs2: VReg::V8,
uimm: 16,
vm: true,
},
)
.unwrap();
assert_eq!(read_elem(&state, VReg::V2, 0, Vsew::E8), 0xcdu64);
}
#[test]
fn vwaddu_wv_vd_aliases_vs2_legal() {
let mut state = setup(4, Vsew::E8, Vlmul::M1);
for i in 0..4usize {
write_elem(&mut state, VReg::V8, i, Vsew::E16, 1000u64);
write_elem(&mut state, VReg::V4, i, Vsew::E8, 1u64);
}
exec(
&mut state,
Zve64xWidenNarrowInstruction::VwadduWv {
vd: VReg::V8,
vs2: VReg::V8,
vs1: VReg::V4,
vm: true,
},
)
.unwrap();
for i in 0..4usize {
assert_eq!(
read_elem(&state, VReg::V8, i, Vsew::E16),
1001u64,
"elem {i}"
);
}
}