1 ! Copyright (C) 2008-2012 Imagination Technologies Ltd.
5 .type _memmove,function
14 MSETL [A0StP], D0.5, D0.6, D0.7
18 SUB D0Ar4, D1Ar1, D1Ar3
22 ! should copy backwards
24 ! adjust pointer to the end of mem
25 ADD D0Ar2, D1Re0, D1Ar3
26 ADD D1Ar1, D1Ar1, D1Ar3
36 ! test 8 byte alignment
46 GETL D0Re0, D1Re0, [--A1.2]
47 SETL [--A0.2], D0Re0, D1Re0
62 MGETL D0.5, D0.6, D0.7, [A0.2]
79 ! save original address
83 ANDMB D0Ar4, D0Ar4, #0xfff8
84 ! new address is the 8-byte aligned one above the original
87 ! A0.2 dst 64-bit is aligned
88 ! measure the gap size
89 SUB D0Ar6, D0Ar4, D0Ar6
91 ! keep this information for the later adjustment
96 GETL D0Re0, D1Re0, [--A1.2]
99 BLT $Lbunaligned_1_2_3
104 ! D1.6 stores the gap size in bits
107 ! D0.6 stores the complement of the gap size
111 GETL D0.7, D1.7, [--A1.2]
112 ! form 64-bit data in D0Re0, D1Re0
115 LSL D1Re0, D1Re0, D1.6
117 ! D0Re0 >> complement
118 LSR D0Re0, D0Re0, D0.6
121 ADD D1Re0, D1Re0, D1.5
126 LSR D0Re0, D0Re0, D0.6
128 ADD D0Re0, D0Re0, D0.5
130 SETL [--A0.2], D0Re0, D1Re0
133 SUBS D1Ar5, D1Ar5, #1
134 BNE $Lbunaligned_5_6_7
136 ANDS D1Ar3, D1Ar3, #7
139 ! A1.2 <- A1.2 +8 - gapsize
141 SUB A1.2, A1.2, D0Ar4
149 $Lbunaligned_1_2_3_loop:
150 GETL D0.7, D1.7, [--A1.2]
151 ! form 64-bit data in D0Re0, D1Re0
152 LSL D1Re0, D1Re0, D1.6
153 ! save D0Re0 for later use
155 LSR D0Re0, D0Re0, D0.6
157 ADD D1Re0, D1Re0, D1.5
159 ! orignal data in D0Re0
163 LSR D0Re0, D0Re0, D0.6
165 ADD D0Re0, D0Re0, D0.5
167 SETL [--A0.2], D0Re0, D1Re0
170 SUBS D1Ar5, D1Ar5, #1
171 BNE $Lbunaligned_1_2_3_loop
173 ANDS D1Ar3, D1Ar3, #7
177 SUB A1.2, A1.2, D0Ar4
181 GETL D0.7, D1.7, [--A1.2]
184 SETL [--A0.2], D0Re0, D1Re0
187 SUBS D1Ar5, D1Ar5, #1
189 ANDS D1Ar3, D1Ar3, #7
193 SUB A1.2, A1.2, D0Ar4
205 ANDS D1Ar5, D1Ar5, #7
206 BNE $Lfdest_unaligned
208 ANDS D0Ar4, D0Ar4, #7
214 GETL D0Re0, D1Re0, [A1.2++]
215 SUBS D1Ar5, D1Ar5, #1
216 SETL [A0.2++], D0Re0, D1Re0
219 ANDS D1Ar3, D1Ar3, #7
224 SUBS D1Ar3, D1Ar3, #1
236 BNE $Lfdest_unaligned
245 ANDMB D0Ar4, D0Ar4, #0xfff8
248 ! A0.2 dst 64-bit is aligned
249 SUB D0Ar6, D0Ar6, D0Ar4
250 ! keep the information for the later adjustment
257 GETL D0Re0, D1Re0, [A1.2]
260 BLT $Lfunaligned_1_2_3
269 GETL D0.7, D1.7, [++A1.2]
270 ! form 64-bit data in D0Re0, D1Re0
272 LSR D0Re0, D0Re0, D0.6
274 LSL D1Re0, D1Re0, D1.6
276 ADD D0Re0, D0Re0, D0.5
281 LSL D1Re0, D1Re0, D1.6
283 ADD D1Re0, D1Re0, D1.5
285 SETL [A0.2++], D0Re0, D1Re0
288 SUBS D1Ar5, D1Ar5, #1
289 BNE $Lfunaligned_5_6_7
291 ANDS D1Ar3, D1Ar3, #7
294 ADD A1.2, A1.2, D0Ar4
302 $Lfunaligned_1_2_3_loop:
303 GETL D0.7, D1.7, [++A1.2]
304 ! form 64-bit data in D0Re0, D1Re0
305 LSR D0Re0, D0Re0, D0.6
307 LSL D1Re0, D1Re0, D1.6
309 ADD D0Re0, D0Re0, D0.5
314 LSL D1Re0, D1Re0, D1.6
316 ADD D1Re0, D1Re0, D1.5
318 SETL [A0.2++], D0Re0, D1Re0
321 SUBS D1Ar5, D1Ar5, #1
322 BNE $Lfunaligned_1_2_3_loop
324 ANDS D1Ar3, D1Ar3, #7
327 ADD A1.2, A1.2, D0Ar4
331 GETL D0.7, D1.7, [++A1.2]
334 SETL [A0.2++], D0Re0, D1Re0
337 SUBS D1Ar5, D1Ar5, #1
339 ANDS D1Ar3, D1Ar3, #7
342 ADD A1.2, A1.2, D0Ar4
345 .size _memmove,.-_memmove