Message ID | 20220902203940.2385967-17-adhemerval.zanella@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | [01/17] Parameterize op_t from memcopy.h | expand |
On 9/2/22 3:39 PM, Adhemerval Zanella via Libc-alpha wrote: > From: Richard Henderson <rth@twiddle.net> > > While ppc has the more important string functions in assembly, > there are still a few generic routines used. > > Use the Power 6 CMPB insn for testing of zeros. > > Checked on powerpc64le-linux-gnu. > --- > sysdeps/powerpc/string-fza.h | 70 ++++++++++++++++++++++++++++++++++++ > 1 file changed, 70 insertions(+) > create mode 100644 sysdeps/powerpc/string-fza.h > > diff --git a/sysdeps/powerpc/string-fza.h b/sysdeps/powerpc/string-fza.h > new file mode 100644 > index 0000000000..5f7e9c5cbe > --- /dev/null > +++ b/sysdeps/powerpc/string-fza.h > @@ -0,0 +1,70 @@ > +/* Zero byte detection; basics. PowerPC version. > + Copyright (C) 2022 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 POWERPC_STRING_FZA_H > +#define POWERPC_STRING_FZA_H 1 > + > +/* PowerISA 2.03 (POWER6) provides cmpb instruction. */ Should this read "PowerISA 2.05"? cmpb is listed as implemented from v2.05 in ISA 3.1. > +#ifdef _ARCH_PWR6 > +# include <string-optype.h> > + > +/* This function returns 0xff for each byte that is > + equal between X1 and X2. */ > + > +static inline op_t > +find_eq_all (op_t x1, op_t x2) > +{ > + op_t ret; > + asm ("cmpb %0,%1,%2" : "=r"(ret) : "r"(x1), "r"(x2)); Is it possible to use the gcc builtin __builtin_cmpb? Otherwise, LGTM. > + return ret; > +} > + > +/* This function returns 0xff for each byte that is zero in X. */ > + > +static inline op_t > +find_zero_all (op_t x) > +{ > + return find_eq_all (x, 0); > +} > + > +/* Identify zero bytes in X1 or equality between X1 and X2. */ > + > +static inline op_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 inline op_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 > +# define find_zero_ne_low find_zero_ne_all > +#else > +# include <sysdeps/generic/string-fza.h> > +#endif /* _ARCH_PWR6 */ > + > +#endif /* STRING_FZA_H *
On 06/09/22 11:48, Paul E Murphy wrote: > > > On 9/2/22 3:39 PM, Adhemerval Zanella via Libc-alpha wrote: >> From: Richard Henderson <rth@twiddle.net> >> >> While ppc has the more important string functions in assembly, >> there are still a few generic routines used. >> >> Use the Power 6 CMPB insn for testing of zeros. >> >> Checked on powerpc64le-linux-gnu. >> --- >> sysdeps/powerpc/string-fza.h | 70 ++++++++++++++++++++++++++++++++++++ >> 1 file changed, 70 insertions(+) >> create mode 100644 sysdeps/powerpc/string-fza.h >> >> diff --git a/sysdeps/powerpc/string-fza.h b/sysdeps/powerpc/string-fza.h >> new file mode 100644 >> index 0000000000..5f7e9c5cbe >> --- /dev/null >> +++ b/sysdeps/powerpc/string-fza.h >> @@ -0,0 +1,70 @@ >> +/* Zero byte detection; basics. PowerPC version. >> + Copyright (C) 2022 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 POWERPC_STRING_FZA_H >> +#define POWERPC_STRING_FZA_H 1 >> + >> +/* PowerISA 2.03 (POWER6) provides cmpb instruction. */ > > Should this read "PowerISA 2.05"? cmpb is listed as implemented from v2.05 in ISA 3.1. Yes, it should be 2.05 indeed. > >> +#ifdef _ARCH_PWR6 >> +# include <string-optype.h> >> + >> +/* This function returns 0xff for each byte that is >> + equal between X1 and X2. */ >> + >> +static inline op_t >> +find_eq_all (op_t x1, op_t x2) >> +{ >> + op_t ret; >> + asm ("cmpb %0,%1,%2" : "=r"(ret) : "r"(x1), "r"(x2)); > > Is it possible to use the gcc builtin __builtin_cmpb? Unfortunately __builtin_cmpb is only supported on GCC 8+. > > Otherwise, LGTM. >
diff --git a/sysdeps/powerpc/string-fza.h b/sysdeps/powerpc/string-fza.h new file mode 100644 index 0000000000..5f7e9c5cbe --- /dev/null +++ b/sysdeps/powerpc/string-fza.h @@ -0,0 +1,70 @@ +/* Zero byte detection; basics. PowerPC version. + Copyright (C) 2022 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 POWERPC_STRING_FZA_H +#define POWERPC_STRING_FZA_H 1 + +/* PowerISA 2.03 (POWER6) provides cmpb instruction. */ +#ifdef _ARCH_PWR6 +# include <string-optype.h> + +/* This function returns 0xff for each byte that is + equal between X1 and X2. */ + +static inline op_t +find_eq_all (op_t x1, op_t x2) +{ + op_t ret; + asm ("cmpb %0,%1,%2" : "=r"(ret) : "r"(x1), "r"(x2)); + return ret; +} + +/* This function returns 0xff for each byte that is zero in X. */ + +static inline op_t +find_zero_all (op_t x) +{ + return find_eq_all (x, 0); +} + +/* Identify zero bytes in X1 or equality between X1 and X2. */ + +static inline op_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 inline op_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 +# define find_zero_ne_low find_zero_ne_all +#else +# include <sysdeps/generic/string-fza.h> +#endif /* _ARCH_PWR6 */ + +#endif /* STRING_FZA_H */
From: Richard Henderson <rth@twiddle.net> While ppc has the more important string functions in assembly, there are still a few generic routines used. Use the Power 6 CMPB insn for testing of zeros. Checked on powerpc64le-linux-gnu. --- sysdeps/powerpc/string-fza.h | 70 ++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 sysdeps/powerpc/string-fza.h