1#include "libxr_def.hpp"
2#include "libxr_mem.hpp"
6 const uint8_t* p =
static_cast<const uint8_t*
>(a);
7 const uint8_t* q =
static_cast<const uint8_t*
>(b);
8 const uint8_t* mismatch_p =
nullptr;
9 const uint8_t* mismatch_q =
nullptr;
10 size_t mismatch_size = 0;
12 if ((size == 0) || (p == q))
21 if ((p_off == q_off) && (p_off != 0))
31 int diff =
static_cast<int>(*p++) -
static_cast<int>(*q++);
43 if ((((
reinterpret_cast<uintptr_t
>(p) |
reinterpret_cast<uintptr_t
>(q)) & 7u) == 0u))
45 auto* pw =
reinterpret_cast<const uint64_t*
>(p);
46 auto* qw =
reinterpret_cast<const uint64_t*
>(q);
52 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 0);
53 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 0);
55 goto compare_fixed_bytes;
59 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 1);
60 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 1);
62 goto compare_fixed_bytes;
66 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 2);
67 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 2);
69 goto compare_fixed_bytes;
73 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 3);
74 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 3);
76 goto compare_fixed_bytes;
80 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 4);
81 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 4);
83 goto compare_fixed_bytes;
87 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 5);
88 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 5);
90 goto compare_fixed_bytes;
94 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 6);
95 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 6);
97 goto compare_fixed_bytes;
101 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 7);
102 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 7);
104 goto compare_fixed_bytes;
116 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw);
117 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw);
119 goto compare_fixed_bytes;
126 p =
reinterpret_cast<const uint8_t*
>(pw);
127 q =
reinterpret_cast<const uint8_t*
>(qw);
133 if ((((
reinterpret_cast<uintptr_t
>(p) |
reinterpret_cast<uintptr_t
>(q)) & 3u) == 0u))
135 auto* pw =
reinterpret_cast<const uint32_t*
>(p);
136 auto* qw =
reinterpret_cast<const uint32_t*
>(q);
142 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 0);
143 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 0);
145 goto compare_fixed_bytes;
149 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 1);
150 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 1);
152 goto compare_fixed_bytes;
156 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 2);
157 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 2);
159 goto compare_fixed_bytes;
163 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 3);
164 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 3);
166 goto compare_fixed_bytes;
170 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 4);
171 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 4);
173 goto compare_fixed_bytes;
177 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 5);
178 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 5);
180 goto compare_fixed_bytes;
184 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 6);
185 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 6);
187 goto compare_fixed_bytes;
191 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw + 7);
192 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw + 7);
194 goto compare_fixed_bytes;
206 mismatch_p =
reinterpret_cast<const uint8_t*
>(pw);
207 mismatch_q =
reinterpret_cast<const uint8_t*
>(qw);
209 goto compare_fixed_bytes;
216 p =
reinterpret_cast<const uint8_t*
>(pw);
217 q =
reinterpret_cast<const uint8_t*
>(qw);
222 if (mismatch_size == 8)
224 int diff =
static_cast<int>(mismatch_p[0]) -
static_cast<int>(mismatch_q[0]);
229 diff =
static_cast<int>(mismatch_p[1]) -
static_cast<int>(mismatch_q[1]);
234 diff =
static_cast<int>(mismatch_p[2]) -
static_cast<int>(mismatch_q[2]);
239 diff =
static_cast<int>(mismatch_p[3]) -
static_cast<int>(mismatch_q[3]);
244 diff =
static_cast<int>(mismatch_p[4]) -
static_cast<int>(mismatch_q[4]);
249 diff =
static_cast<int>(mismatch_p[5]) -
static_cast<int>(mismatch_q[5]);
254 diff =
static_cast<int>(mismatch_p[6]) -
static_cast<int>(mismatch_q[6]);
259 return static_cast<int>(mismatch_p[7]) -
static_cast<int>(mismatch_q[7]);
262 if (mismatch_size == 4)
264 int diff =
static_cast<int>(mismatch_p[0]) -
static_cast<int>(mismatch_q[0]);
269 diff =
static_cast<int>(mismatch_p[1]) -
static_cast<int>(mismatch_q[1]);
274 diff =
static_cast<int>(mismatch_p[2]) -
static_cast<int>(mismatch_q[2]);
279 return static_cast<int>(mismatch_p[3]) -
static_cast<int>(mismatch_q[3]);
285 int diff =
static_cast<int>(*p++) -
static_cast<int>(*q++);
static int FastCmp(const void *a, const void *b, size_t size)
快速内存比较 / Fast memory comparison
constexpr size_t ALIGN_SIZE
平台自然对齐大小 / Native platform alignment size