[Skiboot] [PATCH 1/5] simplify GET/SETFIELD() use, add MASK_TO_LSH()

Dan Streetman ddstreet at ieee.org
Wed Feb 18 07:38:50 AEDT 2015


Currently, the GETFIELD() and SETFIELD() macros require the user to define
both the _MASK and the _LSH of the field. However, the shift of the field
is trivially determinable and there is no reason it needs to be specified
by the user.

Add MASK_TO_LSH() macro, which determines the shift of a given mask.

Change GETFIELD() and SETFIELD() to use MASK_TO_LSH() to determine the
shift of the specified mask, instead of requiring it to be specified by
the user.

Signed-off-by: Dan Streetman <ddstreet at ieee.org>
---
 include/bitutils.h | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/include/bitutils.h b/include/bitutils.h
index 7e5b6eb..baa752b 100644
--- a/include/bitutils.h
+++ b/include/bitutils.h
@@ -36,15 +36,16 @@
  * PPC bitmask field manipulation
  */
 
+/* Find left shift from first set bit in mask */
+#define MASK_TO_LSH(m)		(__builtin_ffsl(m) - 1)
+
 /* Extract field fname from val */
-#define GETFIELD(fname, val)			\
-	(((val) & fname##_MASK) >> fname##_LSH)
+#define GETFIELD(m, v)		(((v) & (m)) >> MASK_TO_LSH(m))
 
 /* Set field fname of oval to fval
  * NOTE: oval isn't modified, the combined result is returned
  */
-#define SETFIELD(fname, oval, fval)			\
-	(((oval) & ~fname##_MASK) | \
-	 ((((typeof(oval))(fval)) << fname##_LSH) & fname##_MASK))
+#define SETFIELD(m, v, val)				\
+	(((v) & ~(m)) |	((((typeof(v))(val)) << MASK_TO_LSH(m)) & (m)))
 
 #endif /* __BITUTILS_H */
-- 
1.8.3.1



More information about the Skiboot mailing list