```
#[repr(simd)]pub struct Simd<T, const N: usize>([T; N])
where
LaneCount<N>: SupportedLaneCount,
T: SimdElement;
```

`portable_simd`

)## Expand description

A SIMD vector with the shape of `[T; N]`

but the operations of `T`

.

`Simd<T, N>`

supports the operators (+, *, etc.) that `T`

does in “elementwise” fashion.
These take the element at each index from the left-hand side and right-hand side,
perform the operation, then return the result in the same index in a vector of equal size.
However, `Simd`

differs from normal iteration and normal arrays:

`Simd<T, N>`

executes`N`

operations in a single step with no`break`

s`Simd<T, N>`

can have an alignment greater than`T`

, for better mechanical sympathy

By always imposing these constraints on `Simd`

, it is easier to compile elementwise operations
into machine instructions that can themselves be executed in parallel.

```
let a: [i32; 4] = [-2, 0, 2, 4];
let b = [10, 9, 8, 7];
let sum = array::from_fn(|i| a[i] + b[i]);
let prod = array::from_fn(|i| a[i] * b[i]);
// `Simd<T, N>` implements `From<[T; N]>`
let (v, w) = (Simd::from(a), Simd::from(b));
// Which means arrays implement `Into<Simd<T, N>>`.
assert_eq!(v + w, sum.into());
assert_eq!(v * w, prod.into());
```

`Simd`

with integer elements treats operators as wrapping, as if `T`

was `Wrapping<T>`

.
Thus, `Simd`

does not implement `wrapping_add`

, because that is the default behavior.
This means there is no warning on overflows, even in “debug” builds.
For most applications where `Simd`

is appropriate, it is “not a bug” to wrap,
and even “debug builds” are unlikely to tolerate the loss of performance.
You may want to consider using explicitly checked arithmetic if such is required.
Division by zero on integers still causes a panic, so
you may want to consider using `f32`

or `f64`

if that is unacceptable.

## §Layout

`Simd<T, N>`

has a layout similar to `[T; N]`

(identical “shapes”), with a greater alignment.
`[T; N]`

is aligned to `T`

, but `Simd<T, N>`

will have an alignment based on both `T`

and `N`

.
Thus it is sound to `transmute`

`Simd<T, N>`

to `[T; N]`

and should optimize to “zero cost”,
but the reverse transmutation may require a copy the compiler cannot simply elide.

## §ABI “Features”

Due to Rust’s safety guarantees, `Simd<T, N>`

is currently passed and returned via memory,
not SIMD registers, except as an optimization. Using `#[inline]`

on functions that accept
`Simd<T, N>`

or return it is recommended, at the cost of code generation time, as
inlining SIMD-using functions can omit a large function prolog or epilog and thus
improve both speed and code size. The need for this may be corrected in the future.

Using `#[inline(always)]`

still requires additional care.

## §Safe SIMD with Unsafe Rust

Operations with `Simd`

are typically safe, but there are many reasons to want to combine SIMD with `unsafe`

code.
Care must be taken to respect differences between `Simd`

and other types it may be transformed into or derived from.
In particular, the layout of `Simd<T, N>`

may be similar to `[T; N]`

, and may allow some transmutations,
but references to `[T; N]`

are not interchangeable with those to `Simd<T, N>`

.
Thus, when using `unsafe`

Rust to read and write `Simd<T, N>`

through raw pointers, it is a good idea to first try with
`read_unaligned`

and `write_unaligned`

. This is because:

`read`

and`write`

require full alignment (in this case,`Simd<T, N>`

’s alignment)`Simd<T, N>`

is often read from or written to`[T]`

and other types aligned to`T`

- combining these actions violates the
`unsafe`

contract and explodes the program into a puff of**undefined behavior** - the compiler can implicitly adjust layouts to make unaligned reads or writes fully aligned if it sees the optimization
- most contemporary processors with “aligned” and “unaligned” read and write instructions exhibit no performance difference if the “unaligned” variant is aligned at runtime

Less obligations mean unaligned reads and writes are less likely to make the program unsound,
and may be just as fast as stricter alternatives.
When trying to guarantee alignment, `[T]::as_simd`

is an option for
converting `[T]`

