From: Jérémie Galarneau Date: Fri, 5 May 2017 02:59:18 +0000 (-0400) Subject: Add utils_get_count_order_u64 to utils X-Git-Tag: v2.10.0-rc1~45 X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=commitdiff_plain;h=db5be0a3dcf30edeca9c3143682454bab9523f71 Add utils_get_count_order_u64 to utils Signed-off-by: Jérémie Galarneau --- diff --git a/src/common/utils.c b/src/common/utils.c index 16d2f817a..4d49728c0 100644 --- a/src/common/utils.c +++ b/src/common/utils.c @@ -1017,6 +1017,59 @@ static inline unsigned int fls_u32(uint32_t x) #define HAS_FLS_U32 #endif +#if defined(__x86_64) +static inline +unsigned int fls_u64(uint64_t x) +{ + long r; + + asm("bsrq %1,%0\n\t" + "jnz 1f\n\t" + "movq $-1,%0\n\t" + "1:\n\t" + : "=r" (r) : "rm" (x)); + return r + 1; +} +#define HAS_FLS_U64 +#endif + +#ifndef HAS_FLS_U64 +static __attribute__((unused)) +unsigned int fls_u64(uint64_t x) +{ + unsigned int r = 64; + + if (!x) + return 0; + + if (!(x & 0xFFFFFFFF00000000ULL)) { + x <<= 32; + r -= 32; + } + if (!(x & 0xFFFF000000000000ULL)) { + x <<= 16; + r -= 16; + } + if (!(x & 0xFF00000000000000ULL)) { + x <<= 8; + r -= 8; + } + if (!(x & 0xF000000000000000ULL)) { + x <<= 4; + r -= 4; + } + if (!(x & 0xC000000000000000ULL)) { + x <<= 2; + r -= 2; + } + if (!(x & 0x8000000000000000ULL)) { + x <<= 1; + r -= 1; + } + return r; +} +#endif + #ifndef HAS_FLS_U32 static __attribute__((unused)) unsigned int fls_u32(uint32_t x) { @@ -1063,6 +1116,20 @@ int utils_get_count_order_u32(uint32_t x) return fls_u32(x - 1); } +/* + * Return the minimum order for which x <= (1UL << order). + * Return -1 if x is 0. + */ +LTTNG_HIDDEN +int utils_get_count_order_u64(uint64_t x) +{ + if (!x) { + return -1; + } + + return fls_u64(x - 1); +} + /** * Obtain the value of LTTNG_HOME environment variable, if exists. * Otherwise returns the value of HOME. diff --git a/src/common/utils.h b/src/common/utils.h index 7285f5c30..0daf5b98d 100644 --- a/src/common/utils.h +++ b/src/common/utils.h @@ -48,6 +48,7 @@ int utils_rotate_stream_file(char *path_name, char *file_name, uint64_t size, int *stream_fd); int utils_parse_size_suffix(char const * const str, uint64_t * const size); int utils_get_count_order_u32(uint32_t x); +int utils_get_count_order_u64(uint64_t x); char *utils_get_home_dir(void); char *utils_get_user_home_dir(uid_t uid); char *utils_get_kmod_probes_list(void);