From 8453c4f2fba7ae95ed14137a14575226b24218af Mon Sep 17 00:00:00 2001 From: Rizwan Qureshi Date: Wed, 7 Sep 2016 20:11:11 +0530 Subject: cpu/x86: Move fls() and fms() to mtrr.h Move the funtion to find most significant bit set(fms) and function to find least significant bit set(fls) to a common place. And remove the duplicates. Change-Id: Ia821038b622d93e7f719c18e5ee3e8112de66a53 Signed-off-by: Rizwan Qureshi Reviewed-on: https://review.coreboot.org/16525 Tested-by: build bot (Jenkins) Reviewed-by: Aaron Durbin --- src/include/cpu/x86/mtrr.h | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'src/include/cpu') diff --git a/src/include/cpu/x86/mtrr.h b/src/include/cpu/x86/mtrr.h index f32bececfd..79f98905b3 100644 --- a/src/include/cpu/x86/mtrr.h +++ b/src/include/cpu/x86/mtrr.h @@ -84,6 +84,33 @@ void set_var_mtrr(unsigned reg, unsigned base, unsigned size, unsigned type); int get_free_var_mtrr(void); #endif +#if !defined(__ASSEMBLER__) && !defined(__ROMCC__) + +/* fms: find most significant bit set, stolen from Linux Kernel Source. */ +static inline unsigned int fms(unsigned int x) +{ + int r; + + __asm__("bsrl %1,%0\n\t" + "jnz 1f\n\t" + "movl $0,%0\n" + "1:" : "=r" (r) : "g" (x)); + return r; +} + +/* fls: find least significant bit set */ +static inline unsigned int fls(unsigned int x) +{ + int r; + + __asm__("bsfl %1,%0\n\t" + "jnz 1f\n\t" + "movl $32,%0\n" + "1:" : "=r" (r) : "g" (x)); + return r; +} +#endif + /* Align up to next power of 2, suitable for ROMCC and assembler too. * Range of result 256kB to 128MB is good enough here. */ -- cgit v1.2.3