From: David Laight <david.laight.linux@gmail.com>
To: Yury Norov <yury.norov@gmail.com>
Cc: Rasmus Villemoes <linux@rasmusvillemoes.dk>,
linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org,
Geert Uytterhoeven <geert+renesas@glider.be>,
Alexandre Belloni <alexandre.belloni@bootlin.com>,
Jonathan Cameron <Jonathan.Cameron@huawei.com>,
Crt Mori <cmo@melexis.com>,
Richard Genoud <richard.genoud@bootlin.com>,
Andy Shevchenko <andriy.shevchenko@intel.com>,
Luo Jie <quic_luoj@quicinc.com>,
Peter Zijlstra <peterz@infradead.org>,
Jakub Kicinski <kuba@kernel.org>,
netdev@vger.kernel.org, "David S . Miller" <davem@davemloft.net>,
Simon Horman <simon.horman@netronome.com>,
Mika Westerberg <mika.westerberg@linux.intel.com>,
Andreas Noever <andreas.noever@gmail.com>,
Yehezkel Bernat <YehezkelShB@gmail.com>,
Nicolas Frattaroli <nicolas.frattaroli@collabora.com>
Subject: Re: [PATCH 0/9] bitfield: tidy up bitfield.h
Date: Thu, 11 Dec 2025 10:51:07 +0000 [thread overview]
Message-ID: <20251211105107.305e4828@pumpkin> (raw)
In-Reply-To: <aTm54HCyCTm5k5ci@yury>
On Wed, 10 Dec 2025 13:20:16 -0500
Yury Norov <yury.norov@gmail.com> wrote:
> On Tue, Dec 09, 2025 at 10:03:04AM +0000, david.laight.linux@gmail.com wrote:
> > From: David Laight <david.laight.linux@gmail.com>
...
> > I noticed some very long (18KB) error messages from the compiler.
> > Turned out they were errors on lines that passed GENMASK() to FIELD_PREP().
> > Since most of the #defines are already statement functions the values
> > can be copied to locals so the actual parameters only get expanded once.
> >
> > The 'bloat' is reduced further by using a simple test to ensure 'reg'
> > is large enough, slightly simplifying the test for constant 'val' and
> > only checking 'reg' and 'val' when the parameters are present.
>
> So, can you share the before/after?
Not that hard to generate since the kernel makefiles will create foo.i
I would have fed the .i file though xargs - but someone broke it
(there is no option to ignore quotes, and -s70 isn't allowed).
So I used:
tr ' ' '\n' foo.i | (ll=; while read -r l; do ll1="$ll $l"; [ ${#l} = 0 -o ${#ll1} -ge 70 ] && { echo "$ll"; ll="$l";} || ll="$ll1"; done; echo "$ll")
GENMASK(hi, lo)
((unsigned long)(((int)sizeof(struct
{_Static_assert(!(__builtin_choose_expr((sizeof(int) == sizeof(*(8 ?
((void *)((long)((lo) > (hi)) * 0l)) : (int *)8))), (lo) > (hi),
false)), "const_true((lo) > (hi))" " is true");})) +
(((typeof(unsigned long))((((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))) - 1) + ((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))))) << (lo) & ((typeof(unsigned
long))((((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long))
- 1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1))) -
1) + ((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long)) -
1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1)))))
>> ((sizeof(unsigned long) * 8) - 1 - (hi)))))
A chunk of that would be removed by changing type_max() to do
2 * (n - 1) + 1 instead of (n - 1) + n, but for unsigned types
it isn't needed.
Changing type_max(t) to (t)-1 GENMASK(hi, lo) becomes
(patch not posted...)
((unsigned long)(((int)sizeof(struct
{_Static_assert(!(__builtin_choose_expr((sizeof(int) == sizeof(*(8 ?
((void *)((long)((lo) > (hi)) * 0l)) : (int *)8))), (lo) > (hi),
false)), "const_true((lo) > (hi))" " is true");})) + ((unsigned long)-1
<< (lo) & (unsigned long)-1 >> ((sizeof(unsigned long) * 8) - 1 - (hi)))))
There are still four expansions of both lo and hi - but they are
usually trivial.
You asked for this one :-)
old FIELD_GET(GENMASK(hi, lo), reg)
({ do { __attribute__((__noreturn__)) extern void
__compiletime_assert_769(void) __attribute__((__error__("FIELD_GET: "
"type of reg too small for mask"))); if (!(!(((typeof(
_Generic((((unsigned long)(((int)sizeof(struct
{_Static_assert(!(__builtin_choose_expr((sizeof(int) == sizeof(*(8 ?
((void *)((long)((lo) > (hi)) * 0l)) : (int *)8))), (lo) > (hi),
false)), "const_true((lo) > (hi))" " is true");})) +
(((typeof(unsigned long))((((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))) - 1) + ((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))))) << (lo) & ((typeof(unsigned
long))((((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long))
- 1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1))) -
1) + ((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long)) -
1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1)))))
>> ((sizeof(unsigned long) * 8) - 1 - (hi)))))), char: (unsigned
char)0, unsigned char: (unsigned char)0, signed char: (unsigned
char)0, unsigned short: (unsigned short)0, signed short: (unsigned
short)0, unsigned int: (unsigned int)0, signed int: (unsigned int)0,
unsigned long: (unsigned long)0, signed long: (unsigned long)0,
unsigned long long: (unsigned long long)0, signed long long:
(unsigned long long)0, default: (((unsigned long)(((int)sizeof(struct
{_Static_assert(!(__builtin_choose_expr((sizeof(int) == sizeof(*(8 ?
((void *)((long)((lo) > (hi)) * 0l)) : (int *)8))), (lo) > (hi),
false)), "const_true((lo) > (hi))" " is true");})) +
(((typeof(unsigned long))((((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))) - 1) + ((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))))) << (lo) & ((typeof(unsigned
long))((((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long))
- 1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1))) -
1) + ((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long)) -
1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1)))))
>> ((sizeof(unsigned long) * 8) - 1 - (hi)))))))))(((unsigned
long)(((int)sizeof(struct
{_Static_assert(!(__builtin_choose_expr((sizeof(int) == sizeof(*(8 ?
((void *)((long)((lo) > (hi)) * 0l)) : (int *)8))), (lo) > (hi),
false)), "const_true((lo) > (hi))" " is true");})) +
(((typeof(unsigned long))((((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))) - 1) + ((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))))) << (lo) & ((typeof(unsigned
long))((((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long))
- 1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1))) -
1) + ((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long)) -
1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1)))))
>> ((sizeof(unsigned long) * 8) - 1 - (hi))))))) > ((typeof(
_Generic((reg), char: (unsigned char)0, unsigned char: (unsigned
char)0, signed char: (unsigned char)0, unsigned short: (unsigned
short)0, signed short: (unsigned short)0, unsigned int: (unsigned
int)0, signed int: (unsigned int)0, unsigned long: (unsigned long)0,
signed long: (unsigned long)0, unsigned long long: (unsigned long
long)0, signed long long: (unsigned long long)0, default:
(reg))))(~0ull))))) __compiletime_assert_769(); } while (0); ({ ({ do
{ __attribute__((__noreturn__)) extern void
__compiletime_assert_770(void) __attribute__((__error__("FIELD_GET: "
"mask is not constant"))); if (!(!(!__builtin_constant_p(((unsigned
long)(((int)sizeof(struct
{_Static_assert(!(__builtin_choose_expr((sizeof(int) == sizeof(*(8 ?
((void *)((long)((lo) > (hi)) * 0l)) : (int *)8))), (lo) > (hi),
false)), "const_true((lo) > (hi))" " is true");})) +
(((typeof(unsigned long))((((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))) - 1) + ((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))))) << (lo) & ((typeof(unsigned
long))((((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long))
- 1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1))) -
1) + ((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long)) -
1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1)))))
>> ((sizeof(unsigned long) * 8) - 1 - (hi)))))))))
__compiletime_assert_770(); } while (0); do {
__attribute__((__noreturn__)) extern void
__compiletime_assert_771(void) __attribute__((__error__("FIELD_GET: "
"mask is zero"))); if (!(!((((unsigned long)(((int)sizeof(struct
{_Static_assert(!(__builtin_choose_expr((sizeof(int) == sizeof(*(8 ?
((void *)((long)((lo) > (hi)) * 0l)) : (int *)8))), (lo) > (hi),
false)), "const_true((lo) > (hi))" " is true");})) +
(((typeof(unsigned long))((((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))) - 1) + ((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))))) << (lo) & ((typeof(unsigned
long))((((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long))
- 1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1))) -
1) + ((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long)) -
1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1)))))
>> ((sizeof(unsigned long) * 8) - 1 - (hi)))))) == 0)))
__compiletime_assert_771(); } while (0); do {
__attribute__((__noreturn__)) extern void
__compiletime_assert_772(void) __attribute__((__error__("FIELD_GET: "
"value too large for the field"))); if (!(!(__builtin_constant_p(0U)
? ~((((unsigned long)(((int)sizeof(struct
{_Static_assert(!(__builtin_choose_expr((sizeof(int) == sizeof(*(8 ?
((void *)((long)((lo) > (hi)) * 0l)) : (int *)8))), (lo) > (hi),
false)), "const_true((lo) > (hi))" " is true");})) +
(((typeof(unsigned long))((((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))) - 1) + ((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))))) << (lo) & ((typeof(unsigned
long))((((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long))
- 1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1))) -
1) + ((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long)) -
1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1)))))
>> ((sizeof(unsigned long) * 8) - 1 - (hi)))))) >>
(__builtin_ffsll(((unsigned long)(((int)sizeof(struct
{_Static_assert(!(__builtin_choose_expr((sizeof(int) == sizeof(*(8 ?
((void *)((long)((lo) > (hi)) * 0l)) : (int *)8))), (lo) > (hi),
false)), "const_true((lo) > (hi))" " is true");})) +
(((typeof(unsigned long))((((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))) - 1) + ((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))))) << (lo) & ((typeof(unsigned
long))((((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long))
- 1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1))) -
1) + ((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long)) -
1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1)))))
>> ((sizeof(unsigned long) * 8) - 1 - (hi)))))) - 1)) & (0 + (0U)) :
0))) __compiletime_assert_772(); } while (0); do {
__attribute__((__noreturn__)) extern void
__compiletime_assert_773(void) __attribute__((__error__("BUILD_BUG_ON
failed: " "(((((unsigned long)(((int)sizeof(struct
{_Static_assert(!(__builtin_choose_expr((sizeof(int) == sizeof(*(8 ?
((void *)((long)((lo) > (hi)) * 0l)) : (int *)8))), (lo) > (hi),
false)), \"const_true((lo) > (hi))\" \" is true\");})) +
(((typeof(unsigned long))((((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))) - 1) + ((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))))) << (lo) & ((typeof(unsigned
long))((((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long))
- 1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1))) -
1) + ((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long)) -
1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1)))))
>> ((sizeof(unsigned long) * 8) - 1 - (hi)))))) + (1ULL <<
(__builtin_ffsll(((unsigned long)(((int)sizeof(struct
{_Static_assert(!(__builtin_choose_expr((sizeof(int) == sizeof(*(8 ?
((void *)((long)((lo) > (hi)) * 0l)) : (int *)8))), (lo) > (hi),
false)), \"const_true((lo) > (hi))\" \" is true\");})) +
(((typeof(unsigned long))((((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))) - 1) + ((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))))) << (lo) & ((typeof(unsigned
long))((((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long))
- 1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1))) -
1) + ((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long)) -
1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1)))))
>> ((sizeof(unsigned long) * 8) - 1 - (hi)))))) - 1))) &
(((((unsigned long)(((int)sizeof(struct
{_Static_assert(!(__builtin_choose_expr((sizeof(int) == sizeof(*(8 ?
((void *)((long)((lo) > (hi)) * 0l)) : (int *)8))), (lo) > (hi),
false)), \"const_true((lo) > (hi))\" \" is true\");})) +
(((typeof(unsigned long))((((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))) - 1) + ((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))))) << (lo) & ((typeof(unsigned
long))((((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long))
- 1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1))) -
1) + ((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long)) -
1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1)))))
>> ((sizeof(unsigned long) * 8) - 1 - (hi)))))) + (1ULL <<
(__builtin_ffsll(((unsigned long)(((int)sizeof(struct
{_Static_assert(!(__builtin_choose_expr((sizeof(int) == sizeof(*(8 ?
((void *)((long)((lo) > (hi)) * 0l)) : (int *)8))), (lo) > (hi),
false)), \"const_true((lo) > (hi))\" \" is true\");})) +
(((typeof(unsigned long))((((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))) - 1) + ((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))))) << (lo) & ((typeof(unsigned
long))((((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long))
- 1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1))) -
1) + ((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long)) -
1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1)))))
>> ((sizeof(unsigned long) * 8) - 1 - (hi)))))) - 1))) - 1)) !=
0"))); if (!(!((((((unsigned long)(((int)sizeof(struct
{_Static_assert(!(__builtin_choose_expr((sizeof(int) == sizeof(*(8 ?
((void *)((long)((lo) > (hi)) * 0l)) : (int *)8))), (lo) > (hi),
false)), "const_true((lo) > (hi))" " is true");})) +
(((typeof(unsigned long))((((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))) - 1) + ((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))))) << (lo) & ((typeof(unsigned
long))((((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long))
- 1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1))) -
1) + ((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long)) -
1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1)))))
>> ((sizeof(unsigned long) * 8) - 1 - (hi)))))) + (1ULL <<
(__builtin_ffsll(((unsigned long)(((int)sizeof(struct
{_Static_assert(!(__builtin_choose_expr((sizeof(int) == sizeof(*(8 ?
((void *)((long)((lo) > (hi)) * 0l)) : (int *)8))), (lo) > (hi),
false)), "const_true((lo) > (hi))" " is true");})) +
(((typeof(unsigned long))((((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))) - 1) + ((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))))) << (lo) & ((typeof(unsigned
long))((((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long))
- 1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1))) -
1) + ((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long)) -
1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1)))))
>> ((sizeof(unsigned long) * 8) - 1 - (hi)))))) - 1))) &
(((((unsigned long)(((int)sizeof(struct
{_Static_assert(!(__builtin_choose_expr((sizeof(int) == sizeof(*(8 ?
((void *)((long)((lo) > (hi)) * 0l)) : (int *)8))), (lo) > (hi),
false)), "const_true((lo) > (hi))" " is true");})) +
(((typeof(unsigned long))((((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))) - 1) + ((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))))) << (lo) & ((typeof(unsigned
long))((((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long))
- 1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1))) -
1) + ((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long)) -
1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1)))))
>> ((sizeof(unsigned long) * 8) - 1 - (hi)))))) + (1ULL <<
(__builtin_ffsll(((unsigned long)(((int)sizeof(struct
{_Static_assert(!(__builtin_choose_expr((sizeof(int) == sizeof(*(8 ?
((void *)((long)((lo) > (hi)) * 0l)) : (int *)8))), (lo) > (hi),
false)), "const_true((lo) > (hi))" " is true");})) +
(((typeof(unsigned long))((((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))) - 1) + ((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))))) << (lo) & ((typeof(unsigned
long))((((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long))
- 1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1))) -
1) + ((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long)) -
1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1)))))
>> ((sizeof(unsigned long) * 8) - 1 - (hi)))))) - 1))) - 1)) != 0)))
__compiletime_assert_773(); } while (0); }); (typeof(((unsigned
long)(((int)sizeof(struct
{_Static_assert(!(__builtin_choose_expr((sizeof(int) == sizeof(*(8 ?
((void *)((long)((lo) > (hi)) * 0l)) : (int *)8))), (lo) > (hi),
false)), "const_true((lo) > (hi))" " is true");})) +
(((typeof(unsigned long))((((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))) - 1) + ((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))))) << (lo) & ((typeof(unsigned
long))((((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long))
- 1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1))) -
1) + ((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long)) -
1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1)))))
>> ((sizeof(unsigned long) * 8) - 1 - (hi)))))))(((reg) & (((unsigned
long)(((int)sizeof(struct
{_Static_assert(!(__builtin_choose_expr((sizeof(int) == sizeof(*(8 ?
((void *)((long)((lo) > (hi)) * 0l)) : (int *)8))), (lo) > (hi),
false)), "const_true((lo) > (hi))" " is true");})) +
(((typeof(unsigned long))((((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))) - 1) + ((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))))) << (lo) & ((typeof(unsigned
long))((((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long))
- 1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1))) -
1) + ((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long)) -
1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1)))))
>> ((sizeof(unsigned long) * 8) - 1 - (hi))))))) >>
(__builtin_ffsll(((unsigned long)(((int)sizeof(struct
{_Static_assert(!(__builtin_choose_expr((sizeof(int) == sizeof(*(8 ?
((void *)((long)((lo) > (hi)) * 0l)) : (int *)8))), (lo) > (hi),
false)), "const_true((lo) > (hi))" " is true");})) +
(((typeof(unsigned long))((((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))) - 1) + ((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))))) << (lo) & ((typeof(unsigned
long))((((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long))
- 1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1))) -
1) + ((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long)) -
1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1)))))
>> ((sizeof(unsigned long) * 8) - 1 - (hi)))))) - 1)); }); })
new FIELD_GET(GENMASK(hi, lo), reg)
({ __auto_type _mask = ((unsigned long)(((int)sizeof(struct
{_Static_assert(!(__builtin_choose_expr((sizeof(int) == sizeof(*(8 ?
((void *)((long)((lo) > (hi)) * 0l)) : (int *)8))), (lo) > (hi),
false)), "const_true((lo) > (hi))" " is true");})) +
(((typeof(unsigned long))((((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))) - 1) + ((typeof(unsigned long))1 <<
(8*sizeof(typeof(unsigned long)) - 1 - (((typeof(unsigned long))(-1))
< ( typeof(unsigned long))1))))) << (lo) & ((typeof(unsigned
long))((((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long))
- 1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1))) -
1) + ((typeof(unsigned long))1 << (8*sizeof(typeof(unsigned long)) -
1 - (((typeof(unsigned long))(-1)) < ( typeof(unsigned long))1)))))
>> ((sizeof(unsigned long) * 8) - 1 - (hi))))); __auto_type _reg =
reg; ({ do { do { __attribute__((__noreturn__)) extern void
__compiletime_assert_697(void) __attribute__((__error__("FIELD_GET: "
"mask is not constant"))); if (!(!(!__builtin_constant_p(_mask))))
__compiletime_assert_697(); } while (0); do {
__attribute__((__noreturn__)) extern void
__compiletime_assert_698(void) __attribute__((__error__("FIELD_GET: "
"mask is zero or not contiguous"))); if (!(!((!(_mask) || ((_mask) &
((_mask) + ((_mask) & -(_mask)))))))) __compiletime_assert_698(); }
while (0); } while (0); do { __attribute__((__noreturn__)) extern
void __compiletime_assert_699(void)
__attribute__((__error__("FIELD_GET: " "type of reg too small for
mask"))); if (!(!(_mask + 0U + 0UL + 0ULL > ~0ULL >> (64 - 8 * sizeof
(_reg))))) __compiletime_assert_699(); } while (0); ((_reg) &
(_mask)) >> (__builtin_ffsll(_mask) - 1); }); })
David
next prev parent reply other threads:[~2025-12-11 10:51 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-12-09 10:03 [PATCH 0/9] bitfield: tidy up bitfield.h david.laight.linux
2025-12-09 10:03 ` [PATCH 1/9] nfp: Call FIELD_PREP() in NFP_ETH_SET_BIT_CONFIG() wrapper david.laight.linux
2025-12-10 9:29 ` Jakub Kicinski
2025-12-10 10:04 ` David Laight
2025-12-09 10:03 ` [PATCH 2/9] thunderblot: Don't pass a bitfield to FIELD_GET david.laight.linux
2025-12-10 5:56 ` Mika Westerberg
2025-12-10 9:34 ` David Laight
2025-12-10 9:41 ` Mika Westerberg
2025-12-10 10:18 ` David Laight
2025-12-10 18:13 ` Yury Norov
2025-12-10 20:23 ` David Laight
2025-12-09 10:03 ` [PATCH 3/9] bitmap: Use FIELD_PREP() in expansion of FIELD_PREP_WM16() david.laight.linux
2025-12-09 15:46 ` Andy Shevchenko
2025-12-09 18:54 ` David Laight
2025-12-10 19:18 ` Nicolas Frattaroli
2025-12-10 20:59 ` David Laight
2025-12-11 12:50 ` Nicolas Frattaroli
2025-12-11 17:52 ` David Laight
2025-12-09 10:03 ` [PATCH 4/9] bitfield: Copy #define parameters to locals david.laight.linux
2025-12-09 15:51 ` Andy Shevchenko
2025-12-09 19:11 ` David Laight
2025-12-09 21:54 ` Andy Shevchenko
2025-12-10 18:45 ` Yury Norov
2025-12-09 10:03 ` [PATCH 5/9] bitfield: FIELD_MODIFY: Only do a single read/write on the target david.laight.linux
2025-12-09 10:03 ` [PATCH 6/9] bitfield: Update sanity checks david.laight.linux
2025-12-09 10:03 ` [PATCH 7/9] bitfield: Reduce indentation david.laight.linux
2025-12-09 10:03 ` [PATCH 8/9] bitfield: Add comment block for the host/fixed endian functions david.laight.linux
2025-12-09 15:53 ` Andy Shevchenko
2025-12-10 9:23 ` Jakub Kicinski
2025-12-10 10:08 ` David Laight
2025-12-11 5:26 ` Jakub Kicinski
2025-12-09 10:03 ` [PATCH 9/9] bitfield: Update comments for le/be functions david.laight.linux
2025-12-10 18:20 ` [PATCH 0/9] bitfield: tidy up bitfield.h Yury Norov
2025-12-10 22:40 ` David Laight
2025-12-11 10:51 ` David Laight [this message]
-- strict thread matches above, loose matches on Subject: below --
2025-12-08 22:42 david.laight.linux
2025-12-09 7:08 ` Mika Westerberg
2025-12-09 7:49 ` Jakub Kicinski
2025-12-09 9:44 ` David Laight
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20251211105107.305e4828@pumpkin \
--to=david.laight.linux@gmail.com \
--cc=Jonathan.Cameron@huawei.com \
--cc=YehezkelShB@gmail.com \
--cc=alexandre.belloni@bootlin.com \
--cc=andreas.noever@gmail.com \
--cc=andriy.shevchenko@intel.com \
--cc=cmo@melexis.com \
--cc=davem@davemloft.net \
--cc=geert+renesas@glider.be \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=linux@rasmusvillemoes.dk \
--cc=mika.westerberg@linux.intel.com \
--cc=netdev@vger.kernel.org \
--cc=nicolas.frattaroli@collabora.com \
--cc=peterz@infradead.org \
--cc=quic_luoj@quicinc.com \
--cc=richard.genoud@bootlin.com \
--cc=simon.horman@netronome.com \
--cc=yury.norov@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.