summaryrefslogtreecommitdiff
path: root/libc/string/bfin/memcmp.S
diff options
context:
space:
mode:
Diffstat (limited to 'libc/string/bfin/memcmp.S')
-rw-r--r--libc/string/bfin/memcmp.S94
1 files changed, 47 insertions, 47 deletions
diff --git a/libc/string/bfin/memcmp.S b/libc/string/bfin/memcmp.S
index 117550cdb..b5d4f1c7a 100644
--- a/libc/string/bfin/memcmp.S
+++ b/libc/string/bfin/memcmp.S
@@ -1,5 +1,5 @@
/* memcmp.S
- * Copyright (C) 2003, 2005, 2006 Analog Devices Inc., All Rights Reserved.
+ * Copyright (C) 2003-2007 Analog Devices Inc., All Rights Reserved.
*
* This file is subject to the terms and conditions of the GNU Library General
* Public License. See the file "COPYING.LIB" in the main directory of this
@@ -9,6 +9,8 @@
* http://www.analog.com/processors/resources/crosscore/visualDspDevSoftware.html
*/
+#include <sysdep.h>
+
/* int memcmp(const void *s1, const void *s2, size_t n);
* R0 = First Address (s1)
* R1 = Second Address (s2)
@@ -17,34 +19,30 @@
* Favours word aligned data.
*/
-#include <features.h>
-
.text
.align 2
-.global _memcmp
-.type _memcmp, STT_FUNC
-_memcmp:
+ENTRY(_memcmp)
I1 = P3;
- P0 = R0; // P0 = s1 address
- P3 = R1; // P3 = s2 Address
- P2 = R2 ; // P2 = count
+ P0 = R0; /* P0 = s1 address */
+ P3 = R1; /* P3 = s2 Address */
+ P2 = R2 ; /* P2 = count */
CC = R2 <= 7(IU);
- IF CC JUMP too_small;
- I0 = R1; // s2
- R1 = R1 | R0; // OR addresses together
- R1 <<= 30; // check bottom two bits
- CC = AZ; // AZ set if zero.
- IF !CC JUMP bytes ; // Jump if addrs not aligned.
+ IF CC JUMP .Ltoo_small;
+ I0 = R1; /* s2 */
+ R1 = R1 | R0; /* OR addresses together */
+ R1 <<= 30; /* check bottom two bits */
+ CC = AZ; /* AZ set if zero. */
+ IF !CC JUMP .Lbytes ; /* Jump if addrs not aligned. */
- P1 = P2 >> 2; // count = n/4
+ P1 = P2 >> 2; /* count = n/4 */
R3 = 3;
- R2 = R2 & R3; // remainder
- P2 = R2; // set remainder
+ R2 = R2 & R3; /* remainder */
+ P2 = R2; /* set remainder */
- LSETUP (quad_loop_s , quad_loop_e) LC0=P1;
-quad_loop_s:
+ LSETUP (.Lquad_loop_s, .Lquad_loop_e) LC0=P1;
+.Lquad_loop_s:
#if !defined(__WORKAROUND_AVOID_DAG1)
MNOP || R0 = [P0++] || R1 = [I0++];
#else
@@ -52,48 +50,50 @@ quad_loop_s:
R1 = [I0++];
#endif
CC = R0 == R1;
- IF !CC JUMP quad_different;
-quad_loop_e:
+ IF !CC JUMP .Lquad_different;
+.Lquad_loop_e:
NOP;
- P3 = I0; // s2
-too_small:
- CC = P2 == 0; //Check zero count
- IF CC JUMP finished; // very unlikely
+ P3 = I0; /* s2 */
+.Ltoo_small:
+ CC = P2 == 0; /* Check zero count*/
+ IF CC JUMP .Lfinished; /* very unlikely*/
-bytes:
- LSETUP (byte_loop_s , byte_loop_e) LC0=P2;
-byte_loop_s:
- R1 = B[P3++](Z); // *s2
- R0 = B[P0++](Z); // *s1
+.Lbytes:
+ LSETUP (.Lbyte_loop_s, .Lbyte_loop_e) LC0=P2;
+.Lbyte_loop_s:
+ R1 = B[P3++](Z); /* *s2 */
+ R0 = B[P0++](Z); /* *s1 */
CC = R0 == R1;
- IF !CC JUMP different;
-byte_loop_e:
+ IF !CC JUMP .Ldifferent;
+.Lbyte_loop_e:
NOP;
-different:
+.Ldifferent:
R0 = R0 - R1;
P3 = I1;
RTS;
-quad_different:
- // We've read two quads which don't match.
- // Can't just compare them, because we're
- // a little-endian machine, so the MSBs of
- // the regs occur at later addresses in the
- // string.
- // Arrange to re-read those two quads again,
- // byte-by-byte.
- P0 += -4; // back up to the start of the
- P3 = I0; // quads, and increase the
- P2 += 4; // remainder count
+.Lquad_different:
+ /* We've read two quads which don't match.
+ * Can't just compare them, because we're
+ * a little-endian machine, so the MSBs of
+ * the regs occur at later addresses in the
+ * string.
+ * Arrange to re-read those two quads again,
+ * byte-by-byte.
+ */
+ P0 += -4; /* back up to the start of the */
+ P3 = I0; /* quads, and increase the*/
+ P2 += 4; /* remainder count*/
P3 += -4;
- JUMP bytes;
+ JUMP .Lbytes;
-finished:
+.Lfinished:
R0 = 0;
P3 = I1;
RTS;
+
.size _memcmp,.-_memcmp
libc_hidden_def (memcmp)