237
237
return (char *) memcpy(copy, s, size);
241
Util_Memcpy(void *dest,
245
uintptr_t align = ((uintptr_t)dest | (uintptr_t)src | count);
249
#if defined(__x86_64__)
255
if ((align & 7) == 0) {
256
__asm__ __volatile__("\t"
259
: "=c" (dummy0), "=D" (dummy1), "=S" (dummy2)
260
: "0" (count >> 3), "1" (dest), "2" (src)
264
} else if ((align & 3) == 0) {
265
__asm__ __volatile__("\t"
268
: "=c" (dummy0), "=D" (dummy1), "=S" (dummy2)
269
: "0" (count >> 2), "1" (dest), "2" (src)
275
#elif defined(__i386__)
281
if ((align & 3) == 0) {
282
__asm__ __volatile__("\t"
285
: "=c" (dummy0), "=D" (dummy1), "=S" (dummy2)
286
: "0" (count >> 2), "1" (dest), "2" (src)
294
#elif defined _MSC_VER
296
#if defined(__x86_64__)
298
if ((align & 7) == 0) {
299
__movsq((uint64 *)dest, (uint64 *)src, count >> 3);
301
} else if ((align & 3) == 0) {
302
__movsd((unsigned long *)dest, (unsigned long *)src, count >> 2);
306
#elif defined(__i386__)
308
if ((((uintptr_t)dest | (uintptr_t)src | count) & 3) == 0) {
309
__movsd((unsigned long *)dest, (unsigned long *)src, count >> 2);
318
memcpy(dest, src, count);