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

Benjamin Herrenschmidt benh at kernel.crashing.org
Wed Feb 18 07:44:13 AEDT 2015


On Tue, 2015-02-17 at 15:38 -0500, Dan Streetman wrote:
> 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.

This is quite nice, did you check gcc was resolving it properly at
compile time ?

We could get rid of a whole pile of our _LSH definitions all over the
place...

> 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 */




More information about the Skiboot mailing list