7 #define INLINE __inline
8 #define PACKED __attribute__((packed))
10 #elif defined(__WATCOMC__)
11 #define INLINE __inline
19 #define BSWAP16(x) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8))
21 ((((x) >> 24) & 0xff) | \
22 (((x) >> 8) & 0xff00) | \
23 (((x) << 8) & 0xff0000) | \
26 #if defined(__i386__) || defined(__x86_64__) || defined(__386__) || defined(MSDOS)
27 /* fast conversion of double -> 32bit int
29 * - http://chrishecker.com/images/f/fb/Gdmfp.pdf
30 * - http://stereopsis.com/FPU.html#convert
32 static INLINE int32_t cround64(double val)
34 val += 6755399441055744.0;
35 return *(int32_t*)&val;
38 #define cround64(x) ((int32_t)(x))
41 static INLINE float rsqrt(float x)
43 float xhalf = x * 0.5f;
44 int32_t i = *(int32_t*)&x;
45 i = 0x5f3759df - (i >> 1);
47 x = x * (1.5f - xhalf * x * x);
51 extern uint32_t perf_start_count, perf_interval_count;
54 void memset16(void *dest, uint16_t val, int count);
55 #pragma aux memset16 = \
58 "jz memset16_dwords" \
71 void memcpy64(void *dest, void *src, int count);
72 #pragma aux memcpy64 = \
84 #define memcpy64(dest, src, count) memcpy(dest, src, (count) << 3)
87 void perf_start(void);
88 #pragma aux perf_start = \
92 "mov [perf_start_count], eax" \
93 modify[eax ebx ecx edx];
96 #pragma aux perf_end = \
100 "sub eax, [perf_start_count]" \
101 "mov [perf_interval_count], eax" \
102 modify [eax ebx ecx edx];
104 void debug_break(void);
105 #pragma aux debug_break = "int 3";
108 #pragma aux halt = "hlt";
112 #if defined(__i386__) || defined(__x86_64__)
113 #define memset16(dest, val, count) asm volatile ( \
122 "shl $16, %%eax\n\t" \
126 :: "D"(dest), "a"((uint16_t)(val)), "c"(count) \
129 static void INLINE memset16(void *dest, uint16_t val, int count)
131 uint16_t *ptr = dest;
132 while(count--) *ptr++ = val;
137 #define memcpy64(dest, src, count) asm volatile ( \
139 "movq (%1), %%mm0\n\t" \
140 "movq %%mm0, (%0)\n\t" \
146 :: "r"(dest), "r"(src), "r"(count) \
149 #define memcpy64(dest, src, count) memcpy(dest, src, (count) << 3)
152 #define perf_start() asm volatile ( \
153 "xor %%eax, %%eax\n" \
157 : "=m"(perf_start_count) \
158 :: "%eax", "%ebx", "%ecx", "%edx")
160 #define perf_end() asm volatile ( \
161 "xor %%eax, %%eax\n" \
166 : "=m"(perf_interval_count) \
167 : "m"(perf_start_count) \
168 : "%eax", "%ebx", "%ecx", "%edx")
170 #define debug_break() \
171 asm volatile ("int $3")
178 void __inline memset16(void *dest, uint16_t val, int count)
199 #define perf_start() \
205 mov [perf_start_count], eax \
215 sub eax, [perf_start_count] \
216 mov [perf_interval_count], eax \
220 #define debug_break() \