[PATCH 21/21] mips: libc: Fix strcmp bug for little endian targets
Aleksandar Rikalo
arikalo@gmail.com
Thu Oct 31 05:49:37 GMT 2024
From: Faraz Shahbazker <fshahbazker@wavecomp.com>
strcmp gives incorrect result for little endian targets under
the following conditions:
1. Length of 1st string is 1 less than a multiple of 4 (i.e len%4=3)
2. First string is a prefix of the second string
3. The first differing character in the second string is extended
ASCII (that is > 127)
Signed-off-by: Faraz Shahbazker <fshahbazker@wavecomp.com>
Signed-off-by: Aleksandar Rikalo <arikalo@gmail.com>
---
newlib/libc/machine/mips/strcmp.S | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/newlib/libc/machine/mips/strcmp.S b/newlib/libc/machine/mips/strcmp.S
index d5257bb49..0c1d5c3e3 100644
--- a/newlib/libc/machine/mips/strcmp.S
+++ b/newlib/libc/machine/mips/strcmp.S
@@ -217,10 +217,13 @@ L(worddiff):
beq a0, zero, L(wexit01)
bne a0, a1, L(wexit01)
- /* The other bytes are identical, so just subract the 2 words
- and return the difference. */
+# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+ srl a0, a2, 24
+ srl a1, a3, 24
+# else /* __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ */
move a0, a2
move a1, a3
+# endif /* __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ */
L(wexit01):
subu va0, a0, a1
--
2.25.1
More information about the Newlib
mailing list