7 #define INLINE __inline
8 #define PACKED __attribute__((packed))
10 #elif defined(__WATCOMC__)
11 #define INLINE __inline
19 /* fast conversion of double -> 32bit int
21 * - http://chrishecker.com/images/f/fb/Gdmfp.pdf
22 * - http://stereopsis.com/FPU.html#convert
24 static INLINE int32_t cround64(double val)
26 val += 6755399441055744.0;
27 return *(int32_t*)&val;
30 extern uint32_t perf_start_count, perf_interval_count;
34 void memcpy64(void *dest, void *src, int count);
35 #pragma aux memcpy64 = \
47 #define memcpy64(dest, src, count) memcpy(dest, src, (count) << 3)
50 void perf_start(void);
51 #pragma aux perf_start = \
55 "mov [perf_start_count], eax" \
56 modify[eax ebx ecx edx];
59 #pragma aux perf_end = \
63 "sub eax, [perf_start_count]" \
64 "mov [perf_interval_count], eax" \
65 modify [eax ebx ecx edx];
67 void debug_break(void);
68 #pragma aux debug_break = "int 3";
73 #define memcpy64(dest, src, count) asm volatile ( \
75 "movq (%1), %%mm0\n\t" \
76 "movq %%mm0, (%0)\n\t" \
82 :: "r"(dest), "r"(src), "r"(count) \
85 #define memcpy64(dest, src, count) memcpy(dest, src, (count) << 3)
88 #define perf_start() asm volatile ( \
89 "xor %%eax, %%eax\n" \
93 : "=m"(perf_start_count) \
94 :: "%eax", "%ebx", "%ecx", "%edx")
96 #define perf_end() asm volatile ( \
97 "xor %%eax, %%eax\n" \
102 : "=m"(perf_interval_count) \
103 : "m"(perf_start_count) \
104 : "%eax", "%ebx", "%ecx", "%edx")
106 #define debug_break() \
107 asm volatile ("int $3")
111 #define perf_start() \
117 mov [perf_start_count], eax \
127 sub eax, [perf_start_count] \
128 mov [perf_interval_count], eax \
132 #define debug_break() \