Function core::intrinsics::simd::simd_bitmask

source ·
pub unsafe extern "rust-intrinsic" fn simd_bitmask<T, U>(x: T) -> U
🔬This is a nightly-only experimental API. (core_intrinsics)
Expand description

Truncate an integer vector to a bitmask.

T must be an integer vector.

U must be either the smallest unsigned integer with at least as many bits as the length of T, or the smallest array of u8 with as many bits as the length of T.

Each element is truncated to a single bit and packed into the result.

No matter whether the output is an array or an unsigned integer, it is treated as a single contiguous list of bits. The bitmask is always packed on the least-significant side of the output, and padded with 0s in the most-significant bits. The order of the bits depends on endianness:

  • On little endian, the least significant bit corresponds to the first vector element.
  • On big endian, the least significant bit corresponds to the last vector element.

For example, [!0, 0, !0, !0] packs to 0b1101 on little endian and 0b1011 on big endian.

To consider a larger example, [!0, 0, 0, 0, 0, 0, 0, 0, !0, !0, 0, 0, 0, 0, !0, 0] packs to [0b00000001, 0b01000011] or 0b0100001100000001 on little endian, and [0b10000000, 0b11000010] or 0b1000000011000010 on big endian.

§Safety

x must contain only 0 and !0.