NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io
Safer and easier SIMD
Last release 7 days ago
06 Oct 2026
Ships unpredictably
gaps range from 8 days to 6.8 years
Nearly every release is documented
notes for 11 of 11 stable releases
Nothing withdrawn
no release was ever pulled
8 years old
13 releases · first in 2018
This release has an MSRV of 1.89.
This release has an MSRV of 1.89.
concat_swizzle_dyn and concat_swizzle_dyn_precise for all non-mask vector types, selecting bytes from the concatenation of two vectors. Out-of-range indices produce implementation-defined values in the former and zero in the latter. (#354 by @Shnatsel)compress, compress_merge, expand, and expand_merge for all integer and floating-point vector types. Compression packs mask-selected elements into consecutive low lanes, while expansion places consecutive low elements into mask-selected lanes. Both preserve element order; unused lanes are zeroed or taken from a merge vector. (#395 by @Novum, @Shnatsel, #412 by @RunDevelopment)MaskWiden and MaskNarrow traits to widen and narrow mask lanes while preserving their boolean values. SimdWiden and SimdNarrow now also guarantee the corresponding conversions for a vector's associated mask, making them available in generic code. (#396, #399 by @Shnatsel)SimdMask::from_vector, SimdMask::to_vector, and the associated Ints type for conversions between masks and signed integer vectors. True lanes map to -1 and false lanes to 0; other input values have unspecified behavior. (#400 by @valadaptive, @Shnatsel)simd_ne for all vector and mask types. (#408 by @Shnatsel)is_nan, is_infinite, is_finite, is_subnormal, is_normal, is_sign_positive, and is_sign_negative, returning a mask for each property. (#405 by @RunDevelopment, @Shnatsel)round for floating-point vectors, rounding to the nearest integer with ties away from zero. (#409 by @RunDevelopment)to_degrees and to_radians for floating-point vectors. (#406 by @RunDevelopment)mul_add_precise and mul_sub_precise now use shared SIMD emulation on SSE2 and WebAssembly as well as SSE4.2, improving performance on platforms without native fused multiply-add support. (#394 by @valadaptive, @Shnatsel)swizzle_dyn_precise implementation has also been optimized, and its scalar fallback now avoids branches for unpredictable indices. (#354, #392 by @Shnatsel)f32-to-u32 conversion has been optimized on SSE4.2, and more 32-bit integer/float conversions use SIMD on SSE2. (#404 by @Shnatsel)simd_ne where beneficial to improve x86 code generation. (#408 by @Shnatsel)Level::try_detect is now marked inline. (#411 by @Dr-Emann)mul_add_precise and mul_sub_precise documentation to explain that WebAssembly does not unconditionally provide fused multiply-add support and these operations may be slower there. (#402 by @valadaptive)Full Changelog: fearless_simd-v1.0.0...fearless_simd-v1.1.0
One column per quarter.
Co-authored-by: Laurenz Stampfl laurenz.stampfl+github@gmail.com
Fearless SIMD 1.0 is here! 🎉
This release has an MSRV of 1.89.
#[simd] attribute in fearless_simd_macros 0.1.0 to annotate SIMD-generic functions. The first argument can be a SIMD token, vector, mask, reference, or user-defined wrapper implementing ExtractToken. The core library does not depend on the macro crate. (#347, #383 by @Shnatsel)Native<S> to SimdFloatElement and SimdIntElement to select native-width vectors in scalar-generic code. (#378 by @Shnatsel)ExtractToken trait for SIMD tokens, vectors, masks, references, and user-defined wrappers.reverse for all SIMD vector and mask types. (#356 by @Shnatsel)rotate_elements_left and rotate_elements_right to mask types. Rotations wrap the offset, matching the existing non-mask vector operations. (#360 by @Shnatsel)saturating_add and saturating_sub for all integer vector types and backends. (#352 by @Shnatsel)count_ones and count_zeros operations for all integer vector types and backends. The result has the same vector type as the input, including for signed integers. (#345 by @Shnatsel)reduce_min, reduce_max, reduce_min_precise, and reduce_max_precise for all non-mask vector types. The precise floating-point variants ignore quiet NaNs, returning NaN only when all lanes are quiet NaNs; signaling NaNs have implementation-defined behavior. (#358 by @Shnatsel)reduce_sum and reduce_product for all non-mask vector types. Integer arithmetic wraps. Floating-point reductions use a fixed order that produces identical results across backends for a given vector type and lane count, except for NaN bit patterns. Summation limits each lane’s contribution to at most log2(N) roundings for N lanes. (#357, #361 by @Shnatsel)mul_add_precise and mul_sub_precise for floating-point vectors. They guarantee the infinite-precision product-plus-add rounded once, including on SIMD levels without hardware fused multiply-add instructions. They are not susceptible to the bug in Rust’s standard library, std::simd, and musl libc that causes incorrect rounding for subnormal results. SSE4.2 gets SIMD emulation of these operations for better performance. (#323, #324 by @Shnatsel)TryFrom bounds to SimdIntElement, allowing attempted conversion from all primitive integer types. (#335 by @danderson, @Shnatsel)witness() has moved from SimdBase and SimdMask to their new ExtractToken supertrait and has been renamed to token().SimdBase::N and SimdMask::N have been renamed to LEN, matching the std::simd naming. (#366 by @Shnatsel)SimdBase::as_array now borrows the vector and returns an array reference, while owned extraction has moved to to_array. The old as_array_ref and as_array_mut methods have been replaced by as_array and as_mut_array, matching the std::simd API. (#351 by @Shnatsel)abs has moved from SimdFloat to SimdBase and is now available on integer vectors. Signed integers use wrapping absolute value, leaving the minimum representable value unchanged; unsigned integers are unchanged. (#371 by @Shnatsel)Simd::vectorize now marks its inner wrappers #[inline], allowing inlining into callers with compatible target features. (#347 by @Shnatsel)unzip on SSE4.2 and AVX2. (#350 by @Shnatsel)swizzle_dyn and swizzle_dyn_precise have been optimized on AVX2. On WebAssembly with relaxed-simd enabled, 128-bit swizzle_dyn now uses the relaxed swizzle instruction. (#322, #362 by @Shnatsel)SimdMask::to_bitmask has been optimized on NEON, including dedicated implementations for wide masks. (#344 by @Shnatsel)any_true, all_true, any_false, and all_false) on masks wider than a native register now combine vector halves before reducing, avoiding branches and repeated scalar extraction. (#343 by @Dr-Emann)Level::is_fallback is now marked inline, allowing callers to eliminate the function call when the result is a compile-time constant. (#336 by @Dr-Emann)adx in the AVX-512 feature checks that control AVX2 dispatch availability. (#377 by @Shnatsel)fract on NEON for large finite values and infinities. Large finite values now return zero, and infinities return NaN, matching the other backends. (#365 by @Shnatsel)mul_sub on NEON for some combinations of signed inputs. (#323 by @Shnatsel)kernel! implementation helpers so callers cannot bypass SIMD token and target-feature checks by invoking them directly. (#363 by @Shnatsel)Full Changelog: v0.7.0...fearless_simd-v1.0.0
Breaking change: witness() has moved from SimdBase and SimdMask to their new ExtractToken supertrait and has been renamed to token() . ( #383 by @Shna…
Requires Rust 1.89 or later.
Native<S> to SimdFloatElement and SimdIntElement to select native-width vectors in scalar-generic code. (#378 by @Shnatsel)ExtractToken trait for SIMD tokens, vectors, masks, references, and user-defined wrappers. (#383 by @Shnatsel)witness() has moved from SimdBase and SimdMask to their new ExtractToken supertrait and has been renamed to token(). (#383 by @Shnatsel)Simd::vectorize now marks its inner wrappers #[inline], allowing inlining into callers with compatible target features. (#347 by @Shnatsel)Full changelog: v1.0.0-rc.1...fearless_simd-v1.0.0-rc.2
This is the first release candidate for Fearless SIMD 1.0! Please try it in your projects and report any issues ahead of the stable release.
This is the first release candidate for Fearless SIMD 1.0! Please try it in your projects and report any issues ahead of the stable release.
This release has an MSRV of Rust 1.89.
SimdBase::N and SimdMask::N to LEN, matching std::simd. (#366 by @Shnatsel)std::simd: owned extraction moves from as_array() to to_array(), as_array_ref() becomes as_array(), and as_array_mut() becomes as_mut_array(). (#351 by @Shnatsel)abs from SimdFloat to SimdBase, making it available on integer vectors too. Signed integers use wrapping absolute value, leaving the minimum representable value unchanged; unsigned integers are unchanged. (#371 by @Shnatsel)reverse for all SIMD vector and mask types. (#356 by @Shnatsel)rotate_elements_left and rotate_elements_right to mask types. Rotations wrap the offset, matching the existing vector operations. (#360 by @Shnatsel)saturating_add and saturating_sub for all integer vector types and backends. (#352 by @Shnatsel)count_ones and count_zeros for all integer vector types and backends. Results have the same vector type as the input, including for signed integers. (#345 by @Shnatsel)reduce_min, reduce_max, reduce_min_precise, and reduce_max_precise for all non-mask vector types. The precise floating-point variants ignore quiet NaNs, returning NaN only when all lanes are quiet NaNs; signaling NaNs have implementation-defined behavior. (#358 by @Shnatsel)reduce_sum and reduce_product for all non-mask vector types. Integer arithmetic wraps. Floating-point reductions use a fixed order, producing identical results across backends for a given vector type and lane count, except for NaN bit patterns. (#357, #361 by @Shnatsel)mul_add_precise and mul_sub_precise for floating-point vectors, guaranteeing a single rounding of the exact result even without hardware fused multiply-add support. SSE4.2 uses SIMD emulation for better performance. (#323, #324 by @Shnatsel)TryFrom bounds to SimdIntElement, allowing attempted conversion from all primitive integer types. (#335 by @danderson, @Shnatsel)unzip on SSE4.2 and AVX2. (#350 by @Shnatsel)swizzle_dyn and swizzle_dyn_precise on AVX2. On WebAssembly with relaxed-simd enabled, 128-bit swizzle_dyn now uses the relaxed swizzle instruction. (#322, #362 by @Shnatsel)SimdMask::to_bitmask on NEON, including dedicated implementations for wide masks. (#344 by @Shnatsel)any_true, all_true, any_false, and all_false) by combining vector halves before reducing, avoiding branches and repeated scalar extraction. (#343 by @Dr-Emann)Level::is_fallback inline, allowing callers to eliminate the function call when its result is a compile-time constant. (#336 by @Dr-Emann)fract on NEON for large finite values and infinities. Large finite values now return zero, and infinities return NaN, matching the other backends. (#365 by @Shnatsel)mul_sub on NEON for some combinations of signed inputs. (#323 by @Shnatsel)kernel! implementation helpers so callers cannot bypass SIMD token and target-feature checks by invoking them directly. (#363 by @Shnatsel)Full Changelog: v0.7.0...v1.0.0-rc.1
Breaking change: the load_interleaved_128_* and store_interleaved_128_* methods, which exchanged one 512-bit vector, have been replaced by load_four_i…
This release has an MSRV of 1.89.
i64x2, i64x4, i64x8, u64x2, u64x4, and u64x8 vector types, the native-width i64s and u64s associated types, and 64-bit integer operations across all backends. (#253, #310 by @Shnatsel)Sse2 level. This is the new baseline for i686-* and x86_64-* targets, replacing Fallback. It is detected at runtime on Tier-2 i586-* targets. (#270 by @Shnatsel)shift_elements_left, shift_elements_right, rotate_elements_left, and rotate_elements_right to non-mask vectors. Shifts accept a padding element and fill the entire vector when the offset is at least its lane count; rotations wrap the offset. (#274 by @Shnatsel)swizzle_dyn and swizzle_dyn_precise byte swizzles. swizzle_dyn permits implementation-defined results for out-of-range indices, while swizzle_dyn_precise always returns zero for them. (#276, #304 by @Shnatsel)SimdElement::BITS constant, exposing the bit width of a vector's lane type to generic code. (#296 by @danderson)SimdElement, and introduced the SimdIntElement and SimdFloatElement subtraits. These allow generic code to access many math and utility operations on the elements of SIMD vector types. (#302 by @danderson)SimdWiden and SimdNarrow traits, providing widening, narrowing, and saturating narrowing operations for all integer and floating-point vector types. (#300 by @Shnatsel)SimdInterleaved. (#321 by @Shnatsel)load_interleaved_128_* and store_interleaved_128_* methods, which exchanged one 512-bit vector, have been replaced by load_four_interleaved_* and store_four_interleaved_*. The new methods exchange an array of four 128-bit vectors directly and are available for all non-mask scalar types. (#298 by @Shnatsel)new_unchecked() on SIMD level tokens such as Avx2 has been renamed to assume_supported(). It is safe to call from contexts containing the appropriate #[target_feature] annotations. Functions without those annotations can still call it inside an unsafe block. (#293 by @Shnatsel)fxsr CPU feature is now required for all x86 SIMD levels. It is present in hardware on all SIMD-capable CPUs, but can be disabled in some emulators combined with a custom Rust target specification. (#270 by @Shnatsel)SimdInt/SimdFloat to SimdBase, allowing code generic over any non-mask vector to use arithmetic, comparisons, zip/unzip, and interleave/deinterleave operations. (#308 by @Shnatsel)min, max, min_precise, and max_precise have moved from SimdInt/SimdFloat to SimdBase. (#313 by @Shnatsel)Simd array conversion methods have been replaced by the generic SimdBase::load_array, load_array_ref, as_array, as_array_ref, as_array_mut, and store_array methods. Masks continue to use SimdMask::from_slice and store_slice. (#292 by @Shnatsel)Level::baseline() now returns Sse2 instead of Fallback. (#270 by @Shnatsel)Fallback backend and Level::Fallback variant are no longer compiled when the target has a better ambient SIMD baseline, such as SSE2 on x86 or NEON on AArch64. The force_support_fallback feature continues to make them available for testing. (#320 by @Shnatsel)Level::new() is now cached on x86. (#278 by @Shnatsel)u8s as their byte representation, enabling Bytes::bitcast between arbitrary lane types in code generic over Simd. (#284 by @Shnatsel)SimdBase::Array now guarantees Copy, Debug, by-value IntoIterator, AsRef, AsMut, and conversion from its vector type. (#285 by @Shnatsel)Simd and SimdBase now require Debug. (#309 by @Shnatsel)Simd::vectorize documentation now explains when to use it and includes an end-to-end example. (#312 by @Shnatsel)reinterpret_f32_*, reinterpret_f64_*, reinterpret_i32_*, reinterpret_u32_*, reinterpret_u8_*, cvt_to_bytes_*, and cvt_from_bytes_* methods. Use Bytes::bitcast for arbitrary same-width bit reinterpretation, or Bytes::to_bytes and Bytes::from_bytes for direct byte-vector conversions. (#284 by @Shnatsel)WithSimd trait, which only delegated to the dispatch! macro. Use dispatch! directly instead. (#306 by @Shnatsel)u8 lanes now wrap instead of saturating, and i8 lanes now match Rust's signed shift semantics. (#288, #290 by @danderson)Full Changelog: v0.6.0...v0.7.0
This release has an [MSRV][] of 1.89.
i64x2, i64x4, i64x8, u64x2, u64x4, and u64x8 vector types, the native-width i64s and u64s associated types, and 64-bit integer operations across all backends. ([#253][], [#310][] by [@Shnatsel][])Sse2 level. This is the new baseline for i686-* and x86_64-* targets, replacing Fallback. It is detected at runtime on Tier-2 i586-* targets. ([#270][] by [@Shnatsel][])shift_elements_left, shift_elements_right, rotate_elements_left, and rotate_elements_right to non-mask vectors. Shifts accept a padding element and fill the entire vector when the offset is at least its lane count; rotations wrap the offset. ([#274][] by [@Shnatsel][])swizzle_dyn and swizzle_dyn_precise byte swizzles. swizzle_dyn permits implementation-defined results for out-of-range indices, while swizzle_dyn_precise always returns zero for them. ([#276][], [#304][] by [@Shnatsel][])SimdElement::BITS constant, exposing the bit width of a vector's lane type to generic code. ([#296][] by [@danderson][])SimdElement, and introduced the SimdIntElement and SimdFloatElement subtraits. These allow generic code to access many math and utility operations on the elements of SIMD vector types. ([#302][] by [@danderson][])SimdWiden and SimdNarrow traits, providing widening, narrowing, and saturating narrowing operations for all integer and floating-point vector types. ([#300][] by [@Shnatsel][])SimdInterleaved. ([#321][] by [@Shnatsel][])load_interleaved_128_* and store_interleaved_128_* methods, which exchanged one 512-bit vector, have been replaced by load_four_interleaved_* and store_four_interleaved_*. The new methods exchange an array of four 128-bit vectors directly and are available for all non-mask scalar types. ([#298][] by [@Shnatsel][])new_unchecked() function on SIMD level tokens such as Avx2 has been renamed to assume_supported() and is now safe to call from contexts that already contain the appropriate #[target_feature] annotations. Functions without such annotations can still call assume_supported() with an unsafe block. ([#293][] by [@Shnatsel][])fxsr CPU feature is now required for all x86 SIMD levels. It is present in hardware on all SIMD-capable CPUs, but it is possible to disable it in some emulators combined with a custom Rust target specification. ([#270][] by [@Shnatsel][])SimdInt/SimdFloat to SimdBase, so code generic over any non-mask vector can use Add, Sub, Mul, comparisons, zip/unzip, and interleave/deinterleave operations. ([#308][] by [@Shnatsel][])min, max, min_precise, and max_precise have moved from SimdInt/SimdFloat to SimdBase, allowing generic code to use them across integer and floating-point vectors. ([#313][] by [@Shnatsel][])Level::baseline() now returns Sse2 instead of Fallback. ([#270][] by [@Shnatsel][])Fallback backend and Level::Fallback variant are no longer compiled when the target has a better ambient SIMD baseline (e.g. SSE2 on x86, NEON on Aarch64). The force_support_fallback feature continues to make them available for testing. disable_dispatch_sse2 no longer disables SSE2 if it is the baseline level. ([#320][] by [@Shnatsel][])Level::new() is now cached on x86. ([#278][] by [@Shnatsel][])u8s as their byte representation, enabling Bytes::bitcast between arbitrary lane types in code generic over Simd. The byte representation of any SimdBase type is now also guaranteed to be an idempotent, same-token u8 SIMD vector, so it can be manipulated directly in generic code. ([#284][] by [@Shnatsel][])SimdBase::Array now guarantees Copy (and therefore Clone), Debug, by-value IntoIterator, AsRef, AsMut, and conversion from its vector type, while SimdBase guarantees construction from its associated array through SimdFrom. ([#285][] by [@Shnatsel][])Simd and SimdBase now require Debug, exposing implementations already provided by all tokens and vector types to generic code. ([#309][] by [@Shnatsel][])Simd::vectorize documentation now explains when to use it and includes an end-to-end example. ([#312][] by [@Shnatsel][])reinterpret_f32_*, reinterpret_f64_*, reinterpret_i32_*, reinterpret_u32_*, reinterpret_u8_*, cvt_to_bytes_*, and cvt_from_bytes_* methods. Use Bytes::bitcast for arbitrary same-width bit reinterpretation, or Bytes::to_bytes and Bytes::from_bytes for direct byte-vector conversions. ([#284][] by [@Shnatsel][])WithSimd trait, which only delegated to the dispatch! macro. Use dispatch! directly instead. ([#306][] by [@Shnatsel][])u8 lanes now wrap instead of saturating, and i8 lanes now match Rust's signed shift semantics. ([#288][], [#290][] by [@danderson][])This release has an MSRV of 1.89.
This release has an MSRV of 1.89.
Avx512 level and 512-bit native-width vector types. (#231 by @Shnatsel)cfg flags, letting final binary builds decide which levels dispatch! uses. (#258, #264 by @Shnatsel)swizzle_dyn_within_blocks method on SIMD vector types for dynamic byte-indexed swizzles within each native-width block. (#266 by @Shnatsel)Level::Fallback and x86 Level::Sse4_2 variants now remain available whenever their token types exist. (#264 by @Shnatsel)dispatch! and Level::dispatch now correctly omit AVX2 code paths when the Ice Lake/AVX-512 feature set is available. (#263 by @Shnatsel)Full Changelog: v0.5.0...v0.6.0
Breaking change: the crate's SIMD extension traits are now sealed, so external crates can no longer implement them for their own types. ( #211 by @Lau…
This release has an MSRV of 1.88.
kernel! macro, which creates safe wrappers around SIMD-level-specific kernels so platform intrinsics from core::arch or std::arch can be used safely when a token proves the required target features. (#214 by @Shnatsel)approximate_recip method on floating-point SIMD vector types. It uses fast hardware reciprocal estimates where available and exact division otherwise. (#204 by @tomcur)SimdMask::from_bitmask, SimdMask::to_bitmask, SimdMask::test, and SimdMask::set, mirroring the std::simd mask API. (#226 by @Shnatsel)SimdMask trait instead of SimdBase. Masks no longer expose integer-vector APIs such as Deref, indexing, Bytes, public SimdSplit/SimdCombine, slide, slide_within_blocks, byte conversions, or scalar bit-operator overloads. (#218 by @Shnatsel)kernel!, removing most unsafe from generated code. (#232, #233, #234, #235, #236, #237, #238, #239, #244, #245 by @Shnatsel)core_arch wrapper module and the safe_wrappers feature have been removed. Use kernel! with core::arch or std::arch intrinsics instead. (#216 by @Shnatsel)Full Changelog: v0.4.1...v0.5.0
This release has an [MSRV][] of 1.88.
This release has an [MSRV][] of 1.88.
interleave and deinterleave methods on integer and floating-point SIMD vector types. ([#206][] by [@Shnatsel][])Sse4_2 and Avx2 now consistently use the x86-64-v2 and x86-64-v3 feature sets for detection, dispatch, and generated target_feature attributes. ([#208][] by [@Shnatsel][])Breaking change: The AVX2 level now requires all features from the x86-64-v3 baseline. ([#188][] by [@Shnatsel][])
This release has an [MSRV][] of 1.88.
Index and IndexMut. ([#112][] by [@Ralith][])f64s and mask64s. ([#125][] by [@valadaptive][])from_fn method on vector types. ([#137][] by [@valadaptive][])load_interleaved and store_interleaved operations now use native intrinsics on x86, instead of using the fallback implementations. ([#140][] by [@valadaptive][])relaxed_simd operations in WebAssembly. ([#143][] by [@valadaptive][])ceil and round_ties_even operations on floating-point vector types. (Rust's round operation rounds away from zero in the case of ties. Many architectures do not natively implement that behavior, so it's omitted.) ([#145][] by [@valadaptive][])prelude module, which exports all the traits in the library but not the types. ([#149][] by [@valadaptive][])any_true, all_true, any_false, and all_false methods on mask types. ([#141][] by [@valadaptive][])slide and slide_within_blocks methods for shifting elements within a vector. ([#164][] by [@valadaptive][])Level::is_fallback method, which lets you check if the current SIMD level is the scalar fallback. This works even if Level::Fallback is not compiled in, always returning false in that case. ([#168][] by [@valadaptive][])store_array methods to store SIMD vectors back to memory explicitly using intrinsics. ([#181][] by [@LaurenzV][])min_precise and max_precise operations now behave the same way on x86 and WebAssembly as they do on AArch64, returning the non-NaN operand if one operand is NaN and the other is not. Previously, they returned the second operand if either was NaN. ([#136][] by [@valadaptive][])Breaking change: The AVX2 level now requires all features from the x86-64-v3 baseline. ([#188][] by [@Shnatsel][])
Breaking change: Level::fallback has been removed, replaced with Level::baseline. ([#105][] by [@DJMcNab][])
This corresponds with a change to avoid compiling in support for the fallback level on compilation targets which don't
require it; this is most impactful for binary size on WASM, Apple Silicon Macs or Android.
A consequence of this is that the available variants on Level are now dependent on the target features you are compiling with.
The fallback level can be restored with the force_support_fallback cargo feature. We don't expect this to be necessary outside
of tests.
Code generation for select and unzip operations on x86 has been improved. ([#115][] by [@valadaptive][])
Breaking change: The native-width associated types (f32s, u8s, etc.) for the Avx2 struct have been widened from 128-bit
types (like f32x4) to 256-bit types (like f32x8). ([#123][] by [@valadaptive][])
Breaking change: All the vector types' inherent methods have been removed. Any remaining functionality has been moved to trait methods. ([#149][] by [@valadaptive][])
Some functionality is exposed under different names:
reinterpret methods, use the bitcast method on the Bytes trait. (e.g. foo.reinterpret_i32()
-> foo.bitcast::<i32x4<_>>())cvt methods, use the to_int or to_float convenience methods on the SimdFloat and SimdInt
traits (e.g. foo.cvt_u32() -> foo.to_int::<u32x4<_>>())Some functionality (such as split or combine) is exposed under new traits. You may use the new prelude module to
conveniently import all of the traits.
Breaking change: The madd and msub methods have been renamed to mul_add and mul_sub, matching Rust's naming conventions.
([#158][] by [@Shnatsel][])
Breaking change: the val field on SIMD vector types is now private, and vector types are no longer represented as arrays internally. To access a vector type's elements, you can use the Into or Deref traits to obtain an array, or the as_slice/as_mut_slice methods to obtain a slice. ([#159][] by [@valadaptive][])
Breaking change: the Element type on the SimdBase trait is now an associated type instead of a type parameter. This should make it more pleasant to write code that's generic over different vector types. ([#170][] by [@valadaptive][])
The WasmSimd128 token type now wraps the new crate::core_arch::wasm32::WasmSimd128 type. This doesn't expose any new functionality as WASM SIMD128 can only be enabled statically, but matches all the other backend tokens. ([#176][] by [@valadaptive][])
Breaking change: the SimdFrom::simd_from method now takes the SIMD token as the first argument instead of the second. This matches the argument order of the from_slice, splat, and from_fn methods on SimdBase. ([#180][] by [@valadaptive][])
simd_dispatch! macro. ([#105][] by [@DJMcNab][])This release has an [MSRV][] of 1.86.
This release has an [MSRV][] of 1.86.
SimdBase::witness to fetch the Simd implementation associated with a
generic vector. ([#76][] by [@Ralith][])Select is now available on native-width masks. ([#77][], [#83][] by [@Ralith][])Simd::shrv_* preforms a right shift with shift amount specified
per-lane. ([#79][] by [@Ralith][])>> operator is implemented for SIMD vectors. ([#79][] by [@Ralith][])SimdFrom splatting is available on native-width vectors. ([#84][] by [@Ralith][])dispatch macro to replace simd_dispatch. ([#96][], [#99][] by [@Ralith][], [@DJMcNab][])Simd now requires consistent mask types for native-width
vectors. ([#75][] by [@Ralith][])Simd now requires consistent Bytes types for native-width vectors,
enabling Bytes::bitcast in generic code. ([#81][] by [@Ralith][])a.madd(b, c) and a.msub(b, c) now correspond to a * b + c and a * b - c for consistency with mul_add in
std. ([#88][] by [@Ralith][])
Previously, madd was a + b * c, and msub was a - b * c.
Therefore, if you previously had a.madd(b, c), that's now written as b.madd(c, a).
And if you had a.msub(b, c), that's now written b.madd(-c, a).const ([#93][] by [@Ralith][])There has been a complete rewrite of Fearless SIMD. For some details of the ideas used, see our blog post *Towards fearless SIMD, 7 years later*.
There has been a complete rewrite of Fearless SIMD. For some details of the ideas used, see our blog post Towards fearless SIMD, 7 years later.
The repository has also been moved into the Linebender organisation.
No changelog was kept for this release.
No changelog was kept for this release.
This is the initial release. No changelog was kept for this release.
This is the initial release. No changelog was kept for this release.
Your coding agent can read these notes before it upgrades. Set up the MCP server →