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