1/*
2 *  linux/arch/m32r/lib/memcpy.S
3 *
4 *  Copyright (C) 2001  Hiroyuki Kondo, and Hirokazu Takata
5 *  Copyright (C) 2004  Hirokazu Takata
6 *
7 *  void *memcopy(void *dst, const void *src, int n);
8 *
9 *        dst: r0
10 *        src: r1
11 *        n  : r2
12 */
13
14	.text
15#include <linux/linkage.h>
16#include <asm/assembler.h>
17
18#ifdef CONFIG_ISA_DUAL_ISSUE
19
20	.text
21ENTRY(memcpy)
22memcopy:
23	mv	r4, r0		    ||	mv	r7, r0
24	or	r7, r1		    ||	cmpz	r2
25	jc	r14		    ||	cmpeq	r0, r1	; return if r2=0
26	jc	r14					; return if r0=r1
27
28	and3	r7, r7, #3
29	bnez	r7, byte_copy
30	srl3	r3, r2, #2
31	and3	r2, r2, #3
32	beqz	r3, byte_copy
33	addi	r4, #-4
34word_copy:
35	ld	r7, @r1+	    ||	addi	r3, #-1
36	st	r7, @+r4	    ||	cmpz	r2
37	bnez	r3, word_copy
38	addi	r4, #4		    ||	jc	r14	; return if r2=0
39#if defined(CONFIG_ISA_M32R2)
40byte_copy:
41	ldb	r7, @r1		    ||	addi	r1, #1
42	addi	r2, #-1		    ||	stb	r7, @r4+
43	bnez	r2, byte_copy
44#elif defined(CONFIG_ISA_M32R)
45byte_copy:
46	ldb	r7, @r1		    ||	addi	r1, #1
47	addi	r2, #-1		    ||	stb	r7, @r4
48	addi	r4, #1
49	bnez	r2, byte_copy
50#else
51#error unknown isa configuration
52#endif
53end_memcopy:
54	jmp	r14
55
56#else /* not CONFIG_ISA_DUAL_ISSUE */
57
58	.text
59ENTRY(memcpy)
60memcopy:
61	mv	r4, r0
62	mv	r7, r0
63	or	r7, r1
64	beq	r0, r1, end_memcopy
65	beqz	r2, end_memcopy
66
67	and3	r7, r7, #3
68	bnez	r7, byte_copy
69	srl3	r3, r2, #2
70	and3	r2, r2, #3
71	beqz	r3, byte_copy
72	addi	r4, #-4
73word_copy:
74	ld	r7, @r1+
75	addi	r3, #-1
76	st	r7, @+r4
77	bnez	r3, word_copy
78	beqz	r2, end_memcopy
79	addi	r4, #4
80byte_copy:
81	ldb	r7, @r1
82	addi	r1, #1
83	addi	r2, #-1
84	stb	r7, @r4
85	addi	r4, #1
86	bnez	r2, byte_copy
87end_memcopy:
88	jmp	r14
89
90#endif /* not CONFIG_ISA_DUAL_ISSUE */
91
92	.end
93