Linux Audio

Check our new training course

Loading...
v5.4
  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
v5.9
  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