xref: /netbsd-src/sys/arch/vax/boot/common/str.S (revision 6a6027692662ba623e7bf5274322989a7b5d1440)
1/*	$NetBSD: str.S,v 1.6 2017/05/22 17:00:19 ragge Exp $ */
2/*
3 * Copyright (c) 1996 Ludd, University of Lule}, Sweden.
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 *    notice, this list of conditions and the following disclaimer in the
13 *    documentation and/or other materials provided with the distribution.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 */
26
27/*
28 * Small versions of the most common functions not using any
29 * emulated instructions.
30 */
31
32#include "asm.h"
33
34/*
35 * atoi() used in devopen.
36 */
37ENTRY(atoi, 0)
38	movl	4(%ap),%r1
39	clrl	%r0
40
412:	movzbl	(%r1)+,%r2
42	cmpb	%r2,$48
43	blss	1f
44	cmpb	%r2,$57
45	bgtr	1f
46	subl2	$48,%r2
47	mull2	$10,%r0
48	addl2	%r2,%r0
49	brb	2b
501:	ret
51
52/*
53 * strchr() small and easy.
54 */
55ENTRY(strchr, 0)
56	movq	4(%ap),%r0
571:	cmpb	(%r0), 8(%ap)
58	beql	2f
59	tstb	(%r0)+
60	bneq	1b
61	clrl	%r0
622:	ret
63
64/*
65 * cmpc3 is emulated on MVII.
66 */
67ENTRY(memcmp, 0)
68	brb	10f
69ENTRY(bcmp, 0)
7010:	movl	4(%ap), %r2
71	movl	8(%ap), %r1
72	movl	12(%ap), %r0
732:	cmpb	(%r2)+, (%r1)+
74	bneq	1f
75	sobgtr	%r0, 2b
763:	ret
771:	bgtru	5f
78	movl	$-1, %r0
79	brb	3b
805:	movl    $1, %r0
81	ret
82
83/*
84 * movc can't do length in excess of 64K, so we shall not use them.
85 */
86ENTRY(bzero,0)
87	movl	4(%ap),%r0
88	movl	8(%ap),%r1
891:	clrb	(%r0)+
90	sobgtr	%r1,1b
91	ret
92
93/*
94 * memcpy and bcopy are the same, except for argument order. Silly stuff.
95 */
96ENTRY(memcpy,0)
97	movl	8(%ap),%r0
98	movl	4(%ap),%r1
99	brb	1f
100ENTRY(bcopy,0)
101	movl	4(%ap),%r0
102	movl	8(%ap),%r1
1031:	movl	12(%ap),%r2
104	cmpl	%r0,%r1
105	bgtru	3f
106	addl2	%r2,%r0
107	addl2	%r2,%r1
1082:	movb	-(%r0),-(%r1)
109	sobgtr	%r2,2b
110	ret
1113:	movb	(%r0)+,(%r1)+
112	sobgtr	%r2,3b
113	ret
114
115ENTRY(memset,0)
116	movl	4(%ap),%r0
117	movl	12(%ap),%r1
1181:	movb	8(%ap),(%r0)+
119	sobgtr	%r1,1b
120	ret
121
122ENTRY(strlen, 0)
123	movl	4(%ap), %r0
1241:	tstb	(%r0)+
125	bneq	1b
126	decl	%r0
127	subl2	4(%ap), %r0
128	ret
129
130ENTRY(strncmp, 0)
131	movl	12(%ap), %r3
132	bneq	5f
133	brb	4f
134
135ENTRY(strcmp, 0)
136	movl	$250, %r3	# max string len to compare
1375:	movl	4(%ap), %r2
138	movl	8(%ap), %r1
139	movl	$1, %r0
140
1412:	cmpb	(%r2),(%r1)+
142	bneq	1f		# something differ
143	tstb	(%r2)+
144	beql	4f		# continue, strings unequal
145	decl	%r3		# max string len encountered?
146	bneq	2b
147
1484:	clrl	%r0		# We are done, strings equal.
149	ret
150
1511:	bgtru	3f
152	mnegl	%r0, %r0
1533:	ret
154
155ENTRY(strncpy, 0)
156	movl	4(%ap), %r1
157	movl	8(%ap), %r2
158	movl	12(%ap), %r3
159	bleq	2f
160
1611:	movb	(%r2)+, (%r1)+
162	beql	2f
163	sobgtr	%r3,1b
164	ret
1652:	decl	%r1
1663:	clrb	(%r1)+
167	sobgtr	%r3,3b
168	ret
169
170ENTRY(strcat, 0)
171	pushl	4(%ap)
172	calls	$1,_C_LABEL(strlen)
173	addl2	4(%ap),%r0
174	movl	8(%ap),%r1
1751:	movb	(%r1)+,(%r0)+
176	bneq	1b
177	ret
178
179ENTRY(setjmp, 0)
180	movl	4(%ap), %r0
181	movl	8(%fp), (%r0)
182	movl	12(%fp), 4(%r0)
183	movl	16(%fp), 8(%r0)
184	addl3	%fp,$28,12(%r0)
185	clrl	%r0
186	ret
187
188ENTRY(longjmp, 0)
189	movl	4(%ap), %r1
190	movl	8(%ap), %r0
191	movl	(%r1), %ap
192	movl	4(%r1), %fp
193	movl	12(%r1), %sp
194	jmp	*8(%r1)
195
196