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;
33 void perf_start(void);
34 #pragma aux perf_start = \
38 "mov [perf_start_count], eax" \
39 modify[eax ebx ecx edx];
42 #pragma aux perf_end = \
46 "sub eax, [perf_start_count]" \
47 "mov [perf_interval_count], eax" \
48 modify [eax ebx ecx edx];
50 void debug_break(void);
51 #pragma aux debug_break = "int 3";
54 #pragma aux halt = "hlt";
56 void memset16(void *ptr, int val, int count);
57 #pragma aux memset16 = \
63 #define perf_start() asm volatile ( \
64 "xor %%eax, %%eax\n" \
68 : "=m"(perf_start_count) \
69 :: "%eax", "%ebx", "%ecx", "%edx")
71 #define perf_end() asm volatile ( \
72 "xor %%eax, %%eax\n" \
77 : "=m"(perf_interval_count) \
78 : "m"(perf_start_count) \
79 : "%eax", "%ebx", "%ecx", "%edx")
81 #define debug_break() \
82 asm volatile ("int $3")
87 #define memset16(ptr, val, count) asm volatile ( \
89 :: "D"(ptr), "a"(val), "c"(count))
93 #define perf_start() \
99 mov [perf_start_count], eax \
109 sub eax, [perf_start_count] \
110 mov [perf_interval_count], eax \
114 #define debug_break() \
119 #define memset16(ptr, val, count) \