to `[Simd<T, N>]`

, and allows soundly operating on an aligned SIMD body,
but it may cost more time when handling the scalar head and tail.
If these are not enough, it is most ideal to design data structures to be already aligned
to `mem::align_of::<Simd<T, N>>()`

before using `unsafe`

Rust to read or write.
Other ways to compensate for these facts, like materializing `Simd`

to or from an array first,
are handled by safe methods like `Simd::from_array`

and `Simd::from_slice`

.

## Tuple Fields§

§`0: [T; N]`

`portable_simd`

)## Implementations§

source§### impl<T, const N: usize> Simd<T, N>

### impl<T, const N: usize> Simd<T, N>

source#### pub fn reverse(self) -> Simd<T, N>

🔬This is a nightly-only experimental API. (`portable_simd`

)

#### pub fn reverse(self) -> Simd<T, N>

`portable_simd`

)Reverse the order of the elements in the vector.

source#### pub fn rotate_elements_left<const OFFSET: usize>(self) -> Simd<T, N>

🔬This is a nightly-only experimental API. (`portable_simd`

)

#### pub fn rotate_elements_left<const OFFSET: usize>(self) -> Simd<T, N>

`portable_simd`

)Rotates the vector such that the first `OFFSET`

elements of the slice move to the end
while the last `self.len() - OFFSET`

elements move to the front. After calling `rotate_elements_left`

,
the element previously at index `OFFSET`

will become the first element in the slice.

source#### pub fn rotate_elements_right<const OFFSET: usize>(self) -> Simd<T, N>

🔬This is a nightly-only experimental API. (`portable_simd`

)

#### pub fn rotate_elements_right<const OFFSET: usize>(self) -> Simd<T, N>

`portable_simd`

)Rotates the vector such that the first `self.len() - OFFSET`

elements of the vector move to
the end while the last `OFFSET`

elements move to the front. After calling `rotate_elements_right`

,
the element previously at index `self.len() - OFFSET`

will become the first element in the slice.

source#### pub fn interleave(self, other: Simd<T, N>) -> (Simd<T, N>, Simd<T, N>)

🔬This is a nightly-only experimental API. (`portable_simd`

)

#### pub fn interleave(self, other: Simd<T, N>) -> (Simd<T, N>, Simd<T, N>)

`portable_simd`

)Interleave two vectors.

The resulting vectors contain elements taken alternatively from `self`

and `other`

, first
filling the first result, and then the second.

The reverse of this operation is `Simd::deinterleave`

.

```
let a = Simd::from_array([0, 1, 2, 3]);
let b = Simd::from_array([4, 5, 6, 7]);
let (x, y) = a.interleave(b);
assert_eq!(x.to_array(), [0, 4, 1, 5]);
assert_eq!(y.to_array(), [2, 6, 3, 7]);
```

source#### pub fn deinterleave(self, other: Simd<T, N>) -> (Simd<T, N>, Simd<T, N>)

🔬This is a nightly-only experimental API. (`portable_simd`

)

#### pub fn deinterleave(self, other: Simd<T, N>) -> (Simd<T, N>, Simd<T, N>)

`portable_simd`

)Deinterleave two vectors.

The first result takes every other element of `self`

and then `other`

, starting with
the first element.

The second result takes every other element of `self`

and then `other`

, starting with
the second element.

The reverse of this operation is `Simd::interleave`

.

```
let a = Simd::from_array([0, 4, 1, 5]);
let b = Simd::from_array([2, 6, 3, 7]);
let (x, y) = a.deinterleave(b);
assert_eq!(x.to_array(), [0, 1, 2, 3]);
assert_eq!(y.to_array(), [4, 5, 6, 7]);
```

source#### pub fn resize<const M: usize>(self, value: T) -> Simd<T, M>where
LaneCount<M>: SupportedLaneCount,

🔬This is a nightly-only experimental API. (`portable_simd`

)

#### pub fn resize<const M: usize>(self, value: T) -> Simd<T, M>where
LaneCount<M>: SupportedLaneCount,

`portable_simd`

)Resize a vector.

If `M`

> `N`

, extends the length of a vector, setting the new elements to `value`

.
If `M`

