diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2023-02-01 12:44:17 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2023-02-06 16:19:35 -0300 |
commit | 25788431c0f5264c4830415de0cdd4d9926cbad9 (patch) | |
tree | 5597dd9a3d673451af029bc89f99c50d18e42baf /sysdeps/riscv/string-fza.h | |
parent | c505eb828e2f7415397ae445cfb89661d78f291e (diff) | |
download | glibc-25788431c0f5264c4830415de0cdd4d9926cbad9.tar glibc-25788431c0f5264c4830415de0cdd4d9926cbad9.tar.gz glibc-25788431c0f5264c4830415de0cdd4d9926cbad9.tar.bz2 glibc-25788431c0f5264c4830415de0cdd4d9926cbad9.zip |
riscv: Add string-fza.h and string-fzi.h
It uses the bitmanip extension to optimize index_fist and index_last
with clz/ctz (using generic implementation that routes to compiler
builtin) and orc.b to check null bytes.
Checked the string test on riscv64 user mode.
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Diffstat (limited to 'sysdeps/riscv/string-fza.h')
-rw-r--r-- | sysdeps/riscv/string-fza.h | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/sysdeps/riscv/string-fza.h b/sysdeps/riscv/string-fza.h new file mode 100644 index 0000000000..4429653a00 --- /dev/null +++ b/sysdeps/riscv/string-fza.h @@ -0,0 +1,69 @@ +/* Zero byte detection; basics. RISCV version. + Copyright (C) 2023 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#ifndef _RISCV_STRING_FZA_H +#define _RISCV_STRING_FZA_H 1 + +#ifdef __riscv_zbb +/* With bitmap extension we can use orc.b to find all zero bytes. */ +# include <string-misc.h> +# include <string-optype.h> + +/* The functions return a byte mask. */ +typedef op_t find_t; + +/* This function returns 0xff for each byte that is zero in X. */ +static __always_inline find_t +find_zero_all (op_t x) +{ + find_t r; + asm ("orc.b %0, %1" : "=r" (r) : "r" (x)); + return ~r; +} + +/* This function returns 0xff for each byte that is equal between X1 and + X2. */ +static __always_inline find_t +find_eq_all (op_t x1, op_t x2) +{ + return find_zero_all (x1 ^ x2); +} + +/* Identify zero bytes in X1 or equality between X1 and X2. */ +static __always_inline find_t +find_zero_eq_all (op_t x1, op_t x2) +{ + return find_zero_all (x1) | find_eq_all (x1, x2); +} + +/* Identify zero bytes in X1 or inequality between X1 and X2. */ +static __always_inline find_t +find_zero_ne_all (op_t x1, op_t x2) +{ + return find_zero_all (x1) | ~find_eq_all (x1, x2); +} + +/* Define the "inexact" versions in terms of the exact versions. */ +# define find_zero_low find_zero_all +# define find_eq_low find_eq_all +# define find_zero_eq_low find_zero_eq_all +#else +#include <sysdeps/generic/string-fza.h> +#endif + +#endif /* _RISCV_STRING_FZA_H */ |