[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