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