From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-yw1-x1135.google.com (mail-yw1-x1135.google.com [IPv6:2607:f8b0:4864:20::1135]) by sourceware.org (Postfix) with ESMTPS id 8073E3858D33 for ; Wed, 1 Feb 2023 18:08:20 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 8073E3858D33 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-yw1-x1135.google.com with SMTP id 00721157ae682-520dad0a7d2so19391717b3.5 for ; Wed, 01 Feb 2023 10:08:20 -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=kXPHFMpOaeSfREIVLpYStuIcdXuzH7qkyfXaqgOrc10=; b=SntbqYFImZc7psMB+N9lREwWOnRfG7DCAZL2YJBwiW1RMcMpT2MsBovSlUt9Zj/vMk pfcw+rm1hNTI6GzdkN8j4ZByj2UeDlOfbkcvVdmcmSHUaCFj8dIXdXDXP55jQ2gGMpel 4pHBYH53lANgw0aTzs7nLAIWlgG7swTTNB0v3YuQiryFgOsFYZ4Vom7VoEiuDPTf0Sd0 35FliPpZewGCBtlx1QP27IK6/PFwbXf7a3nwxCFc+Tg1caAB98FPp4ZgAZDEmzQNgYds WmLkpNjExMpLn1XPz+j/5JRV7bpAA5SFcQahnjDM8Ioe8jHDm7iM+NVp78lWYH527pir 97uQ== 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=kXPHFMpOaeSfREIVLpYStuIcdXuzH7qkyfXaqgOrc10=; b=rMxj66FERSCT6j4wgxzQWCB2bscrRQTAm1ieycPs/qP8rKxGyDmLVpddnqgndWkQxB cZFCjoSm36TJNKhnCAcwRza2fhKUb9Utfc//dEspCTnXvSyqUzL8iOeNUy9f4wc0x2ge 66DGh3g1JkmapzqzTbomB54e4BFEWJmlO2urvU8bWsNmXIbrbdiJG2w3z/CPZkO4YlQT 544tY8tY2Z2jiZF9lZq/4Fwt2GlziGUUvK5TONNKi8Xt4J7HSRwtnHofi3XCXoWCR9hy Bn779IAsXVipoo++e4HgEzfCE9ZdeTJX9IehkXGUUQx1qqFm7iXTjBa1uihWbqlo7Cu2 hN+Q== X-Gm-Message-State: AO0yUKXdJySBbaHNQO12PUDFLRkksjotlxEIH/Ar8OGYTN7Jnmo0zE4V 7szLktj2VohSLOpVuP8dhtVuTWv6RaAYDlbz+qs= X-Google-Smtp-Source: AK7set+tzu0/bTAmFLfAQezICa75QwBRvNQHGpA8Vf2hVSh+NNibMCOCf9VPwRxiFpZ0vs6SgEGcew31W5uPTjaHjbs= X-Received: by 2002:a81:204:0:b0:4db:df79:a7c7 with SMTP id 4-20020a810204000000b004dbdf79a7c7mr410348ywc.515.1675274899524; Wed, 01 Feb 2023 10:08:19 -0800 (PST) MIME-Version: 1.0 References: <20230201170406.303978-1-adhemerval.zanella@linaro.org> <20230201170406.303978-21-adhemerval.zanella@linaro.org> In-Reply-To: <20230201170406.303978-21-adhemerval.zanella@linaro.org> From: Noah Goldstein Date: Wed, 1 Feb 2023 12:08:06 -0600 Message-ID: Subject: Re: [PATCH v11 20/29] 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.0 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 Wed, Feb 1, 2023 at 11:05 AM 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. > --- > 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 > When applying: 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.