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
 * test if both pointers
40
 * are similarly word aligned
41
 */
42
	XOR	R4,R5, R1
43
	AND	$3, R1
44
	BNE	R1, fout
45
 
46
/*
47
 * byte at a time to word align
48
 */
49
f1:
50
	AND	$3,R4, R1
51
	BEQ	R1, f2
52
	MOVB	0(R5), R8
53
	ADDU	$1, R5
54
	MOVB	R8, 0(R4)
55
	ADDU	$1, R4
56
	JMP	f1
57
 
58
/*
59
 * turn R3 into to-end pointer-15
60
 * copy 16 at a time while theres room.
61
 * R6 is smaller than R7 --
62
 * there are problems if R7 is 0.
63
 */
64
f2:
65
	ADDU	$-15,R6, R3
66
f3:
67
	SGTU	R3,R4, R1
68
	BEQ	R1, f4
69
	MOVW	0(R5), R8
70
	MOVW	4(R5), R9
71
	MOVW	R8, 0(R4)
72
	MOVW	8(R5), R8
73
	MOVW	R9, 4(R4)
74
	MOVW	12(R5), R9
75
	ADDU	$16, R5
76
	MOVW	R8, 8(R4)
77
	MOVW	R9, 12(R4)
78
	ADDU	$16, R4
79
	JMP	f3
80
 
81
/*
82
 * turn R3 into to-end pointer-3
83
 * copy 4 at a time while theres room
84
 */
85
f4:
86
	ADDU	$-3,R6, R3
87
f5:
88
	SGTU	R3,R4, R1
89
	BEQ	R1, fout
90
	MOVW	0(R5), R8
91
	ADDU	$4, R5
92
	MOVW	R8, 0(R4)
93
	ADDU	$4, R4
94
	JMP	f5
95
 
96
/*
97
 * last loop, copy byte at a time
98
 */
99
fout:
100
	BEQ	R7,R5, ret
101
	MOVB	0(R5), R8
102
	ADDU	$1, R5
103
	MOVB	R8, 0(R4)
104
	ADDU	$1, R4
105
	JMP	fout
106
 
107
/*
108
 * whole thing repeated for backwards
109
 */
110
back:
111
	BNE	R2, bout
112
	XOR	R6,R7, R1
113
	AND	$3, R1
114
	BNE	R1, bout
115
b1:
116
	AND	$3,R7, R1
117
	BEQ	R1, b2
118
	MOVB	-1(R7), R8
119
	ADDU	$-1, R7
120
	MOVB	R8, -1(R6)
121
	ADDU	$-1, R6
122
	JMP	b1
123
b2:
124
	ADDU	$15,R5, R3
125
b3:
126
	SGTU	R7,R3, R1
127
	BEQ	R1, b4
128
	MOVW	-4(R7), R8
129
	MOVW	-8(R7), R9
130
	MOVW	R8, -4(R6)
131
	MOVW	-12(R7), R8
132
	MOVW	R9, -8(R6)
133
	MOVW	-16(R7), R9
134
	ADDU	$-16, R7
135
	MOVW	R8, -12(R6)
136
	MOVW	R9, -16(R6)
137
	ADDU	$-16, R6
138
	JMP	b3
139
b4:
140
	ADDU	$3,R5, R3
141
b5:
142
	SGTU	R7,R3, R1
143
	BEQ	R1, bout
144
	MOVW	-4(R7), R8
145
	ADDU	$-4, R7
146
	MOVW	R8, -4(R6)
147
	ADDU	$-4, R6
148
	JMP	b5
149
 
150
bout:
151
	BEQ	R7,R5, ret
152
	MOVB	-1(R7), R8
153
	ADDU	$-1, R7
154
	MOVB	R8, -1(R6)
155
	ADDU	$-1, R6
156
	JMP	bout
157
 
158
ret:
159
	MOVW	s1+0(FP), R1
160
	RET
161
	END