Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#define	BDNZ	BC	16,0,
2
	TEXT	memmove(SB), $0
3
	BR	move
4
 
5
	TEXT	memcpy(SB), $0
6
move:
7
 
8
/*
9
 * performance:
10
 * (tba)
11
 */
12
 
13
	MOVW	R3, s1+0(FP)
14
	MOVW	n+8(FP), R9		/* R9 is count */
15
	MOVW	R3, R10			/* R10 is to-pointer */
16
	CMP	R9, $0
17
	BEQ	ret
18
	BLT	trap
19
	MOVW	s2+4(FP), R11		/* R11 is from-pointer */
20
 
21
/*
22
 * if no more than 16 bytes, just use one lsw/stsw
23
 */
24
	CMP	R9, $16
25
	BLE	fout
26
 
27
	ADD	R9,R11, R13		/* R13 is end from-pointer */
28
	ADD	R9,R10, R12		/* R12 is end to-pointer */
29
 
30
/*
31
 * easiest test is copy backwards if
32
 * destination string has higher mem address
33
 */
34
	CMPU	R10, R11
35
	BGT	back
36
 
37
/*
38
 * test if both pointers
39
 * are similarly word aligned
40
 */
41
	XOR	R10,R11, R7
42
	ANDCC	$3,R7
43
	BNE	fbad
44
 
45
/*
46
 * move a few bytes to align pointers
47
 */
48
	ANDCC	$3,R10,R7
49
	BEQ	f2
50
	SUBC	R7, $4, R7
51
	SUB	R7, R9
52
	MOVW	R7, XER
53
	LSW	(R11), R16
54
	ADD	R7, R11
55
	STSW	R16, (R10)
56
	ADD	R7, R10
57
 
58
/*
59
 * turn R14 into doubleword count
60
 * copy 16 bytes at a time while there's room.
61
 */
62
f2:
63
	SRAWCC	$4, R9, R14
64
	BLE	fout
65
	MOVW	R14, CTR
66
	SUB	$4, R11
67
	SUB	$4, R10
68
f3:
69
	MOVWU	4(R11), R16
70
	MOVWU	4(R11), R17
71
	MOVWU	4(R11), R18
72
	MOVWU	4(R11), R19
73
	MOVWU	R16, 4(R10)
74
	MOVWU	R17, 4(R10)
75
	MOVWU	R18, 4(R10)
76
	MOVWU	R19, 4(R10)
77
	BDNZ	f3
78
	RLWNMCC	$0, R9, $15, R9	/* residue */
79
	BEQ	ret
80
	ADD	$4, R11
81
	ADD	$4, R10
82
 
83
/*
84
 * move up to 16 bytes through R16 .. R19; aligned and unaligned
85
 */
86
fout:
87
	MOVW	R9, XER
88
	LSW	(R11), R16
89
	STSW	R16, (R10)
90
	BR	ret
91
 
92
/*
93
 * loop for unaligned copy, then copy up to 15 remaining bytes
94
 */
95
fbad:
96
	SRAWCC	$4, R9, R14
97
	BLE	f6
98
	MOVW	R14, CTR
99
f5:
100
	LSW	(R11), $16, R16
101
	ADD	$16, R11
102
	STSW	R16, $16, (R10)
103
	ADD	$16, R10
104
	BDNZ	f5
105
	RLWNMCC	$0, R9, $15, R9	/* residue */
106
	BEQ	ret
107
f6:
108
	MOVW	R9, XER
109
	LSW	(R11), R16
110
	STSW	R16, (R10)
111
	BR	ret
112
 
113
/*
114
 * whole thing repeated for backwards
115
 */
116
back:
117
	CMP	R9, $4
118
	BLT	bout
119
 
120
	XOR	R12,R13, R7
121
	ANDCC	$3,R7
122
	BNE	bout
123
b1:
124
	ANDCC	$3,R13, R7
125
	BEQ	b2
126
	MOVBZU	-1(R13), R16
127
	MOVBZU	R16, -1(R12)
128
	SUB	$1, R9
129
	BR	b1
130
b2:
131
	SRAWCC	$4, R9, R14
132
	BLE	b4
133
	MOVW	R14, CTR
134
b3:
135
	MOVWU	-4(R13), R16
136
	MOVWU	-4(R13), R17
137
	MOVWU	-4(R13), R18
138
	MOVWU	-4(R13), R19
139
	MOVWU	R16, -4(R12)
140
	MOVWU	R17, -4(R12)
141
	MOVWU	R18, -4(R12)
142
	MOVWU	R19, -4(R12)
143
	BDNZ	b3
144
	RLWNMCC	$0, R9, $15, R9	/* residue */
145
	BEQ	ret
146
b4:
147
	SRAWCC	$2, R9, R14
148
	BLE	bout
149
	MOVW	R14, CTR
150
b5:
151
	MOVWU	-4(R13), R16
152
	MOVWU	R16, -4(R12)
153
	BDNZ	b5
154
	RLWNMCC	$0, R9, $3, R9	/* residue */
155
	BEQ	ret
156
 
157
bout:
158
	CMPU	R13, R11
159
	BLE	ret
160
	MOVBZU	-1(R13), R16
161
	MOVBZU	R16, -1(R12)
162
	BR	bout
163
 
164
trap:
165
	MOVW	$0, R0
166
	MOVW	0(R0), R0
167
 
168
ret:
169
	MOVW	s1+0(FP), R3
170
	RETURN