From: Charlie Jenkins <charlie@rivosinc.com>
To: Xiao Wang <xiao.w.wang@intel.com>
Cc: paul.walmsley@sifive.com, palmer@dabbelt.com,
aou@eecs.berkeley.edu, arnd@arndb.de, geert@linux-m68k.org,
haicheng.li@intel.com, linux-arch@vger.kernel.org,
linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] riscv: Avoid code duplication with generic bitops implementation
Date: Thu, 30 Nov 2023 21:44:20 -0800 [thread overview]
Message-ID: <ZWlytChnvmXFJlb4@ghost> (raw)
In-Reply-To: <20231112094421.4014931-1-xiao.w.wang@intel.com>
On Sun, Nov 12, 2023 at 05:44:21PM +0800, Xiao Wang wrote:
> There's code duplication between the fallback implementation for bitops
> __ffs/__fls/ffs/fls API and the generic C implementation in
> include/asm-generic/bitops/. To avoid this duplication, this patch renames
> the generic C implementation by adding a "generic_" prefix to them, then we
> can use these generic APIs as fallback.
>
> Suggested-by: Geert Uytterhoeven <geert@linux-m68k.org>
> Signed-off-by: Xiao Wang <xiao.w.wang@intel.com>
> ---
> arch/riscv/include/asm/bitops.h | 138 +++++------------------------
> include/asm-generic/bitops/__ffs.h | 8 +-
> include/asm-generic/bitops/__fls.h | 8 +-
> include/asm-generic/bitops/ffs.h | 8 +-
> include/asm-generic/bitops/fls.h | 8 +-
> 5 files changed, 48 insertions(+), 122 deletions(-)
>
> diff --git a/arch/riscv/include/asm/bitops.h b/arch/riscv/include/asm/bitops.h
> index f7c167646460..23f7c122b151 100644
> --- a/arch/riscv/include/asm/bitops.h
> +++ b/arch/riscv/include/asm/bitops.h
> @@ -22,6 +22,16 @@
> #include <asm-generic/bitops/fls.h>
>
> #else
> +#define __HAVE_ARCH___FFS
> +#define __HAVE_ARCH___FLS
> +#define __HAVE_ARCH_FFS
> +#define __HAVE_ARCH_FLS
> +
> +#include <asm-generic/bitops/__ffs.h>
> +#include <asm-generic/bitops/__fls.h>
> +#include <asm-generic/bitops/ffs.h>
> +#include <asm-generic/bitops/fls.h>
> +
> #include <asm/alternative-macros.h>
> #include <asm/hwcap.h>
>
> @@ -37,8 +47,6 @@
>
> static __always_inline unsigned long variable__ffs(unsigned long word)
> {
> - int num;
> -
> asm_volatile_goto(ALTERNATIVE("j %l[legacy]", "nop", 0,
> RISCV_ISA_EXT_ZBB, 1)
> : : : : legacy);
> @@ -52,32 +60,7 @@ static __always_inline unsigned long variable__ffs(unsigned long word)
> return word;
>
> legacy:
> - num = 0;
> -#if BITS_PER_LONG == 64
> - if ((word & 0xffffffff) == 0) {
> - num += 32;
> - word >>= 32;
> - }
> -#endif
> - if ((word & 0xffff) == 0) {
> - num += 16;
> - word >>= 16;
> - }
> - if ((word & 0xff) == 0) {
> - num += 8;
> - word >>= 8;
> - }
> - if ((word & 0xf) == 0) {
> - num += 4;
> - word >>= 4;
> - }
> - if ((word & 0x3) == 0) {
> - num += 2;
> - word >>= 2;
> - }
> - if ((word & 0x1) == 0)
> - num += 1;
> - return num;
> + return generic___ffs(word);
> }
>
> /**
> @@ -93,8 +76,6 @@ static __always_inline unsigned long variable__ffs(unsigned long word)
>
> static __always_inline unsigned long variable__fls(unsigned long word)
> {
> - int num;
> -
> asm_volatile_goto(ALTERNATIVE("j %l[legacy]", "nop", 0,
> RISCV_ISA_EXT_ZBB, 1)
> : : : : legacy);
> @@ -108,32 +89,7 @@ static __always_inline unsigned long variable__fls(unsigned long word)
> return BITS_PER_LONG - 1 - word;
>
> legacy:
> - num = BITS_PER_LONG - 1;
> -#if BITS_PER_LONG == 64
> - if (!(word & (~0ul << 32))) {
> - num -= 32;
> - word <<= 32;
> - }
> -#endif
> - if (!(word & (~0ul << (BITS_PER_LONG - 16)))) {
> - num -= 16;
> - word <<= 16;
> - }
> - if (!(word & (~0ul << (BITS_PER_LONG - 8)))) {
> - num -= 8;
> - word <<= 8;
> - }
> - if (!(word & (~0ul << (BITS_PER_LONG - 4)))) {
> - num -= 4;
> - word <<= 4;
> - }
> - if (!(word & (~0ul << (BITS_PER_LONG - 2)))) {
> - num -= 2;
> - word <<= 2;
> - }
> - if (!(word & (~0ul << (BITS_PER_LONG - 1))))
> - num -= 1;
> - return num;
> + return generic___fls(word);
> }
>
> /**
> @@ -149,46 +105,23 @@ static __always_inline unsigned long variable__fls(unsigned long word)
>
> static __always_inline int variable_ffs(int x)
> {
> - int r;
> -
> - if (!x)
> - return 0;
> -
> asm_volatile_goto(ALTERNATIVE("j %l[legacy]", "nop", 0,
> RISCV_ISA_EXT_ZBB, 1)
> : : : : legacy);
>
> + if (!x)
> + return 0;
> +
> asm volatile (".option push\n"
> ".option arch,+zbb\n"
> CTZW "%0, %1\n"
> ".option pop\n"
> - : "=r" (r) : "r" (x) :);
> + : "=r" (x) : "r" (x) :);
>
> - return r + 1;
> + return x + 1;
>
> legacy:
> - r = 1;
> - if (!(x & 0xffff)) {
> - x >>= 16;
> - r += 16;
> - }
> - if (!(x & 0xff)) {
> - x >>= 8;
> - r += 8;
> - }
> - if (!(x & 0xf)) {
> - x >>= 4;
> - r += 4;
> - }
> - if (!(x & 3)) {
> - x >>= 2;
> - r += 2;
> - }
> - if (!(x & 1)) {
> - x >>= 1;
> - r += 1;
> - }
> - return r;
> + return generic_ffs(x);
> }
>
> /**
> @@ -204,46 +137,23 @@ static __always_inline int variable_ffs(int x)
>
> static __always_inline int variable_fls(unsigned int x)
> {
> - int r;
> -
> - if (!x)
> - return 0;
> -
> asm_volatile_goto(ALTERNATIVE("j %l[legacy]", "nop", 0,
> RISCV_ISA_EXT_ZBB, 1)
> : : : : legacy);
>
> + if (!x)
> + return 0;
> +
> asm volatile (".option push\n"
> ".option arch,+zbb\n"
> CLZW "%0, %1\n"
> ".option pop\n"
> - : "=r" (r) : "r" (x) :);
> + : "=r" (x) : "r" (x) :);
>
> - return 32 - r;
> + return 32 - x;
>
> legacy:
> - r = 32;
> - if (!(x & 0xffff0000u)) {
> - x <<= 16;
> - r -= 16;
> - }
> - if (!(x & 0xff000000u)) {
> - x <<= 8;
> - r -= 8;
> - }
> - if (!(x & 0xf0000000u)) {
> - x <<= 4;
> - r -= 4;
> - }
> - if (!(x & 0xc0000000u)) {
> - x <<= 2;
> - r -= 2;
> - }
> - if (!(x & 0x80000000u)) {
> - x <<= 1;
> - r -= 1;
> - }
> - return r;
> + return generic_fls(x);
> }
>
> /**
> diff --git a/include/asm-generic/bitops/__ffs.h b/include/asm-generic/bitops/__ffs.h
> index 39e56e1c7203..446fea6dda78 100644
> --- a/include/asm-generic/bitops/__ffs.h
> +++ b/include/asm-generic/bitops/__ffs.h
> @@ -5,12 +5,12 @@
> #include <asm/types.h>
>
> /**
> - * __ffs - find first bit in word.
> + * generic___ffs - find first bit in word.
> * @word: The word to search
> *
> * Undefined if no bit exists, so code should check against 0 first.
> */
> -static __always_inline unsigned long __ffs(unsigned long word)
> +static __always_inline unsigned long generic___ffs(unsigned long word)
> {
> int num = 0;
>
> @@ -41,4 +41,8 @@ static __always_inline unsigned long __ffs(unsigned long word)
> return num;
> }
>
> +#ifndef __HAVE_ARCH___FFS
> +#define __ffs(word) generic___ffs(word)
> +#endif
> +
> #endif /* _ASM_GENERIC_BITOPS___FFS_H_ */
> diff --git a/include/asm-generic/bitops/__fls.h b/include/asm-generic/bitops/__fls.h
> index 03f721a8a2b1..54ccccf96e21 100644
> --- a/include/asm-generic/bitops/__fls.h
> +++ b/include/asm-generic/bitops/__fls.h
> @@ -5,12 +5,12 @@
> #include <asm/types.h>
>
> /**
> - * __fls - find last (most-significant) set bit in a long word
> + * generic___fls - find last (most-significant) set bit in a long word
> * @word: the word to search
> *
> * Undefined if no set bit exists, so code should check against 0 first.
> */
> -static __always_inline unsigned long __fls(unsigned long word)
> +static __always_inline unsigned long generic___fls(unsigned long word)
> {
> int num = BITS_PER_LONG - 1;
>
> @@ -41,4 +41,8 @@ static __always_inline unsigned long __fls(unsigned long word)
> return num;
> }
>
> +#ifndef __HAVE_ARCH___FLS
> +#define __fls(word) generic___fls(word)
> +#endif
> +
> #endif /* _ASM_GENERIC_BITOPS___FLS_H_ */
> diff --git a/include/asm-generic/bitops/ffs.h b/include/asm-generic/bitops/ffs.h
> index 323fd5d6ae26..4c43f242daeb 100644
> --- a/include/asm-generic/bitops/ffs.h
> +++ b/include/asm-generic/bitops/ffs.h
> @@ -3,14 +3,14 @@
> #define _ASM_GENERIC_BITOPS_FFS_H_
>
> /**
> - * ffs - find first bit set
> + * generic_ffs - find first bit set
> * @x: the word to search
> *
> * This is defined the same way as
> * the libc and compiler builtin ffs routines, therefore
> * differs in spirit from ffz (man ffs).
> */
> -static inline int ffs(int x)
> +static inline int generic_ffs(int x)
> {
> int r = 1;
>
> @@ -39,4 +39,8 @@ static inline int ffs(int x)
> return r;
> }
>
> +#ifndef __HAVE_ARCH_FFS
> +#define ffs(x) generic_ffs(x)
> +#endif
> +
> #endif /* _ASM_GENERIC_BITOPS_FFS_H_ */
> diff --git a/include/asm-generic/bitops/fls.h b/include/asm-generic/bitops/fls.h
> index b168bb10e1be..26f3ce1dd6e4 100644
> --- a/include/asm-generic/bitops/fls.h
> +++ b/include/asm-generic/bitops/fls.h
> @@ -3,14 +3,14 @@
> #define _ASM_GENERIC_BITOPS_FLS_H_
>
> /**
> - * fls - find last (most-significant) bit set
> + * generic_fls - find last (most-significant) bit set
> * @x: the word to search
> *
> * This is defined the same way as ffs.
> * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
> */
>
> -static __always_inline int fls(unsigned int x)
> +static __always_inline int generic_fls(unsigned int x)
> {
> int r = 32;
>
> @@ -39,4 +39,8 @@ static __always_inline int fls(unsigned int x)
> return r;
> }
>
> +#ifndef __HAVE_ARCH_FLS
> +#define fls(x) generic_fls(x)
> +#endif
> +
> #endif /* _ASM_GENERIC_BITOPS_FLS_H_ */
> --
> 2.25.1
>
>
> _______________________________________________
> linux-riscv mailing list
> linux-riscv@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-riscv
Apologies I missed this, looks great.
Reviewed-by: Charlie Jenkins <charlie@rivosinc.com>
WARNING: multiple messages have this Message-ID (diff)
From: Charlie Jenkins <charlie@rivosinc.com>
To: Xiao Wang <xiao.w.wang@intel.com>
Cc: paul.walmsley@sifive.com, palmer@dabbelt.com,
aou@eecs.berkeley.edu, arnd@arndb.de, geert@linux-m68k.org,
haicheng.li@intel.com, linux-arch@vger.kernel.org,
linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] riscv: Avoid code duplication with generic bitops implementation
Date: Thu, 30 Nov 2023 21:44:20 -0800 [thread overview]
Message-ID: <ZWlytChnvmXFJlb4@ghost> (raw)
In-Reply-To: <20231112094421.4014931-1-xiao.w.wang@intel.com>
On Sun, Nov 12, 2023 at 05:44:21PM +0800, Xiao Wang wrote:
> There's code duplication between the fallback implementation for bitops
> __ffs/__fls/ffs/fls API and the generic C implementation in
> include/asm-generic/bitops/. To avoid this duplication, this patch renames
> the generic C implementation by adding a "generic_" prefix to them, then we
> can use these generic APIs as fallback.
>
> Suggested-by: Geert Uytterhoeven <geert@linux-m68k.org>
> Signed-off-by: Xiao Wang <xiao.w.wang@intel.com>
> ---
> arch/riscv/include/asm/bitops.h | 138 +++++------------------------
> include/asm-generic/bitops/__ffs.h | 8 +-
> include/asm-generic/bitops/__fls.h | 8 +-
> include/asm-generic/bitops/ffs.h | 8 +-
> include/asm-generic/bitops/fls.h | 8 +-
> 5 files changed, 48 insertions(+), 122 deletions(-)
>
> diff --git a/arch/riscv/include/asm/bitops.h b/arch/riscv/include/asm/bitops.h
> index f7c167646460..23f7c122b151 100644
> --- a/arch/riscv/include/asm/bitops.h
> +++ b/arch/riscv/include/asm/bitops.h
> @@ -22,6 +22,16 @@
> #include <asm-generic/bitops/fls.h>
>
> #else
> +#define __HAVE_ARCH___FFS
> +#define __HAVE_ARCH___FLS
> +#define __HAVE_ARCH_FFS
> +#define __HAVE_ARCH_FLS
> +
> +#include <asm-generic/bitops/__ffs.h>
> +#include <asm-generic/bitops/__fls.h>
> +#include <asm-generic/bitops/ffs.h>
> +#include <asm-generic/bitops/fls.h>
> +
> #include <asm/alternative-macros.h>
> #include <asm/hwcap.h>
>
> @@ -37,8 +47,6 @@
>
> static __always_inline unsigned long variable__ffs(unsigned long word)
> {
> - int num;
> -
> asm_volatile_goto(ALTERNATIVE("j %l[legacy]", "nop", 0,
> RISCV_ISA_EXT_ZBB, 1)
> : : : : legacy);
> @@ -52,32 +60,7 @@ static __always_inline unsigned long variable__ffs(unsigned long word)
> return word;
>
> legacy:
> - num = 0;
> -#if BITS_PER_LONG == 64
> - if ((word & 0xffffffff) == 0) {
> - num += 32;
> - word >>= 32;
> - }
> -#endif
> - if ((word & 0xffff) == 0) {
> - num += 16;
> - word >>= 16;
> - }
> - if ((word & 0xff) == 0) {
> - num += 8;
> - word >>= 8;
> - }
> - if ((word & 0xf) == 0) {
> - num += 4;
> - word >>= 4;
> - }
> - if ((word & 0x3) == 0) {
> - num += 2;
> - word >>= 2;
> - }
> - if ((word & 0x1) == 0)
> - num += 1;
> - return num;
> + return generic___ffs(word);
> }
>
> /**
> @@ -93,8 +76,6 @@ static __always_inline unsigned long variable__ffs(unsigned long word)
>
> static __always_inline unsigned long variable__fls(unsigned long word)
> {
> - int num;
> -
> asm_volatile_goto(ALTERNATIVE("j %l[legacy]", "nop", 0,
> RISCV_ISA_EXT_ZBB, 1)
> : : : : legacy);
> @@ -108,32 +89,7 @@ static __always_inline unsigned long variable__fls(unsigned long word)
> return BITS_PER_LONG - 1 - word;
>
> legacy:
> - num = BITS_PER_LONG - 1;
> -#if BITS_PER_LONG == 64
> - if (!(word & (~0ul << 32))) {
> - num -= 32;
> - word <<= 32;
> - }
> -#endif
> - if (!(word & (~0ul << (BITS_PER_LONG - 16)))) {
> - num -= 16;
> - word <<= 16;
> - }
> - if (!(word & (~0ul << (BITS_PER_LONG - 8)))) {
> - num -= 8;
> - word <<= 8;
> - }
> - if (!(word & (~0ul << (BITS_PER_LONG - 4)))) {
> - num -= 4;
> - word <<= 4;
> - }
> - if (!(word & (~0ul << (BITS_PER_LONG - 2)))) {
> - num -= 2;
> - word <<= 2;
> - }
> - if (!(word & (~0ul << (BITS_PER_LONG - 1))))
> - num -= 1;
> - return num;
> + return generic___fls(word);
> }
>
> /**
> @@ -149,46 +105,23 @@ static __always_inline unsigned long variable__fls(unsigned long word)
>
> static __always_inline int variable_ffs(int x)
> {
> - int r;
> -
> - if (!x)
> - return 0;
> -
> asm_volatile_goto(ALTERNATIVE("j %l[legacy]", "nop", 0,
> RISCV_ISA_EXT_ZBB, 1)
> : : : : legacy);
>
> + if (!x)
> + return 0;
> +
> asm volatile (".option push\n"
> ".option arch,+zbb\n"
> CTZW "%0, %1\n"
> ".option pop\n"
> - : "=r" (r) : "r" (x) :);
> + : "=r" (x) : "r" (x) :);
>
> - return r + 1;
> + return x + 1;
>
> legacy:
> - r = 1;
> - if (!(x & 0xffff)) {
> - x >>= 16;
> - r += 16;
> - }
> - if (!(x & 0xff)) {
> - x >>= 8;
> - r += 8;
> - }
> - if (!(x & 0xf)) {
> - x >>= 4;
> - r += 4;
> - }
> - if (!(x & 3)) {
> - x >>= 2;
> - r += 2;
> - }
> - if (!(x & 1)) {
> - x >>= 1;
> - r += 1;
> - }
> - return r;
> + return generic_ffs(x);
> }
>
> /**
> @@ -204,46 +137,23 @@ static __always_inline int variable_ffs(int x)
>
> static __always_inline int variable_fls(unsigned int x)
> {
> - int r;
> -
> - if (!x)
> - return 0;
> -
> asm_volatile_goto(ALTERNATIVE("j %l[legacy]", "nop", 0,
> RISCV_ISA_EXT_ZBB, 1)
> : : : : legacy);
>
> + if (!x)
> + return 0;
> +
> asm volatile (".option push\n"
> ".option arch,+zbb\n"
> CLZW "%0, %1\n"
> ".option pop\n"
> - : "=r" (r) : "r" (x) :);
> + : "=r" (x) : "r" (x) :);
>
> - return 32 - r;
> + return 32 - x;
>
> legacy:
> - r = 32;
> - if (!(x & 0xffff0000u)) {
> - x <<= 16;
> - r -= 16;
> - }
> - if (!(x & 0xff000000u)) {
> - x <<= 8;
> - r -= 8;
> - }
> - if (!(x & 0xf0000000u)) {
> - x <<= 4;
> - r -= 4;
> - }
> - if (!(x & 0xc0000000u)) {
> - x <<= 2;
> - r -= 2;
> - }
> - if (!(x & 0x80000000u)) {
> - x <<= 1;
> - r -= 1;
> - }
> - return r;
> + return generic_fls(x);
> }
>
> /**
> diff --git a/include/asm-generic/bitops/__ffs.h b/include/asm-generic/bitops/__ffs.h
> index 39e56e1c7203..446fea6dda78 100644
> --- a/include/asm-generic/bitops/__ffs.h
> +++ b/include/asm-generic/bitops/__ffs.h
> @@ -5,12 +5,12 @@
> #include <asm/types.h>
>
> /**
> - * __ffs - find first bit in word.
> + * generic___ffs - find first bit in word.
> * @word: The word to search
> *
> * Undefined if no bit exists, so code should check against 0 first.
> */
> -static __always_inline unsigned long __ffs(unsigned long word)
> +static __always_inline unsigned long generic___ffs(unsigned long word)
> {
> int num = 0;
>
> @@ -41,4 +41,8 @@ static __always_inline unsigned long __ffs(unsigned long word)
> return num;
> }
>
> +#ifndef __HAVE_ARCH___FFS
> +#define __ffs(word) generic___ffs(word)
> +#endif
> +
> #endif /* _ASM_GENERIC_BITOPS___FFS_H_ */
> diff --git a/include/asm-generic/bitops/__fls.h b/include/asm-generic/bitops/__fls.h
> index 03f721a8a2b1..54ccccf96e21 100644
> --- a/include/asm-generic/bitops/__fls.h
> +++ b/include/asm-generic/bitops/__fls.h
> @@ -5,12 +5,12 @@
> #include <asm/types.h>
>
> /**
> - * __fls - find last (most-significant) set bit in a long word
> + * generic___fls - find last (most-significant) set bit in a long word
> * @word: the word to search
> *
> * Undefined if no set bit exists, so code should check against 0 first.
> */
> -static __always_inline unsigned long __fls(unsigned long word)
> +static __always_inline unsigned long generic___fls(unsigned long word)
> {
> int num = BITS_PER_LONG - 1;
>
> @@ -41,4 +41,8 @@ static __always_inline unsigned long __fls(unsigned long word)
> return num;
> }
>
> +#ifndef __HAVE_ARCH___FLS
> +#define __fls(word) generic___fls(word)
> +#endif
> +
> #endif /* _ASM_GENERIC_BITOPS___FLS_H_ */
> diff --git a/include/asm-generic/bitops/ffs.h b/include/asm-generic/bitops/ffs.h
> index 323fd5d6ae26..4c43f242daeb 100644
> --- a/include/asm-generic/bitops/ffs.h
> +++ b/include/asm-generic/bitops/ffs.h
> @@ -3,14 +3,14 @@
> #define _ASM_GENERIC_BITOPS_FFS_H_
>
> /**
> - * ffs - find first bit set
> + * generic_ffs - find first bit set
> * @x: the word to search
> *
> * This is defined the same way as
> * the libc and compiler builtin ffs routines, therefore
> * differs in spirit from ffz (man ffs).
> */
> -static inline int ffs(int x)
> +static inline int generic_ffs(int x)
> {
> int r = 1;
>
> @@ -39,4 +39,8 @@ static inline int ffs(int x)
> return r;
> }
>
> +#ifndef __HAVE_ARCH_FFS
> +#define ffs(x) generic_ffs(x)
> +#endif
> +
> #endif /* _ASM_GENERIC_BITOPS_FFS_H_ */
> diff --git a/include/asm-generic/bitops/fls.h b/include/asm-generic/bitops/fls.h
> index b168bb10e1be..26f3ce1dd6e4 100644
> --- a/include/asm-generic/bitops/fls.h
> +++ b/include/asm-generic/bitops/fls.h
> @@ -3,14 +3,14 @@
> #define _ASM_GENERIC_BITOPS_FLS_H_
>
> /**
> - * fls - find last (most-significant) bit set
> + * generic_fls - find last (most-significant) bit set
> * @x: the word to search
> *
> * This is defined the same way as ffs.
> * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
> */
>
> -static __always_inline int fls(unsigned int x)
> +static __always_inline int generic_fls(unsigned int x)
> {
> int r = 32;
>
> @@ -39,4 +39,8 @@ static __always_inline int fls(unsigned int x)
> return r;
> }
>
> +#ifndef __HAVE_ARCH_FLS
> +#define fls(x) generic_fls(x)
> +#endif
> +
> #endif /* _ASM_GENERIC_BITOPS_FLS_H_ */
> --
> 2.25.1
>
>
> _______________________________________________
> linux-riscv mailing list
> linux-riscv@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-riscv
Apologies I missed this, looks great.
Reviewed-by: Charlie Jenkins <charlie@rivosinc.com>
_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv
next prev parent reply other threads:[~2023-12-01 5:44 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-11-12 9:44 [PATCH] riscv: Avoid code duplication with generic bitops implementation Xiao Wang
2023-11-12 9:44 ` Xiao Wang
2023-12-01 5:44 ` Charlie Jenkins [this message]
2023-12-01 5:44 ` Charlie Jenkins
2024-01-25 21:30 ` patchwork-bot+linux-riscv
2024-01-25 21:30 ` patchwork-bot+linux-riscv
-- strict thread matches above, loose matches on Subject: below --
2023-11-12 23:14 kernel test robot
2023-11-13 0:54 ` Liu, Yujie
2023-12-01 9:57 kernel test robot
2023-12-04 2:39 ` Liu, Yujie
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=ZWlytChnvmXFJlb4@ghost \
--to=charlie@rivosinc.com \
--cc=aou@eecs.berkeley.edu \
--cc=arnd@arndb.de \
--cc=geert@linux-m68k.org \
--cc=haicheng.li@intel.com \
--cc=linux-arch@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-riscv@lists.infradead.org \
--cc=palmer@dabbelt.com \
--cc=paul.walmsley@sifive.com \
--cc=xiao.w.wang@intel.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.