[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Minios-devel] [UNIKRAFT PATCH v2 6/6] arch/arm64: Implement bitops for arm64



Without this patch, compiler will report warning as follows:
  In file included from plat/common/arm/time.c:41:0:
include/uk/bitops.h: In function 'uk_get_count_order':
include/uk/bitops.h:89:10: warning: implicit declaration of function
'ukarch_fls'; did you mean 'ukarch_ffsl'? [-Wimplicit-function-declaration]
  order = ukarch_fls(count);
          ^~~~~~~~~~
          ukarch_ffsl
include/uk/bitops.h: In function 'uk_find_last_bit':
include/uk/bitops.h:154:18: warning: implicit declaration of function
'ukarch_flsl'; did you mean 'ukarch_ffsl'? [-Wimplicit-function-declaration]
    return (bit + ukarch_flsl(mask));
                  ^~~~~~~~~~~
                  ukarch_ffsl

Signed-off-by: Jia He <justin.he@xxxxxxx>
---
 arch/arm/arm64/include/uk/asm/atomic.h | 55 ++++++++++++++++----------
 1 file changed, 34 insertions(+), 21 deletions(-)

diff --git a/arch/arm/arm64/include/uk/asm/atomic.h 
b/arch/arm/arm64/include/uk/asm/atomic.h
index 7ee6667..cb9b829 100644
--- a/arch/arm/arm64/include/uk/asm/atomic.h
+++ b/arch/arm/arm64/include/uk/asm/atomic.h
@@ -38,33 +38,46 @@
 #endif
 
 /**
- * ukarch_ffsl - find first (lowest) set bit in word.
+ * ukarch_ffs - find first (lowest) set bit in word.
  * @word: The word to search
  *
  * Undefined if no bit exists, so code should check against 0 first.
  */
-static inline unsigned long ukarch_ffsl(unsigned long word)
+static inline unsigned int ukarch_ffs(unsigned int x)
 {
-       int clz;
+       return __builtin_ffs(x);
+}
 
-       /* xxxxx10000 = word
-        * xxxxx01111 = word - 1
-        * 0000011111 = word ^ (word - 1)
-        *      4     = 63 - clz(word ^ (word - 1))
-        */
+/**
+ * ukarch_fls - find last (highest) set bit in word.
+ * @word: The word to search
+ *
+ * Undefined if no bit exists, so code should check against 0 first.
+ * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
+ */
+static inline unsigned int ukarch_fls(unsigned int x)
+{
+       return x ? sizeof(x) * 8 - __builtin_clz(x) : 0;
+}
 
-       __asm__("sub x0, %[word], #1\n"
-               "eor x0, x0, %[word]\n"
-               "clz %[clz], x0\n"
-               :
-               /* Outputs: */
-               [clz] "=r"(clz)
-               :
-               /* Inputs: */
-               [word] "r"(word)
-               :
-               /* Clobbers: */
-               "x0");
+/**
+ * ukarch_ffsl - find first (lowest) set bit in word.
+ * @word: The word to search
+ *
+ * Undefined if no bit exists, so code should check against 0 first.
+ */
+static inline unsigned long ukarch_ffsl(unsigned long x)
+{
+       return __builtin_ffsl(x);
+}
 
-       return 63 - clz;
+/**
+ * ukarch_flsl - find last (highest) set bit in word.
+ * @word: The word to search
+ *
+ * Undefined if no bit exists, so code should check against 0 first.
+ */
+static inline unsigned long ukarch_flsl(unsigned long x)
+{
+       return x ? sizeof(x) * 8 - __builtin_clzl(x) : 0;
 }
-- 
2.17.1


_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.