]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
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 | */ | |
1da177e4 LT |
13 | |
14 | .text | |
1da177e4 LT |
15 | #include <linux/linkage.h> |
16 | #include <asm/assembler.h> | |
17 | ||
18 | #ifdef CONFIG_ISA_DUAL_ISSUE | |
19 | ||
20 | .text | |
21 | ENTRY(memcpy) | |
22 | memcopy: | |
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 | |
34 | word_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) | |
40 | byte_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) | |
45 | byte_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 | |
53 | end_memcopy: | |
54 | jmp r14 | |
55 | ||
56 | #else /* not CONFIG_ISA_DUAL_ISSUE */ | |
57 | ||
58 | .text | |
59 | ENTRY(memcpy) | |
60 | memcopy: | |
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 | |
73 | word_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 | |
80 | byte_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 | |
87 | end_memcopy: | |
88 | jmp r14 | |
89 | ||
90 | #endif /* not CONFIG_ISA_DUAL_ISSUE */ | |
91 | ||
92 | .end |