1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
6 #include <linux/export.h>
7 #include <asm/alternative-asm.h>
9 #include <asm/asmmacro.h>
11 #include <asm/regdef.h>
13 SYM_FUNC_START(memmove)
14 blt a0, a1, memcpy /* dst < src, memcpy */
15 blt a1, a0, rmemcpy /* src < dst, rmemcpy */
16 jr ra /* dst == src, return */
18 _ASM_NOKPROBE(memmove)
20 EXPORT_SYMBOL(memmove)
22 SYM_FUNC_START(rmemcpy)
24 * Some CPUs support hardware unaligned access
26 ALTERNATIVE "b __rmemcpy_generic", \
27 "b __rmemcpy_fast", CPU_FEATURE_UAL
29 _ASM_NOKPROBE(rmemcpy)
32 * void *__rmemcpy_generic(void *dst, const void *src, size_t n)
38 SYM_FUNC_START(__rmemcpy_generic)
54 SYM_FUNC_END(__rmemcpy_generic)
55 _ASM_NOKPROBE(__rmemcpy_generic)
58 * void *__rmemcpy_fast(void *dst, const void *src, size_t n)
64 SYM_FUNC_START(__rmemcpy_fast)
66 bnez t0, __memcpy_small
73 /* align up destination address */
81 /* copy 64 bytes at a time */
101 bltu a4, a3, .Lloop64
103 /* copy the remaining bytes */
140 SYM_FUNC_END(__rmemcpy_fast)
141 _ASM_NOKPROBE(__rmemcpy_fast)