#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum VectorOp {
#[default]
None,
Vsetvli,
Vsetivli,
Vsetvl,
VAdd,
VSub,
VRsub,
VAnd,
VOr,
VXor,
VSll,
VSrl,
VSra,
VMinU,
VMin,
VMaxU,
VMax,
VMerge,
VMSeq,
VMSne,
VMSltu,
VMSlt,
VMSleu,
VMSle,
VMSgtu,
VMSgt,
VAdc,
VMadc,
VSbc,
VMsbc,
VMul,
VMulh,
VMulhu,
VMulhsu,
VMacc,
VNMSac,
VMadd,
VNMSub,
VDivU,
VDiv,
VRemU,
VRem,
VWAddU,
VWAdd,
VWSubU,
VWSub,
VWAddUW,
VWAddW,
VWSubUW,
VWSubW,
VWMulU,
VWMul,
VWMulSU,
VWMaccU,
VWMacc,
VWMaccSU,
VWMaccUS,
VNSrl,
VNSra,
VNClipU,
VNClip,
VSAddU,
VSAdd,
VSSubU,
VSSub,
VAAddU,
VAAdd,
VASubU,
VASub,
VSmul,
VSSrl,
VSSra,
VZextVf2,
VZextVf4,
VZextVf8,
VSextVf2,
VSextVf4,
VSextVf8,
VAndN,
VBrev,
VBrev8,
VRev8,
VClz,
VCtz,
VCpopV,
VRol,
VRor,
VWsll,
VClMul,
VClMulH,
VAesEm,
VAesEf,
VAesDm,
VAesDf,
VAesZ,
VAesKf1,
VAesKf2,
VSha2Ms,
VSha2Ch,
VSha2Cl,
VSm3Me,
VSm3C,
VSm4R,
VSm4K,
VGhsh,
VGmul,
VLoadUnit,
VStoreUnit,
VLoadFF,
VLoadMask,
VStoreMask,
VLoadWholeReg,
VStoreWholeReg,
VLoadStride,
VStoreStride,
VLoadIndexOrd,
VStoreIndexOrd,
VLoadIndexUnord,
VStoreIndexUnord,
VFAdd,
VFSub,
VFRSub,
VFMul,
VFDiv,
VFRDiv,
VFMin,
VFMax,
VFSgnj,
VFSgnjn,
VFSgnjx,
VMFEq,
VMFNe,
VMFLt,
VMFLe,
VMFGt,
VMFGe,
VFMacc,
VFNMacc,
VFMSac,
VFNMSac,
VFMAdd,
VFNMAdd,
VFMSub,
VFNMSub,
VFSqrt,
VFRsqrt7,
VFRec7,
VFClass,
VFCvtXuF,
VFCvtXF,
VFCvtFXu,
VFCvtFX,
VFCvtRtzXuF,
VFCvtRtzXF,
VFWAdd,
VFWSub,
VFWMul,
VFWAddW,
VFWSubW,
VFWMacc,
VFWNMacc,
VFWMSac,
VFWNMSac,
VFWCvtXuF,
VFWCvtXF,
VFWCvtFXu,
VFWCvtFX,
VFWCvtFF,
VFWCvtRtzXuF,
VFWCvtRtzXF,
VFNCvtXuF,
VFNCvtXF,
VFNCvtFXu,
VFNCvtFX,
VFNCvtFF,
VFNCvtRodFF,
VFNCvtRtzXuF,
VFNCvtRtzXF,
VFMerge,
VFMvSF,
VFMvFS,
VFSlide1Up,
VFSlide1Down,
VRedSum,
VRedAnd,
VRedOr,
VRedXor,
VRedMinU,
VRedMin,
VRedMaxU,
VRedMax,
VWRedSumU,
VWRedSum,
VFRedOSum,
VFRedUSum,
VFRedMax,
VFRedMin,
VFWRedOSum,
VFWRedUSum,
VMAndMM,
VMNandMM,
VMAndnMM,
VMOrMM,
VMNorMM,
VMOrnMM,
VMXorMM,
VMXnorMM,
VCPopM,
VFirstM,
VMSbfM,
VMSifM,
VMSofM,
VIotaM,
VIdV,
VMvXS,
VMvSX,
VSlideUp(SlideOffset),
VSlideDown(SlideOffset),
VSlide1Up,
VSlide1Down,
VRgather,
VRgatherEi16,
VCompress,
VMv1r,
VMv2r,
VMv4r,
VMv8r,
}
#[derive(Clone, Copy, Debug)]
pub struct VecOperandGroups {
pub vd: u8,
pub vs1: u8,
pub vs2: u8,
}
impl VectorOp {
#[must_use]
pub const fn is_config(self) -> bool {
matches!(self, Self::Vsetvli | Self::Vsetivli | Self::Vsetvl)
}
#[allow(clippy::enum_glob_use)]
pub fn operand_groups(
self,
lmul: u8,
lmul_is_fractional: bool,
src_enc: VecSrcEncoding,
nf: u8,
broadcast_vs2: bool,
) -> VecOperandGroups {
use VectorOp::*;
let emul_widened: u8 = if lmul_is_fractional { 1 } else { (lmul * 2).min(8) };
let vs1_base = if src_enc == VecSrcEncoding::VV { lmul } else { 0 };
let vs2_crypto = if broadcast_vs2 { 1 } else { lmul };
match self {
None | Vsetvli | Vsetivli | Vsetvl => VecOperandGroups { vd: 0, vs1: 0, vs2: 0 },
VAdd | VSub | VRsub | VAnd | VOr | VXor | VSll | VSrl | VSra | VMinU | VMin | VMaxU
| VMax | VMul | VMulh | VMulhu | VMulhsu | VMacc | VNMSac | VMadd | VNMSub | VDivU
| VDiv | VRemU | VRem | VSAddU | VSAdd | VSSubU | VSSub | VAAddU | VAAdd | VASubU
| VASub | VSmul | VSSrl | VSSra | VMerge | VSlideUp(_) | VSlideDown(_) | VSlide1Up
| VSlide1Down | VRgather | VRgatherEi16 | VCompress | VFAdd | VFSub | VFRSub
| VFMul | VFDiv | VFRDiv | VFMin | VFMax | VFSgnj | VFSgnjn | VFSgnjx | VFMacc
| VFNMacc | VFMSac | VFNMSac | VFMAdd | VFNMAdd | VFMSub | VFNMSub | VFMerge
| VFSlide1Up | VFSlide1Down | VAdc | VSbc | VAndN | VRol | VRor | VClMul | VClMulH => {
VecOperandGroups { vd: lmul, vs2: lmul, vs1: vs1_base }
}
VSha2Ms | VSha2Ch | VSha2Cl | VSm3Me | VGhsh => {
VecOperandGroups { vd: lmul, vs2: lmul, vs1: lmul }
}
VAesEm | VAesEf | VAesDm | VAesDf | VAesZ | VSm4R => {
VecOperandGroups { vd: lmul, vs2: vs2_crypto, vs1: 0 }
}
VAesKf1 | VAesKf2 | VSm4K | VSm3C | VGmul | VFCvtXuF | VFCvtXF | VFCvtFXu | VFCvtFX
| VFCvtRtzXuF | VFCvtRtzXF | VFSqrt | VFRsqrt7 | VFRec7 | VFClass | VLoadIndexOrd
| VLoadIndexUnord | VStoreIndexOrd | VStoreIndexUnord | VBrev | VBrev8 | VRev8
| VClz | VCtz | VCpopV => VecOperandGroups { vd: lmul, vs2: lmul, vs1: 0 },
VRedSum | VRedAnd | VRedOr | VRedXor | VRedMinU | VRedMin | VRedMaxU | VRedMax
| VFRedOSum | VFRedUSum | VFRedMax | VFRedMin | VWRedSumU | VWRedSum | VFWRedOSum
| VFWRedUSum => VecOperandGroups { vd: 1, vs2: lmul, vs1: 1 },
VWAddU | VWAdd | VWSubU | VWSub | VWMulU | VWMul | VWMulSU | VWMaccU | VWMacc
| VWMaccSU | VWMaccUS | VWsll | VFWAdd | VFWSub | VFWMul | VFWMacc | VFWNMacc
| VFWMSac | VFWNMSac => VecOperandGroups { vd: emul_widened, vs2: lmul, vs1: vs1_base },
VWAddUW | VWAddW | VWSubUW | VWSubW | VFWAddW | VFWSubW => {
VecOperandGroups { vd: emul_widened, vs2: emul_widened, vs1: vs1_base }
}
VNSrl | VNSra | VNClipU | VNClip => {
VecOperandGroups { vd: lmul, vs2: emul_widened, vs1: vs1_base }
}
VZextVf2 | VSextVf2 => VecOperandGroups { vd: lmul, vs2: (lmul / 2).max(1), vs1: 0 },
VZextVf4 | VSextVf4 => VecOperandGroups { vd: lmul, vs2: (lmul / 4).max(1), vs1: 0 },
VZextVf8 | VSextVf8 => VecOperandGroups { vd: lmul, vs2: (lmul / 8).max(1), vs1: 0 },
VFWCvtXuF | VFWCvtXF | VFWCvtFXu | VFWCvtFX | VFWCvtFF | VFWCvtRtzXuF | VFWCvtRtzXF => {
VecOperandGroups { vd: emul_widened, vs2: lmul, vs1: 0 }
}
VFNCvtXuF | VFNCvtXF | VFNCvtFXu | VFNCvtFX | VFNCvtFF | VFNCvtRodFF | VFNCvtRtzXuF
| VFNCvtRtzXF => VecOperandGroups { vd: lmul, vs2: emul_widened, vs1: 0 },
VMvXS | VFMvFS | VCPopM | VFirstM => VecOperandGroups { vd: 0, vs2: 1, vs1: 0 },
VMvSX | VFMvSF | VLoadMask | VStoreMask => VecOperandGroups { vd: 1, vs2: 0, vs1: 0 },
VMSeq | VMSne | VMSltu | VMSlt | VMSleu | VMSle | VMSgtu | VMSgt | VMFEq | VMFNe
| VMFLt | VMFLe | VMFGt | VMFGe | VMadc | VMsbc => {
VecOperandGroups { vd: 1, vs2: lmul, vs1: vs1_base }
}
VMSbfM | VMSofM | VMSifM | VMv1r => VecOperandGroups { vd: 1, vs2: 1, vs1: 0 },
VIotaM => VecOperandGroups { vd: lmul, vs2: 1, vs1: 0 },
VIdV | VLoadUnit | VLoadFF | VStoreUnit | VLoadStride | VStoreStride => {
VecOperandGroups { vd: lmul, vs2: 0, vs1: 0 }
}
VMAndMM | VMNandMM | VMAndnMM | VMOrMM | VMNorMM | VMOrnMM | VMXorMM | VMXnorMM => {
VecOperandGroups { vd: 1, vs2: 1, vs1: 1 }
}
VMv2r => VecOperandGroups { vd: 2, vs2: 2, vs1: 0 },
VMv4r => VecOperandGroups { vd: 4, vs2: 4, vs1: 0 },
VMv8r => VecOperandGroups { vd: 8, vs2: 8, vs1: 0 },
VLoadWholeReg | VStoreWholeReg => {
let regs = nf + 1;
VecOperandGroups { vd: regs, vs2: 0, vs1: 0 }
}
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum SlideOffset {
Rs1,
Imm(u8),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum IntOp {
Add,
Sub,
Rsub,
And,
Or,
Xor,
Sll,
Srl,
Sra,
MinU,
Min,
MaxU,
Max,
Mul,
Mulh,
Mulhu,
Mulhsu,
DivU,
Div,
RemU,
Rem,
SAddU,
SAdd,
SSubU,
SSub,
AAddU,
AAdd,
ASubU,
ASub,
Smul,
SSrl,
SSra,
AndN,
Brev,
Brev8,
Rev8,
Clz,
Ctz,
CpopV,
Rol,
Ror,
ClMul,
ClMulH,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum CompareOp {
Eq,
Ne,
LtU,
Lt,
LeU,
Le,
GtU,
Gt,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum CarryOp {
Adc,
Madc,
Sbc,
Msbc,
}
impl CarryOp {
#[must_use]
pub const fn writes_mask(self) -> bool {
matches!(self, Self::Madc | Self::Msbc)
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum MaccOp {
Macc,
NMSac,
Madd,
NMSub,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum WidenOp {
AddU,
Add,
SubU,
Sub,
AddUW,
AddW,
SubUW,
SubW,
MulU,
Mul,
MulSU,
Sll,
}
impl WidenOp {
#[must_use]
pub const fn reads_wide_vs2(self) -> bool {
matches!(self, Self::AddUW | Self::AddW | Self::SubUW | Self::SubW)
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum WidenMaccOp {
MaccU,
Macc,
MaccSU,
MaccUS,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum NarrowOp {
Srl,
Sra,
ClipU,
Clip,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct ExtendOp {
pub signed: bool,
pub factor: u8,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum VecAluOp {
Int(IntOp),
Compare(CompareOp),
Carry(CarryOp),
Macc(MaccOp),
Widen(WidenOp),
WidenMacc(WidenMaccOp),
Narrow(NarrowOp),
Extend(ExtendOp),
Merge,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum IntReduceOp {
Sum,
And,
Or,
Xor,
MinU,
Min,
MaxU,
Max,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum WidenIntReduceOp {
SumU,
Sum,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum FpReduceOp {
OSum,
USum,
Max,
Min,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum FpWidenReduceOp {
OSum,
USum,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum ReduceOp {
Int(IntReduceOp),
WidenInt(WidenIntReduceOp),
Fp(FpReduceOp),
FpWiden(FpWidenReduceOp),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum MaskLogicalOp {
And,
Nand,
AndNot,
Or,
Nor,
OrNot,
Xor,
Xnor,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum MaskSetOp {
BeforeFirst,
IncludingFirst,
OnlyFirst,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum MaskOp {
Logical(MaskLogicalOp),
CPop,
First,
Set(MaskSetOp),
Iota,
Id,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum PermuteOp {
MvXS,
MvSX,
SlideUp(SlideOffset),
SlideDown(SlideOffset),
Slide1Up,
Slide1Down,
Rgather,
RgatherEi16,
Compress,
WholeMove(u8),
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum CryptoOp {
AesEm,
AesEf,
AesDm,
AesDf,
AesZ,
AesKf1,
AesKf2,
Sha2Ms,
Sha2Ch,
Sha2Cl,
Sm3Me,
Sm3C,
Sm4R,
Sm4K,
Gmul,
Ghsh,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum VecClass {
None,
Config,
Load,
Store,
Fp,
Alu(VecAluOp),
Reduce(ReduceOp),
Mask(MaskOp),
Permute(PermuteOp),
Crypto(CryptoOp),
}
impl VectorOp {
#[must_use]
#[allow(clippy::too_many_lines, clippy::enum_glob_use)]
pub const fn class(self) -> VecClass {
use VectorOp::*;
match self {
None => VecClass::None,
Vsetvli | Vsetivli | Vsetvl => VecClass::Config,
VLoadUnit | VLoadFF | VLoadMask | VLoadWholeReg | VLoadStride | VLoadIndexOrd
| VLoadIndexUnord => VecClass::Load,
VStoreUnit | VStoreMask | VStoreWholeReg | VStoreStride | VStoreIndexOrd
| VStoreIndexUnord => VecClass::Store,
VFAdd | VFSub | VFRSub | VFMul | VFDiv | VFRDiv | VFMin | VFMax | VFSgnj | VFSgnjn
| VFSgnjx | VMFEq | VMFNe | VMFLt | VMFLe | VMFGt | VMFGe | VFMacc | VFNMacc
| VFMSac | VFNMSac | VFMAdd | VFNMAdd | VFMSub | VFNMSub | VFSqrt | VFRsqrt7
| VFRec7 | VFClass | VFCvtXuF | VFCvtXF | VFCvtFXu | VFCvtFX | VFCvtRtzXuF
| VFCvtRtzXF | VFWAdd | VFWSub | VFWMul | VFWAddW | VFWSubW | VFWMacc | VFWNMacc
| VFWMSac | VFWNMSac | VFWCvtXuF | VFWCvtXF | VFWCvtFXu | VFWCvtFX | VFWCvtFF
| VFWCvtRtzXuF | VFWCvtRtzXF | VFNCvtXuF | VFNCvtXF | VFNCvtFXu | VFNCvtFX
| VFNCvtFF | VFNCvtRodFF | VFNCvtRtzXuF | VFNCvtRtzXF | VFMerge | VFMvSF | VFMvFS
| VFSlide1Up | VFSlide1Down => VecClass::Fp,
VAdd => VecClass::Alu(VecAluOp::Int(IntOp::Add)),
VSub => VecClass::Alu(VecAluOp::Int(IntOp::Sub)),
VRsub => VecClass::Alu(VecAluOp::Int(IntOp::Rsub)),
VAnd => VecClass::Alu(VecAluOp::Int(IntOp::And)),
VOr => VecClass::Alu(VecAluOp::Int(IntOp::Or)),
VXor => VecClass::Alu(VecAluOp::Int(IntOp::Xor)),
VSll => VecClass::Alu(VecAluOp::Int(IntOp::Sll)),
VSrl => VecClass::Alu(VecAluOp::Int(IntOp::Srl)),
VSra => VecClass::Alu(VecAluOp::Int(IntOp::Sra)),
VMinU => VecClass::Alu(VecAluOp::Int(IntOp::MinU)),
VMin => VecClass::Alu(VecAluOp::Int(IntOp::Min)),
VMaxU => VecClass::Alu(VecAluOp::Int(IntOp::MaxU)),
VMax => VecClass::Alu(VecAluOp::Int(IntOp::Max)),
VMul => VecClass::Alu(VecAluOp::Int(IntOp::Mul)),
VMulh => VecClass::Alu(VecAluOp::Int(IntOp::Mulh)),
VMulhu => VecClass::Alu(VecAluOp::Int(IntOp::Mulhu)),
VMulhsu => VecClass::Alu(VecAluOp::Int(IntOp::Mulhsu)),
VDivU => VecClass::Alu(VecAluOp::Int(IntOp::DivU)),
VDiv => VecClass::Alu(VecAluOp::Int(IntOp::Div)),
VRemU => VecClass::Alu(VecAluOp::Int(IntOp::RemU)),
VRem => VecClass::Alu(VecAluOp::Int(IntOp::Rem)),
VSAddU => VecClass::Alu(VecAluOp::Int(IntOp::SAddU)),
VSAdd => VecClass::Alu(VecAluOp::Int(IntOp::SAdd)),
VSSubU => VecClass::Alu(VecAluOp::Int(IntOp::SSubU)),
VSSub => VecClass::Alu(VecAluOp::Int(IntOp::SSub)),
VAAddU => VecClass::Alu(VecAluOp::Int(IntOp::AAddU)),
VAAdd => VecClass::Alu(VecAluOp::Int(IntOp::AAdd)),
VASubU => VecClass::Alu(VecAluOp::Int(IntOp::ASubU)),
VASub => VecClass::Alu(VecAluOp::Int(IntOp::ASub)),
VSmul => VecClass::Alu(VecAluOp::Int(IntOp::Smul)),
VSSrl => VecClass::Alu(VecAluOp::Int(IntOp::SSrl)),
VSSra => VecClass::Alu(VecAluOp::Int(IntOp::SSra)),
VAndN => VecClass::Alu(VecAluOp::Int(IntOp::AndN)),
VBrev => VecClass::Alu(VecAluOp::Int(IntOp::Brev)),
VBrev8 => VecClass::Alu(VecAluOp::Int(IntOp::Brev8)),
VRev8 => VecClass::Alu(VecAluOp::Int(IntOp::Rev8)),
VClz => VecClass::Alu(VecAluOp::Int(IntOp::Clz)),
VCtz => VecClass::Alu(VecAluOp::Int(IntOp::Ctz)),
VCpopV => VecClass::Alu(VecAluOp::Int(IntOp::CpopV)),
VRol => VecClass::Alu(VecAluOp::Int(IntOp::Rol)),
VRor => VecClass::Alu(VecAluOp::Int(IntOp::Ror)),
VClMul => VecClass::Alu(VecAluOp::Int(IntOp::ClMul)),
VClMulH => VecClass::Alu(VecAluOp::Int(IntOp::ClMulH)),
VMerge => VecClass::Alu(VecAluOp::Merge),
VMSeq => VecClass::Alu(VecAluOp::Compare(CompareOp::Eq)),
VMSne => VecClass::Alu(VecAluOp::Compare(CompareOp::Ne)),
VMSltu => VecClass::Alu(VecAluOp::Compare(CompareOp::LtU)),
VMSlt => VecClass::Alu(VecAluOp::Compare(CompareOp::Lt)),
VMSleu => VecClass::Alu(VecAluOp::Compare(CompareOp::LeU)),
VMSle => VecClass::Alu(VecAluOp::Compare(CompareOp::Le)),
VMSgtu => VecClass::Alu(VecAluOp::Compare(CompareOp::GtU)),
VMSgt => VecClass::Alu(VecAluOp::Compare(CompareOp::Gt)),
VAdc => VecClass::Alu(VecAluOp::Carry(CarryOp::Adc)),
VMadc => VecClass::Alu(VecAluOp::Carry(CarryOp::Madc)),
VSbc => VecClass::Alu(VecAluOp::Carry(CarryOp::Sbc)),
VMsbc => VecClass::Alu(VecAluOp::Carry(CarryOp::Msbc)),
VMacc => VecClass::Alu(VecAluOp::Macc(MaccOp::Macc)),
VNMSac => VecClass::Alu(VecAluOp::Macc(MaccOp::NMSac)),
VMadd => VecClass::Alu(VecAluOp::Macc(MaccOp::Madd)),
VNMSub => VecClass::Alu(VecAluOp::Macc(MaccOp::NMSub)),
VWAddU => VecClass::Alu(VecAluOp::Widen(WidenOp::AddU)),
VWAdd => VecClass::Alu(VecAluOp::Widen(WidenOp::Add)),
VWSubU => VecClass::Alu(VecAluOp::Widen(WidenOp::SubU)),
VWSub => VecClass::Alu(VecAluOp::Widen(WidenOp::Sub)),
VWAddUW => VecClass::Alu(VecAluOp::Widen(WidenOp::AddUW)),
VWAddW => VecClass::Alu(VecAluOp::Widen(WidenOp::AddW)),
VWSubUW => VecClass::Alu(VecAluOp::Widen(WidenOp::SubUW)),
VWSubW => VecClass::Alu(VecAluOp::Widen(WidenOp::SubW)),
VWMulU => VecClass::Alu(VecAluOp::Widen(WidenOp::MulU)),
VWMul => VecClass::Alu(VecAluOp::Widen(WidenOp::Mul)),
VWMulSU => VecClass::Alu(VecAluOp::Widen(WidenOp::MulSU)),
VWsll => VecClass::Alu(VecAluOp::Widen(WidenOp::Sll)),
VWMaccU => VecClass::Alu(VecAluOp::WidenMacc(WidenMaccOp::MaccU)),
VWMacc => VecClass::Alu(VecAluOp::WidenMacc(WidenMaccOp::Macc)),
VWMaccSU => VecClass::Alu(VecAluOp::WidenMacc(WidenMaccOp::MaccSU)),
VWMaccUS => VecClass::Alu(VecAluOp::WidenMacc(WidenMaccOp::MaccUS)),
VNSrl => VecClass::Alu(VecAluOp::Narrow(NarrowOp::Srl)),
VNSra => VecClass::Alu(VecAluOp::Narrow(NarrowOp::Sra)),
VNClipU => VecClass::Alu(VecAluOp::Narrow(NarrowOp::ClipU)),
VNClip => VecClass::Alu(VecAluOp::Narrow(NarrowOp::Clip)),
VZextVf2 => VecClass::Alu(VecAluOp::Extend(ExtendOp { signed: false, factor: 2 })),
VZextVf4 => VecClass::Alu(VecAluOp::Extend(ExtendOp { signed: false, factor: 4 })),
VZextVf8 => VecClass::Alu(VecAluOp::Extend(ExtendOp { signed: false, factor: 8 })),
VSextVf2 => VecClass::Alu(VecAluOp::Extend(ExtendOp { signed: true, factor: 2 })),
VSextVf4 => VecClass::Alu(VecAluOp::Extend(ExtendOp { signed: true, factor: 4 })),
VSextVf8 => VecClass::Alu(VecAluOp::Extend(ExtendOp { signed: true, factor: 8 })),
VRedSum => VecClass::Reduce(ReduceOp::Int(IntReduceOp::Sum)),
VRedAnd => VecClass::Reduce(ReduceOp::Int(IntReduceOp::And)),
VRedOr => VecClass::Reduce(ReduceOp::Int(IntReduceOp::Or)),
VRedXor => VecClass::Reduce(ReduceOp::Int(IntReduceOp::Xor)),
VRedMinU => VecClass::Reduce(ReduceOp::Int(IntReduceOp::MinU)),
VRedMin => VecClass::Reduce(ReduceOp::Int(IntReduceOp::Min)),
VRedMaxU => VecClass::Reduce(ReduceOp::Int(IntReduceOp::MaxU)),
VRedMax => VecClass::Reduce(ReduceOp::Int(IntReduceOp::Max)),
VWRedSumU => VecClass::Reduce(ReduceOp::WidenInt(WidenIntReduceOp::SumU)),
VWRedSum => VecClass::Reduce(ReduceOp::WidenInt(WidenIntReduceOp::Sum)),
VFRedOSum => VecClass::Reduce(ReduceOp::Fp(FpReduceOp::OSum)),
VFRedUSum => VecClass::Reduce(ReduceOp::Fp(FpReduceOp::USum)),
VFRedMax => VecClass::Reduce(ReduceOp::Fp(FpReduceOp::Max)),
VFRedMin => VecClass::Reduce(ReduceOp::Fp(FpReduceOp::Min)),
VFWRedOSum => VecClass::Reduce(ReduceOp::FpWiden(FpWidenReduceOp::OSum)),
VFWRedUSum => VecClass::Reduce(ReduceOp::FpWiden(FpWidenReduceOp::USum)),
VMAndMM => VecClass::Mask(MaskOp::Logical(MaskLogicalOp::And)),
VMNandMM => VecClass::Mask(MaskOp::Logical(MaskLogicalOp::Nand)),
VMAndnMM => VecClass::Mask(MaskOp::Logical(MaskLogicalOp::AndNot)),
VMOrMM => VecClass::Mask(MaskOp::Logical(MaskLogicalOp::Or)),
VMNorMM => VecClass::Mask(MaskOp::Logical(MaskLogicalOp::Nor)),
VMOrnMM => VecClass::Mask(MaskOp::Logical(MaskLogicalOp::OrNot)),
VMXorMM => VecClass::Mask(MaskOp::Logical(MaskLogicalOp::Xor)),
VMXnorMM => VecClass::Mask(MaskOp::Logical(MaskLogicalOp::Xnor)),
VCPopM => VecClass::Mask(MaskOp::CPop),
VFirstM => VecClass::Mask(MaskOp::First),
VMSbfM => VecClass::Mask(MaskOp::Set(MaskSetOp::BeforeFirst)),
VMSifM => VecClass::Mask(MaskOp::Set(MaskSetOp::IncludingFirst)),
VMSofM => VecClass::Mask(MaskOp::Set(MaskSetOp::OnlyFirst)),
VIotaM => VecClass::Mask(MaskOp::Iota),
VIdV => VecClass::Mask(MaskOp::Id),
VMvXS => VecClass::Permute(PermuteOp::MvXS),
VMvSX => VecClass::Permute(PermuteOp::MvSX),
VSlideUp(offset) => VecClass::Permute(PermuteOp::SlideUp(offset)),
VSlideDown(offset) => VecClass::Permute(PermuteOp::SlideDown(offset)),
VSlide1Up => VecClass::Permute(PermuteOp::Slide1Up),
VSlide1Down => VecClass::Permute(PermuteOp::Slide1Down),
VRgather => VecClass::Permute(PermuteOp::Rgather),
VRgatherEi16 => VecClass::Permute(PermuteOp::RgatherEi16),
VCompress => VecClass::Permute(PermuteOp::Compress),
VMv1r => VecClass::Permute(PermuteOp::WholeMove(1)),
VMv2r => VecClass::Permute(PermuteOp::WholeMove(2)),
VMv4r => VecClass::Permute(PermuteOp::WholeMove(4)),
VMv8r => VecClass::Permute(PermuteOp::WholeMove(8)),
VAesEm => VecClass::Crypto(CryptoOp::AesEm),
VAesEf => VecClass::Crypto(CryptoOp::AesEf),
VAesDm => VecClass::Crypto(CryptoOp::AesDm),
VAesDf => VecClass::Crypto(CryptoOp::AesDf),
VAesZ => VecClass::Crypto(CryptoOp::AesZ),
VAesKf1 => VecClass::Crypto(CryptoOp::AesKf1),
VAesKf2 => VecClass::Crypto(CryptoOp::AesKf2),
VSha2Ms => VecClass::Crypto(CryptoOp::Sha2Ms),
VSha2Ch => VecClass::Crypto(CryptoOp::Sha2Ch),
VSha2Cl => VecClass::Crypto(CryptoOp::Sha2Cl),
VSm3Me => VecClass::Crypto(CryptoOp::Sm3Me),
VSm3C => VecClass::Crypto(CryptoOp::Sm3C),
VSm4R => VecClass::Crypto(CryptoOp::Sm4R),
VSm4K => VecClass::Crypto(CryptoOp::Sm4K),
VGmul => VecClass::Crypto(CryptoOp::Gmul),
VGhsh => VecClass::Crypto(CryptoOp::Ghsh),
}
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum VecSrcEncoding {
#[default]
None,
VV,
VX,
VI,
VF,
}