From 3d6fcf1bd7f462d333c36a14efc0e03f2fdd3f9e Mon Sep 17 00:00:00 2001 From: Christoph Müllner Date: Wed, 23 Aug 2023 07:46:28 +0200 Subject: riscv: Add support for XTheadBb in string-fz[a,i].h MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit XTheadBb has similar instructions like Zbb, which allow optimized string processing: * th.ff0: find-first zero is a CLZ instruction. * th.tstnbz: Similar like orc.b, but with a bit-inverted result. The instructions are documented here: https://github.com/T-head-Semi/thead-extension-spec/tree/master/xtheadbb These instructions can be found in the T-Head C906 and the C910. Tested with the string tests. Signed-off-by: Christoph Müllner Reviewed-by: Adhemerval Zanella --- sysdeps/riscv/string-fza.h | 7 ++++++- sysdeps/riscv/string-fzi.h | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/sysdeps/riscv/string-fza.h b/sysdeps/riscv/string-fza.h index 4429653a00..4958d5d151 100644 --- a/sysdeps/riscv/string-fza.h +++ b/sysdeps/riscv/string-fza.h @@ -19,7 +19,7 @@ #ifndef _RISCV_STRING_FZA_H #define _RISCV_STRING_FZA_H 1 -#ifdef __riscv_zbb +#if defined __riscv_zbb || defined __riscv_xtheadbb /* With bitmap extension we can use orc.b to find all zero bytes. */ # include # include @@ -32,8 +32,13 @@ static __always_inline find_t find_zero_all (op_t x) { find_t r; +#ifdef __riscv_xtheadbb + asm ("th.tstnbz %0, %1" : "=r" (r) : "r" (x)); + return r; +#else asm ("orc.b %0, %1" : "=r" (r) : "r" (x)); return ~r; +#endif } /* This function returns 0xff for each byte that is equal between X1 and diff --git a/sysdeps/riscv/string-fzi.h b/sysdeps/riscv/string-fzi.h index 8f56c378ff..45d6367a10 100644 --- a/sysdeps/riscv/string-fzi.h +++ b/sysdeps/riscv/string-fzi.h @@ -19,7 +19,7 @@ #ifndef _STRING_RISCV_FZI_H #define _STRING_RISCV_FZI_H 1 -#ifdef __riscv_zbb +#if defined __riscv_zbb || defined __riscv_xtheadbb # include #else /* Without bitmap clz/ctz extensions, it is faster to direct test the bits -- cgit 1.4.1