< `N`

, truncates the vector to the first `M`

elements.

```
let x = u32x4::from_array([0, 1, 2, 3]);
assert_eq!(x.resize::<8>(9).to_array(), [0, 1, 2, 3, 9, 9, 9, 9]);
assert_eq!(x.resize::<2>(9).to_array(), [0, 1]);
```

source§### impl<const N: usize> Simd<u8, N>where
LaneCount<N>: SupportedLaneCount,

### impl<const N: usize> Simd<u8, N>where
LaneCount<N>: SupportedLaneCount,

source#### pub fn swizzle_dyn(self, idxs: Simd<u8, N>) -> Simd<u8, N>

🔬This is a nightly-only experimental API. (`portable_simd`

)

#### pub fn swizzle_dyn(self, idxs: Simd<u8, N>) -> Simd<u8, N>

`portable_simd`

)Swizzle a vector of bytes according to the index vector. Indices within range select the appropriate byte. Indices “out of bounds” instead select 0.

Note that the current implementation is selected during build-time
of the standard library, so `cargo build -Zbuild-std`

may be necessary
to unlock better performance, especially for larger vectors.
A planned compiler improvement will enable using `#[target_feature]`

instead.

source§### impl<T, const N: usize> Simd<T, N>

### impl<T, const N: usize> Simd<T, N>

source#### pub const LEN: usize = N

🔬This is a nightly-only experimental API. (`portable_simd`

)

#### pub const LEN: usize = N

`portable_simd`

)Number of elements in this vector.

source#### pub const fn len(&self) -> usize

🔬This is a nightly-only experimental API. (`portable_simd`

)

#### pub const fn len(&self) -> usize

`portable_simd`

)Returns the number of elements in this SIMD vector.

##### §Examples

```
let v = u32x4::splat(0);
assert_eq!(v.len(), 4);
```

source#### pub fn splat(value: T) -> Simd<T, N>

🔬This is a nightly-only experimental API. (`portable_simd`

)

#### pub fn splat(value: T) -> Simd<T, N>

`portable_simd`

)Constructs a new SIMD vector with all elements set to the given value.

##### §Examples

```
let v = u32x4::splat(8);
assert_eq!(v.as_array(), &[8, 8, 8, 8]);
```

source#### pub const fn as_array(&self) -> &[T; N]

🔬This is a nightly-only experimental API. (`portable_simd`

)

#### pub const fn as_array(&self) -> &[T; N]

`portable_simd`

)Returns an array reference containing the entire SIMD vector.

##### §Examples

```
let v: u64x4 = Simd::from_array([0, 1, 2, 3]);
assert_eq!(v.as_array(), &[0, 1, 2, 3]);
```

source#### pub fn as_mut_array(&mut self) -> &mut [T; N]

🔬This is a nightly-only experimental API. (`portable_simd`

)

#### pub fn as_mut_array(&mut self) -> &mut [T; N]

`portable_simd`

)Returns a mutable array reference containing the entire SIMD vector.

source#### pub const fn from_array(array: [T; N]) -> Simd<T, N>

🔬This is a nightly-only experimental API. (`portable_simd`

)

#### pub const fn from_array(array: [T; N]) -> Simd<T, N>

`portable_simd`

)Converts an array to a SIMD vector.

source#### pub const fn to_array(self) -> [T; N]

🔬This is a nightly-only experimental API. (`portable_simd`

)

#### pub const fn to_array(self) -> [T; N]

`portable_simd`

)Converts a SIMD vector to an array.

source#### pub const fn from_slice(slice: &[T]) -> Simd<T, N>

🔬This is a nightly-only experimental API. (`portable_simd`

)

#### pub const fn from_slice(slice: &[T]) -> Simd<T, N>

`portable_simd`

)source#### pub fn copy_to_slice(self, slice: &mut [T])

🔬This is a nightly-only experimental API. (`portable_simd`

)

#### pub fn copy_to_slice(self, slice: &mut [T])

`portable_simd`

)source#### pub fn gather_or(
slice: &[T],
idxs: Simd<usize, N>,
or: Simd<T, N>
) -> Simd<T, N>

🔬This is a nightly-only experimental API. (`portable_simd`

)

