use crate::isa::rvv::{ElemIdx, Sew, VRegIdx, Vlen};
pub trait VectorRegFile {
fn read_element(&self, vreg: VRegIdx, index: ElemIdx, sew: Sew) -> u64;
fn write_element(&mut self, vreg: VRegIdx, index: ElemIdx, sew: Sew, val: u64);
fn read_mask_bit(&self, vreg: VRegIdx, index: ElemIdx) -> bool;
fn write_mask_bit(&mut self, vreg: VRegIdx, index: ElemIdx, val: bool);
fn copy_reg(&mut self, dst: VRegIdx, src: VRegIdx);
fn vlen(&self) -> Vlen;
}
impl VectorRegFile for crate::arch::regs::vpr::Vpr {
#[inline]
fn read_element(&self, vreg: VRegIdx, index: ElemIdx, sew: Sew) -> u64 {
self.read_element(vreg, index, sew)
}
#[inline]
fn write_element(&mut self, vreg: VRegIdx, index: ElemIdx, sew: Sew, val: u64) {
self.write_element(vreg, index, sew, val);
}
#[inline]
fn read_mask_bit(&self, vreg: VRegIdx, index: ElemIdx) -> bool {
self.read_mask_bit(vreg, index)
}
#[inline]
fn write_mask_bit(&mut self, vreg: VRegIdx, index: ElemIdx, val: bool) {
self.write_mask_bit(vreg, index, val);
}
#[inline]
fn copy_reg(&mut self, dst: VRegIdx, src: VRegIdx) {
self.copy_reg(dst, src);
}
#[inline]
fn vlen(&self) -> Vlen {
self.vlen()
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::arch::regs::vpr::Vpr;
#[test]
fn test_vpr_trait_impl() {
let mut vpr = Vpr::new(Vlen::new_unchecked(128));
let v1 = VRegIdx::new(1);
VectorRegFile::write_element(&mut vpr, v1, ElemIdx::new(0), Sew::E32, 0xDEAD_BEEF);
assert_eq!(VectorRegFile::read_element(&vpr, v1, ElemIdx::new(0), Sew::E32), 0xDEAD_BEEF);
let v0 = VRegIdx::new(0);
VectorRegFile::write_mask_bit(&mut vpr, v0, ElemIdx::new(3), true);
assert!(VectorRegFile::read_mask_bit(&vpr, v0, ElemIdx::new(3)));
assert!(!VectorRegFile::read_mask_bit(&vpr, v0, ElemIdx::new(4)));
let v2 = VRegIdx::new(2);
VectorRegFile::copy_reg(&mut vpr, v2, v1);
assert_eq!(VectorRegFile::read_element(&vpr, v2, ElemIdx::new(0), Sew::E32), 0xDEAD_BEEF);
assert_eq!(VectorRegFile::vlen(&vpr).bits(), 128);
}
}