public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Carlos O'Donell <carlos@redhat.com>
To: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Cc: libc-alpha@sourceware.org
Subject: Re: [PATCH v5 03/17] Add string-maskoff.h generic header
Date: Tue, 20 Sep 2022 07:43:41 -0400	[thread overview]
Message-ID: <Yymnba83ucD8pnLw@fedora> (raw)
In-Reply-To: <20220919195920.956393-4-adhemerval.zanella@linaro.org>

On Mon, Sep 19, 2022 at 04:59:06PM -0300, Adhemerval Zanella via Libc-alpha wrote:
> Macros to operate on unaligned access for string operations:
> 
>   - create_mask: create a mask based on pointer alignment to sets up
>     non-zero bytes before the beginning of the word so a following
>     operation (such as find zero) might ignore these bytes.
> 
>   - highbit_mask: create a mask with high bit of each byte being 1,
>     and the low 7 bits being all the opposite of the input.

I really appreciate the effort you've put into documenting the purpose
of each function! It's really awesome to reach such nice coments. Thank
you for that. I've gone through this to review the implementation and
the descriptions. I think it needs a little more tweaking.

> These macros are meant to be used on optimized vectorized string
> implementations.
> ---
>  sysdeps/generic/string-maskoff.h | 73 ++++++++++++++++++++++++++++++++
>  1 file changed, 73 insertions(+)
>  create mode 100644 sysdeps/generic/string-maskoff.h
> 
> diff --git a/sysdeps/generic/string-maskoff.h b/sysdeps/generic/string-maskoff.h
> new file mode 100644
> index 0000000000..831647bda6
> --- /dev/null
> +++ b/sysdeps/generic/string-maskoff.h
> @@ -0,0 +1,73 @@
> +/* Mask off bits.  Generic C 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 _STRING_MASKOFF_H
> +#define _STRING_MASKOFF_H 1
> +
> +#include <endian.h>
> +#include <limits.h>
> +#include <stdint.h>
> +#include <string-optype.h>
> +
> +/* Provide a mask based on the pointer alignment that sets up non-zero
> +   bytes before the beginning of the word.  It is used to mask off
> +   undesirable bits from an aligned read from an unaligned pointer.
> +   For instance, on a 64 bits machine with a pointer alignment of

s/bits/-bit/g

While it is technically correct English to say "A 64-bits machine", this
is not the normative usage.

I suggest we use the normative "64-bit machine." We can talk about 64
bits, and alignment as bits etc.

> +   3 the function returns 0x0000000000ffffff for LE and 0xffffff0000000000
> +   (meaning to mask off the initial 3 bytes).  */

Missing "for BE" ?

> +static inline op_t
> +create_mask (uintptr_t i)
> +{
> +  i = i % sizeof (op_t);

OK. Wrap the value.

> +  if (__BYTE_ORDER == __LITTLE_ENDIAN)
> +    return ~(((op_t)-1) << (i * CHAR_BIT));
> +  else
> +    return ~(((op_t)-1) >> (i * CHAR_BIT));

OK. Shift.

> +}
> +
> +/* Setup an word with each byte being c_in.  For instance, on a 64 bits

s/an/a/g
s/bits/-bit/g

> +   machine with input as 0xce the functions returns 0xcececececececece.  */
> +static inline op_t
> +repeat_bytes (unsigned char c_in)
> +{
> +  return ((op_t)-1 / 0xff) * c_in;
> +}

How does the compiler do here on the various architectures to produce
the deposit/expand instructions that could be used for this operation?