#### pub fn gather_or( slice: &[T], idxs: Simd<usize, N>, or: Simd<T, N> ) -> Simd<T, N>

`portable_simd`

)Reads from potentially discontiguous indices in `slice`

to construct a SIMD vector.
If an index is out-of-bounds, the element is instead selected from the `or`

vector.

##### §Examples

```
let vec: Vec<i32> = vec![10, 11, 12, 13, 14, 15, 16, 17, 18];
let idxs = Simd::from_array([9, 3, 0, 5]); // Note the index that is out-of-bounds
let alt = Simd::from_array([-5, -4, -3, -2]);
let result = Simd::gather_or(&vec, idxs, alt);
assert_eq!(result, Simd::from_array([-5, 13, 10, 15]));
```

source#### pub fn gather_or_default(slice: &[T], idxs: Simd<usize, N>) -> Simd<T, N>where
T: Default,

🔬This is a nightly-only experimental API. (`portable_simd`

)

#### pub fn gather_or_default(slice: &[T], idxs: Simd<usize, N>) -> Simd<T, N>where
T: Default,

`portable_simd`

)Reads from indices in `slice`

to construct a SIMD vector.
If an index is out-of-bounds, the element is set to the default given by `T: Default`

.

##### §Examples

```
let vec: Vec<i32> = vec![10, 11, 12, 13, 14, 15, 16, 17, 18];
let idxs = Simd::from_array([9, 3, 0, 5]); // Note the index that is out-of-bounds
let result = Simd::gather_or_default(&vec, idxs);
assert_eq!(result, Simd::from_array([0, 13, 10, 15]));
```

source#### pub fn gather_select(
slice: &[T],
enable: Mask<isize, N>,
idxs: Simd<usize, N>,
or: Simd<T, N>
) -> Simd<T, N>

🔬This is a nightly-only experimental API. (`portable_simd`

)

#### pub fn gather_select( slice: &[T], enable: Mask<isize, N>, idxs: Simd<usize, N>, or: Simd<T, N> ) -> Simd<T, N>

`portable_simd`

)Reads from indices in `slice`

to construct a SIMD vector.
The mask `enable`

s all `true`

indices and disables all `false`

indices.
If an index is disabled or is out-of-bounds, the element is selected from the `or`

vector.

##### §Examples

```
let vec: Vec<i32> = vec![10, 11, 12, 13, 14, 15, 16, 17, 18];
let idxs = Simd::from_array([9, 3, 0, 5]); // Includes an out-of-bounds index
let alt = Simd::from_array([-5, -4, -3, -2]);
let enable = Mask::from_array([true, true, true, false]); // Includes a masked element
let result = Simd::gather_select(&vec, enable, idxs, alt);
assert_eq!(result, Simd::from_array([-5, 13, 10, -2]));
```

source#### pub unsafe fn gather_select_unchecked(
slice: &[T],
enable: Mask<isize, N>,
idxs: Simd<usize, N>,
or: Simd<T, N>
) -> Simd<T, N>

🔬This is a nightly-only experimental API. (`portable_simd`

)

#### pub unsafe fn gather_select_unchecked( slice: &[T], enable: Mask<isize, N>, idxs: Simd<usize, N>, or: Simd<T, N> ) -> Simd<T, N>

`portable_simd`

)Reads from indices in `slice`

to construct a SIMD vector.
The mask `enable`

s all `true`

indices and disables all `false`

indices.
If an index is disabled, the element is selected from the `or`

vector.

##### §Safety

Calling this function with an `enable`

d out-of-bounds index is *undefined behavior*
even if the resulting value is not used.

##### §Examples

```
let vec: Vec<i32> = vec![10, 11, 12, 13, 14, 15, 16, 17, 18];
let idxs = Simd::from_array([9, 3, 0, 5]); // Includes an out-of-bounds index
let alt = Simd::from_array([-5, -4, -3, -2]);
let enable = Mask::from_array([true, true, true, false]); // Includes a masked element
// If this mask was used to gather, it would be unsound. Let's fix that.
let enable = enable & idxs.simd_lt(Simd::splat(vec.len()));
// The out-of-bounds index has been masked, so it's safe to gather now.
let result = unsafe { Simd::gather_select_unchecked(&vec, enable, idxs, alt) };
assert_eq!(result, Simd::from_array([-5, 13, 10, -2]));
```

