blob: a4dbf7b4ceeee2de25e1cab66d3cb00c114a6033 [file] [log] [blame]
Summer Qinf24dbb52020-07-23 14:53:54 +08001/*
2 * Copyright (c) 2019-2020, Arm Limited. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 *
6 */
7
8#include <string.h>
9#include "crt_impl_private.h"
10
11static void *memcpy_r(void *dest, const void *src, size_t n)
12{
Ken Liu8fb61f12021-12-14 08:32:10 +080013 union composite_addr_t p_dst, p_src;
Summer Qinf24dbb52020-07-23 14:53:54 +080014
Ken Liu8fb61f12021-12-14 08:32:10 +080015 p_dst.uint_addr = (uintptr_t)dest + n;
16 p_src.uint_addr = (uintptr_t)src + n;
Summer Qinf24dbb52020-07-23 14:53:54 +080017
18 /* Byte copy for unaligned address. check the last bit of address. */
Ken Liu8fb61f12021-12-14 08:32:10 +080019 while (n && (ADDR_WORD_UNALIGNED(p_dst.uint_addr) ||
20 ADDR_WORD_UNALIGNED(p_src.uint_addr))) {
21 *(--p_dst.p_byte) = *(--p_src.p_byte);
Summer Qinf24dbb52020-07-23 14:53:54 +080022 n--;
23 }
24
Summer Qinf24dbb52020-07-23 14:53:54 +080025 /* Quad byte copy for aligned address. */
26 while (n >= sizeof(uint32_t)) {
Ken Liu8fb61f12021-12-14 08:32:10 +080027 *(--p_dst.p_word) = *(--p_src.p_word);
Summer Qinf24dbb52020-07-23 14:53:54 +080028 n -= sizeof(uint32_t);
29 }
30
31 /* Byte copy for the remaining bytes. */
32 while (n--) {
Ken Liu8fb61f12021-12-14 08:32:10 +080033 *(--p_dst.p_byte) = *(--p_src.p_byte);
Summer Qinf24dbb52020-07-23 14:53:54 +080034 }
35
36 return dest;
37}
38
Ken Liu8fb61f12021-12-14 08:32:10 +080039/* Mind the direction for copying in memcpy! */
40#define memcpy_f memcpy
41
Summer Qinf24dbb52020-07-23 14:53:54 +080042/*
43 * For overlapped memory area:
44 * 1) overlapped: use reverse memory move.
45 * 2) non-overlapped: use forward memory move.
46 */
47void *memmove(void *dest, const void *src, size_t n)
48{
Summer Qinf24dbb52020-07-23 14:53:54 +080049 if (src >= dest) {
Ken Liu8fb61f12021-12-14 08:32:10 +080050 return memcpy_f(dest, src, n);
Summer Qinf24dbb52020-07-23 14:53:54 +080051 } else {
Ken Liu8fb61f12021-12-14 08:32:10 +080052 return memcpy_r(dest, src, n);
Summer Qinf24dbb52020-07-23 14:53:54 +080053 }
Summer Qinf24dbb52020-07-23 14:53:54 +080054}