public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: Adhemerval Zanella Netto <adhemerval.zanella@linaro.org>
To: Noah Goldstein <goldstein.w.n@gmail.com>
Cc: GNU C Library <libc-alpha@sourceware.org>,
	Richard Henderson <rth@twiddle.net>,
	Joseph Myers <joseph@codesourcery.com>,
	caiyinyu <caiyinyu@loongson.cn>
Subject: Re: [PATCH 10/17] string: Improve generic memchr
Date: Thu, 22 Sep 2022 14:51:28 -0300	[thread overview]
Message-ID: <2710d66f-2a13-be75-8692-6ffbd5302ccf@linaro.org> (raw)
In-Reply-To: <CAFUsyfJ+2oxyjbF7=71mLqoTL=aS1MHaKqerH3qix8fNaJbzfQ@mail.gmail.com>



On 19/09/22 18:59, Noah Goldstein wrote:
> On Mon, Sep 19, 2022 at 12:17 PM Adhemerval Zanella Netto
> <adhemerval.zanella@linaro.org> wrote:
>>
>>
>>
>> On 03/09/22 00:47, Noah Goldstein wrote:
>>
>>>>
>>>> -  longword_ptr = (const longword *) char_ptr;
>>>> +  /* Compute the address of the word containing the last byte. */
>>>> +  const op_t *lword = word_containing (lbyte);
>>>>
>>>> -  /* All these elucidatory comments refer to 4-byte longwords,
>>>> -     but the theory applies equally well to any size longwords.  */
>>>> +  /* Read the first word, but munge it so that bytes before the array
>>>> +     will not match goal.  */
>>>> +  const op_t * word_ptr = word_containing (s);
>>>> +  op_t word = (*word_ptr | before_mask) ^ (repeated_c & before_mask);
>>>
>>> Why do you xor with repeated_c & before_mask here?
>>>
>>> Doesn't the has_eq(word, repeated_c) do that?
>>
>> For the case of c_in being 0xff, since for this case or with before_mask
>> will make has_eq to return early.  The test-memchr does not trigger it,
>> but test-memccpy does fail without the XOR.
> 
> I see. Since a match in the first several bytes is fairly common
> maybe it would be better to special case the first iteration and just do
> 
> has_eq(word, repeated_c) >> (CHAR_BIT * (addr % sizeof(addr)).
> The result can just be added to `s` if there is a match.

I think you mean something like:

  has_eq (word >> (CHAR_BIT * (s % sizeof(op_t)), repeated_c) 

Since has_eq returns _Bool.  However in this case we will need to shift
the repeated_c as well, and it will bleed endianess definition (the shift
direction) on generic implementation.  On both cases not sure if this will
be a gain.

Maybe we can also parametrize the first check:

  static inline _Bool
  has_eq_first (op_t *word, const op_t *word_ptr, op_t repeated_c, 
                op_t before_mask)
  {
    *word = (*word_ptr | before_mask) ^ (repeated_c & before_mask);
    return has_eq (*word, repeated_c);
  } 

  [...]

  op_t word;
  if (!has_eq_first (&word, word_ptr, repeated_c, before_mask))
    {
      do
        {
          if (word_ptr == lword)
            return NULL;
          word = *++word_ptr;
        }
      while (!has_eq (word, repeated_c));
    }

If the architecture has a better strategy to check.  But I also not sure
if this would indeed yield any improvement in the end.

  reply	other threads:[~2022-09-22 17:51 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-02 20:39 [PATCH 00/17] Improve generic string routines Adhemerval Zanella
2022-09-02 20:39 ` [PATCH 01/17] Parameterize op_t from memcopy.h Adhemerval Zanella
2022-09-02 20:39 ` [PATCH 02/17] Parameterize OP_T_THRES " Adhemerval Zanella
2022-09-02 20:39 ` [PATCH 03/17] Add string-maskoff.h generic header Adhemerval Zanella
2022-09-02 20:39 ` [PATCH 04/17] Add string vectorized find and detection functions Adhemerval Zanella
2022-09-03  3:20   ` Noah Goldstein
2022-09-19 14:00     ` Adhemerval Zanella Netto
2022-09-02 20:39 ` [PATCH 05/17] string: Improve generic strlen Adhemerval Zanella
2022-09-02 20:39 ` [PATCH 06/17] string: Improve generic strnlen Adhemerval Zanella
2022-09-02 20:39 ` [PATCH 07/17] string: Improve generic strchr Adhemerval Zanella
2022-09-02 20:39 ` [PATCH 08/17] string: Improve generic strchrnul Adhemerval Zanella
2022-09-02 20:39 ` [PATCH 09/17] string: Improve generic strcmp Adhemerval Zanella
2022-09-03  3:31   ` Noah Goldstein
2022-09-19 14:04     ` Adhemerval Zanella Netto
2022-09-03  8:54   ` Richard Henderson
2022-09-02 20:39 ` [PATCH 10/17] string: Improve generic memchr Adhemerval Zanella
2022-09-03  3:47   ` Noah Goldstein
2022-09-19 19:17     ` Adhemerval Zanella Netto
2022-09-19 21:59       ` Noah Goldstein
2022-09-22 17:51         ` Adhemerval Zanella Netto [this message]
2022-09-02 20:39 ` [PATCH 11/17] string: Improve generic memrchr Adhemerval Zanella
2022-09-02 20:39 ` [PATCH 12/17] hppa: Add memcopy.h Adhemerval Zanella
2022-09-02 20:39 ` [PATCH 13/17] hppa: Add string-fzb.h and string-fzi.h Adhemerval Zanella
2022-09-02 20:39 ` [PATCH 14/17] alpha: " Adhemerval Zanella
2022-09-02 20:39 ` [PATCH 15/17] arm: Add string-fza.h Adhemerval Zanella
2022-09-05 15:40   ` Richard Earnshaw
2022-09-05 15:50     ` Richard Earnshaw
2022-09-02 20:39 ` [PATCH 16/17] powerpc: " Adhemerval Zanella
2022-09-06 14:48   ` Paul E Murphy
2022-09-19 19:55     ` Adhemerval Zanella Netto
2022-09-02 20:39 ` [PATCH 17/17] sh: Add string-fzb.h Adhemerval Zanella

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=2710d66f-2a13-be75-8692-6ffbd5302ccf@linaro.org \
    --to=adhemerval.zanella@linaro.org \
    --cc=caiyinyu@loongson.cn \
    --cc=goldstein.w.n@gmail.com \
    --cc=joseph@codesourcery.com \
    --cc=libc-alpha@sourceware.org \
    --cc=rth@twiddle.net \
    /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).