diff options
author | Tom Rini <trini@konsulko.com> | 2021-04-08 07:33:14 -0400 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2021-04-08 07:33:14 -0400 |
commit | f6127db8cc8dec22cf9cd6d6363d812f659ce517 (patch) | |
tree | e302101a2cc971287f1df11f2f9eefd513af621d /arch/riscv/lib/memmove.S | |
parent | 8246654e1ef3ea9e2907a42e01b7747ccc62d412 (diff) | |
parent | e7bb113cc4d03aeb573ff938a1d897d4b3ca99df (diff) |
Merge https://source.denx.de/u-boot/custodians/u-boot-riscv
- Watchdog, Unleashed and Icicle improvements
Diffstat (limited to 'arch/riscv/lib/memmove.S')
-rw-r--r-- | arch/riscv/lib/memmove.S | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/arch/riscv/lib/memmove.S b/arch/riscv/lib/memmove.S new file mode 100644 index 0000000000..07d1d2152b --- /dev/null +++ b/arch/riscv/lib/memmove.S @@ -0,0 +1,64 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#include <linux/linkage.h> +#include <asm/asm.h> + +ENTRY(__memmove) +WEAK(memmove) + move t0, a0 + move t1, a1 + + beq a0, a1, exit_memcpy + beqz a2, exit_memcpy + srli t2, a2, 0x2 + + slt t3, a0, a1 + beqz t3, do_reverse + + andi a2, a2, 0x3 + li t4, 1 + beqz t2, byte_copy + +word_copy: + lw t3, 0(a1) + addi t2, t2, -1 + addi a1, a1, 4 + sw t3, 0(a0) + addi a0, a0, 4 + bnez t2, word_copy + beqz a2, exit_memcpy + j byte_copy + +do_reverse: + add a0, a0, a2 + add a1, a1, a2 + andi a2, a2, 0x3 + li t4, -1 + beqz t2, reverse_byte_copy + +reverse_word_copy: + addi a1, a1, -4 + addi t2, t2, -1 + lw t3, 0(a1) + addi a0, a0, -4 + sw t3, 0(a0) + bnez t2, reverse_word_copy + beqz a2, exit_memcpy + +reverse_byte_copy: + addi a0, a0, -1 + addi a1, a1, -1 + +byte_copy: + lb t3, 0(a1) + addi a2, a2, -1 + sb t3, 0(a0) + add a1, a1, t4 + add a0, a0, t4 + bnez a2, byte_copy + +exit_memcpy: + move a0, t0 + move a1, t1 + ret +END(__memmove) |