source#### pub unsafe fn gather_ptr(source: Simd<*const T, N>) -> Simd<T, N>where
T: Default,

🔬This is a nightly-only experimental API. (`portable_simd`

)

#### pub unsafe fn gather_ptr(source: Simd<*const T, N>) -> Simd<T, N>where
T: Default,

`portable_simd`

)Read elementwise from pointers into a SIMD vector.

##### §Safety

Each read must satisfy the same conditions as `core::ptr::read`

.

##### §Example

```
let values = [6, 2, 4, 9];
let offsets = Simd::from_array([1, 0, 0, 3]);
let source = Simd::splat(values.as_ptr()).wrapping_add(offsets);
let gathered = unsafe { Simd::gather_ptr(source) };
assert_eq!(gathered, Simd::from_array([2, 6, 6, 9]));
```

source#### pub unsafe fn gather_select_ptr(
source: Simd<*const T, N>,
enable: Mask<isize, N>,
or: Simd<T, N>
) -> Simd<T, N>

🔬This is a nightly-only experimental API. (`portable_simd`

)

#### pub unsafe fn gather_select_ptr( source: Simd<*const T, N>, enable: Mask<isize, N>, or: Simd<T, N> ) -> Simd<T, N>

`portable_simd`

)Conditionally read elementwise from pointers into a SIMD vector.
The mask `enable`

s all `true`

pointers and disables all `false`

pointers.
If a pointer is disabled, the element is selected from the `or`

vector,
and no read is performed.

##### §Safety

Enabled elements must satisfy the same conditions as `core::ptr::read`

.

##### §Example

```
let values = [6, 2, 4, 9];
let enable = Mask::from_array([true, true, false, true]);
let offsets = Simd::from_array([1, 0, 0, 3]);
let source = Simd::splat(values.as_ptr()).wrapping_add(offsets);
let gathered = unsafe { Simd::gather_select_ptr(source, enable, Simd::splat(0)) };
assert_eq!(gathered, Simd::from_array([2, 6, 0, 9]));
```

source#### pub fn scatter(self, slice: &mut [T], idxs: Simd<usize, N>)

🔬This is a nightly-only experimental API. (`portable_simd`

)

#### pub fn scatter(self, slice: &mut [T], idxs: Simd<usize, N>)

`portable_simd`

)Writes the values in a SIMD vector to potentially discontiguous indices in `slice`

.
If an index is out-of-bounds, the write is suppressed without panicking.
If two elements in the scattered vector would write to the same index
only the last element is guaranteed to actually be written.

##### §Examples

```
let mut vec: Vec<i32> = vec![10, 11, 12, 13, 14, 15, 16, 17, 18];
let idxs = Simd::from_array([9, 3, 0, 0]); // Note the duplicate index.
let vals = Simd::from_array([-27, 82, -41, 124]);
vals.scatter(&mut vec, idxs); // two logical writes means the last wins.
assert_eq!(vec, vec![124, 11, 12, 82, 14, 15, 16, 17, 18]);
```

source#### pub fn scatter_select(
self,
slice: &mut [T],
enable: Mask<isize, N>,
idxs: Simd<usize, N>
)

🔬This is a nightly-only experimental API. (`portable_simd`

)

#### pub fn scatter_select( self, slice: &mut [T], enable: Mask<isize, N>, idxs: Simd<usize, N> )

`portable_simd`

)Writes values from a SIMD vector to multiple potentially discontiguous indices in `slice`

.
The mask `enable`

s all `true`

indices and disables all `false`

indices.
If an enabled index is out-of-bounds, the write is suppressed without panicking.
If two enabled elements in the scattered vector would write to the same index,
only the last element is guaranteed to actually be written.

##### §Examples

```
let mut vec: Vec<i32> = vec![10, 11, 12, 13, 14, 15, 16, 17, 18];
let idxs = Simd::from_array([9, 3, 0, 0]); // Includes an out-of-bounds index
let vals = Simd::from_array([-27, 82, -41, 124]);
let enable = Mask::from_array([true, true, true, false]); // Includes a masked element
vals.scatter_select(&mut vec, enable, idxs); // The last write is masked, thus omitted.
assert_eq!(vec, vec![-41, 11, 12, 82, 14, 15, 16, 17, 18]);
```

