use super::*;
use crate::ir::variable::SsaVarId;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[repr(u16)]
#[derive(num_enum::IntoPrimitive, num_enum::TryFromPrimitive)]
pub enum VectorCryptoKind {
AesEncrypt,
AesEncryptLast,
AesDecrypt,
AesDecryptLast,
AesInvMixColumns,
AesKeygenAssist,
AesEncryptRound,
AesDecryptRound,
AesMixColumns,
Sha1Rounds4,
Sha1NextE,
Sha1Msg1,
Sha1Msg2,
Sha256Rounds2,
Sha256Msg1,
Sha256Msg2,
Sha512Rounds2,
Sha512Msg1,
Sha512Msg2,
Sm3Msg1,
Sm3Msg2,
Sm3Rounds2,
Sm4Key,
Sm4Rounds,
Gf2p8Affine,
Gf2p8AffineInv,
Gf2p8Mul,
CarrylessMul,
AesEncryptKeyLocker,
AesDecryptKeyLocker,
Sha1HashChoose,
Sha1HashMajority,
Sha1HashParity,
Sha1FixedRotate,
Sha1ScheduleUpdate0,
Sha1ScheduleUpdate1,
Sha256Hash,
Sha256Hash2,
Sha256ScheduleUpdate0,
Sha256ScheduleUpdate1,
Sm3PartW1,
Sm3PartW2,
Sm3SS1,
Sm3TT1A,
Sm3TT1B,
Sm3TT2A,
Sm3TT2B,
PolynomialMultiply,
}
impl VectorCryptoKind {
#[must_use]
pub const fn effects(self) -> SsaEffects {
SsaEffects::new(SsaEffectKind::Pure, false)
}
#[must_use]
pub const fn kind_str(self) -> &'static str {
match self {
Self::AesEncrypt => "crypto.aesenc",
Self::AesEncryptLast => "crypto.aesenclast",
Self::AesDecrypt => "crypto.aesdec",
Self::AesDecryptLast => "crypto.aesdeclast",
Self::AesInvMixColumns => "crypto.aesimc",
Self::AesKeygenAssist => "crypto.aeskeygenassist",
Self::AesEncryptRound => "crypto.aese",
Self::AesDecryptRound => "crypto.aesd",
Self::AesMixColumns => "crypto.aesmc",
Self::Sha1Rounds4 => "crypto.sha1rnds4",
Self::Sha1NextE => "crypto.sha1nexte",
Self::Sha1Msg1 => "crypto.sha1msg1",
Self::Sha1Msg2 => "crypto.sha1msg2",
Self::Sha256Rounds2 => "crypto.sha256rnds2",
Self::Sha256Msg1 => "crypto.sha256msg1",
Self::Sha256Msg2 => "crypto.sha256msg2",
Self::Sha512Rounds2 => "crypto.sha512rnds2",
Self::Sha512Msg1 => "crypto.sha512msg1",
Self::Sha512Msg2 => "crypto.sha512msg2",
Self::Sm3Msg1 => "crypto.sm3msg1",
Self::Sm3Msg2 => "crypto.sm3msg2",
Self::Sm3Rounds2 => "crypto.sm3rnds2",
Self::Sm4Key => "crypto.sm4key",
Self::Sm4Rounds => "crypto.sm4rnds",
Self::Gf2p8Affine => "crypto.gf2p8affine",
Self::Gf2p8AffineInv => "crypto.gf2p8affineinv",
Self::Gf2p8Mul => "crypto.gf2p8mul",
Self::CarrylessMul => "crypto.pclmulqdq",
Self::AesEncryptKeyLocker => "crypto.aesenckl",
Self::AesDecryptKeyLocker => "crypto.aesdeckl",
Self::Sha1HashChoose => "crypto.sha1c",
Self::Sha1HashMajority => "crypto.sha1m",
Self::Sha1HashParity => "crypto.sha1p",
Self::Sha1FixedRotate => "crypto.sha1h",
Self::Sha1ScheduleUpdate0 => "crypto.sha1su0",
Self::Sha1ScheduleUpdate1 => "crypto.sha1su1",
Self::Sha256Hash => "crypto.sha256h",
Self::Sha256Hash2 => "crypto.sha256h2",
Self::Sha256ScheduleUpdate0 => "crypto.sha256su0",
Self::Sha256ScheduleUpdate1 => "crypto.sha256su1",
Self::Sm3PartW1 => "crypto.sm3partw1",
Self::Sm3PartW2 => "crypto.sm3partw2",
Self::Sm3SS1 => "crypto.sm3ss1",
Self::Sm3TT1A => "crypto.sm3tt1a",
Self::Sm3TT1B => "crypto.sm3tt1b",
Self::Sm3TT2A => "crypto.sm3tt2a",
Self::Sm3TT2B => "crypto.sm3tt2b",
Self::PolynomialMultiply => "crypto.pmull",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum TileDotKind {
Int8SignedSigned,
Int8SignedUnsigned,
Int8UnsignedSigned,
Int8UnsignedUnsigned,
Bf16,
Fp16,
ComplexFp16Real,
ComplexFp16Imaginary,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum TileOpKind {
DotProduct(TileDotKind),
Load,
Store,
Zero,
LoadConfig,
StoreConfig,
Release,
}
impl TileOpKind {
#[must_use]
pub const fn effects(self) -> SsaEffects {
match self {
Self::DotProduct(_) | Self::Zero => SsaEffects::new(SsaEffectKind::Pure, false),
Self::Load | Self::LoadConfig => SsaEffects::new(SsaEffectKind::Read, false),
Self::Store | Self::StoreConfig | Self::Release => {
SsaEffects::new(SsaEffectKind::Write, false)
}
}
}
#[must_use]
pub const fn kind_str(self) -> &'static str {
match self {
Self::DotProduct(TileDotKind::Int8SignedSigned) => "tile.dp.bssd",
Self::DotProduct(TileDotKind::Int8SignedUnsigned) => "tile.dp.bsud",
Self::DotProduct(TileDotKind::Int8UnsignedSigned) => "tile.dp.busd",
Self::DotProduct(TileDotKind::Int8UnsignedUnsigned) => "tile.dp.buud",
Self::DotProduct(TileDotKind::Bf16) => "tile.dp.bf16ps",
Self::DotProduct(TileDotKind::Fp16) => "tile.dp.fp16ps",
Self::DotProduct(TileDotKind::ComplexFp16Real) => "tile.cmm.rlfp16ps",
Self::DotProduct(TileDotKind::ComplexFp16Imaginary) => "tile.cmm.imfp16ps",
Self::Load => "tile.load",
Self::Store => "tile.store",
Self::Zero => "tile.zero",
Self::LoadConfig => "tile.ldcfg",
Self::StoreConfig => "tile.stcfg",
Self::Release => "tile.release",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct VectorPermuteData {
pub outputs: Vec<SsaVarId>,
pub inputs: Vec<SsaVarId>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[repr(u16)]
#[derive(num_enum::IntoPrimitive, num_enum::TryFromPrimitive)]
pub enum VectorMaddKind {
MultiplyAddS16,
MultiplyAddU8S8Sat,
DotProductU8S8,
DotProductU8S8Sat,
DotProductS16,
DotProductS16Sat,
MultiplyAdd52Lo,
MultiplyAdd52Hi,
DotProductBf16,
MultiplyAccumulate,
MultiplyAccumulateSat,
MultiplyAccumulatePairs,
MultiplyAccumulatePairsSat,
DotProductS8S8,
DotProductS8S8Sat,
DotProductS8U8,
DotProductS8U8Sat,
DotProductU8U8,
DotProductU8U8Sat,
DotProductS16U16,
DotProductS16U16Sat,
DotProductU16S16,
DotProductU16S16Sat,
DotProductU16U16,
DotProductU16U16Sat,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[repr(u16)]
#[derive(num_enum::IntoPrimitive, num_enum::TryFromPrimitive)]
pub enum ComplexMulKind {
Multiply,
ConjugateMultiply,
MultiplyAdd,
ConjugateMultiplyAdd,
}
impl ComplexMulKind {
#[must_use]
pub const fn kind_str(self) -> &'static str {
match self {
Self::Multiply => "vector.cmul",
Self::ConjugateMultiply => "vector.cmul.conj",
Self::MultiplyAdd => "vector.cmadd",
Self::ConjugateMultiplyAdd => "vector.cmadd.conj",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct VectorDotProductData {
pub imm8: u8,
pub element_bits: u16,
pub outputs: Vec<SsaVarId>,
pub inputs: Vec<SsaVarId>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct VectorIntDotProductData {
pub signed_a: bool,
pub signed_b: bool,
pub source_bits: u16,
pub dest_bits: u16,
pub outputs: Vec<SsaVarId>,
pub inputs: Vec<SsaVarId>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct VectorShuffleBitsData {
pub outputs: Vec<SsaVarId>,
pub inputs: Vec<SsaVarId>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct VectorIntersectData {
pub outputs: Vec<SsaVarId>,
pub inputs: Vec<SsaVarId>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct VectorBitfieldData {
pub insert: bool,
pub index: u8,
pub length: u8,
pub outputs: Vec<SsaVarId>,
pub inputs: Vec<SsaVarId>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ByteMoveCondition {
Zero,
NonZero,
Negative,
NonNegative,
}
impl ByteMoveCondition {
#[must_use]
pub const fn kind_str(self) -> &'static str {
match self {
Self::Zero => "z",
Self::NonZero => "nz",
Self::Negative => "lz",
Self::NonNegative => "gez",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct VectorConditionalMoveData {
pub condition: ByteMoveCondition,
pub outputs: Vec<SsaVarId>,
pub inputs: Vec<SsaVarId>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct VectorStringCompareData {
pub imm8: u8,
pub explicit_length: bool,
pub result_index: bool,
pub outputs: Vec<SsaVarId>,
pub inputs: Vec<SsaVarId>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct VectorHorizontalMinPosData {
pub outputs: Vec<SsaVarId>,
pub inputs: Vec<SsaVarId>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct VectorHorizontalReduceData {
pub subtract: bool,
pub unsigned: bool,
pub source_bits: u16,
pub dest_bits: u16,
pub outputs: Vec<SsaVarId>,
pub inputs: Vec<SsaVarId>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct VectorPackNarrowData {
pub unsigned: bool,
pub outputs: Vec<SsaVarId>,
pub inputs: Vec<SsaVarId>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum SvePermuteKind {
Index,
InsertShift,
Compact,
Splice,
ExtractLastActive,
ExtractLastBefore,
CopyLastActive,
CopyLastBefore,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum FpHelperKind {
ReciprocalExponent,
ExtractExponent,
ExpAccelerate,
TrigMulAdd,
TrigSelectMul,
TrigSelect,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PredicateGenKind {
True,
False,
Next,
First,
ReadFfr,
UnpackHi,
UnpackLo,
Select,
HazardRw,
HazardWr,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct VectorSmeOuterProductData {
pub subtract: bool,
pub signed_a: bool,
pub signed_b: bool,
pub float: bool,
pub outputs: Vec<SsaVarId>,
pub inputs: Vec<SsaVarId>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct VectorMatrixMulAccData {
pub signed_a: bool,
pub signed_b: bool,
pub float: bool,
pub outputs: Vec<SsaVarId>,
pub inputs: Vec<SsaVarId>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct VectorReverseChunksData {
pub chunk_bits: u16,
pub outputs: Vec<SsaVarId>,
pub inputs: Vec<SsaVarId>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct VectorCountAdjustData {
pub decrement: bool,
pub saturate: bool,
pub signed: bool,
pub by_predicate: bool,
pub element_bits: u16,
pub outputs: Vec<SsaVarId>,
pub inputs: Vec<SsaVarId>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct VectorExtendInLaneData {
pub signed: bool,
pub source_bits: u16,
pub element_bits: u16,
pub outputs: Vec<SsaVarId>,
pub inputs: Vec<SsaVarId>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct VectorElementCountData {
pub element_bits: u16,
pub multiplier: u32,
pub outputs: Vec<SsaVarId>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct VectorSveAddressGenData {
pub signed_extend: Option<bool>,
pub shift: u8,
pub outputs: Vec<SsaVarId>,
pub inputs: Vec<SsaVarId>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum SveComputeKind {
AddCarryBottom,
AddCarryTop,
SubCarryBottom,
SubCarryTop,
BitDeposit,
BitExtract,
BitGroup,
Histogram,
HistogramSegment,
MatchElements,
NoMatchElements,
ClampSigned,
ClampUnsigned,
DivideReversedSigned,
DivideReversedUnsigned,
InterleaveXorBottomTop,
InterleaveXorTopBottom,
SaturatingAbs,
SaturatingNeg,
LogicalNot,
ComplexDotProduct,
ComplexMulAddRounding,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct VectorSveComputeData {
pub op: SveComputeKind,
pub element_bits: u16,
pub rotation: u16,
pub outputs: Vec<SsaVarId>,
pub inputs: Vec<SsaVarId>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PredicateOpKind {
CountActive,
Test,
SetFirstFault,
WriteFirstFault,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct VectorPredicateOpData {
pub op: PredicateOpKind,
pub element_bits: u16,
pub outputs: Vec<SsaVarId>,
pub inputs: Vec<SsaVarId>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum SmeMiscKind {
AddHorizontal,
AddVertical,
ZeroTiles,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct VectorSmeMiscData {
pub op: SmeMiscKind,
pub element_bits: u16,
pub outputs: Vec<SsaVarId>,
pub inputs: Vec<SsaVarId>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct VectorStructLoadReplicateData {
pub count: u8,
pub element_bits: u16,
pub outputs: Vec<SsaVarId>,
pub inputs: Vec<SsaVarId>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[repr(u16)]
#[derive(num_enum::IntoPrimitive, num_enum::TryFromPrimitive)]
pub enum FlagAdjustKind {
InvertCarry,
RotateMaskInsert,
SetNzFrom8,
SetNzFrom16,
ConvertToFpFlags,
ConvertFromFpFlags,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct VectorComplexAddData {
pub rotate_270: bool,
pub saturate: bool,
pub outputs: Vec<SsaVarId>,
pub inputs: Vec<SsaVarId>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct VectorPredicateBreakData {
pub after: bool,
pub pair: bool,
pub propagate: bool,
pub outputs: Vec<SsaVarId>,
pub inputs: Vec<SsaVarId>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct VectorPredicateWhileData {
pub kind: VectorCompareKind,
pub unsigned: bool,
pub outputs: Vec<SsaVarId>,
pub inputs: Vec<SsaVarId>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct VectorNarrowSaturateData {
pub signed_src: bool,
pub unsigned_dst: bool,
pub rounding: bool,
pub shift: u8,
pub outputs: Vec<SsaVarId>,
pub inputs: Vec<SsaVarId>,
}
impl VectorMaddKind {
#[must_use]
pub const fn kind_str(self) -> &'static str {
match self {
Self::MultiplyAddS16 => "vector.madd.s16",
Self::MultiplyAddU8S8Sat => "vector.madd.u8s8.sat",
Self::DotProductU8S8 => "vector.dp.u8s8",
Self::DotProductU8S8Sat => "vector.dp.u8s8.sat",
Self::DotProductS16 => "vector.dp.s16",
Self::DotProductS16Sat => "vector.dp.s16.sat",
Self::MultiplyAdd52Lo => "vector.madd52.lo",
Self::MultiplyAdd52Hi => "vector.madd52.hi",
Self::DotProductBf16 => "vector.dp.bf16",
Self::MultiplyAccumulate => "vector.mac",
Self::MultiplyAccumulateSat => "vector.mac.sat",
Self::MultiplyAccumulatePairs => "vector.macd",
Self::MultiplyAccumulatePairsSat => "vector.macd.sat",
Self::DotProductS8S8 => "vector.dp.s8s8",
Self::DotProductS8S8Sat => "vector.dp.s8s8.sat",
Self::DotProductS8U8 => "vector.dp.s8u8",
Self::DotProductS8U8Sat => "vector.dp.s8u8.sat",
Self::DotProductU8U8 => "vector.dp.u8u8",
Self::DotProductU8U8Sat => "vector.dp.u8u8.sat",
Self::DotProductS16U16 => "vector.dp.s16u16",
Self::DotProductS16U16Sat => "vector.dp.s16u16.sat",
Self::DotProductU16S16 => "vector.dp.u16s16",
Self::DotProductU16S16Sat => "vector.dp.u16s16.sat",
Self::DotProductU16U16 => "vector.dp.u16u16",
Self::DotProductU16U16Sat => "vector.dp.u16u16.sat",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum VectorElementKind {
Integer,
Float,
#[default]
Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct VectorElement {
pub kind: VectorElementKind,
pub bits: u32,
pub scalar: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum VectorUnaryKind {
Neg,
Not,
Popcount,
Abs,
HorizontalAdd,
Sqrt,
Round,
Reciprocal,
ReciprocalSqrt,
GetExponent,
GetMantissa,
RoundScale,
Reduce,
Identity,
LeadingZeros,
Fraction,
Conflict,
Exp2,
Log2,
LeadingSignBits,
LeadingOnes,
Truncate,
Floor,
Sign,
BitReverse,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum VectorBinaryKind {
Add,
Sub,
Mul,
Div,
Min,
Max,
And,
Or,
Xor,
Shl,
Shr,
AndNot,
MulHigh,
MulHighRound,
Avg,
AbsDiff,
SatAdd,
SatSub,
Scale,
Range,
Rol,
Ror,
VariableShiftLogical,
VariableShiftArithmetic,
ApplySign,
ReciprocalIter1,
ReciprocalIter2,
ReciprocalSqrtIter1,
MaxMagnitude,
MulNegate,
OrNot,
AddAbs,
Rem,
Nor,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum VectorTernaryKind {
Fma,
Select,
FixupImm,
FunnelLeft,
FunnelRight,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum VectorCompareKind {
Eq,
Ne,
Lt,
Le,
Gt,
Ge,
Unordered,
Ordered,
NotLt,
NotLe,
NotGe,
NotGt,
AlwaysTrue,
AlwaysFalse,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum VectorCastKind {
Signed,
Unsigned,
Float,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum VectorMaskUnaryKind {
Not,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum VectorMaskBinaryKind {
And,
Or,
Xor,
AndNot,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum VectorReduceKind {
Add,
Mul,
And,
Or,
Xor,
Min,
Max,
Any,
All,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum VectorBitmaskKind {
LaneMostSignificantBits,
PredicateBits,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum VectorMaskMode {
Merge,
Zero,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum VectorPackKind {
Compress,
Expand,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum VectorFaultMode {
Normal,
FirstFault,
FaultOnlyFirst,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum VectorSegmentLayout {
Interleaved,
Consecutive,
}