1 ! Copyright (C) 2013 Imagination Technologies Ltd.
3 ! Licensed under LGPL v2.1 or later, see the file COPYING.LIB in this tarball.
8 .type _memmove,function
17 MSETL [A0StP], D0.5, D0.6, D0.7
21 SUB D0Ar4, D1Ar1, D1Ar3
25 ! should copy backwards
27 ! adjust pointer to the end of mem
28 ADD D0Ar2, D1Re0, D1Ar3
29 ADD D1Ar1, D1Ar1, D1Ar3
39 ! test 8 byte alignment
49 GETL D0Re0, D1Re0, [--A1.2]
50 SETL [--A0.2], D0Re0, D1Re0
65 MGETL D0.5, D0.6, D0.7, [A0.2]
82 ! save original address
86 ANDMB D0Ar4, D0Ar4, #0xfff8
87 ! new address is the 8-byte aligned one above the original
90 ! A0.2 dst 64-bit is aligned
91 ! measure the gap size
92 SUB D0Ar6, D0Ar4, D0Ar6
94 ! keep this information for the later adjustment
99 GETL D0Re0, D1Re0, [--A1.2]
102 BLT $Lbunaligned_1_2_3
107 ! D1.6 stores the gap size in bits
110 ! D0.6 stores the complement of the gap size
114 GETL D0.7, D1.7, [--A1.2]
115 ! form 64-bit data in D0Re0, D1Re0
118 LSL D1Re0, D1Re0, D1.6
120 ! D0Re0 >> complement
121 LSR D0Re0, D0Re0, D0.6
124 ADD D1Re0, D1Re0, D1.5
129 LSR D0Re0, D0Re0, D0.6
131 ADD D0Re0, D0Re0, D0.5
133 SETL [--A0.2], D0Re0, D1Re0
136 SUBS D1Ar5, D1Ar5, #1
137 BNE $Lbunaligned_5_6_7
139 ANDS D1Ar3, D1Ar3, #7
142 ! A1.2 <- A1.2 +8 - gapsize
144 SUB A1.2, A1.2, D0Ar4
152 $Lbunaligned_1_2_3_loop:
153 GETL D0.7, D1.7, [--A1.2]
154 ! form 64-bit data in D0Re0, D1Re0
155 LSL D1Re0, D1Re0, D1.6
156 ! save D0Re0 for later use
158 LSR D0Re0, D0Re0, D0.6
160 ADD D1Re0, D1Re0, D1.5
162 ! orignal data in D0Re0
166 LSR D0Re0, D0Re0, D0.6
168 ADD D0Re0, D0Re0, D0.5
170 SETL [--A0.2], D0Re0, D1Re0
173 SUBS D1Ar5, D1Ar5, #1
174 BNE $Lbunaligned_1_2_3_loop
176 ANDS D1Ar3, D1Ar3, #7
180 SUB A1.2, A1.2, D0Ar4
184 GETL D0.7, D1.7, [--A1.2]
187 SETL [--A0.2], D0Re0, D1Re0
190 SUBS D1Ar5, D1Ar5, #1
192 ANDS D1Ar3, D1Ar3, #7
196 SUB A1.2, A1.2, D0Ar4
208 ANDS D1Ar5, D1Ar5, #7
209 BNE $Lfdest_unaligned
211 ANDS D0Ar4, D0Ar4, #7
217 GETL D0Re0, D1Re0, [A1.2++]
218 SUBS D1Ar5, D1Ar5, #1
219 SETL [A0.2++], D0Re0, D1Re0
222 ANDS D1Ar3, D1Ar3, #7
227 SUBS D1Ar3, D1Ar3, #1
239 BNE $Lfdest_unaligned
248 ANDMB D0Ar4, D0Ar4, #0xfff8
251 ! A0.2 dst 64-bit is aligned
252 SUB D0Ar6, D0Ar6, D0Ar4
253 ! keep the information for the later adjustment
260 GETL D0Re0, D1Re0, [A1.2]
263 BLT $Lfunaligned_1_2_3
272 GETL D0.7, D1.7, [++A1.2]
273 ! form 64-bit data in D0Re0, D1Re0
275 LSR D0Re0, D0Re0, D0.6
277 LSL D1Re0, D1Re0, D1.6
279 ADD D0Re0, D0Re0, D0.5
284 LSL D1Re0, D1Re0, D1.6
286 ADD D1Re0, D1Re0, D1.5
288 SETL [A0.2++], D0Re0, D1Re0
291 SUBS D1Ar5, D1Ar5, #1
292 BNE $Lfunaligned_5_6_7
294 ANDS D1Ar3, D1Ar3, #7
297 ADD A1.2, A1.2, D0Ar4
305 $Lfunaligned_1_2_3_loop:
306 GETL D0.7, D1.7, [++A1.2]
307 ! form 64-bit data in D0Re0, D1Re0
308 LSR D0Re0, D0Re0, D0.6
310 LSL D1Re0, D1Re0, D1.6
312 ADD D0Re0, D0Re0, D0.5
317 LSL D1Re0, D1Re0, D1.6
319 ADD D1Re0, D1Re0, D1.5
321 SETL [A0.2++], D0Re0, D1Re0
324 SUBS D1Ar5, D1Ar5, #1
325 BNE $Lfunaligned_1_2_3_loop
327 ANDS D1Ar3, D1Ar3, #7
330 ADD A1.2, A1.2, D0Ar4
334 GETL D0.7, D1.7, [++A1.2]
337 SETL [A0.2++], D0Re0, D1Re0
340 SUBS D1Ar5, D1Ar5, #1
342 ANDS D1Ar3, D1Ar3, #7
345 ADD A1.2, A1.2, D0Ar4
348 .size _memmove,.-_memmove
350 libc_hidden_def(memmove)