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]>
As mentioned in [PATCH] newlib: libc: Improved the readability of strcspn with minor optimization: <https://sourceware.org/pipermail/newlib/2023/020766.html>

This patch did the same thing and passed the testcases.

Similarly, provide a comparison of risc-v assembly:

no-patch:
---------------------------------------------------------
libc_a-strpbrk.o:     file format elf64-littleriscv


Disassembly of section .text:

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

0000000000000004 <.LVL1>:
   4:   06068463                beqz    a3,6c <.L8>
   8:   0005c603                lbu     a2,0(a1)

000000000000000c <.LVL2>:
   c:   02060e63                beqz    a2,48 <.L14>

0000000000000010 <.L6>:
  10:   00058713                mv      a4,a1
  14:   00060793                mv      a5,a2

0000000000000018 <.L5>:
  18:   00f68e63                beq     a3,a5,34 <.L4>
  1c:   00174783                lbu     a5,1(a4)
  20:   00170713                addi    a4,a4,1

0000000000000024 <.LVL4>:
  24:   fe079ae3                bnez    a5,18 <.L5>
  28:   00154683                lbu     a3,1(a0)
  2c:   00150513                addi    a0,a0,1

0000000000000030 <.LVL5>:
  30:   fe0690e3                bnez    a3,10 <.L6>

0000000000000034 <.L4>:
  34:   00074783                lbu     a5,0(a4)
  38:   00f037b3                snez    a5,a5
  3c:   40f007b3                neg     a5,a5
  40:   00f57533                and     a0,a0,a5
  44:   00008067                ret

0000000000000048 <.L14>:
  48:   00154683                lbu     a3,1(a0)
  4c:   00150513                addi    a0,a0,1

0000000000000050 <.LVL8>:
  50:   fe069ce3                bnez    a3,48 <.L14>
  54:   00058713                mv      a4,a1
  58:   00074783                lbu     a5,0(a4)
  5c:   00f037b3                snez    a5,a5
  60:   40f007b3                neg     a5,a5
  64:   00f57533                and     a0,a0,a5

0000000000000068 <.LVL9>:
  68:   00008067                ret

000000000000006c <.L8>:
  6c:   00000513                li      a0,0

0000000000000070 <.LVL11>:
  70:   00008067                ret
---------------------------------------------------------

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>
---------------------------------------------------------
After careful comparison, it was found that there are fewer assembly
instructions after the patch.

2023-12-20 14:10  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.