pub trait SimdInt: Copy + Sealed {
type Mask;
type Scalar;
type Unsigned;
type Cast<T: SimdElement>;
Show 22 methods
// Required methods
fn cast<T>(self) -> Self::Cast<T>
where T: SimdCast;
fn saturating_add(self, second: Self) -> Self;
fn saturating_sub(self, second: Self) -> Self;
fn abs(self) -> Self;
fn saturating_abs(self) -> Self;
fn saturating_neg(self) -> Self;
fn is_positive(self) -> Self::Mask;
fn is_negative(self) -> Self::Mask;
fn signum(self) -> Self;
fn reduce_sum(self) -> Self::Scalar;
fn reduce_product(self) -> Self::Scalar;
fn reduce_max(self) -> Self::Scalar;
fn reduce_min(self) -> Self::Scalar;
fn reduce_and(self) -> Self::Scalar;
fn reduce_or(self) -> Self::Scalar;
fn reduce_xor(self) -> Self::Scalar;
fn swap_bytes(self) -> Self;
fn reverse_bits(self) -> Self;
fn leading_zeros(self) -> Self::Unsigned;
fn trailing_zeros(self) -> Self::Unsigned;
fn leading_ones(self) -> Self::Unsigned;
fn trailing_ones(self) -> Self::Unsigned;
}
portable_simd
)Expand description
Operations on SIMD vectors of signed integers.
Required Associated Types§
sourcetype Mask
🔬This is a nightly-only experimental API. (portable_simd
)
type Mask
portable_simd
)Mask type used for manipulating this SIMD vector type.
sourcetype Scalar
🔬This is a nightly-only experimental API. (portable_simd
)
type Scalar
portable_simd
)Scalar type contained by this SIMD vector type.
sourcetype Unsigned
🔬This is a nightly-only experimental API. (portable_simd
)
type Unsigned
portable_simd
)A SIMD vector of unsigned integers with the same element size.
sourcetype Cast<T: SimdElement>
🔬This is a nightly-only experimental API. (portable_simd
)
type Cast<T: SimdElement>
portable_simd
)A SIMD vector with a different element type.
Required Methods§
sourcefn cast<T>(self) -> Self::Cast<T>where
T: SimdCast,
🔬This is a nightly-only experimental API. (portable_simd
)
fn cast<T>(self) -> Self::Cast<T>where
T: SimdCast,
portable_simd
)Performs elementwise conversion of this vector’s elements to another SIMD-valid type.
This follows the semantics of Rust’s as
conversion for casting integers (wrapping to
other integer types, and saturating to float types).
sourcefn saturating_add(self, second: Self) -> Self
🔬This is a nightly-only experimental API. (portable_simd
)
fn saturating_add(self, second: Self) -> Self
portable_simd
)Lanewise saturating add.
§Examples
use core::i32::{MIN, MAX};
let x = Simd::from_array([MIN, 0, 1, MAX]);
let max = Simd::splat(MAX);
let unsat = x + max;
let sat = x.saturating_add(max);
assert_eq!(unsat, Simd::from_array([-1, MAX, MIN, -2]));
assert_eq!(sat, Simd::from_array([-1, MAX, MAX, MAX]));
sourcefn saturating_sub(self, second: Self) -> Self
🔬This is a nightly-only experimental API. (portable_simd
)
fn saturating_sub(self, second: Self) -> Self
portable_simd
)Lanewise saturating subtract.
§Examples
use core::i32::{MIN, MAX};
let x = Simd::from_array([MIN, -2, -1, MAX]);
let max = Simd::splat(MAX);
let unsat = x - max;
let sat = x.saturating_sub(max);
assert_eq!(unsat, Simd::from_array([1, MAX, MIN, 0]));
assert_eq!(sat, Simd::from_array([MIN, MIN, MIN, 0]));
sourcefn abs(self) -> Self
🔬This is a nightly-only experimental API. (portable_simd
)
fn abs(self) -> Self
portable_simd
)Lanewise absolute value, implemented in Rust. Every element becomes its absolute value.
§Examples
use core::i32::{MIN, MAX};
let xs = Simd::from_array([MIN, MIN +1, -5, 0]);
assert_eq!(xs.abs(), Simd::from_array([MIN, MAX, 5, 0]));
sourcefn saturating_abs(self) -> Self
🔬This is a nightly-only experimental API. (portable_simd
)
fn saturating_abs(self) -> Self
portable_simd
)Lanewise saturating absolute value, implemented in Rust. As abs(), except the MIN value becomes MAX instead of itself.
§Examples
use core::i32::{MIN, MAX};
let xs = Simd::from_array([MIN, -2, 0, 3]);
let unsat = xs.abs();
let sat = xs.saturating_abs();
assert_eq!(unsat, Simd::from_array([MIN, 2, 0, 3]));
assert_eq!(sat, Simd::from_array([MAX, 2, 0, 3]));
sourcefn saturating_neg(self) -> Self
🔬This is a nightly-only experimental API. (portable_simd
)
fn saturating_neg(self) -> Self
portable_simd
)Lanewise saturating negation, implemented in Rust. As neg(), except the MIN value becomes MAX instead of itself.
§Examples
use core::i32::{MIN, MAX};
let x = Simd::from_array([MIN, -2, 3, MAX]);
let unsat = -x;
let sat = x.saturating_neg();
assert_eq!(unsat, Simd::from_array([MIN, 2, -3, MIN + 1]));
assert_eq!(sat, Simd::from_array([MAX, 2, -3, MIN + 1]));
sourcefn is_positive(self) -> Self::Mask
🔬This is a nightly-only experimental API. (portable_simd
)
fn is_positive(self) -> Self::Mask
portable_simd
)Returns true for each positive element and false if it is zero or negative.
sourcefn is_negative(self) -> Self::Mask
🔬This is a nightly-only experimental API. (portable_simd
)
fn is_negative(self) -> Self::Mask
portable_simd
)Returns true for each negative element and false if it is zero or positive.
sourcefn signum(self) -> Self
🔬This is a nightly-only experimental API. (portable_simd
)
fn signum(self) -> Self
portable_simd
)Returns numbers representing the sign of each element.
0
if the number is zero1
if the number is positive-1
if the number is negative
sourcefn reduce_sum(self) -> Self::Scalar
🔬This is a nightly-only experimental API. (portable_simd
)
fn reduce_sum(self) -> Self::Scalar
portable_simd
)Returns the sum of the elements of the vector, with wrapping addition.
§Examples
let v = i32x4::from_array([1, 2, 3, 4]);
assert_eq!(v.reduce_sum(), 10);
// SIMD integer addition is always wrapping
let v = i32x4::from_array([i32::MAX, 1, 0, 0]);
assert_eq!(v.reduce_sum(), i32::MIN);
sourcefn reduce_product(self) -> Self::Scalar
🔬This is a nightly-only experimental API. (portable_simd
)
fn reduce_product(self) -> Self::Scalar
portable_simd
)Returns the product of the elements of the vector, with wrapping multiplication.
§Examples
let v = i32x4::from_array([1, 2, 3, 4]);
assert_eq!(v.reduce_product(), 24);
// SIMD integer multiplication is always wrapping
let v = i32x4::from_array([i32::MAX, 2, 1, 1]);
assert!(v.reduce_product() < i32::MAX);
sourcefn reduce_max(self) -> Self::Scalar
🔬This is a nightly-only experimental API. (portable_simd
)
fn reduce_max(self) -> Self::Scalar
portable_simd
)Returns the maximum element in the vector.
§Examples
let v = i32x4::from_array([1, 2, 3, 4]);
assert_eq!(v.reduce_max(), 4);
sourcefn reduce_min(self) -> Self::Scalar
🔬This is a nightly-only experimental API. (portable_simd
)
fn reduce_min(self) -> Self::Scalar
portable_simd
)Returns the minimum element in the vector.
§Examples
let v = i32x4::from_array([1, 2, 3, 4]);
assert_eq!(v.reduce_min(), 1);
sourcefn reduce_and(self) -> Self::Scalar
🔬This is a nightly-only experimental API. (portable_simd
)
fn reduce_and(self) -> Self::Scalar
portable_simd
)Returns the cumulative bitwise “and” across the elements of the vector.
sourcefn reduce_or(self) -> Self::Scalar
🔬This is a nightly-only experimental API. (portable_simd
)
fn reduce_or(self) -> Self::Scalar
portable_simd
)Returns the cumulative bitwise “or” across the elements of the vector.
sourcefn reduce_xor(self) -> Self::Scalar
🔬This is a nightly-only experimental API. (portable_simd
)
fn reduce_xor(self) -> Self::Scalar
portable_simd
)Returns the cumulative bitwise “xor” across the elements of the vector.
sourcefn swap_bytes(self) -> Self
🔬This is a nightly-only experimental API. (portable_simd
)
fn swap_bytes(self) -> Self
portable_simd
)Reverses the byte order of each element.
sourcefn reverse_bits(self) -> Self
🔬This is a nightly-only experimental API. (portable_simd
)
fn reverse_bits(self) -> Self
portable_simd
)Reverses the order of bits in each elemnent. The least significant bit becomes the most significant bit, second least-significant bit becomes second most-significant bit, etc.
sourcefn leading_zeros(self) -> Self::Unsigned
🔬This is a nightly-only experimental API. (portable_simd
)
fn leading_zeros(self) -> Self::Unsigned
portable_simd
)Returns the number of leading zeros in the binary representation of each element.
sourcefn trailing_zeros(self) -> Self::Unsigned
🔬This is a nightly-only experimental API. (portable_simd
)
fn trailing_zeros(self) -> Self::Unsigned
portable_simd
)Returns the number of trailing zeros in the binary representation of each element.
sourcefn leading_ones(self) -> Self::Unsigned
🔬This is a nightly-only experimental API. (portable_simd
)
fn leading_ones(self) -> Self::Unsigned
portable_simd
)Returns the number of leading ones in the binary representation of each element.
sourcefn trailing_ones(self) -> Self::Unsigned
🔬This is a nightly-only experimental API. (portable_simd
)
fn trailing_ones(self) -> Self::Unsigned
portable_simd
)Returns the number of trailing ones in the binary representation of each element.
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.