2 * netsniff-ng - the packet sniffing beast
3 * By Daniel Borkmann <daniel@netsniff-ng.org>
4 * Copyright 2011 Daniel Borkmann.
5 * Subject to the GPL, version 2.
12 #define small_memcpy(dest, src, n) \
14 register unsigned long int dummy; \
15 asm volatile ("rep; movsb\n\t" \
16 : "=&D" (dest), "=&S" (src), "=&c" (dummy) \
17 : "0" (dest), "1" (src), "2" (n) \
21 /* From the Linux kernel. */
22 static inline void *___memcpy(void *__restrict__ dest
,
23 const void *__restrict__ src
, size_t n
)
28 small_memcpy(dest
, src
, n
);
30 asm volatile("rep ; movsl\n\t"
34 "1:\ttestb $1,%b4\n\t"
38 : "=&c" (d0
), "=&D" (d1
), "=&S" (d2
)
39 : "0" (n
/ 4), "q" (n
), "1" ((long)dest
), "2" ((long)src
)
44 static inline void *__memcpy_small(void *__restrict__ dest
,
45 const void *__restrict__ src
, size_t n
)
47 return ___memcpy(dest
, src
, n
);
50 /* This one checks CPU flags and sets right variant! */
51 extern void set_memcpy(void);
52 extern void *(*____memcpy
)(void *__restrict__ dest
, const void *__restrict__ src
,
55 static inline void *__memcpy(void *__restrict__ dest
, const void *__restrict__ src
,
58 return ____memcpy(dest
, src
, n
);
61 extern void *__sse_memcpy(void *__restrict__ dest
, const void *__restrict__ src
, size_t n
);
62 extern void *__sse2_memcpy(void *__restrict__ dest
, const void *__restrict__ src
, size_t n
);
63 extern void *__mmx_memcpy(void *__restrict__ dest
, const void *__restrict__ src
, size_t n
);
64 extern void *__mmx2_memcpy(void *__restrict__ dest
, const void *__restrict__ src
, size_t n
);
66 #include <linux/string.h>
67 #define set_memcpy() do {} while(0)
69 static inline void *__memcpy_small(void *__restrict__ dest
,
70 const void *__restrict__ src
, size_t n
)
72 return __builtin_memcpy(dest
, src
, n
);
75 static inline void *__memcpy(void *__restrict__ dest
, const void *__restrict__ src
,
78 return __builtin_memcpy(dest
, src
, n
);
81 #endif /* OPT_MEMCPY_H */