xref: /aosp_15_r20/external/cpuinfo/src/cpuinfo/utils.h (revision 2b54f0db79fd8303838913b20ff3780cddaa909f)
1*2b54f0dbSXin Li #pragma once
2*2b54f0dbSXin Li 
3*2b54f0dbSXin Li #include <stdint.h>
4*2b54f0dbSXin Li 
5*2b54f0dbSXin Li 
bit_length(uint32_t n)6*2b54f0dbSXin Li inline static uint32_t bit_length(uint32_t n) {
7*2b54f0dbSXin Li 	const uint32_t n_minus_1 = n - 1;
8*2b54f0dbSXin Li 	if (n_minus_1 == 0) {
9*2b54f0dbSXin Li 		return 0;
10*2b54f0dbSXin Li 	} else {
11*2b54f0dbSXin Li 		#ifdef _MSC_VER
12*2b54f0dbSXin Li 			unsigned long bsr;
13*2b54f0dbSXin Li 			_BitScanReverse(&bsr, n_minus_1);
14*2b54f0dbSXin Li 			return bsr + 1;
15*2b54f0dbSXin Li 		#else
16*2b54f0dbSXin Li 			return 32 - __builtin_clz(n_minus_1);
17*2b54f0dbSXin Li 		#endif
18*2b54f0dbSXin Li 	}
19*2b54f0dbSXin Li }
20