#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[non_exhaustive]
pub enum Backend {
Scalar,
Avx512Vbmi,
Avx2,
Ssse3Sse41,
Neon,
WasmSimd128,
}
impl Backend {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::Scalar => "scalar",
Self::Avx512Vbmi => "avx512-vbmi",
Self::Avx2 => "avx2",
Self::Ssse3Sse41 => "ssse3-sse4.1",
Self::Neon => "neon",
Self::WasmSimd128 => "wasm-simd128",
}
}
#[must_use]
pub const fn required_cpu_features(self) -> &'static [&'static str] {
match self {
Self::Scalar => &[],
Self::Avx512Vbmi => &["avx512f", "avx512bw", "avx512vl", "avx512vbmi"],
Self::Avx2 => &["avx2"],
Self::Ssse3Sse41 => &["ssse3", "sse4.1"],
Self::Neon => &["neon"],
Self::WasmSimd128 => &["simd128"],
}
}
}
impl core::fmt::Display for Backend {
fn fmt(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
formatter.write_str(self.as_str())
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[non_exhaustive]
pub enum CandidateDetectionMode {
SimdFeatureDisabled,
RuntimeCpuFeatures,
CompileTimeTargetFeatures,
}
impl CandidateDetectionMode {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::SimdFeatureDisabled => "simd-feature-disabled",
Self::RuntimeCpuFeatures => "runtime-cpu-features",
Self::CompileTimeTargetFeatures => "compile-time-target-features",
}
}
}
impl core::fmt::Display for CandidateDetectionMode {
fn fmt(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
formatter.write_str(self.as_str())
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[non_exhaustive]
pub enum SecurityPosture {
ScalarOnly,
SimdCandidateScalarActive,
Accelerated,
}
impl SecurityPosture {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::ScalarOnly => "scalar-only",
Self::SimdCandidateScalarActive => "simd-candidate-scalar-active",
Self::Accelerated => "accelerated",
}
}
}
impl core::fmt::Display for SecurityPosture {
fn fmt(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
formatter.write_str(self.as_str())
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[non_exhaustive]
pub enum WipePosture {
HardwareFence,
CompilerFenceOnly,
}
impl WipePosture {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::HardwareFence => "hardware-fence",
Self::CompilerFenceOnly => "compiler-fence-only",
}
}
}
impl core::fmt::Display for WipePosture {
fn fmt(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
formatter.write_str(self.as_str())
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[non_exhaustive]
pub enum CtGatePosture {
HardwareSpeculationBarrier,
HardwareSpeculationBarrierBuildAsserted,
HardwareSpeculationBarrierUnattested,
OrderingFence,
CompilerFenceOnly,
}
impl CtGatePosture {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::HardwareSpeculationBarrier => "hardware-speculation-barrier",
Self::HardwareSpeculationBarrierBuildAsserted => {
"hardware-speculation-barrier-build-asserted"
}
Self::HardwareSpeculationBarrierUnattested => "hardware-speculation-barrier-unattested",
Self::OrderingFence => "ordering-fence",
Self::CompilerFenceOnly => "compiler-fence-only",
}
}
}
impl core::fmt::Display for CtGatePosture {
fn fmt(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
formatter.write_str(self.as_str())
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[non_exhaustive]
pub enum MemoryLockPosture {
NotProvided,
}
impl MemoryLockPosture {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::NotProvided => "not-provided",
}
}
}
impl core::fmt::Display for MemoryLockPosture {
fn fmt(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
formatter.write_str(self.as_str())
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[non_exhaustive]
pub enum BackendPolicy {
ScalarExecutionOnly,
SimdFeatureDisabled,
NoDetectedSimdCandidate,
HighAssuranceScalarOnly,
}
impl BackendPolicy {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::ScalarExecutionOnly => "scalar-execution-only",
Self::SimdFeatureDisabled => "simd-feature-disabled",
Self::NoDetectedSimdCandidate => "no-detected-simd-candidate",
Self::HighAssuranceScalarOnly => "high-assurance-scalar-only",
}
}
}
impl core::fmt::Display for BackendPolicy {
fn fmt(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
formatter.write_str(self.as_str())
}
}
mod report;
pub use report::{
BackendPolicyError, BackendReport, BackendSnapshot, backend_report, require_backend_policy,
};