npsimd 0.3.0

An ergonomic library for architecture-specific vectorization.
Documentation
//! The Streaming SIMD Extensions.

use super::*;

// Extensions:

mod sse2;
pub use sse2::SSE2;

mod ssse3;
pub use ssse3::SSSE3;

/// The SSE feature set group.
pub struct SSE;

impl<E, FS, const LEN: usize> Vector<[E; LEN], SSE, FS>
where E: Movable<SSE, LEN>, FS: HasFeature<SSE, E::Feature> {
    /// Load elements from unaligned memory.
    ///
    /// Instructions: `movss`, `movsd`, `movups`, `movupd`, `movd`, `movq`,
    /// `movdqu`.
    ///
    /// Intel Equivalents: [`_mm_load_ss`], [`_mm_load_sd`], [`_mm_loadu_ps`],
    /// [`_mm_loadu_pd`], [`_mm_loadu_si32`], [`_mm_loadu_si64`],
    /// [`_mm_loadu_si128`].
    #[doc(alias(
        "movss", "movsd", "movups", "movupd", "movd", "movq", "movdqu"
    ))]
    #[doc(alias(
        "_mm_load_ss", "_mm_load_sd", "_mm_loadu_ps", "_mm_loadu_pd",
        "_mm_loadu_si32", "_mm_loadu_si64", "_mm_loadu_si128"
    ))]
    pub fn load(ptr: &[E; LEN], features: FeatureSet<SSE, FS>) -> Self {
        Vector::from_primitive(unsafe { E::load(ptr) })
            .with_features(features)
    }

    /// Load elements from aligned memory.
    ///
    /// Instructions: `movss`, `movsd`, `movaps`, `movapd`, `movd`, `movq`,
    /// `movdqa`.
    ///
    /// Intel Equivalents: [`_mm_load_ss`], [`_mm_load_sd`], [`_mm_load_ps`],
    /// [`_mm_load_pd`], [`_mm_loadu_si32`], [`_mm_loadu_si64`],
    /// [`_mm_load_si128`].
    #[doc(alias(
        "movss", "movsd", "movaps", "movapd", "movd", "movq", "movdqa"
    ))]
    #[doc(alias(
        "_mm_load_ss", "_mm_load_sd", "_mm_load_ps", "_mm_load_pd",
        "_mm_loadu_si32", "_mm_loadu_si64", "_mm_load_si128"
    ))]
    pub fn load_aligned(
        ptr: &Vector<[E; LEN]>,
        features: FeatureSet<SSE, FS>,
    ) -> Self {
        Vector::from_primitive(unsafe { E::load_aligned(ptr) })
            .with_features(features)
    }

    /// Store elements into unaligned memory.
    ///
    /// Instructions: `movss`, `movsd`, `movups`, `movupd`, `movd`, `movq`,
    /// `movdqu`.
    ///
    /// Intel Equivalents: [`_mm_store_ss`], [`_mm_store_sd`], [`_mm_storeu_ps`],
    /// [`_mm_storeu_pd`], [`_mm_storeu_si32`], [`_mm_storeu_si64`],
    /// [`_mm_storeu_si128`].
    #[doc(alias(
        "movss", "movsd", "movups", "movupd", "movd", "movq", "movdqu"
    ))]
    #[doc(alias(
        "_mm_store_ss", "_mm_store_sd", "_mm_storeu_ps", "_mm_storeu_pd",
        "_mm_storeu_si32", "_mm_storeu_si64", "_mm_storeu_si128"
    ))]
    pub fn store(self, ptr: &mut [E; LEN]) {
        unsafe { E::store(self.primitive, ptr) }
    }

    /// Load elements into aligned memory.
    ///
    /// Instructions: `movss`, `movsd`, `movaps`, `movapd`, `movd`, `movq`,
    /// `movdqa`.
    ///
    /// Intel Equivalents: [`_mm_store_ss`], [`_mm_store_sd`], [`_mm_store_ps`],
    /// [`_mm_store_pd`], [`_mm_storeu_si32`], [`_mm_storeu_si64`],
    /// [`_mm_store_si128`].
    #[doc(alias(
        "movss", "movsd", "movaps", "movapd", "movd", "movq", "movdqa"
    ))]
    #[doc(alias(
        "_mm_store_ss", "_mm_store_sd", "_mm_store_ps", "_mm_store_pd",
        "_mm_storeu_si32", "_mm_storeu_si64", "_mm_store_si128"
    ))]
    pub fn store_aligned(self, ptr: &mut Vector<[E; LEN]>) {
        unsafe { E::store_aligned(self.primitive, ptr) }
    }
}