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