diff mbox series

[uclibc-ng-devel] arc: remove read ahead in asm strcmp code for ARCHS

Message ID 20231109110429.23443-1-kozlov@synopsys.com
State Accepted
Headers show
Series [uclibc-ng-devel] arc: remove read ahead in asm strcmp code for ARCHS | expand

Commit Message

Pavel Kozlov Nov. 9, 2023, 11:04 a.m. UTC
From: Pavel Kozlov <pavel.kozlov@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.kozlov@synopsys.com>
---
 libc/string/arc/strcmp.S | 8 +++-----
 1 file changed, 3 insertions(+), 5 deletions(-)
diff mbox series

Patch

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__