1/*	$NetBSD: memset.S,v 1.1 2020/08/16 06:43:43 isaki Exp $	*/
2
3/*
4 * Copyright (C) 2020 Tetsuya Isaki. All rights reserved.
5 * Copyright (C) 2020 Y.Sugahara (moveccr). All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
29/*
30 * Size optimized (but slow) version for primary bootloader.
31 */
32
33#include <machine/asm.h>
34
35|
36| void bzero(void *dst, size_t len)
37|
38ASENTRY_NOPROFILE(bzero)
39		moveml	%sp@,%d0-%d1/%a1	| %d0: (return address)
40						| %d1: dst
41						| %a1: len
42
43		subal	%a0,%a0			| %a0: c = 0
44		jbra	memset_common
45
46|
47| void *memset(void *dst, int c, size_t len);
48|
49ASENTRY_NOPROFILE(memset)
50		moveml	%sp@,%d0-%d1/%a0-%a1	| %d0: (return address)
51						| %d1: dst
52						| %a0: c
53						| %a1: len
54memset_common:
55		addal	%d1,%a1			| %a1: loop start+1 address
56
57		exg	%d1,%a0			| %d1: c
58						| %a0: initial dst
59						|  for return value and
60						|  loop-end condition address
61		jbra	2f
621:
63		moveb	%d1,%a1@-		| memset in reverse direction
642:
65		cmpl	%a1,%a0
66		jne	1b			| if condition met, %a0 = dst
67		rts
68
69
70#if defined(SELFTEST)
71#include "iocscall.h"
72		.macro	PRINT	msg
73		leal	\msg,%a1
74		IOCS(__B_PRINT)
75		.endm
76
77		.macro	TEST	name
78		leal	\name,%a2
79		jbsr	test
80		.endm
81
82ASENTRY_NOPROFILE(selftest_memset)
83		moveml	%d2-%d7/%a2-%a6,%sp@-
84		PRINT	%pc@(msg_testname)
85
86		TEST	test1
87		TEST	test2
88
89		PRINT	%pc@(msg_crlf)
90		moveml	%sp@+,%d2-%d7/%a2-%a6
91		rts
92
93test:
94		movel	%a2@+,buf:W		| initial contents of buffer
95		movel	%a2@+,%sp@-		| push len
96		movel	%a2@+,%sp@-		| push c
97		movel	%a2@+,%a3		| keep dst and
98		movel	%a3,%sp@-		| push dst
99		jbsr	memset
100		leal	%sp@(12),%sp
101
102		cmpal	%a3,%a0			| compare return value
103		jne	fail
104		movel	%a2@+,%d0		| compare buf[0..4]
105		cmpl	buf:W,%d0
106		jne	fail
107		PRINT	%pc@(msg_ok)
108		rts
109fail:
110		PRINT	%pc@(msg_fail)
111		rts
112
113test1:
114		.long	0x11223344		| initial buf
115		.long	2			| len
116		.long	0xaa			| c
117		.long	buf+1			| dst
118		.long	0x11aaaa44		| expected buf
119
120test2:
121		| len == 0
122		.long	0x11223344		| initial buf
123		.long	0			| len
124		.long	0x55			| c
125		.long	buf+1			| dst
126		.long	0x11223344		| expected buf
127
128msg_testname:
129		.asciz	"memset"
130msg_ok:
131		.asciz	" ok"
132msg_fail:
133		.asciz	" fail"
134msg_crlf:
135		.asciz	"\r\n"
136
137		BSS(buf, 8)
138#endif
139