carl9170: add hweight and fieldmax from the linux kernel
authorChristian Lamparter <chunkeey@gmail.com>
Fri, 6 May 2022 12:00:36 +0000 (14:00 +0200)
committerChristian Lamparter <chunkeey@gmail.com>
Fri, 6 May 2022 12:01:55 +0000 (14:01 +0200)
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
include/linux/compiler.h

index cd97693822d7d8f0df3f0aa6f9d03b47ae747bce..e2656ae2cfc198270c956a8cdccdf1fb4139660b 100644 (file)
@@ -111,6 +111,14 @@ static inline unsigned int hweight8(unsigned int w)
         return (res + (res >> 4)) & 0x0F;
 }
 
+static inline unsigned int hweight16(unsigned int w)
+{
+        unsigned int res = w - ((w >> 1) & 0x5555);
+        res = (res & 0x3333) + ((res >> 2) & 0x3333);
+        res = (res + (res >> 4)) & 0x0F0F;
+        return (res + (res >> 8)) & 0x00FF;
+}
+
 /**
  * DECLARE_FLEX_ARRAY() - Declare a flexible array usable in a union
  *
@@ -127,4 +135,11 @@ static inline unsigned int hweight8(unsigned int w)
                TYPE NAME[]; \
        }
 
+#define __bf_shf(x) (__builtin_ffsll(x) - 1)
+
+#define FIELD_MAX(_mask)                                                \
+        ({                                                              \
+                (typeof(_mask))((_mask) >> __bf_shf(_mask));            \
+        })
+
 #endif /* __SHARED_COMPILER_H */