Several parts of the kernel open-code parity calculations using different methods. Add a generic parity32() helper implemented with the same efficient approach as parity8(). Co-developed-by: Yu-Chun Lin <eleanor15x@xxxxxxxxx> Signed-off-by: Yu-Chun Lin <eleanor15x@xxxxxxxxx> Signed-off-by: Kuan-Wei Chiu <visitorckw@xxxxxxxxx> --- include/linux/bitops.h | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/include/linux/bitops.h b/include/linux/bitops.h index c1cb53cf2f0f..fb13dedad7aa 100644 --- a/include/linux/bitops.h +++ b/include/linux/bitops.h @@ -260,6 +260,27 @@ static inline int parity8(u8 val) return (0x6996 >> (val & 0xf)) & 1; } +/** + * parity32 - get the parity of an u32 value + * @value: the value to be examined + * + * Determine the parity of the u32 argument. + * + * Returns: + * 0 for even parity, 1 for odd parity + */ +static inline int parity32(u32 val) +{ + /* + * One explanation of this algorithm: + * https://funloop.org/codex/problem/parity/README.html + */ + val ^= val >> 16; + val ^= val >> 8; + val ^= val >> 4; + return (0x6996 >> (val & 0xf)) & 1; +} + /** * __ffs64 - find first set bit in a 64 bit word * @word: The 64 bit word -- 2.34.1