@@ -126,6 +126,40 @@ pub unsafe fn simd_shl<T>(lhs: T, rhs: T) -> T;
126
126
#[ rustc_nounwind]
127
127
pub unsafe fn simd_shr < T > ( lhs : T , rhs : T ) -> T ;
128
128
129
+ /// Funnel Shifts vector left elementwise, with UB on overflow.
130
+ ///
131
+ /// Concatenates `a` and `b` elementwise (with `a` in the most significant half),
132
+ /// creating a vector of the same length, but with each element being twice as
133
+ /// wide. Then shift this vector left elementwise by `shift`, shifting in zeros,
134
+ /// and extract the most significant half of each of the elements. If `a` and `b`
135
+ /// are the same, this is equivalent to an elementwise rotate left operation.
136
+ ///
137
+ /// `T` must be a vector of integers.
138
+ ///
139
+ /// # Safety
140
+ ///
141
+ /// Each element of `shift` must be less than `<int>::BITS`.
142
+ #[ rustc_intrinsic]
143
+ #[ rustc_nounwind]
144
+ pub unsafe fn simd_funnel_shl < T > ( a : T , b : T , shift : T ) -> T ;
145
+
146
+ /// Funnel Shifts vector right elementwise, with UB on overflow.
147
+ ///
148
+ /// Concatenates `a` and `b` elementwise (with `a` in the most significant half),
149
+ /// creating a vector of the same length, but with each element being twice as
150
+ /// wide. Then shift this vector right elementwise by `shift`, shifting in zeros,
151
+ /// and extract the least significant half of each of the elements. If `a` and `b`
152
+ /// are the same, this is equivalent to an elementwise rotate right operation.
153
+ ///
154
+ /// `T` must be a vector of integers.
155
+ ///
156
+ /// # Safety
157
+ ///
158
+ /// Each element of `shift` must be less than `<int>::BITS`.
159
+ #[ rustc_intrinsic]
160
+ #[ rustc_nounwind]
161
+ pub unsafe fn simd_funnel_shr < T > ( a : T , b : T , shift : T ) -> T ;
162
+
129
163
/// "Ands" vectors elementwise.
130
164
///
131
165
/// `T` must be a vector of integers.
@@ -678,6 +712,14 @@ pub unsafe fn simd_floor<T>(x: T) -> T;
678
712
#[ rustc_nounwind]
679
713
pub unsafe fn simd_round < T > ( x : T ) -> T ;
680
714
715
+ /// Rounds each element to the closest integer-valued float.
716
+ /// Ties are resolved by rounding to the number with an even least significant digit
717
+ ///
718
+ /// `T` must be a vector of floats.
719
+ #[ rustc_intrinsic]
720
+ #[ rustc_nounwind]
721
+ pub unsafe fn simd_round_ties_even < T > ( x : T ) -> T ;
722
+
681
723
/// Returns the integer part of each element as an integer-valued float.
682
724
/// In other words, non-integer values are truncated towards zero.
683
725
///
0 commit comments