Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
	TEXT	memmove(SB), $0
2
 
3
	JMP	move
4
 
5
	TEXT	memcpy(SB), $0
6
move:
7
	MOVW	R1, s1+0(FP)
8
 
9
	MOVW	n+8(FP), R3		/* R3 is count */
10
	MOVW	R1, R4			/* R4 is to-pointer */
11
	SGT	R0, R3, R5
12
	BEQ	R5, ok
13
	MOVW	(R0), R0		/* abort if negative count */
14
ok:
15
	MOVW	s2+4(FP), R5		/* R5 is from-pointer */
16
	ADDU	R3,R5, R7		/* R7 is end from-pointer */
17
	ADDU	R3,R4, R6		/* R6 is end to-pointer */
18
 
19
/*
20
 * easiest test is copy backwards if
21
 * destination string has higher mem address
22
 */
23
	SGT	$4,R3, R2
24
	SGTU	R4,R5, R1
25
	BNE	R1, back
26
 
27
/*
28
 * if not at least 4 chars,
29
 * don't even mess around.
30
 * 3 chars to guarantee any
31
 * rounding up to a word
32
 * boundary and 4 characters
33
 * to get at least maybe one
34
 * full word store.
35
 */
36
	BNE	R2, fout
37
 
38
 
39
/*
40
 * byte at a time to word align destination
41
 */
42
f1:
43
	AND	$3,R4, R1
44
	BEQ	R1, f2
45
	MOVB	0(R5), R8
46
	ADDU	$1, R5
47
	MOVB	R8, 0(R4)
48
	ADDU	$1, R4
49
	JMP	f1
50
 
51
/*
52
 * test if source is now word aligned
53
 */
54
f2:
55
	AND	$3, R5, R1
56
	BNE	R1, fun2
57
/*
58
 * turn R3 into to-end pointer-15
59
 * copy 16 at a time while theres room.
60
 * R6 is smaller than R7 --
61
 * there are problems if R7 is 0.
62
 */
63
	ADDU	$-15,R6, R3
64
f3:
65
	SGTU	R3,R4, R1
66
	BEQ	R1, f4
67
	MOVW	0(R5), R8
68
	MOVW	4(R5), R9
69
	MOVW	R8, 0(R4)
70
	MOVW	8(R5), R8
71
	MOVW	R9, 4(R4)
72
	MOVW	12(R5), R9
73
	ADDU	$16, R5
74
	MOVW	R8, 8(R4)
75
	MOVW	R9, 12(R4)
76
	ADDU	$16, R4
77
	JMP	f3
78
 
79
/*
80
 * turn R3 into to-end pointer-3
81
 * copy 4 at a time while theres room
82
 */
83
f4:
84
	ADDU	$-3,R6, R3
85
f5:
86
	SGTU	R3,R4, R1
87
	BEQ	R1, fout
88
	MOVW	0(R5), R8
89
	ADDU	$4, R5
90
	MOVW	R8, 0(R4)
91
	ADDU	$4, R4
92
	JMP	f5
93
 
94
/*
95
 * forward copy, unaligned
96
 * turn R3 into to-end pointer-15
97
 * copy 16 at a time while theres room.
98
 * R6 is smaller than R7 --
99
 * there are problems if R7 is 0.
100
 */
101
fun2:
102
	ADDU	$-15,R6, R3
103
fun3:
104
	SGTU	R3,R4, R1
105
	BEQ	R1, fun4
106
	MOVWL	0(R5), R8
107
	MOVWR	3(R5), R8
108
	MOVWL	4(R5), R9
109
	MOVWR	7(R5), R9
110
	MOVW	R8, 0(R4)
111
	MOVWL	8(R5), R8
112
	MOVWR	11(R5), R8
113
	MOVW	R9, 4(R4)
114
	MOVWL	12(R5), R9
115
	MOVWR	15(R5), R9
116
	ADDU	$16, R5
117
	MOVW	R8, 8(R4)
