dissector_eth: also include id into macro
[netsniff-ng.git] / src / opt_memcpy.h
blobbd65054be98f8dc88c2ba8685b39abafedfd45e9
1 /*
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.
6 */
8 #ifndef OPT_MEMCPY_H
9 #define OPT_MEMCPY_H
11 #ifdef ARCH_X86
12 #define small_memcpy(dest, src, n) \
13 do { \
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) \
18 : "memory"); \
19 } while(0)
21 /* From the Linux kernel. */
22 static inline void *___memcpy(void *__restrict__ dest,
23 const void *__restrict__ src, size_t n)
25 int d0, d1, d2;
27 if (n == 4)
28 small_memcpy(dest, src, n);
29 else
30 asm volatile("rep ; movsl\n\t"
31 "testb $2,%b4\n\t"
32 "je 1f\n\t"
33 "movsw\n"
34 "1:\ttestb $1,%b4\n\t"
35 "je 2f\n\t"
36 "movsb\n"
37 "2:"
38 : "=&c" (d0), "=&D" (d1), "=&S" (d2)
39 : "0" (n / 4), "q" (n), "1" ((long)dest), "2" ((long)src)
40 : "memory");
41 return (dest);
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,
53 size_t n);
55 static inline void *__memcpy(void *__restrict__ dest, const void *__restrict__ src,
56 size_t n)
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);
65 #else
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,
76 size_t n)
78 return __builtin_memcpy(dest, src, n);
80 #endif /* ARCH_X86 */
81 #endif /* OPT_MEMCPY_H */