From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ej1-x630.google.com (mail-ej1-x630.google.com [IPv6:2a00:1450:4864:20::630]) by sourceware.org (Postfix) with ESMTPS id 760463858409 for ; Fri, 3 Feb 2023 19:48:06 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 760463858409 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-ej1-x630.google.com with SMTP id ml19so18446395ejb.0 for ; Fri, 03 Feb 2023 11:48:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=eNUDorxhA2l6gBQDpTIL2VlE7b8mCrw5T0Aj9H1Pfyc=; b=XQACQj1x50+auprZGxnwWbadRmd5W8eE3S5w+C5X8xBohgaMLK/pqwhy2xj+07ciwK ke+PlULf3N/JnmoCAYXemKzjzgRvcC+Er1W8oKDmIOWM+p17q23wePE840o0pcYq14qz TZIotivDeSwMV95RkqkSTHDuS12C3iXQRiy6A9ld+E4SkvOAH/SRlMxrTDJBkOXMiDnB RJ7ts6mC+W0utm7aseCvY+1D3lcqfpzVcgWPd+k7rmvO5XQ15UvpXO1NDon8GdlHz3Vm pAeu5BynrEvqEGQkZJbrm7k8m0JDV9yEs6Bdt15KGV0h6SZbd8dx2DrMa1bQQAf5Lh/D gO/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=eNUDorxhA2l6gBQDpTIL2VlE7b8mCrw5T0Aj9H1Pfyc=; b=GCp0Y8XqkRcm+Z22aUP3U//SLSSJODkXz26EUIWXWvUmcXMpUiuD2zZibC63byuUjU luZQk8KiloeZ1oBuy6ufl0sxGZCrUKnoZKxVSswIysCqsHdW645VGY89lqoNMSGTcT1V q6VsudryKA8c1+nQm3LSUKwq4uK656wcJrBSz1IQDy02u0cE3rir8IPhhTsXJ5MqPHLj CUvcXUAg16GCaeMLBu+WZLGPzh4p6CrZzqxXfKOukL2+AZ1YhTHUbNxoDGWYyYUPcQcB tNOYo7/6jxgMIsnm25lT7MX7EoUVEhI/pxRCcJQcQ1+IrK0jrBh3K1nVycr/I532NvHG 5eMA== X-Gm-Message-State: AO0yUKV0Bn5OMx56jFqU8VWcEZ7ry/RQ47TsQPO7SqtbCMKTTFXTMwng TKQz+yvB49TxFqnilQPwaC9O8hEXZGiyBpyYMvw= X-Google-Smtp-Source: AK7set89x4A41WYDly0Wzv+bmFFQ+3ouQFgvkHSBn2GrXvc6bhdEIjR4DhZ1Za9p5bpRdG6RgymOKqvmMnsb/ls9iDw= X-Received: by 2002:a17:907:7670:b0:87b:db55:f3e5 with SMTP id kk16-20020a170907767000b0087bdb55f3e5mr3340365ejc.289.1675453685189; Fri, 03 Feb 2023 11:48:05 -0800 (PST) MIME-Version: 1.0 References: <20230202181149.2181553-1-adhemerval.zanella@linaro.org> <20230202181149.2181553-22-adhemerval.zanella@linaro.org> In-Reply-To: <20230202181149.2181553-22-adhemerval.zanella@linaro.org> From: Noah Goldstein Date: Fri, 3 Feb 2023 13:47:53 -0600 Message-ID: Subject: Re: [PATCH v12 21/31] riscv: Add string-fza.h and string-fzi.h To: Adhemerval Zanella Cc: libc-alpha@sourceware.org, Richard Henderson , Jeff Law , Xi Ruoyao Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-9.6 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: On Thu, Feb 2, 2023 at 12:12 PM Adhemerval Zanella wrote: > > 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 > --- > sysdeps/riscv/string-fza.h | 70 ++++++++++++++++++++++++++++++++++ > sysdeps/riscv/string-fzi.h | 77 ++++++++++++++++++++++++++++++++++++++ > 2 files changed, 147 insertions(+) > create mode 100644 sysdeps/riscv/string-fza.h > create mode 100644 sysdeps/riscv/string-fzi.h > > diff --git a/sysdeps/riscv/string-fza.h b/sysdeps/riscv/string-fza.h > new file mode 100644 > index 0000000000..9c7a6efba2 > --- /dev/null > +++ b/sysdeps/riscv/string-fza.h > @@ -0,0 +1,70 @@ > +/* 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 > + . */ > + > +#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 > +# include > + > +/* 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 > +# define find_zero_ne_low find_zero_ne_all > +#else > +#include > +#endif > + > +#endif /* _RISCV_STRING_FZA_H */ > diff --git a/sysdeps/riscv/string-fzi.h b/sysdeps/riscv/string-fzi.h > new file mode 100644 > index 0000000000..3cde113afb > --- /dev/null > +++ b/sysdeps/riscv/string-fzi.h > @@ -0,0 +1,77 @@ > +/* Zero byte detection; indexes. 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 > + . */ > + > +#ifndef _STRING_RISCV_FZI_H > +#define _STRING_RISCV_FZI_H 1 > + > +#ifdef __riscv_zbb > +# include > +#else > +/* Without bitmap clz/ctz extensions, it is faster to direct test the bits > + instead of calling compiler auxiliary functions. */ > +# include > + > +static __always_inline unsigned int > +index_first (find_t c) > +{ > + if (c & 0x80U) > + return 0; > + if (c & 0x8000U) > + return 1; > + if (c & 0x800000U) > + return 2; > + > + if (sizeof (op_t) == 4) > + return 3; > + > + if (c & 0x80000000U) > + return 3; > + if (c & 0x8000000000UL) > + return 4; > + if (c & 0x800000000000UL) > + return 5; > + if (c & 0x80000000000000UL) > + return 6; > + return 7; > +} > + > +static __always_inline unsigned int > +index_last (find_t c) > +{ > + if (sizeof (op_t) == 8) > + { > + if (c & 0x8000000000000000UL) > + return 7; > + if (c & 0x80000000000000UL) > + return 6; > + if (c & 0x800000000000UL) > + return 5; > + if (c & 0x8000000000UL) > + return 4; > + } > + if (c & 0x80000000U) > + return 3; > + if (c & 0x800000U) > + return 2; > + if (c & 0x8000U) > + return 1; > + return 0; > +} > +#endif > + > +#endif /* STRING_FZI_H */ > -- > 2.34.1 > Has WS error: ``` Applying: riscv: Add string-fza.h and string-fzi.h .git/rebase-apply/patch:115: trailing whitespace. instead of calling compiler auxiliary functions. */ warning: 1 line adds whitespace errors. ```