|
@@ -1,5 +1,5 @@
|
|
/*
|
|
/*
|
|
- * Copyright (C) 2013, 2014-2015, 2017 Synopsys, Inc. (www.synopsys.com)
|
|
+ * Copyright (C) 2013, 2014-2015, 2017, 2022 Synopsys, Inc. (www.synopsys.com)
|
|
* Copyright (C) 2007 ARC International (UK) LTD
|
|
* Copyright (C) 2007 ARC International (UK) LTD
|
|
*
|
|
*
|
|
* Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball.
|
|
* Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball.
|
|
@@ -7,14 +7,11 @@
|
|
|
|
|
|
#include <features.h>
|
|
#include <features.h>
|
|
#include <sysdep.h>
|
|
#include <sysdep.h>
|
|
-
|
|
+#include <asm.h>
|
|
-#if !defined(__ARC700__) && !defined(__ARCHS__)
|
|
|
|
-#error "Neither ARC700 nor ARCHS is defined!"
|
|
|
|
-#endif
|
|
|
|
|
|
|
|
ENTRY(strcmp)
|
|
ENTRY(strcmp)
|
|
|
|
|
|
-#ifdef __ARC700__
|
|
+#if defined(__ARC700__) || defined(__ARC64_ARCH32__)
|
|
/* This is optimized primarily for the ARC700.
|
|
/* This is optimized primarily for the ARC700.
|
|
It would be possible to speed up the loops by one cycle / word
|
|
It would be possible to speed up the loops by one cycle / word
|
|
respective one cycle / byte by forcing double source 1 alignment, unrolling
|
|
respective one cycle / byte by forcing double source 1 alignment, unrolling
|
|
@@ -38,7 +35,7 @@ ENTRY(strcmp)
|
|
breq r2,r3,.Lwordloop
|
|
breq r2,r3,.Lwordloop
|
|
#ifdef __LITTLE_ENDIAN__
|
|
#ifdef __LITTLE_ENDIAN__
|
|
xor r0,r2,r3 ; mask for difference
|
|
xor r0,r2,r3 ; mask for difference
|
|
- sub_s r1,r0,1
|
|
+ SUBR_S r1,r0,1
|
|
bic_s r0,r0,r1 ; mask for least significant difference bit
|
|
bic_s r0,r0,r1 ; mask for least significant difference bit
|
|
sub r1,r5,r0
|
|
sub r1,r5,r0
|
|
xor r0,r5,r1 ; mask for least significant difference byte
|
|
xor r0,r5,r1 ; mask for least significant difference byte
|
|
@@ -55,7 +52,7 @@ ENTRY(strcmp)
|
|
.Lfound0:
|
|
.Lfound0:
|
|
xor r0,r2,r3 ; mask for difference
|
|
xor r0,r2,r3 ; mask for difference
|
|
or r0,r0,r4 ; or in zero indicator
|
|
or r0,r0,r4 ; or in zero indicator
|
|
- sub_s r1,r0,1
|
|
+ SUBR_S r1,r0,1
|
|
bic_s r0,r0,r1 ; mask for least significant difference bit
|
|
bic_s r0,r0,r1 ; mask for least significant difference bit
|
|
sub r1,r5,r0
|
|
sub r1,r5,r0
|
|
xor r0,r5,r1 ; mask for least significant difference byte
|
|
xor r0,r5,r1 ; mask for least significant difference byte
|
|
@@ -99,9 +96,8 @@ ENTRY(strcmp)
|
|
.Lcmpend:
|
|
.Lcmpend:
|
|
j_s.d [blink]
|
|
j_s.d [blink]
|
|
sub r0,r2,r3
|
|
sub r0,r2,r3
|
|
-#endif /* __ARC700__ */
|
|
|
|
|
|
|
|
-#ifdef __ARCHS__
|
|
+#elif defined(__ARCHS__)
|
|
or r2, r0, r1
|
|
or r2, r0, r1
|
|
bmsk_s r2, r2, 1
|
|
bmsk_s r2, r2, 1
|
|
brne r2, 0, @.Lcharloop
|
|
brne r2, 0, @.Lcharloop
|
|
@@ -168,7 +164,10 @@ ENTRY(strcmp)
|
|
.Lcmpend:
|
|
.Lcmpend:
|
|
j_s.d [blink]
|
|
j_s.d [blink]
|
|
sub r0, r2, r3
|
|
sub r0, r2, r3
|
|
-#endif /* __ARCHS__ */
|
|
+
|
|
|
|
+#else
|
|
|
|
+#error "Unsupported ARC CPU type"
|
|
|
|
+#endif
|
|
|
|
|
|
END(strcmp)
|
|
END(strcmp)
|
|
libc_hidden_def(strcmp)
|
|
libc_hidden_def(strcmp)
|