diff options
author | Dan Streetman <ddstreet@ieee.org> | 2015-02-17 15:38:50 -0500 |
---|---|---|
committer | Stewart Smith <stewart@linux.vnet.ibm.com> | 2015-02-19 12:20:28 +1100 |
commit | 4a88a1452fe0e7f7d17d20aaf9b451969fb8c465 (patch) | |
tree | 9df519b176b2172bd36e963764534bb7a2edc30a /include | |
parent | 348d5c4875ec46792d1749a88ec7457c62650e08 (diff) | |
download | skiboot-4a88a1452fe0e7f7d17d20aaf9b451969fb8c465.zip skiboot-4a88a1452fe0e7f7d17d20aaf9b451969fb8c465.tar.gz skiboot-4a88a1452fe0e7f7d17d20aaf9b451969fb8c465.tar.bz2 |
simplify GET/SETFIELD() use, add MASK_TO_LSH()
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@ieee.org>
Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
Diffstat (limited to 'include')
-rw-r--r-- | include/bitutils.h | 11 |
1 files 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 */ |