1;;; SPDX-License-Identifier: GPL-2.0
2;;; memcpy.S
3
4#include <asm/linkage.h>
5
6#if defined(CONFIG_CPU_H8300H)
7	.h8300h
8#endif
9#if defined(CONFIG_CPU_H8S)
10	.h8300s
11#endif
12	.text
13.global memcpy
14
15;;; void *memcpy(void *to, void *from, size_t n)
16memcpy:
17	mov.l	er2,er2
18	bne	1f
19	rts
201:
21	;; address check
22	bld	#0,r0l
23	bxor	#0,r1l
24	bcs	4f
25	mov.l	er4,@-sp
26	mov.l	er0,@-sp
27	btst	#0,r0l
28	beq	1f
29	;; (aligned even) odd address
30	mov.b	@er1,r3l
31	mov.b	r3l,@er0
32	adds	#1,er1
33	adds	#1,er0
34	dec.l	#1,er2
35	beq	3f
361:
37	;; n < sizeof(unsigned long) check
38	sub.l	er4,er4
39	adds	#4,er4		; loop count check value
40	cmp.l	er4,er2
41	blo	2f
42	;; unsigned long copy
431:
44	mov.l	@er1,er3
45	mov.l	er3,@er0
46	adds	#4,er0
47	adds	#4,er1
48	subs	#4,er2
49	cmp.l	er4,er2
50	bcc	1b
51	;; rest
522:
53	mov.l	er2,er2
54	beq	3f
551:
56	mov.b	@er1,r3l
57	mov.b	r3l,@er0
58	adds	#1,er1
59	adds	#1,er0
60	dec.l	#1,er2
61	bne	1b
623:
63	mov.l	@sp+,er0
64	mov.l	@sp+,er4
65	rts
66
67	;; odd <- even / even <- odd
684:
69	mov.l	er4,er3
70	mov.l	er2,er4
71	mov.l	er5,er2
72	mov.l	er1,er5
73	mov.l	er6,er1
74	mov.l	er0,er6
751:
76	eepmov.w
77	mov.w	r4,r4
78	bne	1b
79	dec.w	#1,e4
80	bpl	1b
81	mov.l	er1,er6
82	mov.l	er2,er5
83	mov.l	er3,er4
84	rts
85
86	.end
87