// https://doc.rust-lang.org/std/primitive.u16.html#method.leading_zeros #[cfg(not(any(all( target_arch = "spirv", not(all( target_feature = "IntegerFunctions2INTEL", target_feature = "SPV_INTEL_shader_integer_functions2" )) ))))] pub(crate) const fn leading_zeros_u16(x: u16) -> u32 { x.leading_zeros() } #[cfg(all( target_arch = "spirv", not(all( target_feature = "IntegerFunctions2INTEL", target_feature = "SPV_INTEL_shader_integer_functions2" )) ))] pub(crate) const fn leading_zeros_u16(x: u16) -> u32 { leading_zeros_u16_fallback(x) } #[cfg(any( test, all( target_arch = "spirv", not(all( target_feature = "IntegerFunctions2INTEL", target_feature = "SPV_INTEL_shader_integer_functions2" )) ) ))] const fn leading_zeros_u16_fallback(mut x: u16) -> u32 { use crunchy::unroll; let mut c = 0; let msb = 1 << 15; unroll! { for i in 0 .. 16 { if x & msb == 0 { c += 1; } else { return c; } #[allow(unused_assignments)] if i < 15 { x <<= 1; } }} c } #[cfg(test)] mod test { #[test] fn leading_zeros_u16_fallback() { for x in [44, 97, 304, 1179, 23571] { assert_eq!(super::leading_zeros_u16_fallback(x), x.leading_zeros()); } } }