aarch64 gcc trunk:
        ldrb    r3, [r7, #7]    @ zero_extendqisi2
        mov     r2, #16843009
        mul     r3, r2, r3

x86_64 gcc trunk:
        movzx   eax, BYTE PTR [rbp-4]
        imul    eax, eax, 16843009

s390x gcc12:
	ic      %r1,167(%r11)
        lhi     %r2,255
        nr      %r1,%r2
        ms      %r1,.L4-.L3(%r5)
        llgfr   %r1,%r1

Looks OK, and the static inline will get optimized with the rest of
the operations.

> +
> +/* Based on mask created by 'create_mask', mask off the high bit of each

s/on/on a/g

> +   byte in the mask.  It is used to mask off undesirable bits from an
> +   aligned read from an unaligned pointer, and also taking care to avoid

s/and/while/g

> +   match possible bytes meant to be matched.  For instance, on a 64 bits

Suggest:
matching possible bytes not meant to be matched.

s/bits/-bits/g

> +   machine with a mask created from a pointer with an alignment of 3
> +   (0x0000000000ffffff) the function returns 0x7f7f7f0000000000 for BE
> +   and 0x00000000007f7f7f for LE.  */
> +static inline op_t
> +highbit_mask (op_t m)
> +{
> +  return m & repeat_bytes (0x7f);

OK.

> +}
> +
> +/* Return the address of the op_t word containing the address P.  For
> +   instance on address 0x0011223344556677 and op_t with size of 8,
> +   it returns 0x0011223344556670.  */

Could you expand on this a bit more? It's a bit opaque what we might use
this for (I have some ideas).

> +static inline op_t *
> +word_containing (char const *p)
> +{
> +  return (op_t *) (p - (uintptr_t) p % sizeof (op_t));
> +}
> +
> +#endif /* _STRING_MASKOFF_H  */
> -- 
> 2.34.1
> 


  reply	other threads:[~2022-09-20 11:43 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-19 19:59 [PATCH v5 00/17] Improve generic string routines Adhemerval Zanella
2022-09-19 19:59 ` [PATCH v5 01/17] Parameterize op_t from memcopy.h Adhemerval Zanella
2022-09-19 19:59 ` [PATCH v5 02/17] Parameterize OP_T_THRES " Adhemerval Zanella
2022-09-20 10:49   ` Carlos O'Donell
2022-09-19 19:59 ` [PATCH v5 03/17] Add string-maskoff.h generic header Adhemerval Zanella
2022-09-20 11:43   ` Carlos O'Donell [this message]
2022-09-22 17:31     ` Adhemerval Zanella Netto
2023-01-05 22:49   ` Noah Goldstein
2023-01-05 23:26     ` Alejandro Colomar
2023-01-09 18:19       ` Adhemerval Zanella Netto
2023-01-09 18:02     ` Adhemerval Zanella Netto
2022-09-19 19:59 ` [PATCH v5 04/17] Add string vectorized find and detection functions Adhemerval Zanella
2023-01-05 22:53   ` Noah Goldstein
2023-01-09 18:51     ` Adhemerval Zanella Netto
2023-01-05 23:04   ` Noah Goldstein
2023-01-09 19:34     ` Adhemerval Zanella Netto
2022-09-19 19:59 ` [PATCH v5 05/17] string: Improve generic strlen Adhemerval Zanella
2022-09-19 19:59 ` [PATCH v5 06/17] string: Improve generic strnlen Adhemerval Zanella
2022-09-19 19:59 ` [PATCH v5 07/17] string: Improve generic strchr Adhemerval Zanella
2023-01-05 23:09   ` Noah Goldstein
2023-01-05 23:19     ` Noah Goldstein
2023-01-09 19:39       ` Adhemerval Zanella Netto
2022-09-19 19:59 ` [PATCH v5 08/17] string: Improve generic strchrnul Adhemerval Zanella
2023-01-05 23:17   ` Noah Goldstein
2023-01-09 20:35     ` Adhemerval Zanella Netto
2023-01-09 20:49       ` Richard Henderson
2023-01-09 20:59       ` Noah Goldstein
2023-01-09 21:01         ` Noah Goldstein
2023-01-09 23:33       ` Richard Henderson
2023-01-10 14:18         ` Adhemerval Zanella Netto
2023-01-10 16:24           ` Richard Henderson
2023-01-10 17:16             ` Noah Goldstein
2023-01-10 18:19               ` Adhemerval Zanella Netto
2023-01-10 17:17           ` Noah Goldstein
2023-01-10 18:16             ` Adhemerval Zanella Netto
2022-09-19 19:59 ` [PATCH v5 09/17] string: Improve generic strcmp Adhemerval Zanella
2022-09-19 19:59 ` [PATCH v5 10/17] string: Improve generic memchr Adhemerval Zanella
2023-01-05 23:47   ` Noah Goldstein
2023-01-09 20:50     ` Adhemerval Zanella Netto
2023-01-05 23:49   ` Noah Goldstein
2023-01-09 20:51     ` Adhemerval Zanella Netto
2023-01-09 21:26       ` Noah Goldstein
2023-01-10 14:33         ` Adhemerval Zanella Netto
2022-09-19 19:59 ` [PATCH v5 11/17] string: Improve generic memrchr Adhemerval Zanella
2023-01-05 23:51   ` Noah Goldstein
2022-09-19 19:59 ` [PATCH v5 12/17] hppa: Add memcopy.h Adhemerval Zanella
2022-09-19 19:59 ` [PATCH v5 13/17] hppa: Add string-fzb.h and string-fzi.h Adhemerval Zanella
2022-09-19 19:59 ` [PATCH v5 14/17] alpha: " Adhemerval Zanella
2022-09-19 19:59 ` [PATCH v5 15/17] arm: Add string-fza.h Adhemerval Zanella
2022-09-19 19:59 ` [PATCH v5 16/17] powerpc: " Adhemerval Zanella
2022-09-19 19:59 ` [PATCH v5 17/17] sh: Add string-fzb.h Adhemerval Zanella
2022-12-05 17:07 ` [PATCH v5 00/17] Improve generic string routines Xi Ruoyao
2023-01-05 21:56   ` Adhemerval Zanella Netto
2023-01-05 23:52     ` Noah Goldstein
2023-01-06 13:43       ` Adhemerval Zanella Netto

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Yymnba83ucD8pnLw@fedora \
    --to=carlos@redhat.com \
    --cc=adhemerval.zanella@linaro.org \
    --cc=libc-alpha@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).