1 | // https://doc.rust-lang.org/std/primitive.u16.html#method.leading_zeros |
2 | |
3 | #[cfg (not(any(all( |
4 | target_arch = "spirv" , |
5 | not(all( |
6 | target_feature = "IntegerFunctions2INTEL" , |
7 | target_feature = "SPV_INTEL_shader_integer_functions2" |
8 | )) |
9 | ))))] |
10 | #[inline ] |
11 | pub(crate) const fn leading_zeros_u16(x: u16) -> u32 { |
12 | x.leading_zeros() |
13 | } |
14 | |
15 | #[cfg (all( |
16 | target_arch = "spirv" , |
17 | not(all( |
18 | target_feature = "IntegerFunctions2INTEL" , |
19 | target_feature = "SPV_INTEL_shader_integer_functions2" |
20 | )) |
21 | ))] |
22 | #[inline ] |
23 | pub(crate) const fn leading_zeros_u16(x: u16) -> u32 { |
24 | leading_zeros_u16_fallback(x) |
25 | } |
26 | |
27 | #[cfg (any( |
28 | test, |
29 | all( |
30 | target_arch = "spirv" , |
31 | not(all( |
32 | target_feature = "IntegerFunctions2INTEL" , |
33 | target_feature = "SPV_INTEL_shader_integer_functions2" |
34 | )) |
35 | ) |
36 | ))] |
37 | #[inline ] |
38 | const fn leading_zeros_u16_fallback(mut x: u16) -> u32 { |
39 | use crunchy::unroll; |
40 | let mut c = 0; |
41 | let msb = 1 << 15; |
42 | unroll! { for i in 0 .. 16 { |
43 | if x & msb == 0 { |
44 | c += 1; |
45 | } else { |
46 | return c; |
47 | } |
48 | #[allow(unused_assignments)] |
49 | if i < 15 { |
50 | x <<= 1; |
51 | } |
52 | }} |
53 | c |
54 | } |
55 | |
56 | #[cfg (test)] |
57 | mod test { |
58 | |
59 | #[test ] |
60 | fn leading_zeros_u16_fallback() { |
61 | for x in [44, 97, 304, 1179, 23571] { |
62 | assert_eq!(super::leading_zeros_u16_fallback(x), x.leading_zeros()); |
63 | } |
64 | } |
65 | } |
66 | |