1#include "libxr_def.hpp"
2#include "libxr_mem.hpp"
6 uint8_t* d =
static_cast<uint8_t*
>(dst);
7 const uint8_t* s =
static_cast<const uint8_t*
>(src);
16 if (d_offset == s_offset)
36 auto* dw =
reinterpret_cast<uint64_t*
>(d);
37 auto* sw =
reinterpret_cast<const uint64_t*
>(s);
59 d =
reinterpret_cast<uint8_t*
>(dw);
60 s =
reinterpret_cast<const uint8_t*
>(sw);
65 auto* dw =
reinterpret_cast<uint32_t*
>(d);
66 auto* sw =
reinterpret_cast<const uint32_t*
>(s);
88 d =
reinterpret_cast<uint8_t*
>(dw);
89 s =
reinterpret_cast<const uint8_t*
>(sw);
98 uintptr_t addr_diff =
reinterpret_cast<uintptr_t
>(s) -
reinterpret_cast<uintptr_t
>(d);
103 if ((addr_diff & 3) == 0 && size > 0)
105 while ((
reinterpret_cast<uintptr_t
>(d) & 3) && size)
110 auto* d32 =
reinterpret_cast<uint32_t*
>(d);
111 auto* s32 =
reinterpret_cast<const uint32_t*
>(s);
133 d =
reinterpret_cast<uint8_t*
>(d32);
134 s =
reinterpret_cast<const uint8_t*
>(s32);
137 else if ((addr_diff & 1) == 0 && size > 0)
139 if (
reinterpret_cast<uintptr_t
>(d) & 1)
144 auto* d16 =
reinterpret_cast<uint16_t*
>(d);
145 auto* s16 =
reinterpret_cast<const uint16_t*
>(s);
167 d =
reinterpret_cast<uint8_t*
>(d16);
168 s =
reinterpret_cast<const uint8_t*
>(s16);
171 else if ((addr_diff & 1) == 0 && size > 0)
173 if (
reinterpret_cast<uintptr_t
>(d) & 1)
178 auto* d16 =
reinterpret_cast<uint16_t*
>(d);
179 auto* s16 =
reinterpret_cast<const uint16_t*
>(s);
201 d =
reinterpret_cast<uint8_t*
>(d16);
202 s =
reinterpret_cast<const uint8_t*
>(s16);
216 if (size == 0 || dst == src)
221 auto* d =
static_cast<uint8_t*
>(dst);
222 const auto* s =
static_cast<const uint8_t*
>(src);
224 if (!(d < s + size && s < d + size))
226 FastCopy(dst, src, size);
234 uintptr_t d_end_offset =
236 uintptr_t s_end_offset =
242 if (d_end_offset == s_end_offset)
248 size_t tail = d_end_offset;
262 auto* dw =
reinterpret_cast<uint64_t*
>(d);
263 auto* sw =
reinterpret_cast<const uint64_t*
>(s);
267 uint64_t a0 = sw[-1];
268 uint64_t a1 = sw[-2];
269 uint64_t a2 = sw[-3];
270 uint64_t a3 = sw[-4];
271 uint64_t a4 = sw[-5];
272 uint64_t a5 = sw[-6];
273 uint64_t a6 = sw[-7];
274 uint64_t a7 = sw[-8];
294 d =
reinterpret_cast<uint8_t*
>(dw);
295 s =
reinterpret_cast<const uint8_t*
>(sw);
299 auto* dw =
reinterpret_cast<uint32_t*
>(d);
300 auto* sw =
reinterpret_cast<const uint32_t*
>(s);
304 uint32_t a0 = sw[-1];
305 uint32_t a1 = sw[-2];
306 uint32_t a2 = sw[-3];
307 uint32_t a3 = sw[-4];
308 uint32_t a4 = sw[-5];
309 uint32_t a5 = sw[-6];
310 uint32_t a6 = sw[-7];
311 uint32_t a7 = sw[-8];
331 d =
reinterpret_cast<uint8_t*
>(dw);
332 s =
reinterpret_cast<const uint8_t*
>(sw);
348 if (d_offset == s_offset)
369 auto* dw =
reinterpret_cast<uint64_t*
>(d);
370 auto* sw =
reinterpret_cast<const uint64_t*
>(s);
401 d =
reinterpret_cast<uint8_t*
>(dw);
402 s =
reinterpret_cast<const uint8_t*
>(sw);
406 auto* dw =
reinterpret_cast<uint32_t*
>(d);
407 auto* sw =
reinterpret_cast<const uint32_t*
>(s);
438 d =
reinterpret_cast<uint8_t*
>(dw);
439 s =
reinterpret_cast<const uint8_t*
>(sw);
456 uint8_t* d =
static_cast<uint8_t*
>(dst);
478 uint64_t pat = value;
483 auto* dw =
reinterpret_cast<uint64_t*
>(d);
504 d =
reinterpret_cast<uint8_t*
>(dw);
509 uint32_t pat = value;
513 auto* dw =
reinterpret_cast<uint32_t*
>(d);
534 d =
reinterpret_cast<uint8_t*
>(dw);
static void FastSet(void *dst, uint8_t value, size_t size)
快速内存填充 / Fast memory fill
static void FastCopy(void *dst, const void *src, size_t size)
快速内存拷贝 / Fast memory copy
static void FastMove(void *dst, const void *src, size_t size)
内存搬移 / Memory move
constexpr size_t ALIGN_SIZE
平台自然对齐大小 / Native platform alignment size