Re: Re: [PATCH] newlib: libc: Improved the readability of strpbrk with minor optimization

"Xiao Zeng" <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <[email protected]>
2023-12-21 06:48  Jeff Johnston <[email protected]> wrote:
>
 
>Unless I am missing something, I think the code could be made even simpler
>to return the pointer when found and return NULL otherwise. 
Yes, you have found a more efficient method.
After my testing, fewer assembly instructions were generated. This is really exciting.

Xiao's patch:
---------------------------------------------------------
libc_a-strpbrk.o:     file format elf64-littleriscv


Disassembly of section .text:

0000000000000000 <strpbrk>:
   0:   00054683                lbu     a3,0(a0)

0000000000000004 <.LVL1>:
   4:   04068063                beqz    a3,44 <.L10>
   8:   0005c603                lbu     a2,0(a1)
   c:   04060063                beqz    a2,4c <.L14>

0000000000000010 <.L5>:
  10:   00058793                mv      a5,a1
  14:   00060713                mv      a4,a2
  18:   00c0006f                j       24 <.L4>

000000000000001c <.L17>:
  1c:   0007c703                lbu     a4,0(a5)
  20:   00070863                beqz    a4,30 <.L16>

0000000000000024 <.L4>:
  24:   00178793                addi    a5,a5,1

0000000000000028 <.LVL5>:
  28:   fee69ae3                bne     a3,a4,1c <.L17>

000000000000002c <.L1>:
  2c:   00008067                ret

0000000000000030 <.L16>:
  30:   00154683                lbu     a3,1(a0)
  34:   00150513                addi    a0,a0,1

0000000000000038 <.LVL8>:
  38:   fc069ce3                bnez    a3,10 <.L5>

000000000000003c <.L6>:
  3c:   0007c783                lbu     a5,0(a5)

0000000000000040 <.LVL9>:
  40:   fe0796e3                bnez    a5,2c <.L1>

0000000000000044 <.L10>:
  44:   00000513                li      a0,0

0000000000000048 <.LVL11>:
  48:   00008067                ret

000000000000004c <.L14>:
  4c:   00154683                lbu     a3,1(a0)
  50:   00150513                addi    a0,a0,1
  54:   fe069ce3                bnez    a3,4c <.L14>
  58:   00058793                mv      a5,a1
  5c:   fe1ff06f                j       3c <.L6>
---------------------------------------------------------

Jeff's patch
---------------------------------------------------------
libc_a-strpbrk.o:     file format elf64-littleriscv


Disassembly of section .text:

0000000000000000 <strpbrk>:
   0:   00054683                lbu     a3,0(a0)
   4:   02068c63                beqz    a3,3c <.L8>
   8:   0005c603                lbu     a2,0(a1)
   c:   02060c63                beqz    a2,44 <.L12>

0000000000000010 <.L5>:
  10:   00058793                mv      a5,a1
  14:   00060713                mv      a4,a2
  18:   00c0006f                j       24 <.L4>

000000000000001c <.L15>:
  1c:   0007c703                lbu     a4,0(a5)
  20:   00070863                beqz    a4,30 <.L14>

0000000000000024 <.L4>:
  24:   00178793                addi    a5,a5,1

0000000000000028 <.LVL4>:
  28:   fed71ae3                bne     a4,a3,1c <.L15>
  2c:   00008067                ret

0000000000000030 <.L14>:
  30:   00154683                lbu     a3,1(a0)
  34:   00150513                addi    a0,a0,1

0000000000000038 <.LVL6>:
  38:   fc069ce3                bnez    a3,10 <.L5>

000000000000003c <.L8>:
  3c:   00000513                li      a0,0

0000000000000040 <.LVL7>:
  40:   00008067                ret

0000000000000044 <.L12>:
  44:   00154683                lbu     a3,1(a0)
  48:   00150513                addi    a0,a0,1
  4c:   fe069ce3                bnez    a3,44 <.L12>
  50:   fedff06f                j       3c <.L8>
---------------------------------------------------------
After careful comparison, it was found that there are fewer assembly
instructions after the Jeff's patch.

>
>index 774db1e..d984745 100644
>--- a/newlib/libc/string/strpbrk.c
>+++ b/newlib/libc/string/strpbrk.c
>@@ -29,23 +29,16 @@ strpbrk (const char *s1,
>        const char *s2)
> {
>   const char *c = s2;
>-  if (!*s1)
>-    return (char *) NULL;
>
>   while (*s1)
>     {
>       for (c = s2; *c; c++)
>        {
>          if (*s1 == *c)
>-           break;
>+           return (char *) s1;
>        }
>-      if (*c)
>-       break;
>       s1++;
>     }
>
>-  if (*c == '\0')
>-    s1 = NULL;
>-
>-  return (char *) s1;
>+  return (char *) NULL;
> }
>
>On Wed, Dec 20, 2023 at 1:12 AM Xiao Zeng <[email protected]>
>wrote:
>
>> Signed-off-by: Xiao Zeng <[email protected]>
>> ---
>>  newlib/libc/string/strpbrk.c | 5 ++---
>>  1 file changed, 2 insertions(+), 3 deletions(-)
>>
>> diff --git a/newlib/libc/string/strpbrk.c b/newlib/libc/string/strpbrk.c
>> index 774db1e6d..95e89c20c 100644
>> --- a/newlib/libc/string/strpbrk.c
>> +++ b/newlib/libc/string/strpbrk.c
>> @@ -37,15 +37,14 @@ strpbrk (const char *s1,
>>        for (c = s2; *c; c++)
>>         {
>>           if (*s1 == *c)
>> -           break;
>> +           goto end;
>>         }
>> -      if (*c)
>> -       break;
>>        s1++;
>>      }
>>
>>    if (*c == '\0')
>>      s1 = NULL;
>>
>> +end:
>>    return (char *) s1;
>>  }
>> --
>> 2.17.1
>>
>>
 
Thanks
Xiao Zeng
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.