blob: 05987cd639ef70b9fa193ff3c0351e4f9215b4e0 [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
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 */
Linus Torvalds1da177e2005-04-16 15:20:36 -070013
14 .text
Linus Torvalds1da177e2005-04-16 15:20:36 -070015#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