From: Pavel Kozlov <pavel.koz...@synopsys.com>

Remove read ahead in the per-word compare loop as it can cause a
segmentation fault in certain circumstances (when a string crosses a
page boundary). For baremetal this relaxed approach is suitable but
in Linux with MMU we should be more restrictive.

Signed-off-by: Pavel Kozlov <pavel.koz...@synopsys.com>
---
 libc/string/arc/strcmp.S | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/libc/string/arc/strcmp.S b/libc/string/arc/strcmp.S
index 3f64ac421acc..48d2d7ec1d83 100644
--- a/libc/string/arc/strcmp.S
+++ b/libc/string/arc/strcmp.S
@@ -103,23 +103,21 @@ ENTRY(strcmp)
        brne    r2, 0, @.Lcharloop
 
 ;;; s1 and s2 are word aligned
-       ld.ab   r2, [r0, 4]
 
        mov_s   r12, 0x01010101
        ror     r11, r12
        .align  4
 .LwordLoop:
+       ld.ab   r2, [r0, 4]
+       sub     r4, r2, r12
        ld.ab   r3, [r1, 4]
        ;; Detect NULL char in str1
-       sub     r4, r2, r12
-       ld.ab   r5, [r0, 4]
        bic     r4, r4, r2
        and     r4, r4, r11
        brne.d.nt       r4, 0, .LfoundNULL
        ;; Check if the read locations are the same
        cmp     r2, r3
-       beq.d   .LwordLoop
-       mov.eq  r2, r5
+       beq     .LwordLoop
 
        ;; A match is found, spot it out
 #ifdef __LITTLE_ENDIAN__
-- 
2.25.1

_______________________________________________
devel mailing list -- devel@uclibc-ng.org
To unsubscribe send an email to devel-le...@uclibc-ng.org

Reply via email to