]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/cortex-strings/src/thumb/strcmp-armv6m.S
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / contrib / cortex-strings / src / thumb / strcmp-armv6m.S
1 /*
2  * Copyright (c) 2014 ARM Ltd
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. The name of the company may not be used to endorse or promote
14  *    products derived from this software without specific prior written
15  *    permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED
18  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
22  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
23  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
24  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
25  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 /* Implementation of strcmp for ARMv6m.  This version is only used in
30    ARMv6-M when we want an efficient implementation.  Otherwize if the
31    code size is preferred, strcmp-armv4t.S will be used.  */
32
33         .thumb_func
34         .syntax unified
35         .arch   armv6-m
36
37         .macro DoSub n, label
38         subs    r0, r0, r1
39 #ifdef __ARM_BIG_ENDIAN
40         lsrs    r1, r4, \n
41 #else
42         lsls    r1, r4, \n
43 #endif
44         orrs    r1, r0
45         bne     \label
46         .endm
47
48         .macro Byte_Test n, label
49         lsrs    r0, r2, \n
50         lsrs    r1, r3, \n
51         DoSub   \n, \label
52         .endm
53
54         .text
55         .p2align        0
56         .global strcmp
57         .type   strcmp, %function
58 strcmp:
59         .cfi_startproc
60         mov     r2, r0
61         push    {r4, r5, r6, lr}
62         orrs    r2, r1
63         lsls    r2, r2, #30
64         bne     6f
65         ldr     r5, =0x01010101
66         lsls    r6, r5, #7
67 1:
68         ldmia   r0!, {r2}
69         ldmia   r1!, {r3}
70         subs    r4, r2, r5
71         bics    r4, r2
72         ands    r4, r6
73         beq     3f
74
75 #ifdef __ARM_BIG_ENDIAN
76         Byte_Test #24, 4f
77         Byte_Test #16, 4f
78         Byte_Test #8, 4f
79
80         b       7f
81 3:
82         cmp     r2, r3
83         beq     1b
84         cmp     r2, r3
85 #else
86         uxtb    r0, r2
87         uxtb    r1, r3
88         DoSub   #24, 2f
89
90         uxth    r0, r2
91         uxth    r1, r3
92         DoSub   #16, 2f
93
94         lsls    r0, r2, #8
95         lsls    r1, r3, #8
96         lsrs    r0, r0, #8
97         lsrs    r1, r1, #8
98         DoSub   #8, 2f
99
100         lsrs    r0, r2, #24
101         lsrs    r1, r3, #24
102         subs    r0, r0, r1
103 2:
104         pop     {r4, r5, r6, pc}
105
106 3:
107         cmp     r2, r3
108         beq     1b
109         rev     r0, r2
110         rev     r1, r3
111         cmp     r0, r1
112 #endif
113
114         bls     5f
115         movs    r0, #1
116 4:
117         pop     {r4, r5, r6, pc}
118 5:
119         movs    r0, #0
120         mvns    r0, r0
121         pop     {r4, r5, r6, pc}
122 6:
123         ldrb    r2, [r0, #0]
124         ldrb    r3, [r1, #0]
125         adds    r0, #1
126         adds    r1, #1
127         cmp     r2, #0
128         beq     7f
129         cmp     r2, r3
130         bne     7f
131         ldrb    r2, [r0, #0]
132         ldrb    r3, [r1, #0]
133         adds    r0, #1
134         adds    r1, #1
135         cmp     r2, #0
136         beq     7f
137         cmp     r2, r3
138         beq     6b
139 7:
140         subs    r0, r2, r3
141         pop     {r4, r5, r6, pc}
142         .cfi_endproc
143         .size   strcmp, . - strcmp