use crate::exec::compute::vector::regfile::VectorRegFile;
use crate::isa::fp::RoundingMode;
use crate::isa::rvv::{ElemIdx, MaskPolicy, Sew, TailPolicy, VRegIdx, Vlmul, Vxrm};
#[derive(Debug, Clone, Copy)]
pub enum VecOperand {
Vector(VRegIdx),
Scalar(u64),
Immediate(i64),
}
#[derive(Debug, Default)]
pub struct VecExecResult {
pub vxsat: bool,
pub scalar_result: Option<u64>,
pub fp_flags: crate::isa::fp::FpFlags,
}
#[derive(Debug)]
pub struct VecExecCtx {
pub sew: Sew,
pub vl: usize,
pub vstart: usize,
pub vma: MaskPolicy,
pub vta: TailPolicy,
pub vlmul: Vlmul,
pub vm: bool,
pub vxrm: Vxrm,
pub frm: RoundingMode,
pub zvfh: bool,
}
#[inline]
pub(super) fn mask_active(vpr: &impl VectorRegFile, i: usize) -> bool {
vpr.read_mask_bit(VRegIdx::new(0), ElemIdx::new(i))
}
#[inline]
pub(super) fn read_op1(vpr: &impl VectorRegFile, operand1: &VecOperand, i: usize, sew: Sew) -> u64 {
match operand1 {
VecOperand::Vector(vs1) => vpr.read_element(*vs1, ElemIdx::new(i), sew),
VecOperand::Scalar(s) => *s & sew.mask(),
VecOperand::Immediate(imm) => (*imm as u64) & sew.mask(),
}
}
#[inline]
pub(super) const fn sign_extend(val: u64, sew: Sew) -> i64 {
let shift = 64 - sew.bits();
((val << shift) as i64) >> shift
}
#[inline]
pub(super) const fn widen_sew(sew: Sew) -> Option<Sew> {
match sew {
Sew::E8 => Some(Sew::E16),
Sew::E16 => Some(Sew::E32),
Sew::E32 => Some(Sew::E64),
Sew::E64 => None,
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum FpSew {
F16,
F32,
F64,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum FpWiden {
F16ToF32,
F32ToF64,
}
impl FpSew {
#[must_use]
pub const fn of(sew: Sew, zvfh: bool) -> Option<Self> {
match sew {
Sew::E16 if zvfh => Some(Self::F16),
Sew::E32 => Some(Self::F32),
Sew::E64 => Some(Self::F64),
Sew::E8 | Sew::E16 => None,
}
}
#[must_use]
pub const fn widening(self) -> Option<FpWiden> {
match self {
Self::F16 => Some(FpWiden::F16ToF32),
Self::F32 => Some(FpWiden::F32ToF64),
Self::F64 => None,
}
}
}
impl FpWiden {
#[must_use]
pub const fn dst(self) -> Sew {
match self {
Self::F16ToF32 => Sew::E32,
Self::F32ToF64 => Sew::E64,
}
}
}