summaryrefslogtreecommitdiff
path: root/libc/string/avr32/memcmp.S
blob: 5d7eac3d9cb635090d5560787551fcca39a66c07 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/*
 * Copyright (C) 2004-2007 Atmel Corporation
 *
 * This file is subject to the terms and conditions of the GNU Lesser General
 * Public License.  See the file "COPYING.LIB" in the main directory of this
 * archive for more details.
 */

#include <features.h>

#define s1 r12
#define s2 r11
#define len r10

       .text
       .global memcmp
       .type   memcmp, @function
       .align  1
memcmp:
       sub     len, 4
       brlt    .Lless_than_4

1:     ld.w    r8, s1++
       ld.w    r9, s2++
       cp.w    r8, r9
       brne    .Lfound_word
       sub     len, 4
       brge    1b

.Lless_than_4:
       sub     len, -4
       reteq   0

1:     ld.ub   r8, s1++
       ld.ub   r9, s2++
       sub     r8, r9
       retne   r8
       sub     len, 1
       brgt    1b

       retal   0

.Lfound_word:
       mov     len, 4

2:     bfextu  r11, r9, 24, 8
       bfextu  r12, r8, 24, 8
       sub     r12, r11
       retne   r12
       lsl     r8, 8
       lsl     r9, 8
       sub     len, 1
       brne    2b
       retal   r12

       .size   memcmp, . - memcmp

libc_hidden_def(memcmp)
#ifdef __UCLIBC_SUSV3_LEGACY__
strong_alias(memcmp,bcmp)
#endif