1use crate::{
7 Bytes, Level, Select, SimdCvtFloat, SimdCvtTruncate, SimdElement, SimdFrom, SimdInto,
8 seal::Seal,
9};
10use crate::{
11 f32x4, f32x8, f32x16, f64x2, f64x4, f64x8, i8x16, i8x32, i8x64, i16x8, i16x16, i16x32, i32x4,
12 i32x8, i32x16, mask8x16, mask8x32, mask8x64, mask16x8, mask16x16, mask16x32, mask32x4,
13 mask32x8, mask32x16, mask64x2, mask64x4, mask64x8, u8x16, u8x32, u8x64, u16x8, u16x16, u16x32,
14 u32x4, u32x8, u32x16,
15};
16#[doc = r" The main SIMD trait, implemented by all SIMD token types."]
17#[doc = r""]
18#[doc = r#" Each implementor of this trait (e.g. `Avx2`, `Sse4_2`, `Neon`, `Fallback`) is a zero-sized "token" type"#]
19#[doc = r" representing a specific SIMD instruction set. These tokens are obtained at runtime via [`Level`] and the"]
20#[doc = r" [`dispatch!`](crate::dispatch) macro, which selects the best available backend for the current CPU."]
21#[doc = r""]
22#[doc = r" This trait defines all the low-level SIMD operations (e.g. [`add_f32x4`](Simd::add_f32x4),"]
23#[doc = r" [`mul_u32x4`](Simd::mul_u32x4)) that are implemented by each token type using platform-specific intrinsics."]
24#[doc = r" However, you typically won't call these methods directly. Instead, you'll probably be using the methods"]
25#[doc = r" defined on the vector types themselves."]
26#[doc = r""]
27#[doc = r" # Associated Types"]
28#[doc = r""]
29#[doc = r#" The trait defines associated types for the highest "native" vector width of each scalar type (e.g. `f32s`,"#]
30#[doc = r" `u32s`). These are always at least 128 bits, but may be larger. Currently, they are 128 bits everywhere but"]
31#[doc = r" AVX2, where they are 256 bits."]
32#[doc = r""]
33#[doc = r" # Example"]
34#[doc = r""]
35#[doc = r" ```"]
36#[doc = r" # use fearless_simd::{prelude::*, f32x4, dispatch, Level};"]
37#[doc = r""]
38#[doc = r" #[inline(always)]"]
39#[doc = r" fn add_vectors<S: Simd>(simd: S, a: f32x4<S>, b: f32x4<S>) -> f32x4<S> {"]
40#[doc = r" a + b // Uses operator overloading, which calls simd.add_f32x4 internally"]
41#[doc = r" }"]
42#[doc = r""]
43#[doc = r" let level = Level::new();"]
44#[doc = r" dispatch!(level, simd => {"]
45#[doc = r" let a = [1.0, 2.0, 3.0, 4.0].simd_into(simd);"]
46#[doc = r" let b = [5.0, 6.0, 7.0, 8.0].simd_into(simd);"]
47#[doc = r" let result = add_vectors(simd, a, b);"]
48#[doc = r" # assert_eq!(*result, [6.0, 8.0, 10.0, 12.0]);"]
49#[doc = r" });"]
50#[doc = r" ```"]
51pub trait Simd:
52 Sized + Clone + Copy + Send + Sync + Seal + arch_types::ArchTypes + 'static
53{
54 #[doc = r" A native-width SIMD vector of [`f32`]s."]
55 type f32s: SimdFloat<
56 Self,
57 Element = f32,
58 Block = f32x4<Self>,
59 Mask = Self::mask32s,
60 Bytes = <Self::u32s as Bytes>::Bytes,
61 > + SimdCvtFloat<Self::u32s>
62 + SimdCvtFloat<Self::i32s>;
63 #[doc = r" A native-width SIMD vector of [`f64`]s."]
64 type f64s: SimdFloat<Self, Element = f64, Block = f64x2<Self>, Mask = Self::mask64s>;
65 #[doc = r" A native-width SIMD vector of [`u8`]s."]
66 type u8s: SimdInt<Self, Element = u8, Block = u8x16<Self>, Mask = Self::mask8s>;
67 #[doc = r" A native-width SIMD vector of [`i8`]s."]
68 type i8s: SimdInt<
69 Self,
70 Element = i8,
71 Block = i8x16<Self>,
72 Mask = Self::mask8s,
73 Bytes = <Self::u8s as Bytes>::Bytes,
74 > + core::ops::Neg<Output = Self::i8s>;
75 #[doc = r" A native-width SIMD vector of [`u16`]s."]
76 type u16s: SimdInt<Self, Element = u16, Block = u16x8<Self>, Mask = Self::mask16s>;
77 #[doc = r" A native-width SIMD vector of [`i16`]s."]
78 type i16s: SimdInt<
79 Self,
80 Element = i16,
81 Block = i16x8<Self>,
82 Mask = Self::mask16s,
83 Bytes = <Self::u16s as Bytes>::Bytes,
84 > + core::ops::Neg<Output = Self::i16s>;
85 #[doc = r" A native-width SIMD vector of [`u32`]s."]
86 type u32s: SimdInt<Self, Element = u32, Block = u32x4<Self>, Mask = Self::mask32s>
87 + SimdCvtTruncate<Self::f32s>;
88 #[doc = r" A native-width SIMD vector of [`i32`]s."]
89 type i32s: SimdInt<
90 Self,
91 Element = i32,
92 Block = i32x4<Self>,
93 Mask = Self::mask32s,
94 Bytes = <Self::u32s as Bytes>::Bytes,
95 > + SimdCvtTruncate<Self::f32s>
96 + core::ops::Neg<Output = Self::i32s>;
97 #[doc = r" A native-width SIMD mask with 8-bit lanes."]
98 type mask8s: SimdMask<Self, Element = i8, Block = mask8x16<Self>, Bytes = <Self::u8s as Bytes>::Bytes>
99 + Select<Self::u8s>
100 + Select<Self::i8s>
101 + Select<Self::mask8s>;
102 #[doc = r" A native-width SIMD mask with 16-bit lanes."]
103 type mask16s: SimdMask<Self, Element = i16, Block = mask16x8<Self>, Bytes = <Self::u16s as Bytes>::Bytes>
104 + Select<Self::u16s>
105 + Select<Self::i16s>
106 + Select<Self::mask16s>;
107 #[doc = r" A native-width SIMD mask with 32-bit lanes."]
108 type mask32s: SimdMask<Self, Element = i32, Block = mask32x4<Self>, Bytes = <Self::u32s as Bytes>::Bytes>
109 + Select<Self::f32s>
110 + Select<Self::u32s>
111 + Select<Self::i32s>
112 + Select<Self::mask32s>;
113 #[doc = r" A native-width SIMD mask with 64-bit lanes."]
114 type mask64s: SimdMask<Self, Element = i64, Block = mask64x2<Self>>
115 + Select<Self::f64s>
116 + Select<Self::mask64s>;
117 #[doc = r" This SIMD token's feature level."]
118 fn level(self) -> Level;
119 #[doc = r" Call function with CPU features enabled."]
120 #[doc = r""]
121 #[doc = r" For performance, the provided function should be `#[inline(always)]`."]
122 fn vectorize<F: FnOnce() -> R, R>(self, f: F) -> R;
123 #[doc = "Create a SIMD vector with all elements set to the given value."]
124 fn splat_f32x4(self, val: f32) -> f32x4<Self>;
125 #[doc = "Create a SIMD vector from an array of the same length."]
126 fn load_array_f32x4(self, val: [f32; 4usize]) -> f32x4<Self>;
127 #[doc = "Create a SIMD vector from an array of the same length."]
128 fn load_array_ref_f32x4(self, val: &[f32; 4usize]) -> f32x4<Self>;
129 #[doc = "Convert a SIMD vector to an array."]
130 fn as_array_f32x4(self, a: f32x4<Self>) -> [f32; 4usize];
131 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
132 fn as_array_ref_f32x4(self, a: &f32x4<Self>) -> &[f32; 4usize];
133 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
134 fn as_array_mut_f32x4(self, a: &mut f32x4<Self>) -> &mut [f32; 4usize];
135 #[doc = "Store a SIMD vector into an array of the same length."]
136 fn store_array_f32x4(self, a: f32x4<Self>, dest: &mut [f32; 4usize]) -> ();
137 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
138 fn cvt_from_bytes_f32x4(self, a: u8x16<Self>) -> f32x4<Self>;
139 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
140 fn cvt_to_bytes_f32x4(self, a: f32x4<Self>) -> u8x16<Self>;
141 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
142 fn slide_f32x4<const SHIFT: usize>(self, a: f32x4<Self>, b: f32x4<Self>) -> f32x4<Self>;
143 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
144 fn slide_within_blocks_f32x4<const SHIFT: usize>(
145 self,
146 a: f32x4<Self>,
147 b: f32x4<Self>,
148 ) -> f32x4<Self>;
149 #[doc = "Compute the absolute value of each element."]
150 fn abs_f32x4(self, a: f32x4<Self>) -> f32x4<Self>;
151 #[doc = "Negate each element of the vector."]
152 fn neg_f32x4(self, a: f32x4<Self>) -> f32x4<Self>;
153 #[doc = "Compute the square root of each element.\n\nNegative elements other than `-0.0` will become NaN."]
154 fn sqrt_f32x4(self, a: f32x4<Self>) -> f32x4<Self>;
155 #[doc = "Add two vectors element-wise."]
156 fn add_f32x4(self, a: f32x4<Self>, b: f32x4<Self>) -> f32x4<Self>;
157 #[doc = "Subtract two vectors element-wise."]
158 fn sub_f32x4(self, a: f32x4<Self>, b: f32x4<Self>) -> f32x4<Self>;
159 #[doc = "Multiply two vectors element-wise."]
160 fn mul_f32x4(self, a: f32x4<Self>, b: f32x4<Self>) -> f32x4<Self>;
161 #[doc = "Divide two vectors element-wise."]
162 fn div_f32x4(self, a: f32x4<Self>, b: f32x4<Self>) -> f32x4<Self>;
163 #[doc = "Return a vector with the magnitude of `a` and the sign of `b` for each element.\n\nThis operation copies the sign bit, so if an input element is NaN, the output element will be a NaN with the same payload and a copied sign bit."]
164 fn copysign_f32x4(self, a: f32x4<Self>, b: f32x4<Self>) -> f32x4<Self>;
165 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
166 fn simd_eq_f32x4(self, a: f32x4<Self>, b: f32x4<Self>) -> mask32x4<Self>;
167 #[doc = "Compare two vectors element-wise for less than.\n\nReturns a mask where each element is all ones if `a` is less than `b`, and all zeroes if not."]
168 fn simd_lt_f32x4(self, a: f32x4<Self>, b: f32x4<Self>) -> mask32x4<Self>;
169 #[doc = "Compare two vectors element-wise for less than or equal.\n\nReturns a mask where each element is all ones if `a` is less than or equal to `b`, and all zeroes if not."]
170 fn simd_le_f32x4(self, a: f32x4<Self>, b: f32x4<Self>) -> mask32x4<Self>;
171 #[doc = "Compare two vectors element-wise for greater than or equal.\n\nReturns a mask where each element is all ones if `a` is greater than or equal to `b`, and all zeroes if not."]
172 fn simd_ge_f32x4(self, a: f32x4<Self>, b: f32x4<Self>) -> mask32x4<Self>;
173 #[doc = "Compare two vectors element-wise for greater than.\n\nReturns a mask where each element is all ones if `a` is greater than `b`, and all zeroes if not."]
174 fn simd_gt_f32x4(self, a: f32x4<Self>, b: f32x4<Self>) -> mask32x4<Self>;
175 #[doc = "Interleave the lower half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, b0, a1, b1]`.\n\n**Note:** This operation is only useful if you need to discard elements `a2, a3, b2, b3`.\n For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
176 fn zip_low_f32x4(self, a: f32x4<Self>, b: f32x4<Self>) -> f32x4<Self>;
177 #[doc = "Interleave the upper half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a2, b2, a3, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a1, b0, b1`.For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
178 fn zip_high_f32x4(self, a: f32x4<Self>, b: f32x4<Self>) -> f32x4<Self>;
179 #[doc = "Extract even-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, a2, b0, b2]`.\n\n**Note:** This operation is only useful if you need to discard elements `a1, a3, b1, b3`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
180 fn unzip_low_f32x4(self, a: f32x4<Self>, b: f32x4<Self>) -> f32x4<Self>;
181 #[doc = "Extract odd-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a1, a3, b1, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a2, b0, b2`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
182 fn unzip_high_f32x4(self, a: f32x4<Self>, b: f32x4<Self>) -> f32x4<Self>;
183 #[doc = "Interleave two vectors.\n\nThe resulting vectors contain elements taken alternately from `a` and `b`, first filling the first result, and then the second.\n\nThe reverse of this operation is `deinterleave`.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `([a0, b0, a1, b1], [a2, b2, a3, b3])`."]
184 fn interleave_f32x4(self, a: f32x4<Self>, b: f32x4<Self>) -> (f32x4<Self>, f32x4<Self>);
185 #[doc = "Deinterleave two vectors.\n\nThe first result contains all even-indexed elements from `a` followed by all even-indexed elements from `b`. The second result contains all odd-indexed elements from `a` followed by all odd-indexed elements from `b`.\n\nThe reverse of this operation is `interleave`.\n\nFor vectors `[a0, b0, a1, b1]` and `[a2, b2, a3, b3]`, returns `([a0, a1, a2, a3], [b0, b1, b2, b3])`."]
186 fn deinterleave_f32x4(self, a: f32x4<Self>, b: f32x4<Self>) -> (f32x4<Self>, f32x4<Self>);
187 #[doc = "Return the element-wise maximum of two vectors.\n\nIf either operand is NaN, the result for that lane is implementation-defined-- it could be either the first or second operand. See `max_precise` for a version that returns the non-NaN operand if only one is NaN.\n\nIf one operand is positive zero and the other is negative zero, the result is also implementation-defined, and it could be either one."]
188 fn max_f32x4(self, a: f32x4<Self>, b: f32x4<Self>) -> f32x4<Self>;
189 #[doc = "Return the element-wise minimum of two vectors.\n\nIf either operand is NaN, the result for that lane is implementation-defined-- it could be either the first or second operand. See `min_precise` for a version that returns the non-NaN operand if only one is NaN.\n\nIf one operand is positive zero and the other is negative zero, the result is also implementation-defined, and it could be either one."]
190 fn min_f32x4(self, a: f32x4<Self>, b: f32x4<Self>) -> f32x4<Self>;
191 #[doc = "Return the element-wise maximum of two vectors.\n\nIf one operand is a quiet NaN and the other is not, this operation will choose the non-NaN operand.\n\nIf one operand is positive zero and the other is negative zero, the result is implementation-defined, and it could be either one.\n\nIf an operand is a *signaling* NaN, the result is not just implementation-defined, but fully non-deterministic: it may be either NaN or the non-NaN operand.\nSignaling NaN values are not produced by floating-point math operations, only from manual initialization with specific bit patterns. You probably don't need to worry about them."]
192 fn max_precise_f32x4(self, a: f32x4<Self>, b: f32x4<Self>) -> f32x4<Self>;
193 #[doc = "Return the element-wise minimum of two vectors.\n\nIf one operand is a quiet NaN and the other is not, this operation will choose the non-NaN operand.\n\nIf one operand is positive zero and the other is negative zero, the result is implementation-defined, and it could be either one.\n\nIf an operand is a *signaling* NaN, the result is not just implementation-defined, but fully non-deterministic: it may be either NaN or the non-NaN operand.\nSignaling NaN values are not produced by floating-point math operations, only from manual initialization with specific bit patterns. You probably don't need to worry about them."]
194 fn min_precise_f32x4(self, a: f32x4<Self>, b: f32x4<Self>) -> f32x4<Self>;
195 #[doc = "Compute `(a * b) + c` (fused multiply-add) for each element.\n\nDepending on hardware support, the result may be computed with only one rounding error, or may be implemented as a regular multiply followed by an add, which will result in two rounding errors."]
196 fn mul_add_f32x4(self, a: f32x4<Self>, b: f32x4<Self>, c: f32x4<Self>) -> f32x4<Self>;
197 #[doc = "Compute `(a * b) - c` (fused multiply-subtract) for each element.\n\nDepending on hardware support, the result may be computed with only one rounding error, or may be implemented as a regular multiply followed by a subtract, which will result in two rounding errors."]
198 fn mul_sub_f32x4(self, a: f32x4<Self>, b: f32x4<Self>, c: f32x4<Self>) -> f32x4<Self>;
199 #[doc = "Return the largest integer less than or equal to each element, that is, round towards negative infinity."]
200 fn floor_f32x4(self, a: f32x4<Self>) -> f32x4<Self>;
201 #[doc = "Return the smallest integer greater than or equal to each element, that is, round towards positive infinity."]
202 fn ceil_f32x4(self, a: f32x4<Self>) -> f32x4<Self>;
203 #[doc = "Round each element to the nearest integer, with ties rounding to the nearest even integer.\n\nThere is no corresponding `round` operation. Rust's `round` operation rounds ties away from zero, a behavior it inherited from C. That behavior is not implemented across all platforms, whereas round-ties-even is."]
204 fn round_ties_even_f32x4(self, a: f32x4<Self>) -> f32x4<Self>;
205 #[doc = "Return the fractional part of each element.\n\nThis is equivalent to `a - a.trunc()`."]
206 fn fract_f32x4(self, a: f32x4<Self>) -> f32x4<Self>;
207 #[doc = "Return the integer part of each element, rounding towards zero."]
208 fn trunc_f32x4(self, a: f32x4<Self>) -> f32x4<Self>;
209 #[doc = "Select elements from b and c based on the mask operand a.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
210 fn select_f32x4(self, a: mask32x4<Self>, b: f32x4<Self>, c: f32x4<Self>) -> f32x4<Self>;
211 #[doc = "Combine two vectors into a single vector with twice the width.\n\n`a` provides the lower elements and `b` provides the upper elements."]
212 fn combine_f32x4(self, a: f32x4<Self>, b: f32x4<Self>) -> f32x8<Self>;
213 #[doc = "Reinterpret the bits of this vector as a vector of `f64` elements.\n\nThe number of elements in the result is half that of the input."]
214 fn reinterpret_f64_f32x4(self, a: f32x4<Self>) -> f64x2<Self>;
215 #[doc = "Reinterpret the bits of this vector as a vector of `i32` elements.\n\nThis is a bitwise reinterpretation only, and does not perform any conversions."]
216 fn reinterpret_i32_f32x4(self, a: f32x4<Self>) -> i32x4<Self>;
217 #[doc = "Reinterpret the bits of this vector as a vector of `u8` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
218 fn reinterpret_u8_f32x4(self, a: f32x4<Self>) -> u8x16<Self>;
219 #[doc = "Reinterpret the bits of this vector as a vector of `u32` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
220 fn reinterpret_u32_f32x4(self, a: f32x4<Self>) -> u32x4<Self>;
221 #[doc = "Convert each floating-point element to an unsigned 32-bit integer, truncating towards zero.\n\nOut-of-range values or NaN will produce implementation-defined results.\n\nOn x86 platforms, this operation will still be slower than converting to `i32`, because there is no native instruction for converting to `u32` (at least until AVX-512, which is currently not supported).\nIf you know your values fit within range of an `i32`, you should convert to an `i32` and cast to your desired datatype afterwards."]
222 fn cvt_u32_f32x4(self, a: f32x4<Self>) -> u32x4<Self>;
223 #[doc = "Convert each floating-point element to an unsigned 32-bit integer, truncating towards zero.\n\nOut-of-range values are saturated to the closest in-range value. NaN becomes 0."]
224 fn cvt_u32_precise_f32x4(self, a: f32x4<Self>) -> u32x4<Self>;
225 #[doc = "Convert each floating-point element to a signed 32-bit integer, truncating towards zero.\n\nOut-of-range values or NaN will produce implementation-defined results."]
226 fn cvt_i32_f32x4(self, a: f32x4<Self>) -> i32x4<Self>;
227 #[doc = "Convert each floating-point element to a signed 32-bit integer, truncating towards zero.\n\nOut-of-range values are saturated to the closest in-range value. NaN becomes 0."]
228 fn cvt_i32_precise_f32x4(self, a: f32x4<Self>) -> i32x4<Self>;
229 #[doc = "Create a SIMD vector with all elements set to the given value."]
230 fn splat_i8x16(self, val: i8) -> i8x16<Self>;
231 #[doc = "Create a SIMD vector from an array of the same length."]
232 fn load_array_i8x16(self, val: [i8; 16usize]) -> i8x16<Self>;
233 #[doc = "Create a SIMD vector from an array of the same length."]
234 fn load_array_ref_i8x16(self, val: &[i8; 16usize]) -> i8x16<Self>;
235 #[doc = "Convert a SIMD vector to an array."]
236 fn as_array_i8x16(self, a: i8x16<Self>) -> [i8; 16usize];
237 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
238 fn as_array_ref_i8x16(self, a: &i8x16<Self>) -> &[i8; 16usize];
239 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
240 fn as_array_mut_i8x16(self, a: &mut i8x16<Self>) -> &mut [i8; 16usize];
241 #[doc = "Store a SIMD vector into an array of the same length."]
242 fn store_array_i8x16(self, a: i8x16<Self>, dest: &mut [i8; 16usize]) -> ();
243 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
244 fn cvt_from_bytes_i8x16(self, a: u8x16<Self>) -> i8x16<Self>;
245 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
246 fn cvt_to_bytes_i8x16(self, a: i8x16<Self>) -> u8x16<Self>;
247 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
248 fn slide_i8x16<const SHIFT: usize>(self, a: i8x16<Self>, b: i8x16<Self>) -> i8x16<Self>;
249 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
250 fn slide_within_blocks_i8x16<const SHIFT: usize>(
251 self,
252 a: i8x16<Self>,
253 b: i8x16<Self>,
254 ) -> i8x16<Self>;
255 #[doc = "Add two vectors element-wise, wrapping on overflow."]
256 fn add_i8x16(self, a: i8x16<Self>, b: i8x16<Self>) -> i8x16<Self>;
257 #[doc = "Subtract two vectors element-wise, wrapping on overflow."]
258 fn sub_i8x16(self, a: i8x16<Self>, b: i8x16<Self>) -> i8x16<Self>;
259 #[doc = "Multiply two vectors element-wise, wrapping on overflow."]
260 fn mul_i8x16(self, a: i8x16<Self>, b: i8x16<Self>) -> i8x16<Self>;
261 #[doc = "Compute the bitwise AND of two vectors."]
262 fn and_i8x16(self, a: i8x16<Self>, b: i8x16<Self>) -> i8x16<Self>;
263 #[doc = "Compute the bitwise OR of two vectors."]
264 fn or_i8x16(self, a: i8x16<Self>, b: i8x16<Self>) -> i8x16<Self>;
265 #[doc = "Compute the bitwise XOR of two vectors."]
266 fn xor_i8x16(self, a: i8x16<Self>, b: i8x16<Self>) -> i8x16<Self>;
267 #[doc = "Compute the bitwise NOT of the vector."]
268 fn not_i8x16(self, a: i8x16<Self>) -> i8x16<Self>;
269 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right."]
270 fn shl_i8x16(self, a: i8x16<Self>, shift: u32) -> i8x16<Self>;
271 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
272 fn shlv_i8x16(self, a: i8x16<Self>, b: i8x16<Self>) -> i8x16<Self>;
273 #[doc = "Shift each element right by the given number of bits.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated."]
274 fn shr_i8x16(self, a: i8x16<Self>, shift: u32) -> i8x16<Self>;
275 #[doc = "Shift each element right by the corresponding element in another vector.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
276 fn shrv_i8x16(self, a: i8x16<Self>, b: i8x16<Self>) -> i8x16<Self>;
277 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
278 fn simd_eq_i8x16(self, a: i8x16<Self>, b: i8x16<Self>) -> mask8x16<Self>;
279 #[doc = "Compare two vectors element-wise for less than.\n\nReturns a mask where each element is all ones if `a` is less than `b`, and all zeroes if not."]
280 fn simd_lt_i8x16(self, a: i8x16<Self>, b: i8x16<Self>) -> mask8x16<Self>;
281 #[doc = "Compare two vectors element-wise for less than or equal.\n\nReturns a mask where each element is all ones if `a` is less than or equal to `b`, and all zeroes if not."]
282 fn simd_le_i8x16(self, a: i8x16<Self>, b: i8x16<Self>) -> mask8x16<Self>;
283 #[doc = "Compare two vectors element-wise for greater than or equal.\n\nReturns a mask where each element is all ones if `a` is greater than or equal to `b`, and all zeroes if not."]
284 fn simd_ge_i8x16(self, a: i8x16<Self>, b: i8x16<Self>) -> mask8x16<Self>;
285 #[doc = "Compare two vectors element-wise for greater than.\n\nReturns a mask where each element is all ones if `a` is greater than `b`, and all zeroes if not."]
286 fn simd_gt_i8x16(self, a: i8x16<Self>, b: i8x16<Self>) -> mask8x16<Self>;
287 #[doc = "Interleave the lower half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, b0, a1, b1]`.\n\n**Note:** This operation is only useful if you need to discard elements `a2, a3, b2, b3`.\n For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
288 fn zip_low_i8x16(self, a: i8x16<Self>, b: i8x16<Self>) -> i8x16<Self>;
289 #[doc = "Interleave the upper half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a2, b2, a3, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a1, b0, b1`.For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
290 fn zip_high_i8x16(self, a: i8x16<Self>, b: i8x16<Self>) -> i8x16<Self>;
291 #[doc = "Extract even-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, a2, b0, b2]`.\n\n**Note:** This operation is only useful if you need to discard elements `a1, a3, b1, b3`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
292 fn unzip_low_i8x16(self, a: i8x16<Self>, b: i8x16<Self>) -> i8x16<Self>;
293 #[doc = "Extract odd-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a1, a3, b1, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a2, b0, b2`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
294 fn unzip_high_i8x16(self, a: i8x16<Self>, b: i8x16<Self>) -> i8x16<Self>;
295 #[doc = "Interleave two vectors.\n\nThe resulting vectors contain elements taken alternately from `a` and `b`, first filling the first result, and then the second.\n\nThe reverse of this operation is `deinterleave`.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `([a0, b0, a1, b1], [a2, b2, a3, b3])`."]
296 fn interleave_i8x16(self, a: i8x16<Self>, b: i8x16<Self>) -> (i8x16<Self>, i8x16<Self>);
297 #[doc = "Deinterleave two vectors.\n\nThe first result contains all even-indexed elements from `a` followed by all even-indexed elements from `b`. The second result contains all odd-indexed elements from `a` followed by all odd-indexed elements from `b`.\n\nThe reverse of this operation is `interleave`.\n\nFor vectors `[a0, b0, a1, b1]` and `[a2, b2, a3, b3]`, returns `([a0, a1, a2, a3], [b0, b1, b2, b3])`."]
298 fn deinterleave_i8x16(self, a: i8x16<Self>, b: i8x16<Self>) -> (i8x16<Self>, i8x16<Self>);
299 #[doc = "Select elements from b and c based on the mask operand a.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
300 fn select_i8x16(self, a: mask8x16<Self>, b: i8x16<Self>, c: i8x16<Self>) -> i8x16<Self>;
301 #[doc = "Return the element-wise minimum of two vectors."]
302 fn min_i8x16(self, a: i8x16<Self>, b: i8x16<Self>) -> i8x16<Self>;
303 #[doc = "Return the element-wise maximum of two vectors."]
304 fn max_i8x16(self, a: i8x16<Self>, b: i8x16<Self>) -> i8x16<Self>;
305 #[doc = "Combine two vectors into a single vector with twice the width.\n\n`a` provides the lower elements and `b` provides the upper elements."]
306 fn combine_i8x16(self, a: i8x16<Self>, b: i8x16<Self>) -> i8x32<Self>;
307 #[doc = "Negate each element of the vector, wrapping on overflow."]
308 fn neg_i8x16(self, a: i8x16<Self>) -> i8x16<Self>;
309 #[doc = "Reinterpret the bits of this vector as a vector of `u8` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
310 fn reinterpret_u8_i8x16(self, a: i8x16<Self>) -> u8x16<Self>;
311 #[doc = "Reinterpret the bits of this vector as a vector of `u32` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
312 fn reinterpret_u32_i8x16(self, a: i8x16<Self>) -> u32x4<Self>;
313 #[doc = "Create a SIMD vector with all elements set to the given value."]
314 fn splat_u8x16(self, val: u8) -> u8x16<Self>;
315 #[doc = "Create a SIMD vector from an array of the same length."]
316 fn load_array_u8x16(self, val: [u8; 16usize]) -> u8x16<Self>;
317 #[doc = "Create a SIMD vector from an array of the same length."]
318 fn load_array_ref_u8x16(self, val: &[u8; 16usize]) -> u8x16<Self>;
319 #[doc = "Convert a SIMD vector to an array."]
320 fn as_array_u8x16(self, a: u8x16<Self>) -> [u8; 16usize];
321 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
322 fn as_array_ref_u8x16(self, a: &u8x16<Self>) -> &[u8; 16usize];
323 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
324 fn as_array_mut_u8x16(self, a: &mut u8x16<Self>) -> &mut [u8; 16usize];
325 #[doc = "Store a SIMD vector into an array of the same length."]
326 fn store_array_u8x16(self, a: u8x16<Self>, dest: &mut [u8; 16usize]) -> ();
327 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
328 fn cvt_from_bytes_u8x16(self, a: u8x16<Self>) -> u8x16<Self>;
329 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
330 fn cvt_to_bytes_u8x16(self, a: u8x16<Self>) -> u8x16<Self>;
331 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
332 fn slide_u8x16<const SHIFT: usize>(self, a: u8x16<Self>, b: u8x16<Self>) -> u8x16<Self>;
333 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
334 fn slide_within_blocks_u8x16<const SHIFT: usize>(
335 self,
336 a: u8x16<Self>,
337 b: u8x16<Self>,
338 ) -> u8x16<Self>;
339 #[doc = "Add two vectors element-wise, wrapping on overflow."]
340 fn add_u8x16(self, a: u8x16<Self>, b: u8x16<Self>) -> u8x16<Self>;
341 #[doc = "Subtract two vectors element-wise, wrapping on overflow."]
342 fn sub_u8x16(self, a: u8x16<Self>, b: u8x16<Self>) -> u8x16<Self>;
343 #[doc = "Multiply two vectors element-wise, wrapping on overflow."]
344 fn mul_u8x16(self, a: u8x16<Self>, b: u8x16<Self>) -> u8x16<Self>;
345 #[doc = "Compute the bitwise AND of two vectors."]
346 fn and_u8x16(self, a: u8x16<Self>, b: u8x16<Self>) -> u8x16<Self>;
347 #[doc = "Compute the bitwise OR of two vectors."]
348 fn or_u8x16(self, a: u8x16<Self>, b: u8x16<Self>) -> u8x16<Self>;
349 #[doc = "Compute the bitwise XOR of two vectors."]
350 fn xor_u8x16(self, a: u8x16<Self>, b: u8x16<Self>) -> u8x16<Self>;
351 #[doc = "Compute the bitwise NOT of the vector."]
352 fn not_u8x16(self, a: u8x16<Self>) -> u8x16<Self>;
353 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right."]
354 fn shl_u8x16(self, a: u8x16<Self>, shift: u32) -> u8x16<Self>;
355 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
356 fn shlv_u8x16(self, a: u8x16<Self>, b: u8x16<Self>) -> u8x16<Self>;
357 #[doc = "Shift each element right by the given number of bits.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated."]
358 fn shr_u8x16(self, a: u8x16<Self>, shift: u32) -> u8x16<Self>;
359 #[doc = "Shift each element right by the corresponding element in another vector.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
360 fn shrv_u8x16(self, a: u8x16<Self>, b: u8x16<Self>) -> u8x16<Self>;
361 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
362 fn simd_eq_u8x16(self, a: u8x16<Self>, b: u8x16<Self>) -> mask8x16<Self>;
363 #[doc = "Compare two vectors element-wise for less than.\n\nReturns a mask where each element is all ones if `a` is less than `b`, and all zeroes if not."]
364 fn simd_lt_u8x16(self, a: u8x16<Self>, b: u8x16<Self>) -> mask8x16<Self>;
365 #[doc = "Compare two vectors element-wise for less than or equal.\n\nReturns a mask where each element is all ones if `a` is less than or equal to `b`, and all zeroes if not."]
366 fn simd_le_u8x16(self, a: u8x16<Self>, b: u8x16<Self>) -> mask8x16<Self>;
367 #[doc = "Compare two vectors element-wise for greater than or equal.\n\nReturns a mask where each element is all ones if `a` is greater than or equal to `b`, and all zeroes if not."]
368 fn simd_ge_u8x16(self, a: u8x16<Self>, b: u8x16<Self>) -> mask8x16<Self>;
369 #[doc = "Compare two vectors element-wise for greater than.\n\nReturns a mask where each element is all ones if `a` is greater than `b`, and all zeroes if not."]
370 fn simd_gt_u8x16(self, a: u8x16<Self>, b: u8x16<Self>) -> mask8x16<Self>;
371 #[doc = "Interleave the lower half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, b0, a1, b1]`.\n\n**Note:** This operation is only useful if you need to discard elements `a2, a3, b2, b3`.\n For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
372 fn zip_low_u8x16(self, a: u8x16<Self>, b: u8x16<Self>) -> u8x16<Self>;
373 #[doc = "Interleave the upper half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a2, b2, a3, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a1, b0, b1`.For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
374 fn zip_high_u8x16(self, a: u8x16<Self>, b: u8x16<Self>) -> u8x16<Self>;
375 #[doc = "Extract even-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, a2, b0, b2]`.\n\n**Note:** This operation is only useful if you need to discard elements `a1, a3, b1, b3`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
376 fn unzip_low_u8x16(self, a: u8x16<Self>, b: u8x16<Self>) -> u8x16<Self>;
377 #[doc = "Extract odd-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a1, a3, b1, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a2, b0, b2`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
378 fn unzip_high_u8x16(self, a: u8x16<Self>, b: u8x16<Self>) -> u8x16<Self>;
379 #[doc = "Interleave two vectors.\n\nThe resulting vectors contain elements taken alternately from `a` and `b`, first filling the first result, and then the second.\n\nThe reverse of this operation is `deinterleave`.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `([a0, b0, a1, b1], [a2, b2, a3, b3])`."]
380 fn interleave_u8x16(self, a: u8x16<Self>, b: u8x16<Self>) -> (u8x16<Self>, u8x16<Self>);
381 #[doc = "Deinterleave two vectors.\n\nThe first result contains all even-indexed elements from `a` followed by all even-indexed elements from `b`. The second result contains all odd-indexed elements from `a` followed by all odd-indexed elements from `b`.\n\nThe reverse of this operation is `interleave`.\n\nFor vectors `[a0, b0, a1, b1]` and `[a2, b2, a3, b3]`, returns `([a0, a1, a2, a3], [b0, b1, b2, b3])`."]
382 fn deinterleave_u8x16(self, a: u8x16<Self>, b: u8x16<Self>) -> (u8x16<Self>, u8x16<Self>);
383 #[doc = "Select elements from b and c based on the mask operand a.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
384 fn select_u8x16(self, a: mask8x16<Self>, b: u8x16<Self>, c: u8x16<Self>) -> u8x16<Self>;
385 #[doc = "Return the element-wise minimum of two vectors."]
386 fn min_u8x16(self, a: u8x16<Self>, b: u8x16<Self>) -> u8x16<Self>;
387 #[doc = "Return the element-wise maximum of two vectors."]
388 fn max_u8x16(self, a: u8x16<Self>, b: u8x16<Self>) -> u8x16<Self>;
389 #[doc = "Combine two vectors into a single vector with twice the width.\n\n`a` provides the lower elements and `b` provides the upper elements."]
390 fn combine_u8x16(self, a: u8x16<Self>, b: u8x16<Self>) -> u8x32<Self>;
391 #[doc = "Zero-extend each element to a wider integer type.\n\nThe number of elements in the result is half that of the input."]
392 fn widen_u8x16(self, a: u8x16<Self>) -> u16x16<Self>;
393 #[doc = "Reinterpret the bits of this vector as a vector of `u32` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
394 fn reinterpret_u32_u8x16(self, a: u8x16<Self>) -> u32x4<Self>;
395 #[doc = "Create a SIMD vector with all elements set to the given value."]
396 fn splat_mask8x16(self, val: i8) -> mask8x16<Self>;
397 #[doc = "Create a SIMD vector from an array of the same length."]
398 fn load_array_mask8x16(self, val: [i8; 16usize]) -> mask8x16<Self>;
399 #[doc = "Create a SIMD vector from an array of the same length."]
400 fn load_array_ref_mask8x16(self, val: &[i8; 16usize]) -> mask8x16<Self>;
401 #[doc = "Convert a SIMD vector to an array."]
402 fn as_array_mask8x16(self, a: mask8x16<Self>) -> [i8; 16usize];
403 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
404 fn as_array_ref_mask8x16(self, a: &mask8x16<Self>) -> &[i8; 16usize];
405 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
406 fn as_array_mut_mask8x16(self, a: &mut mask8x16<Self>) -> &mut [i8; 16usize];
407 #[doc = "Store a SIMD vector into an array of the same length."]
408 fn store_array_mask8x16(self, a: mask8x16<Self>, dest: &mut [i8; 16usize]) -> ();
409 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
410 fn cvt_from_bytes_mask8x16(self, a: u8x16<Self>) -> mask8x16<Self>;
411 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
412 fn cvt_to_bytes_mask8x16(self, a: mask8x16<Self>) -> u8x16<Self>;
413 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
414 fn slide_mask8x16<const SHIFT: usize>(
415 self,
416 a: mask8x16<Self>,
417 b: mask8x16<Self>,
418 ) -> mask8x16<Self>;
419 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
420 fn slide_within_blocks_mask8x16<const SHIFT: usize>(
421 self,
422 a: mask8x16<Self>,
423 b: mask8x16<Self>,
424 ) -> mask8x16<Self>;
425 #[doc = "Compute the logical AND of two masks."]
426 fn and_mask8x16(self, a: mask8x16<Self>, b: mask8x16<Self>) -> mask8x16<Self>;
427 #[doc = "Compute the logical OR of two masks."]
428 fn or_mask8x16(self, a: mask8x16<Self>, b: mask8x16<Self>) -> mask8x16<Self>;
429 #[doc = "Compute the logical XOR of two masks."]
430 fn xor_mask8x16(self, a: mask8x16<Self>, b: mask8x16<Self>) -> mask8x16<Self>;
431 #[doc = "Compute the logical NOT of the mask."]
432 fn not_mask8x16(self, a: mask8x16<Self>) -> mask8x16<Self>;
433 #[doc = "Select elements from `b` and `c` based on the mask operand `a`.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
434 fn select_mask8x16(
435 self,
436 a: mask8x16<Self>,
437 b: mask8x16<Self>,
438 c: mask8x16<Self>,
439 ) -> mask8x16<Self>;
440 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
441 fn simd_eq_mask8x16(self, a: mask8x16<Self>, b: mask8x16<Self>) -> mask8x16<Self>;
442 #[doc = "Returns true if any elements in this mask are true (all ones).\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
443 fn any_true_mask8x16(self, a: mask8x16<Self>) -> bool;
444 #[doc = "Returns true if all elements in this mask are true (all ones).\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
445 fn all_true_mask8x16(self, a: mask8x16<Self>) -> bool;
446 #[doc = "Returns true if any elements in this mask are false (all zeroes).\n\nThis is logically equivalent to `!all_true`, but may be faster.\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
447 fn any_false_mask8x16(self, a: mask8x16<Self>) -> bool;
448 #[doc = "Returns true if all elements in this mask are false (all zeroes).\n\nThis is logically equivalent to `!any_true`, but may be faster.\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
449 fn all_false_mask8x16(self, a: mask8x16<Self>) -> bool;
450 #[doc = "Combine two vectors into a single vector with twice the width.\n\n`a` provides the lower elements and `b` provides the upper elements."]
451 fn combine_mask8x16(self, a: mask8x16<Self>, b: mask8x16<Self>) -> mask8x32<Self>;
452 #[doc = "Create a SIMD vector with all elements set to the given value."]
453 fn splat_i16x8(self, val: i16) -> i16x8<Self>;
454 #[doc = "Create a SIMD vector from an array of the same length."]
455 fn load_array_i16x8(self, val: [i16; 8usize]) -> i16x8<Self>;
456 #[doc = "Create a SIMD vector from an array of the same length."]
457 fn load_array_ref_i16x8(self, val: &[i16; 8usize]) -> i16x8<Self>;
458 #[doc = "Convert a SIMD vector to an array."]
459 fn as_array_i16x8(self, a: i16x8<Self>) -> [i16; 8usize];
460 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
461 fn as_array_ref_i16x8(self, a: &i16x8<Self>) -> &[i16; 8usize];
462 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
463 fn as_array_mut_i16x8(self, a: &mut i16x8<Self>) -> &mut [i16; 8usize];
464 #[doc = "Store a SIMD vector into an array of the same length."]
465 fn store_array_i16x8(self, a: i16x8<Self>, dest: &mut [i16; 8usize]) -> ();
466 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
467 fn cvt_from_bytes_i16x8(self, a: u8x16<Self>) -> i16x8<Self>;
468 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
469 fn cvt_to_bytes_i16x8(self, a: i16x8<Self>) -> u8x16<Self>;
470 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
471 fn slide_i16x8<const SHIFT: usize>(self, a: i16x8<Self>, b: i16x8<Self>) -> i16x8<Self>;
472 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
473 fn slide_within_blocks_i16x8<const SHIFT: usize>(
474 self,
475 a: i16x8<Self>,
476 b: i16x8<Self>,
477 ) -> i16x8<Self>;
478 #[doc = "Add two vectors element-wise, wrapping on overflow."]
479 fn add_i16x8(self, a: i16x8<Self>, b: i16x8<Self>) -> i16x8<Self>;
480 #[doc = "Subtract two vectors element-wise, wrapping on overflow."]
481 fn sub_i16x8(self, a: i16x8<Self>, b: i16x8<Self>) -> i16x8<Self>;
482 #[doc = "Multiply two vectors element-wise, wrapping on overflow."]
483 fn mul_i16x8(self, a: i16x8<Self>, b: i16x8<Self>) -> i16x8<Self>;
484 #[doc = "Compute the bitwise AND of two vectors."]
485 fn and_i16x8(self, a: i16x8<Self>, b: i16x8<Self>) -> i16x8<Self>;
486 #[doc = "Compute the bitwise OR of two vectors."]
487 fn or_i16x8(self, a: i16x8<Self>, b: i16x8<Self>) -> i16x8<Self>;
488 #[doc = "Compute the bitwise XOR of two vectors."]
489 fn xor_i16x8(self, a: i16x8<Self>, b: i16x8<Self>) -> i16x8<Self>;
490 #[doc = "Compute the bitwise NOT of the vector."]
491 fn not_i16x8(self, a: i16x8<Self>) -> i16x8<Self>;
492 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right."]
493 fn shl_i16x8(self, a: i16x8<Self>, shift: u32) -> i16x8<Self>;
494 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
495 fn shlv_i16x8(self, a: i16x8<Self>, b: i16x8<Self>) -> i16x8<Self>;
496 #[doc = "Shift each element right by the given number of bits.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated."]
497 fn shr_i16x8(self, a: i16x8<Self>, shift: u32) -> i16x8<Self>;
498 #[doc = "Shift each element right by the corresponding element in another vector.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
499 fn shrv_i16x8(self, a: i16x8<Self>, b: i16x8<Self>) -> i16x8<Self>;
500 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
501 fn simd_eq_i16x8(self, a: i16x8<Self>, b: i16x8<Self>) -> mask16x8<Self>;
502 #[doc = "Compare two vectors element-wise for less than.\n\nReturns a mask where each element is all ones if `a` is less than `b`, and all zeroes if not."]
503 fn simd_lt_i16x8(self, a: i16x8<Self>, b: i16x8<Self>) -> mask16x8<Self>;
504 #[doc = "Compare two vectors element-wise for less than or equal.\n\nReturns a mask where each element is all ones if `a` is less than or equal to `b`, and all zeroes if not."]
505 fn simd_le_i16x8(self, a: i16x8<Self>, b: i16x8<Self>) -> mask16x8<Self>;
506 #[doc = "Compare two vectors element-wise for greater than or equal.\n\nReturns a mask where each element is all ones if `a` is greater than or equal to `b`, and all zeroes if not."]
507 fn simd_ge_i16x8(self, a: i16x8<Self>, b: i16x8<Self>) -> mask16x8<Self>;
508 #[doc = "Compare two vectors element-wise for greater than.\n\nReturns a mask where each element is all ones if `a` is greater than `b`, and all zeroes if not."]
509 fn simd_gt_i16x8(self, a: i16x8<Self>, b: i16x8<Self>) -> mask16x8<Self>;
510 #[doc = "Interleave the lower half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, b0, a1, b1]`.\n\n**Note:** This operation is only useful if you need to discard elements `a2, a3, b2, b3`.\n For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
511 fn zip_low_i16x8(self, a: i16x8<Self>, b: i16x8<Self>) -> i16x8<Self>;
512 #[doc = "Interleave the upper half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a2, b2, a3, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a1, b0, b1`.For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
513 fn zip_high_i16x8(self, a: i16x8<Self>, b: i16x8<Self>) -> i16x8<Self>;
514 #[doc = "Extract even-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, a2, b0, b2]`.\n\n**Note:** This operation is only useful if you need to discard elements `a1, a3, b1, b3`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
515 fn unzip_low_i16x8(self, a: i16x8<Self>, b: i16x8<Self>) -> i16x8<Self>;
516 #[doc = "Extract odd-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a1, a3, b1, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a2, b0, b2`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
517 fn unzip_high_i16x8(self, a: i16x8<Self>, b: i16x8<Self>) -> i16x8<Self>;
518 #[doc = "Interleave two vectors.\n\nThe resulting vectors contain elements taken alternately from `a` and `b`, first filling the first result, and then the second.\n\nThe reverse of this operation is `deinterleave`.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `([a0, b0, a1, b1], [a2, b2, a3, b3])`."]
519 fn interleave_i16x8(self, a: i16x8<Self>, b: i16x8<Self>) -> (i16x8<Self>, i16x8<Self>);
520 #[doc = "Deinterleave two vectors.\n\nThe first result contains all even-indexed elements from `a` followed by all even-indexed elements from `b`. The second result contains all odd-indexed elements from `a` followed by all odd-indexed elements from `b`.\n\nThe reverse of this operation is `interleave`.\n\nFor vectors `[a0, b0, a1, b1]` and `[a2, b2, a3, b3]`, returns `([a0, a1, a2, a3], [b0, b1, b2, b3])`."]
521 fn deinterleave_i16x8(self, a: i16x8<Self>, b: i16x8<Self>) -> (i16x8<Self>, i16x8<Self>);
522 #[doc = "Select elements from b and c based on the mask operand a.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
523 fn select_i16x8(self, a: mask16x8<Self>, b: i16x8<Self>, c: i16x8<Self>) -> i16x8<Self>;
524 #[doc = "Return the element-wise minimum of two vectors."]
525 fn min_i16x8(self, a: i16x8<Self>, b: i16x8<Self>) -> i16x8<Self>;
526 #[doc = "Return the element-wise maximum of two vectors."]
527 fn max_i16x8(self, a: i16x8<Self>, b: i16x8<Self>) -> i16x8<Self>;
528 #[doc = "Combine two vectors into a single vector with twice the width.\n\n`a` provides the lower elements and `b` provides the upper elements."]
529 fn combine_i16x8(self, a: i16x8<Self>, b: i16x8<Self>) -> i16x16<Self>;
530 #[doc = "Negate each element of the vector, wrapping on overflow."]
531 fn neg_i16x8(self, a: i16x8<Self>) -> i16x8<Self>;
532 #[doc = "Reinterpret the bits of this vector as a vector of `u8` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
533 fn reinterpret_u8_i16x8(self, a: i16x8<Self>) -> u8x16<Self>;
534 #[doc = "Reinterpret the bits of this vector as a vector of `u32` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
535 fn reinterpret_u32_i16x8(self, a: i16x8<Self>) -> u32x4<Self>;
536 #[doc = "Create a SIMD vector with all elements set to the given value."]
537 fn splat_u16x8(self, val: u16) -> u16x8<Self>;
538 #[doc = "Create a SIMD vector from an array of the same length."]
539 fn load_array_u16x8(self, val: [u16; 8usize]) -> u16x8<Self>;
540 #[doc = "Create a SIMD vector from an array of the same length."]
541 fn load_array_ref_u16x8(self, val: &[u16; 8usize]) -> u16x8<Self>;
542 #[doc = "Convert a SIMD vector to an array."]
543 fn as_array_u16x8(self, a: u16x8<Self>) -> [u16; 8usize];
544 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
545 fn as_array_ref_u16x8(self, a: &u16x8<Self>) -> &[u16; 8usize];
546 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
547 fn as_array_mut_u16x8(self, a: &mut u16x8<Self>) -> &mut [u16; 8usize];
548 #[doc = "Store a SIMD vector into an array of the same length."]
549 fn store_array_u16x8(self, a: u16x8<Self>, dest: &mut [u16; 8usize]) -> ();
550 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
551 fn cvt_from_bytes_u16x8(self, a: u8x16<Self>) -> u16x8<Self>;
552 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
553 fn cvt_to_bytes_u16x8(self, a: u16x8<Self>) -> u8x16<Self>;
554 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
555 fn slide_u16x8<const SHIFT: usize>(self, a: u16x8<Self>, b: u16x8<Self>) -> u16x8<Self>;
556 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
557 fn slide_within_blocks_u16x8<const SHIFT: usize>(
558 self,
559 a: u16x8<Self>,
560 b: u16x8<Self>,
561 ) -> u16x8<Self>;
562 #[doc = "Add two vectors element-wise, wrapping on overflow."]
563 fn add_u16x8(self, a: u16x8<Self>, b: u16x8<Self>) -> u16x8<Self>;
564 #[doc = "Subtract two vectors element-wise, wrapping on overflow."]
565 fn sub_u16x8(self, a: u16x8<Self>, b: u16x8<Self>) -> u16x8<Self>;
566 #[doc = "Multiply two vectors element-wise, wrapping on overflow."]
567 fn mul_u16x8(self, a: u16x8<Self>, b: u16x8<Self>) -> u16x8<Self>;
568 #[doc = "Compute the bitwise AND of two vectors."]
569 fn and_u16x8(self, a: u16x8<Self>, b: u16x8<Self>) -> u16x8<Self>;
570 #[doc = "Compute the bitwise OR of two vectors."]
571 fn or_u16x8(self, a: u16x8<Self>, b: u16x8<Self>) -> u16x8<Self>;
572 #[doc = "Compute the bitwise XOR of two vectors."]
573 fn xor_u16x8(self, a: u16x8<Self>, b: u16x8<Self>) -> u16x8<Self>;
574 #[doc = "Compute the bitwise NOT of the vector."]
575 fn not_u16x8(self, a: u16x8<Self>) -> u16x8<Self>;
576 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right."]
577 fn shl_u16x8(self, a: u16x8<Self>, shift: u32) -> u16x8<Self>;
578 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
579 fn shlv_u16x8(self, a: u16x8<Self>, b: u16x8<Self>) -> u16x8<Self>;
580 #[doc = "Shift each element right by the given number of bits.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated."]
581 fn shr_u16x8(self, a: u16x8<Self>, shift: u32) -> u16x8<Self>;
582 #[doc = "Shift each element right by the corresponding element in another vector.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
583 fn shrv_u16x8(self, a: u16x8<Self>, b: u16x8<Self>) -> u16x8<Self>;
584 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
585 fn simd_eq_u16x8(self, a: u16x8<Self>, b: u16x8<Self>) -> mask16x8<Self>;
586 #[doc = "Compare two vectors element-wise for less than.\n\nReturns a mask where each element is all ones if `a` is less than `b`, and all zeroes if not."]
587 fn simd_lt_u16x8(self, a: u16x8<Self>, b: u16x8<Self>) -> mask16x8<Self>;
588 #[doc = "Compare two vectors element-wise for less than or equal.\n\nReturns a mask where each element is all ones if `a` is less than or equal to `b`, and all zeroes if not."]
589 fn simd_le_u16x8(self, a: u16x8<Self>, b: u16x8<Self>) -> mask16x8<Self>;
590 #[doc = "Compare two vectors element-wise for greater than or equal.\n\nReturns a mask where each element is all ones if `a` is greater than or equal to `b`, and all zeroes if not."]
591 fn simd_ge_u16x8(self, a: u16x8<Self>, b: u16x8<Self>) -> mask16x8<Self>;
592 #[doc = "Compare two vectors element-wise for greater than.\n\nReturns a mask where each element is all ones if `a` is greater than `b`, and all zeroes if not."]
593 fn simd_gt_u16x8(self, a: u16x8<Self>, b: u16x8<Self>) -> mask16x8<Self>;
594 #[doc = "Interleave the lower half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, b0, a1, b1]`.\n\n**Note:** This operation is only useful if you need to discard elements `a2, a3, b2, b3`.\n For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
595 fn zip_low_u16x8(self, a: u16x8<Self>, b: u16x8<Self>) -> u16x8<Self>;
596 #[doc = "Interleave the upper half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a2, b2, a3, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a1, b0, b1`.For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
597 fn zip_high_u16x8(self, a: u16x8<Self>, b: u16x8<Self>) -> u16x8<Self>;
598 #[doc = "Extract even-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, a2, b0, b2]`.\n\n**Note:** This operation is only useful if you need to discard elements `a1, a3, b1, b3`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
599 fn unzip_low_u16x8(self, a: u16x8<Self>, b: u16x8<Self>) -> u16x8<Self>;
600 #[doc = "Extract odd-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a1, a3, b1, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a2, b0, b2`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
601 fn unzip_high_u16x8(self, a: u16x8<Self>, b: u16x8<Self>) -> u16x8<Self>;
602 #[doc = "Interleave two vectors.\n\nThe resulting vectors contain elements taken alternately from `a` and `b`, first filling the first result, and then the second.\n\nThe reverse of this operation is `deinterleave`.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `([a0, b0, a1, b1], [a2, b2, a3, b3])`."]
603 fn interleave_u16x8(self, a: u16x8<Self>, b: u16x8<Self>) -> (u16x8<Self>, u16x8<Self>);
604 #[doc = "Deinterleave two vectors.\n\nThe first result contains all even-indexed elements from `a` followed by all even-indexed elements from `b`. The second result contains all odd-indexed elements from `a` followed by all odd-indexed elements from `b`.\n\nThe reverse of this operation is `interleave`.\n\nFor vectors `[a0, b0, a1, b1]` and `[a2, b2, a3, b3]`, returns `([a0, a1, a2, a3], [b0, b1, b2, b3])`."]
605 fn deinterleave_u16x8(self, a: u16x8<Self>, b: u16x8<Self>) -> (u16x8<Self>, u16x8<Self>);
606 #[doc = "Select elements from b and c based on the mask operand a.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
607 fn select_u16x8(self, a: mask16x8<Self>, b: u16x8<Self>, c: u16x8<Self>) -> u16x8<Self>;
608 #[doc = "Return the element-wise minimum of two vectors."]
609 fn min_u16x8(self, a: u16x8<Self>, b: u16x8<Self>) -> u16x8<Self>;
610 #[doc = "Return the element-wise maximum of two vectors."]
611 fn max_u16x8(self, a: u16x8<Self>, b: u16x8<Self>) -> u16x8<Self>;
612 #[doc = "Combine two vectors into a single vector with twice the width.\n\n`a` provides the lower elements and `b` provides the upper elements."]
613 fn combine_u16x8(self, a: u16x8<Self>, b: u16x8<Self>) -> u16x16<Self>;
614 #[doc = "Reinterpret the bits of this vector as a vector of `u8` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
615 fn reinterpret_u8_u16x8(self, a: u16x8<Self>) -> u8x16<Self>;
616 #[doc = "Reinterpret the bits of this vector as a vector of `u32` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
617 fn reinterpret_u32_u16x8(self, a: u16x8<Self>) -> u32x4<Self>;
618 #[doc = "Create a SIMD vector with all elements set to the given value."]
619 fn splat_mask16x8(self, val: i16) -> mask16x8<Self>;
620 #[doc = "Create a SIMD vector from an array of the same length."]
621 fn load_array_mask16x8(self, val: [i16; 8usize]) -> mask16x8<Self>;
622 #[doc = "Create a SIMD vector from an array of the same length."]
623 fn load_array_ref_mask16x8(self, val: &[i16; 8usize]) -> mask16x8<Self>;
624 #[doc = "Convert a SIMD vector to an array."]
625 fn as_array_mask16x8(self, a: mask16x8<Self>) -> [i16; 8usize];
626 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
627 fn as_array_ref_mask16x8(self, a: &mask16x8<Self>) -> &[i16; 8usize];
628 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
629 fn as_array_mut_mask16x8(self, a: &mut mask16x8<Self>) -> &mut [i16; 8usize];
630 #[doc = "Store a SIMD vector into an array of the same length."]
631 fn store_array_mask16x8(self, a: mask16x8<Self>, dest: &mut [i16; 8usize]) -> ();
632 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
633 fn cvt_from_bytes_mask16x8(self, a: u8x16<Self>) -> mask16x8<Self>;
634 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
635 fn cvt_to_bytes_mask16x8(self, a: mask16x8<Self>) -> u8x16<Self>;
636 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
637 fn slide_mask16x8<const SHIFT: usize>(
638 self,
639 a: mask16x8<Self>,
640 b: mask16x8<Self>,
641 ) -> mask16x8<Self>;
642 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
643 fn slide_within_blocks_mask16x8<const SHIFT: usize>(
644 self,
645 a: mask16x8<Self>,
646 b: mask16x8<Self>,
647 ) -> mask16x8<Self>;
648 #[doc = "Compute the logical AND of two masks."]
649 fn and_mask16x8(self, a: mask16x8<Self>, b: mask16x8<Self>) -> mask16x8<Self>;
650 #[doc = "Compute the logical OR of two masks."]
651 fn or_mask16x8(self, a: mask16x8<Self>, b: mask16x8<Self>) -> mask16x8<Self>;
652 #[doc = "Compute the logical XOR of two masks."]
653 fn xor_mask16x8(self, a: mask16x8<Self>, b: mask16x8<Self>) -> mask16x8<Self>;
654 #[doc = "Compute the logical NOT of the mask."]
655 fn not_mask16x8(self, a: mask16x8<Self>) -> mask16x8<Self>;
656 #[doc = "Select elements from `b` and `c` based on the mask operand `a`.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
657 fn select_mask16x8(
658 self,
659 a: mask16x8<Self>,
660 b: mask16x8<Self>,
661 c: mask16x8<Self>,
662 ) -> mask16x8<Self>;
663 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
664 fn simd_eq_mask16x8(self, a: mask16x8<Self>, b: mask16x8<Self>) -> mask16x8<Self>;
665 #[doc = "Returns true if any elements in this mask are true (all ones).\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
666 fn any_true_mask16x8(self, a: mask16x8<Self>) -> bool;
667 #[doc = "Returns true if all elements in this mask are true (all ones).\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
668 fn all_true_mask16x8(self, a: mask16x8<Self>) -> bool;
669 #[doc = "Returns true if any elements in this mask are false (all zeroes).\n\nThis is logically equivalent to `!all_true`, but may be faster.\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
670 fn any_false_mask16x8(self, a: mask16x8<Self>) -> bool;
671 #[doc = "Returns true if all elements in this mask are false (all zeroes).\n\nThis is logically equivalent to `!any_true`, but may be faster.\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
672 fn all_false_mask16x8(self, a: mask16x8<Self>) -> bool;
673 #[doc = "Combine two vectors into a single vector with twice the width.\n\n`a` provides the lower elements and `b` provides the upper elements."]
674 fn combine_mask16x8(self, a: mask16x8<Self>, b: mask16x8<Self>) -> mask16x16<Self>;
675 #[doc = "Create a SIMD vector with all elements set to the given value."]
676 fn splat_i32x4(self, val: i32) -> i32x4<Self>;
677 #[doc = "Create a SIMD vector from an array of the same length."]
678 fn load_array_i32x4(self, val: [i32; 4usize]) -> i32x4<Self>;
679 #[doc = "Create a SIMD vector from an array of the same length."]
680 fn load_array_ref_i32x4(self, val: &[i32; 4usize]) -> i32x4<Self>;
681 #[doc = "Convert a SIMD vector to an array."]
682 fn as_array_i32x4(self, a: i32x4<Self>) -> [i32; 4usize];
683 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
684 fn as_array_ref_i32x4(self, a: &i32x4<Self>) -> &[i32; 4usize];
685 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
686 fn as_array_mut_i32x4(self, a: &mut i32x4<Self>) -> &mut [i32; 4usize];
687 #[doc = "Store a SIMD vector into an array of the same length."]
688 fn store_array_i32x4(self, a: i32x4<Self>, dest: &mut [i32; 4usize]) -> ();
689 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
690 fn cvt_from_bytes_i32x4(self, a: u8x16<Self>) -> i32x4<Self>;
691 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
692 fn cvt_to_bytes_i32x4(self, a: i32x4<Self>) -> u8x16<Self>;
693 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
694 fn slide_i32x4<const SHIFT: usize>(self, a: i32x4<Self>, b: i32x4<Self>) -> i32x4<Self>;
695 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
696 fn slide_within_blocks_i32x4<const SHIFT: usize>(
697 self,
698 a: i32x4<Self>,
699 b: i32x4<Self>,
700 ) -> i32x4<Self>;
701 #[doc = "Add two vectors element-wise, wrapping on overflow."]
702 fn add_i32x4(self, a: i32x4<Self>, b: i32x4<Self>) -> i32x4<Self>;
703 #[doc = "Subtract two vectors element-wise, wrapping on overflow."]
704 fn sub_i32x4(self, a: i32x4<Self>, b: i32x4<Self>) -> i32x4<Self>;
705 #[doc = "Multiply two vectors element-wise, wrapping on overflow."]
706 fn mul_i32x4(self, a: i32x4<Self>, b: i32x4<Self>) -> i32x4<Self>;
707 #[doc = "Compute the bitwise AND of two vectors."]
708 fn and_i32x4(self, a: i32x4<Self>, b: i32x4<Self>) -> i32x4<Self>;
709 #[doc = "Compute the bitwise OR of two vectors."]
710 fn or_i32x4(self, a: i32x4<Self>, b: i32x4<Self>) -> i32x4<Self>;
711 #[doc = "Compute the bitwise XOR of two vectors."]
712 fn xor_i32x4(self, a: i32x4<Self>, b: i32x4<Self>) -> i32x4<Self>;
713 #[doc = "Compute the bitwise NOT of the vector."]
714 fn not_i32x4(self, a: i32x4<Self>) -> i32x4<Self>;
715 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right."]
716 fn shl_i32x4(self, a: i32x4<Self>, shift: u32) -> i32x4<Self>;
717 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
718 fn shlv_i32x4(self, a: i32x4<Self>, b: i32x4<Self>) -> i32x4<Self>;
719 #[doc = "Shift each element right by the given number of bits.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated."]
720 fn shr_i32x4(self, a: i32x4<Self>, shift: u32) -> i32x4<Self>;
721 #[doc = "Shift each element right by the corresponding element in another vector.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
722 fn shrv_i32x4(self, a: i32x4<Self>, b: i32x4<Self>) -> i32x4<Self>;
723 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
724 fn simd_eq_i32x4(self, a: i32x4<Self>, b: i32x4<Self>) -> mask32x4<Self>;
725 #[doc = "Compare two vectors element-wise for less than.\n\nReturns a mask where each element is all ones if `a` is less than `b`, and all zeroes if not."]
726 fn simd_lt_i32x4(self, a: i32x4<Self>, b: i32x4<Self>) -> mask32x4<Self>;
727 #[doc = "Compare two vectors element-wise for less than or equal.\n\nReturns a mask where each element is all ones if `a` is less than or equal to `b`, and all zeroes if not."]
728 fn simd_le_i32x4(self, a: i32x4<Self>, b: i32x4<Self>) -> mask32x4<Self>;
729 #[doc = "Compare two vectors element-wise for greater than or equal.\n\nReturns a mask where each element is all ones if `a` is greater than or equal to `b`, and all zeroes if not."]
730 fn simd_ge_i32x4(self, a: i32x4<Self>, b: i32x4<Self>) -> mask32x4<Self>;
731 #[doc = "Compare two vectors element-wise for greater than.\n\nReturns a mask where each element is all ones if `a` is greater than `b`, and all zeroes if not."]
732 fn simd_gt_i32x4(self, a: i32x4<Self>, b: i32x4<Self>) -> mask32x4<Self>;
733 #[doc = "Interleave the lower half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, b0, a1, b1]`.\n\n**Note:** This operation is only useful if you need to discard elements `a2, a3, b2, b3`.\n For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
734 fn zip_low_i32x4(self, a: i32x4<Self>, b: i32x4<Self>) -> i32x4<Self>;
735 #[doc = "Interleave the upper half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a2, b2, a3, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a1, b0, b1`.For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
736 fn zip_high_i32x4(self, a: i32x4<Self>, b: i32x4<Self>) -> i32x4<Self>;
737 #[doc = "Extract even-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, a2, b0, b2]`.\n\n**Note:** This operation is only useful if you need to discard elements `a1, a3, b1, b3`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
738 fn unzip_low_i32x4(self, a: i32x4<Self>, b: i32x4<Self>) -> i32x4<Self>;
739 #[doc = "Extract odd-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a1, a3, b1, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a2, b0, b2`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
740 fn unzip_high_i32x4(self, a: i32x4<Self>, b: i32x4<Self>) -> i32x4<Self>;
741 #[doc = "Interleave two vectors.\n\nThe resulting vectors contain elements taken alternately from `a` and `b`, first filling the first result, and then the second.\n\nThe reverse of this operation is `deinterleave`.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `([a0, b0, a1, b1], [a2, b2, a3, b3])`."]
742 fn interleave_i32x4(self, a: i32x4<Self>, b: i32x4<Self>) -> (i32x4<Self>, i32x4<Self>);
743 #[doc = "Deinterleave two vectors.\n\nThe first result contains all even-indexed elements from `a` followed by all even-indexed elements from `b`. The second result contains all odd-indexed elements from `a` followed by all odd-indexed elements from `b`.\n\nThe reverse of this operation is `interleave`.\n\nFor vectors `[a0, b0, a1, b1]` and `[a2, b2, a3, b3]`, returns `([a0, a1, a2, a3], [b0, b1, b2, b3])`."]
744 fn deinterleave_i32x4(self, a: i32x4<Self>, b: i32x4<Self>) -> (i32x4<Self>, i32x4<Self>);
745 #[doc = "Select elements from b and c based on the mask operand a.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
746 fn select_i32x4(self, a: mask32x4<Self>, b: i32x4<Self>, c: i32x4<Self>) -> i32x4<Self>;
747 #[doc = "Return the element-wise minimum of two vectors."]
748 fn min_i32x4(self, a: i32x4<Self>, b: i32x4<Self>) -> i32x4<Self>;
749 #[doc = "Return the element-wise maximum of two vectors."]
750 fn max_i32x4(self, a: i32x4<Self>, b: i32x4<Self>) -> i32x4<Self>;
751 #[doc = "Combine two vectors into a single vector with twice the width.\n\n`a` provides the lower elements and `b` provides the upper elements."]
752 fn combine_i32x4(self, a: i32x4<Self>, b: i32x4<Self>) -> i32x8<Self>;
753 #[doc = "Negate each element of the vector, wrapping on overflow."]
754 fn neg_i32x4(self, a: i32x4<Self>) -> i32x4<Self>;
755 #[doc = "Reinterpret the bits of this vector as a vector of `u8` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
756 fn reinterpret_u8_i32x4(self, a: i32x4<Self>) -> u8x16<Self>;
757 #[doc = "Reinterpret the bits of this vector as a vector of `u32` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
758 fn reinterpret_u32_i32x4(self, a: i32x4<Self>) -> u32x4<Self>;
759 #[doc = "Convert each signed 32-bit integer element to a floating-point value.\n\nValues that cannot be exactly represented are rounded to the nearest representable value."]
760 fn cvt_f32_i32x4(self, a: i32x4<Self>) -> f32x4<Self>;
761 #[doc = "Create a SIMD vector with all elements set to the given value."]
762 fn splat_u32x4(self, val: u32) -> u32x4<Self>;
763 #[doc = "Create a SIMD vector from an array of the same length."]
764 fn load_array_u32x4(self, val: [u32; 4usize]) -> u32x4<Self>;
765 #[doc = "Create a SIMD vector from an array of the same length."]
766 fn load_array_ref_u32x4(self, val: &[u32; 4usize]) -> u32x4<Self>;
767 #[doc = "Convert a SIMD vector to an array."]
768 fn as_array_u32x4(self, a: u32x4<Self>) -> [u32; 4usize];
769 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
770 fn as_array_ref_u32x4(self, a: &u32x4<Self>) -> &[u32; 4usize];
771 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
772 fn as_array_mut_u32x4(self, a: &mut u32x4<Self>) -> &mut [u32; 4usize];
773 #[doc = "Store a SIMD vector into an array of the same length."]
774 fn store_array_u32x4(self, a: u32x4<Self>, dest: &mut [u32; 4usize]) -> ();
775 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
776 fn cvt_from_bytes_u32x4(self, a: u8x16<Self>) -> u32x4<Self>;
777 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
778 fn cvt_to_bytes_u32x4(self, a: u32x4<Self>) -> u8x16<Self>;
779 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
780 fn slide_u32x4<const SHIFT: usize>(self, a: u32x4<Self>, b: u32x4<Self>) -> u32x4<Self>;
781 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
782 fn slide_within_blocks_u32x4<const SHIFT: usize>(
783 self,
784 a: u32x4<Self>,
785 b: u32x4<Self>,
786 ) -> u32x4<Self>;
787 #[doc = "Add two vectors element-wise, wrapping on overflow."]
788 fn add_u32x4(self, a: u32x4<Self>, b: u32x4<Self>) -> u32x4<Self>;
789 #[doc = "Subtract two vectors element-wise, wrapping on overflow."]
790 fn sub_u32x4(self, a: u32x4<Self>, b: u32x4<Self>) -> u32x4<Self>;
791 #[doc = "Multiply two vectors element-wise, wrapping on overflow."]
792 fn mul_u32x4(self, a: u32x4<Self>, b: u32x4<Self>) -> u32x4<Self>;
793 #[doc = "Compute the bitwise AND of two vectors."]
794 fn and_u32x4(self, a: u32x4<Self>, b: u32x4<Self>) -> u32x4<Self>;
795 #[doc = "Compute the bitwise OR of two vectors."]
796 fn or_u32x4(self, a: u32x4<Self>, b: u32x4<Self>) -> u32x4<Self>;
797 #[doc = "Compute the bitwise XOR of two vectors."]
798 fn xor_u32x4(self, a: u32x4<Self>, b: u32x4<Self>) -> u32x4<Self>;
799 #[doc = "Compute the bitwise NOT of the vector."]
800 fn not_u32x4(self, a: u32x4<Self>) -> u32x4<Self>;
801 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right."]
802 fn shl_u32x4(self, a: u32x4<Self>, shift: u32) -> u32x4<Self>;
803 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
804 fn shlv_u32x4(self, a: u32x4<Self>, b: u32x4<Self>) -> u32x4<Self>;
805 #[doc = "Shift each element right by the given number of bits.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated."]
806 fn shr_u32x4(self, a: u32x4<Self>, shift: u32) -> u32x4<Self>;
807 #[doc = "Shift each element right by the corresponding element in another vector.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
808 fn shrv_u32x4(self, a: u32x4<Self>, b: u32x4<Self>) -> u32x4<Self>;
809 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
810 fn simd_eq_u32x4(self, a: u32x4<Self>, b: u32x4<Self>) -> mask32x4<Self>;
811 #[doc = "Compare two vectors element-wise for less than.\n\nReturns a mask where each element is all ones if `a` is less than `b`, and all zeroes if not."]
812 fn simd_lt_u32x4(self, a: u32x4<Self>, b: u32x4<Self>) -> mask32x4<Self>;
813 #[doc = "Compare two vectors element-wise for less than or equal.\n\nReturns a mask where each element is all ones if `a` is less than or equal to `b`, and all zeroes if not."]
814 fn simd_le_u32x4(self, a: u32x4<Self>, b: u32x4<Self>) -> mask32x4<Self>;
815 #[doc = "Compare two vectors element-wise for greater than or equal.\n\nReturns a mask where each element is all ones if `a` is greater than or equal to `b`, and all zeroes if not."]
816 fn simd_ge_u32x4(self, a: u32x4<Self>, b: u32x4<Self>) -> mask32x4<Self>;
817 #[doc = "Compare two vectors element-wise for greater than.\n\nReturns a mask where each element is all ones if `a` is greater than `b`, and all zeroes if not."]
818 fn simd_gt_u32x4(self, a: u32x4<Self>, b: u32x4<Self>) -> mask32x4<Self>;
819 #[doc = "Interleave the lower half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, b0, a1, b1]`.\n\n**Note:** This operation is only useful if you need to discard elements `a2, a3, b2, b3`.\n For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
820 fn zip_low_u32x4(self, a: u32x4<Self>, b: u32x4<Self>) -> u32x4<Self>;
821 #[doc = "Interleave the upper half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a2, b2, a3, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a1, b0, b1`.For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
822 fn zip_high_u32x4(self, a: u32x4<Self>, b: u32x4<Self>) -> u32x4<Self>;
823 #[doc = "Extract even-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, a2, b0, b2]`.\n\n**Note:** This operation is only useful if you need to discard elements `a1, a3, b1, b3`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
824 fn unzip_low_u32x4(self, a: u32x4<Self>, b: u32x4<Self>) -> u32x4<Self>;
825 #[doc = "Extract odd-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a1, a3, b1, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a2, b0, b2`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
826 fn unzip_high_u32x4(self, a: u32x4<Self>, b: u32x4<Self>) -> u32x4<Self>;
827 #[doc = "Interleave two vectors.\n\nThe resulting vectors contain elements taken alternately from `a` and `b`, first filling the first result, and then the second.\n\nThe reverse of this operation is `deinterleave`.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `([a0, b0, a1, b1], [a2, b2, a3, b3])`."]
828 fn interleave_u32x4(self, a: u32x4<Self>, b: u32x4<Self>) -> (u32x4<Self>, u32x4<Self>);
829 #[doc = "Deinterleave two vectors.\n\nThe first result contains all even-indexed elements from `a` followed by all even-indexed elements from `b`. The second result contains all odd-indexed elements from `a` followed by all odd-indexed elements from `b`.\n\nThe reverse of this operation is `interleave`.\n\nFor vectors `[a0, b0, a1, b1]` and `[a2, b2, a3, b3]`, returns `([a0, a1, a2, a3], [b0, b1, b2, b3])`."]
830 fn deinterleave_u32x4(self, a: u32x4<Self>, b: u32x4<Self>) -> (u32x4<Self>, u32x4<Self>);
831 #[doc = "Select elements from b and c based on the mask operand a.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
832 fn select_u32x4(self, a: mask32x4<Self>, b: u32x4<Self>, c: u32x4<Self>) -> u32x4<Self>;
833 #[doc = "Return the element-wise minimum of two vectors."]
834 fn min_u32x4(self, a: u32x4<Self>, b: u32x4<Self>) -> u32x4<Self>;
835 #[doc = "Return the element-wise maximum of two vectors."]
836 fn max_u32x4(self, a: u32x4<Self>, b: u32x4<Self>) -> u32x4<Self>;
837 #[doc = "Combine two vectors into a single vector with twice the width.\n\n`a` provides the lower elements and `b` provides the upper elements."]
838 fn combine_u32x4(self, a: u32x4<Self>, b: u32x4<Self>) -> u32x8<Self>;
839 #[doc = "Reinterpret the bits of this vector as a vector of `u8` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
840 fn reinterpret_u8_u32x4(self, a: u32x4<Self>) -> u8x16<Self>;
841 #[doc = "Convert each unsigned 32-bit integer element to a floating-point value.\n\nValues that cannot be exactly represented are rounded to the nearest representable value."]
842 fn cvt_f32_u32x4(self, a: u32x4<Self>) -> f32x4<Self>;
843 #[doc = "Create a SIMD vector with all elements set to the given value."]
844 fn splat_mask32x4(self, val: i32) -> mask32x4<Self>;
845 #[doc = "Create a SIMD vector from an array of the same length."]
846 fn load_array_mask32x4(self, val: [i32; 4usize]) -> mask32x4<Self>;
847 #[doc = "Create a SIMD vector from an array of the same length."]
848 fn load_array_ref_mask32x4(self, val: &[i32; 4usize]) -> mask32x4<Self>;
849 #[doc = "Convert a SIMD vector to an array."]
850 fn as_array_mask32x4(self, a: mask32x4<Self>) -> [i32; 4usize];
851 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
852 fn as_array_ref_mask32x4(self, a: &mask32x4<Self>) -> &[i32; 4usize];
853 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
854 fn as_array_mut_mask32x4(self, a: &mut mask32x4<Self>) -> &mut [i32; 4usize];
855 #[doc = "Store a SIMD vector into an array of the same length."]
856 fn store_array_mask32x4(self, a: mask32x4<Self>, dest: &mut [i32; 4usize]) -> ();
857 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
858 fn cvt_from_bytes_mask32x4(self, a: u8x16<Self>) -> mask32x4<Self>;
859 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
860 fn cvt_to_bytes_mask32x4(self, a: mask32x4<Self>) -> u8x16<Self>;
861 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
862 fn slide_mask32x4<const SHIFT: usize>(
863 self,
864 a: mask32x4<Self>,
865 b: mask32x4<Self>,
866 ) -> mask32x4<Self>;
867 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
868 fn slide_within_blocks_mask32x4<const SHIFT: usize>(
869 self,
870 a: mask32x4<Self>,
871 b: mask32x4<Self>,
872 ) -> mask32x4<Self>;
873 #[doc = "Compute the logical AND of two masks."]
874 fn and_mask32x4(self, a: mask32x4<Self>, b: mask32x4<Self>) -> mask32x4<Self>;
875 #[doc = "Compute the logical OR of two masks."]
876 fn or_mask32x4(self, a: mask32x4<Self>, b: mask32x4<Self>) -> mask32x4<Self>;
877 #[doc = "Compute the logical XOR of two masks."]
878 fn xor_mask32x4(self, a: mask32x4<Self>, b: mask32x4<Self>) -> mask32x4<Self>;
879 #[doc = "Compute the logical NOT of the mask."]
880 fn not_mask32x4(self, a: mask32x4<Self>) -> mask32x4<Self>;
881 #[doc = "Select elements from `b` and `c` based on the mask operand `a`.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
882 fn select_mask32x4(
883 self,
884 a: mask32x4<Self>,
885 b: mask32x4<Self>,
886 c: mask32x4<Self>,
887 ) -> mask32x4<Self>;
888 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
889 fn simd_eq_mask32x4(self, a: mask32x4<Self>, b: mask32x4<Self>) -> mask32x4<Self>;
890 #[doc = "Returns true if any elements in this mask are true (all ones).\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
891 fn any_true_mask32x4(self, a: mask32x4<Self>) -> bool;
892 #[doc = "Returns true if all elements in this mask are true (all ones).\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
893 fn all_true_mask32x4(self, a: mask32x4<Self>) -> bool;
894 #[doc = "Returns true if any elements in this mask are false (all zeroes).\n\nThis is logically equivalent to `!all_true`, but may be faster.\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
895 fn any_false_mask32x4(self, a: mask32x4<Self>) -> bool;
896 #[doc = "Returns true if all elements in this mask are false (all zeroes).\n\nThis is logically equivalent to `!any_true`, but may be faster.\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
897 fn all_false_mask32x4(self, a: mask32x4<Self>) -> bool;
898 #[doc = "Combine two vectors into a single vector with twice the width.\n\n`a` provides the lower elements and `b` provides the upper elements."]
899 fn combine_mask32x4(self, a: mask32x4<Self>, b: mask32x4<Self>) -> mask32x8<Self>;
900 #[doc = "Create a SIMD vector with all elements set to the given value."]
901 fn splat_f64x2(self, val: f64) -> f64x2<Self>;
902 #[doc = "Create a SIMD vector from an array of the same length."]
903 fn load_array_f64x2(self, val: [f64; 2usize]) -> f64x2<Self>;
904 #[doc = "Create a SIMD vector from an array of the same length."]
905 fn load_array_ref_f64x2(self, val: &[f64; 2usize]) -> f64x2<Self>;
906 #[doc = "Convert a SIMD vector to an array."]
907 fn as_array_f64x2(self, a: f64x2<Self>) -> [f64; 2usize];
908 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
909 fn as_array_ref_f64x2(self, a: &f64x2<Self>) -> &[f64; 2usize];
910 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
911 fn as_array_mut_f64x2(self, a: &mut f64x2<Self>) -> &mut [f64; 2usize];
912 #[doc = "Store a SIMD vector into an array of the same length."]
913 fn store_array_f64x2(self, a: f64x2<Self>, dest: &mut [f64; 2usize]) -> ();
914 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
915 fn cvt_from_bytes_f64x2(self, a: u8x16<Self>) -> f64x2<Self>;
916 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
917 fn cvt_to_bytes_f64x2(self, a: f64x2<Self>) -> u8x16<Self>;
918 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
919 fn slide_f64x2<const SHIFT: usize>(self, a: f64x2<Self>, b: f64x2<Self>) -> f64x2<Self>;
920 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
921 fn slide_within_blocks_f64x2<const SHIFT: usize>(
922 self,
923 a: f64x2<Self>,
924 b: f64x2<Self>,
925 ) -> f64x2<Self>;
926 #[doc = "Compute the absolute value of each element."]
927 fn abs_f64x2(self, a: f64x2<Self>) -> f64x2<Self>;
928 #[doc = "Negate each element of the vector."]
929 fn neg_f64x2(self, a: f64x2<Self>) -> f64x2<Self>;
930 #[doc = "Compute the square root of each element.\n\nNegative elements other than `-0.0` will become NaN."]
931 fn sqrt_f64x2(self, a: f64x2<Self>) -> f64x2<Self>;
932 #[doc = "Add two vectors element-wise."]
933 fn add_f64x2(self, a: f64x2<Self>, b: f64x2<Self>) -> f64x2<Self>;
934 #[doc = "Subtract two vectors element-wise."]
935 fn sub_f64x2(self, a: f64x2<Self>, b: f64x2<Self>) -> f64x2<Self>;
936 #[doc = "Multiply two vectors element-wise."]
937 fn mul_f64x2(self, a: f64x2<Self>, b: f64x2<Self>) -> f64x2<Self>;
938 #[doc = "Divide two vectors element-wise."]
939 fn div_f64x2(self, a: f64x2<Self>, b: f64x2<Self>) -> f64x2<Self>;
940 #[doc = "Return a vector with the magnitude of `a` and the sign of `b` for each element.\n\nThis operation copies the sign bit, so if an input element is NaN, the output element will be a NaN with the same payload and a copied sign bit."]
941 fn copysign_f64x2(self, a: f64x2<Self>, b: f64x2<Self>) -> f64x2<Self>;
942 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
943 fn simd_eq_f64x2(self, a: f64x2<Self>, b: f64x2<Self>) -> mask64x2<Self>;
944 #[doc = "Compare two vectors element-wise for less than.\n\nReturns a mask where each element is all ones if `a` is less than `b`, and all zeroes if not."]
945 fn simd_lt_f64x2(self, a: f64x2<Self>, b: f64x2<Self>) -> mask64x2<Self>;
946 #[doc = "Compare two vectors element-wise for less than or equal.\n\nReturns a mask where each element is all ones if `a` is less than or equal to `b`, and all zeroes if not."]
947 fn simd_le_f64x2(self, a: f64x2<Self>, b: f64x2<Self>) -> mask64x2<Self>;
948 #[doc = "Compare two vectors element-wise for greater than or equal.\n\nReturns a mask where each element is all ones if `a` is greater than or equal to `b`, and all zeroes if not."]
949 fn simd_ge_f64x2(self, a: f64x2<Self>, b: f64x2<Self>) -> mask64x2<Self>;
950 #[doc = "Compare two vectors element-wise for greater than.\n\nReturns a mask where each element is all ones if `a` is greater than `b`, and all zeroes if not."]
951 fn simd_gt_f64x2(self, a: f64x2<Self>, b: f64x2<Self>) -> mask64x2<Self>;
952 #[doc = "Interleave the lower half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, b0, a1, b1]`.\n\n**Note:** This operation is only useful if you need to discard elements `a2, a3, b2, b3`.\n For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
953 fn zip_low_f64x2(self, a: f64x2<Self>, b: f64x2<Self>) -> f64x2<Self>;
954 #[doc = "Interleave the upper half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a2, b2, a3, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a1, b0, b1`.For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
955 fn zip_high_f64x2(self, a: f64x2<Self>, b: f64x2<Self>) -> f64x2<Self>;
956 #[doc = "Extract even-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, a2, b0, b2]`.\n\n**Note:** This operation is only useful if you need to discard elements `a1, a3, b1, b3`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
957 fn unzip_low_f64x2(self, a: f64x2<Self>, b: f64x2<Self>) -> f64x2<Self>;
958 #[doc = "Extract odd-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a1, a3, b1, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a2, b0, b2`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
959 fn unzip_high_f64x2(self, a: f64x2<Self>, b: f64x2<Self>) -> f64x2<Self>;
960 #[doc = "Interleave two vectors.\n\nThe resulting vectors contain elements taken alternately from `a` and `b`, first filling the first result, and then the second.\n\nThe reverse of this operation is `deinterleave`.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `([a0, b0, a1, b1], [a2, b2, a3, b3])`."]
961 fn interleave_f64x2(self, a: f64x2<Self>, b: f64x2<Self>) -> (f64x2<Self>, f64x2<Self>);
962 #[doc = "Deinterleave two vectors.\n\nThe first result contains all even-indexed elements from `a` followed by all even-indexed elements from `b`. The second result contains all odd-indexed elements from `a` followed by all odd-indexed elements from `b`.\n\nThe reverse of this operation is `interleave`.\n\nFor vectors `[a0, b0, a1, b1]` and `[a2, b2, a3, b3]`, returns `([a0, a1, a2, a3], [b0, b1, b2, b3])`."]
963 fn deinterleave_f64x2(self, a: f64x2<Self>, b: f64x2<Self>) -> (f64x2<Self>, f64x2<Self>);
964 #[doc = "Return the element-wise maximum of two vectors.\n\nIf either operand is NaN, the result for that lane is implementation-defined-- it could be either the first or second operand. See `max_precise` for a version that returns the non-NaN operand if only one is NaN.\n\nIf one operand is positive zero and the other is negative zero, the result is also implementation-defined, and it could be either one."]
965 fn max_f64x2(self, a: f64x2<Self>, b: f64x2<Self>) -> f64x2<Self>;
966 #[doc = "Return the element-wise minimum of two vectors.\n\nIf either operand is NaN, the result for that lane is implementation-defined-- it could be either the first or second operand. See `min_precise` for a version that returns the non-NaN operand if only one is NaN.\n\nIf one operand is positive zero and the other is negative zero, the result is also implementation-defined, and it could be either one."]
967 fn min_f64x2(self, a: f64x2<Self>, b: f64x2<Self>) -> f64x2<Self>;
968 #[doc = "Return the element-wise maximum of two vectors.\n\nIf one operand is a quiet NaN and the other is not, this operation will choose the non-NaN operand.\n\nIf one operand is positive zero and the other is negative zero, the result is implementation-defined, and it could be either one.\n\nIf an operand is a *signaling* NaN, the result is not just implementation-defined, but fully non-deterministic: it may be either NaN or the non-NaN operand.\nSignaling NaN values are not produced by floating-point math operations, only from manual initialization with specific bit patterns. You probably don't need to worry about them."]
969 fn max_precise_f64x2(self, a: f64x2<Self>, b: f64x2<Self>) -> f64x2<Self>;
970 #[doc = "Return the element-wise minimum of two vectors.\n\nIf one operand is a quiet NaN and the other is not, this operation will choose the non-NaN operand.\n\nIf one operand is positive zero and the other is negative zero, the result is implementation-defined, and it could be either one.\n\nIf an operand is a *signaling* NaN, the result is not just implementation-defined, but fully non-deterministic: it may be either NaN or the non-NaN operand.\nSignaling NaN values are not produced by floating-point math operations, only from manual initialization with specific bit patterns. You probably don't need to worry about them."]
971 fn min_precise_f64x2(self, a: f64x2<Self>, b: f64x2<Self>) -> f64x2<Self>;
972 #[doc = "Compute `(a * b) + c` (fused multiply-add) for each element.\n\nDepending on hardware support, the result may be computed with only one rounding error, or may be implemented as a regular multiply followed by an add, which will result in two rounding errors."]
973 fn mul_add_f64x2(self, a: f64x2<Self>, b: f64x2<Self>, c: f64x2<Self>) -> f64x2<Self>;
974 #[doc = "Compute `(a * b) - c` (fused multiply-subtract) for each element.\n\nDepending on hardware support, the result may be computed with only one rounding error, or may be implemented as a regular multiply followed by a subtract, which will result in two rounding errors."]
975 fn mul_sub_f64x2(self, a: f64x2<Self>, b: f64x2<Self>, c: f64x2<Self>) -> f64x2<Self>;
976 #[doc = "Return the largest integer less than or equal to each element, that is, round towards negative infinity."]
977 fn floor_f64x2(self, a: f64x2<Self>) -> f64x2<Self>;
978 #[doc = "Return the smallest integer greater than or equal to each element, that is, round towards positive infinity."]
979 fn ceil_f64x2(self, a: f64x2<Self>) -> f64x2<Self>;
980 #[doc = "Round each element to the nearest integer, with ties rounding to the nearest even integer.\n\nThere is no corresponding `round` operation. Rust's `round` operation rounds ties away from zero, a behavior it inherited from C. That behavior is not implemented across all platforms, whereas round-ties-even is."]
981 fn round_ties_even_f64x2(self, a: f64x2<Self>) -> f64x2<Self>;
982 #[doc = "Return the fractional part of each element.\n\nThis is equivalent to `a - a.trunc()`."]
983 fn fract_f64x2(self, a: f64x2<Self>) -> f64x2<Self>;
984 #[doc = "Return the integer part of each element, rounding towards zero."]
985 fn trunc_f64x2(self, a: f64x2<Self>) -> f64x2<Self>;
986 #[doc = "Select elements from b and c based on the mask operand a.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
987 fn select_f64x2(self, a: mask64x2<Self>, b: f64x2<Self>, c: f64x2<Self>) -> f64x2<Self>;
988 #[doc = "Combine two vectors into a single vector with twice the width.\n\n`a` provides the lower elements and `b` provides the upper elements."]
989 fn combine_f64x2(self, a: f64x2<Self>, b: f64x2<Self>) -> f64x4<Self>;
990 #[doc = "Reinterpret the bits of this vector as a vector of `f32` elements.\n\nThe number of elements in the result is twice that of the input."]
991 fn reinterpret_f32_f64x2(self, a: f64x2<Self>) -> f32x4<Self>;
992 #[doc = "Create a SIMD vector with all elements set to the given value."]
993 fn splat_mask64x2(self, val: i64) -> mask64x2<Self>;
994 #[doc = "Create a SIMD vector from an array of the same length."]
995 fn load_array_mask64x2(self, val: [i64; 2usize]) -> mask64x2<Self>;
996 #[doc = "Create a SIMD vector from an array of the same length."]
997 fn load_array_ref_mask64x2(self, val: &[i64; 2usize]) -> mask64x2<Self>;
998 #[doc = "Convert a SIMD vector to an array."]
999 fn as_array_mask64x2(self, a: mask64x2<Self>) -> [i64; 2usize];
1000 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
1001 fn as_array_ref_mask64x2(self, a: &mask64x2<Self>) -> &[i64; 2usize];
1002 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
1003 fn as_array_mut_mask64x2(self, a: &mut mask64x2<Self>) -> &mut [i64; 2usize];
1004 #[doc = "Store a SIMD vector into an array of the same length."]
1005 fn store_array_mask64x2(self, a: mask64x2<Self>, dest: &mut [i64; 2usize]) -> ();
1006 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
1007 fn cvt_from_bytes_mask64x2(self, a: u8x16<Self>) -> mask64x2<Self>;
1008 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
1009 fn cvt_to_bytes_mask64x2(self, a: mask64x2<Self>) -> u8x16<Self>;
1010 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
1011 fn slide_mask64x2<const SHIFT: usize>(
1012 self,
1013 a: mask64x2<Self>,
1014 b: mask64x2<Self>,
1015 ) -> mask64x2<Self>;
1016 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
1017 fn slide_within_blocks_mask64x2<const SHIFT: usize>(
1018 self,
1019 a: mask64x2<Self>,
1020 b: mask64x2<Self>,
1021 ) -> mask64x2<Self>;
1022 #[doc = "Compute the logical AND of two masks."]
1023 fn and_mask64x2(self, a: mask64x2<Self>, b: mask64x2<Self>) -> mask64x2<Self>;
1024 #[doc = "Compute the logical OR of two masks."]
1025 fn or_mask64x2(self, a: mask64x2<Self>, b: mask64x2<Self>) -> mask64x2<Self>;
1026 #[doc = "Compute the logical XOR of two masks."]
1027 fn xor_mask64x2(self, a: mask64x2<Self>, b: mask64x2<Self>) -> mask64x2<Self>;
1028 #[doc = "Compute the logical NOT of the mask."]
1029 fn not_mask64x2(self, a: mask64x2<Self>) -> mask64x2<Self>;
1030 #[doc = "Select elements from `b` and `c` based on the mask operand `a`.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
1031 fn select_mask64x2(
1032 self,
1033 a: mask64x2<Self>,
1034 b: mask64x2<Self>,
1035 c: mask64x2<Self>,
1036 ) -> mask64x2<Self>;
1037 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
1038 fn simd_eq_mask64x2(self, a: mask64x2<Self>, b: mask64x2<Self>) -> mask64x2<Self>;
1039 #[doc = "Returns true if any elements in this mask are true (all ones).\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
1040 fn any_true_mask64x2(self, a: mask64x2<Self>) -> bool;
1041 #[doc = "Returns true if all elements in this mask are true (all ones).\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
1042 fn all_true_mask64x2(self, a: mask64x2<Self>) -> bool;
1043 #[doc = "Returns true if any elements in this mask are false (all zeroes).\n\nThis is logically equivalent to `!all_true`, but may be faster.\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
1044 fn any_false_mask64x2(self, a: mask64x2<Self>) -> bool;
1045 #[doc = "Returns true if all elements in this mask are false (all zeroes).\n\nThis is logically equivalent to `!any_true`, but may be faster.\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
1046 fn all_false_mask64x2(self, a: mask64x2<Self>) -> bool;
1047 #[doc = "Combine two vectors into a single vector with twice the width.\n\n`a` provides the lower elements and `b` provides the upper elements."]
1048 fn combine_mask64x2(self, a: mask64x2<Self>, b: mask64x2<Self>) -> mask64x4<Self>;
1049 #[doc = "Create a SIMD vector with all elements set to the given value."]
1050 fn splat_f32x8(self, val: f32) -> f32x8<Self>;
1051 #[doc = "Create a SIMD vector from an array of the same length."]
1052 fn load_array_f32x8(self, val: [f32; 8usize]) -> f32x8<Self>;
1053 #[doc = "Create a SIMD vector from an array of the same length."]
1054 fn load_array_ref_f32x8(self, val: &[f32; 8usize]) -> f32x8<Self>;
1055 #[doc = "Convert a SIMD vector to an array."]
1056 fn as_array_f32x8(self, a: f32x8<Self>) -> [f32; 8usize];
1057 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
1058 fn as_array_ref_f32x8(self, a: &f32x8<Self>) -> &[f32; 8usize];
1059 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
1060 fn as_array_mut_f32x8(self, a: &mut f32x8<Self>) -> &mut [f32; 8usize];
1061 #[doc = "Store a SIMD vector into an array of the same length."]
1062 fn store_array_f32x8(self, a: f32x8<Self>, dest: &mut [f32; 8usize]) -> ();
1063 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
1064 fn cvt_from_bytes_f32x8(self, a: u8x32<Self>) -> f32x8<Self>;
1065 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
1066 fn cvt_to_bytes_f32x8(self, a: f32x8<Self>) -> u8x32<Self>;
1067 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
1068 fn slide_f32x8<const SHIFT: usize>(self, a: f32x8<Self>, b: f32x8<Self>) -> f32x8<Self>;
1069 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
1070 fn slide_within_blocks_f32x8<const SHIFT: usize>(
1071 self,
1072 a: f32x8<Self>,
1073 b: f32x8<Self>,
1074 ) -> f32x8<Self>;
1075 #[doc = "Compute the absolute value of each element."]
1076 fn abs_f32x8(self, a: f32x8<Self>) -> f32x8<Self>;
1077 #[doc = "Negate each element of the vector."]
1078 fn neg_f32x8(self, a: f32x8<Self>) -> f32x8<Self>;
1079 #[doc = "Compute the square root of each element.\n\nNegative elements other than `-0.0` will become NaN."]
1080 fn sqrt_f32x8(self, a: f32x8<Self>) -> f32x8<Self>;
1081 #[doc = "Add two vectors element-wise."]
1082 fn add_f32x8(self, a: f32x8<Self>, b: f32x8<Self>) -> f32x8<Self>;
1083 #[doc = "Subtract two vectors element-wise."]
1084 fn sub_f32x8(self, a: f32x8<Self>, b: f32x8<Self>) -> f32x8<Self>;
1085 #[doc = "Multiply two vectors element-wise."]
1086 fn mul_f32x8(self, a: f32x8<Self>, b: f32x8<Self>) -> f32x8<Self>;
1087 #[doc = "Divide two vectors element-wise."]
1088 fn div_f32x8(self, a: f32x8<Self>, b: f32x8<Self>) -> f32x8<Self>;
1089 #[doc = "Return a vector with the magnitude of `a` and the sign of `b` for each element.\n\nThis operation copies the sign bit, so if an input element is NaN, the output element will be a NaN with the same payload and a copied sign bit."]
1090 fn copysign_f32x8(self, a: f32x8<Self>, b: f32x8<Self>) -> f32x8<Self>;
1091 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
1092 fn simd_eq_f32x8(self, a: f32x8<Self>, b: f32x8<Self>) -> mask32x8<Self>;
1093 #[doc = "Compare two vectors element-wise for less than.\n\nReturns a mask where each element is all ones if `a` is less than `b`, and all zeroes if not."]
1094 fn simd_lt_f32x8(self, a: f32x8<Self>, b: f32x8<Self>) -> mask32x8<Self>;
1095 #[doc = "Compare two vectors element-wise for less than or equal.\n\nReturns a mask where each element is all ones if `a` is less than or equal to `b`, and all zeroes if not."]
1096 fn simd_le_f32x8(self, a: f32x8<Self>, b: f32x8<Self>) -> mask32x8<Self>;
1097 #[doc = "Compare two vectors element-wise for greater than or equal.\n\nReturns a mask where each element is all ones if `a` is greater than or equal to `b`, and all zeroes if not."]
1098 fn simd_ge_f32x8(self, a: f32x8<Self>, b: f32x8<Self>) -> mask32x8<Self>;
1099 #[doc = "Compare two vectors element-wise for greater than.\n\nReturns a mask where each element is all ones if `a` is greater than `b`, and all zeroes if not."]
1100 fn simd_gt_f32x8(self, a: f32x8<Self>, b: f32x8<Self>) -> mask32x8<Self>;
1101 #[doc = "Interleave the lower half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, b0, a1, b1]`.\n\n**Note:** This operation is only useful if you need to discard elements `a2, a3, b2, b3`.\n For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
1102 fn zip_low_f32x8(self, a: f32x8<Self>, b: f32x8<Self>) -> f32x8<Self>;
1103 #[doc = "Interleave the upper half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a2, b2, a3, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a1, b0, b1`.For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
1104 fn zip_high_f32x8(self, a: f32x8<Self>, b: f32x8<Self>) -> f32x8<Self>;
1105 #[doc = "Extract even-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, a2, b0, b2]`.\n\n**Note:** This operation is only useful if you need to discard elements `a1, a3, b1, b3`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
1106 fn unzip_low_f32x8(self, a: f32x8<Self>, b: f32x8<Self>) -> f32x8<Self>;
1107 #[doc = "Extract odd-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a1, a3, b1, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a2, b0, b2`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
1108 fn unzip_high_f32x8(self, a: f32x8<Self>, b: f32x8<Self>) -> f32x8<Self>;
1109 #[doc = "Interleave two vectors.\n\nThe resulting vectors contain elements taken alternately from `a` and `b`, first filling the first result, and then the second.\n\nThe reverse of this operation is `deinterleave`.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `([a0, b0, a1, b1], [a2, b2, a3, b3])`."]
1110 fn interleave_f32x8(self, a: f32x8<Self>, b: f32x8<Self>) -> (f32x8<Self>, f32x8<Self>);
1111 #[doc = "Deinterleave two vectors.\n\nThe first result contains all even-indexed elements from `a` followed by all even-indexed elements from `b`. The second result contains all odd-indexed elements from `a` followed by all odd-indexed elements from `b`.\n\nThe reverse of this operation is `interleave`.\n\nFor vectors `[a0, b0, a1, b1]` and `[a2, b2, a3, b3]`, returns `([a0, a1, a2, a3], [b0, b1, b2, b3])`."]
1112 fn deinterleave_f32x8(self, a: f32x8<Self>, b: f32x8<Self>) -> (f32x8<Self>, f32x8<Self>);
1113 #[doc = "Return the element-wise maximum of two vectors.\n\nIf either operand is NaN, the result for that lane is implementation-defined-- it could be either the first or second operand. See `max_precise` for a version that returns the non-NaN operand if only one is NaN.\n\nIf one operand is positive zero and the other is negative zero, the result is also implementation-defined, and it could be either one."]
1114 fn max_f32x8(self, a: f32x8<Self>, b: f32x8<Self>) -> f32x8<Self>;
1115 #[doc = "Return the element-wise minimum of two vectors.\n\nIf either operand is NaN, the result for that lane is implementation-defined-- it could be either the first or second operand. See `min_precise` for a version that returns the non-NaN operand if only one is NaN.\n\nIf one operand is positive zero and the other is negative zero, the result is also implementation-defined, and it could be either one."]
1116 fn min_f32x8(self, a: f32x8<Self>, b: f32x8<Self>) -> f32x8<Self>;
1117 #[doc = "Return the element-wise maximum of two vectors.\n\nIf one operand is a quiet NaN and the other is not, this operation will choose the non-NaN operand.\n\nIf one operand is positive zero and the other is negative zero, the result is implementation-defined, and it could be either one.\n\nIf an operand is a *signaling* NaN, the result is not just implementation-defined, but fully non-deterministic: it may be either NaN or the non-NaN operand.\nSignaling NaN values are not produced by floating-point math operations, only from manual initialization with specific bit patterns. You probably don't need to worry about them."]
1118 fn max_precise_f32x8(self, a: f32x8<Self>, b: f32x8<Self>) -> f32x8<Self>;
1119 #[doc = "Return the element-wise minimum of two vectors.\n\nIf one operand is a quiet NaN and the other is not, this operation will choose the non-NaN operand.\n\nIf one operand is positive zero and the other is negative zero, the result is implementation-defined, and it could be either one.\n\nIf an operand is a *signaling* NaN, the result is not just implementation-defined, but fully non-deterministic: it may be either NaN or the non-NaN operand.\nSignaling NaN values are not produced by floating-point math operations, only from manual initialization with specific bit patterns. You probably don't need to worry about them."]
1120 fn min_precise_f32x8(self, a: f32x8<Self>, b: f32x8<Self>) -> f32x8<Self>;
1121 #[doc = "Compute `(a * b) + c` (fused multiply-add) for each element.\n\nDepending on hardware support, the result may be computed with only one rounding error, or may be implemented as a regular multiply followed by an add, which will result in two rounding errors."]
1122 fn mul_add_f32x8(self, a: f32x8<Self>, b: f32x8<Self>, c: f32x8<Self>) -> f32x8<Self>;
1123 #[doc = "Compute `(a * b) - c` (fused multiply-subtract) for each element.\n\nDepending on hardware support, the result may be computed with only one rounding error, or may be implemented as a regular multiply followed by a subtract, which will result in two rounding errors."]
1124 fn mul_sub_f32x8(self, a: f32x8<Self>, b: f32x8<Self>, c: f32x8<Self>) -> f32x8<Self>;
1125 #[doc = "Return the largest integer less than or equal to each element, that is, round towards negative infinity."]
1126 fn floor_f32x8(self, a: f32x8<Self>) -> f32x8<Self>;
1127 #[doc = "Return the smallest integer greater than or equal to each element, that is, round towards positive infinity."]
1128 fn ceil_f32x8(self, a: f32x8<Self>) -> f32x8<Self>;
1129 #[doc = "Round each element to the nearest integer, with ties rounding to the nearest even integer.\n\nThere is no corresponding `round` operation. Rust's `round` operation rounds ties away from zero, a behavior it inherited from C. That behavior is not implemented across all platforms, whereas round-ties-even is."]
1130 fn round_ties_even_f32x8(self, a: f32x8<Self>) -> f32x8<Self>;
1131 #[doc = "Return the fractional part of each element.\n\nThis is equivalent to `a - a.trunc()`."]
1132 fn fract_f32x8(self, a: f32x8<Self>) -> f32x8<Self>;
1133 #[doc = "Return the integer part of each element, rounding towards zero."]
1134 fn trunc_f32x8(self, a: f32x8<Self>) -> f32x8<Self>;
1135 #[doc = "Select elements from b and c based on the mask operand a.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
1136 fn select_f32x8(self, a: mask32x8<Self>, b: f32x8<Self>, c: f32x8<Self>) -> f32x8<Self>;
1137 #[doc = "Combine two vectors into a single vector with twice the width.\n\n`a` provides the lower elements and `b` provides the upper elements."]
1138 fn combine_f32x8(self, a: f32x8<Self>, b: f32x8<Self>) -> f32x16<Self>;
1139 #[doc = "Split a vector into two vectors of half the width.\n\nReturns a tuple of (lower half, upper half)."]
1140 fn split_f32x8(self, a: f32x8<Self>) -> (f32x4<Self>, f32x4<Self>);
1141 #[doc = "Reinterpret the bits of this vector as a vector of `f64` elements.\n\nThe number of elements in the result is half that of the input."]
1142 fn reinterpret_f64_f32x8(self, a: f32x8<Self>) -> f64x4<Self>;
1143 #[doc = "Reinterpret the bits of this vector as a vector of `i32` elements.\n\nThis is a bitwise reinterpretation only, and does not perform any conversions."]
1144 fn reinterpret_i32_f32x8(self, a: f32x8<Self>) -> i32x8<Self>;
1145 #[doc = "Reinterpret the bits of this vector as a vector of `u8` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
1146 fn reinterpret_u8_f32x8(self, a: f32x8<Self>) -> u8x32<Self>;
1147 #[doc = "Reinterpret the bits of this vector as a vector of `u32` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
1148 fn reinterpret_u32_f32x8(self, a: f32x8<Self>) -> u32x8<Self>;
1149 #[doc = "Convert each floating-point element to an unsigned 32-bit integer, truncating towards zero.\n\nOut-of-range values or NaN will produce implementation-defined results.\n\nOn x86 platforms, this operation will still be slower than converting to `i32`, because there is no native instruction for converting to `u32` (at least until AVX-512, which is currently not supported).\nIf you know your values fit within range of an `i32`, you should convert to an `i32` and cast to your desired datatype afterwards."]
1150 fn cvt_u32_f32x8(self, a: f32x8<Self>) -> u32x8<Self>;
1151 #[doc = "Convert each floating-point element to an unsigned 32-bit integer, truncating towards zero.\n\nOut-of-range values are saturated to the closest in-range value. NaN becomes 0."]
1152 fn cvt_u32_precise_f32x8(self, a: f32x8<Self>) -> u32x8<Self>;
1153 #[doc = "Convert each floating-point element to a signed 32-bit integer, truncating towards zero.\n\nOut-of-range values or NaN will produce implementation-defined results."]
1154 fn cvt_i32_f32x8(self, a: f32x8<Self>) -> i32x8<Self>;
1155 #[doc = "Convert each floating-point element to a signed 32-bit integer, truncating towards zero.\n\nOut-of-range values are saturated to the closest in-range value. NaN becomes 0."]
1156 fn cvt_i32_precise_f32x8(self, a: f32x8<Self>) -> i32x8<Self>;
1157 #[doc = "Create a SIMD vector with all elements set to the given value."]
1158 fn splat_i8x32(self, val: i8) -> i8x32<Self>;
1159 #[doc = "Create a SIMD vector from an array of the same length."]
1160 fn load_array_i8x32(self, val: [i8; 32usize]) -> i8x32<Self>;
1161 #[doc = "Create a SIMD vector from an array of the same length."]
1162 fn load_array_ref_i8x32(self, val: &[i8; 32usize]) -> i8x32<Self>;
1163 #[doc = "Convert a SIMD vector to an array."]
1164 fn as_array_i8x32(self, a: i8x32<Self>) -> [i8; 32usize];
1165 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
1166 fn as_array_ref_i8x32(self, a: &i8x32<Self>) -> &[i8; 32usize];
1167 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
1168 fn as_array_mut_i8x32(self, a: &mut i8x32<Self>) -> &mut [i8; 32usize];
1169 #[doc = "Store a SIMD vector into an array of the same length."]
1170 fn store_array_i8x32(self, a: i8x32<Self>, dest: &mut [i8; 32usize]) -> ();
1171 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
1172 fn cvt_from_bytes_i8x32(self, a: u8x32<Self>) -> i8x32<Self>;
1173 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
1174 fn cvt_to_bytes_i8x32(self, a: i8x32<Self>) -> u8x32<Self>;
1175 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
1176 fn slide_i8x32<const SHIFT: usize>(self, a: i8x32<Self>, b: i8x32<Self>) -> i8x32<Self>;
1177 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
1178 fn slide_within_blocks_i8x32<const SHIFT: usize>(
1179 self,
1180 a: i8x32<Self>,
1181 b: i8x32<Self>,
1182 ) -> i8x32<Self>;
1183 #[doc = "Add two vectors element-wise, wrapping on overflow."]
1184 fn add_i8x32(self, a: i8x32<Self>, b: i8x32<Self>) -> i8x32<Self>;
1185 #[doc = "Subtract two vectors element-wise, wrapping on overflow."]
1186 fn sub_i8x32(self, a: i8x32<Self>, b: i8x32<Self>) -> i8x32<Self>;
1187 #[doc = "Multiply two vectors element-wise, wrapping on overflow."]
1188 fn mul_i8x32(self, a: i8x32<Self>, b: i8x32<Self>) -> i8x32<Self>;
1189 #[doc = "Compute the bitwise AND of two vectors."]
1190 fn and_i8x32(self, a: i8x32<Self>, b: i8x32<Self>) -> i8x32<Self>;
1191 #[doc = "Compute the bitwise OR of two vectors."]
1192 fn or_i8x32(self, a: i8x32<Self>, b: i8x32<Self>) -> i8x32<Self>;
1193 #[doc = "Compute the bitwise XOR of two vectors."]
1194 fn xor_i8x32(self, a: i8x32<Self>, b: i8x32<Self>) -> i8x32<Self>;
1195 #[doc = "Compute the bitwise NOT of the vector."]
1196 fn not_i8x32(self, a: i8x32<Self>) -> i8x32<Self>;
1197 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right."]
1198 fn shl_i8x32(self, a: i8x32<Self>, shift: u32) -> i8x32<Self>;
1199 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
1200 fn shlv_i8x32(self, a: i8x32<Self>, b: i8x32<Self>) -> i8x32<Self>;
1201 #[doc = "Shift each element right by the given number of bits.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated."]
1202 fn shr_i8x32(self, a: i8x32<Self>, shift: u32) -> i8x32<Self>;
1203 #[doc = "Shift each element right by the corresponding element in another vector.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
1204 fn shrv_i8x32(self, a: i8x32<Self>, b: i8x32<Self>) -> i8x32<Self>;
1205 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
1206 fn simd_eq_i8x32(self, a: i8x32<Self>, b: i8x32<Self>) -> mask8x32<Self>;
1207 #[doc = "Compare two vectors element-wise for less than.\n\nReturns a mask where each element is all ones if `a` is less than `b`, and all zeroes if not."]
1208 fn simd_lt_i8x32(self, a: i8x32<Self>, b: i8x32<Self>) -> mask8x32<Self>;
1209 #[doc = "Compare two vectors element-wise for less than or equal.\n\nReturns a mask where each element is all ones if `a` is less than or equal to `b`, and all zeroes if not."]
1210 fn simd_le_i8x32(self, a: i8x32<Self>, b: i8x32<Self>) -> mask8x32<Self>;
1211 #[doc = "Compare two vectors element-wise for greater than or equal.\n\nReturns a mask where each element is all ones if `a` is greater than or equal to `b`, and all zeroes if not."]
1212 fn simd_ge_i8x32(self, a: i8x32<Self>, b: i8x32<Self>) -> mask8x32<Self>;
1213 #[doc = "Compare two vectors element-wise for greater than.\n\nReturns a mask where each element is all ones if `a` is greater than `b`, and all zeroes if not."]
1214 fn simd_gt_i8x32(self, a: i8x32<Self>, b: i8x32<Self>) -> mask8x32<Self>;
1215 #[doc = "Interleave the lower half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, b0, a1, b1]`.\n\n**Note:** This operation is only useful if you need to discard elements `a2, a3, b2, b3`.\n For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
1216 fn zip_low_i8x32(self, a: i8x32<Self>, b: i8x32<Self>) -> i8x32<Self>;
1217 #[doc = "Interleave the upper half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a2, b2, a3, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a1, b0, b1`.For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
1218 fn zip_high_i8x32(self, a: i8x32<Self>, b: i8x32<Self>) -> i8x32<Self>;
1219 #[doc = "Extract even-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, a2, b0, b2]`.\n\n**Note:** This operation is only useful if you need to discard elements `a1, a3, b1, b3`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
1220 fn unzip_low_i8x32(self, a: i8x32<Self>, b: i8x32<Self>) -> i8x32<Self>;
1221 #[doc = "Extract odd-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a1, a3, b1, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a2, b0, b2`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
1222 fn unzip_high_i8x32(self, a: i8x32<Self>, b: i8x32<Self>) -> i8x32<Self>;
1223 #[doc = "Interleave two vectors.\n\nThe resulting vectors contain elements taken alternately from `a` and `b`, first filling the first result, and then the second.\n\nThe reverse of this operation is `deinterleave`.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `([a0, b0, a1, b1], [a2, b2, a3, b3])`."]
1224 fn interleave_i8x32(self, a: i8x32<Self>, b: i8x32<Self>) -> (i8x32<Self>, i8x32<Self>);
1225 #[doc = "Deinterleave two vectors.\n\nThe first result contains all even-indexed elements from `a` followed by all even-indexed elements from `b`. The second result contains all odd-indexed elements from `a` followed by all odd-indexed elements from `b`.\n\nThe reverse of this operation is `interleave`.\n\nFor vectors `[a0, b0, a1, b1]` and `[a2, b2, a3, b3]`, returns `([a0, a1, a2, a3], [b0, b1, b2, b3])`."]
1226 fn deinterleave_i8x32(self, a: i8x32<Self>, b: i8x32<Self>) -> (i8x32<Self>, i8x32<Self>);
1227 #[doc = "Select elements from b and c based on the mask operand a.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
1228 fn select_i8x32(self, a: mask8x32<Self>, b: i8x32<Self>, c: i8x32<Self>) -> i8x32<Self>;
1229 #[doc = "Return the element-wise minimum of two vectors."]
1230 fn min_i8x32(self, a: i8x32<Self>, b: i8x32<Self>) -> i8x32<Self>;
1231 #[doc = "Return the element-wise maximum of two vectors."]
1232 fn max_i8x32(self, a: i8x32<Self>, b: i8x32<Self>) -> i8x32<Self>;
1233 #[doc = "Combine two vectors into a single vector with twice the width.\n\n`a` provides the lower elements and `b` provides the upper elements."]
1234 fn combine_i8x32(self, a: i8x32<Self>, b: i8x32<Self>) -> i8x64<Self>;
1235 #[doc = "Split a vector into two vectors of half the width.\n\nReturns a tuple of (lower half, upper half)."]
1236 fn split_i8x32(self, a: i8x32<Self>) -> (i8x16<Self>, i8x16<Self>);
1237 #[doc = "Negate each element of the vector, wrapping on overflow."]
1238 fn neg_i8x32(self, a: i8x32<Self>) -> i8x32<Self>;
1239 #[doc = "Reinterpret the bits of this vector as a vector of `u8` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
1240 fn reinterpret_u8_i8x32(self, a: i8x32<Self>) -> u8x32<Self>;
1241 #[doc = "Reinterpret the bits of this vector as a vector of `u32` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
1242 fn reinterpret_u32_i8x32(self, a: i8x32<Self>) -> u32x8<Self>;
1243 #[doc = "Create a SIMD vector with all elements set to the given value."]
1244 fn splat_u8x32(self, val: u8) -> u8x32<Self>;
1245 #[doc = "Create a SIMD vector from an array of the same length."]
1246 fn load_array_u8x32(self, val: [u8; 32usize]) -> u8x32<Self>;
1247 #[doc = "Create a SIMD vector from an array of the same length."]
1248 fn load_array_ref_u8x32(self, val: &[u8; 32usize]) -> u8x32<Self>;
1249 #[doc = "Convert a SIMD vector to an array."]
1250 fn as_array_u8x32(self, a: u8x32<Self>) -> [u8; 32usize];
1251 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
1252 fn as_array_ref_u8x32(self, a: &u8x32<Self>) -> &[u8; 32usize];
1253 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
1254 fn as_array_mut_u8x32(self, a: &mut u8x32<Self>) -> &mut [u8; 32usize];
1255 #[doc = "Store a SIMD vector into an array of the same length."]
1256 fn store_array_u8x32(self, a: u8x32<Self>, dest: &mut [u8; 32usize]) -> ();
1257 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
1258 fn cvt_from_bytes_u8x32(self, a: u8x32<Self>) -> u8x32<Self>;
1259 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
1260 fn cvt_to_bytes_u8x32(self, a: u8x32<Self>) -> u8x32<Self>;
1261 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
1262 fn slide_u8x32<const SHIFT: usize>(self, a: u8x32<Self>, b: u8x32<Self>) -> u8x32<Self>;
1263 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
1264 fn slide_within_blocks_u8x32<const SHIFT: usize>(
1265 self,
1266 a: u8x32<Self>,
1267 b: u8x32<Self>,
1268 ) -> u8x32<Self>;
1269 #[doc = "Add two vectors element-wise, wrapping on overflow."]
1270 fn add_u8x32(self, a: u8x32<Self>, b: u8x32<Self>) -> u8x32<Self>;
1271 #[doc = "Subtract two vectors element-wise, wrapping on overflow."]
1272 fn sub_u8x32(self, a: u8x32<Self>, b: u8x32<Self>) -> u8x32<Self>;
1273 #[doc = "Multiply two vectors element-wise, wrapping on overflow."]
1274 fn mul_u8x32(self, a: u8x32<Self>, b: u8x32<Self>) -> u8x32<Self>;
1275 #[doc = "Compute the bitwise AND of two vectors."]
1276 fn and_u8x32(self, a: u8x32<Self>, b: u8x32<Self>) -> u8x32<Self>;
1277 #[doc = "Compute the bitwise OR of two vectors."]
1278 fn or_u8x32(self, a: u8x32<Self>, b: u8x32<Self>) -> u8x32<Self>;
1279 #[doc = "Compute the bitwise XOR of two vectors."]
1280 fn xor_u8x32(self, a: u8x32<Self>, b: u8x32<Self>) -> u8x32<Self>;
1281 #[doc = "Compute the bitwise NOT of the vector."]
1282 fn not_u8x32(self, a: u8x32<Self>) -> u8x32<Self>;
1283 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right."]
1284 fn shl_u8x32(self, a: u8x32<Self>, shift: u32) -> u8x32<Self>;
1285 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
1286 fn shlv_u8x32(self, a: u8x32<Self>, b: u8x32<Self>) -> u8x32<Self>;
1287 #[doc = "Shift each element right by the given number of bits.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated."]
1288 fn shr_u8x32(self, a: u8x32<Self>, shift: u32) -> u8x32<Self>;
1289 #[doc = "Shift each element right by the corresponding element in another vector.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
1290 fn shrv_u8x32(self, a: u8x32<Self>, b: u8x32<Self>) -> u8x32<Self>;
1291 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
1292 fn simd_eq_u8x32(self, a: u8x32<Self>, b: u8x32<Self>) -> mask8x32<Self>;
1293 #[doc = "Compare two vectors element-wise for less than.\n\nReturns a mask where each element is all ones if `a` is less than `b`, and all zeroes if not."]
1294 fn simd_lt_u8x32(self, a: u8x32<Self>, b: u8x32<Self>) -> mask8x32<Self>;
1295 #[doc = "Compare two vectors element-wise for less than or equal.\n\nReturns a mask where each element is all ones if `a` is less than or equal to `b`, and all zeroes if not."]
1296 fn simd_le_u8x32(self, a: u8x32<Self>, b: u8x32<Self>) -> mask8x32<Self>;
1297 #[doc = "Compare two vectors element-wise for greater than or equal.\n\nReturns a mask where each element is all ones if `a` is greater than or equal to `b`, and all zeroes if not."]
1298 fn simd_ge_u8x32(self, a: u8x32<Self>, b: u8x32<Self>) -> mask8x32<Self>;
1299 #[doc = "Compare two vectors element-wise for greater than.\n\nReturns a mask where each element is all ones if `a` is greater than `b`, and all zeroes if not."]
1300 fn simd_gt_u8x32(self, a: u8x32<Self>, b: u8x32<Self>) -> mask8x32<Self>;
1301 #[doc = "Interleave the lower half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, b0, a1, b1]`.\n\n**Note:** This operation is only useful if you need to discard elements `a2, a3, b2, b3`.\n For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
1302 fn zip_low_u8x32(self, a: u8x32<Self>, b: u8x32<Self>) -> u8x32<Self>;
1303 #[doc = "Interleave the upper half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a2, b2, a3, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a1, b0, b1`.For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
1304 fn zip_high_u8x32(self, a: u8x32<Self>, b: u8x32<Self>) -> u8x32<Self>;
1305 #[doc = "Extract even-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, a2, b0, b2]`.\n\n**Note:** This operation is only useful if you need to discard elements `a1, a3, b1, b3`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
1306 fn unzip_low_u8x32(self, a: u8x32<Self>, b: u8x32<Self>) -> u8x32<Self>;
1307 #[doc = "Extract odd-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a1, a3, b1, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a2, b0, b2`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
1308 fn unzip_high_u8x32(self, a: u8x32<Self>, b: u8x32<Self>) -> u8x32<Self>;
1309 #[doc = "Interleave two vectors.\n\nThe resulting vectors contain elements taken alternately from `a` and `b`, first filling the first result, and then the second.\n\nThe reverse of this operation is `deinterleave`.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `([a0, b0, a1, b1], [a2, b2, a3, b3])`."]
1310 fn interleave_u8x32(self, a: u8x32<Self>, b: u8x32<Self>) -> (u8x32<Self>, u8x32<Self>);
1311 #[doc = "Deinterleave two vectors.\n\nThe first result contains all even-indexed elements from `a` followed by all even-indexed elements from `b`. The second result contains all odd-indexed elements from `a` followed by all odd-indexed elements from `b`.\n\nThe reverse of this operation is `interleave`.\n\nFor vectors `[a0, b0, a1, b1]` and `[a2, b2, a3, b3]`, returns `([a0, a1, a2, a3], [b0, b1, b2, b3])`."]
1312 fn deinterleave_u8x32(self, a: u8x32<Self>, b: u8x32<Self>) -> (u8x32<Self>, u8x32<Self>);
1313 #[doc = "Select elements from b and c based on the mask operand a.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
1314 fn select_u8x32(self, a: mask8x32<Self>, b: u8x32<Self>, c: u8x32<Self>) -> u8x32<Self>;
1315 #[doc = "Return the element-wise minimum of two vectors."]
1316 fn min_u8x32(self, a: u8x32<Self>, b: u8x32<Self>) -> u8x32<Self>;
1317 #[doc = "Return the element-wise maximum of two vectors."]
1318 fn max_u8x32(self, a: u8x32<Self>, b: u8x32<Self>) -> u8x32<Self>;
1319 #[doc = "Combine two vectors into a single vector with twice the width.\n\n`a` provides the lower elements and `b` provides the upper elements."]
1320 fn combine_u8x32(self, a: u8x32<Self>, b: u8x32<Self>) -> u8x64<Self>;
1321 #[doc = "Split a vector into two vectors of half the width.\n\nReturns a tuple of (lower half, upper half)."]
1322 fn split_u8x32(self, a: u8x32<Self>) -> (u8x16<Self>, u8x16<Self>);
1323 #[doc = "Zero-extend each element to a wider integer type.\n\nThe number of elements in the result is half that of the input."]
1324 fn widen_u8x32(self, a: u8x32<Self>) -> u16x32<Self>;
1325 #[doc = "Reinterpret the bits of this vector as a vector of `u32` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
1326 fn reinterpret_u32_u8x32(self, a: u8x32<Self>) -> u32x8<Self>;
1327 #[doc = "Create a SIMD vector with all elements set to the given value."]
1328 fn splat_mask8x32(self, val: i8) -> mask8x32<Self>;
1329 #[doc = "Create a SIMD vector from an array of the same length."]
1330 fn load_array_mask8x32(self, val: [i8; 32usize]) -> mask8x32<Self>;
1331 #[doc = "Create a SIMD vector from an array of the same length."]
1332 fn load_array_ref_mask8x32(self, val: &[i8; 32usize]) -> mask8x32<Self>;
1333 #[doc = "Convert a SIMD vector to an array."]
1334 fn as_array_mask8x32(self, a: mask8x32<Self>) -> [i8; 32usize];
1335 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
1336 fn as_array_ref_mask8x32(self, a: &mask8x32<Self>) -> &[i8; 32usize];
1337 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
1338 fn as_array_mut_mask8x32(self, a: &mut mask8x32<Self>) -> &mut [i8; 32usize];
1339 #[doc = "Store a SIMD vector into an array of the same length."]
1340 fn store_array_mask8x32(self, a: mask8x32<Self>, dest: &mut [i8; 32usize]) -> ();
1341 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
1342 fn cvt_from_bytes_mask8x32(self, a: u8x32<Self>) -> mask8x32<Self>;
1343 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
1344 fn cvt_to_bytes_mask8x32(self, a: mask8x32<Self>) -> u8x32<Self>;
1345 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
1346 fn slide_mask8x32<const SHIFT: usize>(
1347 self,
1348 a: mask8x32<Self>,
1349 b: mask8x32<Self>,
1350 ) -> mask8x32<Self>;
1351 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
1352 fn slide_within_blocks_mask8x32<const SHIFT: usize>(
1353 self,
1354 a: mask8x32<Self>,
1355 b: mask8x32<Self>,
1356 ) -> mask8x32<Self>;
1357 #[doc = "Compute the logical AND of two masks."]
1358 fn and_mask8x32(self, a: mask8x32<Self>, b: mask8x32<Self>) -> mask8x32<Self>;
1359 #[doc = "Compute the logical OR of two masks."]
1360 fn or_mask8x32(self, a: mask8x32<Self>, b: mask8x32<Self>) -> mask8x32<Self>;
1361 #[doc = "Compute the logical XOR of two masks."]
1362 fn xor_mask8x32(self, a: mask8x32<Self>, b: mask8x32<Self>) -> mask8x32<Self>;
1363 #[doc = "Compute the logical NOT of the mask."]
1364 fn not_mask8x32(self, a: mask8x32<Self>) -> mask8x32<Self>;
1365 #[doc = "Select elements from `b` and `c` based on the mask operand `a`.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
1366 fn select_mask8x32(
1367 self,
1368 a: mask8x32<Self>,
1369 b: mask8x32<Self>,
1370 c: mask8x32<Self>,
1371 ) -> mask8x32<Self>;
1372 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
1373 fn simd_eq_mask8x32(self, a: mask8x32<Self>, b: mask8x32<Self>) -> mask8x32<Self>;
1374 #[doc = "Returns true if any elements in this mask are true (all ones).\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
1375 fn any_true_mask8x32(self, a: mask8x32<Self>) -> bool;
1376 #[doc = "Returns true if all elements in this mask are true (all ones).\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
1377 fn all_true_mask8x32(self, a: mask8x32<Self>) -> bool;
1378 #[doc = "Returns true if any elements in this mask are false (all zeroes).\n\nThis is logically equivalent to `!all_true`, but may be faster.\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
1379 fn any_false_mask8x32(self, a: mask8x32<Self>) -> bool;
1380 #[doc = "Returns true if all elements in this mask are false (all zeroes).\n\nThis is logically equivalent to `!any_true`, but may be faster.\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
1381 fn all_false_mask8x32(self, a: mask8x32<Self>) -> bool;
1382 #[doc = "Combine two vectors into a single vector with twice the width.\n\n`a` provides the lower elements and `b` provides the upper elements."]
1383 fn combine_mask8x32(self, a: mask8x32<Self>, b: mask8x32<Self>) -> mask8x64<Self>;
1384 #[doc = "Split a vector into two vectors of half the width.\n\nReturns a tuple of (lower half, upper half)."]
1385 fn split_mask8x32(self, a: mask8x32<Self>) -> (mask8x16<Self>, mask8x16<Self>);
1386 #[doc = "Create a SIMD vector with all elements set to the given value."]
1387 fn splat_i16x16(self, val: i16) -> i16x16<Self>;
1388 #[doc = "Create a SIMD vector from an array of the same length."]
1389 fn load_array_i16x16(self, val: [i16; 16usize]) -> i16x16<Self>;
1390 #[doc = "Create a SIMD vector from an array of the same length."]
1391 fn load_array_ref_i16x16(self, val: &[i16; 16usize]) -> i16x16<Self>;
1392 #[doc = "Convert a SIMD vector to an array."]
1393 fn as_array_i16x16(self, a: i16x16<Self>) -> [i16; 16usize];
1394 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
1395 fn as_array_ref_i16x16(self, a: &i16x16<Self>) -> &[i16; 16usize];
1396 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
1397 fn as_array_mut_i16x16(self, a: &mut i16x16<Self>) -> &mut [i16; 16usize];
1398 #[doc = "Store a SIMD vector into an array of the same length."]
1399 fn store_array_i16x16(self, a: i16x16<Self>, dest: &mut [i16; 16usize]) -> ();
1400 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
1401 fn cvt_from_bytes_i16x16(self, a: u8x32<Self>) -> i16x16<Self>;
1402 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
1403 fn cvt_to_bytes_i16x16(self, a: i16x16<Self>) -> u8x32<Self>;
1404 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
1405 fn slide_i16x16<const SHIFT: usize>(self, a: i16x16<Self>, b: i16x16<Self>) -> i16x16<Self>;
1406 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
1407 fn slide_within_blocks_i16x16<const SHIFT: usize>(
1408 self,
1409 a: i16x16<Self>,
1410 b: i16x16<Self>,
1411 ) -> i16x16<Self>;
1412 #[doc = "Add two vectors element-wise, wrapping on overflow."]
1413 fn add_i16x16(self, a: i16x16<Self>, b: i16x16<Self>) -> i16x16<Self>;
1414 #[doc = "Subtract two vectors element-wise, wrapping on overflow."]
1415 fn sub_i16x16(self, a: i16x16<Self>, b: i16x16<Self>) -> i16x16<Self>;
1416 #[doc = "Multiply two vectors element-wise, wrapping on overflow."]
1417 fn mul_i16x16(self, a: i16x16<Self>, b: i16x16<Self>) -> i16x16<Self>;
1418 #[doc = "Compute the bitwise AND of two vectors."]
1419 fn and_i16x16(self, a: i16x16<Self>, b: i16x16<Self>) -> i16x16<Self>;
1420 #[doc = "Compute the bitwise OR of two vectors."]
1421 fn or_i16x16(self, a: i16x16<Self>, b: i16x16<Self>) -> i16x16<Self>;
1422 #[doc = "Compute the bitwise XOR of two vectors."]
1423 fn xor_i16x16(self, a: i16x16<Self>, b: i16x16<Self>) -> i16x16<Self>;
1424 #[doc = "Compute the bitwise NOT of the vector."]
1425 fn not_i16x16(self, a: i16x16<Self>) -> i16x16<Self>;
1426 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right."]
1427 fn shl_i16x16(self, a: i16x16<Self>, shift: u32) -> i16x16<Self>;
1428 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
1429 fn shlv_i16x16(self, a: i16x16<Self>, b: i16x16<Self>) -> i16x16<Self>;
1430 #[doc = "Shift each element right by the given number of bits.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated."]
1431 fn shr_i16x16(self, a: i16x16<Self>, shift: u32) -> i16x16<Self>;
1432 #[doc = "Shift each element right by the corresponding element in another vector.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
1433 fn shrv_i16x16(self, a: i16x16<Self>, b: i16x16<Self>) -> i16x16<Self>;
1434 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
1435 fn simd_eq_i16x16(self, a: i16x16<Self>, b: i16x16<Self>) -> mask16x16<Self>;
1436 #[doc = "Compare two vectors element-wise for less than.\n\nReturns a mask where each element is all ones if `a` is less than `b`, and all zeroes if not."]
1437 fn simd_lt_i16x16(self, a: i16x16<Self>, b: i16x16<Self>) -> mask16x16<Self>;
1438 #[doc = "Compare two vectors element-wise for less than or equal.\n\nReturns a mask where each element is all ones if `a` is less than or equal to `b`, and all zeroes if not."]
1439 fn simd_le_i16x16(self, a: i16x16<Self>, b: i16x16<Self>) -> mask16x16<Self>;
1440 #[doc = "Compare two vectors element-wise for greater than or equal.\n\nReturns a mask where each element is all ones if `a` is greater than or equal to `b`, and all zeroes if not."]
1441 fn simd_ge_i16x16(self, a: i16x16<Self>, b: i16x16<Self>) -> mask16x16<Self>;
1442 #[doc = "Compare two vectors element-wise for greater than.\n\nReturns a mask where each element is all ones if `a` is greater than `b`, and all zeroes if not."]
1443 fn simd_gt_i16x16(self, a: i16x16<Self>, b: i16x16<Self>) -> mask16x16<Self>;
1444 #[doc = "Interleave the lower half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, b0, a1, b1]`.\n\n**Note:** This operation is only useful if you need to discard elements `a2, a3, b2, b3`.\n For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
1445 fn zip_low_i16x16(self, a: i16x16<Self>, b: i16x16<Self>) -> i16x16<Self>;
1446 #[doc = "Interleave the upper half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a2, b2, a3, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a1, b0, b1`.For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
1447 fn zip_high_i16x16(self, a: i16x16<Self>, b: i16x16<Self>) -> i16x16<Self>;
1448 #[doc = "Extract even-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, a2, b0, b2]`.\n\n**Note:** This operation is only useful if you need to discard elements `a1, a3, b1, b3`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
1449 fn unzip_low_i16x16(self, a: i16x16<Self>, b: i16x16<Self>) -> i16x16<Self>;
1450 #[doc = "Extract odd-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a1, a3, b1, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a2, b0, b2`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
1451 fn unzip_high_i16x16(self, a: i16x16<Self>, b: i16x16<Self>) -> i16x16<Self>;
1452 #[doc = "Interleave two vectors.\n\nThe resulting vectors contain elements taken alternately from `a` and `b`, first filling the first result, and then the second.\n\nThe reverse of this operation is `deinterleave`.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `([a0, b0, a1, b1], [a2, b2, a3, b3])`."]
1453 fn interleave_i16x16(self, a: i16x16<Self>, b: i16x16<Self>) -> (i16x16<Self>, i16x16<Self>);
1454 #[doc = "Deinterleave two vectors.\n\nThe first result contains all even-indexed elements from `a` followed by all even-indexed elements from `b`. The second result contains all odd-indexed elements from `a` followed by all odd-indexed elements from `b`.\n\nThe reverse of this operation is `interleave`.\n\nFor vectors `[a0, b0, a1, b1]` and `[a2, b2, a3, b3]`, returns `([a0, a1, a2, a3], [b0, b1, b2, b3])`."]
1455 fn deinterleave_i16x16(self, a: i16x16<Self>, b: i16x16<Self>) -> (i16x16<Self>, i16x16<Self>);
1456 #[doc = "Select elements from b and c based on the mask operand a.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
1457 fn select_i16x16(self, a: mask16x16<Self>, b: i16x16<Self>, c: i16x16<Self>) -> i16x16<Self>;
1458 #[doc = "Return the element-wise minimum of two vectors."]
1459 fn min_i16x16(self, a: i16x16<Self>, b: i16x16<Self>) -> i16x16<Self>;
1460 #[doc = "Return the element-wise maximum of two vectors."]
1461 fn max_i16x16(self, a: i16x16<Self>, b: i16x16<Self>) -> i16x16<Self>;
1462 #[doc = "Combine two vectors into a single vector with twice the width.\n\n`a` provides the lower elements and `b` provides the upper elements."]
1463 fn combine_i16x16(self, a: i16x16<Self>, b: i16x16<Self>) -> i16x32<Self>;
1464 #[doc = "Split a vector into two vectors of half the width.\n\nReturns a tuple of (lower half, upper half)."]
1465 fn split_i16x16(self, a: i16x16<Self>) -> (i16x8<Self>, i16x8<Self>);
1466 #[doc = "Negate each element of the vector, wrapping on overflow."]
1467 fn neg_i16x16(self, a: i16x16<Self>) -> i16x16<Self>;
1468 #[doc = "Reinterpret the bits of this vector as a vector of `u8` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
1469 fn reinterpret_u8_i16x16(self, a: i16x16<Self>) -> u8x32<Self>;
1470 #[doc = "Reinterpret the bits of this vector as a vector of `u32` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
1471 fn reinterpret_u32_i16x16(self, a: i16x16<Self>) -> u32x8<Self>;
1472 #[doc = "Create a SIMD vector with all elements set to the given value."]
1473 fn splat_u16x16(self, val: u16) -> u16x16<Self>;
1474 #[doc = "Create a SIMD vector from an array of the same length."]
1475 fn load_array_u16x16(self, val: [u16; 16usize]) -> u16x16<Self>;
1476 #[doc = "Create a SIMD vector from an array of the same length."]
1477 fn load_array_ref_u16x16(self, val: &[u16; 16usize]) -> u16x16<Self>;
1478 #[doc = "Convert a SIMD vector to an array."]
1479 fn as_array_u16x16(self, a: u16x16<Self>) -> [u16; 16usize];
1480 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
1481 fn as_array_ref_u16x16(self, a: &u16x16<Self>) -> &[u16; 16usize];
1482 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
1483 fn as_array_mut_u16x16(self, a: &mut u16x16<Self>) -> &mut [u16; 16usize];
1484 #[doc = "Store a SIMD vector into an array of the same length."]
1485 fn store_array_u16x16(self, a: u16x16<Self>, dest: &mut [u16; 16usize]) -> ();
1486 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
1487 fn cvt_from_bytes_u16x16(self, a: u8x32<Self>) -> u16x16<Self>;
1488 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
1489 fn cvt_to_bytes_u16x16(self, a: u16x16<Self>) -> u8x32<Self>;
1490 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
1491 fn slide_u16x16<const SHIFT: usize>(self, a: u16x16<Self>, b: u16x16<Self>) -> u16x16<Self>;
1492 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
1493 fn slide_within_blocks_u16x16<const SHIFT: usize>(
1494 self,
1495 a: u16x16<Self>,
1496 b: u16x16<Self>,
1497 ) -> u16x16<Self>;
1498 #[doc = "Add two vectors element-wise, wrapping on overflow."]
1499 fn add_u16x16(self, a: u16x16<Self>, b: u16x16<Self>) -> u16x16<Self>;
1500 #[doc = "Subtract two vectors element-wise, wrapping on overflow."]
1501 fn sub_u16x16(self, a: u16x16<Self>, b: u16x16<Self>) -> u16x16<Self>;
1502 #[doc = "Multiply two vectors element-wise, wrapping on overflow."]
1503 fn mul_u16x16(self, a: u16x16<Self>, b: u16x16<Self>) -> u16x16<Self>;
1504 #[doc = "Compute the bitwise AND of two vectors."]
1505 fn and_u16x16(self, a: u16x16<Self>, b: u16x16<Self>) -> u16x16<Self>;
1506 #[doc = "Compute the bitwise OR of two vectors."]
1507 fn or_u16x16(self, a: u16x16<Self>, b: u16x16<Self>) -> u16x16<Self>;
1508 #[doc = "Compute the bitwise XOR of two vectors."]
1509 fn xor_u16x16(self, a: u16x16<Self>, b: u16x16<Self>) -> u16x16<Self>;
1510 #[doc = "Compute the bitwise NOT of the vector."]
1511 fn not_u16x16(self, a: u16x16<Self>) -> u16x16<Self>;
1512 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right."]
1513 fn shl_u16x16(self, a: u16x16<Self>, shift: u32) -> u16x16<Self>;
1514 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
1515 fn shlv_u16x16(self, a: u16x16<Self>, b: u16x16<Self>) -> u16x16<Self>;
1516 #[doc = "Shift each element right by the given number of bits.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated."]
1517 fn shr_u16x16(self, a: u16x16<Self>, shift: u32) -> u16x16<Self>;
1518 #[doc = "Shift each element right by the corresponding element in another vector.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
1519 fn shrv_u16x16(self, a: u16x16<Self>, b: u16x16<Self>) -> u16x16<Self>;
1520 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
1521 fn simd_eq_u16x16(self, a: u16x16<Self>, b: u16x16<Self>) -> mask16x16<Self>;
1522 #[doc = "Compare two vectors element-wise for less than.\n\nReturns a mask where each element is all ones if `a` is less than `b`, and all zeroes if not."]
1523 fn simd_lt_u16x16(self, a: u16x16<Self>, b: u16x16<Self>) -> mask16x16<Self>;
1524 #[doc = "Compare two vectors element-wise for less than or equal.\n\nReturns a mask where each element is all ones if `a` is less than or equal to `b`, and all zeroes if not."]
1525 fn simd_le_u16x16(self, a: u16x16<Self>, b: u16x16<Self>) -> mask16x16<Self>;
1526 #[doc = "Compare two vectors element-wise for greater than or equal.\n\nReturns a mask where each element is all ones if `a` is greater than or equal to `b`, and all zeroes if not."]
1527 fn simd_ge_u16x16(self, a: u16x16<Self>, b: u16x16<Self>) -> mask16x16<Self>;
1528 #[doc = "Compare two vectors element-wise for greater than.\n\nReturns a mask where each element is all ones if `a` is greater than `b`, and all zeroes if not."]
1529 fn simd_gt_u16x16(self, a: u16x16<Self>, b: u16x16<Self>) -> mask16x16<Self>;
1530 #[doc = "Interleave the lower half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, b0, a1, b1]`.\n\n**Note:** This operation is only useful if you need to discard elements `a2, a3, b2, b3`.\n For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
1531 fn zip_low_u16x16(self, a: u16x16<Self>, b: u16x16<Self>) -> u16x16<Self>;
1532 #[doc = "Interleave the upper half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a2, b2, a3, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a1, b0, b1`.For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
1533 fn zip_high_u16x16(self, a: u16x16<Self>, b: u16x16<Self>) -> u16x16<Self>;
1534 #[doc = "Extract even-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, a2, b0, b2]`.\n\n**Note:** This operation is only useful if you need to discard elements `a1, a3, b1, b3`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
1535 fn unzip_low_u16x16(self, a: u16x16<Self>, b: u16x16<Self>) -> u16x16<Self>;
1536 #[doc = "Extract odd-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a1, a3, b1, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a2, b0, b2`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
1537 fn unzip_high_u16x16(self, a: u16x16<Self>, b: u16x16<Self>) -> u16x16<Self>;
1538 #[doc = "Interleave two vectors.\n\nThe resulting vectors contain elements taken alternately from `a` and `b`, first filling the first result, and then the second.\n\nThe reverse of this operation is `deinterleave`.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `([a0, b0, a1, b1], [a2, b2, a3, b3])`."]
1539 fn interleave_u16x16(self, a: u16x16<Self>, b: u16x16<Self>) -> (u16x16<Self>, u16x16<Self>);
1540 #[doc = "Deinterleave two vectors.\n\nThe first result contains all even-indexed elements from `a` followed by all even-indexed elements from `b`. The second result contains all odd-indexed elements from `a` followed by all odd-indexed elements from `b`.\n\nThe reverse of this operation is `interleave`.\n\nFor vectors `[a0, b0, a1, b1]` and `[a2, b2, a3, b3]`, returns `([a0, a1, a2, a3], [b0, b1, b2, b3])`."]
1541 fn deinterleave_u16x16(self, a: u16x16<Self>, b: u16x16<Self>) -> (u16x16<Self>, u16x16<Self>);
1542 #[doc = "Select elements from b and c based on the mask operand a.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
1543 fn select_u16x16(self, a: mask16x16<Self>, b: u16x16<Self>, c: u16x16<Self>) -> u16x16<Self>;
1544 #[doc = "Return the element-wise minimum of two vectors."]
1545 fn min_u16x16(self, a: u16x16<Self>, b: u16x16<Self>) -> u16x16<Self>;
1546 #[doc = "Return the element-wise maximum of two vectors."]
1547 fn max_u16x16(self, a: u16x16<Self>, b: u16x16<Self>) -> u16x16<Self>;
1548 #[doc = "Combine two vectors into a single vector with twice the width.\n\n`a` provides the lower elements and `b` provides the upper elements."]
1549 fn combine_u16x16(self, a: u16x16<Self>, b: u16x16<Self>) -> u16x32<Self>;
1550 #[doc = "Split a vector into two vectors of half the width.\n\nReturns a tuple of (lower half, upper half)."]
1551 fn split_u16x16(self, a: u16x16<Self>) -> (u16x8<Self>, u16x8<Self>);
1552 #[doc = "Truncate each element to a narrower integer type.\n\nThe number of elements in the result is twice that of the input."]
1553 fn narrow_u16x16(self, a: u16x16<Self>) -> u8x16<Self>;
1554 #[doc = "Reinterpret the bits of this vector as a vector of `u8` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
1555 fn reinterpret_u8_u16x16(self, a: u16x16<Self>) -> u8x32<Self>;
1556 #[doc = "Reinterpret the bits of this vector as a vector of `u32` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
1557 fn reinterpret_u32_u16x16(self, a: u16x16<Self>) -> u32x8<Self>;
1558 #[doc = "Create a SIMD vector with all elements set to the given value."]
1559 fn splat_mask16x16(self, val: i16) -> mask16x16<Self>;
1560 #[doc = "Create a SIMD vector from an array of the same length."]
1561 fn load_array_mask16x16(self, val: [i16; 16usize]) -> mask16x16<Self>;
1562 #[doc = "Create a SIMD vector from an array of the same length."]
1563 fn load_array_ref_mask16x16(self, val: &[i16; 16usize]) -> mask16x16<Self>;
1564 #[doc = "Convert a SIMD vector to an array."]
1565 fn as_array_mask16x16(self, a: mask16x16<Self>) -> [i16; 16usize];
1566 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
1567 fn as_array_ref_mask16x16(self, a: &mask16x16<Self>) -> &[i16; 16usize];
1568 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
1569 fn as_array_mut_mask16x16(self, a: &mut mask16x16<Self>) -> &mut [i16; 16usize];
1570 #[doc = "Store a SIMD vector into an array of the same length."]
1571 fn store_array_mask16x16(self, a: mask16x16<Self>, dest: &mut [i16; 16usize]) -> ();
1572 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
1573 fn cvt_from_bytes_mask16x16(self, a: u8x32<Self>) -> mask16x16<Self>;
1574 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
1575 fn cvt_to_bytes_mask16x16(self, a: mask16x16<Self>) -> u8x32<Self>;
1576 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
1577 fn slide_mask16x16<const SHIFT: usize>(
1578 self,
1579 a: mask16x16<Self>,
1580 b: mask16x16<Self>,
1581 ) -> mask16x16<Self>;
1582 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
1583 fn slide_within_blocks_mask16x16<const SHIFT: usize>(
1584 self,
1585 a: mask16x16<Self>,
1586 b: mask16x16<Self>,
1587 ) -> mask16x16<Self>;
1588 #[doc = "Compute the logical AND of two masks."]
1589 fn and_mask16x16(self, a: mask16x16<Self>, b: mask16x16<Self>) -> mask16x16<Self>;
1590 #[doc = "Compute the logical OR of two masks."]
1591 fn or_mask16x16(self, a: mask16x16<Self>, b: mask16x16<Self>) -> mask16x16<Self>;
1592 #[doc = "Compute the logical XOR of two masks."]
1593 fn xor_mask16x16(self, a: mask16x16<Self>, b: mask16x16<Self>) -> mask16x16<Self>;
1594 #[doc = "Compute the logical NOT of the mask."]
1595 fn not_mask16x16(self, a: mask16x16<Self>) -> mask16x16<Self>;
1596 #[doc = "Select elements from `b` and `c` based on the mask operand `a`.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
1597 fn select_mask16x16(
1598 self,
1599 a: mask16x16<Self>,
1600 b: mask16x16<Self>,
1601 c: mask16x16<Self>,
1602 ) -> mask16x16<Self>;
1603 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
1604 fn simd_eq_mask16x16(self, a: mask16x16<Self>, b: mask16x16<Self>) -> mask16x16<Self>;
1605 #[doc = "Returns true if any elements in this mask are true (all ones).\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
1606 fn any_true_mask16x16(self, a: mask16x16<Self>) -> bool;
1607 #[doc = "Returns true if all elements in this mask are true (all ones).\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
1608 fn all_true_mask16x16(self, a: mask16x16<Self>) -> bool;
1609 #[doc = "Returns true if any elements in this mask are false (all zeroes).\n\nThis is logically equivalent to `!all_true`, but may be faster.\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
1610 fn any_false_mask16x16(self, a: mask16x16<Self>) -> bool;
1611 #[doc = "Returns true if all elements in this mask are false (all zeroes).\n\nThis is logically equivalent to `!any_true`, but may be faster.\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
1612 fn all_false_mask16x16(self, a: mask16x16<Self>) -> bool;
1613 #[doc = "Combine two vectors into a single vector with twice the width.\n\n`a` provides the lower elements and `b` provides the upper elements."]
1614 fn combine_mask16x16(self, a: mask16x16<Self>, b: mask16x16<Self>) -> mask16x32<Self>;
1615 #[doc = "Split a vector into two vectors of half the width.\n\nReturns a tuple of (lower half, upper half)."]
1616 fn split_mask16x16(self, a: mask16x16<Self>) -> (mask16x8<Self>, mask16x8<Self>);
1617 #[doc = "Create a SIMD vector with all elements set to the given value."]
1618 fn splat_i32x8(self, val: i32) -> i32x8<Self>;
1619 #[doc = "Create a SIMD vector from an array of the same length."]
1620 fn load_array_i32x8(self, val: [i32; 8usize]) -> i32x8<Self>;
1621 #[doc = "Create a SIMD vector from an array of the same length."]
1622 fn load_array_ref_i32x8(self, val: &[i32; 8usize]) -> i32x8<Self>;
1623 #[doc = "Convert a SIMD vector to an array."]
1624 fn as_array_i32x8(self, a: i32x8<Self>) -> [i32; 8usize];
1625 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
1626 fn as_array_ref_i32x8(self, a: &i32x8<Self>) -> &[i32; 8usize];
1627 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
1628 fn as_array_mut_i32x8(self, a: &mut i32x8<Self>) -> &mut [i32; 8usize];
1629 #[doc = "Store a SIMD vector into an array of the same length."]
1630 fn store_array_i32x8(self, a: i32x8<Self>, dest: &mut [i32; 8usize]) -> ();
1631 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
1632 fn cvt_from_bytes_i32x8(self, a: u8x32<Self>) -> i32x8<Self>;
1633 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
1634 fn cvt_to_bytes_i32x8(self, a: i32x8<Self>) -> u8x32<Self>;
1635 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
1636 fn slide_i32x8<const SHIFT: usize>(self, a: i32x8<Self>, b: i32x8<Self>) -> i32x8<Self>;
1637 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
1638 fn slide_within_blocks_i32x8<const SHIFT: usize>(
1639 self,
1640 a: i32x8<Self>,
1641 b: i32x8<Self>,
1642 ) -> i32x8<Self>;
1643 #[doc = "Add two vectors element-wise, wrapping on overflow."]
1644 fn add_i32x8(self, a: i32x8<Self>, b: i32x8<Self>) -> i32x8<Self>;
1645 #[doc = "Subtract two vectors element-wise, wrapping on overflow."]
1646 fn sub_i32x8(self, a: i32x8<Self>, b: i32x8<Self>) -> i32x8<Self>;
1647 #[doc = "Multiply two vectors element-wise, wrapping on overflow."]
1648 fn mul_i32x8(self, a: i32x8<Self>, b: i32x8<Self>) -> i32x8<Self>;
1649 #[doc = "Compute the bitwise AND of two vectors."]
1650 fn and_i32x8(self, a: i32x8<Self>, b: i32x8<Self>) -> i32x8<Self>;
1651 #[doc = "Compute the bitwise OR of two vectors."]
1652 fn or_i32x8(self, a: i32x8<Self>, b: i32x8<Self>) -> i32x8<Self>;
1653 #[doc = "Compute the bitwise XOR of two vectors."]
1654 fn xor_i32x8(self, a: i32x8<Self>, b: i32x8<Self>) -> i32x8<Self>;
1655 #[doc = "Compute the bitwise NOT of the vector."]
1656 fn not_i32x8(self, a: i32x8<Self>) -> i32x8<Self>;
1657 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right."]
1658 fn shl_i32x8(self, a: i32x8<Self>, shift: u32) -> i32x8<Self>;
1659 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
1660 fn shlv_i32x8(self, a: i32x8<Self>, b: i32x8<Self>) -> i32x8<Self>;
1661 #[doc = "Shift each element right by the given number of bits.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated."]
1662 fn shr_i32x8(self, a: i32x8<Self>, shift: u32) -> i32x8<Self>;
1663 #[doc = "Shift each element right by the corresponding element in another vector.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
1664 fn shrv_i32x8(self, a: i32x8<Self>, b: i32x8<Self>) -> i32x8<Self>;
1665 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
1666 fn simd_eq_i32x8(self, a: i32x8<Self>, b: i32x8<Self>) -> mask32x8<Self>;
1667 #[doc = "Compare two vectors element-wise for less than.\n\nReturns a mask where each element is all ones if `a` is less than `b`, and all zeroes if not."]
1668 fn simd_lt_i32x8(self, a: i32x8<Self>, b: i32x8<Self>) -> mask32x8<Self>;
1669 #[doc = "Compare two vectors element-wise for less than or equal.\n\nReturns a mask where each element is all ones if `a` is less than or equal to `b`, and all zeroes if not."]
1670 fn simd_le_i32x8(self, a: i32x8<Self>, b: i32x8<Self>) -> mask32x8<Self>;
1671 #[doc = "Compare two vectors element-wise for greater than or equal.\n\nReturns a mask where each element is all ones if `a` is greater than or equal to `b`, and all zeroes if not."]
1672 fn simd_ge_i32x8(self, a: i32x8<Self>, b: i32x8<Self>) -> mask32x8<Self>;
1673 #[doc = "Compare two vectors element-wise for greater than.\n\nReturns a mask where each element is all ones if `a` is greater than `b`, and all zeroes if not."]
1674 fn simd_gt_i32x8(self, a: i32x8<Self>, b: i32x8<Self>) -> mask32x8<Self>;
1675 #[doc = "Interleave the lower half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, b0, a1, b1]`.\n\n**Note:** This operation is only useful if you need to discard elements `a2, a3, b2, b3`.\n For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
1676 fn zip_low_i32x8(self, a: i32x8<Self>, b: i32x8<Self>) -> i32x8<Self>;
1677 #[doc = "Interleave the upper half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a2, b2, a3, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a1, b0, b1`.For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
1678 fn zip_high_i32x8(self, a: i32x8<Self>, b: i32x8<Self>) -> i32x8<Self>;
1679 #[doc = "Extract even-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, a2, b0, b2]`.\n\n**Note:** This operation is only useful if you need to discard elements `a1, a3, b1, b3`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
1680 fn unzip_low_i32x8(self, a: i32x8<Self>, b: i32x8<Self>) -> i32x8<Self>;
1681 #[doc = "Extract odd-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a1, a3, b1, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a2, b0, b2`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
1682 fn unzip_high_i32x8(self, a: i32x8<Self>, b: i32x8<Self>) -> i32x8<Self>;
1683 #[doc = "Interleave two vectors.\n\nThe resulting vectors contain elements taken alternately from `a` and `b`, first filling the first result, and then the second.\n\nThe reverse of this operation is `deinterleave`.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `([a0, b0, a1, b1], [a2, b2, a3, b3])`."]
1684 fn interleave_i32x8(self, a: i32x8<Self>, b: i32x8<Self>) -> (i32x8<Self>, i32x8<Self>);
1685 #[doc = "Deinterleave two vectors.\n\nThe first result contains all even-indexed elements from `a` followed by all even-indexed elements from `b`. The second result contains all odd-indexed elements from `a` followed by all odd-indexed elements from `b`.\n\nThe reverse of this operation is `interleave`.\n\nFor vectors `[a0, b0, a1, b1]` and `[a2, b2, a3, b3]`, returns `([a0, a1, a2, a3], [b0, b1, b2, b3])`."]
1686 fn deinterleave_i32x8(self, a: i32x8<Self>, b: i32x8<Self>) -> (i32x8<Self>, i32x8<Self>);
1687 #[doc = "Select elements from b and c based on the mask operand a.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
1688 fn select_i32x8(self, a: mask32x8<Self>, b: i32x8<Self>, c: i32x8<Self>) -> i32x8<Self>;
1689 #[doc = "Return the element-wise minimum of two vectors."]
1690 fn min_i32x8(self, a: i32x8<Self>, b: i32x8<Self>) -> i32x8<Self>;
1691 #[doc = "Return the element-wise maximum of two vectors."]
1692 fn max_i32x8(self, a: i32x8<Self>, b: i32x8<Self>) -> i32x8<Self>;
1693 #[doc = "Combine two vectors into a single vector with twice the width.\n\n`a` provides the lower elements and `b` provides the upper elements."]
1694 fn combine_i32x8(self, a: i32x8<Self>, b: i32x8<Self>) -> i32x16<Self>;
1695 #[doc = "Split a vector into two vectors of half the width.\n\nReturns a tuple of (lower half, upper half)."]
1696 fn split_i32x8(self, a: i32x8<Self>) -> (i32x4<Self>, i32x4<Self>);
1697 #[doc = "Negate each element of the vector, wrapping on overflow."]
1698 fn neg_i32x8(self, a: i32x8<Self>) -> i32x8<Self>;
1699 #[doc = "Reinterpret the bits of this vector as a vector of `u8` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
1700 fn reinterpret_u8_i32x8(self, a: i32x8<Self>) -> u8x32<Self>;
1701 #[doc = "Reinterpret the bits of this vector as a vector of `u32` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
1702 fn reinterpret_u32_i32x8(self, a: i32x8<Self>) -> u32x8<Self>;
1703 #[doc = "Convert each signed 32-bit integer element to a floating-point value.\n\nValues that cannot be exactly represented are rounded to the nearest representable value."]
1704 fn cvt_f32_i32x8(self, a: i32x8<Self>) -> f32x8<Self>;
1705 #[doc = "Create a SIMD vector with all elements set to the given value."]
1706 fn splat_u32x8(self, val: u32) -> u32x8<Self>;
1707 #[doc = "Create a SIMD vector from an array of the same length."]
1708 fn load_array_u32x8(self, val: [u32; 8usize]) -> u32x8<Self>;
1709 #[doc = "Create a SIMD vector from an array of the same length."]
1710 fn load_array_ref_u32x8(self, val: &[u32; 8usize]) -> u32x8<Self>;
1711 #[doc = "Convert a SIMD vector to an array."]
1712 fn as_array_u32x8(self, a: u32x8<Self>) -> [u32; 8usize];
1713 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
1714 fn as_array_ref_u32x8(self, a: &u32x8<Self>) -> &[u32; 8usize];
1715 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
1716 fn as_array_mut_u32x8(self, a: &mut u32x8<Self>) -> &mut [u32; 8usize];
1717 #[doc = "Store a SIMD vector into an array of the same length."]
1718 fn store_array_u32x8(self, a: u32x8<Self>, dest: &mut [u32; 8usize]) -> ();
1719 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
1720 fn cvt_from_bytes_u32x8(self, a: u8x32<Self>) -> u32x8<Self>;
1721 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
1722 fn cvt_to_bytes_u32x8(self, a: u32x8<Self>) -> u8x32<Self>;
1723 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
1724 fn slide_u32x8<const SHIFT: usize>(self, a: u32x8<Self>, b: u32x8<Self>) -> u32x8<Self>;
1725 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
1726 fn slide_within_blocks_u32x8<const SHIFT: usize>(
1727 self,
1728 a: u32x8<Self>,
1729 b: u32x8<Self>,
1730 ) -> u32x8<Self>;
1731 #[doc = "Add two vectors element-wise, wrapping on overflow."]
1732 fn add_u32x8(self, a: u32x8<Self>, b: u32x8<Self>) -> u32x8<Self>;
1733 #[doc = "Subtract two vectors element-wise, wrapping on overflow."]
1734 fn sub_u32x8(self, a: u32x8<Self>, b: u32x8<Self>) -> u32x8<Self>;
1735 #[doc = "Multiply two vectors element-wise, wrapping on overflow."]
1736 fn mul_u32x8(self, a: u32x8<Self>, b: u32x8<Self>) -> u32x8<Self>;
1737 #[doc = "Compute the bitwise AND of two vectors."]
1738 fn and_u32x8(self, a: u32x8<Self>, b: u32x8<Self>) -> u32x8<Self>;
1739 #[doc = "Compute the bitwise OR of two vectors."]
1740 fn or_u32x8(self, a: u32x8<Self>, b: u32x8<Self>) -> u32x8<Self>;
1741 #[doc = "Compute the bitwise XOR of two vectors."]
1742 fn xor_u32x8(self, a: u32x8<Self>, b: u32x8<Self>) -> u32x8<Self>;
1743 #[doc = "Compute the bitwise NOT of the vector."]
1744 fn not_u32x8(self, a: u32x8<Self>) -> u32x8<Self>;
1745 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right."]
1746 fn shl_u32x8(self, a: u32x8<Self>, shift: u32) -> u32x8<Self>;
1747 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
1748 fn shlv_u32x8(self, a: u32x8<Self>, b: u32x8<Self>) -> u32x8<Self>;
1749 #[doc = "Shift each element right by the given number of bits.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated."]
1750 fn shr_u32x8(self, a: u32x8<Self>, shift: u32) -> u32x8<Self>;
1751 #[doc = "Shift each element right by the corresponding element in another vector.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
1752 fn shrv_u32x8(self, a: u32x8<Self>, b: u32x8<Self>) -> u32x8<Self>;
1753 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
1754 fn simd_eq_u32x8(self, a: u32x8<Self>, b: u32x8<Self>) -> mask32x8<Self>;
1755 #[doc = "Compare two vectors element-wise for less than.\n\nReturns a mask where each element is all ones if `a` is less than `b`, and all zeroes if not."]
1756 fn simd_lt_u32x8(self, a: u32x8<Self>, b: u32x8<Self>) -> mask32x8<Self>;
1757 #[doc = "Compare two vectors element-wise for less than or equal.\n\nReturns a mask where each element is all ones if `a` is less than or equal to `b`, and all zeroes if not."]
1758 fn simd_le_u32x8(self, a: u32x8<Self>, b: u32x8<Self>) -> mask32x8<Self>;
1759 #[doc = "Compare two vectors element-wise for greater than or equal.\n\nReturns a mask where each element is all ones if `a` is greater than or equal to `b`, and all zeroes if not."]
1760 fn simd_ge_u32x8(self, a: u32x8<Self>, b: u32x8<Self>) -> mask32x8<Self>;
1761 #[doc = "Compare two vectors element-wise for greater than.\n\nReturns a mask where each element is all ones if `a` is greater than `b`, and all zeroes if not."]
1762 fn simd_gt_u32x8(self, a: u32x8<Self>, b: u32x8<Self>) -> mask32x8<Self>;
1763 #[doc = "Interleave the lower half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, b0, a1, b1]`.\n\n**Note:** This operation is only useful if you need to discard elements `a2, a3, b2, b3`.\n For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
1764 fn zip_low_u32x8(self, a: u32x8<Self>, b: u32x8<Self>) -> u32x8<Self>;
1765 #[doc = "Interleave the upper half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a2, b2, a3, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a1, b0, b1`.For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
1766 fn zip_high_u32x8(self, a: u32x8<Self>, b: u32x8<Self>) -> u32x8<Self>;
1767 #[doc = "Extract even-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, a2, b0, b2]`.\n\n**Note:** This operation is only useful if you need to discard elements `a1, a3, b1, b3`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
1768 fn unzip_low_u32x8(self, a: u32x8<Self>, b: u32x8<Self>) -> u32x8<Self>;
1769 #[doc = "Extract odd-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a1, a3, b1, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a2, b0, b2`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
1770 fn unzip_high_u32x8(self, a: u32x8<Self>, b: u32x8<Self>) -> u32x8<Self>;
1771 #[doc = "Interleave two vectors.\n\nThe resulting vectors contain elements taken alternately from `a` and `b`, first filling the first result, and then the second.\n\nThe reverse of this operation is `deinterleave`.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `([a0, b0, a1, b1], [a2, b2, a3, b3])`."]
1772 fn interleave_u32x8(self, a: u32x8<Self>, b: u32x8<Self>) -> (u32x8<Self>, u32x8<Self>);
1773 #[doc = "Deinterleave two vectors.\n\nThe first result contains all even-indexed elements from `a` followed by all even-indexed elements from `b`. The second result contains all odd-indexed elements from `a` followed by all odd-indexed elements from `b`.\n\nThe reverse of this operation is `interleave`.\n\nFor vectors `[a0, b0, a1, b1]` and `[a2, b2, a3, b3]`, returns `([a0, a1, a2, a3], [b0, b1, b2, b3])`."]
1774 fn deinterleave_u32x8(self, a: u32x8<Self>, b: u32x8<Self>) -> (u32x8<Self>, u32x8<Self>);
1775 #[doc = "Select elements from b and c based on the mask operand a.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
1776 fn select_u32x8(self, a: mask32x8<Self>, b: u32x8<Self>, c: u32x8<Self>) -> u32x8<Self>;
1777 #[doc = "Return the element-wise minimum of two vectors."]
1778 fn min_u32x8(self, a: u32x8<Self>, b: u32x8<Self>) -> u32x8<Self>;
1779 #[doc = "Return the element-wise maximum of two vectors."]
1780 fn max_u32x8(self, a: u32x8<Self>, b: u32x8<Self>) -> u32x8<Self>;
1781 #[doc = "Combine two vectors into a single vector with twice the width.\n\n`a` provides the lower elements and `b` provides the upper elements."]
1782 fn combine_u32x8(self, a: u32x8<Self>, b: u32x8<Self>) -> u32x16<Self>;
1783 #[doc = "Split a vector into two vectors of half the width.\n\nReturns a tuple of (lower half, upper half)."]
1784 fn split_u32x8(self, a: u32x8<Self>) -> (u32x4<Self>, u32x4<Self>);
1785 #[doc = "Reinterpret the bits of this vector as a vector of `u8` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
1786 fn reinterpret_u8_u32x8(self, a: u32x8<Self>) -> u8x32<Self>;
1787 #[doc = "Convert each unsigned 32-bit integer element to a floating-point value.\n\nValues that cannot be exactly represented are rounded to the nearest representable value."]
1788 fn cvt_f32_u32x8(self, a: u32x8<Self>) -> f32x8<Self>;
1789 #[doc = "Create a SIMD vector with all elements set to the given value."]
1790 fn splat_mask32x8(self, val: i32) -> mask32x8<Self>;
1791 #[doc = "Create a SIMD vector from an array of the same length."]
1792 fn load_array_mask32x8(self, val: [i32; 8usize]) -> mask32x8<Self>;
1793 #[doc = "Create a SIMD vector from an array of the same length."]
1794 fn load_array_ref_mask32x8(self, val: &[i32; 8usize]) -> mask32x8<Self>;
1795 #[doc = "Convert a SIMD vector to an array."]
1796 fn as_array_mask32x8(self, a: mask32x8<Self>) -> [i32; 8usize];
1797 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
1798 fn as_array_ref_mask32x8(self, a: &mask32x8<Self>) -> &[i32; 8usize];
1799 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
1800 fn as_array_mut_mask32x8(self, a: &mut mask32x8<Self>) -> &mut [i32; 8usize];
1801 #[doc = "Store a SIMD vector into an array of the same length."]
1802 fn store_array_mask32x8(self, a: mask32x8<Self>, dest: &mut [i32; 8usize]) -> ();
1803 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
1804 fn cvt_from_bytes_mask32x8(self, a: u8x32<Self>) -> mask32x8<Self>;
1805 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
1806 fn cvt_to_bytes_mask32x8(self, a: mask32x8<Self>) -> u8x32<Self>;
1807 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
1808 fn slide_mask32x8<const SHIFT: usize>(
1809 self,
1810 a: mask32x8<Self>,
1811 b: mask32x8<Self>,
1812 ) -> mask32x8<Self>;
1813 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
1814 fn slide_within_blocks_mask32x8<const SHIFT: usize>(
1815 self,
1816 a: mask32x8<Self>,
1817 b: mask32x8<Self>,
1818 ) -> mask32x8<Self>;
1819 #[doc = "Compute the logical AND of two masks."]
1820 fn and_mask32x8(self, a: mask32x8<Self>, b: mask32x8<Self>) -> mask32x8<Self>;
1821 #[doc = "Compute the logical OR of two masks."]
1822 fn or_mask32x8(self, a: mask32x8<Self>, b: mask32x8<Self>) -> mask32x8<Self>;
1823 #[doc = "Compute the logical XOR of two masks."]
1824 fn xor_mask32x8(self, a: mask32x8<Self>, b: mask32x8<Self>) -> mask32x8<Self>;
1825 #[doc = "Compute the logical NOT of the mask."]
1826 fn not_mask32x8(self, a: mask32x8<Self>) -> mask32x8<Self>;
1827 #[doc = "Select elements from `b` and `c` based on the mask operand `a`.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
1828 fn select_mask32x8(
1829 self,
1830 a: mask32x8<Self>,
1831 b: mask32x8<Self>,
1832 c: mask32x8<Self>,
1833 ) -> mask32x8<Self>;
1834 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
1835 fn simd_eq_mask32x8(self, a: mask32x8<Self>, b: mask32x8<Self>) -> mask32x8<Self>;
1836 #[doc = "Returns true if any elements in this mask are true (all ones).\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
1837 fn any_true_mask32x8(self, a: mask32x8<Self>) -> bool;
1838 #[doc = "Returns true if all elements in this mask are true (all ones).\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
1839 fn all_true_mask32x8(self, a: mask32x8<Self>) -> bool;
1840 #[doc = "Returns true if any elements in this mask are false (all zeroes).\n\nThis is logically equivalent to `!all_true`, but may be faster.\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
1841 fn any_false_mask32x8(self, a: mask32x8<Self>) -> bool;
1842 #[doc = "Returns true if all elements in this mask are false (all zeroes).\n\nThis is logically equivalent to `!any_true`, but may be faster.\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
1843 fn all_false_mask32x8(self, a: mask32x8<Self>) -> bool;
1844 #[doc = "Combine two vectors into a single vector with twice the width.\n\n`a` provides the lower elements and `b` provides the upper elements."]
1845 fn combine_mask32x8(self, a: mask32x8<Self>, b: mask32x8<Self>) -> mask32x16<Self>;
1846 #[doc = "Split a vector into two vectors of half the width.\n\nReturns a tuple of (lower half, upper half)."]
1847 fn split_mask32x8(self, a: mask32x8<Self>) -> (mask32x4<Self>, mask32x4<Self>);
1848 #[doc = "Create a SIMD vector with all elements set to the given value."]
1849 fn splat_f64x4(self, val: f64) -> f64x4<Self>;
1850 #[doc = "Create a SIMD vector from an array of the same length."]
1851 fn load_array_f64x4(self, val: [f64; 4usize]) -> f64x4<Self>;
1852 #[doc = "Create a SIMD vector from an array of the same length."]
1853 fn load_array_ref_f64x4(self, val: &[f64; 4usize]) -> f64x4<Self>;
1854 #[doc = "Convert a SIMD vector to an array."]
1855 fn as_array_f64x4(self, a: f64x4<Self>) -> [f64; 4usize];
1856 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
1857 fn as_array_ref_f64x4(self, a: &f64x4<Self>) -> &[f64; 4usize];
1858 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
1859 fn as_array_mut_f64x4(self, a: &mut f64x4<Self>) -> &mut [f64; 4usize];
1860 #[doc = "Store a SIMD vector into an array of the same length."]
1861 fn store_array_f64x4(self, a: f64x4<Self>, dest: &mut [f64; 4usize]) -> ();
1862 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
1863 fn cvt_from_bytes_f64x4(self, a: u8x32<Self>) -> f64x4<Self>;
1864 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
1865 fn cvt_to_bytes_f64x4(self, a: f64x4<Self>) -> u8x32<Self>;
1866 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
1867 fn slide_f64x4<const SHIFT: usize>(self, a: f64x4<Self>, b: f64x4<Self>) -> f64x4<Self>;
1868 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
1869 fn slide_within_blocks_f64x4<const SHIFT: usize>(
1870 self,
1871 a: f64x4<Self>,
1872 b: f64x4<Self>,
1873 ) -> f64x4<Self>;
1874 #[doc = "Compute the absolute value of each element."]
1875 fn abs_f64x4(self, a: f64x4<Self>) -> f64x4<Self>;
1876 #[doc = "Negate each element of the vector."]
1877 fn neg_f64x4(self, a: f64x4<Self>) -> f64x4<Self>;
1878 #[doc = "Compute the square root of each element.\n\nNegative elements other than `-0.0` will become NaN."]
1879 fn sqrt_f64x4(self, a: f64x4<Self>) -> f64x4<Self>;
1880 #[doc = "Add two vectors element-wise."]
1881 fn add_f64x4(self, a: f64x4<Self>, b: f64x4<Self>) -> f64x4<Self>;
1882 #[doc = "Subtract two vectors element-wise."]
1883 fn sub_f64x4(self, a: f64x4<Self>, b: f64x4<Self>) -> f64x4<Self>;
1884 #[doc = "Multiply two vectors element-wise."]
1885 fn mul_f64x4(self, a: f64x4<Self>, b: f64x4<Self>) -> f64x4<Self>;
1886 #[doc = "Divide two vectors element-wise."]
1887 fn div_f64x4(self, a: f64x4<Self>, b: f64x4<Self>) -> f64x4<Self>;
1888 #[doc = "Return a vector with the magnitude of `a` and the sign of `b` for each element.\n\nThis operation copies the sign bit, so if an input element is NaN, the output element will be a NaN with the same payload and a copied sign bit."]
1889 fn copysign_f64x4(self, a: f64x4<Self>, b: f64x4<Self>) -> f64x4<Self>;
1890 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
1891 fn simd_eq_f64x4(self, a: f64x4<Self>, b: f64x4<Self>) -> mask64x4<Self>;
1892 #[doc = "Compare two vectors element-wise for less than.\n\nReturns a mask where each element is all ones if `a` is less than `b`, and all zeroes if not."]
1893 fn simd_lt_f64x4(self, a: f64x4<Self>, b: f64x4<Self>) -> mask64x4<Self>;
1894 #[doc = "Compare two vectors element-wise for less than or equal.\n\nReturns a mask where each element is all ones if `a` is less than or equal to `b`, and all zeroes if not."]
1895 fn simd_le_f64x4(self, a: f64x4<Self>, b: f64x4<Self>) -> mask64x4<Self>;
1896 #[doc = "Compare two vectors element-wise for greater than or equal.\n\nReturns a mask where each element is all ones if `a` is greater than or equal to `b`, and all zeroes if not."]
1897 fn simd_ge_f64x4(self, a: f64x4<Self>, b: f64x4<Self>) -> mask64x4<Self>;
1898 #[doc = "Compare two vectors element-wise for greater than.\n\nReturns a mask where each element is all ones if `a` is greater than `b`, and all zeroes if not."]
1899 fn simd_gt_f64x4(self, a: f64x4<Self>, b: f64x4<Self>) -> mask64x4<Self>;
1900 #[doc = "Interleave the lower half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, b0, a1, b1]`.\n\n**Note:** This operation is only useful if you need to discard elements `a2, a3, b2, b3`.\n For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
1901 fn zip_low_f64x4(self, a: f64x4<Self>, b: f64x4<Self>) -> f64x4<Self>;
1902 #[doc = "Interleave the upper half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a2, b2, a3, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a1, b0, b1`.For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
1903 fn zip_high_f64x4(self, a: f64x4<Self>, b: f64x4<Self>) -> f64x4<Self>;
1904 #[doc = "Extract even-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, a2, b0, b2]`.\n\n**Note:** This operation is only useful if you need to discard elements `a1, a3, b1, b3`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
1905 fn unzip_low_f64x4(self, a: f64x4<Self>, b: f64x4<Self>) -> f64x4<Self>;
1906 #[doc = "Extract odd-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a1, a3, b1, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a2, b0, b2`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
1907 fn unzip_high_f64x4(self, a: f64x4<Self>, b: f64x4<Self>) -> f64x4<Self>;
1908 #[doc = "Interleave two vectors.\n\nThe resulting vectors contain elements taken alternately from `a` and `b`, first filling the first result, and then the second.\n\nThe reverse of this operation is `deinterleave`.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `([a0, b0, a1, b1], [a2, b2, a3, b3])`."]
1909 fn interleave_f64x4(self, a: f64x4<Self>, b: f64x4<Self>) -> (f64x4<Self>, f64x4<Self>);
1910 #[doc = "Deinterleave two vectors.\n\nThe first result contains all even-indexed elements from `a` followed by all even-indexed elements from `b`. The second result contains all odd-indexed elements from `a` followed by all odd-indexed elements from `b`.\n\nThe reverse of this operation is `interleave`.\n\nFor vectors `[a0, b0, a1, b1]` and `[a2, b2, a3, b3]`, returns `([a0, a1, a2, a3], [b0, b1, b2, b3])`."]
1911 fn deinterleave_f64x4(self, a: f64x4<Self>, b: f64x4<Self>) -> (f64x4<Self>, f64x4<Self>);
1912 #[doc = "Return the element-wise maximum of two vectors.\n\nIf either operand is NaN, the result for that lane is implementation-defined-- it could be either the first or second operand. See `max_precise` for a version that returns the non-NaN operand if only one is NaN.\n\nIf one operand is positive zero and the other is negative zero, the result is also implementation-defined, and it could be either one."]
1913 fn max_f64x4(self, a: f64x4<Self>, b: f64x4<Self>) -> f64x4<Self>;
1914 #[doc = "Return the element-wise minimum of two vectors.\n\nIf either operand is NaN, the result for that lane is implementation-defined-- it could be either the first or second operand. See `min_precise` for a version that returns the non-NaN operand if only one is NaN.\n\nIf one operand is positive zero and the other is negative zero, the result is also implementation-defined, and it could be either one."]
1915 fn min_f64x4(self, a: f64x4<Self>, b: f64x4<Self>) -> f64x4<Self>;
1916 #[doc = "Return the element-wise maximum of two vectors.\n\nIf one operand is a quiet NaN and the other is not, this operation will choose the non-NaN operand.\n\nIf one operand is positive zero and the other is negative zero, the result is implementation-defined, and it could be either one.\n\nIf an operand is a *signaling* NaN, the result is not just implementation-defined, but fully non-deterministic: it may be either NaN or the non-NaN operand.\nSignaling NaN values are not produced by floating-point math operations, only from manual initialization with specific bit patterns. You probably don't need to worry about them."]
1917 fn max_precise_f64x4(self, a: f64x4<Self>, b: f64x4<Self>) -> f64x4<Self>;
1918 #[doc = "Return the element-wise minimum of two vectors.\n\nIf one operand is a quiet NaN and the other is not, this operation will choose the non-NaN operand.\n\nIf one operand is positive zero and the other is negative zero, the result is implementation-defined, and it could be either one.\n\nIf an operand is a *signaling* NaN, the result is not just implementation-defined, but fully non-deterministic: it may be either NaN or the non-NaN operand.\nSignaling NaN values are not produced by floating-point math operations, only from manual initialization with specific bit patterns. You probably don't need to worry about them."]
1919 fn min_precise_f64x4(self, a: f64x4<Self>, b: f64x4<Self>) -> f64x4<Self>;
1920 #[doc = "Compute `(a * b) + c` (fused multiply-add) for each element.\n\nDepending on hardware support, the result may be computed with only one rounding error, or may be implemented as a regular multiply followed by an add, which will result in two rounding errors."]
1921 fn mul_add_f64x4(self, a: f64x4<Self>, b: f64x4<Self>, c: f64x4<Self>) -> f64x4<Self>;
1922 #[doc = "Compute `(a * b) - c` (fused multiply-subtract) for each element.\n\nDepending on hardware support, the result may be computed with only one rounding error, or may be implemented as a regular multiply followed by a subtract, which will result in two rounding errors."]
1923 fn mul_sub_f64x4(self, a: f64x4<Self>, b: f64x4<Self>, c: f64x4<Self>) -> f64x4<Self>;
1924 #[doc = "Return the largest integer less than or equal to each element, that is, round towards negative infinity."]
1925 fn floor_f64x4(self, a: f64x4<Self>) -> f64x4<Self>;
1926 #[doc = "Return the smallest integer greater than or equal to each element, that is, round towards positive infinity."]
1927 fn ceil_f64x4(self, a: f64x4<Self>) -> f64x4<Self>;
1928 #[doc = "Round each element to the nearest integer, with ties rounding to the nearest even integer.\n\nThere is no corresponding `round` operation. Rust's `round` operation rounds ties away from zero, a behavior it inherited from C. That behavior is not implemented across all platforms, whereas round-ties-even is."]
1929 fn round_ties_even_f64x4(self, a: f64x4<Self>) -> f64x4<Self>;
1930 #[doc = "Return the fractional part of each element.\n\nThis is equivalent to `a - a.trunc()`."]
1931 fn fract_f64x4(self, a: f64x4<Self>) -> f64x4<Self>;
1932 #[doc = "Return the integer part of each element, rounding towards zero."]
1933 fn trunc_f64x4(self, a: f64x4<Self>) -> f64x4<Self>;
1934 #[doc = "Select elements from b and c based on the mask operand a.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
1935 fn select_f64x4(self, a: mask64x4<Self>, b: f64x4<Self>, c: f64x4<Self>) -> f64x4<Self>;
1936 #[doc = "Combine two vectors into a single vector with twice the width.\n\n`a` provides the lower elements and `b` provides the upper elements."]
1937 fn combine_f64x4(self, a: f64x4<Self>, b: f64x4<Self>) -> f64x8<Self>;
1938 #[doc = "Split a vector into two vectors of half the width.\n\nReturns a tuple of (lower half, upper half)."]
1939 fn split_f64x4(self, a: f64x4<Self>) -> (f64x2<Self>, f64x2<Self>);
1940 #[doc = "Reinterpret the bits of this vector as a vector of `f32` elements.\n\nThe number of elements in the result is twice that of the input."]
1941 fn reinterpret_f32_f64x4(self, a: f64x4<Self>) -> f32x8<Self>;
1942 #[doc = "Create a SIMD vector with all elements set to the given value."]
1943 fn splat_mask64x4(self, val: i64) -> mask64x4<Self>;
1944 #[doc = "Create a SIMD vector from an array of the same length."]
1945 fn load_array_mask64x4(self, val: [i64; 4usize]) -> mask64x4<Self>;
1946 #[doc = "Create a SIMD vector from an array of the same length."]
1947 fn load_array_ref_mask64x4(self, val: &[i64; 4usize]) -> mask64x4<Self>;
1948 #[doc = "Convert a SIMD vector to an array."]
1949 fn as_array_mask64x4(self, a: mask64x4<Self>) -> [i64; 4usize];
1950 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
1951 fn as_array_ref_mask64x4(self, a: &mask64x4<Self>) -> &[i64; 4usize];
1952 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
1953 fn as_array_mut_mask64x4(self, a: &mut mask64x4<Self>) -> &mut [i64; 4usize];
1954 #[doc = "Store a SIMD vector into an array of the same length."]
1955 fn store_array_mask64x4(self, a: mask64x4<Self>, dest: &mut [i64; 4usize]) -> ();
1956 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
1957 fn cvt_from_bytes_mask64x4(self, a: u8x32<Self>) -> mask64x4<Self>;
1958 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
1959 fn cvt_to_bytes_mask64x4(self, a: mask64x4<Self>) -> u8x32<Self>;
1960 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
1961 fn slide_mask64x4<const SHIFT: usize>(
1962 self,
1963 a: mask64x4<Self>,
1964 b: mask64x4<Self>,
1965 ) -> mask64x4<Self>;
1966 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
1967 fn slide_within_blocks_mask64x4<const SHIFT: usize>(
1968 self,
1969 a: mask64x4<Self>,
1970 b: mask64x4<Self>,
1971 ) -> mask64x4<Self>;
1972 #[doc = "Compute the logical AND of two masks."]
1973 fn and_mask64x4(self, a: mask64x4<Self>, b: mask64x4<Self>) -> mask64x4<Self>;
1974 #[doc = "Compute the logical OR of two masks."]
1975 fn or_mask64x4(self, a: mask64x4<Self>, b: mask64x4<Self>) -> mask64x4<Self>;
1976 #[doc = "Compute the logical XOR of two masks."]
1977 fn xor_mask64x4(self, a: mask64x4<Self>, b: mask64x4<Self>) -> mask64x4<Self>;
1978 #[doc = "Compute the logical NOT of the mask."]
1979 fn not_mask64x4(self, a: mask64x4<Self>) -> mask64x4<Self>;
1980 #[doc = "Select elements from `b` and `c` based on the mask operand `a`.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
1981 fn select_mask64x4(
1982 self,
1983 a: mask64x4<Self>,
1984 b: mask64x4<Self>,
1985 c: mask64x4<Self>,
1986 ) -> mask64x4<Self>;
1987 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
1988 fn simd_eq_mask64x4(self, a: mask64x4<Self>, b: mask64x4<Self>) -> mask64x4<Self>;
1989 #[doc = "Returns true if any elements in this mask are true (all ones).\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
1990 fn any_true_mask64x4(self, a: mask64x4<Self>) -> bool;
1991 #[doc = "Returns true if all elements in this mask are true (all ones).\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
1992 fn all_true_mask64x4(self, a: mask64x4<Self>) -> bool;
1993 #[doc = "Returns true if any elements in this mask are false (all zeroes).\n\nThis is logically equivalent to `!all_true`, but may be faster.\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
1994 fn any_false_mask64x4(self, a: mask64x4<Self>) -> bool;
1995 #[doc = "Returns true if all elements in this mask are false (all zeroes).\n\nThis is logically equivalent to `!any_true`, but may be faster.\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
1996 fn all_false_mask64x4(self, a: mask64x4<Self>) -> bool;
1997 #[doc = "Combine two vectors into a single vector with twice the width.\n\n`a` provides the lower elements and `b` provides the upper elements."]
1998 fn combine_mask64x4(self, a: mask64x4<Self>, b: mask64x4<Self>) -> mask64x8<Self>;
1999 #[doc = "Split a vector into two vectors of half the width.\n\nReturns a tuple of (lower half, upper half)."]
2000 fn split_mask64x4(self, a: mask64x4<Self>) -> (mask64x2<Self>, mask64x2<Self>);
2001 #[doc = "Create a SIMD vector with all elements set to the given value."]
2002 fn splat_f32x16(self, val: f32) -> f32x16<Self>;
2003 #[doc = "Create a SIMD vector from an array of the same length."]
2004 fn load_array_f32x16(self, val: [f32; 16usize]) -> f32x16<Self>;
2005 #[doc = "Create a SIMD vector from an array of the same length."]
2006 fn load_array_ref_f32x16(self, val: &[f32; 16usize]) -> f32x16<Self>;
2007 #[doc = "Convert a SIMD vector to an array."]
2008 fn as_array_f32x16(self, a: f32x16<Self>) -> [f32; 16usize];
2009 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
2010 fn as_array_ref_f32x16(self, a: &f32x16<Self>) -> &[f32; 16usize];
2011 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
2012 fn as_array_mut_f32x16(self, a: &mut f32x16<Self>) -> &mut [f32; 16usize];
2013 #[doc = "Store a SIMD vector into an array of the same length."]
2014 fn store_array_f32x16(self, a: f32x16<Self>, dest: &mut [f32; 16usize]) -> ();
2015 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
2016 fn cvt_from_bytes_f32x16(self, a: u8x64<Self>) -> f32x16<Self>;
2017 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
2018 fn cvt_to_bytes_f32x16(self, a: f32x16<Self>) -> u8x64<Self>;
2019 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
2020 fn slide_f32x16<const SHIFT: usize>(self, a: f32x16<Self>, b: f32x16<Self>) -> f32x16<Self>;
2021 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
2022 fn slide_within_blocks_f32x16<const SHIFT: usize>(
2023 self,
2024 a: f32x16<Self>,
2025 b: f32x16<Self>,
2026 ) -> f32x16<Self>;
2027 #[doc = "Compute the absolute value of each element."]
2028 fn abs_f32x16(self, a: f32x16<Self>) -> f32x16<Self>;
2029 #[doc = "Negate each element of the vector."]
2030 fn neg_f32x16(self, a: f32x16<Self>) -> f32x16<Self>;
2031 #[doc = "Compute the square root of each element.\n\nNegative elements other than `-0.0` will become NaN."]
2032 fn sqrt_f32x16(self, a: f32x16<Self>) -> f32x16<Self>;
2033 #[doc = "Add two vectors element-wise."]
2034 fn add_f32x16(self, a: f32x16<Self>, b: f32x16<Self>) -> f32x16<Self>;
2035 #[doc = "Subtract two vectors element-wise."]
2036 fn sub_f32x16(self, a: f32x16<Self>, b: f32x16<Self>) -> f32x16<Self>;
2037 #[doc = "Multiply two vectors element-wise."]
2038 fn mul_f32x16(self, a: f32x16<Self>, b: f32x16<Self>) -> f32x16<Self>;
2039 #[doc = "Divide two vectors element-wise."]
2040 fn div_f32x16(self, a: f32x16<Self>, b: f32x16<Self>) -> f32x16<Self>;
2041 #[doc = "Return a vector with the magnitude of `a` and the sign of `b` for each element.\n\nThis operation copies the sign bit, so if an input element is NaN, the output element will be a NaN with the same payload and a copied sign bit."]
2042 fn copysign_f32x16(self, a: f32x16<Self>, b: f32x16<Self>) -> f32x16<Self>;
2043 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
2044 fn simd_eq_f32x16(self, a: f32x16<Self>, b: f32x16<Self>) -> mask32x16<Self>;
2045 #[doc = "Compare two vectors element-wise for less than.\n\nReturns a mask where each element is all ones if `a` is less than `b`, and all zeroes if not."]
2046 fn simd_lt_f32x16(self, a: f32x16<Self>, b: f32x16<Self>) -> mask32x16<Self>;
2047 #[doc = "Compare two vectors element-wise for less than or equal.\n\nReturns a mask where each element is all ones if `a` is less than or equal to `b`, and all zeroes if not."]
2048 fn simd_le_f32x16(self, a: f32x16<Self>, b: f32x16<Self>) -> mask32x16<Self>;
2049 #[doc = "Compare two vectors element-wise for greater than or equal.\n\nReturns a mask where each element is all ones if `a` is greater than or equal to `b`, and all zeroes if not."]
2050 fn simd_ge_f32x16(self, a: f32x16<Self>, b: f32x16<Self>) -> mask32x16<Self>;
2051 #[doc = "Compare two vectors element-wise for greater than.\n\nReturns a mask where each element is all ones if `a` is greater than `b`, and all zeroes if not."]
2052 fn simd_gt_f32x16(self, a: f32x16<Self>, b: f32x16<Self>) -> mask32x16<Self>;
2053 #[doc = "Interleave the lower half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, b0, a1, b1]`.\n\n**Note:** This operation is only useful if you need to discard elements `a2, a3, b2, b3`.\n For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
2054 fn zip_low_f32x16(self, a: f32x16<Self>, b: f32x16<Self>) -> f32x16<Self>;
2055 #[doc = "Interleave the upper half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a2, b2, a3, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a1, b0, b1`.For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
2056 fn zip_high_f32x16(self, a: f32x16<Self>, b: f32x16<Self>) -> f32x16<Self>;
2057 #[doc = "Extract even-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, a2, b0, b2]`.\n\n**Note:** This operation is only useful if you need to discard elements `a1, a3, b1, b3`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
2058 fn unzip_low_f32x16(self, a: f32x16<Self>, b: f32x16<Self>) -> f32x16<Self>;
2059 #[doc = "Extract odd-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a1, a3, b1, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a2, b0, b2`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
2060 fn unzip_high_f32x16(self, a: f32x16<Self>, b: f32x16<Self>) -> f32x16<Self>;
2061 #[doc = "Interleave two vectors.\n\nThe resulting vectors contain elements taken alternately from `a` and `b`, first filling the first result, and then the second.\n\nThe reverse of this operation is `deinterleave`.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `([a0, b0, a1, b1], [a2, b2, a3, b3])`."]
2062 fn interleave_f32x16(self, a: f32x16<Self>, b: f32x16<Self>) -> (f32x16<Self>, f32x16<Self>);
2063 #[doc = "Deinterleave two vectors.\n\nThe first result contains all even-indexed elements from `a` followed by all even-indexed elements from `b`. The second result contains all odd-indexed elements from `a` followed by all odd-indexed elements from `b`.\n\nThe reverse of this operation is `interleave`.\n\nFor vectors `[a0, b0, a1, b1]` and `[a2, b2, a3, b3]`, returns `([a0, a1, a2, a3], [b0, b1, b2, b3])`."]
2064 fn deinterleave_f32x16(self, a: f32x16<Self>, b: f32x16<Self>) -> (f32x16<Self>, f32x16<Self>);
2065 #[doc = "Return the element-wise maximum of two vectors.\n\nIf either operand is NaN, the result for that lane is implementation-defined-- it could be either the first or second operand. See `max_precise` for a version that returns the non-NaN operand if only one is NaN.\n\nIf one operand is positive zero and the other is negative zero, the result is also implementation-defined, and it could be either one."]
2066 fn max_f32x16(self, a: f32x16<Self>, b: f32x16<Self>) -> f32x16<Self>;
2067 #[doc = "Return the element-wise minimum of two vectors.\n\nIf either operand is NaN, the result for that lane is implementation-defined-- it could be either the first or second operand. See `min_precise` for a version that returns the non-NaN operand if only one is NaN.\n\nIf one operand is positive zero and the other is negative zero, the result is also implementation-defined, and it could be either one."]
2068 fn min_f32x16(self, a: f32x16<Self>, b: f32x16<Self>) -> f32x16<Self>;
2069 #[doc = "Return the element-wise maximum of two vectors.\n\nIf one operand is a quiet NaN and the other is not, this operation will choose the non-NaN operand.\n\nIf one operand is positive zero and the other is negative zero, the result is implementation-defined, and it could be either one.\n\nIf an operand is a *signaling* NaN, the result is not just implementation-defined, but fully non-deterministic: it may be either NaN or the non-NaN operand.\nSignaling NaN values are not produced by floating-point math operations, only from manual initialization with specific bit patterns. You probably don't need to worry about them."]
2070 fn max_precise_f32x16(self, a: f32x16<Self>, b: f32x16<Self>) -> f32x16<Self>;
2071 #[doc = "Return the element-wise minimum of two vectors.\n\nIf one operand is a quiet NaN and the other is not, this operation will choose the non-NaN operand.\n\nIf one operand is positive zero and the other is negative zero, the result is implementation-defined, and it could be either one.\n\nIf an operand is a *signaling* NaN, the result is not just implementation-defined, but fully non-deterministic: it may be either NaN or the non-NaN operand.\nSignaling NaN values are not produced by floating-point math operations, only from manual initialization with specific bit patterns. You probably don't need to worry about them."]
2072 fn min_precise_f32x16(self, a: f32x16<Self>, b: f32x16<Self>) -> f32x16<Self>;
2073 #[doc = "Compute `(a * b) + c` (fused multiply-add) for each element.\n\nDepending on hardware support, the result may be computed with only one rounding error, or may be implemented as a regular multiply followed by an add, which will result in two rounding errors."]
2074 fn mul_add_f32x16(self, a: f32x16<Self>, b: f32x16<Self>, c: f32x16<Self>) -> f32x16<Self>;
2075 #[doc = "Compute `(a * b) - c` (fused multiply-subtract) for each element.\n\nDepending on hardware support, the result may be computed with only one rounding error, or may be implemented as a regular multiply followed by a subtract, which will result in two rounding errors."]
2076 fn mul_sub_f32x16(self, a: f32x16<Self>, b: f32x16<Self>, c: f32x16<Self>) -> f32x16<Self>;
2077 #[doc = "Return the largest integer less than or equal to each element, that is, round towards negative infinity."]
2078 fn floor_f32x16(self, a: f32x16<Self>) -> f32x16<Self>;
2079 #[doc = "Return the smallest integer greater than or equal to each element, that is, round towards positive infinity."]
2080 fn ceil_f32x16(self, a: f32x16<Self>) -> f32x16<Self>;
2081 #[doc = "Round each element to the nearest integer, with ties rounding to the nearest even integer.\n\nThere is no corresponding `round` operation. Rust's `round` operation rounds ties away from zero, a behavior it inherited from C. That behavior is not implemented across all platforms, whereas round-ties-even is."]
2082 fn round_ties_even_f32x16(self, a: f32x16<Self>) -> f32x16<Self>;
2083 #[doc = "Return the fractional part of each element.\n\nThis is equivalent to `a - a.trunc()`."]
2084 fn fract_f32x16(self, a: f32x16<Self>) -> f32x16<Self>;
2085 #[doc = "Return the integer part of each element, rounding towards zero."]
2086 fn trunc_f32x16(self, a: f32x16<Self>) -> f32x16<Self>;
2087 #[doc = "Select elements from b and c based on the mask operand a.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
2088 fn select_f32x16(self, a: mask32x16<Self>, b: f32x16<Self>, c: f32x16<Self>) -> f32x16<Self>;
2089 #[doc = "Split a vector into two vectors of half the width.\n\nReturns a tuple of (lower half, upper half)."]
2090 fn split_f32x16(self, a: f32x16<Self>) -> (f32x8<Self>, f32x8<Self>);
2091 #[doc = "Reinterpret the bits of this vector as a vector of `f64` elements.\n\nThe number of elements in the result is half that of the input."]
2092 fn reinterpret_f64_f32x16(self, a: f32x16<Self>) -> f64x8<Self>;
2093 #[doc = "Reinterpret the bits of this vector as a vector of `i32` elements.\n\nThis is a bitwise reinterpretation only, and does not perform any conversions."]
2094 fn reinterpret_i32_f32x16(self, a: f32x16<Self>) -> i32x16<Self>;
2095 #[doc = "Load elements from an array with 4-way interleaving.\n\nReads consecutive elements and deinterleaves them into a single vector."]
2096 fn load_interleaved_128_f32x16(self, src: &[f32; 16usize]) -> f32x16<Self>;
2097 #[doc = "Store elements to an array with 4-way interleaving.\n\nInterleaves the vector elements and writes them consecutively to memory."]
2098 fn store_interleaved_128_f32x16(self, a: f32x16<Self>, dest: &mut [f32; 16usize]) -> ();
2099 #[doc = "Reinterpret the bits of this vector as a vector of `u8` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
2100 fn reinterpret_u8_f32x16(self, a: f32x16<Self>) -> u8x64<Self>;
2101 #[doc = "Reinterpret the bits of this vector as a vector of `u32` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
2102 fn reinterpret_u32_f32x16(self, a: f32x16<Self>) -> u32x16<Self>;
2103 #[doc = "Convert each floating-point element to an unsigned 32-bit integer, truncating towards zero.\n\nOut-of-range values or NaN will produce implementation-defined results.\n\nOn x86 platforms, this operation will still be slower than converting to `i32`, because there is no native instruction for converting to `u32` (at least until AVX-512, which is currently not supported).\nIf you know your values fit within range of an `i32`, you should convert to an `i32` and cast to your desired datatype afterwards."]
2104 fn cvt_u32_f32x16(self, a: f32x16<Self>) -> u32x16<Self>;
2105 #[doc = "Convert each floating-point element to an unsigned 32-bit integer, truncating towards zero.\n\nOut-of-range values are saturated to the closest in-range value. NaN becomes 0."]
2106 fn cvt_u32_precise_f32x16(self, a: f32x16<Self>) -> u32x16<Self>;
2107 #[doc = "Convert each floating-point element to a signed 32-bit integer, truncating towards zero.\n\nOut-of-range values or NaN will produce implementation-defined results."]
2108 fn cvt_i32_f32x16(self, a: f32x16<Self>) -> i32x16<Self>;
2109 #[doc = "Convert each floating-point element to a signed 32-bit integer, truncating towards zero.\n\nOut-of-range values are saturated to the closest in-range value. NaN becomes 0."]
2110 fn cvt_i32_precise_f32x16(self, a: f32x16<Self>) -> i32x16<Self>;
2111 #[doc = "Create a SIMD vector with all elements set to the given value."]
2112 fn splat_i8x64(self, val: i8) -> i8x64<Self>;
2113 #[doc = "Create a SIMD vector from an array of the same length."]
2114 fn load_array_i8x64(self, val: [i8; 64usize]) -> i8x64<Self>;
2115 #[doc = "Create a SIMD vector from an array of the same length."]
2116 fn load_array_ref_i8x64(self, val: &[i8; 64usize]) -> i8x64<Self>;
2117 #[doc = "Convert a SIMD vector to an array."]
2118 fn as_array_i8x64(self, a: i8x64<Self>) -> [i8; 64usize];
2119 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
2120 fn as_array_ref_i8x64(self, a: &i8x64<Self>) -> &[i8; 64usize];
2121 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
2122 fn as_array_mut_i8x64(self, a: &mut i8x64<Self>) -> &mut [i8; 64usize];
2123 #[doc = "Store a SIMD vector into an array of the same length."]
2124 fn store_array_i8x64(self, a: i8x64<Self>, dest: &mut [i8; 64usize]) -> ();
2125 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
2126 fn cvt_from_bytes_i8x64(self, a: u8x64<Self>) -> i8x64<Self>;
2127 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
2128 fn cvt_to_bytes_i8x64(self, a: i8x64<Self>) -> u8x64<Self>;
2129 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
2130 fn slide_i8x64<const SHIFT: usize>(self, a: i8x64<Self>, b: i8x64<Self>) -> i8x64<Self>;
2131 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
2132 fn slide_within_blocks_i8x64<const SHIFT: usize>(
2133 self,
2134 a: i8x64<Self>,
2135 b: i8x64<Self>,
2136 ) -> i8x64<Self>;
2137 #[doc = "Add two vectors element-wise, wrapping on overflow."]
2138 fn add_i8x64(self, a: i8x64<Self>, b: i8x64<Self>) -> i8x64<Self>;
2139 #[doc = "Subtract two vectors element-wise, wrapping on overflow."]
2140 fn sub_i8x64(self, a: i8x64<Self>, b: i8x64<Self>) -> i8x64<Self>;
2141 #[doc = "Multiply two vectors element-wise, wrapping on overflow."]
2142 fn mul_i8x64(self, a: i8x64<Self>, b: i8x64<Self>) -> i8x64<Self>;
2143 #[doc = "Compute the bitwise AND of two vectors."]
2144 fn and_i8x64(self, a: i8x64<Self>, b: i8x64<Self>) -> i8x64<Self>;
2145 #[doc = "Compute the bitwise OR of two vectors."]
2146 fn or_i8x64(self, a: i8x64<Self>, b: i8x64<Self>) -> i8x64<Self>;
2147 #[doc = "Compute the bitwise XOR of two vectors."]
2148 fn xor_i8x64(self, a: i8x64<Self>, b: i8x64<Self>) -> i8x64<Self>;
2149 #[doc = "Compute the bitwise NOT of the vector."]
2150 fn not_i8x64(self, a: i8x64<Self>) -> i8x64<Self>;
2151 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right."]
2152 fn shl_i8x64(self, a: i8x64<Self>, shift: u32) -> i8x64<Self>;
2153 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
2154 fn shlv_i8x64(self, a: i8x64<Self>, b: i8x64<Self>) -> i8x64<Self>;
2155 #[doc = "Shift each element right by the given number of bits.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated."]
2156 fn shr_i8x64(self, a: i8x64<Self>, shift: u32) -> i8x64<Self>;
2157 #[doc = "Shift each element right by the corresponding element in another vector.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
2158 fn shrv_i8x64(self, a: i8x64<Self>, b: i8x64<Self>) -> i8x64<Self>;
2159 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
2160 fn simd_eq_i8x64(self, a: i8x64<Self>, b: i8x64<Self>) -> mask8x64<Self>;
2161 #[doc = "Compare two vectors element-wise for less than.\n\nReturns a mask where each element is all ones if `a` is less than `b`, and all zeroes if not."]
2162 fn simd_lt_i8x64(self, a: i8x64<Self>, b: i8x64<Self>) -> mask8x64<Self>;
2163 #[doc = "Compare two vectors element-wise for less than or equal.\n\nReturns a mask where each element is all ones if `a` is less than or equal to `b`, and all zeroes if not."]
2164 fn simd_le_i8x64(self, a: i8x64<Self>, b: i8x64<Self>) -> mask8x64<Self>;
2165 #[doc = "Compare two vectors element-wise for greater than or equal.\n\nReturns a mask where each element is all ones if `a` is greater than or equal to `b`, and all zeroes if not."]
2166 fn simd_ge_i8x64(self, a: i8x64<Self>, b: i8x64<Self>) -> mask8x64<Self>;
2167 #[doc = "Compare two vectors element-wise for greater than.\n\nReturns a mask where each element is all ones if `a` is greater than `b`, and all zeroes if not."]
2168 fn simd_gt_i8x64(self, a: i8x64<Self>, b: i8x64<Self>) -> mask8x64<Self>;
2169 #[doc = "Interleave the lower half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, b0, a1, b1]`.\n\n**Note:** This operation is only useful if you need to discard elements `a2, a3, b2, b3`.\n For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
2170 fn zip_low_i8x64(self, a: i8x64<Self>, b: i8x64<Self>) -> i8x64<Self>;
2171 #[doc = "Interleave the upper half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a2, b2, a3, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a1, b0, b1`.For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
2172 fn zip_high_i8x64(self, a: i8x64<Self>, b: i8x64<Self>) -> i8x64<Self>;
2173 #[doc = "Extract even-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, a2, b0, b2]`.\n\n**Note:** This operation is only useful if you need to discard elements `a1, a3, b1, b3`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
2174 fn unzip_low_i8x64(self, a: i8x64<Self>, b: i8x64<Self>) -> i8x64<Self>;
2175 #[doc = "Extract odd-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a1, a3, b1, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a2, b0, b2`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
2176 fn unzip_high_i8x64(self, a: i8x64<Self>, b: i8x64<Self>) -> i8x64<Self>;
2177 #[doc = "Interleave two vectors.\n\nThe resulting vectors contain elements taken alternately from `a` and `b`, first filling the first result, and then the second.\n\nThe reverse of this operation is `deinterleave`.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `([a0, b0, a1, b1], [a2, b2, a3, b3])`."]
2178 fn interleave_i8x64(self, a: i8x64<Self>, b: i8x64<Self>) -> (i8x64<Self>, i8x64<Self>);
2179 #[doc = "Deinterleave two vectors.\n\nThe first result contains all even-indexed elements from `a` followed by all even-indexed elements from `b`. The second result contains all odd-indexed elements from `a` followed by all odd-indexed elements from `b`.\n\nThe reverse of this operation is `interleave`.\n\nFor vectors `[a0, b0, a1, b1]` and `[a2, b2, a3, b3]`, returns `([a0, a1, a2, a3], [b0, b1, b2, b3])`."]
2180 fn deinterleave_i8x64(self, a: i8x64<Self>, b: i8x64<Self>) -> (i8x64<Self>, i8x64<Self>);
2181 #[doc = "Select elements from b and c based on the mask operand a.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
2182 fn select_i8x64(self, a: mask8x64<Self>, b: i8x64<Self>, c: i8x64<Self>) -> i8x64<Self>;
2183 #[doc = "Return the element-wise minimum of two vectors."]
2184 fn min_i8x64(self, a: i8x64<Self>, b: i8x64<Self>) -> i8x64<Self>;
2185 #[doc = "Return the element-wise maximum of two vectors."]
2186 fn max_i8x64(self, a: i8x64<Self>, b: i8x64<Self>) -> i8x64<Self>;
2187 #[doc = "Split a vector into two vectors of half the width.\n\nReturns a tuple of (lower half, upper half)."]
2188 fn split_i8x64(self, a: i8x64<Self>) -> (i8x32<Self>, i8x32<Self>);
2189 #[doc = "Negate each element of the vector, wrapping on overflow."]
2190 fn neg_i8x64(self, a: i8x64<Self>) -> i8x64<Self>;
2191 #[doc = "Reinterpret the bits of this vector as a vector of `u8` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
2192 fn reinterpret_u8_i8x64(self, a: i8x64<Self>) -> u8x64<Self>;
2193 #[doc = "Reinterpret the bits of this vector as a vector of `u32` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
2194 fn reinterpret_u32_i8x64(self, a: i8x64<Self>) -> u32x16<Self>;
2195 #[doc = "Create a SIMD vector with all elements set to the given value."]
2196 fn splat_u8x64(self, val: u8) -> u8x64<Self>;
2197 #[doc = "Create a SIMD vector from an array of the same length."]
2198 fn load_array_u8x64(self, val: [u8; 64usize]) -> u8x64<Self>;
2199 #[doc = "Create a SIMD vector from an array of the same length."]
2200 fn load_array_ref_u8x64(self, val: &[u8; 64usize]) -> u8x64<Self>;
2201 #[doc = "Convert a SIMD vector to an array."]
2202 fn as_array_u8x64(self, a: u8x64<Self>) -> [u8; 64usize];
2203 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
2204 fn as_array_ref_u8x64(self, a: &u8x64<Self>) -> &[u8; 64usize];
2205 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
2206 fn as_array_mut_u8x64(self, a: &mut u8x64<Self>) -> &mut [u8; 64usize];
2207 #[doc = "Store a SIMD vector into an array of the same length."]
2208 fn store_array_u8x64(self, a: u8x64<Self>, dest: &mut [u8; 64usize]) -> ();
2209 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
2210 fn cvt_from_bytes_u8x64(self, a: u8x64<Self>) -> u8x64<Self>;
2211 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
2212 fn cvt_to_bytes_u8x64(self, a: u8x64<Self>) -> u8x64<Self>;
2213 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
2214 fn slide_u8x64<const SHIFT: usize>(self, a: u8x64<Self>, b: u8x64<Self>) -> u8x64<Self>;
2215 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
2216 fn slide_within_blocks_u8x64<const SHIFT: usize>(
2217 self,
2218 a: u8x64<Self>,
2219 b: u8x64<Self>,
2220 ) -> u8x64<Self>;
2221 #[doc = "Add two vectors element-wise, wrapping on overflow."]
2222 fn add_u8x64(self, a: u8x64<Self>, b: u8x64<Self>) -> u8x64<Self>;
2223 #[doc = "Subtract two vectors element-wise, wrapping on overflow."]
2224 fn sub_u8x64(self, a: u8x64<Self>, b: u8x64<Self>) -> u8x64<Self>;
2225 #[doc = "Multiply two vectors element-wise, wrapping on overflow."]
2226 fn mul_u8x64(self, a: u8x64<Self>, b: u8x64<Self>) -> u8x64<Self>;
2227 #[doc = "Compute the bitwise AND of two vectors."]
2228 fn and_u8x64(self, a: u8x64<Self>, b: u8x64<Self>) -> u8x64<Self>;
2229 #[doc = "Compute the bitwise OR of two vectors."]
2230 fn or_u8x64(self, a: u8x64<Self>, b: u8x64<Self>) -> u8x64<Self>;
2231 #[doc = "Compute the bitwise XOR of two vectors."]
2232 fn xor_u8x64(self, a: u8x64<Self>, b: u8x64<Self>) -> u8x64<Self>;
2233 #[doc = "Compute the bitwise NOT of the vector."]
2234 fn not_u8x64(self, a: u8x64<Self>) -> u8x64<Self>;
2235 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right."]
2236 fn shl_u8x64(self, a: u8x64<Self>, shift: u32) -> u8x64<Self>;
2237 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
2238 fn shlv_u8x64(self, a: u8x64<Self>, b: u8x64<Self>) -> u8x64<Self>;
2239 #[doc = "Shift each element right by the given number of bits.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated."]
2240 fn shr_u8x64(self, a: u8x64<Self>, shift: u32) -> u8x64<Self>;
2241 #[doc = "Shift each element right by the corresponding element in another vector.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
2242 fn shrv_u8x64(self, a: u8x64<Self>, b: u8x64<Self>) -> u8x64<Self>;
2243 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
2244 fn simd_eq_u8x64(self, a: u8x64<Self>, b: u8x64<Self>) -> mask8x64<Self>;
2245 #[doc = "Compare two vectors element-wise for less than.\n\nReturns a mask where each element is all ones if `a` is less than `b`, and all zeroes if not."]
2246 fn simd_lt_u8x64(self, a: u8x64<Self>, b: u8x64<Self>) -> mask8x64<Self>;
2247 #[doc = "Compare two vectors element-wise for less than or equal.\n\nReturns a mask where each element is all ones if `a` is less than or equal to `b`, and all zeroes if not."]
2248 fn simd_le_u8x64(self, a: u8x64<Self>, b: u8x64<Self>) -> mask8x64<Self>;
2249 #[doc = "Compare two vectors element-wise for greater than or equal.\n\nReturns a mask where each element is all ones if `a` is greater than or equal to `b`, and all zeroes if not."]
2250 fn simd_ge_u8x64(self, a: u8x64<Self>, b: u8x64<Self>) -> mask8x64<Self>;
2251 #[doc = "Compare two vectors element-wise for greater than.\n\nReturns a mask where each element is all ones if `a` is greater than `b`, and all zeroes if not."]
2252 fn simd_gt_u8x64(self, a: u8x64<Self>, b: u8x64<Self>) -> mask8x64<Self>;
2253 #[doc = "Interleave the lower half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, b0, a1, b1]`.\n\n**Note:** This operation is only useful if you need to discard elements `a2, a3, b2, b3`.\n For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
2254 fn zip_low_u8x64(self, a: u8x64<Self>, b: u8x64<Self>) -> u8x64<Self>;
2255 #[doc = "Interleave the upper half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a2, b2, a3, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a1, b0, b1`.For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
2256 fn zip_high_u8x64(self, a: u8x64<Self>, b: u8x64<Self>) -> u8x64<Self>;
2257 #[doc = "Extract even-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, a2, b0, b2]`.\n\n**Note:** This operation is only useful if you need to discard elements `a1, a3, b1, b3`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
2258 fn unzip_low_u8x64(self, a: u8x64<Self>, b: u8x64<Self>) -> u8x64<Self>;
2259 #[doc = "Extract odd-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a1, a3, b1, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a2, b0, b2`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
2260 fn unzip_high_u8x64(self, a: u8x64<Self>, b: u8x64<Self>) -> u8x64<Self>;
2261 #[doc = "Interleave two vectors.\n\nThe resulting vectors contain elements taken alternately from `a` and `b`, first filling the first result, and then the second.\n\nThe reverse of this operation is `deinterleave`.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `([a0, b0, a1, b1], [a2, b2, a3, b3])`."]
2262 fn interleave_u8x64(self, a: u8x64<Self>, b: u8x64<Self>) -> (u8x64<Self>, u8x64<Self>);
2263 #[doc = "Deinterleave two vectors.\n\nThe first result contains all even-indexed elements from `a` followed by all even-indexed elements from `b`. The second result contains all odd-indexed elements from `a` followed by all odd-indexed elements from `b`.\n\nThe reverse of this operation is `interleave`.\n\nFor vectors `[a0, b0, a1, b1]` and `[a2, b2, a3, b3]`, returns `([a0, a1, a2, a3], [b0, b1, b2, b3])`."]
2264 fn deinterleave_u8x64(self, a: u8x64<Self>, b: u8x64<Self>) -> (u8x64<Self>, u8x64<Self>);
2265 #[doc = "Select elements from b and c based on the mask operand a.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
2266 fn select_u8x64(self, a: mask8x64<Self>, b: u8x64<Self>, c: u8x64<Self>) -> u8x64<Self>;
2267 #[doc = "Return the element-wise minimum of two vectors."]
2268 fn min_u8x64(self, a: u8x64<Self>, b: u8x64<Self>) -> u8x64<Self>;
2269 #[doc = "Return the element-wise maximum of two vectors."]
2270 fn max_u8x64(self, a: u8x64<Self>, b: u8x64<Self>) -> u8x64<Self>;
2271 #[doc = "Split a vector into two vectors of half the width.\n\nReturns a tuple of (lower half, upper half)."]
2272 fn split_u8x64(self, a: u8x64<Self>) -> (u8x32<Self>, u8x32<Self>);
2273 #[doc = "Load elements from an array with 4-way interleaving.\n\nReads consecutive elements and deinterleaves them into a single vector."]
2274 fn load_interleaved_128_u8x64(self, src: &[u8; 64usize]) -> u8x64<Self>;
2275 #[doc = "Store elements to an array with 4-way interleaving.\n\nInterleaves the vector elements and writes them consecutively to memory."]
2276 fn store_interleaved_128_u8x64(self, a: u8x64<Self>, dest: &mut [u8; 64usize]) -> ();
2277 #[doc = "Reinterpret the bits of this vector as a vector of `u32` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
2278 fn reinterpret_u32_u8x64(self, a: u8x64<Self>) -> u32x16<Self>;
2279 #[doc = "Create a SIMD vector with all elements set to the given value."]
2280 fn splat_mask8x64(self, val: i8) -> mask8x64<Self>;
2281 #[doc = "Create a SIMD vector from an array of the same length."]
2282 fn load_array_mask8x64(self, val: [i8; 64usize]) -> mask8x64<Self>;
2283 #[doc = "Create a SIMD vector from an array of the same length."]
2284 fn load_array_ref_mask8x64(self, val: &[i8; 64usize]) -> mask8x64<Self>;
2285 #[doc = "Convert a SIMD vector to an array."]
2286 fn as_array_mask8x64(self, a: mask8x64<Self>) -> [i8; 64usize];
2287 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
2288 fn as_array_ref_mask8x64(self, a: &mask8x64<Self>) -> &[i8; 64usize];
2289 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
2290 fn as_array_mut_mask8x64(self, a: &mut mask8x64<Self>) -> &mut [i8; 64usize];
2291 #[doc = "Store a SIMD vector into an array of the same length."]
2292 fn store_array_mask8x64(self, a: mask8x64<Self>, dest: &mut [i8; 64usize]) -> ();
2293 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
2294 fn cvt_from_bytes_mask8x64(self, a: u8x64<Self>) -> mask8x64<Self>;
2295 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
2296 fn cvt_to_bytes_mask8x64(self, a: mask8x64<Self>) -> u8x64<Self>;
2297 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
2298 fn slide_mask8x64<const SHIFT: usize>(
2299 self,
2300 a: mask8x64<Self>,
2301 b: mask8x64<Self>,
2302 ) -> mask8x64<Self>;
2303 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
2304 fn slide_within_blocks_mask8x64<const SHIFT: usize>(
2305 self,
2306 a: mask8x64<Self>,
2307 b: mask8x64<Self>,
2308 ) -> mask8x64<Self>;
2309 #[doc = "Compute the logical AND of two masks."]
2310 fn and_mask8x64(self, a: mask8x64<Self>, b: mask8x64<Self>) -> mask8x64<Self>;
2311 #[doc = "Compute the logical OR of two masks."]
2312 fn or_mask8x64(self, a: mask8x64<Self>, b: mask8x64<Self>) -> mask8x64<Self>;
2313 #[doc = "Compute the logical XOR of two masks."]
2314 fn xor_mask8x64(self, a: mask8x64<Self>, b: mask8x64<Self>) -> mask8x64<Self>;
2315 #[doc = "Compute the logical NOT of the mask."]
2316 fn not_mask8x64(self, a: mask8x64<Self>) -> mask8x64<Self>;
2317 #[doc = "Select elements from `b` and `c` based on the mask operand `a`.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
2318 fn select_mask8x64(
2319 self,
2320 a: mask8x64<Self>,
2321 b: mask8x64<Self>,
2322 c: mask8x64<Self>,
2323 ) -> mask8x64<Self>;
2324 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
2325 fn simd_eq_mask8x64(self, a: mask8x64<Self>, b: mask8x64<Self>) -> mask8x64<Self>;
2326 #[doc = "Returns true if any elements in this mask are true (all ones).\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
2327 fn any_true_mask8x64(self, a: mask8x64<Self>) -> bool;
2328 #[doc = "Returns true if all elements in this mask are true (all ones).\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
2329 fn all_true_mask8x64(self, a: mask8x64<Self>) -> bool;
2330 #[doc = "Returns true if any elements in this mask are false (all zeroes).\n\nThis is logically equivalent to `!all_true`, but may be faster.\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
2331 fn any_false_mask8x64(self, a: mask8x64<Self>) -> bool;
2332 #[doc = "Returns true if all elements in this mask are false (all zeroes).\n\nThis is logically equivalent to `!any_true`, but may be faster.\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
2333 fn all_false_mask8x64(self, a: mask8x64<Self>) -> bool;
2334 #[doc = "Split a vector into two vectors of half the width.\n\nReturns a tuple of (lower half, upper half)."]
2335 fn split_mask8x64(self, a: mask8x64<Self>) -> (mask8x32<Self>, mask8x32<Self>);
2336 #[doc = "Create a SIMD vector with all elements set to the given value."]
2337 fn splat_i16x32(self, val: i16) -> i16x32<Self>;
2338 #[doc = "Create a SIMD vector from an array of the same length."]
2339 fn load_array_i16x32(self, val: [i16; 32usize]) -> i16x32<Self>;
2340 #[doc = "Create a SIMD vector from an array of the same length."]
2341 fn load_array_ref_i16x32(self, val: &[i16; 32usize]) -> i16x32<Self>;
2342 #[doc = "Convert a SIMD vector to an array."]
2343 fn as_array_i16x32(self, a: i16x32<Self>) -> [i16; 32usize];
2344 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
2345 fn as_array_ref_i16x32(self, a: &i16x32<Self>) -> &[i16; 32usize];
2346 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
2347 fn as_array_mut_i16x32(self, a: &mut i16x32<Self>) -> &mut [i16; 32usize];
2348 #[doc = "Store a SIMD vector into an array of the same length."]
2349 fn store_array_i16x32(self, a: i16x32<Self>, dest: &mut [i16; 32usize]) -> ();
2350 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
2351 fn cvt_from_bytes_i16x32(self, a: u8x64<Self>) -> i16x32<Self>;
2352 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
2353 fn cvt_to_bytes_i16x32(self, a: i16x32<Self>) -> u8x64<Self>;
2354 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
2355 fn slide_i16x32<const SHIFT: usize>(self, a: i16x32<Self>, b: i16x32<Self>) -> i16x32<Self>;
2356 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
2357 fn slide_within_blocks_i16x32<const SHIFT: usize>(
2358 self,
2359 a: i16x32<Self>,
2360 b: i16x32<Self>,
2361 ) -> i16x32<Self>;
2362 #[doc = "Add two vectors element-wise, wrapping on overflow."]
2363 fn add_i16x32(self, a: i16x32<Self>, b: i16x32<Self>) -> i16x32<Self>;
2364 #[doc = "Subtract two vectors element-wise, wrapping on overflow."]
2365 fn sub_i16x32(self, a: i16x32<Self>, b: i16x32<Self>) -> i16x32<Self>;
2366 #[doc = "Multiply two vectors element-wise, wrapping on overflow."]
2367 fn mul_i16x32(self, a: i16x32<Self>, b: i16x32<Self>) -> i16x32<Self>;
2368 #[doc = "Compute the bitwise AND of two vectors."]
2369 fn and_i16x32(self, a: i16x32<Self>, b: i16x32<Self>) -> i16x32<Self>;
2370 #[doc = "Compute the bitwise OR of two vectors."]
2371 fn or_i16x32(self, a: i16x32<Self>, b: i16x32<Self>) -> i16x32<Self>;
2372 #[doc = "Compute the bitwise XOR of two vectors."]
2373 fn xor_i16x32(self, a: i16x32<Self>, b: i16x32<Self>) -> i16x32<Self>;
2374 #[doc = "Compute the bitwise NOT of the vector."]
2375 fn not_i16x32(self, a: i16x32<Self>) -> i16x32<Self>;
2376 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right."]
2377 fn shl_i16x32(self, a: i16x32<Self>, shift: u32) -> i16x32<Self>;
2378 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
2379 fn shlv_i16x32(self, a: i16x32<Self>, b: i16x32<Self>) -> i16x32<Self>;
2380 #[doc = "Shift each element right by the given number of bits.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated."]
2381 fn shr_i16x32(self, a: i16x32<Self>, shift: u32) -> i16x32<Self>;
2382 #[doc = "Shift each element right by the corresponding element in another vector.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
2383 fn shrv_i16x32(self, a: i16x32<Self>, b: i16x32<Self>) -> i16x32<Self>;
2384 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
2385 fn simd_eq_i16x32(self, a: i16x32<Self>, b: i16x32<Self>) -> mask16x32<Self>;
2386 #[doc = "Compare two vectors element-wise for less than.\n\nReturns a mask where each element is all ones if `a` is less than `b`, and all zeroes if not."]
2387 fn simd_lt_i16x32(self, a: i16x32<Self>, b: i16x32<Self>) -> mask16x32<Self>;
2388 #[doc = "Compare two vectors element-wise for less than or equal.\n\nReturns a mask where each element is all ones if `a` is less than or equal to `b`, and all zeroes if not."]
2389 fn simd_le_i16x32(self, a: i16x32<Self>, b: i16x32<Self>) -> mask16x32<Self>;
2390 #[doc = "Compare two vectors element-wise for greater than or equal.\n\nReturns a mask where each element is all ones if `a` is greater than or equal to `b`, and all zeroes if not."]
2391 fn simd_ge_i16x32(self, a: i16x32<Self>, b: i16x32<Self>) -> mask16x32<Self>;
2392 #[doc = "Compare two vectors element-wise for greater than.\n\nReturns a mask where each element is all ones if `a` is greater than `b`, and all zeroes if not."]
2393 fn simd_gt_i16x32(self, a: i16x32<Self>, b: i16x32<Self>) -> mask16x32<Self>;
2394 #[doc = "Interleave the lower half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, b0, a1, b1]`.\n\n**Note:** This operation is only useful if you need to discard elements `a2, a3, b2, b3`.\n For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
2395 fn zip_low_i16x32(self, a: i16x32<Self>, b: i16x32<Self>) -> i16x32<Self>;
2396 #[doc = "Interleave the upper half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a2, b2, a3, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a1, b0, b1`.For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
2397 fn zip_high_i16x32(self, a: i16x32<Self>, b: i16x32<Self>) -> i16x32<Self>;
2398 #[doc = "Extract even-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, a2, b0, b2]`.\n\n**Note:** This operation is only useful if you need to discard elements `a1, a3, b1, b3`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
2399 fn unzip_low_i16x32(self, a: i16x32<Self>, b: i16x32<Self>) -> i16x32<Self>;
2400 #[doc = "Extract odd-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a1, a3, b1, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a2, b0, b2`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
2401 fn unzip_high_i16x32(self, a: i16x32<Self>, b: i16x32<Self>) -> i16x32<Self>;
2402 #[doc = "Interleave two vectors.\n\nThe resulting vectors contain elements taken alternately from `a` and `b`, first filling the first result, and then the second.\n\nThe reverse of this operation is `deinterleave`.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `([a0, b0, a1, b1], [a2, b2, a3, b3])`."]
2403 fn interleave_i16x32(self, a: i16x32<Self>, b: i16x32<Self>) -> (i16x32<Self>, i16x32<Self>);
2404 #[doc = "Deinterleave two vectors.\n\nThe first result contains all even-indexed elements from `a` followed by all even-indexed elements from `b`. The second result contains all odd-indexed elements from `a` followed by all odd-indexed elements from `b`.\n\nThe reverse of this operation is `interleave`.\n\nFor vectors `[a0, b0, a1, b1]` and `[a2, b2, a3, b3]`, returns `([a0, a1, a2, a3], [b0, b1, b2, b3])`."]
2405 fn deinterleave_i16x32(self, a: i16x32<Self>, b: i16x32<Self>) -> (i16x32<Self>, i16x32<Self>);
2406 #[doc = "Select elements from b and c based on the mask operand a.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
2407 fn select_i16x32(self, a: mask16x32<Self>, b: i16x32<Self>, c: i16x32<Self>) -> i16x32<Self>;
2408 #[doc = "Return the element-wise minimum of two vectors."]
2409 fn min_i16x32(self, a: i16x32<Self>, b: i16x32<Self>) -> i16x32<Self>;
2410 #[doc = "Return the element-wise maximum of two vectors."]
2411 fn max_i16x32(self, a: i16x32<Self>, b: i16x32<Self>) -> i16x32<Self>;
2412 #[doc = "Split a vector into two vectors of half the width.\n\nReturns a tuple of (lower half, upper half)."]
2413 fn split_i16x32(self, a: i16x32<Self>) -> (i16x16<Self>, i16x16<Self>);
2414 #[doc = "Negate each element of the vector, wrapping on overflow."]
2415 fn neg_i16x32(self, a: i16x32<Self>) -> i16x32<Self>;
2416 #[doc = "Reinterpret the bits of this vector as a vector of `u8` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
2417 fn reinterpret_u8_i16x32(self, a: i16x32<Self>) -> u8x64<Self>;
2418 #[doc = "Reinterpret the bits of this vector as a vector of `u32` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
2419 fn reinterpret_u32_i16x32(self, a: i16x32<Self>) -> u32x16<Self>;
2420 #[doc = "Create a SIMD vector with all elements set to the given value."]
2421 fn splat_u16x32(self, val: u16) -> u16x32<Self>;
2422 #[doc = "Create a SIMD vector from an array of the same length."]
2423 fn load_array_u16x32(self, val: [u16; 32usize]) -> u16x32<Self>;
2424 #[doc = "Create a SIMD vector from an array of the same length."]
2425 fn load_array_ref_u16x32(self, val: &[u16; 32usize]) -> u16x32<Self>;
2426 #[doc = "Convert a SIMD vector to an array."]
2427 fn as_array_u16x32(self, a: u16x32<Self>) -> [u16; 32usize];
2428 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
2429 fn as_array_ref_u16x32(self, a: &u16x32<Self>) -> &[u16; 32usize];
2430 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
2431 fn as_array_mut_u16x32(self, a: &mut u16x32<Self>) -> &mut [u16; 32usize];
2432 #[doc = "Store a SIMD vector into an array of the same length."]
2433 fn store_array_u16x32(self, a: u16x32<Self>, dest: &mut [u16; 32usize]) -> ();
2434 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
2435 fn cvt_from_bytes_u16x32(self, a: u8x64<Self>) -> u16x32<Self>;
2436 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
2437 fn cvt_to_bytes_u16x32(self, a: u16x32<Self>) -> u8x64<Self>;
2438 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
2439 fn slide_u16x32<const SHIFT: usize>(self, a: u16x32<Self>, b: u16x32<Self>) -> u16x32<Self>;
2440 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
2441 fn slide_within_blocks_u16x32<const SHIFT: usize>(
2442 self,
2443 a: u16x32<Self>,
2444 b: u16x32<Self>,
2445 ) -> u16x32<Self>;
2446 #[doc = "Add two vectors element-wise, wrapping on overflow."]
2447 fn add_u16x32(self, a: u16x32<Self>, b: u16x32<Self>) -> u16x32<Self>;
2448 #[doc = "Subtract two vectors element-wise, wrapping on overflow."]
2449 fn sub_u16x32(self, a: u16x32<Self>, b: u16x32<Self>) -> u16x32<Self>;
2450 #[doc = "Multiply two vectors element-wise, wrapping on overflow."]
2451 fn mul_u16x32(self, a: u16x32<Self>, b: u16x32<Self>) -> u16x32<Self>;
2452 #[doc = "Compute the bitwise AND of two vectors."]
2453 fn and_u16x32(self, a: u16x32<Self>, b: u16x32<Self>) -> u16x32<Self>;
2454 #[doc = "Compute the bitwise OR of two vectors."]
2455 fn or_u16x32(self, a: u16x32<Self>, b: u16x32<Self>) -> u16x32<Self>;
2456 #[doc = "Compute the bitwise XOR of two vectors."]
2457 fn xor_u16x32(self, a: u16x32<Self>, b: u16x32<Self>) -> u16x32<Self>;
2458 #[doc = "Compute the bitwise NOT of the vector."]
2459 fn not_u16x32(self, a: u16x32<Self>) -> u16x32<Self>;
2460 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right."]
2461 fn shl_u16x32(self, a: u16x32<Self>, shift: u32) -> u16x32<Self>;
2462 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
2463 fn shlv_u16x32(self, a: u16x32<Self>, b: u16x32<Self>) -> u16x32<Self>;
2464 #[doc = "Shift each element right by the given number of bits.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated."]
2465 fn shr_u16x32(self, a: u16x32<Self>, shift: u32) -> u16x32<Self>;
2466 #[doc = "Shift each element right by the corresponding element in another vector.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
2467 fn shrv_u16x32(self, a: u16x32<Self>, b: u16x32<Self>) -> u16x32<Self>;
2468 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
2469 fn simd_eq_u16x32(self, a: u16x32<Self>, b: u16x32<Self>) -> mask16x32<Self>;
2470 #[doc = "Compare two vectors element-wise for less than.\n\nReturns a mask where each element is all ones if `a` is less than `b`, and all zeroes if not."]
2471 fn simd_lt_u16x32(self, a: u16x32<Self>, b: u16x32<Self>) -> mask16x32<Self>;
2472 #[doc = "Compare two vectors element-wise for less than or equal.\n\nReturns a mask where each element is all ones if `a` is less than or equal to `b`, and all zeroes if not."]
2473 fn simd_le_u16x32(self, a: u16x32<Self>, b: u16x32<Self>) -> mask16x32<Self>;
2474 #[doc = "Compare two vectors element-wise for greater than or equal.\n\nReturns a mask where each element is all ones if `a` is greater than or equal to `b`, and all zeroes if not."]
2475 fn simd_ge_u16x32(self, a: u16x32<Self>, b: u16x32<Self>) -> mask16x32<Self>;
2476 #[doc = "Compare two vectors element-wise for greater than.\n\nReturns a mask where each element is all ones if `a` is greater than `b`, and all zeroes if not."]
2477 fn simd_gt_u16x32(self, a: u16x32<Self>, b: u16x32<Self>) -> mask16x32<Self>;
2478 #[doc = "Interleave the lower half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, b0, a1, b1]`.\n\n**Note:** This operation is only useful if you need to discard elements `a2, a3, b2, b3`.\n For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
2479 fn zip_low_u16x32(self, a: u16x32<Self>, b: u16x32<Self>) -> u16x32<Self>;
2480 #[doc = "Interleave the upper half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a2, b2, a3, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a1, b0, b1`.For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
2481 fn zip_high_u16x32(self, a: u16x32<Self>, b: u16x32<Self>) -> u16x32<Self>;
2482 #[doc = "Extract even-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, a2, b0, b2]`.\n\n**Note:** This operation is only useful if you need to discard elements `a1, a3, b1, b3`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
2483 fn unzip_low_u16x32(self, a: u16x32<Self>, b: u16x32<Self>) -> u16x32<Self>;
2484 #[doc = "Extract odd-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a1, a3, b1, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a2, b0, b2`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
2485 fn unzip_high_u16x32(self, a: u16x32<Self>, b: u16x32<Self>) -> u16x32<Self>;
2486 #[doc = "Interleave two vectors.\n\nThe resulting vectors contain elements taken alternately from `a` and `b`, first filling the first result, and then the second.\n\nThe reverse of this operation is `deinterleave`.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `([a0, b0, a1, b1], [a2, b2, a3, b3])`."]
2487 fn interleave_u16x32(self, a: u16x32<Self>, b: u16x32<Self>) -> (u16x32<Self>, u16x32<Self>);
2488 #[doc = "Deinterleave two vectors.\n\nThe first result contains all even-indexed elements from `a` followed by all even-indexed elements from `b`. The second result contains all odd-indexed elements from `a` followed by all odd-indexed elements from `b`.\n\nThe reverse of this operation is `interleave`.\n\nFor vectors `[a0, b0, a1, b1]` and `[a2, b2, a3, b3]`, returns `([a0, a1, a2, a3], [b0, b1, b2, b3])`."]
2489 fn deinterleave_u16x32(self, a: u16x32<Self>, b: u16x32<Self>) -> (u16x32<Self>, u16x32<Self>);
2490 #[doc = "Select elements from b and c based on the mask operand a.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
2491 fn select_u16x32(self, a: mask16x32<Self>, b: u16x32<Self>, c: u16x32<Self>) -> u16x32<Self>;
2492 #[doc = "Return the element-wise minimum of two vectors."]
2493 fn min_u16x32(self, a: u16x32<Self>, b: u16x32<Self>) -> u16x32<Self>;
2494 #[doc = "Return the element-wise maximum of two vectors."]
2495 fn max_u16x32(self, a: u16x32<Self>, b: u16x32<Self>) -> u16x32<Self>;
2496 #[doc = "Split a vector into two vectors of half the width.\n\nReturns a tuple of (lower half, upper half)."]
2497 fn split_u16x32(self, a: u16x32<Self>) -> (u16x16<Self>, u16x16<Self>);
2498 #[doc = "Load elements from an array with 4-way interleaving.\n\nReads consecutive elements and deinterleaves them into a single vector."]
2499 fn load_interleaved_128_u16x32(self, src: &[u16; 32usize]) -> u16x32<Self>;
2500 #[doc = "Store elements to an array with 4-way interleaving.\n\nInterleaves the vector elements and writes them consecutively to memory."]
2501 fn store_interleaved_128_u16x32(self, a: u16x32<Self>, dest: &mut [u16; 32usize]) -> ();
2502 #[doc = "Truncate each element to a narrower integer type.\n\nThe number of elements in the result is twice that of the input."]
2503 fn narrow_u16x32(self, a: u16x32<Self>) -> u8x32<Self>;
2504 #[doc = "Reinterpret the bits of this vector as a vector of `u8` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
2505 fn reinterpret_u8_u16x32(self, a: u16x32<Self>) -> u8x64<Self>;
2506 #[doc = "Reinterpret the bits of this vector as a vector of `u32` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
2507 fn reinterpret_u32_u16x32(self, a: u16x32<Self>) -> u32x16<Self>;
2508 #[doc = "Create a SIMD vector with all elements set to the given value."]
2509 fn splat_mask16x32(self, val: i16) -> mask16x32<Self>;
2510 #[doc = "Create a SIMD vector from an array of the same length."]
2511 fn load_array_mask16x32(self, val: [i16; 32usize]) -> mask16x32<Self>;
2512 #[doc = "Create a SIMD vector from an array of the same length."]
2513 fn load_array_ref_mask16x32(self, val: &[i16; 32usize]) -> mask16x32<Self>;
2514 #[doc = "Convert a SIMD vector to an array."]
2515 fn as_array_mask16x32(self, a: mask16x32<Self>) -> [i16; 32usize];
2516 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
2517 fn as_array_ref_mask16x32(self, a: &mask16x32<Self>) -> &[i16; 32usize];
2518 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
2519 fn as_array_mut_mask16x32(self, a: &mut mask16x32<Self>) -> &mut [i16; 32usize];
2520 #[doc = "Store a SIMD vector into an array of the same length."]
2521 fn store_array_mask16x32(self, a: mask16x32<Self>, dest: &mut [i16; 32usize]) -> ();
2522 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
2523 fn cvt_from_bytes_mask16x32(self, a: u8x64<Self>) -> mask16x32<Self>;
2524 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
2525 fn cvt_to_bytes_mask16x32(self, a: mask16x32<Self>) -> u8x64<Self>;
2526 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
2527 fn slide_mask16x32<const SHIFT: usize>(
2528 self,
2529 a: mask16x32<Self>,
2530 b: mask16x32<Self>,
2531 ) -> mask16x32<Self>;
2532 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
2533 fn slide_within_blocks_mask16x32<const SHIFT: usize>(
2534 self,
2535 a: mask16x32<Self>,
2536 b: mask16x32<Self>,
2537 ) -> mask16x32<Self>;
2538 #[doc = "Compute the logical AND of two masks."]
2539 fn and_mask16x32(self, a: mask16x32<Self>, b: mask16x32<Self>) -> mask16x32<Self>;
2540 #[doc = "Compute the logical OR of two masks."]
2541 fn or_mask16x32(self, a: mask16x32<Self>, b: mask16x32<Self>) -> mask16x32<Self>;
2542 #[doc = "Compute the logical XOR of two masks."]
2543 fn xor_mask16x32(self, a: mask16x32<Self>, b: mask16x32<Self>) -> mask16x32<Self>;
2544 #[doc = "Compute the logical NOT of the mask."]
2545 fn not_mask16x32(self, a: mask16x32<Self>) -> mask16x32<Self>;
2546 #[doc = "Select elements from `b` and `c` based on the mask operand `a`.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
2547 fn select_mask16x32(
2548 self,
2549 a: mask16x32<Self>,
2550 b: mask16x32<Self>,
2551 c: mask16x32<Self>,
2552 ) -> mask16x32<Self>;
2553 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
2554 fn simd_eq_mask16x32(self, a: mask16x32<Self>, b: mask16x32<Self>) -> mask16x32<Self>;
2555 #[doc = "Returns true if any elements in this mask are true (all ones).\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
2556 fn any_true_mask16x32(self, a: mask16x32<Self>) -> bool;
2557 #[doc = "Returns true if all elements in this mask are true (all ones).\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
2558 fn all_true_mask16x32(self, a: mask16x32<Self>) -> bool;
2559 #[doc = "Returns true if any elements in this mask are false (all zeroes).\n\nThis is logically equivalent to `!all_true`, but may be faster.\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
2560 fn any_false_mask16x32(self, a: mask16x32<Self>) -> bool;
2561 #[doc = "Returns true if all elements in this mask are false (all zeroes).\n\nThis is logically equivalent to `!any_true`, but may be faster.\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
2562 fn all_false_mask16x32(self, a: mask16x32<Self>) -> bool;
2563 #[doc = "Split a vector into two vectors of half the width.\n\nReturns a tuple of (lower half, upper half)."]
2564 fn split_mask16x32(self, a: mask16x32<Self>) -> (mask16x16<Self>, mask16x16<Self>);
2565 #[doc = "Create a SIMD vector with all elements set to the given value."]
2566 fn splat_i32x16(self, val: i32) -> i32x16<Self>;
2567 #[doc = "Create a SIMD vector from an array of the same length."]
2568 fn load_array_i32x16(self, val: [i32; 16usize]) -> i32x16<Self>;
2569 #[doc = "Create a SIMD vector from an array of the same length."]
2570 fn load_array_ref_i32x16(self, val: &[i32; 16usize]) -> i32x16<Self>;
2571 #[doc = "Convert a SIMD vector to an array."]
2572 fn as_array_i32x16(self, a: i32x16<Self>) -> [i32; 16usize];
2573 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
2574 fn as_array_ref_i32x16(self, a: &i32x16<Self>) -> &[i32; 16usize];
2575 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
2576 fn as_array_mut_i32x16(self, a: &mut i32x16<Self>) -> &mut [i32; 16usize];
2577 #[doc = "Store a SIMD vector into an array of the same length."]
2578 fn store_array_i32x16(self, a: i32x16<Self>, dest: &mut [i32; 16usize]) -> ();
2579 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
2580 fn cvt_from_bytes_i32x16(self, a: u8x64<Self>) -> i32x16<Self>;
2581 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
2582 fn cvt_to_bytes_i32x16(self, a: i32x16<Self>) -> u8x64<Self>;
2583 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
2584 fn slide_i32x16<const SHIFT: usize>(self, a: i32x16<Self>, b: i32x16<Self>) -> i32x16<Self>;
2585 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
2586 fn slide_within_blocks_i32x16<const SHIFT: usize>(
2587 self,
2588 a: i32x16<Self>,
2589 b: i32x16<Self>,
2590 ) -> i32x16<Self>;
2591 #[doc = "Add two vectors element-wise, wrapping on overflow."]
2592 fn add_i32x16(self, a: i32x16<Self>, b: i32x16<Self>) -> i32x16<Self>;
2593 #[doc = "Subtract two vectors element-wise, wrapping on overflow."]
2594 fn sub_i32x16(self, a: i32x16<Self>, b: i32x16<Self>) -> i32x16<Self>;
2595 #[doc = "Multiply two vectors element-wise, wrapping on overflow."]
2596 fn mul_i32x16(self, a: i32x16<Self>, b: i32x16<Self>) -> i32x16<Self>;
2597 #[doc = "Compute the bitwise AND of two vectors."]
2598 fn and_i32x16(self, a: i32x16<Self>, b: i32x16<Self>) -> i32x16<Self>;
2599 #[doc = "Compute the bitwise OR of two vectors."]
2600 fn or_i32x16(self, a: i32x16<Self>, b: i32x16<Self>) -> i32x16<Self>;
2601 #[doc = "Compute the bitwise XOR of two vectors."]
2602 fn xor_i32x16(self, a: i32x16<Self>, b: i32x16<Self>) -> i32x16<Self>;
2603 #[doc = "Compute the bitwise NOT of the vector."]
2604 fn not_i32x16(self, a: i32x16<Self>) -> i32x16<Self>;
2605 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right."]
2606 fn shl_i32x16(self, a: i32x16<Self>, shift: u32) -> i32x16<Self>;
2607 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
2608 fn shlv_i32x16(self, a: i32x16<Self>, b: i32x16<Self>) -> i32x16<Self>;
2609 #[doc = "Shift each element right by the given number of bits.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated."]
2610 fn shr_i32x16(self, a: i32x16<Self>, shift: u32) -> i32x16<Self>;
2611 #[doc = "Shift each element right by the corresponding element in another vector.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
2612 fn shrv_i32x16(self, a: i32x16<Self>, b: i32x16<Self>) -> i32x16<Self>;
2613 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
2614 fn simd_eq_i32x16(self, a: i32x16<Self>, b: i32x16<Self>) -> mask32x16<Self>;
2615 #[doc = "Compare two vectors element-wise for less than.\n\nReturns a mask where each element is all ones if `a` is less than `b`, and all zeroes if not."]
2616 fn simd_lt_i32x16(self, a: i32x16<Self>, b: i32x16<Self>) -> mask32x16<Self>;
2617 #[doc = "Compare two vectors element-wise for less than or equal.\n\nReturns a mask where each element is all ones if `a` is less than or equal to `b`, and all zeroes if not."]
2618 fn simd_le_i32x16(self, a: i32x16<Self>, b: i32x16<Self>) -> mask32x16<Self>;
2619 #[doc = "Compare two vectors element-wise for greater than or equal.\n\nReturns a mask where each element is all ones if `a` is greater than or equal to `b`, and all zeroes if not."]
2620 fn simd_ge_i32x16(self, a: i32x16<Self>, b: i32x16<Self>) -> mask32x16<Self>;
2621 #[doc = "Compare two vectors element-wise for greater than.\n\nReturns a mask where each element is all ones if `a` is greater than `b`, and all zeroes if not."]
2622 fn simd_gt_i32x16(self, a: i32x16<Self>, b: i32x16<Self>) -> mask32x16<Self>;
2623 #[doc = "Interleave the lower half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, b0, a1, b1]`.\n\n**Note:** This operation is only useful if you need to discard elements `a2, a3, b2, b3`.\n For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
2624 fn zip_low_i32x16(self, a: i32x16<Self>, b: i32x16<Self>) -> i32x16<Self>;
2625 #[doc = "Interleave the upper half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a2, b2, a3, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a1, b0, b1`.For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
2626 fn zip_high_i32x16(self, a: i32x16<Self>, b: i32x16<Self>) -> i32x16<Self>;
2627 #[doc = "Extract even-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, a2, b0, b2]`.\n\n**Note:** This operation is only useful if you need to discard elements `a1, a3, b1, b3`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
2628 fn unzip_low_i32x16(self, a: i32x16<Self>, b: i32x16<Self>) -> i32x16<Self>;
2629 #[doc = "Extract odd-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a1, a3, b1, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a2, b0, b2`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
2630 fn unzip_high_i32x16(self, a: i32x16<Self>, b: i32x16<Self>) -> i32x16<Self>;
2631 #[doc = "Interleave two vectors.\n\nThe resulting vectors contain elements taken alternately from `a` and `b`, first filling the first result, and then the second.\n\nThe reverse of this operation is `deinterleave`.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `([a0, b0, a1, b1], [a2, b2, a3, b3])`."]
2632 fn interleave_i32x16(self, a: i32x16<Self>, b: i32x16<Self>) -> (i32x16<Self>, i32x16<Self>);
2633 #[doc = "Deinterleave two vectors.\n\nThe first result contains all even-indexed elements from `a` followed by all even-indexed elements from `b`. The second result contains all odd-indexed elements from `a` followed by all odd-indexed elements from `b`.\n\nThe reverse of this operation is `interleave`.\n\nFor vectors `[a0, b0, a1, b1]` and `[a2, b2, a3, b3]`, returns `([a0, a1, a2, a3], [b0, b1, b2, b3])`."]
2634 fn deinterleave_i32x16(self, a: i32x16<Self>, b: i32x16<Self>) -> (i32x16<Self>, i32x16<Self>);
2635 #[doc = "Select elements from b and c based on the mask operand a.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
2636 fn select_i32x16(self, a: mask32x16<Self>, b: i32x16<Self>, c: i32x16<Self>) -> i32x16<Self>;
2637 #[doc = "Return the element-wise minimum of two vectors."]
2638 fn min_i32x16(self, a: i32x16<Self>, b: i32x16<Self>) -> i32x16<Self>;
2639 #[doc = "Return the element-wise maximum of two vectors."]
2640 fn max_i32x16(self, a: i32x16<Self>, b: i32x16<Self>) -> i32x16<Self>;
2641 #[doc = "Split a vector into two vectors of half the width.\n\nReturns a tuple of (lower half, upper half)."]
2642 fn split_i32x16(self, a: i32x16<Self>) -> (i32x8<Self>, i32x8<Self>);
2643 #[doc = "Negate each element of the vector, wrapping on overflow."]
2644 fn neg_i32x16(self, a: i32x16<Self>) -> i32x16<Self>;
2645 #[doc = "Reinterpret the bits of this vector as a vector of `u8` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
2646 fn reinterpret_u8_i32x16(self, a: i32x16<Self>) -> u8x64<Self>;
2647 #[doc = "Reinterpret the bits of this vector as a vector of `u32` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
2648 fn reinterpret_u32_i32x16(self, a: i32x16<Self>) -> u32x16<Self>;
2649 #[doc = "Convert each signed 32-bit integer element to a floating-point value.\n\nValues that cannot be exactly represented are rounded to the nearest representable value."]
2650 fn cvt_f32_i32x16(self, a: i32x16<Self>) -> f32x16<Self>;
2651 #[doc = "Create a SIMD vector with all elements set to the given value."]
2652 fn splat_u32x16(self, val: u32) -> u32x16<Self>;
2653 #[doc = "Create a SIMD vector from an array of the same length."]
2654 fn load_array_u32x16(self, val: [u32; 16usize]) -> u32x16<Self>;
2655 #[doc = "Create a SIMD vector from an array of the same length."]
2656 fn load_array_ref_u32x16(self, val: &[u32; 16usize]) -> u32x16<Self>;
2657 #[doc = "Convert a SIMD vector to an array."]
2658 fn as_array_u32x16(self, a: u32x16<Self>) -> [u32; 16usize];
2659 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
2660 fn as_array_ref_u32x16(self, a: &u32x16<Self>) -> &[u32; 16usize];
2661 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
2662 fn as_array_mut_u32x16(self, a: &mut u32x16<Self>) -> &mut [u32; 16usize];
2663 #[doc = "Store a SIMD vector into an array of the same length."]
2664 fn store_array_u32x16(self, a: u32x16<Self>, dest: &mut [u32; 16usize]) -> ();
2665 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
2666 fn cvt_from_bytes_u32x16(self, a: u8x64<Self>) -> u32x16<Self>;
2667 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
2668 fn cvt_to_bytes_u32x16(self, a: u32x16<Self>) -> u8x64<Self>;
2669 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
2670 fn slide_u32x16<const SHIFT: usize>(self, a: u32x16<Self>, b: u32x16<Self>) -> u32x16<Self>;
2671 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
2672 fn slide_within_blocks_u32x16<const SHIFT: usize>(
2673 self,
2674 a: u32x16<Self>,
2675 b: u32x16<Self>,
2676 ) -> u32x16<Self>;
2677 #[doc = "Add two vectors element-wise, wrapping on overflow."]
2678 fn add_u32x16(self, a: u32x16<Self>, b: u32x16<Self>) -> u32x16<Self>;
2679 #[doc = "Subtract two vectors element-wise, wrapping on overflow."]
2680 fn sub_u32x16(self, a: u32x16<Self>, b: u32x16<Self>) -> u32x16<Self>;
2681 #[doc = "Multiply two vectors element-wise, wrapping on overflow."]
2682 fn mul_u32x16(self, a: u32x16<Self>, b: u32x16<Self>) -> u32x16<Self>;
2683 #[doc = "Compute the bitwise AND of two vectors."]
2684 fn and_u32x16(self, a: u32x16<Self>, b: u32x16<Self>) -> u32x16<Self>;
2685 #[doc = "Compute the bitwise OR of two vectors."]
2686 fn or_u32x16(self, a: u32x16<Self>, b: u32x16<Self>) -> u32x16<Self>;
2687 #[doc = "Compute the bitwise XOR of two vectors."]
2688 fn xor_u32x16(self, a: u32x16<Self>, b: u32x16<Self>) -> u32x16<Self>;
2689 #[doc = "Compute the bitwise NOT of the vector."]
2690 fn not_u32x16(self, a: u32x16<Self>) -> u32x16<Self>;
2691 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right."]
2692 fn shl_u32x16(self, a: u32x16<Self>, shift: u32) -> u32x16<Self>;
2693 #[doc = "Shift each element left by the given number of bits.\n\nBits shifted out of the left side are discarded, and zeros are shifted in on the right.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
2694 fn shlv_u32x16(self, a: u32x16<Self>, b: u32x16<Self>) -> u32x16<Self>;
2695 #[doc = "Shift each element right by the given number of bits.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated."]
2696 fn shr_u32x16(self, a: u32x16<Self>, shift: u32) -> u32x16<Self>;
2697 #[doc = "Shift each element right by the corresponding element in another vector.\n\nFor unsigned integers, zeros are shifted in on the left. For signed integers, the sign bit is replicated.\n\nThis operation is not implemented in hardware on all platforms. On WebAssembly, and on x86 platforms without AVX2, this will use a fallback scalar implementation."]
2698 fn shrv_u32x16(self, a: u32x16<Self>, b: u32x16<Self>) -> u32x16<Self>;
2699 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
2700 fn simd_eq_u32x16(self, a: u32x16<Self>, b: u32x16<Self>) -> mask32x16<Self>;
2701 #[doc = "Compare two vectors element-wise for less than.\n\nReturns a mask where each element is all ones if `a` is less than `b`, and all zeroes if not."]
2702 fn simd_lt_u32x16(self, a: u32x16<Self>, b: u32x16<Self>) -> mask32x16<Self>;
2703 #[doc = "Compare two vectors element-wise for less than or equal.\n\nReturns a mask where each element is all ones if `a` is less than or equal to `b`, and all zeroes if not."]
2704 fn simd_le_u32x16(self, a: u32x16<Self>, b: u32x16<Self>) -> mask32x16<Self>;
2705 #[doc = "Compare two vectors element-wise for greater than or equal.\n\nReturns a mask where each element is all ones if `a` is greater than or equal to `b`, and all zeroes if not."]
2706 fn simd_ge_u32x16(self, a: u32x16<Self>, b: u32x16<Self>) -> mask32x16<Self>;
2707 #[doc = "Compare two vectors element-wise for greater than.\n\nReturns a mask where each element is all ones if `a` is greater than `b`, and all zeroes if not."]
2708 fn simd_gt_u32x16(self, a: u32x16<Self>, b: u32x16<Self>) -> mask32x16<Self>;
2709 #[doc = "Interleave the lower half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, b0, a1, b1]`.\n\n**Note:** This operation is only useful if you need to discard elements `a2, a3, b2, b3`.\n For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
2710 fn zip_low_u32x16(self, a: u32x16<Self>, b: u32x16<Self>) -> u32x16<Self>;
2711 #[doc = "Interleave the upper half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a2, b2, a3, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a1, b0, b1`.For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
2712 fn zip_high_u32x16(self, a: u32x16<Self>, b: u32x16<Self>) -> u32x16<Self>;
2713 #[doc = "Extract even-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, a2, b0, b2]`.\n\n**Note:** This operation is only useful if you need to discard elements `a1, a3, b1, b3`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
2714 fn unzip_low_u32x16(self, a: u32x16<Self>, b: u32x16<Self>) -> u32x16<Self>;
2715 #[doc = "Extract odd-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a1, a3, b1, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a2, b0, b2`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
2716 fn unzip_high_u32x16(self, a: u32x16<Self>, b: u32x16<Self>) -> u32x16<Self>;
2717 #[doc = "Interleave two vectors.\n\nThe resulting vectors contain elements taken alternately from `a` and `b`, first filling the first result, and then the second.\n\nThe reverse of this operation is `deinterleave`.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `([a0, b0, a1, b1], [a2, b2, a3, b3])`."]
2718 fn interleave_u32x16(self, a: u32x16<Self>, b: u32x16<Self>) -> (u32x16<Self>, u32x16<Self>);
2719 #[doc = "Deinterleave two vectors.\n\nThe first result contains all even-indexed elements from `a` followed by all even-indexed elements from `b`. The second result contains all odd-indexed elements from `a` followed by all odd-indexed elements from `b`.\n\nThe reverse of this operation is `interleave`.\n\nFor vectors `[a0, b0, a1, b1]` and `[a2, b2, a3, b3]`, returns `([a0, a1, a2, a3], [b0, b1, b2, b3])`."]
2720 fn deinterleave_u32x16(self, a: u32x16<Self>, b: u32x16<Self>) -> (u32x16<Self>, u32x16<Self>);
2721 #[doc = "Select elements from b and c based on the mask operand a.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
2722 fn select_u32x16(self, a: mask32x16<Self>, b: u32x16<Self>, c: u32x16<Self>) -> u32x16<Self>;
2723 #[doc = "Return the element-wise minimum of two vectors."]
2724 fn min_u32x16(self, a: u32x16<Self>, b: u32x16<Self>) -> u32x16<Self>;
2725 #[doc = "Return the element-wise maximum of two vectors."]
2726 fn max_u32x16(self, a: u32x16<Self>, b: u32x16<Self>) -> u32x16<Self>;
2727 #[doc = "Split a vector into two vectors of half the width.\n\nReturns a tuple of (lower half, upper half)."]
2728 fn split_u32x16(self, a: u32x16<Self>) -> (u32x8<Self>, u32x8<Self>);
2729 #[doc = "Load elements from an array with 4-way interleaving.\n\nReads consecutive elements and deinterleaves them into a single vector."]
2730 fn load_interleaved_128_u32x16(self, src: &[u32; 16usize]) -> u32x16<Self>;
2731 #[doc = "Store elements to an array with 4-way interleaving.\n\nInterleaves the vector elements and writes them consecutively to memory."]
2732 fn store_interleaved_128_u32x16(self, a: u32x16<Self>, dest: &mut [u32; 16usize]) -> ();
2733 #[doc = "Reinterpret the bits of this vector as a vector of `u8` elements.\n\nThe total bit width is preserved; the number of elements changes accordingly."]
2734 fn reinterpret_u8_u32x16(self, a: u32x16<Self>) -> u8x64<Self>;
2735 #[doc = "Convert each unsigned 32-bit integer element to a floating-point value.\n\nValues that cannot be exactly represented are rounded to the nearest representable value."]
2736 fn cvt_f32_u32x16(self, a: u32x16<Self>) -> f32x16<Self>;
2737 #[doc = "Create a SIMD vector with all elements set to the given value."]
2738 fn splat_mask32x16(self, val: i32) -> mask32x16<Self>;
2739 #[doc = "Create a SIMD vector from an array of the same length."]
2740 fn load_array_mask32x16(self, val: [i32; 16usize]) -> mask32x16<Self>;
2741 #[doc = "Create a SIMD vector from an array of the same length."]
2742 fn load_array_ref_mask32x16(self, val: &[i32; 16usize]) -> mask32x16<Self>;
2743 #[doc = "Convert a SIMD vector to an array."]
2744 fn as_array_mask32x16(self, a: mask32x16<Self>) -> [i32; 16usize];
2745 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
2746 fn as_array_ref_mask32x16(self, a: &mask32x16<Self>) -> &[i32; 16usize];
2747 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
2748 fn as_array_mut_mask32x16(self, a: &mut mask32x16<Self>) -> &mut [i32; 16usize];
2749 #[doc = "Store a SIMD vector into an array of the same length."]
2750 fn store_array_mask32x16(self, a: mask32x16<Self>, dest: &mut [i32; 16usize]) -> ();
2751 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
2752 fn cvt_from_bytes_mask32x16(self, a: u8x64<Self>) -> mask32x16<Self>;
2753 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
2754 fn cvt_to_bytes_mask32x16(self, a: mask32x16<Self>) -> u8x64<Self>;
2755 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
2756 fn slide_mask32x16<const SHIFT: usize>(
2757 self,
2758 a: mask32x16<Self>,
2759 b: mask32x16<Self>,
2760 ) -> mask32x16<Self>;
2761 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
2762 fn slide_within_blocks_mask32x16<const SHIFT: usize>(
2763 self,
2764 a: mask32x16<Self>,
2765 b: mask32x16<Self>,
2766 ) -> mask32x16<Self>;
2767 #[doc = "Compute the logical AND of two masks."]
2768 fn and_mask32x16(self, a: mask32x16<Self>, b: mask32x16<Self>) -> mask32x16<Self>;
2769 #[doc = "Compute the logical OR of two masks."]
2770 fn or_mask32x16(self, a: mask32x16<Self>, b: mask32x16<Self>) -> mask32x16<Self>;
2771 #[doc = "Compute the logical XOR of two masks."]
2772 fn xor_mask32x16(self, a: mask32x16<Self>, b: mask32x16<Self>) -> mask32x16<Self>;
2773 #[doc = "Compute the logical NOT of the mask."]
2774 fn not_mask32x16(self, a: mask32x16<Self>) -> mask32x16<Self>;
2775 #[doc = "Select elements from `b` and `c` based on the mask operand `a`.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
2776 fn select_mask32x16(
2777 self,
2778 a: mask32x16<Self>,
2779 b: mask32x16<Self>,
2780 c: mask32x16<Self>,
2781 ) -> mask32x16<Self>;
2782 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
2783 fn simd_eq_mask32x16(self, a: mask32x16<Self>, b: mask32x16<Self>) -> mask32x16<Self>;
2784 #[doc = "Returns true if any elements in this mask are true (all ones).\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
2785 fn any_true_mask32x16(self, a: mask32x16<Self>) -> bool;
2786 #[doc = "Returns true if all elements in this mask are true (all ones).\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
2787 fn all_true_mask32x16(self, a: mask32x16<Self>) -> bool;
2788 #[doc = "Returns true if any elements in this mask are false (all zeroes).\n\nThis is logically equivalent to `!all_true`, but may be faster.\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
2789 fn any_false_mask32x16(self, a: mask32x16<Self>) -> bool;
2790 #[doc = "Returns true if all elements in this mask are false (all zeroes).\n\nThis is logically equivalent to `!any_true`, but may be faster.\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
2791 fn all_false_mask32x16(self, a: mask32x16<Self>) -> bool;
2792 #[doc = "Split a vector into two vectors of half the width.\n\nReturns a tuple of (lower half, upper half)."]
2793 fn split_mask32x16(self, a: mask32x16<Self>) -> (mask32x8<Self>, mask32x8<Self>);
2794 #[doc = "Create a SIMD vector with all elements set to the given value."]
2795 fn splat_f64x8(self, val: f64) -> f64x8<Self>;
2796 #[doc = "Create a SIMD vector from an array of the same length."]
2797 fn load_array_f64x8(self, val: [f64; 8usize]) -> f64x8<Self>;
2798 #[doc = "Create a SIMD vector from an array of the same length."]
2799 fn load_array_ref_f64x8(self, val: &[f64; 8usize]) -> f64x8<Self>;
2800 #[doc = "Convert a SIMD vector to an array."]
2801 fn as_array_f64x8(self, a: f64x8<Self>) -> [f64; 8usize];
2802 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
2803 fn as_array_ref_f64x8(self, a: &f64x8<Self>) -> &[f64; 8usize];
2804 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
2805 fn as_array_mut_f64x8(self, a: &mut f64x8<Self>) -> &mut [f64; 8usize];
2806 #[doc = "Store a SIMD vector into an array of the same length."]
2807 fn store_array_f64x8(self, a: f64x8<Self>, dest: &mut [f64; 8usize]) -> ();
2808 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
2809 fn cvt_from_bytes_f64x8(self, a: u8x64<Self>) -> f64x8<Self>;
2810 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
2811 fn cvt_to_bytes_f64x8(self, a: f64x8<Self>) -> u8x64<Self>;
2812 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
2813 fn slide_f64x8<const SHIFT: usize>(self, a: f64x8<Self>, b: f64x8<Self>) -> f64x8<Self>;
2814 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
2815 fn slide_within_blocks_f64x8<const SHIFT: usize>(
2816 self,
2817 a: f64x8<Self>,
2818 b: f64x8<Self>,
2819 ) -> f64x8<Self>;
2820 #[doc = "Compute the absolute value of each element."]
2821 fn abs_f64x8(self, a: f64x8<Self>) -> f64x8<Self>;
2822 #[doc = "Negate each element of the vector."]
2823 fn neg_f64x8(self, a: f64x8<Self>) -> f64x8<Self>;
2824 #[doc = "Compute the square root of each element.\n\nNegative elements other than `-0.0` will become NaN."]
2825 fn sqrt_f64x8(self, a: f64x8<Self>) -> f64x8<Self>;
2826 #[doc = "Add two vectors element-wise."]
2827 fn add_f64x8(self, a: f64x8<Self>, b: f64x8<Self>) -> f64x8<Self>;
2828 #[doc = "Subtract two vectors element-wise."]
2829 fn sub_f64x8(self, a: f64x8<Self>, b: f64x8<Self>) -> f64x8<Self>;
2830 #[doc = "Multiply two vectors element-wise."]
2831 fn mul_f64x8(self, a: f64x8<Self>, b: f64x8<Self>) -> f64x8<Self>;
2832 #[doc = "Divide two vectors element-wise."]
2833 fn div_f64x8(self, a: f64x8<Self>, b: f64x8<Self>) -> f64x8<Self>;
2834 #[doc = "Return a vector with the magnitude of `a` and the sign of `b` for each element.\n\nThis operation copies the sign bit, so if an input element is NaN, the output element will be a NaN with the same payload and a copied sign bit."]
2835 fn copysign_f64x8(self, a: f64x8<Self>, b: f64x8<Self>) -> f64x8<Self>;
2836 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
2837 fn simd_eq_f64x8(self, a: f64x8<Self>, b: f64x8<Self>) -> mask64x8<Self>;
2838 #[doc = "Compare two vectors element-wise for less than.\n\nReturns a mask where each element is all ones if `a` is less than `b`, and all zeroes if not."]
2839 fn simd_lt_f64x8(self, a: f64x8<Self>, b: f64x8<Self>) -> mask64x8<Self>;
2840 #[doc = "Compare two vectors element-wise for less than or equal.\n\nReturns a mask where each element is all ones if `a` is less than or equal to `b`, and all zeroes if not."]
2841 fn simd_le_f64x8(self, a: f64x8<Self>, b: f64x8<Self>) -> mask64x8<Self>;
2842 #[doc = "Compare two vectors element-wise for greater than or equal.\n\nReturns a mask where each element is all ones if `a` is greater than or equal to `b`, and all zeroes if not."]
2843 fn simd_ge_f64x8(self, a: f64x8<Self>, b: f64x8<Self>) -> mask64x8<Self>;
2844 #[doc = "Compare two vectors element-wise for greater than.\n\nReturns a mask where each element is all ones if `a` is greater than `b`, and all zeroes if not."]
2845 fn simd_gt_f64x8(self, a: f64x8<Self>, b: f64x8<Self>) -> mask64x8<Self>;
2846 #[doc = "Interleave the lower half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, b0, a1, b1]`.\n\n**Note:** This operation is only useful if you need to discard elements `a2, a3, b2, b3`.\n For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
2847 fn zip_low_f64x8(self, a: f64x8<Self>, b: f64x8<Self>) -> f64x8<Self>;
2848 #[doc = "Interleave the upper half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a2, b2, a3, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a1, b0, b1`.For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
2849 fn zip_high_f64x8(self, a: f64x8<Self>, b: f64x8<Self>) -> f64x8<Self>;
2850 #[doc = "Extract even-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, a2, b0, b2]`.\n\n**Note:** This operation is only useful if you need to discard elements `a1, a3, b1, b3`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
2851 fn unzip_low_f64x8(self, a: f64x8<Self>, b: f64x8<Self>) -> f64x8<Self>;
2852 #[doc = "Extract odd-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a1, a3, b1, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a2, b0, b2`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
2853 fn unzip_high_f64x8(self, a: f64x8<Self>, b: f64x8<Self>) -> f64x8<Self>;
2854 #[doc = "Interleave two vectors.\n\nThe resulting vectors contain elements taken alternately from `a` and `b`, first filling the first result, and then the second.\n\nThe reverse of this operation is `deinterleave`.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `([a0, b0, a1, b1], [a2, b2, a3, b3])`."]
2855 fn interleave_f64x8(self, a: f64x8<Self>, b: f64x8<Self>) -> (f64x8<Self>, f64x8<Self>);
2856 #[doc = "Deinterleave two vectors.\n\nThe first result contains all even-indexed elements from `a` followed by all even-indexed elements from `b`. The second result contains all odd-indexed elements from `a` followed by all odd-indexed elements from `b`.\n\nThe reverse of this operation is `interleave`.\n\nFor vectors `[a0, b0, a1, b1]` and `[a2, b2, a3, b3]`, returns `([a0, a1, a2, a3], [b0, b1, b2, b3])`."]
2857 fn deinterleave_f64x8(self, a: f64x8<Self>, b: f64x8<Self>) -> (f64x8<Self>, f64x8<Self>);
2858 #[doc = "Return the element-wise maximum of two vectors.\n\nIf either operand is NaN, the result for that lane is implementation-defined-- it could be either the first or second operand. See `max_precise` for a version that returns the non-NaN operand if only one is NaN.\n\nIf one operand is positive zero and the other is negative zero, the result is also implementation-defined, and it could be either one."]
2859 fn max_f64x8(self, a: f64x8<Self>, b: f64x8<Self>) -> f64x8<Self>;
2860 #[doc = "Return the element-wise minimum of two vectors.\n\nIf either operand is NaN, the result for that lane is implementation-defined-- it could be either the first or second operand. See `min_precise` for a version that returns the non-NaN operand if only one is NaN.\n\nIf one operand is positive zero and the other is negative zero, the result is also implementation-defined, and it could be either one."]
2861 fn min_f64x8(self, a: f64x8<Self>, b: f64x8<Self>) -> f64x8<Self>;
2862 #[doc = "Return the element-wise maximum of two vectors.\n\nIf one operand is a quiet NaN and the other is not, this operation will choose the non-NaN operand.\n\nIf one operand is positive zero and the other is negative zero, the result is implementation-defined, and it could be either one.\n\nIf an operand is a *signaling* NaN, the result is not just implementation-defined, but fully non-deterministic: it may be either NaN or the non-NaN operand.\nSignaling NaN values are not produced by floating-point math operations, only from manual initialization with specific bit patterns. You probably don't need to worry about them."]
2863 fn max_precise_f64x8(self, a: f64x8<Self>, b: f64x8<Self>) -> f64x8<Self>;
2864 #[doc = "Return the element-wise minimum of two vectors.\n\nIf one operand is a quiet NaN and the other is not, this operation will choose the non-NaN operand.\n\nIf one operand is positive zero and the other is negative zero, the result is implementation-defined, and it could be either one.\n\nIf an operand is a *signaling* NaN, the result is not just implementation-defined, but fully non-deterministic: it may be either NaN or the non-NaN operand.\nSignaling NaN values are not produced by floating-point math operations, only from manual initialization with specific bit patterns. You probably don't need to worry about them."]
2865 fn min_precise_f64x8(self, a: f64x8<Self>, b: f64x8<Self>) -> f64x8<Self>;
2866 #[doc = "Compute `(a * b) + c` (fused multiply-add) for each element.\n\nDepending on hardware support, the result may be computed with only one rounding error, or may be implemented as a regular multiply followed by an add, which will result in two rounding errors."]
2867 fn mul_add_f64x8(self, a: f64x8<Self>, b: f64x8<Self>, c: f64x8<Self>) -> f64x8<Self>;
2868 #[doc = "Compute `(a * b) - c` (fused multiply-subtract) for each element.\n\nDepending on hardware support, the result may be computed with only one rounding error, or may be implemented as a regular multiply followed by a subtract, which will result in two rounding errors."]
2869 fn mul_sub_f64x8(self, a: f64x8<Self>, b: f64x8<Self>, c: f64x8<Self>) -> f64x8<Self>;
2870 #[doc = "Return the largest integer less than or equal to each element, that is, round towards negative infinity."]
2871 fn floor_f64x8(self, a: f64x8<Self>) -> f64x8<Self>;
2872 #[doc = "Return the smallest integer greater than or equal to each element, that is, round towards positive infinity."]
2873 fn ceil_f64x8(self, a: f64x8<Self>) -> f64x8<Self>;
2874 #[doc = "Round each element to the nearest integer, with ties rounding to the nearest even integer.\n\nThere is no corresponding `round` operation. Rust's `round` operation rounds ties away from zero, a behavior it inherited from C. That behavior is not implemented across all platforms, whereas round-ties-even is."]
2875 fn round_ties_even_f64x8(self, a: f64x8<Self>) -> f64x8<Self>;
2876 #[doc = "Return the fractional part of each element.\n\nThis is equivalent to `a - a.trunc()`."]
2877 fn fract_f64x8(self, a: f64x8<Self>) -> f64x8<Self>;
2878 #[doc = "Return the integer part of each element, rounding towards zero."]
2879 fn trunc_f64x8(self, a: f64x8<Self>) -> f64x8<Self>;
2880 #[doc = "Select elements from b and c based on the mask operand a.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
2881 fn select_f64x8(self, a: mask64x8<Self>, b: f64x8<Self>, c: f64x8<Self>) -> f64x8<Self>;
2882 #[doc = "Split a vector into two vectors of half the width.\n\nReturns a tuple of (lower half, upper half)."]
2883 fn split_f64x8(self, a: f64x8<Self>) -> (f64x4<Self>, f64x4<Self>);
2884 #[doc = "Reinterpret the bits of this vector as a vector of `f32` elements.\n\nThe number of elements in the result is twice that of the input."]
2885 fn reinterpret_f32_f64x8(self, a: f64x8<Self>) -> f32x16<Self>;
2886 #[doc = "Create a SIMD vector with all elements set to the given value."]
2887 fn splat_mask64x8(self, val: i64) -> mask64x8<Self>;
2888 #[doc = "Create a SIMD vector from an array of the same length."]
2889 fn load_array_mask64x8(self, val: [i64; 8usize]) -> mask64x8<Self>;
2890 #[doc = "Create a SIMD vector from an array of the same length."]
2891 fn load_array_ref_mask64x8(self, val: &[i64; 8usize]) -> mask64x8<Self>;
2892 #[doc = "Convert a SIMD vector to an array."]
2893 fn as_array_mask64x8(self, a: mask64x8<Self>) -> [i64; 8usize];
2894 #[doc = "Project a reference to a SIMD vector to a reference to the equivalent array."]
2895 fn as_array_ref_mask64x8(self, a: &mask64x8<Self>) -> &[i64; 8usize];
2896 #[doc = "Project a mutable reference to a SIMD vector to a mutable reference to the equivalent array."]
2897 fn as_array_mut_mask64x8(self, a: &mut mask64x8<Self>) -> &mut [i64; 8usize];
2898 #[doc = "Store a SIMD vector into an array of the same length."]
2899 fn store_array_mask64x8(self, a: mask64x8<Self>, dest: &mut [i64; 8usize]) -> ();
2900 #[doc = "Reinterpret a vector of bytes as a SIMD vector of a given type, with the equivalent byte length."]
2901 fn cvt_from_bytes_mask64x8(self, a: u8x64<Self>) -> mask64x8<Self>;
2902 #[doc = "Reinterpret a SIMD vector as a vector of bytes, with the equivalent byte length."]
2903 fn cvt_to_bytes_mask64x8(self, a: mask64x8<Self>) -> u8x64<Self>;
2904 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
2905 fn slide_mask64x8<const SHIFT: usize>(
2906 self,
2907 a: mask64x8<Self>,
2908 b: mask64x8<Self>,
2909 ) -> mask64x8<Self>;
2910 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
2911 fn slide_within_blocks_mask64x8<const SHIFT: usize>(
2912 self,
2913 a: mask64x8<Self>,
2914 b: mask64x8<Self>,
2915 ) -> mask64x8<Self>;
2916 #[doc = "Compute the logical AND of two masks."]
2917 fn and_mask64x8(self, a: mask64x8<Self>, b: mask64x8<Self>) -> mask64x8<Self>;
2918 #[doc = "Compute the logical OR of two masks."]
2919 fn or_mask64x8(self, a: mask64x8<Self>, b: mask64x8<Self>) -> mask64x8<Self>;
2920 #[doc = "Compute the logical XOR of two masks."]
2921 fn xor_mask64x8(self, a: mask64x8<Self>, b: mask64x8<Self>) -> mask64x8<Self>;
2922 #[doc = "Compute the logical NOT of the mask."]
2923 fn not_mask64x8(self, a: mask64x8<Self>) -> mask64x8<Self>;
2924 #[doc = "Select elements from `b` and `c` based on the mask operand `a`.\n\nThis operation's behavior is unspecified if each lane of a is not the all-zeroes or all-ones bit pattern. See the [`Select`] trait's documentation for more information."]
2925 fn select_mask64x8(
2926 self,
2927 a: mask64x8<Self>,
2928 b: mask64x8<Self>,
2929 c: mask64x8<Self>,
2930 ) -> mask64x8<Self>;
2931 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
2932 fn simd_eq_mask64x8(self, a: mask64x8<Self>, b: mask64x8<Self>) -> mask64x8<Self>;
2933 #[doc = "Returns true if any elements in this mask are true (all ones).\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
2934 fn any_true_mask64x8(self, a: mask64x8<Self>) -> bool;
2935 #[doc = "Returns true if all elements in this mask are true (all ones).\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
2936 fn all_true_mask64x8(self, a: mask64x8<Self>) -> bool;
2937 #[doc = "Returns true if any elements in this mask are false (all zeroes).\n\nThis is logically equivalent to `!all_true`, but may be faster.\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
2938 fn any_false_mask64x8(self, a: mask64x8<Self>) -> bool;
2939 #[doc = "Returns true if all elements in this mask are false (all zeroes).\n\nThis is logically equivalent to `!any_true`, but may be faster.\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
2940 fn all_false_mask64x8(self, a: mask64x8<Self>) -> bool;
2941 #[doc = "Split a vector into two vectors of half the width.\n\nReturns a tuple of (lower half, upper half)."]
2942 fn split_mask64x8(self, a: mask64x8<Self>) -> (mask64x4<Self>, mask64x4<Self>);
2943}
2944pub(crate) mod arch_types {
2945 #[expect(
2946 unnameable_types,
2947 reason = "The native vector types that back a `Simd` implementation are an internal implementation detail, and intentionally kept private"
2948 )]
2949 pub trait ArchTypes {
2950 type f32x4: Copy + Send + Sync;
2951 type i8x16: Copy + Send + Sync;
2952 type u8x16: Copy + Send + Sync;
2953 type mask8x16: Copy + Send + Sync;
2954 type i16x8: Copy + Send + Sync;
2955 type u16x8: Copy + Send + Sync;
2956 type mask16x8: Copy + Send + Sync;
2957 type i32x4: Copy + Send + Sync;
2958 type u32x4: Copy + Send + Sync;
2959 type mask32x4: Copy + Send + Sync;
2960 type f64x2: Copy + Send + Sync;
2961 type mask64x2: Copy + Send + Sync;
2962 type f32x8: Copy + Send + Sync;
2963 type i8x32: Copy + Send + Sync;
2964 type u8x32: Copy + Send + Sync;
2965 type mask8x32: Copy + Send + Sync;
2966 type i16x16: Copy + Send + Sync;
2967 type u16x16: Copy + Send + Sync;
2968 type mask16x16: Copy + Send + Sync;
2969 type i32x8: Copy + Send + Sync;
2970 type u32x8: Copy + Send + Sync;
2971 type mask32x8: Copy + Send + Sync;
2972 type f64x4: Copy + Send + Sync;
2973 type mask64x4: Copy + Send + Sync;
2974 type f32x16: Copy + Send + Sync;
2975 type i8x64: Copy + Send + Sync;
2976 type u8x64: Copy + Send + Sync;
2977 type mask8x64: Copy + Send + Sync;
2978 type i16x32: Copy + Send + Sync;
2979 type u16x32: Copy + Send + Sync;
2980 type mask16x32: Copy + Send + Sync;
2981 type i32x16: Copy + Send + Sync;
2982 type u32x16: Copy + Send + Sync;
2983 type mask32x16: Copy + Send + Sync;
2984 type f64x8: Copy + Send + Sync;
2985 type mask64x8: Copy + Send + Sync;
2986 }
2987}
2988#[doc = r" Base functionality implemented by all SIMD vectors."]
2989pub trait SimdBase<S: Simd>:
2990 Copy
2991 + Sync
2992 + Send
2993 + 'static
2994 + Bytes
2995 + SimdFrom<Self::Element, S>
2996 + core::ops::Index<usize, Output = Self::Element>
2997 + core::ops::IndexMut<usize, Output = Self::Element>
2998 + core::ops::Deref<Target = Self::Array>
2999 + core::ops::DerefMut<Target = Self::Array>
3000{
3001 #[doc = r" The type of this vector's elements."]
3002 type Element: SimdElement;
3003 #[doc = r" This vector type's lane count. This is useful when you're"]
3004 #[doc = r" working with a native-width vector (e.g. [`Simd::f32s`]) and"]
3005 #[doc = r" want to process data in native-width chunks."]
3006 const N: usize;
3007 #[doc = r" A SIMD vector mask with the same number of elements."]
3008 #[doc = r""]
3009 #[doc = r" The mask element is represented as an integer which is"]
3010 #[doc = r" all-0 for `false` and all-1 for `true`. When we get deep"]
3011 #[doc = r" into AVX-512, we need to think about predication masks."]
3012 #[doc = r""]
3013 #[doc = r" One possibility to consider is that the SIMD trait grows"]
3014 #[doc = r" `maskAxB` associated types."]
3015 type Mask: SimdMask<S, Element = <Self::Element as SimdElement>::Mask>;
3016 #[doc = r" A 128-bit SIMD vector of the same scalar type."]
3017 type Block: SimdBase<S, Element = Self::Element>;
3018 #[doc = r" The array type that this vector type corresponds to, which will"]
3019 #[doc = r" always be `[Self::Element; Self::N]`. It has the same layout as"]
3020 #[doc = r" this vector type, but likely has a lower alignment."]
3021 type Array;
3022 #[doc = r" Get the [`Simd`] implementation associated with this type."]
3023 fn witness(&self) -> S;
3024 fn as_slice(&self) -> &[Self::Element];
3025 fn as_mut_slice(&mut self) -> &mut [Self::Element];
3026 #[doc = r" Create a SIMD vector from a slice."]
3027 #[doc = r""]
3028 #[doc = r" The slice must be exactly the size of the SIMD vector."]
3029 fn from_slice(simd: S, slice: &[Self::Element]) -> Self;
3030 #[doc = r" Store a SIMD vector into a slice."]
3031 #[doc = r""]
3032 #[doc = r" The slice must be exactly the size of the SIMD vector."]
3033 fn store_slice(&self, slice: &mut [Self::Element]);
3034 #[doc = r" Create a SIMD vector from a 128-bit vector of the same scalar"]
3035 #[doc = r" type, repeated."]
3036 fn block_splat(block: Self::Block) -> Self;
3037 #[doc = r" Create a SIMD vector where each element is produced by"]
3038 #[doc = r" calling `f` with that element's lane index (from 0 to"]
3039 #[doc = r" [`SimdBase::N`] - 1)."]
3040 fn from_fn(simd: S, f: impl FnMut(usize) -> Self::Element) -> Self;
3041 #[doc = "Create a SIMD vector with all elements set to the given value."]
3042 fn splat(simd: S, val: Self::Element) -> Self;
3043 #[doc = "Concatenate `[self, rhs]` and extract `Self::N` elements starting at index `SHIFT`.\n\n`SHIFT` must be within [0, `Self::N`].\n\nThis can be used to implement a \"shift items\" operation by providing all zeroes as one operand. For a left shift, the right-hand side should be all zeroes. For a right shift by `M` items, the left-hand side should be all zeroes, and the shift amount will be `Self::N - M`.\n\nThis can also be used to rotate items within a vector by providing the same vector as both operands.\n\n```text\n\nslide::<1>([a b c d], [e f g h]) == [b c d e]\n\n```"]
3044 fn slide<const SHIFT: usize>(self, rhs: impl SimdInto<Self, S>) -> Self;
3045 #[doc = "Like `slide`, but operates independently on each 128-bit block."]
3046 fn slide_within_blocks<const SHIFT: usize>(self, rhs: impl SimdInto<Self, S>) -> Self;
3047}
3048#[doc = r" Functionality implemented by floating-point SIMD vectors."]
3049pub trait SimdFloat<S: Simd>:
3050 SimdBase<S>
3051 + core::ops::Neg<Output = Self>
3052 + core::ops::Add<Output = Self>
3053 + core::ops::AddAssign
3054 + core::ops::Add<Self::Element, Output = Self>
3055 + core::ops::AddAssign<Self::Element>
3056 + core::ops::Sub<Output = Self>
3057 + core::ops::SubAssign
3058 + core::ops::Sub<Self::Element, Output = Self>
3059 + core::ops::SubAssign<Self::Element>
3060 + core::ops::Mul<Output = Self>
3061 + core::ops::MulAssign
3062 + core::ops::Mul<Self::Element, Output = Self>
3063 + core::ops::MulAssign<Self::Element>
3064 + core::ops::Div<Output = Self>
3065 + core::ops::DivAssign
3066 + core::ops::Div<Self::Element, Output = Self>
3067 + core::ops::DivAssign<Self::Element>
3068{
3069 #[doc = r" Convert this floating-point type to an integer. This is a convenience method that"]
3070 #[doc = r" delegates to [`SimdCvtTruncate::truncate_from`], and can only be called if there"]
3071 #[doc = r" actually exists a target type of the same bit width (currently, only `u32` and"]
3072 #[doc = r" `i32`)."]
3073 #[doc = r""]
3074 #[doc = r" For more information about the semantics of this specific conversion, see the"]
3075 #[doc = r" concrete `SimdCvtTruncate` implementations for integer types."]
3076 #[inline(always)]
3077 fn to_int<T: SimdCvtTruncate<Self>>(self) -> T {
3078 T::truncate_from(self)
3079 }
3080 #[doc = r" Convert this floating-point type to an integer, saturating on overflow and returning"]
3081 #[doc = r" 0 for NaN. This is a convenience method that delegates to"]
3082 #[doc = r" [`SimdCvtTruncate::truncate_from_precise`], and can only be called if there actually"]
3083 #[doc = r" exists a target type of the same bit width (currently, only `u32` and `i32`)."]
3084 #[doc = r""]
3085 #[doc = r" For more information about the semantics of this specific conversion, see the"]
3086 #[doc = r" concrete `SimdCvtTruncate` implementations for integer types."]
3087 #[inline(always)]
3088 fn to_int_precise<T: SimdCvtTruncate<Self>>(self) -> T {
3089 T::truncate_from_precise(self)
3090 }
3091 #[doc = "Compute the absolute value of each element."]
3092 fn abs(self) -> Self;
3093 #[doc = "Compute the square root of each element.\n\nNegative elements other than `-0.0` will become NaN."]
3094 fn sqrt(self) -> Self;
3095 #[doc = "Return a vector with the magnitude of `self` and the sign of `rhs` for each element.\n\nThis operation copies the sign bit, so if an input element is NaN, the output element will be a NaN with the same payload and a copied sign bit."]
3096 fn copysign(self, rhs: impl SimdInto<Self, S>) -> Self;
3097 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
3098 fn simd_eq(self, rhs: impl SimdInto<Self, S>) -> Self::Mask;
3099 #[doc = "Compare two vectors element-wise for less than.\n\nReturns a mask where each element is all ones if `self` is less than `rhs`, and all zeroes if not."]
3100 fn simd_lt(self, rhs: impl SimdInto<Self, S>) -> Self::Mask;
3101 #[doc = "Compare two vectors element-wise for less than or equal.\n\nReturns a mask where each element is all ones if `self` is less than or equal to `rhs`, and all zeroes if not."]
3102 fn simd_le(self, rhs: impl SimdInto<Self, S>) -> Self::Mask;
3103 #[doc = "Compare two vectors element-wise for greater than or equal.\n\nReturns a mask where each element is all ones if `self` is greater than or equal to `rhs`, and all zeroes if not."]
3104 fn simd_ge(self, rhs: impl SimdInto<Self, S>) -> Self::Mask;
3105 #[doc = "Compare two vectors element-wise for greater than.\n\nReturns a mask where each element is all ones if `self` is greater than `rhs`, and all zeroes if not."]
3106 fn simd_gt(self, rhs: impl SimdInto<Self, S>) -> Self::Mask;
3107 #[doc = "Interleave the lower half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, b0, a1, b1]`.\n\n**Note:** This operation is only useful if you need to discard elements `a2, a3, b2, b3`.\n For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
3108 fn zip_low(self, rhs: impl SimdInto<Self, S>) -> Self;
3109 #[doc = "Interleave the upper half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a2, b2, a3, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a1, b0, b1`.For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
3110 fn zip_high(self, rhs: impl SimdInto<Self, S>) -> Self;
3111 #[doc = "Extract even-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, a2, b0, b2]`.\n\n**Note:** This operation is only useful if you need to discard elements `a1, a3, b1, b3`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
3112 fn unzip_low(self, rhs: impl SimdInto<Self, S>) -> Self;
3113 #[doc = "Extract odd-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a1, a3, b1, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a2, b0, b2`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
3114 fn unzip_high(self, rhs: impl SimdInto<Self, S>) -> Self;
3115 #[doc = "Interleave two vectors.\n\nThe resulting vectors contain elements taken alternately from `self` and `rhs`, first filling the first result, and then the second.\n\nThe reverse of this operation is `deinterleave`.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `([a0, b0, a1, b1], [a2, b2, a3, b3])`."]
3116 fn interleave(self, rhs: impl SimdInto<Self, S>) -> (Self, Self);
3117 #[doc = "Deinterleave two vectors.\n\nThe first result contains all even-indexed elements from `self` followed by all even-indexed elements from `rhs`. The second result contains all odd-indexed elements from `self` followed by all odd-indexed elements from `rhs`.\n\nThe reverse of this operation is `interleave`.\n\nFor vectors `[a0, b0, a1, b1]` and `[a2, b2, a3, b3]`, returns `([a0, a1, a2, a3], [b0, b1, b2, b3])`."]
3118 fn deinterleave(self, rhs: impl SimdInto<Self, S>) -> (Self, Self);
3119 #[doc = "Return the element-wise maximum of two vectors.\n\nIf either operand is NaN, the result for that lane is implementation-defined-- it could be either the first or second operand. See `max_precise` for a version that returns the non-NaN operand if only one is NaN.\n\nIf one operand is positive zero and the other is negative zero, the result is also implementation-defined, and it could be either one."]
3120 fn max(self, rhs: impl SimdInto<Self, S>) -> Self;
3121 #[doc = "Return the element-wise minimum of two vectors.\n\nIf either operand is NaN, the result for that lane is implementation-defined-- it could be either the first or second operand. See `min_precise` for a version that returns the non-NaN operand if only one is NaN.\n\nIf one operand is positive zero and the other is negative zero, the result is also implementation-defined, and it could be either one."]
3122 fn min(self, rhs: impl SimdInto<Self, S>) -> Self;
3123 #[doc = "Return the element-wise maximum of two vectors.\n\nIf one operand is a quiet NaN and the other is not, this operation will choose the non-NaN operand.\n\nIf one operand is positive zero and the other is negative zero, the result is implementation-defined, and it could be either one.\n\nIf an operand is a *signaling* NaN, the result is not just implementation-defined, but fully non-deterministic: it may be either NaN or the non-NaN operand.\nSignaling NaN values are not produced by floating-point math operations, only from manual initialization with specific bit patterns. You probably don't need to worry about them."]
3124 fn max_precise(self, rhs: impl SimdInto<Self, S>) -> Self;
3125 #[doc = "Return the element-wise minimum of two vectors.\n\nIf one operand is a quiet NaN and the other is not, this operation will choose the non-NaN operand.\n\nIf one operand is positive zero and the other is negative zero, the result is implementation-defined, and it could be either one.\n\nIf an operand is a *signaling* NaN, the result is not just implementation-defined, but fully non-deterministic: it may be either NaN or the non-NaN operand.\nSignaling NaN values are not produced by floating-point math operations, only from manual initialization with specific bit patterns. You probably don't need to worry about them."]
3126 fn min_precise(self, rhs: impl SimdInto<Self, S>) -> Self;
3127 #[doc = "Compute `(self * op1) + op2` (fused multiply-add) for each element.\n\nDepending on hardware support, the result may be computed with only one rounding error, or may be implemented as a regular multiply followed by an add, which will result in two rounding errors."]
3128 fn mul_add(self, op1: impl SimdInto<Self, S>, op2: impl SimdInto<Self, S>) -> Self;
3129 #[doc = "Compute `(self * op1) - op2` (fused multiply-subtract) for each element.\n\nDepending on hardware support, the result may be computed with only one rounding error, or may be implemented as a regular multiply followed by a subtract, which will result in two rounding errors."]
3130 fn mul_sub(self, op1: impl SimdInto<Self, S>, op2: impl SimdInto<Self, S>) -> Self;
3131 #[doc = "Return the largest integer less than or equal to each element, that is, round towards negative infinity."]
3132 fn floor(self) -> Self;
3133 #[doc = "Return the smallest integer greater than or equal to each element, that is, round towards positive infinity."]
3134 fn ceil(self) -> Self;
3135 #[doc = "Round each element to the nearest integer, with ties rounding to the nearest even integer.\n\nThere is no corresponding `round` operation. Rust's `round` operation rounds ties away from zero, a behavior it inherited from C. That behavior is not implemented across all platforms, whereas round-ties-even is."]
3136 fn round_ties_even(self) -> Self;
3137 #[doc = "Return the fractional part of each element.\n\nThis is equivalent to `self - self.trunc()`."]
3138 fn fract(self) -> Self;
3139 #[doc = "Return the integer part of each element, rounding towards zero."]
3140 fn trunc(self) -> Self;
3141}
3142#[doc = r" Functionality implemented by (signed and unsigned) integer SIMD vectors."]
3143pub trait SimdInt<S: Simd>:
3144 SimdBase<S>
3145 + core::ops::Add<Output = Self>
3146 + core::ops::AddAssign
3147 + core::ops::Add<Self::Element, Output = Self>
3148 + core::ops::AddAssign<Self::Element>
3149 + core::ops::Sub<Output = Self>
3150 + core::ops::SubAssign
3151 + core::ops::Sub<Self::Element, Output = Self>
3152 + core::ops::SubAssign<Self::Element>
3153 + core::ops::Mul<Output = Self>
3154 + core::ops::MulAssign
3155 + core::ops::Mul<Self::Element, Output = Self>
3156 + core::ops::MulAssign<Self::Element>
3157 + core::ops::BitAnd<Output = Self>
3158 + core::ops::BitAndAssign
3159 + core::ops::BitAnd<Self::Element, Output = Self>
3160 + core::ops::BitAndAssign<Self::Element>
3161 + core::ops::BitOr<Output = Self>
3162 + core::ops::BitOrAssign
3163 + core::ops::BitOr<Self::Element, Output = Self>
3164 + core::ops::BitOrAssign<Self::Element>
3165 + core::ops::BitXor<Output = Self>
3166 + core::ops::BitXorAssign
3167 + core::ops::BitXor<Self::Element, Output = Self>
3168 + core::ops::BitXorAssign<Self::Element>
3169 + core::ops::Not<Output = Self>
3170 + core::ops::Shl<u32, Output = Self>
3171 + core::ops::ShlAssign<u32>
3172 + core::ops::Shl<Output = Self>
3173 + core::ops::ShlAssign
3174 + core::ops::Shr<u32, Output = Self>
3175 + core::ops::ShrAssign<u32>
3176 + core::ops::Shr<Output = Self>
3177 + core::ops::ShrAssign
3178{
3179 #[doc = r" Convert this integer type to a floating-point type. This is a convenience method"]
3180 #[doc = r" that delegates to [`SimdCvtFloat::float_from`], and can only be called if there"]
3181 #[doc = r" actually exists a target type of the same bit width (currently, only `f32`)."]
3182 #[inline(always)]
3183 fn to_float<T: SimdCvtFloat<Self>>(self) -> T {
3184 T::float_from(self)
3185 }
3186 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
3187 fn simd_eq(self, rhs: impl SimdInto<Self, S>) -> Self::Mask;
3188 #[doc = "Compare two vectors element-wise for less than.\n\nReturns a mask where each element is all ones if `self` is less than `rhs`, and all zeroes if not."]
3189 fn simd_lt(self, rhs: impl SimdInto<Self, S>) -> Self::Mask;
3190 #[doc = "Compare two vectors element-wise for less than or equal.\n\nReturns a mask where each element is all ones if `self` is less than or equal to `rhs`, and all zeroes if not."]
3191 fn simd_le(self, rhs: impl SimdInto<Self, S>) -> Self::Mask;
3192 #[doc = "Compare two vectors element-wise for greater than or equal.\n\nReturns a mask where each element is all ones if `self` is greater than or equal to `rhs`, and all zeroes if not."]
3193 fn simd_ge(self, rhs: impl SimdInto<Self, S>) -> Self::Mask;
3194 #[doc = "Compare two vectors element-wise for greater than.\n\nReturns a mask where each element is all ones if `self` is greater than `rhs`, and all zeroes if not."]
3195 fn simd_gt(self, rhs: impl SimdInto<Self, S>) -> Self::Mask;
3196 #[doc = "Interleave the lower half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, b0, a1, b1]`.\n\n**Note:** This operation is only useful if you need to discard elements `a2, a3, b2, b3`.\n For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
3197 fn zip_low(self, rhs: impl SimdInto<Self, S>) -> Self;
3198 #[doc = "Interleave the upper half elements of two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a2, b2, a3, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a1, b0, b1`.For fully interleaving two vectors prefer `interleave`,\n which is faster than `zip_low` followed by `zip_high` on some platforms."]
3199 fn zip_high(self, rhs: impl SimdInto<Self, S>) -> Self;
3200 #[doc = "Extract even-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a0, a2, b0, b2]`.\n\n**Note:** This operation is only useful if you need to discard elements `a1, a3, b1, b3`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
3201 fn unzip_low(self, rhs: impl SimdInto<Self, S>) -> Self;
3202 #[doc = "Extract odd-indexed elements from two vectors.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `[a1, a3, b1, b3]`.\n\n**Note:** This operation is only useful if you need to discard elements `a0, a2, b0, b2`.For fully deinterleaving two vectors prefer `deinterleave`,\n which is faster than `unzip_low` followed by `unzip_high` on some platforms."]
3203 fn unzip_high(self, rhs: impl SimdInto<Self, S>) -> Self;
3204 #[doc = "Interleave two vectors.\n\nThe resulting vectors contain elements taken alternately from `self` and `rhs`, first filling the first result, and then the second.\n\nThe reverse of this operation is `deinterleave`.\n\nFor vectors `[a0, a1, a2, a3]` and `[b0, b1, b2, b3]`, returns `([a0, b0, a1, b1], [a2, b2, a3, b3])`."]
3205 fn interleave(self, rhs: impl SimdInto<Self, S>) -> (Self, Self);
3206 #[doc = "Deinterleave two vectors.\n\nThe first result contains all even-indexed elements from `self` followed by all even-indexed elements from `rhs`. The second result contains all odd-indexed elements from `self` followed by all odd-indexed elements from `rhs`.\n\nThe reverse of this operation is `interleave`.\n\nFor vectors `[a0, b0, a1, b1]` and `[a2, b2, a3, b3]`, returns `([a0, a1, a2, a3], [b0, b1, b2, b3])`."]
3207 fn deinterleave(self, rhs: impl SimdInto<Self, S>) -> (Self, Self);
3208 #[doc = "Return the element-wise minimum of two vectors."]
3209 fn min(self, rhs: impl SimdInto<Self, S>) -> Self;
3210 #[doc = "Return the element-wise maximum of two vectors."]
3211 fn max(self, rhs: impl SimdInto<Self, S>) -> Self;
3212}
3213#[doc = r" Functionality implemented by SIMD masks."]
3214pub trait SimdMask<S: Simd>:
3215 SimdBase<S>
3216 + core::ops::BitAnd<Output = Self>
3217 + core::ops::BitAndAssign
3218 + core::ops::BitAnd<Self::Element, Output = Self>
3219 + core::ops::BitAndAssign<Self::Element>
3220 + core::ops::BitOr<Output = Self>
3221 + core::ops::BitOrAssign
3222 + core::ops::BitOr<Self::Element, Output = Self>
3223 + core::ops::BitOrAssign<Self::Element>
3224 + core::ops::BitXor<Output = Self>
3225 + core::ops::BitXorAssign
3226 + core::ops::BitXor<Self::Element, Output = Self>
3227 + core::ops::BitXorAssign<Self::Element>
3228 + core::ops::Not<Output = Self>
3229{
3230 #[doc = "Compare two vectors element-wise for equality.\n\nReturns a mask where each element is all ones if the corresponding elements are equal, and all zeroes if not."]
3231 fn simd_eq(self, rhs: impl SimdInto<Self, S>) -> Self::Mask;
3232 #[doc = "Returns true if any elements in this mask are true (all ones).\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
3233 fn any_true(self) -> bool;
3234 #[doc = "Returns true if all elements in this mask are true (all ones).\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
3235 fn all_true(self) -> bool;
3236 #[doc = "Returns true if any elements in this mask are false (all zeroes).\n\nThis is logically equivalent to `!all_true`, but may be faster.\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
3237 fn any_false(self) -> bool;
3238 #[doc = "Returns true if all elements in this mask are false (all zeroes).\n\nThis is logically equivalent to `!any_true`, but may be faster.\n\nBehavior on mask elements that are not all zeroes or all ones is unspecified. It may vary depending on architecture, feature level, the mask elements' width, the mask vector's width, or library version.\n\nThe behavior is also not guaranteed to be logically consistent if mask elements are not all zeroes or all ones. `any_true` may not return the same result as `!all_false`, and `all_true` may not return the same result as `!any_false`.\n\nThe [`select`](crate::Select::select) operation also has unspecified behavior for mask elements that are not all zeroes or all ones. That behavior may not match the behavior of this operation."]
3239 fn all_false(self) -> bool;
3240}