source#### pub unsafe fn scatter_select_unchecked(
self,
slice: &mut [T],
enable: Mask<isize, N>,
idxs: Simd<usize, N>
)

🔬This is a nightly-only experimental API. (`portable_simd`

)

#### pub unsafe fn scatter_select_unchecked( self, slice: &mut [T], enable: Mask<isize, N>, idxs: Simd<usize, N> )

`portable_simd`

)Writes values from a SIMD vector to multiple potentially discontiguous indices in `slice`

.
The mask `enable`

s all `true`

indices and disables all `false`

indices.
If two enabled elements in the scattered vector would write to the same index,
only the last element is guaranteed to actually be written.

##### §Safety

Calling this function with an enabled out-of-bounds index is *undefined behavior*,
and may lead to memory corruption.

##### §Examples

```
let mut vec: Vec<i32> = vec![10, 11, 12, 13, 14, 15, 16, 17, 18];
let idxs = Simd::from_array([9, 3, 0, 0]);
let vals = Simd::from_array([-27, 82, -41, 124]);
let enable = Mask::from_array([true, true, true, false]); // Masks the final index
// If this mask was used to scatter, it would be unsound. Let's fix that.
let enable = enable & idxs.simd_lt(Simd::splat(vec.len()));
// We have masked the OOB index, so it's safe to scatter now.
unsafe { vals.scatter_select_unchecked(&mut vec, enable, idxs); }
// The second write to index 0 was masked, thus omitted.
assert_eq!(vec, vec![-41, 11, 12, 82, 14, 15, 16, 17, 18]);
```

source#### pub unsafe fn scatter_ptr(self, dest: Simd<*mut T, N>)

🔬This is a nightly-only experimental API. (`portable_simd`

)

#### pub unsafe fn scatter_ptr(self, dest: Simd<*mut T, N>)

`portable_simd`

)Write pointers elementwise into a SIMD vector.

##### §Safety

Each write must satisfy the same conditions as `core::ptr::write`

.

##### §Example

```
let mut values = [0; 4];
let offset = Simd::from_array([3, 2, 1, 0]);
let ptrs = Simd::splat(values.as_mut_ptr()).wrapping_add(offset);
unsafe { Simd::from_array([6, 3, 5, 7]).scatter_ptr(ptrs); }
assert_eq!(values, [7, 5, 3, 6]);
```

source#### pub unsafe fn scatter_select_ptr(
self,
dest: Simd<*mut T, N>,
enable: Mask<isize, N>
)

🔬This is a nightly-only experimental API. (`portable_simd`

)

#### pub unsafe fn scatter_select_ptr( self, dest: Simd<*mut T, N>, enable: Mask<isize, N> )

`portable_simd`

)Conditionally write pointers elementwise into a SIMD vector.
The mask `enable`

s all `true`

pointers and disables all `false`

pointers.
If a pointer is disabled, the write to its pointee is skipped.

##### §Safety

Enabled pointers must satisfy the same conditions as `core::ptr::write`

.

##### §Example

```
let mut values = [0; 4];
let offset = Simd::from_array([3, 2, 1, 0]);
let ptrs = Simd::splat(values.as_mut_ptr()).wrapping_add(offset);
let enable = Mask::from_array([true, true, false, false]);
unsafe { Simd::from_array([6, 3, 5, 7]).scatter_select_ptr(ptrs, enable); }
assert_eq!(values, [0, 0, 3, 6]);
```

## Trait Implementations§

source§### impl<T, U, const N: usize> AddAssign<U> for Simd<T, N>

### impl<T, U, const N: usize> AddAssign<U> for Simd<T, N>

source§#### fn add_assign(&mut self, rhs: U)

#### fn add_assign(&mut self, rhs: U)

`+=`

operation. Read moresource§### impl<T, U, const N: usize> BitAndAssign<U> for Simd<T, N>

### impl<T, U, const N: usize> BitAndAssign<U> for Simd<T, N>

