Loading...
1/* $Id: memmove.S,v 1.2 2001/07/27 11:51:09 gniibe Exp $
2 *
3 * "memmove" implementation of SuperH
4 *
5 * Copyright (C) 1999 Niibe Yutaka
6 *
7 */
8
9/*
10 * void *memmove(void *dst, const void *src, size_t n);
11 * The memory areas may overlap.
12 */
13
14#include <linux/linkage.h>
15ENTRY(memmove)
16 ! if dest > src, call memcpy (it copies in decreasing order)
17 cmp/hi r5,r4
18 bf 1f
19 mov.l 2f,r0
20 jmp @r0
21 nop
22 .balign 4
232: .long memcpy
241:
25 sub r5,r4 ! From here, r4 has the distance to r0
26 tst r6,r6
27 bt/s 9f ! if n=0, do nothing
28 mov r5,r0
29 add r6,r5
30 mov #12,r1
31 cmp/gt r6,r1
32 bt/s 8f ! if it's too small, copy a byte at once
33 add #-1,r4
34 add #1,r4
35 !
36 ! [ ... ] DST [ ... ] SRC
37 ! [ ... ] [ ... ]
38 ! : :
39 ! r0+r4--> [ ... ] r0 --> [ ... ]
40 ! : :
41 ! [ ... ] [ ... ]
42 ! r5 -->
43 !
44 mov r4,r1
45 mov #3,r2
46 and r2,r1
47 shll2 r1
48 mov r0,r3 ! Save the value on R0 to R3
49 mova jmptable,r0
50 add r1,r0
51 mov.l @r0,r1
52 jmp @r1
53 mov r3,r0 ! and back to R0
54 .balign 4
55jmptable:
56 .long case0
57 .long case1
58 .long case2
59 .long case3
60
61 ! copy a byte at once
628: mov.b @r0+,r1
63 cmp/hs r5,r0
64 bf/s 8b ! while (r0<r5)
65 mov.b r1,@(r0,r4)
66 add #1,r4
679:
68 add r4,r0
69 rts
70 sub r6,r0
71
72case_none:
73 bra 8b
74 add #-1,r4
75
76case0:
77 !
78 ! GHIJ KLMN OPQR --> GHIJ KLMN OPQR
79 !
80 ! First, align to long word boundary
81 mov r0,r3
82 and r2,r3
83 tst r3,r3
84 bt/s 2f
85 add #-1,r4
86 mov #4,r2
87 sub r3,r2
881: dt r2
89 mov.b @r0+,r1
90 bf/s 1b
91 mov.b r1,@(r0,r4)
92 !
932: ! Second, copy a long word at once
94 add #-3,r4
95 add #-3,r5
963: mov.l @r0+,r1
97 cmp/hs r5,r0
98 bf/s 3b
99 mov.l r1,@(r0,r4)
100 add #3,r5
101 !
102 ! Third, copy a byte at once, if necessary
103 cmp/eq r5,r0
104 bt/s 9b
105 add #4,r4
106 bra 8b
107 add #-1,r4
108
109case3:
110 !
111 ! GHIJ KLMN OPQR --> ...G HIJK LMNO PQR.
112 !
113 ! First, align to long word boundary
114 mov r0,r3
115 and r2,r3
116 tst r3,r3
117 bt/s 2f
118 add #-1,r4
119 mov #4,r2
120 sub r3,r2
1211: dt r2
122 mov.b @r0+,r1
123 bf/s 1b
124 mov.b r1,@(r0,r4)
125 !
1262: ! Second, read a long word and write a long word at once
127 add #-2,r4
128 mov.l @(r0,r4),r1
129 add #-7,r5
130 add #-4,r4
131 !
132#ifdef __LITTLE_ENDIAN__
133 shll8 r1
1343: mov r1,r3 ! JIHG
135 shlr8 r3 ! xJIH
136 mov.l @r0+,r1 ! NMLK
137 mov r1,r2
138 shll16 r2
139 shll8 r2 ! Kxxx
140 or r2,r3 ! KJIH
141 cmp/hs r5,r0
142 bf/s 3b
143 mov.l r3,@(r0,r4)
144#else
145 shlr8 r1
1463: mov r1,r3 ! GHIJ
147 shll8 r3 ! HIJx
148 mov.l @r0+,r1 ! KLMN
149 mov r1,r2
150 shlr16 r2
151 shlr8 r2 ! xxxK
152 or r2,r3 ! HIJK
153 cmp/hs r5,r0
154 bf/s 3b
155 mov.l r3,@(r0,r4)
156#endif
157 add #7,r5
158 !
159 ! Third, copy a byte at once, if necessary
160 cmp/eq r5,r0
161 bt/s 9b
162 add #7,r4
163 add #-3,r0
164 bra 8b
165 add #-1,r4
166
167case2:
168 !
169 ! GHIJ KLMN OPQR --> ..GH IJKL MNOP QR..
170 !
171 ! First, align to word boundary
172 tst #1,r0
173 bt/s 2f
174 add #-1,r4
175 mov.b @r0+,r1
176 mov.b r1,@(r0,r4)
177 !
1782: ! Second, read a word and write a word at once
179 add #-1,r4
180 add #-1,r5
181 !
1823: mov.w @r0+,r1
183 cmp/hs r5,r0
184 bf/s 3b
185 mov.w r1,@(r0,r4)
186 add #1,r5
187 !
188 ! Third, copy a byte at once, if necessary
189 cmp/eq r5,r0
190 bt/s 9b
191 add #2,r4
192 mov.b @r0,r1
193 mov.b r1,@(r0,r4)
194 bra 9b
195 add #1,r0
196
197case1:
198 !
199 ! GHIJ KLMN OPQR --> .GHI JKLM NOPQ R...
200 !
201 ! First, align to long word boundary
202 mov r0,r3
203 and r2,r3
204 tst r3,r3
205 bt/s 2f
206 add #-1,r4
207 mov #4,r2
208 sub r3,r2
2091: dt r2
210 mov.b @r0+,r1
211 bf/s 1b
212 mov.b r1,@(r0,r4)
213 !
2142: ! Second, read a long word and write a long word at once
215 mov.l @(r0,r4),r1
216 add #-7,r5
217 add #-4,r4
218 !
219#ifdef __LITTLE_ENDIAN__
220 shll16 r1
221 shll8 r1
2223: mov r1,r3 ! JIHG
223 shlr16 r3
224 shlr8 r3 ! xxxJ
225 mov.l @r0+,r1 ! NMLK
226 mov r1,r2
227 shll8 r2 ! MLKx
228 or r2,r3 ! MLKJ
229 cmp/hs r5,r0
230 bf/s 3b
231 mov.l r3,@(r0,r4)
232#else
233 shlr16 r1
234 shlr8 r1
2353: mov r1,r3 ! GHIJ
236 shll16 r3
237 shll8 r3 ! Jxxx
238 mov.l @r0+,r1 ! KLMN
239 mov r1,r2
240 shlr8 r2 ! xKLM
241 or r2,r3 ! JKLM
242 cmp/hs r5,r0
243 bf/s 3b ! while(r0<r5)
244 mov.l r3,@(r0,r4)
245#endif
246 add #7,r5
247 !
248 ! Third, copy a byte at once, if necessary
249 cmp/eq r5,r0
250 bt/s 9b
251 add #5,r4
252 add #-3,r0
253 bra 8b
254 add #-1,r4
1/* SPDX-License-Identifier: GPL-2.0 */
2/* $Id: memmove.S,v 1.2 2001/07/27 11:51:09 gniibe Exp $
3 *
4 * "memmove" implementation of SuperH
5 *
6 * Copyright (C) 1999 Niibe Yutaka
7 *
8 */
9
10/*
11 * void *memmove(void *dst, const void *src, size_t n);
12 * The memory areas may overlap.
13 */
14
15#include <linux/linkage.h>
16ENTRY(memmove)
17 ! if dest > src, call memcpy (it copies in decreasing order)
18 cmp/hi r5,r4
19 bf 1f
20 mov.l 2f,r0
21 jmp @r0
22 nop
23 .balign 4
242: .long memcpy
251:
26 sub r5,r4 ! From here, r4 has the distance to r0
27 tst r6,r6
28 bt/s 9f ! if n=0, do nothing
29 mov r5,r0
30 add r6,r5
31 mov #12,r1
32 cmp/gt r6,r1
33 bt/s 8f ! if it's too small, copy a byte at once
34 add #-1,r4
35 add #1,r4
36 !
37 ! [ ... ] DST [ ... ] SRC
38 ! [ ... ] [ ... ]
39 ! : :
40 ! r0+r4--> [ ... ] r0 --> [ ... ]
41 ! : :
42 ! [ ... ] [ ... ]
43 ! r5 -->
44 !
45 mov r4,r1
46 mov #3,r2
47 and r2,r1
48 shll2 r1
49 mov r0,r3 ! Save the value on R0 to R3
50 mova jmptable,r0
51 add r1,r0
52 mov.l @r0,r1
53 jmp @r1
54 mov r3,r0 ! and back to R0
55 .balign 4
56jmptable:
57 .long case0
58 .long case1
59 .long case2
60 .long case3
61
62 ! copy a byte at once
638: mov.b @r0+,r1
64 cmp/hs r5,r0
65 bf/s 8b ! while (r0<r5)
66 mov.b r1,@(r0,r4)
67 add #1,r4
689:
69 add r4,r0
70 rts
71 sub r6,r0
72
73case_none:
74 bra 8b
75 add #-1,r4
76
77case0:
78 !
79 ! GHIJ KLMN OPQR --> GHIJ KLMN OPQR
80 !
81 ! First, align to long word boundary
82 mov r0,r3
83 and r2,r3
84 tst r3,r3
85 bt/s 2f
86 add #-1,r4
87 mov #4,r2
88 sub r3,r2
891: dt r2
90 mov.b @r0+,r1
91 bf/s 1b
92 mov.b r1,@(r0,r4)
93 !
942: ! Second, copy a long word at once
95 add #-3,r4
96 add #-3,r5
973: mov.l @r0+,r1
98 cmp/hs r5,r0
99 bf/s 3b
100 mov.l r1,@(r0,r4)
101 add #3,r5
102 !
103 ! Third, copy a byte at once, if necessary
104 cmp/eq r5,r0
105 bt/s 9b
106 add #4,r4
107 bra 8b
108 add #-1,r4
109
110case3:
111 !
112 ! GHIJ KLMN OPQR --> ...G HIJK LMNO PQR.
113 !
114 ! First, align to long word boundary
115 mov r0,r3
116 and r2,r3
117 tst r3,r3
118 bt/s 2f
119 add #-1,r4
120 mov #4,r2
121 sub r3,r2
1221: dt r2
123 mov.b @r0+,r1
124 bf/s 1b
125 mov.b r1,@(r0,r4)
126 !
1272: ! Second, read a long word and write a long word at once
128 add #-2,r4
129 mov.l @(r0,r4),r1
130 add #-7,r5
131 add #-4,r4
132 !
133#ifdef __LITTLE_ENDIAN__
134 shll8 r1
1353: mov r1,r3 ! JIHG
136 shlr8 r3 ! xJIH
137 mov.l @r0+,r1 ! NMLK
138 mov r1,r2
139 shll16 r2
140 shll8 r2 ! Kxxx
141 or r2,r3 ! KJIH
142 cmp/hs r5,r0
143 bf/s 3b
144 mov.l r3,@(r0,r4)
145#else
146 shlr8 r1
1473: mov r1,r3 ! GHIJ
148 shll8 r3 ! HIJx
149 mov.l @r0+,r1 ! KLMN
150 mov r1,r2
151 shlr16 r2
152 shlr8 r2 ! xxxK
153 or r2,r3 ! HIJK
154 cmp/hs r5,r0
155 bf/s 3b
156 mov.l r3,@(r0,r4)
157#endif
158 add #7,r5
159 !
160 ! Third, copy a byte at once, if necessary
161 cmp/eq r5,r0
162 bt/s 9b
163 add #7,r4
164 add #-3,r0
165 bra 8b
166 add #-1,r4
167
168case2:
169 !
170 ! GHIJ KLMN OPQR --> ..GH IJKL MNOP QR..
171 !
172 ! First, align to word boundary
173 tst #1,r0
174 bt/s 2f
175 add #-1,r4
176 mov.b @r0+,r1
177 mov.b r1,@(r0,r4)
178 !
1792: ! Second, read a word and write a word at once
180 add #-1,r4
181 add #-1,r5
182 !
1833: mov.w @r0+,r1
184 cmp/hs r5,r0
185 bf/s 3b
186 mov.w r1,@(r0,r4)
187 add #1,r5
188 !
189 ! Third, copy a byte at once, if necessary
190 cmp/eq r5,r0
191 bt/s 9b
192 add #2,r4
193 mov.b @r0,r1
194 mov.b r1,@(r0,r4)
195 bra 9b
196 add #1,r0
197
198case1:
199 !
200 ! GHIJ KLMN OPQR --> .GHI JKLM NOPQ R...
201 !
202 ! First, align to long word boundary
203 mov r0,r3
204 and r2,r3
205 tst r3,r3
206 bt/s 2f
207 add #-1,r4
208 mov #4,r2
209 sub r3,r2
2101: dt r2
211 mov.b @r0+,r1
212 bf/s 1b
213 mov.b r1,@(r0,r4)
214 !
2152: ! Second, read a long word and write a long word at once
216 mov.l @(r0,r4),r1
217 add #-7,r5
218 add #-4,r4
219 !
220#ifdef __LITTLE_ENDIAN__
221 shll16 r1
222 shll8 r1
2233: mov r1,r3 ! JIHG
224 shlr16 r3
225 shlr8 r3 ! xxxJ
226 mov.l @r0+,r1 ! NMLK
227 mov r1,r2
228 shll8 r2 ! MLKx
229 or r2,r3 ! MLKJ
230 cmp/hs r5,r0
231 bf/s 3b
232 mov.l r3,@(r0,r4)
233#else
234 shlr16 r1
235 shlr8 r1
2363: mov r1,r3 ! GHIJ
237 shll16 r3
238 shll8 r3 ! Jxxx
239 mov.l @r0+,r1 ! KLMN
240 mov r1,r2
241 shlr8 r2 ! xKLM
242 or r2,r3 ! JKLM
243 cmp/hs r5,r0
244 bf/s 3b ! while(r0<r5)
245 mov.l r3,@(r0,r4)
246#endif
247 add #7,r5
248 !
249 ! Third, copy a byte at once, if necessary
250 cmp/eq r5,r0
251 bt/s 9b
252 add #5,r4
253 add #-3,r0
254 bra 8b
255 add #-1,r4