diff --git a/CHANGELOG.md b/CHANGELOG.md index b18c11fa..b3de1cc2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ This release has an [MSRV][] of 1.88. - All vector types now implement `Index` and `IndexMut`. ([#112][] by [@Ralith][]) - 256-bit vector types now use native AVX2 intrinsics on supported platforms. ([#115][] by [@valadaptive][]) - 8-bit integer multiplication is now implemented on x86. ([#115][] by [@valadaptive][]) +- New native-width associated types: `f64s` and `mask64s`. ([#125][] by [@valadaptive][]) ### Fixed @@ -116,6 +117,7 @@ No changelog was kept for this release. [#105]: https://github.com/linebender/fearless_simd/pull/105 [#115]: https://github.com/linebender/fearless_simd/pull/115 [#123]: https://github.com/linebender/fearless_simd/pull/123 +[#125]: https://github.com/linebender/fearless_simd/pull/125 [Unreleased]: https://github.com/linebender/fearless_simd/compare/v0.3.0...HEAD [0.3.0]: https://github.com/linebender/fearless_simd/compare/v0.3.0...v0.2.0 diff --git a/fearless_simd/src/generated/avx2.rs b/fearless_simd/src/generated/avx2.rs index d3e47b24..442f5cf0 100644 --- a/fearless_simd/src/generated/avx2.rs +++ b/fearless_simd/src/generated/avx2.rs @@ -36,6 +36,7 @@ impl Avx2 { impl Seal for Avx2 {} impl Simd for Avx2 { type f32s = f32x8; + type f64s = f64x4; type u8s = u8x32; type i8s = i8x32; type u16s = u16x16; @@ -45,6 +46,7 @@ impl Simd for Avx2 { type mask8s = mask8x32; type mask16s = mask16x16; type mask32s = mask32x8; + type mask64s = mask64x4; #[inline(always)] fn level(self) -> Level { Level::Avx2(self) diff --git a/fearless_simd/src/generated/fallback.rs b/fearless_simd/src/generated/fallback.rs index 5bf310da..3e5ca460 100644 --- a/fearless_simd/src/generated/fallback.rs +++ b/fearless_simd/src/generated/fallback.rs @@ -72,6 +72,7 @@ impl Fallback { impl Seal for Fallback {} impl Simd for Fallback { type f32s = f32x4; + type f64s = f64x2; type u8s = u8x16; type i8s = i8x16; type u16s = u16x8; @@ -81,6 +82,7 @@ impl Simd for Fallback { type mask8s = mask8x16; type mask16s = mask16x8; type mask32s = mask32x4; + type mask64s = mask64x2; #[inline(always)] fn level(self) -> Level { #[cfg(feature = "force_support_fallback")] diff --git a/fearless_simd/src/generated/neon.rs b/fearless_simd/src/generated/neon.rs index a533ce76..ad31f7ac 100644 --- a/fearless_simd/src/generated/neon.rs +++ b/fearless_simd/src/generated/neon.rs @@ -27,6 +27,7 @@ impl Neon { impl Seal for Neon {} impl Simd for Neon { type f32s = f32x4; + type f64s = f64x2; type u8s = u8x16; type i8s = i8x16; type u16s = u16x8; @@ -36,6 +37,7 @@ impl Simd for Neon { type mask8s = mask8x16; type mask16s = mask16x8; type mask32s = mask32x4; + type mask64s = mask64x2; #[inline(always)] fn level(self) -> Level { Level::Neon(self) diff --git a/fearless_simd/src/generated/simd_trait.rs b/fearless_simd/src/generated/simd_trait.rs index e762c279..02b2201e 100644 --- a/fearless_simd/src/generated/simd_trait.rs +++ b/fearless_simd/src/generated/simd_trait.rs @@ -23,6 +23,7 @@ pub trait Simd: Sized + Clone + Copy + Send + Sync + Seal + 'static { Bytes = ::Bytes, > + SimdCvtFloat + SimdCvtFloat; + type f64s: SimdFloat, Mask = Self::mask64s>; type u8s: SimdInt, Mask = Self::mask8s>; type i8s: SimdInt< i8, @@ -62,6 +63,9 @@ pub trait Simd: Sized + Clone + Copy + Send + Sync + Seal + 'static { + Select + Select + Select; + type mask64s: SimdMask> + + Select + + Select; fn level(self) -> Level; #[doc = r" Call function with CPU features enabled."] #[doc = r""] diff --git a/fearless_simd/src/generated/sse4_2.rs b/fearless_simd/src/generated/sse4_2.rs index 5e4038e9..27145ae2 100644 --- a/fearless_simd/src/generated/sse4_2.rs +++ b/fearless_simd/src/generated/sse4_2.rs @@ -36,6 +36,7 @@ impl Sse4_2 { impl Seal for Sse4_2 {} impl Simd for Sse4_2 { type f32s = f32x4; + type f64s = f64x2; type u8s = u8x16; type i8s = i8x16; type u16s = u16x8; @@ -45,6 +46,7 @@ impl Simd for Sse4_2 { type mask8s = mask8x16; type mask16s = mask16x8; type mask32s = mask32x4; + type mask64s = mask64x2; #[inline(always)] fn level(self) -> Level { #[cfg(not(all(target_feature = "avx2", target_feature = "fma")))] diff --git a/fearless_simd/src/generated/wasm.rs b/fearless_simd/src/generated/wasm.rs index 1383f7ca..741f4ef3 100644 --- a/fearless_simd/src/generated/wasm.rs +++ b/fearless_simd/src/generated/wasm.rs @@ -25,6 +25,7 @@ impl WasmSimd128 { impl Seal for WasmSimd128 {} impl Simd for WasmSimd128 { type f32s = f32x4; + type f64s = f64x2; type u8s = u8x16; type i8s = i8x16; type u16s = u16x8; @@ -34,6 +35,7 @@ impl Simd for WasmSimd128 { type mask8s = mask8x16; type mask16s = mask16x8; type mask32s = mask32x4; + type mask64s = mask64x2; #[inline(always)] fn level(self) -> Level { Level::WasmSimd128(self) diff --git a/fearless_simd_gen/src/mk_avx2.rs b/fearless_simd_gen/src/mk_avx2.rs index 4f9e6722..eb344cc1 100644 --- a/fearless_simd_gen/src/mk_avx2.rs +++ b/fearless_simd_gen/src/mk_avx2.rs @@ -97,6 +97,7 @@ fn mk_simd_impl() -> TokenStream { quote! { impl Simd for #level_tok { type f32s = f32x8; + type f64s = f64x4; type u8s = u8x32; type i8s = i8x32; type u16s = u16x16; @@ -106,6 +107,7 @@ fn mk_simd_impl() -> TokenStream { type mask8s = mask8x32; type mask16s = mask16x16; type mask32s = mask32x8; + type mask64s = mask64x4; #[inline(always)] fn level(self) -> Level { Level::#level_tok(self) diff --git a/fearless_simd_gen/src/mk_fallback.rs b/fearless_simd_gen/src/mk_fallback.rs index 14949fc1..9a35d16e 100644 --- a/fearless_simd_gen/src/mk_fallback.rs +++ b/fearless_simd_gen/src/mk_fallback.rs @@ -385,6 +385,7 @@ fn mk_simd_impl() -> TokenStream { quote! { impl Simd for #level_tok { type f32s = f32x4; + type f64s = f64x2; type u8s = u8x16; type i8s = i8x16; type u16s = u16x8; @@ -394,6 +395,7 @@ fn mk_simd_impl() -> TokenStream { type mask8s = mask8x16; type mask16s = mask16x8; type mask32s = mask32x4; + type mask64s = mask64x2; #[inline(always)] fn level(self) -> Level { #[cfg(feature = "force_support_fallback")] diff --git a/fearless_simd_gen/src/mk_neon.rs b/fearless_simd_gen/src/mk_neon.rs index 693ae9fc..8a24841f 100644 --- a/fearless_simd_gen/src/mk_neon.rs +++ b/fearless_simd_gen/src/mk_neon.rs @@ -401,6 +401,7 @@ fn mk_simd_impl(level: Level) -> TokenStream { quote! { impl Simd for #level_tok { type f32s = f32x4; + type f64s = f64x2; type u8s = u8x16; type i8s = i8x16; type u16s = u16x8; @@ -410,6 +411,7 @@ fn mk_simd_impl(level: Level) -> TokenStream { type mask8s = mask8x16; type mask16s = mask16x8; type mask32s = mask32x4; + type mask64s = mask64x2; #[inline(always)] fn level(self) -> Level { Level::#level_tok(self) diff --git a/fearless_simd_gen/src/mk_simd_trait.rs b/fearless_simd_gen/src/mk_simd_trait.rs index 6b9fffb4..d47c8b3c 100644 --- a/fearless_simd_gen/src/mk_simd_trait.rs +++ b/fearless_simd_gen/src/mk_simd_trait.rs @@ -32,6 +32,7 @@ pub(crate) fn mk_simd_trait() -> TokenStream { // TODO: Seal pub trait Simd: Sized + Clone + Copy + Send + Sync + Seal + 'static { type f32s: SimdFloat, Mask = Self::mask32s, Bytes = ::Bytes> + SimdCvtFloat + SimdCvtFloat; + type f64s: SimdFloat, Mask = Self::mask64s>; type u8s: SimdInt, Mask = Self::mask8s>; type i8s: SimdInt, Mask = Self::mask8s, Bytes = ::Bytes> + core::ops::Neg; type u16s: SimdInt, Mask = Self::mask16s>; @@ -43,6 +44,7 @@ pub(crate) fn mk_simd_trait() -> TokenStream { type mask16s: SimdMask, Bytes = ::Bytes> + Select + Select + Select; type mask32s: SimdMask, Bytes = ::Bytes> + Select + Select + Select + Select; + type mask64s: SimdMask> + Select + Select; fn level(self) -> Level; /// Call function with CPU features enabled. diff --git a/fearless_simd_gen/src/mk_sse4_2.rs b/fearless_simd_gen/src/mk_sse4_2.rs index 57a39657..add70dcc 100644 --- a/fearless_simd_gen/src/mk_sse4_2.rs +++ b/fearless_simd_gen/src/mk_sse4_2.rs @@ -96,6 +96,7 @@ fn mk_simd_impl() -> TokenStream { quote! { impl Simd for #level_tok { type f32s = f32x4; + type f64s = f64x2; type u8s = u8x16; type i8s = i8x16; type u16s = u16x8; @@ -105,6 +106,7 @@ fn mk_simd_impl() -> TokenStream { type mask8s = mask8x16; type mask16s = mask16x8; type mask32s = mask32x4; + type mask64s = mask64x2; #[inline(always)] fn level(self) -> Level { #[cfg(not(all(target_feature = "avx2", target_feature = "fma")))] diff --git a/fearless_simd_gen/src/mk_wasm.rs b/fearless_simd_gen/src/mk_wasm.rs index 56305658..ff9ad625 100644 --- a/fearless_simd_gen/src/mk_wasm.rs +++ b/fearless_simd_gen/src/mk_wasm.rs @@ -519,6 +519,7 @@ fn mk_simd_impl(level: Level) -> TokenStream { quote! { impl Simd for #level_tok { type f32s = f32x4; + type f64s = f64x2; type u8s = u8x16; type i8s = i8x16; type u16s = u16x8; @@ -528,6 +529,7 @@ fn mk_simd_impl(level: Level) -> TokenStream { type mask8s = mask8x16; type mask16s = mask16x8; type mask32s = mask32x4; + type mask64s = mask64x2; #[inline(always)] fn level(self) -> Level {