| Crates.io | safe_unaligned_simd |
| lib.rs | safe_unaligned_simd |
| version | 0.2.3 |
| created_at | 2025-07-10 05:48:00.542808+00 |
| updated_at | 2025-09-24 18:56:57.864917+00 |
| description | Safe SIMD wrappers for unaligned load and store operations. |
| homepage | https://github.com/okaneco/safe_unaligned_simd |
| repository | https://github.com/okaneco/safe_unaligned_simd |
| max_upload_size | |
| id | 1745916 |
| size | 459,592 |
safe_unaligned_simdSafe wrappers for unaligned SIMD load and store operations.
The goal of this crate is to remove the need for "unnecessary unsafe" code when using vector intrinsics to access memory, with no alignment requirements.
Platform-intrinsics that take raw pointers have been wrapped in functions that receive Rust reference types as arguments.
MSRV: 1.88
This crate is compatible with runtime feature detection.
Unlike some other safe architecture intrinsic wrappers, this crate does not lock the user into #[cfg()]-gating SIMD code behind compile-time CPU target feature declaration.
x86 / x86_64sse, sse2, avx, avx512f, avx512vl, avx512bw, avx512vbmi2Some functions have variants that are generic over Cell array types, which allow for mutation of shared references.
See the cell module for an example.
Example function signatures:
#[target_feature(enable = "sse")]
fn _mm_storeu_ps(mem_addr: &mut [f32; 4], a: __m128);
#[target_feature(enable = "sse2")]
fn _mm_store_sd(mem_addr: &mut f64, a: __m128d);
#[target_feature(enable = "avx")]
fn _mm256_loadu2_m128(hiaddr: &[f32; 4], loaddr: &[f32; 4]) -> __m256;
Currently, there is no plan to implement gather/scatter or avx2 masked load/store intrinsics for this platform.
avx512 - AVX-512 intrinsics require rustc 1.89 or later.
aarch64 / arm64ecneonExample function signatures:
#[target_feature(enable = "neon")]
fn vld2_dup_s8(from: &[i8; 2]) -> int8x8x2_t;
#[target_feature(enable = "neon")]
fn vst1q_f64(into: &mut [f64; 2], val: float64x2_t);
wasm32simd128Example function signatures:
#[target_feature(enable = "simd128")]
pub fn v128_load8_splat<T: Is1ByteUnaligned>(t: &T) -> v128;
#[target_feature(enable = "simd128")]
pub fn v128_store<T: Is16BytesUnaligned>(t: &mut T, v: v128);
This crate is licensed under either
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.