blob: 07d1d2152ba5ce70f73029b1b28872b5f54f4483 [file] [log] [blame]
Heinrich Schuchardt8f0dc4c2021-03-27 12:37:04 +01001/* SPDX-License-Identifier: GPL-2.0 */
2
3#include <linux/linkage.h>
4#include <asm/asm.h>
5
6ENTRY(__memmove)
7WEAK(memmove)
8 move t0, a0
9 move t1, a1
10
11 beq a0, a1, exit_memcpy
12 beqz a2, exit_memcpy
13 srli t2, a2, 0x2
14
15 slt t3, a0, a1
16 beqz t3, do_reverse
17
18 andi a2, a2, 0x3
19 li t4, 1
20 beqz t2, byte_copy
21
22word_copy:
23 lw t3, 0(a1)
24 addi t2, t2, -1
25 addi a1, a1, 4
26 sw t3, 0(a0)
27 addi a0, a0, 4
28 bnez t2, word_copy
29 beqz a2, exit_memcpy
30 j byte_copy
31
32do_reverse:
33 add a0, a0, a2
34 add a1, a1, a2
35 andi a2, a2, 0x3
36 li t4, -1
37 beqz t2, reverse_byte_copy
38
39reverse_word_copy:
40 addi a1, a1, -4
41 addi t2, t2, -1
42 lw t3, 0(a1)
43 addi a0, a0, -4
44 sw t3, 0(a0)
45 bnez t2, reverse_word_copy
46 beqz a2, exit_memcpy
47
48reverse_byte_copy:
49 addi a0, a0, -1
50 addi a1, a1, -1
51
52byte_copy:
53 lb t3, 0(a1)
54 addi a2, a2, -1
55 sb t3, 0(a0)
56 add a1, a1, t4
57 add a0, a0, t4
58 bnez a2, byte_copy
59
60exit_memcpy:
61 move a0, t0
62 move a1, t1
63 ret
64END(__memmove)