1#include "libxr_mem.hpp"
3#include "libxr_def.hpp"
7 uint8_t* d =
static_cast<uint8_t*
>(dst);
8 const uint8_t* s =
static_cast<const uint8_t*
>(src);
17 if (d_offset == s_offset)
37 auto* dw =
reinterpret_cast<uint64_t*
>(d);
38 auto* sw =
reinterpret_cast<const uint64_t*
>(s);
60 d =
reinterpret_cast<uint8_t*
>(dw);
61 s =
reinterpret_cast<const uint8_t*
>(sw);
66 auto* dw =
reinterpret_cast<uint32_t*
>(d);
67 auto* sw =
reinterpret_cast<const uint32_t*
>(s);
89 d =
reinterpret_cast<uint8_t*
>(dw);
90 s =
reinterpret_cast<const uint8_t*
>(sw);
99 uintptr_t addr_diff =
reinterpret_cast<uintptr_t
>(s) -
reinterpret_cast<uintptr_t
>(d);
104 if ((addr_diff & 3) == 0 && size > 0)
106 while ((
reinterpret_cast<uintptr_t
>(d) & 3) && size)
111 auto* d32 =
reinterpret_cast<uint32_t*
>(d);
112 auto* s32 =
reinterpret_cast<const uint32_t*
>(s);
134 d =
reinterpret_cast<uint8_t*
>(d32);
135 s =
reinterpret_cast<const uint8_t*
>(s32);
138 else if ((addr_diff & 1) == 0 && size > 0)
140 if (
reinterpret_cast<uintptr_t
>(d) & 1)
145 auto* d16 =
reinterpret_cast<uint16_t*
>(d);
146 auto* s16 =
reinterpret_cast<const uint16_t*
>(s);
168 d =
reinterpret_cast<uint8_t*
>(d16);
169 s =
reinterpret_cast<const uint8_t*
>(s16);
172 else if ((addr_diff & 1) == 0 && size > 0)
174 if (
reinterpret_cast<uintptr_t
>(d) & 1)
179 auto* d16 =
reinterpret_cast<uint16_t*
>(d);
180 auto* s16 =
reinterpret_cast<const uint16_t*
>(s);
202 d =
reinterpret_cast<uint8_t*
>(d16);
203 s =
reinterpret_cast<const uint8_t*
>(s16);
222 uint8_t* d =
static_cast<uint8_t*
>(dst);
244 uint64_t pat = value;
249 auto* dw =
reinterpret_cast<uint64_t*
>(d);
270 d =
reinterpret_cast<uint8_t*
>(dw);
275 uint32_t pat = value;
279 auto* dw =
reinterpret_cast<uint32_t*
>(d);
300 d =
reinterpret_cast<uint8_t*
>(dw);
312 const uint8_t* p =
static_cast<const uint8_t*
>(a);
313 const uint8_t* q =
static_cast<const uint8_t*
>(b);
314 const uint8_t* mismatch_p =
nullptr;
315 const uint8_t* mismatch_q =
nullptr;
316 size_t mismatch_size = 0;
318 if ((size == 0) || (p == q))
327 if ((p_off == q_off) && (p_off != 0))
337 int diff =
static_cast<int>(*p++) -
static_cast<int>(*q++);
349 if ((((
reinterpret_cast<uintptr_t
>(p) |
reinterpret_cast<uintptr_t
>(q)) & 7u) == 0u))
351 auto* pw =
reinterpret_cast<const uint64_t*
>(p);
352 auto* qw =
reinterpret_cast<const uint64_t*
>(q);
358 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 0);
359 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 0);
361 goto compare_fixed_bytes;
365 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 1);
366 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 1);
368 goto compare_fixed_bytes;
372 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 2);
373 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 2);
375 goto compare_fixed_bytes;
379 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 3);
380 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 3);
382 goto compare_fixed_bytes;
386 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 4);
387 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 4);
389 goto compare_fixed_bytes;
393 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 5);
394 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 5);
396 goto compare_fixed_bytes;
400 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 6);
401 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 6);
403 goto compare_fixed_bytes;
407 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 7);
408 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 7);
410 goto compare_fixed_bytes;
422 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw);
423 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw);
425 goto compare_fixed_bytes;
432 p =
reinterpret_cast<const uint8_t*
>(pw);
433 q =
reinterpret_cast<const uint8_t*
>(qw);
439 if ((((
reinterpret_cast<uintptr_t
>(p) |
reinterpret_cast<uintptr_t
>(q)) & 3u) == 0u))
441 auto* pw =
reinterpret_cast<const uint32_t*
>(p);
442 auto* qw =
reinterpret_cast<const uint32_t*
>(q);
448 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 0);
449 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 0);
451 goto compare_fixed_bytes;
455 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 1);
456 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 1);
458 goto compare_fixed_bytes;
462 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 2);
463 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 2);
465 goto compare_fixed_bytes;
469 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 3);
470 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 3);
472 goto compare_fixed_bytes;
476 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 4);
477 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 4);
479 goto compare_fixed_bytes;
483 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 5);
484 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 5);
486 goto compare_fixed_bytes;
490 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 6);
491 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 6);
493 goto compare_fixed_bytes;
497 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 7);
498 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 7);
500 goto compare_fixed_bytes;
512 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw);
513 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw);
515 goto compare_fixed_bytes;
522 p =
reinterpret_cast<const uint8_t*
>(pw);
523 q =
reinterpret_cast<const uint8_t*
>(qw);
528 if (mismatch_size == 8)
530 int diff =
static_cast<int>(mismatch_p[0]) -
static_cast<int>(mismatch_q[0]);
535 diff =
static_cast<int>(mismatch_p[1]) -
static_cast<int>(mismatch_q[1]);
540 diff =
static_cast<int>(mismatch_p[2]) -
static_cast<int>(mismatch_q[2]);
545 diff =
static_cast<int>(mismatch_p[3]) -
static_cast<int>(mismatch_q[3]);
550 diff =
static_cast<int>(mismatch_p[4]) -
static_cast<int>(mismatch_q[4]);
555 diff =
static_cast<int>(mismatch_p[5]) -
static_cast<int>(mismatch_q[5]);
560 diff =
static_cast<int>(mismatch_p[6]) -
static_cast<int>(mismatch_q[6]);
565 return static_cast<int>(mismatch_p[7]) -
static_cast<int>(mismatch_q[7]);
568 if (mismatch_size == 4)
570 int diff =
static_cast<int>(mismatch_p[0]) -
static_cast<int>(mismatch_q[0]);
575 diff =
static_cast<int>(mismatch_p[1]) -
static_cast<int>(mismatch_q[1]);
580 diff =
static_cast<int>(mismatch_p[2]) -
static_cast<int>(mismatch_q[2]);
585 return static_cast<int>(mismatch_p[3]) -
static_cast<int>(mismatch_q[3]);
591 int diff =
static_cast<int>(*p++) -
static_cast<int>(*q++);
static void FastSet(void *dst, uint8_t value, size_t size)
快速内存填充 / Fast memory fill
static int FastCmp(const void *a, const void *b, size_t size)
快速内存比较 / Fast memory comparison
static void FastCopy(void *dst, const void *src, size_t size)
快速内存拷贝 / Fast memory copy
constexpr size_t ALIGN_SIZE
平台自然对齐大小 / Native platform alignment size