source§#### fn bitand_assign(&mut self, rhs: U)

#### fn bitand_assign(&mut self, rhs: U)

`&=`

operation. Read moresource§### impl<T, U, const N: usize> BitOrAssign<U> for Simd<T, N>

### impl<T, U, const N: usize> BitOrAssign<U> for Simd<T, N>

source§#### fn bitor_assign(&mut self, rhs: U)

#### fn bitor_assign(&mut self, rhs: U)

`|=`

operation. Read moresource§### impl<T, U, const N: usize> BitXorAssign<U> for Simd<T, N>

### impl<T, U, const N: usize> BitXorAssign<U> for Simd<T, N>

source§#### fn bitxor_assign(&mut self, rhs: U)

#### fn bitxor_assign(&mut self, rhs: U)

`^=`

operation. Read moresource§### impl<T, U, const N: usize> DivAssign<U> for Simd<T, N>

### impl<T, U, const N: usize> DivAssign<U> for Simd<T, N>

source§#### fn div_assign(&mut self, rhs: U)

#### fn div_assign(&mut self, rhs: U)

`/=`

operation. Read moresource§### impl<T, U, const N: usize> MulAssign<U> for Simd<T, N>

### impl<T, U, const N: usize> MulAssign<U> for Simd<T, N>

source§#### fn mul_assign(&mut self, rhs: U)

#### fn mul_assign(&mut self, rhs: U)

`*=`

operation. Read moresource§### impl<T, const N: usize> Ord for Simd<T, N>

### impl<T, const N: usize> Ord for Simd<T, N>

1.21.0 · source§#### fn max(self, other: Self) -> Selfwhere
Self: Sized,

#### fn max(self, other: Self) -> Selfwhere
Self: Sized,

source§### impl<T, const N: usize> PartialEq for Simd<T, N>

### impl<T, const N: usize> PartialEq for Simd<T, N>

source§### impl<T, const N: usize> PartialOrd for Simd<T, N>

### impl<T, const N: usize> PartialOrd for Simd<T, N>

1.0.0 · source§#### fn le(&self, other: &Rhs) -> bool

#### fn le(&self, other: &Rhs) -> bool

`self`

and `other`

) and is used by the `<=`

operator. Read moresource§### impl<'a, const N: usize> Product<&'a Simd<f32, N>> for Simd<f32, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'a, const N: usize> Product<&'a Simd<f32, N>> for Simd<f32, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'a, const N: usize> Product<&'a Simd<f64, N>> for Simd<f64, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'a, const N: usize> Product<&'a Simd<f64, N>> for Simd<f64, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'a, const N: usize> Product<&'a Simd<i16, N>> for Simd<i16, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'a, const N: usize> Product<&'a Simd<i16, N>> for Simd<i16, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'a, const N: usize> Product<&'a Simd<i32, N>> for Simd<i32, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'a, const N: usize> Product<&'a Simd<i32, N>> for Simd<i32, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'a, const N: usize> Product<&'a Simd<i64, N>> for Simd<i64, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'a, const N: usize> Product<&'a Simd<i64, N>> for Simd<i64, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'a, const N: usize> Product<&'a Simd<i8, N>> for Simd<i8, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'a, const N: usize> Product<&'a Simd<i8, N>> for Simd<i8, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'a, const N: usize> Product<&'a Simd<isize, N>> for Simd<isize, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'a, const N: usize> Product<&'a Simd<isize, N>> for Simd<isize, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'a, const N: usize> Product<&'a Simd<u16, N>> for Simd<u16, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'a, const N: usize> Product<&'a Simd<u16, N>> for Simd<u16, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'a, const N: usize> Product<&'a Simd<u32, N>> for Simd<u32, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'a, const N: usize> Product<&'a Simd<u32, N>> for Simd<u32, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'a, const N: usize> Product<&'a Simd<u64, N>> for Simd<u64, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'a, const N: usize> Product<&'a Simd<u64, N>> for Simd<u64, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'a, const N: usize> Product<&'a Simd<u8, N>> for Simd<u8, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'a, const N: usize> Product<&'a Simd<u8, N>> for Simd<u8, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'a, const N: usize> Product<&'a Simd<usize, N>> for Simd<usize, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'a, const N: usize> Product<&'a Simd<usize, N>> for Simd<usize, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<T, U, const N: usize> RemAssign<U> for Simd<T, N>

