Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 87321fdd authored by Paul Burton's avatar Paul Burton Committed by Ralf Baechle
Browse files

MIPS: Implement __arch_bitrev* using bitswap for MIPSr6



Release 6 of the MIPS architecture introduced the bitswap instruction,
which reverses the bits within each byte of a word. Make use of this
instruction to implement the __arch_bitrev* functions, which should be
faster for most MIPSr6 CPUs, reduces code size slightly and allows us to
avoid the lookup table used by the generic implementation, saving 256
bytes in the kernel binary by dropping that.

Signed-off-by: default avatarPaul Burton <paul.burton@imgtec.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/13204/


Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
parent 015aa05f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -2000,6 +2000,7 @@ config CPU_MIPSR2
config CPU_MIPSR6
	bool
	default y if CPU_MIPS32_R6 || CPU_MIPS64_R6
	select HAVE_ARCH_BITREVERSE
	select MIPS_SPRAM

config EVA
+30 −0
Original line number Diff line number Diff line
#ifndef __MIPS_ASM_BITREV_H__
#define __MIPS_ASM_BITREV_H__

#include <linux/swab.h>

static __always_inline __attribute_const__ u32 __arch_bitrev32(u32 x)
{
	u32 ret;

	asm("bitswap	%0, %1" : "=r"(ret) : "r"(__swab32(x)));
	return ret;
}

static __always_inline __attribute_const__ u16 __arch_bitrev16(u16 x)
{
	u16 ret;

	asm("bitswap	%0, %1" : "=r"(ret) : "r"(__swab16(x)));
	return ret;
}

static __always_inline __attribute_const__ u8 __arch_bitrev8(u8 x)
{
	u8 ret;

	asm("bitswap	%0, %1" : "=r"(ret) : "r"(x));
	return ret;
}

#endif /* __MIPS_ASM_BITREV_H__ */