xref: /netbsd-src/sys/arch/vax/boot/common/str.S (revision 6a6027692662ba623e7bf5274322989a7b5d1440)
1*6a602769Sragge/*	$NetBSD: str.S,v 1.6 2017/05/22 17:00:19 ragge Exp $ */
228b1aa2bSmatt/*
328b1aa2bSmatt * Copyright (c) 1996 Ludd, University of Lule}, Sweden.
428b1aa2bSmatt * All rights reserved.
528b1aa2bSmatt *
628b1aa2bSmatt * Redistribution and use in source and binary forms, with or without
728b1aa2bSmatt * modification, are permitted provided that the following conditions
828b1aa2bSmatt * are met:
928b1aa2bSmatt * 1. Redistributions of source code must retain the above copyright
1028b1aa2bSmatt *    notice, this list of conditions and the following disclaimer.
1128b1aa2bSmatt * 2. Redistributions in binary form must reproduce the above copyright
1228b1aa2bSmatt *    notice, this list of conditions and the following disclaimer in the
1328b1aa2bSmatt *    documentation and/or other materials provided with the distribution.
1428b1aa2bSmatt *
1528b1aa2bSmatt * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1628b1aa2bSmatt * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1728b1aa2bSmatt * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1828b1aa2bSmatt * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
1928b1aa2bSmatt * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2028b1aa2bSmatt * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2128b1aa2bSmatt * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2228b1aa2bSmatt * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2328b1aa2bSmatt * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2428b1aa2bSmatt * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2528b1aa2bSmatt */
2628b1aa2bSmatt
2728b1aa2bSmatt/*
2828b1aa2bSmatt * Small versions of the most common functions not using any
2928b1aa2bSmatt * emulated instructions.
3028b1aa2bSmatt */
3128b1aa2bSmatt
3228b1aa2bSmatt#include "asm.h"
3328b1aa2bSmatt
3428b1aa2bSmatt/*
3528b1aa2bSmatt * atoi() used in devopen.
3628b1aa2bSmatt */
3728b1aa2bSmattENTRY(atoi, 0)
3828b1aa2bSmatt	movl	4(%ap),%r1
3928b1aa2bSmatt	clrl	%r0
4028b1aa2bSmatt
4128b1aa2bSmatt2:	movzbl	(%r1)+,%r2
4228b1aa2bSmatt	cmpb	%r2,$48
4328b1aa2bSmatt	blss	1f
4428b1aa2bSmatt	cmpb	%r2,$57
4528b1aa2bSmatt	bgtr	1f
4628b1aa2bSmatt	subl2	$48,%r2
4728b1aa2bSmatt	mull2	$10,%r0
4828b1aa2bSmatt	addl2	%r2,%r0
4928b1aa2bSmatt	brb	2b
5028b1aa2bSmatt1:	ret
5128b1aa2bSmatt
5228b1aa2bSmatt/*
53d944bca9Sjdolecek * strchr() small and easy.
5428b1aa2bSmatt */
55d944bca9SjdolecekENTRY(strchr, 0)
5628b1aa2bSmatt	movq	4(%ap),%r0
574728b048Sragge1:	cmpb	(%r0), 8(%ap)
5828b1aa2bSmatt	beql	2f
5928b1aa2bSmatt	tstb	(%r0)+
6028b1aa2bSmatt	bneq	1b
6128b1aa2bSmatt	clrl	%r0
6228b1aa2bSmatt2:	ret
6328b1aa2bSmatt
6428b1aa2bSmatt/*
6528b1aa2bSmatt * cmpc3 is emulated on MVII.
6628b1aa2bSmatt */
67fe89b1dbSdslENTRY(memcmp, 0)
68fe89b1dbSdsl	brb	10f
6928b1aa2bSmattENTRY(bcmp, 0)
70fe89b1dbSdsl10:	movl	4(%ap), %r2
7128b1aa2bSmatt	movl	8(%ap), %r1
7228b1aa2bSmatt	movl	12(%ap), %r0
7328b1aa2bSmatt2:	cmpb	(%r2)+, (%r1)+
7428b1aa2bSmatt	bneq	1f
754728b048Sragge	sobgtr	%r0, 2b
76fe89b1dbSdsl3:	ret
77fe89b1dbSdsl1:	bgtru	5f
78fe89b1dbSdsl	movl	$-1, %r0
79fe89b1dbSdsl	brb	3b
80fe89b1dbSdsl5:	movl    $1, %r0
81fe89b1dbSdsl	ret
8228b1aa2bSmatt
8328b1aa2bSmatt/*
844728b048Sragge * movc can't do length in excess of 64K, so we shall not use them.
8528b1aa2bSmatt */
8628b1aa2bSmattENTRY(bzero,0)
874728b048Sragge	movl	4(%ap),%r0
884728b048Sragge	movl	8(%ap),%r1
894728b048Sragge1:	clrb	(%r0)+
904728b048Sragge	sobgtr	%r1,1b
9128b1aa2bSmatt	ret
9228b1aa2bSmatt
934728b048Sragge/*
944728b048Sragge * memcpy and bcopy are the same, except for argument order. Silly stuff.
954728b048Sragge */
964728b048SraggeENTRY(memcpy,0)
974728b048Sragge	movl	8(%ap),%r0
984728b048Sragge	movl	4(%ap),%r1
994728b048Sragge	brb	1f
10028b1aa2bSmattENTRY(bcopy,0)
1014728b048Sragge	movl	4(%ap),%r0
1024728b048Sragge	movl	8(%ap),%r1
1034728b048Sragge1:	movl	12(%ap),%r2
1044728b048Sragge	cmpl	%r0,%r1
1054728b048Sragge	bgtru	3f
1064728b048Sragge	addl2	%r2,%r0
1074728b048Sragge	addl2	%r2,%r1
1084728b048Sragge2:	movb	-(%r0),-(%r1)
1094728b048Sragge	sobgtr	%r2,2b
1104728b048Sragge	ret
1114728b048Sragge3:	movb	(%r0)+,(%r1)+
1124728b048Sragge	sobgtr	%r2,3b
11328b1aa2bSmatt	ret
11428b1aa2bSmatt
115fe89b1dbSdslENTRY(memset,0)
116fe89b1dbSdsl	movl	4(%ap),%r0
1174728b048Sragge	movl	12(%ap),%r1
1184728b048Sragge1:	movb	8(%ap),(%r0)+
1194728b048Sragge	sobgtr	%r1,1b
120fe89b1dbSdsl	ret
121fe89b1dbSdsl
12228b1aa2bSmattENTRY(strlen, 0)
12328b1aa2bSmatt	movl	4(%ap), %r0
12428b1aa2bSmatt1:	tstb	(%r0)+
12528b1aa2bSmatt	bneq	1b
12628b1aa2bSmatt	decl	%r0
12728b1aa2bSmatt	subl2	4(%ap), %r0
12828b1aa2bSmatt	ret
12928b1aa2bSmatt
13028b1aa2bSmattENTRY(strncmp, 0)
13128b1aa2bSmatt	movl	12(%ap), %r3
132fe89b1dbSdsl	bneq	5f
133fe89b1dbSdsl	brb	4f
13428b1aa2bSmatt
13528b1aa2bSmattENTRY(strcmp, 0)
13628b1aa2bSmatt	movl	$250, %r3	# max string len to compare
13728b1aa2bSmatt5:	movl	4(%ap), %r2
13828b1aa2bSmatt	movl	8(%ap), %r1
13928b1aa2bSmatt	movl	$1, %r0
14028b1aa2bSmatt
14128b1aa2bSmatt2:	cmpb	(%r2),(%r1)+
14228b1aa2bSmatt	bneq	1f		# something differ
14328b1aa2bSmatt	tstb	(%r2)+
14428b1aa2bSmatt	beql	4f		# continue, strings unequal
14528b1aa2bSmatt	decl	%r3		# max string len encountered?
14628b1aa2bSmatt	bneq	2b
14728b1aa2bSmatt
14828b1aa2bSmatt4:	clrl	%r0		# We are done, strings equal.
14928b1aa2bSmatt	ret
15028b1aa2bSmatt
151fe89b1dbSdsl1:	bgtru	3f
15228b1aa2bSmatt	mnegl	%r0, %r0
15328b1aa2bSmatt3:	ret
15428b1aa2bSmatt
15528b1aa2bSmattENTRY(strncpy, 0)
15628b1aa2bSmatt	movl	4(%ap), %r1
15728b1aa2bSmatt	movl	8(%ap), %r2
15828b1aa2bSmatt	movl	12(%ap), %r3
15928b1aa2bSmatt	bleq	2f
16028b1aa2bSmatt
16128b1aa2bSmatt1:	movb	(%r2)+, (%r1)+
16228b1aa2bSmatt	beql	2f
1634728b048Sragge	sobgtr	%r3,1b
1644728b048Sragge	ret
1654728b048Sragge2:	decl	%r1
1664728b048Sragge3:	clrb	(%r1)+
1674728b048Sragge	sobgtr	%r3,3b
1684728b048Sragge	ret
16928b1aa2bSmatt
17028b1aa2bSmattENTRY(strcat, 0)
17128b1aa2bSmatt	pushl	4(%ap)
17228b1aa2bSmatt	calls	$1,_C_LABEL(strlen)
17328b1aa2bSmatt	addl2	4(%ap),%r0
17428b1aa2bSmatt	movl	8(%ap),%r1
17528b1aa2bSmatt1:	movb	(%r1)+,(%r0)+
17628b1aa2bSmatt	bneq	1b
17728b1aa2bSmatt	ret
17828b1aa2bSmatt
17928b1aa2bSmattENTRY(setjmp, 0)
18028b1aa2bSmatt	movl	4(%ap), %r0
18128b1aa2bSmatt	movl	8(%fp), (%r0)
18228b1aa2bSmatt	movl	12(%fp), 4(%r0)
18328b1aa2bSmatt	movl	16(%fp), 8(%r0)
18428b1aa2bSmatt	addl3	%fp,$28,12(%r0)
18528b1aa2bSmatt	clrl	%r0
18628b1aa2bSmatt	ret
18728b1aa2bSmatt
18828b1aa2bSmattENTRY(longjmp, 0)
18928b1aa2bSmatt	movl	4(%ap), %r1
19028b1aa2bSmatt	movl	8(%ap), %r0
19128b1aa2bSmatt	movl	(%r1), %ap
19228b1aa2bSmatt	movl	4(%r1), %fp
19328b1aa2bSmatt	movl	12(%r1), %sp
19428b1aa2bSmatt	jmp	*8(%r1)
19528b1aa2bSmatt
196