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