pub trait Simd:
'static
+ Sync
+ Send {
type Vi8: SimdInt8<Scalar = i8> + SimdBaseIo;
type Vi16: SimdInt16<Scalar = i16> + SimdBaseIo;
type Vi32: SimdInt32<Engine = Self, Scalar = i32> + SimdBaseIo;
type Vi64: SimdInt64<Engine = Self, Scalar = i64> + SimdBaseIo;
type Vf32: SimdFloat32<Engine = Self, Scalar = f32> + SimdBaseIo;
type Vf64: SimdFloat64<Engine = Self, Scalar = f64> + SimdBaseIo;
const VF32_WIDTH: usize = <Self::Vf32>::WIDTH;
const VF64_WIDTH: usize = <Self::Vf64>::WIDTH;
const VI16_WIDTH: usize = <Self::Vi16>::WIDTH;
const VI32_WIDTH: usize = <Self::Vi32>::WIDTH;
const VI64_WIDTH: usize = <Self::Vi64>::WIDTH;
Show 151 methods
// Required method
fn invoke<R>(f: impl FnOnce() -> R) -> R;
// Provided methods
unsafe fn mul_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32 { ... }
unsafe fn mul_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64 { ... }
unsafe fn not_epi32(a: Self::Vi32) -> Self::Vi32 { ... }
unsafe fn not_epi64(a: Self::Vi64) -> Self::Vi64 { ... }
unsafe fn or_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32 { ... }
unsafe fn or_epi64(a: Self::Vi64, b: Self::Vi64) -> Self::Vi64 { ... }
unsafe fn or_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32 { ... }
unsafe fn or_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64 { ... }
unsafe fn xor_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32 { ... }
unsafe fn xor_epi64(a: Self::Vi64, b: Self::Vi64) -> Self::Vi64 { ... }
unsafe fn xor_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32 { ... }
unsafe fn xor_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64 { ... }
unsafe fn slli_epi32(a: Self::Vi32, amt_const: i32) -> Self::Vi32 { ... }
unsafe fn srai_epi32(a: Self::Vi32, amt_const: i32) -> Self::Vi32 { ... }
unsafe fn div_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32 { ... }
unsafe fn div_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64 { ... }
unsafe fn add_epi16(a: Self::Vi16, b: Self::Vi16) -> Self::Vi16 { ... }
unsafe fn sub_epi16(a: Self::Vi16, b: Self::Vi16) -> Self::Vi16 { ... }
unsafe fn add_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32 { ... }
unsafe fn add_epi64(a: Self::Vi64, b: Self::Vi64) -> Self::Vi64 { ... }
unsafe fn add_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32 { ... }
unsafe fn add_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64 { ... }
unsafe fn and_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32 { ... }
unsafe fn and_epi64(a: Self::Vi64, b: Self::Vi64) -> Self::Vi64 { ... }
unsafe fn and_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32 { ... }
unsafe fn and_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64 { ... }
unsafe fn abs_ps(a: Self::Vf32) -> Self::Vf32 { ... }
unsafe fn abs_pd(a: Self::Vf64) -> Self::Vf64 { ... }
unsafe fn mullo_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32 { ... }
unsafe fn mullo_epi64(a: Self::Vi64, b: Self::Vi64) -> Self::Vi64 { ... }
unsafe fn mullo_epi16(a: Self::Vi16, b: Self::Vi16) -> Self::Vi16 { ... }
unsafe fn andnot_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32 { ... }
unsafe fn andnot_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64 { ... }
unsafe fn andnot_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32 { ... }
unsafe fn andnot_epi64(a: Self::Vi64, b: Self::Vi64) -> Self::Vi64 { ... }
unsafe fn blendv_epi32(
a: Self::Vi32,
b: Self::Vi32,
mask: Self::Vi32,
) -> Self::Vi32 { ... }
unsafe fn blendv_epi64(
a: Self::Vi64,
b: Self::Vi64,
mask: Self::Vi64,
) -> Self::Vi64 { ... }
unsafe fn blendv_ps(
a: Self::Vf32,
b: Self::Vf32,
mask: Self::Vf32,
) -> Self::Vf32 { ... }
unsafe fn blendv_pd(
a: Self::Vf64,
b: Self::Vf64,
mask: Self::Vf64,
) -> Self::Vf64 { ... }
unsafe fn castps_epi32(a: Self::Vf32) -> Self::Vi32 { ... }
unsafe fn castpd_epi64(a: Self::Vf64) -> Self::Vi64 { ... }
unsafe fn castepi32_ps(a: Self::Vi32) -> Self::Vf32 { ... }
unsafe fn castepi64_pd(a: Self::Vi64) -> Self::Vf64 { ... }
unsafe fn castps_pd(_a: Self::Vf32) -> Self::Vf64 { ... }
unsafe fn castpd_ps(_a: Self::Vf64) -> Self::Vf32 { ... }
unsafe fn cvtps_epi32(a: Self::Vf32) -> Self::Vi32 { ... }
unsafe fn cvtpd_epi64(a: Self::Vf64) -> Self::Vi64 { ... }
unsafe fn cvtepi32_ps(a: Self::Vi32) -> Self::Vf32 { ... }
unsafe fn cvtepi64_pd(a: Self::Vi64) -> Self::Vf64 { ... }
unsafe fn cmpeq_epi64(a: Self::Vi64, b: Self::Vi64) -> Self::Vi64 { ... }
unsafe fn cmpneq_epi64(a: Self::Vi64, b: Self::Vi64) -> Self::Vi64 { ... }
unsafe fn cmpge_epi64(a: Self::Vi64, b: Self::Vi64) -> Self::Vi64 { ... }
unsafe fn cmpgt_epi64(a: Self::Vi64, b: Self::Vi64) -> Self::Vi64 { ... }
unsafe fn cmple_epi64(a: Self::Vi64, b: Self::Vi64) -> Self::Vi64 { ... }
unsafe fn cmplt_epi64(a: Self::Vi64, b: Self::Vi64) -> Self::Vi64 { ... }
unsafe fn cmpeq_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32 { ... }
unsafe fn cmpneq_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32 { ... }
unsafe fn cmpge_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32 { ... }
unsafe fn cmpgt_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32 { ... }
unsafe fn cmple_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32 { ... }
unsafe fn cmplt_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32 { ... }
unsafe fn cmpeq_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32 { ... }
unsafe fn cmpneq_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32 { ... }
unsafe fn cmpge_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32 { ... }
unsafe fn cmpgt_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32 { ... }
unsafe fn cmple_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32 { ... }
unsafe fn cmplt_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32 { ... }
unsafe fn cmpeq_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64 { ... }
unsafe fn cmpneq_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64 { ... }
unsafe fn cmpge_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64 { ... }
unsafe fn cmpgt_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64 { ... }
unsafe fn cmple_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64 { ... }
unsafe fn cmplt_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64 { ... }
unsafe fn ceil_ps(a: Self::Vf32) -> Self::Vf32 { ... }
unsafe fn ceil_pd(a: Self::Vf64) -> Self::Vf64 { ... }
unsafe fn floor_ps(a: Self::Vf32) -> Self::Vf32 { ... }
unsafe fn floor_pd(a: Self::Vf64) -> Self::Vf64 { ... }
unsafe fn fast_round_ps(a: Self::Vf32) -> Self::Vf32 { ... }
unsafe fn fast_ceil_ps(a: Self::Vf32) -> Self::Vf32 { ... }
unsafe fn fast_floor_ps(a: Self::Vf32) -> Self::Vf32 { ... }
unsafe fn fast_floor_pd(a: Self::Vf64) -> Self::Vf64 { ... }
unsafe fn fmadd_ps(
a: Self::Vf32,
b: Self::Vf32,
c: Self::Vf32,
) -> Self::Vf32 { ... }
unsafe fn fnmadd_ps(
a: Self::Vf32,
b: Self::Vf32,
c: Self::Vf32,
) -> Self::Vf32 { ... }
unsafe fn fmadd_pd(
a: Self::Vf64,
b: Self::Vf64,
c: Self::Vf64,
) -> Self::Vf64 { ... }
unsafe fn fnmadd_pd(
a: Self::Vf64,
b: Self::Vf64,
c: Self::Vf64,
) -> Self::Vf64 { ... }
unsafe fn fmsub_ps(
a: Self::Vf32,
b: Self::Vf32,
c: Self::Vf32,
) -> Self::Vf32 { ... }
unsafe fn fnmsub_ps(
a: Self::Vf32,
b: Self::Vf32,
c: Self::Vf32,
) -> Self::Vf32 { ... }
unsafe fn fmsub_pd(
a: Self::Vf64,
b: Self::Vf64,
c: Self::Vf64,
) -> Self::Vf64 { ... }
unsafe fn fnmsub_pd(
a: Self::Vf64,
b: Self::Vf64,
c: Self::Vf64,
) -> Self::Vf64 { ... }
unsafe fn horizontal_add_ps(a: Self::Vf32) -> f32 { ... }
unsafe fn horizontal_add_pd(a: Self::Vf64) -> f64 { ... }
unsafe fn i32gather_epi32(_arr: &[i32], _index: Self::Vi32) -> Self::Vi32 { ... }
unsafe fn i64gather_epi64(_arr: &[i64], _index: Self::Vi64) -> Self::Vi64 { ... }
unsafe fn i32gather_ps(_arr: &[f32], _index: Self::Vi32) -> Self::Vf32 { ... }
unsafe fn load_ps(a: &f32) -> Self::Vf32 { ... }
unsafe fn load_pd(a: &f64) -> Self::Vf64 { ... }
unsafe fn load_epi16(a: &i16) -> Self::Vi16 { ... }
unsafe fn load_epi32(a: &i32) -> Self::Vi32 { ... }
unsafe fn load_epi64(a: &i64) -> Self::Vi64 { ... }
unsafe fn loadu_ps(a: &f32) -> Self::Vf32 { ... }
unsafe fn loadu_pd(a: &f64) -> Self::Vf64 { ... }
unsafe fn loadu_epi32(a: &i32) -> Self::Vi32 { ... }
unsafe fn loadu_epi64(a: &i64) -> Self::Vi64 { ... }
unsafe fn maskload_epi32(_mem_addr: &i32, _mask: Self::Vi32) -> Self::Vi32 { ... }
unsafe fn maskload_epi64(_mem_addr: &i64, _mask: Self::Vi64) -> Self::Vi64 { ... }
unsafe fn maskload_ps(_mem_addr: &f32, _mask: Self::Vi32) -> Self::Vf32 { ... }
unsafe fn maskload_pd(_mem_addr: &f64, _mask: Self::Vi64) -> Self::Vf64 { ... }
unsafe fn store_ps(mem_addr: &mut f32, a: Self::Vf32) { ... }
unsafe fn store_pd(mem_addr: &mut f64, a: Self::Vf64) { ... }
unsafe fn store_epi32(mem_addr: &mut i32, a: Self::Vi32) { ... }
unsafe fn store_epi64(mem_addr: &mut i64, a: Self::Vi64) { ... }
unsafe fn storeu_ps(mem_addr: &mut f32, a: Self::Vf32) { ... }
unsafe fn storeu_pd(mem_addr: &mut f64, a: Self::Vf64) { ... }
unsafe fn storeu_epi32(mem_addr: &mut i32, a: Self::Vi32) { ... }
unsafe fn storeu_epi64(mem_addr: &mut i64, a: Self::Vi64) { ... }
unsafe fn maskstore_epi32(
mem_addr: &mut i32,
mask: Self::Vi32,
a: Self::Vi32,
) { ... }
unsafe fn maskstore_epi64(
mem_addr: &mut i64,
mask: Self::Vi64,
a: Self::Vi64,
) { ... }
unsafe fn maskstore_ps(mem_addr: &mut f32, mask: Self::Vi32, a: Self::Vf32) { ... }
unsafe fn maskstore_pd(mem_addr: &mut f64, mask: Self::Vi64, a: Self::Vf64) { ... }
unsafe fn max_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32 { ... }
unsafe fn min_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32 { ... }
unsafe fn max_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32 { ... }
unsafe fn min_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32 { ... }
unsafe fn max_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64 { ... }
unsafe fn min_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64 { ... }
unsafe fn rcp_ps(a: Self::Vf32) -> Self::Vf32 { ... }
unsafe fn round_ps(a: Self::Vf32) -> Self::Vf32 { ... }
unsafe fn round_pd(a: Self::Vf64) -> Self::Vf64 { ... }
unsafe fn set1_epi32(a: i32) -> Self::Vi32 { ... }
unsafe fn set1_epi64(a: i64) -> Self::Vi64 { ... }
unsafe fn set1_ps(a: f32) -> Self::Vf32 { ... }
unsafe fn set1_pd(a: f64) -> Self::Vf64 { ... }
unsafe fn setzero_ps() -> Self::Vf32 { ... }
unsafe fn setzero_pd() -> Self::Vf64 { ... }
unsafe fn setzero_epi32() -> Self::Vi32 { ... }
unsafe fn setzero_epi64() -> Self::Vi64 { ... }
unsafe fn srai_epi64(a: Self::Vi64, amt_const: i32) -> Self::Vi64 { ... }
unsafe fn srli_epi32(a: Self::Vi32, amt_const: i32) -> Self::Vi32 { ... }
unsafe fn sra_epi32(a: Self::Vi32, amt: i32) -> Self::Vi32 { ... }
unsafe fn srl_epi32(a: Self::Vi32, amt: i32) -> Self::Vi32 { ... }
unsafe fn sll_epi32(a: Self::Vi32, amt: i32) -> Self::Vi32 { ... }
unsafe fn sub_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32 { ... }
unsafe fn sub_epi64(a: Self::Vi64, b: Self::Vi64) -> Self::Vi64 { ... }
unsafe fn sub_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32 { ... }
unsafe fn sub_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64 { ... }
unsafe fn sqrt_ps(a: Self::Vf32) -> Self::Vf32 { ... }
unsafe fn rsqrt_ps(a: Self::Vf32) -> Self::Vf32 { ... }
unsafe fn sqrt_pd(a: Self::Vf64) -> Self::Vf64 { ... }
unsafe fn rsqrt_pd(a: Self::Vf64) -> Self::Vf64 { ... }
unsafe fn shuffle_epi32<const IMM8: i32>(_a: Self::Vi32) -> Self::Vi32 { ... }
}Expand description
The abstract SIMD trait which is implemented by Avx2, Sse41, etc
Provided Associated ConstantsΒ§
const VF32_WIDTH: usize = <Self::Vf32>::WIDTH
const VF64_WIDTH: usize = <Self::Vf64>::WIDTH
const VI16_WIDTH: usize = <Self::Vi16>::WIDTH
const VI32_WIDTH: usize = <Self::Vi32>::WIDTH
const VI64_WIDTH: usize = <Self::Vi64>::WIDTH
Required Associated TypesΒ§
Sourcetype Vi8: SimdInt8<Scalar = i8> + SimdBaseIo
type Vi8: SimdInt8<Scalar = i8> + SimdBaseIo
Vector of i8s. Corresponds to __m128i when used with the Sse impl, __m256i when used with Avx2, or a single i8 when used with Scalar.
Sourcetype Vi16: SimdInt16<Scalar = i16> + SimdBaseIo
type Vi16: SimdInt16<Scalar = i16> + SimdBaseIo
Vector of i16s. Corresponds to __m128i when used with the Sse impl, __m256i when used with Avx2, or a single i16 when used with Scalar.
Sourcetype Vi32: SimdInt32<Engine = Self, Scalar = i32> + SimdBaseIo
type Vi32: SimdInt32<Engine = Self, Scalar = i32> + SimdBaseIo
Vector of i32s. Corresponds to __m128i when used with the Sse impl, __m256i when used with Avx2, or a single i32 when used with Scalar.
Sourcetype Vi64: SimdInt64<Engine = Self, Scalar = i64> + SimdBaseIo
type Vi64: SimdInt64<Engine = Self, Scalar = i64> + SimdBaseIo
Vector of i64s. Corresponds to __m128i when used with the Sse impl, __m256i when used with Avx2, or a single i64 when used with Scalar.
Sourcetype Vf32: SimdFloat32<Engine = Self, Scalar = f32> + SimdBaseIo
type Vf32: SimdFloat32<Engine = Self, Scalar = f32> + SimdBaseIo
Vector of f32s. Corresponds to __m128 when used with the Sse impl, __m256 when used with Avx2, or a single f32 when used with Scalar.
Sourcetype Vf64: SimdFloat64<Engine = Self, Scalar = f64> + SimdBaseIo
type Vf64: SimdFloat64<Engine = Self, Scalar = f64> + SimdBaseIo
Vector of f64s. Corresponds to __m128d when used with the Sse impl, __m256d when used with Avx2, or a single f64 when used with Scalar.
Required MethodsΒ§
Provided MethodsΒ§
unsafe fn mul_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32
unsafe fn mul_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64
unsafe fn not_epi32(a: Self::Vi32) -> Self::Vi32
unsafe fn not_epi64(a: Self::Vi64) -> Self::Vi64
unsafe fn or_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32
unsafe fn or_epi64(a: Self::Vi64, b: Self::Vi64) -> Self::Vi64
unsafe fn or_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32
unsafe fn or_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64
unsafe fn xor_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32
unsafe fn xor_epi64(a: Self::Vi64, b: Self::Vi64) -> Self::Vi64
unsafe fn xor_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32
unsafe fn xor_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64
Sourceunsafe fn slli_epi32(a: Self::Vi32, amt_const: i32) -> Self::Vi32
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn slli_epi32(a: Self::Vi32, amt_const: i32) -> Self::Vi32
amt must be a constant
Sourceunsafe fn srai_epi32(a: Self::Vi32, amt_const: i32) -> Self::Vi32
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn srai_epi32(a: Self::Vi32, amt_const: i32) -> Self::Vi32
amt must be a constant
unsafe fn div_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32
unsafe fn div_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64
unsafe fn add_epi16(a: Self::Vi16, b: Self::Vi16) -> Self::Vi16
unsafe fn sub_epi16(a: Self::Vi16, b: Self::Vi16) -> Self::Vi16
unsafe fn add_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32
unsafe fn add_epi64(a: Self::Vi64, b: Self::Vi64) -> Self::Vi64
unsafe fn add_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32
unsafe fn add_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64
unsafe fn and_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32
unsafe fn and_epi64(a: Self::Vi64, b: Self::Vi64) -> Self::Vi64
unsafe fn and_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32
unsafe fn and_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64
unsafe fn abs_ps(a: Self::Vf32) -> Self::Vf32
unsafe fn abs_pd(a: Self::Vf64) -> Self::Vf64
unsafe fn mullo_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32
unsafe fn mullo_epi64(a: Self::Vi64, b: Self::Vi64) -> Self::Vi64
unsafe fn mullo_epi16(a: Self::Vi16, b: Self::Vi16) -> Self::Vi16
unsafe fn andnot_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32
unsafe fn andnot_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64
unsafe fn andnot_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32
unsafe fn andnot_epi64(a: Self::Vi64, b: Self::Vi64) -> Self::Vi64
Sourceunsafe fn blendv_epi32(
a: Self::Vi32,
b: Self::Vi32,
mask: Self::Vi32,
) -> Self::Vi32
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn blendv_epi32( a: Self::Vi32, b: Self::Vi32, mask: Self::Vi32, ) -> Self::Vi32
Note SSE2 will select B only when all bits are 1, while SSE41 and AVX2 only check the high bit. To maintain portability ensure all bits are 1 when using blend. Results of comparison operations adhere to this.
Sourceunsafe fn blendv_epi64(
a: Self::Vi64,
b: Self::Vi64,
mask: Self::Vi64,
) -> Self::Vi64
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn blendv_epi64( a: Self::Vi64, b: Self::Vi64, mask: Self::Vi64, ) -> Self::Vi64
Note SSE2 will select B only when all bits are 1, while SSE41 and AVX2 only check the high bit. To maintain portability ensure all bits are 1 when using blend. Results of comparison operations adhere to this.
Sourceunsafe fn blendv_ps(
a: Self::Vf32,
b: Self::Vf32,
mask: Self::Vf32,
) -> Self::Vf32
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn blendv_ps( a: Self::Vf32, b: Self::Vf32, mask: Self::Vf32, ) -> Self::Vf32
Note SSE2 will select B only when all bits are 1, while SSE41 and AVX2 only check the high bit. To maintain portability ensure all bits are 1 when using blend. Results of comparison operations adhere to this.
Sourceunsafe fn blendv_pd(
a: Self::Vf64,
b: Self::Vf64,
mask: Self::Vf64,
) -> Self::Vf64
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn blendv_pd( a: Self::Vf64, b: Self::Vf64, mask: Self::Vf64, ) -> Self::Vf64
Note SSE2 will select B only when all bits are 1, while SSE41 and AVX2 only check the high bit. To maintain portability ensure all bits are 1 when using blend. Results of comparison operations adhere to this.
unsafe fn castps_epi32(a: Self::Vf32) -> Self::Vi32
unsafe fn castpd_epi64(a: Self::Vf64) -> Self::Vi64
unsafe fn castepi32_ps(a: Self::Vi32) -> Self::Vf32
unsafe fn castepi64_pd(a: Self::Vi64) -> Self::Vf64
Sourceunsafe fn castps_pd(_a: Self::Vf32) -> Self::Vf64
πDeprecated: These functions have unpredictable behavior and will be deleted in the future. Please use a manual implementation instead.
unsafe fn castps_pd(_a: Self::Vf32) -> Self::Vf64
Converts the type of a f32 vector to a f64 vector without changing the underlying bits.
Sourceunsafe fn castpd_ps(_a: Self::Vf64) -> Self::Vf32
πDeprecated: These functions have unpredictable behavior and will be deleted in the future. Please use a manual implementation instead.
unsafe fn castpd_ps(_a: Self::Vf64) -> Self::Vf32
Converts the type of a f64 vector to a f32 vector without changing the underlying bits.
Sourceunsafe fn cvtps_epi32(a: Self::Vf32) -> Self::Vi32
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn cvtps_epi32(a: Self::Vf32) -> Self::Vi32
Currently scalar will have different results in some cases depending on the current SSE rounding mode.
unsafe fn cvtpd_epi64(a: Self::Vf64) -> Self::Vi64
unsafe fn cvtepi32_ps(a: Self::Vi32) -> Self::Vf32
unsafe fn cvtepi64_pd(a: Self::Vi64) -> Self::Vf64
unsafe fn cmpeq_epi64(a: Self::Vi64, b: Self::Vi64) -> Self::Vi64
unsafe fn cmpneq_epi64(a: Self::Vi64, b: Self::Vi64) -> Self::Vi64
unsafe fn cmpge_epi64(a: Self::Vi64, b: Self::Vi64) -> Self::Vi64
unsafe fn cmpgt_epi64(a: Self::Vi64, b: Self::Vi64) -> Self::Vi64
unsafe fn cmple_epi64(a: Self::Vi64, b: Self::Vi64) -> Self::Vi64
unsafe fn cmplt_epi64(a: Self::Vi64, b: Self::Vi64) -> Self::Vi64
unsafe fn cmpeq_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32
unsafe fn cmpneq_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32
unsafe fn cmpge_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32
unsafe fn cmpgt_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32
unsafe fn cmple_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32
unsafe fn cmplt_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32
unsafe fn cmpeq_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32
unsafe fn cmpneq_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32
unsafe fn cmpge_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32
unsafe fn cmpgt_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32
unsafe fn cmple_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32
unsafe fn cmplt_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32
unsafe fn cmpeq_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64
unsafe fn cmpneq_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64
unsafe fn cmpge_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64
unsafe fn cmpgt_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64
unsafe fn cmple_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64
unsafe fn cmplt_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64
unsafe fn ceil_ps(a: Self::Vf32) -> Self::Vf32
unsafe fn ceil_pd(a: Self::Vf64) -> Self::Vf64
unsafe fn floor_ps(a: Self::Vf32) -> Self::Vf32
unsafe fn floor_pd(a: Self::Vf64) -> Self::Vf64
Sourceunsafe fn fast_round_ps(a: Self::Vf32) -> Self::Vf32
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn fast_round_ps(a: Self::Vf32) -> Self::Vf32
When using Sse2, fastround uses a faster version of floor that only works on floating point values small enough to fit in an i32. This is a big performance boost if you donβt need a complete floor.
Sourceunsafe fn fast_ceil_ps(a: Self::Vf32) -> Self::Vf32
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn fast_ceil_ps(a: Self::Vf32) -> Self::Vf32
When using Sse2, fastceil uses a faster version of floor that only works on floating point values small enough to fit in an i32. This is a big performance boost if you donβt need a complete floor.
Sourceunsafe fn fast_floor_ps(a: Self::Vf32) -> Self::Vf32
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn fast_floor_ps(a: Self::Vf32) -> Self::Vf32
When using Sse2, fastfloor uses a faster version of floor that only works on floating point values small enough to fit in an i32. This is a big performance boost if you donβt need a complete floor.
unsafe fn fast_floor_pd(a: Self::Vf64) -> Self::Vf64
Sourceunsafe fn fmadd_ps(a: Self::Vf32, b: Self::Vf32, c: Self::Vf32) -> Self::Vf32
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn fmadd_ps(a: Self::Vf32, b: Self::Vf32, c: Self::Vf32) -> Self::Vf32
Actual FMA instructions will be used when Avx2 is used, otherwise a mul and add are used to replicate it, allowing you to just always use FMA in your code and get best perf in both cases.
Sourceunsafe fn fnmadd_ps(a: Self::Vf32, b: Self::Vf32, c: Self::Vf32) -> Self::Vf32
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn fnmadd_ps(a: Self::Vf32, b: Self::Vf32, c: Self::Vf32) -> Self::Vf32
Actual FMA instructions will be used when Avx2 is used, otherwise a mul and add are used to replicate it, allowing you to just always use FMA in your code and get best perf in both cases.
Sourceunsafe fn fmadd_pd(a: Self::Vf64, b: Self::Vf64, c: Self::Vf64) -> Self::Vf64
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn fmadd_pd(a: Self::Vf64, b: Self::Vf64, c: Self::Vf64) -> Self::Vf64
Actual FMA instructions will be used when Avx2 is used, otherwise a mul and add are used to replicate it, allowing you to just always use FMA in your code and get best perf in both cases.
Sourceunsafe fn fnmadd_pd(a: Self::Vf64, b: Self::Vf64, c: Self::Vf64) -> Self::Vf64
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn fnmadd_pd(a: Self::Vf64, b: Self::Vf64, c: Self::Vf64) -> Self::Vf64
Actual FMA instructions will be used when Avx2 is used, otherwise a mul and add are used to replicate it, allowing you to just always use FMA in your code and get best perf in both cases.
Sourceunsafe fn fmsub_ps(a: Self::Vf32, b: Self::Vf32, c: Self::Vf32) -> Self::Vf32
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn fmsub_ps(a: Self::Vf32, b: Self::Vf32, c: Self::Vf32) -> Self::Vf32
Actual FMA instructions will be used when Avx2 is used, otherwise a mul and sub are used to replicate it, allowing you to just always use FMA in your code and get best perf in both cases.
Sourceunsafe fn fnmsub_ps(a: Self::Vf32, b: Self::Vf32, c: Self::Vf32) -> Self::Vf32
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn fnmsub_ps(a: Self::Vf32, b: Self::Vf32, c: Self::Vf32) -> Self::Vf32
Actual FMA instructions will be used when Avx2 is used, otherwise a mul and sub are used to replicate it, allowing you to just always use FMA in your code and get best perf in both cases.
Sourceunsafe fn fmsub_pd(a: Self::Vf64, b: Self::Vf64, c: Self::Vf64) -> Self::Vf64
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn fmsub_pd(a: Self::Vf64, b: Self::Vf64, c: Self::Vf64) -> Self::Vf64
Actual FMA instructions will be used when Avx2 is used, otherwise a mul and sub are used to replicate it, allowing you to just always use FMA in your code and get best perf in both cases.
Sourceunsafe fn fnmsub_pd(a: Self::Vf64, b: Self::Vf64, c: Self::Vf64) -> Self::Vf64
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn fnmsub_pd(a: Self::Vf64, b: Self::Vf64, c: Self::Vf64) -> Self::Vf64
Actual FMA instructions will be used when Avx2 is used, otherwise a mul and sub are used to replicate it, allowing you to just always use FMA in your code and get best perf in both cases.
Sourceunsafe fn horizontal_add_ps(a: Self::Vf32) -> f32
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn horizontal_add_ps(a: Self::Vf32) -> f32
Adds all lanes together. Distinct from h_add which adds pairs.
Sourceunsafe fn horizontal_add_pd(a: Self::Vf64) -> f64
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn horizontal_add_pd(a: Self::Vf64) -> f64
Adds all lanes together. Distinct from h_add which adds pairs.
Sourceunsafe fn i32gather_epi32(_arr: &[i32], _index: Self::Vi32) -> Self::Vi32
πDeprecated: These functions have unpredictable behavior and will be deleted in the future. Please use a manual implementation instead.
unsafe fn i32gather_epi32(_arr: &[i32], _index: Self::Vi32) -> Self::Vi32
Sse2 and Sse41 paths will simulate a gather by breaking out and doing scalar array accesses, because gather doesnβt exist until Avx2.
unsafe fn i64gather_epi64(_arr: &[i64], _index: Self::Vi64) -> Self::Vi64
Sourceunsafe fn i32gather_ps(_arr: &[f32], _index: Self::Vi32) -> Self::Vf32
πDeprecated: These functions have unpredictable behavior and will be deleted in the future. Please use a manual implementation instead.
unsafe fn i32gather_ps(_arr: &[f32], _index: Self::Vi32) -> Self::Vf32
Sse2 and Sse41 paths will simulate a gather by breaking out and doing scalar array accesses, because gather doesnβt exist until Avx2.
unsafe fn load_ps(a: &f32) -> Self::Vf32
unsafe fn load_pd(a: &f64) -> Self::Vf64
unsafe fn load_epi16(a: &i16) -> Self::Vi16
unsafe fn load_epi32(a: &i32) -> Self::Vi32
unsafe fn load_epi64(a: &i64) -> Self::Vi64
unsafe fn loadu_ps(a: &f32) -> Self::Vf32
unsafe fn loadu_pd(a: &f64) -> Self::Vf64
unsafe fn loadu_epi32(a: &i32) -> Self::Vi32
unsafe fn loadu_epi64(a: &i64) -> Self::Vi64
Sourceunsafe fn maskload_epi32(_mem_addr: &i32, _mask: Self::Vi32) -> Self::Vi32
πDeprecated: These functions have unpredictable behavior and will be deleted in the future. Please use a manual implementation instead.
unsafe fn maskload_epi32(_mem_addr: &i32, _mask: Self::Vi32) -> Self::Vi32
Note, SSE2 and SSE4 will load when mask[i] is nonzero, where AVX2 will store only when the high bit is set. To ensure portability ensure that the high bit is set.
Sourceunsafe fn maskload_epi64(_mem_addr: &i64, _mask: Self::Vi64) -> Self::Vi64
πDeprecated: These functions have unpredictable behavior and will be deleted in the future. Please use a manual implementation instead.
unsafe fn maskload_epi64(_mem_addr: &i64, _mask: Self::Vi64) -> Self::Vi64
Note, SSE2 and SSE4 will load when mask[i] is nonzero, where AVX2 will store only when the high bit is set. To ensure portability ensure that the high bit is set.
Sourceunsafe fn maskload_ps(_mem_addr: &f32, _mask: Self::Vi32) -> Self::Vf32
πDeprecated: These functions have unpredictable behavior and will be deleted in the future. Please use a manual implementation instead.
unsafe fn maskload_ps(_mem_addr: &f32, _mask: Self::Vi32) -> Self::Vf32
Note, SSE2 and SSE4 will load when mask[i] is nonzero, where AVX2 will store only when the high bit is set. To ensure portability ensure that the high bit is set.
Sourceunsafe fn maskload_pd(_mem_addr: &f64, _mask: Self::Vi64) -> Self::Vf64
πDeprecated: These functions have unpredictable behavior and will be deleted in the future. Please use a manual implementation instead.
unsafe fn maskload_pd(_mem_addr: &f64, _mask: Self::Vi64) -> Self::Vf64
Note, SSE2 and SSE4 will load when mask[i] is nonzero, where AVX2 will store only when the high bit is set. To ensure portability ensure that the high bit is set.
unsafe fn store_ps(mem_addr: &mut f32, a: Self::Vf32)
unsafe fn store_pd(mem_addr: &mut f64, a: Self::Vf64)
unsafe fn store_epi32(mem_addr: &mut i32, a: Self::Vi32)
unsafe fn store_epi64(mem_addr: &mut i64, a: Self::Vi64)
unsafe fn storeu_ps(mem_addr: &mut f32, a: Self::Vf32)
unsafe fn storeu_pd(mem_addr: &mut f64, a: Self::Vf64)
unsafe fn storeu_epi32(mem_addr: &mut i32, a: Self::Vi32)
unsafe fn storeu_epi64(mem_addr: &mut i64, a: Self::Vi64)
Sourceunsafe fn maskstore_epi32(mem_addr: &mut i32, mask: Self::Vi32, a: Self::Vi32)
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn maskstore_epi32(mem_addr: &mut i32, mask: Self::Vi32, a: Self::Vi32)
Note, SSE2 and SSE4 will store when mask[i] is nonzero, where AVX2 will store only when the high bit is set. To ensure portability ensure the high bit is set.
Sourceunsafe fn maskstore_epi64(mem_addr: &mut i64, mask: Self::Vi64, a: Self::Vi64)
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn maskstore_epi64(mem_addr: &mut i64, mask: Self::Vi64, a: Self::Vi64)
Note, SSE2 and SSE4 will store when mask[i] is nonzero, where AVX2 will store only when the high bit is set. To ensure portability ensure the high bit is set.
Sourceunsafe fn maskstore_ps(mem_addr: &mut f32, mask: Self::Vi32, a: Self::Vf32)
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn maskstore_ps(mem_addr: &mut f32, mask: Self::Vi32, a: Self::Vf32)
Note, SSE2 and SSE4 will store when mask[i] is nonzero, where AVX2 will store only when the high bit is set. To ensure portability ensure the high bit is set.
Sourceunsafe fn maskstore_pd(mem_addr: &mut f64, mask: Self::Vi64, a: Self::Vf64)
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn maskstore_pd(mem_addr: &mut f64, mask: Self::Vi64, a: Self::Vf64)
Note, SSE2 and SSE4 will store when mask[i] is nonzero, where AVX2 will store only when the high bit is set. To ensure portability ensure the high bit is set.
unsafe fn max_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32
unsafe fn min_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32
unsafe fn max_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32
unsafe fn min_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32
unsafe fn max_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64
unsafe fn min_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64
unsafe fn rcp_ps(a: Self::Vf32) -> Self::Vf32
Sourceunsafe fn round_ps(a: Self::Vf32) -> Self::Vf32
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn round_ps(a: Self::Vf32) -> Self::Vf32
Round is implemented for Sse2 by combining other Sse2 operations.
unsafe fn round_pd(a: Self::Vf64) -> Self::Vf64
unsafe fn set1_epi32(a: i32) -> Self::Vi32
unsafe fn set1_epi64(a: i64) -> Self::Vi64
unsafe fn set1_ps(a: f32) -> Self::Vf32
unsafe fn set1_pd(a: f64) -> Self::Vf64
unsafe fn setzero_ps() -> Self::Vf32
unsafe fn setzero_pd() -> Self::Vf64
unsafe fn setzero_epi32() -> Self::Vi32
unsafe fn setzero_epi64() -> Self::Vi64
Sourceunsafe fn srai_epi64(a: Self::Vi64, amt_const: i32) -> Self::Vi64
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn srai_epi64(a: Self::Vi64, amt_const: i32) -> Self::Vi64
amt must be a constant
Sourceunsafe fn srli_epi32(a: Self::Vi32, amt_const: i32) -> Self::Vi32
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn srli_epi32(a: Self::Vi32, amt_const: i32) -> Self::Vi32
amt must be a constant
Sourceunsafe fn sra_epi32(a: Self::Vi32, amt: i32) -> Self::Vi32
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn sra_epi32(a: Self::Vi32, amt: i32) -> Self::Vi32
amt does not have to be a constant, but may be slower than the srai version
Sourceunsafe fn srl_epi32(a: Self::Vi32, amt: i32) -> Self::Vi32
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn srl_epi32(a: Self::Vi32, amt: i32) -> Self::Vi32
amt does not have to be a constant, but may be slower than the srli version
Sourceunsafe fn sll_epi32(a: Self::Vi32, amt: i32) -> Self::Vi32
πDeprecated: Functions on the Simd trait are deprecated, please use the functions on the Vf32, Vf64, Vi16, Vi32, and Vi64 types instead.
unsafe fn sll_epi32(a: Self::Vi32, amt: i32) -> Self::Vi32
amt does not have to be a constant, but may be slower than the slli version
unsafe fn sub_epi32(a: Self::Vi32, b: Self::Vi32) -> Self::Vi32
unsafe fn sub_epi64(a: Self::Vi64, b: Self::Vi64) -> Self::Vi64
unsafe fn sub_ps(a: Self::Vf32, b: Self::Vf32) -> Self::Vf32
unsafe fn sub_pd(a: Self::Vf64, b: Self::Vf64) -> Self::Vf64
unsafe fn sqrt_ps(a: Self::Vf32) -> Self::Vf32
unsafe fn rsqrt_ps(a: Self::Vf32) -> Self::Vf32
unsafe fn sqrt_pd(a: Self::Vf64) -> Self::Vf64
unsafe fn rsqrt_pd(a: Self::Vf64) -> Self::Vf64
Sourceunsafe fn shuffle_epi32<const IMM8: i32>(_a: Self::Vi32) -> Self::Vi32
πDeprecated: These functions have unpredictable behavior and will be deleted in the future. Please use a manual implementation instead.
unsafe fn shuffle_epi32<const IMM8: i32>(_a: Self::Vi32) -> Self::Vi32
Using the shuffle function is undefined behavior because imm8 behaves differently on different architectures.
Dyn CompatibilityΒ§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.