Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
	TEXT	memmove(SB), $0
2
	JMP	move
3
 
4
	TEXT	memcpy(SB), $0
5
move:
6
 
7
/*
8
 * performance:
9
 * (tba)
10
 */
11
 
12
	MOVW	R7, s1+0(FP)
13
	MOVW	n+8(FP), R9		/* R9 is count */
14
	MOVW	R7, R10			/* R10 is to-pointer */
15
	SUBCC	R0,R9, R0
16
	BGE	ok
17
	MOVW	0(R0), R0
18
 
19
ok:
20
	MOVW	s2+4(FP), R11		/* R11 is from-pointer */
21
	ADD	R9,R11, R13		/* R13 is end from-pointer */
22
	ADD	R9,R10, R12		/* R12 is end to-pointer */
23
 
24
/*
25
 * easiest test is copy backwards if
26
 * destination string has higher mem address
27
 */
28
	SUBCC	R11,R10, R0
29
	BGU	back
30
 
31
/*
32
 * if not at least 8 chars,
33
 * dont even mess around.
34
 * 7 chars to guarantee any
35
 * rounding up to a word
36
 * boundary and 8 characters
37
 * to get at least maybe one
38
 * full word store.
39
 */
40
	SUBCC	$8,R9, R0
41
	BL	fout
42
 
43
/*
44
 * test if both pointers
45
 * are similarly word aligned
46
 */
47
	XOR	R10,R11, R7
48
	ANDCC	$7,R7, R0
49
	BNE	fout
50
 
51
/*
52
 * byte at a time to double align
53
 */
54
f1:
55
	ANDCC	$7,R10, R0
56
	BE	f2
57
	MOVB	0(R11), R16
58
	ADD	$1, R11
59
	MOVB	R16, 0(R10)
60
	ADD	$1, R10
61
	JMP	f1
62
 
63
/*
64
 * turn R9 into to-end pointer-15
65
 * copy 16 at a time while theres room.
66
 * R12 is smaller than R13 --
67
 * there are problems if R13 is 0.
68
 */
69
f2:
70
	SUB	$15,R12, R9
71
f3:
72
	SUBCC	R10,R9, R0
73
	BLEU	f4
74
	MOVD	0(R11), R16
75
	MOVD	R16, 0(R10)
76
	MOVD	8(R11), R16
77
	ADD	$16, R11
78
	MOVD	R16, 8(R10)
79
	ADD	$16, R10
80
	JMP	f3
81
 
82
/*
83
 * turn R9 into to-end pointer-3
84
 * copy 4 at a time while theres room
85
 */
86
f4:
87
	SUB	$3,R12, R9
88
f5:
89
	SUBCC	R10,R9, R0
90
	BLEU	fout
91
	MOVW	0(R11), R16
92
	ADD	$4, R11
93
	MOVW	R16, 0(R10)
94
	ADD	$4, R10
95
	JMP	f5
96
 
97
/*
98
 * last loop, copy byte at a time
99
 */
100
fout:
101
	SUBCC	R11,R13, R0
102
	BLEU	ret
103
	MOVB	0(R11), R16
104
	ADD	$1, R11
105
	MOVB	R16, 0(R10)
106
	ADD	$1, R10
107
	JMP	fout
108
 
109
/*
110
 * whole thing repeated for backwards
111
 */
112
back:
113
	SUBCC	$8,R9, R0 
114
	BL	bout
115
 
116
	XOR	R12,R13, R7
117
	ANDCC	$7,R7, R0
118
	BNE	bout
119
b1:
120
	ANDCC	$7,R13, R0
121
	BE	b2
122
	MOVB	-1(R13), R16
123
	SUB	$1, R13
124
	MOVB	R16, -1(R12)
125
	SUB	$1, R12
126
	JMP	b1
127
b2:
128
	ADD	$15,R11, R9
129
b3:
130
	SUBCC	R9,R13, R0
131
	BLEU	b4
132
 
133
	MOVD	-8(R13), R16
134
	MOVD	R16, -8(R12)
135
	MOVD	-16(R13), R16
136
	SUB	$16, R13
137
	MOVD	R16, -16(R12);
138
	SUB	$16, R12
139
	JMP	b3
140
b4:
141
	ADD	$3,R11, R9
142
b5:
143
	SUBCC	R9,R13, R0
144
	BLEU	bout
145
	MOVW	-4(R13), R16
146
	SUB	$4, R13
147
	MOVW	R16, -4(R12)
148
	SUB	$4, R12
149
	JMP	b5
150
 
151
bout:
152
	SUBCC	R11,R13, R0
153
	BLEU	ret
154
	MOVB	-1(R13), R16
155
	SUB	$1, R13
156
	MOVB	R16, -1(R12)
157
	SUB	$1, R12
158
	JMP	bout
159
 
160
ret:
161
	MOVW	s1+0(FP), R7
162
	RETURN