From: Mathieu Desnoyers Date: Tue, 22 Feb 2011 22:29:31 +0000 (-0500) Subject: Add arch-agnostic fls() fallback X-Git-Tag: v0.12~37 X-Git-Url: https://git.lttng.org/?p=ust.git;a=commitdiff_plain;h=7f0357f05bf1dae6e371b04a6f94d6912f0a0303 Add arch-agnostic fls() fallback In preparation for ARM port. Signed-off-by: Mathieu Desnoyers --- diff --git a/include/ust/processor.h b/include/ust/processor.h index 8a01a88..6ee44dd 100644 --- a/include/ust/processor.h +++ b/include/ust/processor.h @@ -214,9 +214,7 @@ static inline int fls(int x) #define _ASM_PTR ".long " -#endif /* below is code for x86-64 */ - -#ifdef __x86_64 +#elif defined(__x86_64) struct registers { int padding; /* 4 bytes */ @@ -425,9 +423,7 @@ static inline int fls(int x) #define _ASM_PTR ".quad " -#endif /* x86_64 */ - -#ifdef __PPC__ +#elif defined(__PPC__) struct registers { }; @@ -447,6 +443,37 @@ static __inline__ int fls(unsigned int x) #define _ASM_PTR ".long " #define save_registers(a) -#endif /* __PPC__ */ +#else /* arch-agnostic */ + +static __inline__ int fls(unsigned int x) +{ + int r = 32; + + if (!x) + return 0; + if (!(x & 0xFFFF0000U)) { + x <<= 16; + r -= 16; + } + if (!(x & 0xFF000000U)) { + x <<= 8; + r -= 8; + } + if (!(x & 0xF0000000U)) { + x <<= 4; + r -= 4; + } + if (!(x & 0xC0000000U)) { + x <<= 2; + r -= 2; + } + if (!(x & 0x80000000U)) { + x <<= 1; + r -= 1; + } + return r; +} + +#endif #endif /* UST_PROCESSOR_H */