118
	MOVW	R9, 12(R4)
119
	ADDU	$16, R4
120
	JMP	fun3
121
 
122
/*
123
 * turn R3 into to-end pointer-3
124
 * copy 4 at a time while theres room
125
 */
126
fun4:
127
	ADDU	$-3,R6, R3
128
fun5:
129
	SGTU	R3,R4, R1
130
	BEQ	R1, fout
131
	MOVWL	0(R5), R8
132
	MOVWR	3(R5), R8
133
	ADDU	$4, R5
134
	MOVW	R8, 0(R4)
135
	ADDU	$4, R4
136
	JMP	fun5
137
 
138
/*
139
 * last loop, copy byte at a time
140
 */
141
fout:
142
	BEQ	R7,R5, ret
143
	MOVB	0(R5), R8
144
	ADDU	$1, R5
145
	MOVB	R8, 0(R4)
146
	ADDU	$1, R4
147
	JMP	fout
148
 
149
/*
150
 * whole thing repeated for backwards
151
 */
152
back:
153
	BNE	R2, bout
154
b1:
155
	AND	$3,R6, R1
156
	BEQ	R1, b2
157
	MOVB	-1(R7), R8
158
	ADDU	$-1, R7
159
	MOVB	R8, -1(R6)
160
	ADDU	$-1, R6
161
	JMP	b1
162
 
163
b2:
164
	AND	$3, R7, R1
165
	BNE	R1, bun2
166
 
167
	ADDU	$15,R5, R3
168
b3:
169
	SGTU	R7,R3, R1
170
	BEQ	R1, b4
171
	MOVW	-4(R7), R8
172
	MOVW	-8(R7), R9
173
	MOVW	R8, -4(R6)
174
	MOVW	-12(R7), R8
175
	MOVW	R9, -8(R6)
176
	MOVW	-16(R7), R9
177
	ADDU	$-16, R7
178
	MOVW	R8, -12(R6)
179
	MOVW	R9, -16(R6)
180
	ADDU	$-16, R6
181
	JMP	b3
182
b4:
183
	ADDU	$3,R5, R3
184
b5:
185
	SGTU	R7,R3, R1
186
	BEQ	R1, bout
187
	MOVW	-4(R7), R8
188
	ADDU	$-4, R7
189
	MOVW	R8, -4(R6)
190
	ADDU	$-4, R6
191
	JMP	b5
192
 
193
bun2:
194
	ADDU	$15,R5, R3
195
bun3:
196
	SGTU	R7,R3, R1
197
	BEQ	R1, bun4
198
	MOVWL	-4(R7), R8
199
	MOVWR	-1(R7), R8
200
	MOVWL	-8(R7), R9
201
	MOVWR	-5(R7), R9
202
	MOVW	R8, -4(R6)
203
	MOVWL	-12(R7), R8
204
	MOVWR	-9(R7), R8
205
	MOVW	R9, -8(R6)
206
	MOVWL	-16(R7), R9
207
	MOVWR	-13(R7), R9
208
	ADDU	$-16, R7
209
	MOVW	R8, -12(R6)
210
	MOVW	R9, -16(R6)
211
	ADDU	$-16, R6
212
	JMP	bun3
213
 
214
bun4:
215
	ADDU	$3,R5, R3
216
bun5:
217
	SGTU	R7,R3, R1
218
	BEQ	R1, bout
219
	MOVWL	-4(R7), R8
220
	MOVWR	-1(R7), R8
221
	ADDU	$-4, R7
222
	MOVW	R8, -4(R6)
223
	ADDU	$-4, R6
224
	JMP	bun5
225
 
226
bout:
227
	BEQ	R7,R5, ret
228
	MOVB	-1(R7), R8
229
	ADDU	$-1, R7
230
	MOVB	R8, -1(R6)
231
	ADDU	$-1, R6
232
	JMP	bout
233
 
234
ret:
235
	MOVW	s1+0(FP), R1
236
	RET
237
	END