]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libc/mips/memmove.s
merge
[plan9front.git] / sys / src / libc / mips / memmove.s
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