[PATCH v4 5/8] riscv/runtime-const: Introduce runtime_const_mask_32()

Charlie Jenkins thecharlesjenkins at gmail.com
Mon Jun 22 22:24:56 PDT 2026


On Thu, 30 Apr 2026 09:47:27 +0000, K Prateek Nayak <kprateek.nayak at amd.com> wrote:
> Futex hash computation requires a mask operation with read-only after
> init data that will be converted to a runtime constant in the subsequent
> commit.
> 
> Introduce runtime_const_mask_32 to further optimize the mask operation
> in the futex hash computation hot path. GCC generates a:
> 
>   lui   a0, 0x12346       # upper; +0x800 then >>12 for correct rounding
>   addi  a0, a0, 0x678     # lower 12 bits
>   and   a1, a1, a0        # a1 = a1 & a0
> 
> pattern to tackle arbitrary 32-bit masks and the same was also suggested
> by Claude which is implemented here. The final (__ret & val) operation
> is intentionally placed outside of asm block to allow compilers to
> further optimize it if possible.

If the mask fits in 12 bits, we can nop the lui and the addi and just
patch an "andi" instruction with the 12 bits of the mask. We already do
this with the lui+addi block and nop the lui if val fits in 12 bits. I
would be happy to help draft that optimization. 

But I think the better solution would be to take the power of 2
assumption since that will also benefit arm. We should still only emit
an andi if val fits in 12 bits, but if it doesn't we can patch in
shifts:

slli    a0,a0,x
srli    a0,a0,x

Where x is the constant (arch_size - _futex_shift - 1)

- Charlie

-- 
Charlie Jenkins <thecharlesjenkins at gmail.com>



More information about the linux-arm-kernel mailing list