1 ! SPDX-License-Identifier: GPL-2.0
2 ! Copyright (C) 2008-2012 Imagination Technologies Ltd.
6 .type _memmove,function
15 MSETL [A0StP], D0.5, D0.6, D0.7
19 SUB D0Ar4, D1Ar1, D1Ar3
23 ! should copy backwards
25 ! adjust pointer to the end of mem
26 ADD D0Ar2, D1Re0, D1Ar3
27 ADD D1Ar1, D1Ar1, D1Ar3
37 ! test 8 byte alignment
47 GETL D0Re0, D1Re0, [--A1.2]
48 SETL [--A0.2], D0Re0, D1Re0
63 MGETL D0.5, D0.6, D0.7, [A0.2]
80 ! save original address
84 ANDMB D0Ar4, D0Ar4, #0xfff8
85 ! new address is the 8-byte aligned one above the original
88 ! A0.2 dst 64-bit is aligned
89 ! measure the gap size
90 SUB D0Ar6, D0Ar4, D0Ar6
92 ! keep this information for the later adjustment
97 GETL D0Re0, D1Re0, [--A1.2]
100 BLT $Lbunaligned_1_2_3
105 ! D1.6 stores the gap size in bits
108 ! D0.6 stores the complement of the gap size
112 GETL D0.7, D1.7, [--A1.2]
113 ! form 64-bit data in D0Re0, D1Re0
116 LSL D1Re0, D1Re0, D1.6
118 ! D0Re0 >> complement
119 LSR D0Re0, D0Re0, D0.6
122 ADD D1Re0, D1Re0, D1.5
127 LSR D0Re0, D0Re0, D0.6
129 ADD D0Re0, D0Re0, D0.5
131 SETL [--A0.2], D0Re0, D1Re0
134 SUBS D1Ar5, D1Ar5, #1
135 BNE $Lbunaligned_5_6_7
137 ANDS D1Ar3, D1Ar3, #7
140 ! A1.2 <- A1.2 +8 - gapsize
142 SUB A1.2, A1.2, D0Ar4
150 $Lbunaligned_1_2_3_loop:
151 GETL D0.7, D1.7, [--A1.2]
152 ! form 64-bit data in D0Re0, D1Re0
153 LSL D1Re0, D1Re0, D1.6
154 ! save D0Re0 for later use
156 LSR D0Re0, D0Re0, D0.6
158 ADD D1Re0, D1Re0, D1.5
160 ! orignal data in D0Re0
164 LSR D0Re0, D0Re0, D0.6
166 ADD D0Re0, D0Re0, D0.5
168 SETL [--A0.2], D0Re0, D1Re0
171 SUBS D1Ar5, D1Ar5, #1
172 BNE $Lbunaligned_1_2_3_loop
174 ANDS D1Ar3, D1Ar3, #7
178 SUB A1.2, A1.2, D0Ar4
182 GETL D0.7, D1.7, [--A1.2]
185 SETL [--A0.2], D0Re0, D1Re0
188 SUBS D1Ar5, D1Ar5, #1
190 ANDS D1Ar3, D1Ar3, #7
194 SUB A1.2, A1.2, D0Ar4
206 ANDS D1Ar5, D1Ar5, #7
207 BNE $Lfdest_unaligned
209 ANDS D0Ar4, D0Ar4, #7
215 GETL D0Re0, D1Re0, [A1.2++]
216 SUBS D1Ar5, D1Ar5, #1
217 SETL [A0.2++], D0Re0, D1Re0
220 ANDS D1Ar3, D1Ar3, #7
225 SUBS D1Ar3, D1Ar3, #1
237 BNE $Lfdest_unaligned
246 ANDMB D0Ar4, D0Ar4, #0xfff8
249 ! A0.2 dst 64-bit is aligned
250 SUB D0Ar6, D0Ar6, D0Ar4
251 ! keep the information for the later adjustment
258 GETL D0Re0, D1Re0, [A1.2]
261 BLT $Lfunaligned_1_2_3
270 GETL D0.7, D1.7, [++A1.2]
271 ! form 64-bit data in D0Re0, D1Re0
273 LSR D0Re0, D0Re0, D0.6
275 LSL D1Re0, D1Re0, D1.6
277 ADD D0Re0, D0Re0, D0.5
282 LSL D1Re0, D1Re0, D1.6
284 ADD D1Re0, D1Re0, D1.5
286 SETL [A0.2++], D0Re0, D1Re0
289 SUBS D1Ar5, D1Ar5, #1
290 BNE $Lfunaligned_5_6_7
292 ANDS D1Ar3, D1Ar3, #7
295 ADD A1.2, A1.2, D0Ar4
303 $Lfunaligned_1_2_3_loop:
304 GETL D0.7, D1.7, [++A1.2]
305 ! form 64-bit data in D0Re0, D1Re0
306 LSR D0Re0, D0Re0, D0.6
308 LSL D1Re0, D1Re0, D1.6
310 ADD D0Re0, D0Re0, D0.5
315 LSL D1Re0, D1Re0, D1.6
317 ADD D1Re0, D1Re0, D1.5
319 SETL [A0.2++], D0Re0, D1Re0
322 SUBS D1Ar5, D1Ar5, #1
323 BNE $Lfunaligned_1_2_3_loop
325 ANDS D1Ar3, D1Ar3, #7
328 ADD A1.2, A1.2, D0Ar4
332 GETL D0.7, D1.7, [++A1.2]
335 SETL [A0.2++], D0Re0, D1Re0
338 SUBS D1Ar5, D1Ar5, #1
340 ANDS D1Ar3, D1Ar3, #7
343 ADD A1.2, A1.2, D0Ar4
346 .size _memmove,.-_memmove