Welcome to mirror list, hosted at ThFree Co, Russian Federation.

memset.S « z8k « machine « libc « newlib - cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 43184c7093480827891b56affb91490fd5f2cb13 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/*
 * memset routine for Z8000
 * Copyright (C) 2004 Christian Groessler <chris@groessler.org>
 *
 * Permission to use, copy, modify, and distribute this file
 * for any purpose is hereby granted without fee, provided that
 * the above copyright notice and this notice appears in all
 * copies.
 *
 * This file is distributed WITHOUT ANY WARRANTY; without even the implied
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 */

/* void *memset(void *buffer, int value, size_t length);
 */

	name	"memset.S"

	.text
	even
global	_memset

_memset:

#ifdef __Z8001__
	segm

#ifdef __STD_CALL__
	ldl	rr6,rr14(#4)
	ld	r5,rr14(#8)
	ldl	rr2,rr14(#10)
#else
	pushl	@rr14,rr6
#endif

/* rr2  - length
 * rl5  - value
 * rr6  - buffer
 */
	testl	rr2
	jr	z,finish

	ldb	rh5,rl5
	ld	r1,r5		/* r1 contains value */
	bit	r7,#0
	jr	z,not_odd

	ldb	@rr6,rl1
	inc	r7,#1
	subl	rr2,#1
	jr	z,finish

not_odd:ld	r0,r3		/* remember length */
	srl	r3,#1
	jr	z,no_words

	ldl	rr4,rr6
	ld	@rr6,r1
	inc	r7,#2
	dec	r3,#1
	jr	z,no_words

	ldir	@rr6,@rr4,r3	/* fill words */

no_words:
	bit	r0,#0		/* one byte remaining? */
	jr	z,finish

	ldb	@rr6,rl1

finish:
#ifdef __STD_CALL__
	ldl	rr6,rr14(#4)
#else
	popl	rr2,@rr14
#endif


#else		/* above Z8001, below Z8002 */


	unsegm

#ifdef __STD_CALL__
	ld	r7,r15(#2)
	ld	r6,r15(#4)
	ld	r5,r15(#6)
#else
	ld	r2,r7		/* buffer pointer return value */
#endif

/* r5  - length
 * r6  - value
 * r7  - buffer
 */
	test	r5
	jr	z,finish

	ldb	rh6,rl6
	ld	r1,r6		/* r1 contains value */
	bit	r7,#0
	jr	z,not_odd

	ldb	@r7,rl1
	inc	r7,#1
	dec	r5,#1
	jr	z,finish

not_odd:ld	r0,r5		/* remember length */
	srl	r5,#1
	jr	z,no_words

	ld	r4,r7
	ld	@r7,r1
	inc	r7,#2
	dec	r5,#1
	jr	z,no_words

	ldir	@r7,@r4,r5	/* fill words */

no_words:
	bit	r0,#0		/* one byte remaining? */
	jr	z,finish

	ldb	@r7,rl1

finish:
#ifdef __STD_CALL__
	ld	r7,r15(#2)
#endif

#endif	/* Z8002 */

	ret
	.end