### impl<T, U, const N: usize> RemAssign<U> for Simd<T, N>

source§#### fn rem_assign(&mut self, rhs: U)

#### fn rem_assign(&mut self, rhs: U)

`%=`

operation. Read moresource§### impl<'lhs, const N: usize> Shl<&i16> for &'lhs Simd<i16, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'lhs, const N: usize> Shl<&i16> for &'lhs Simd<i16, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'lhs, const N: usize> Shl<&i32> for &'lhs Simd<i32, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'lhs, const N: usize> Shl<&i32> for &'lhs Simd<i32, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'lhs, const N: usize> Shl<&i64> for &'lhs Simd<i64, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'lhs, const N: usize> Shl<&i64> for &'lhs Simd<i64, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'lhs, const N: usize> Shl<&i8> for &'lhs Simd<i8, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'lhs, const N: usize> Shl<&i8> for &'lhs Simd<i8, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'lhs, const N: usize> Shl<&isize> for &'lhs Simd<isize, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'lhs, const N: usize> Shl<&isize> for &'lhs Simd<isize, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'lhs, const N: usize> Shl<&u16> for &'lhs Simd<u16, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'lhs, const N: usize> Shl<&u16> for &'lhs Simd<u16, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'lhs, const N: usize> Shl<&u32> for &'lhs Simd<u32, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'lhs, const N: usize> Shl<&u32> for &'lhs Simd<u32, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'lhs, const N: usize> Shl<&u64> for &'lhs Simd<u64, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'lhs, const N: usize> Shl<&u64> for &'lhs Simd<u64, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'lhs, const N: usize> Shl<&u8> for &'lhs Simd<u8, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'lhs, const N: usize> Shl<&u8> for &'lhs Simd<u8, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'lhs, const N: usize> Shl<&usize> for &'lhs Simd<usize, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'lhs, const N: usize> Shl<&usize> for &'lhs Simd<usize, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'lhs, const N: usize> Shl<i16> for &'lhs Simd<i16, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'lhs, const N: usize> Shl<i16> for &'lhs Simd<i16, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'lhs, const N: usize> Shl<i32> for &'lhs Simd<i32, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'lhs, const N: usize> Shl<i32> for &'lhs Simd<i32, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'lhs, const N: usize> Shl<i64> for &'lhs Simd<i64, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'lhs, const N: usize> Shl<i64> for &'lhs Simd<i64, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'lhs, const N: usize> Shl<i8> for &'lhs Simd<i8, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'lhs, const N: usize> Shl<i8> for &'lhs Simd<i8, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'lhs, const N: usize> Shl<isize> for &'lhs Simd<isize, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'lhs, const N: usize> Shl<isize> for &'lhs Simd<isize, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'lhs, const N: usize> Shl<u16> for &'lhs Simd<u16, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'lhs, const N: usize> Shl<u16> for &'lhs Simd<u16, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'lhs, const N: usize> Shl<u32> for &'lhs Simd<u32, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'lhs, const N: usize> Shl<u32> for &'lhs Simd<u32, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'lhs, const N: usize> Shl<u64> for &'lhs Simd<u64, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'lhs, const N: usize> Shl<u64> for &'lhs Simd<u64, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'lhs, const N: usize> Shl<u8> for &'lhs Simd<u8, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'lhs, const N: usize> Shl<u8> for &'lhs Simd<u8, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<'lhs, const N: usize> Shl<usize> for &'lhs Simd<usize, N>where
LaneCount<N>: SupportedLaneCount,

### impl<'lhs, const N: usize> Shl<usize> for &'lhs Simd<usize, N>where
LaneCount<N>: SupportedLaneCount,

source§### impl<T, U, const N: usize> ShlAssign<U> for Simd<T, N>

### impl<T, U, const N: usize> ShlAssign<U> for Simd<T, N>

source§#### fn shl_assign(&mut self, rhs: U)

#### fn shl_assign(&mut self, rhs: U)

`<<=`

operation. Read more