lkml.org 
[lkml]   [2013]   [Oct]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
SubjectRe: [PATCH v2 3/9] bitops: Introduce a more generic BITMASK macro
From
Date
On Thu, 2013-10-17 at 09:10 -0700, Tony Luck wrote:
> On Thu, Oct 17, 2013 at 1:55 AM, Joe Perches <joe@perches.com> wrote:
> > It's cost free to add the BUILD_BUG_ON
> > and perhaps you underestimate the runtime
> > bug checking effort,
>
> This looks OK to me. Gong: This doesn't stop people from using variables
> as arguments ... they just won't get a check for (h) < (l).

Another possibility is to swap high and low if necessary and
maybe warn when either is negative or too large for the bit width.

#define GENMASK(h, l) \
({ \
size_t high = h; \
size_t low = l; \
BUILD_BUG_ON(__builtin_constant_p(l) && \
__builtin_constant_p(h) && \
(l) > (h)); \
BUILD_BUG_ON(__builtin_constant_p(l) && \
__builtin_constant_p(h) && \
((l) >= BITS_PER_LONG || \
(h) >= BITS_PER_LONG)); \
WARN_ONCE((!__builtin_constant_p(l) && \
((l) < 0 || (l) > BITS_PER_LONG)) || \
(!__builtin_constant_p(h) && \
((h) < 0 || (h) > BITS_PER_LONG)) || \
(l) > (h), \
"GENMASK: invalid mask values: l: %u, h: %d\n", \
(l), (h)); \
if (low > high) \
swap(low, high); \
(((U32_C(1) << (high - low + 1)) - 1) << low); \
})

And maybe this should be renamed something like
#define BIT_MASK_RANGE(h, l)
or
#define BIT_MASK_SHIFTED(h, l)




\
 
 \ /
  Last update: 2013-10-17 21:41    [W:0.065 / U:2.404 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site