Feature gate: #![feature(funnel_shifts)]
This is a tracking issue for implementation of funnel shifts on integers.
Funnel shifts are essentially a generalization of bitwise rotations. a.funnel_shl(b, n) means concatenate a and b (with a in the most significant half), creating an integer twice as wide, shifting this to the left by n (taken modulo the bit size of a and b), shifting in zeros, and finally extract the most significant half of the wide integer as the result.
The functions will panic if n >= T::BITS, and the wrapping versions consider n modulo T::BITS. The unchecked variant doesn't do any checks (as the name suggests), and so is unsafe.
a.wrapping_funnel_shl(a, n) is meant to be exactly equivalent to a.rotate_left(n).
Public API
impl {u8, u16, u32, u64, u128, usize} {
pub const fn funnel_shl(self, rhs: Self, shift: u32) -> Self;
pub const fn funnel_shr(self, rhs: Self, shift: u32) -> Self;
pub const fn wrapping_funnel_shl(self, rhs: Self, shift: u32) -> Self;
pub const fn wrapping_funnel_shr(self, rhs: Self, shift: u32) -> Self;
pub const unsafe fn unchecked_funnel_shl(self, rhs: Self, shift: u32) -> Self;
pub const unsafe fn unchecked_funnel_shr(self, rhs: Self, shift: u32) -> Self;
}
Steps / History
A SIMD version of these intrinsics were added in #142078
Unresolved Questions
- Should we also provide these functions on signed integer types (akin to
rotates)?
Feature gate:
#![feature(funnel_shifts)]This is a tracking issue for implementation of funnel shifts on integers.
Funnel shifts are essentially a generalization of bitwise rotations.
a.funnel_shl(b, n)means concatenateaandb(withain the most significant half), creating an integer twice as wide, shifting this to the left byn(taken modulo the bit size ofaandb), shifting in zeros, and finally extract the most significant half of the wide integer as the result.The functions will panic if
n >= T::BITS, and thewrappingversions considernmoduloT::BITS. Theuncheckedvariant doesn't do any checks (as the name suggests), and so is unsafe.a.wrapping_funnel_shl(a, n)is meant to be exactly equivalent toa.rotate_left(n).Public API
Steps / History
A SIMD version of these intrinsics were added in #142078
unchecked_funnel_{shl,shr}#154153Unresolved Questions
rotates)?Footnotes
https://std-dev-guide.rust-lang.org/feature-lifecycle/stabilization.html ↩