Re: [PATCH 2/2] uapi: Refactor __GENMASK_ULL() for speed-up

From: David Laight
Date: Tue Feb 11 2025 - 17:30:56 EST


On Wed, 12 Feb 2025 00:24:12 +0800
I Hsin Cheng <richard120310@xxxxxxxxx> wrote:

> The calculation of "((~_ULL(0)) - (_ULL(1) << (l)) + 1)" is to generate
> a bitmask with "l" trailing zeroes, which is equivalent to
> "(~_ULL(0) << (l))".

Yes, and if you look through the commit history you'll see it was changed
to avoid a compiler warning about the shift losing significant bits.
So you are just reverting that change and the compiler warnings will
reappear.

For non-constants I suspect that (2ul << hi) - (1ul << lo) is the
best answer.
But the compiler (clang with some options?) will still complain
for constants when trying to set the high bit.

That version also doesn't need BITS_PER_[U]LONG.
While that is valid for C, the _ULL() are there for the assembler
(when they are no-ops) so there is no way asm copies can be right
for both GENMASK() ans GENMASK_ULL().

David