4 #if defined(__WATCOMC__) && __WATCOMC__ < 1200
10 typedef unsigned char uint8_t;
11 typedef short int16_t;
12 typedef unsigned short uint16_t;
14 typedef unsigned int uint32_t;
15 typedef unsigned long uintptr_t;
21 #define INLINE __inline
22 #define PACKED __attribute__((packed))
24 #elif defined(__WATCOMC__)
25 #define INLINE __inline
33 #define BSWAP16(x) ((((x) >> 8) & 0xff) | (((x) & 0xff) << 8))
35 ((((x) >> 24) & 0xff) | \
36 (((x) >> 8) & 0xff00) | \
37 (((x) << 8) & 0xff0000) | \
41 extern short sinlut[];
43 #define SIN(x) (int)sinlut[(x) & 0x7ff]
44 #define COS(x) (int)sinlut[((x) + 512) & 0x7ff]
46 int mask_to_shift(unsigned int mask);
48 #if defined(__i386__) || defined(__x86_64__) || defined(__386__) || defined(MSDOS)
49 /* fast conversion of double -> 32bit int
51 * - http://chrishecker.com/images/f/fb/Gdmfp.pdf
52 * - http://stereopsis.com/FPU.html#convert
54 static INLINE int32_t cround64(double val)
56 val += 6755399441055744.0;
57 return *(int32_t*)&val;
60 #define cround64(x) ((int32_t)(x))
63 static INLINE float rsqrt(float x)
65 float xhalf = x * 0.5f;
66 int32_t i = *(int32_t*)&x;
67 i = 0x5f3759df - (i >> 1);
69 x = x * (1.5f - xhalf * x * x);
73 extern uint32_t perf_start_count, perf_interval_count;
76 void memset16(void *dest, uint16_t val, int count);
77 #pragma aux memset16 = \
80 "jz memset16_dwords" \
93 void memcpy64(void *dest, void *src, int count);
94 #pragma aux memcpy64 = \
103 parm[ebx][edx][ecx] \
106 #define memcpy64(dest, src, count) memcpy(dest, src, (count) << 3)
109 void perf_start(void);
110 #pragma aux perf_start = \
114 "mov [perf_start_count], eax" \
115 modify[eax ebx ecx edx];
118 #pragma aux perf_end = \
122 "sub eax, [perf_start_count]" \
123 "mov [perf_interval_count], eax" \
124 modify [eax ebx ecx edx];
126 void debug_break(void);
127 #pragma aux debug_break = "int 3";
131 #if defined(__i386__) || defined(__x86_64__)
132 #define memset16(dest, val, count) asm volatile ( \
141 "shl $16, %%eax\n\t" \
145 :: "D"(dest), "a"((uint16_t)(val)), "c"(count) \
148 static void INLINE memset16(void *dest, uint16_t val, int count)
150 uint16_t *ptr = dest;
151 while(count--) *ptr++ = val;
156 #define memcpy64(dest, src, count) asm volatile ( \
158 "movq (%1), %%mm0\n\t" \
159 "movq %%mm0, (%0)\n\t" \
165 :: "r"(dest), "r"(src), "r"(count) \
168 #define memcpy64(dest, src, count) memcpy(dest, src, (count) << 3)
171 #define perf_start() asm volatile ( \
172 "xor %%eax, %%eax\n" \
176 : "=m"(perf_start_count) \
177 :: "%eax", "%ebx", "%ecx", "%edx")
179 #define perf_end() asm volatile ( \
180 "xor %%eax, %%eax\n" \
185 : "=m"(perf_interval_count) \
186 : "m"(perf_start_count) \
187 : "%eax", "%ebx", "%ecx", "%edx")
189 #define debug_break() \
190 asm volatile ("int $3")
194 void __inline memset16(void *dest, uint16_t val, int count)
215 #define perf_start() \
221 mov [perf_start_count], eax \
231 sub eax, [perf_start_count] \
232 mov [perf_interval_count], eax \
236 #define debug_break() \
243 uint32_t maxidx; /* 0: eax */
244 char vendor[12]; /* 0: ebx, edx, ecx */
245 uint32_t id; /* 1: eax */
246 uint32_t rsvd0; /* 1: ebx */
247 uint32_t feat; /* 1: edx */
248 uint32_t feat2; /* 1: ecx */
251 #define CPUID_STEPPING(id) ((id) & 0xf)
252 #define CPUID_MODEL(id) (((id) >> 4) & 0xf)
253 #define CPUID_FAMILY(id) (((id) >> 8) & 0xf)
255 #define CPUID_FEAT_FPU 0x00000001
256 #define CPUID_FEAT_VME 0x00000002
257 #define CPUID_FEAT_DBGEXT 0x00000004
258 #define CPUID_FEAT_PSE 0x00000008
259 #define CPUID_FEAT_TSC 0x00000010
260 #define CPUID_FEAT_MSR 0x00000020
261 #define CPUID_FEAT_PAE 0x00000040
262 #define CPUID_FEAT_MCE 0x00000080
263 #define CPUID_FEAT_CX8 0x00000100
264 #define CPUID_FEAT_APIC 0x00000200
265 #define CPUID_FEAT_SEP 0x00000800
266 #define CPUID_FEAT_MTRR 0x00001000
267 #define CPUID_FEAT_PGE 0x00002000
268 #define CPUID_FEAT_MCA 0x00004000
269 #define CPUID_FEAT_CMOV 0x00008000
270 #define CPUID_FEAT_PAT 0x00010000
271 #define CPUID_FEAT_PSE36 0x00020000
272 #define CPUID_FEAT_PSN 0x00040000
273 #define CPUID_FEAT_CLF 0x00080000
274 #define CPUID_FEAT_DTES 0x00200000
275 #define CPUID_FEAT_ACPI 0x00400000
276 #define CPUID_FEAT_MMX 0x00800000
277 #define CPUID_FEAT_FXSR 0x01000000
278 #define CPUID_FEAT_SSE 0x02000000
279 #define CPUID_FEAT_SSE2 0x04000000
280 #define CPUID_FEAT_SS 0x08000000
281 #define CPUID_FEAT_HTT 0x10000000
282 #define CPUID_FEAT_TM1 0x20000000
283 #define CPUID_FEAT_IA64 0x40000000
284 #define CPUID_FEAT_PBE 0x80000000
286 #define CPUID_FEAT2_SSE3 0x00000001
287 #define CPUID_FEAT2_PCLMUL 0x00000002
288 #define CPUID_FEAT2_DTES64 0x00000004
289 #define CPUID_FEAT2_MONITOR 0x00000008
290 #define CPUID_FEAT2_DS_CPL 0x00000010
291 #define CPUID_FEAT2_VMX 0x00000020
292 #define CPUID_FEAT2_SMX 0x00000040
293 #define CPUID_FEAT2_EST 0x00000080
294 #define CPUID_FEAT2_TM2 0x00000100
295 #define CPUID_FEAT2_SSSE3 0x00000200
296 #define CPUID_FEAT2_CID 0x00000400
297 #define CPUID_FEAT2_FMA 0x00001000
298 #define CPUID_FEAT2_CX16 0x00002000
299 #define CPUID_FEAT2_ETPRD 0x00004000
300 #define CPUID_FEAT2_PDCM 0x00008000
301 #define CPUID_FEAT2_PCIDE 0x00020000
302 #define CPUID_FEAT2_DCA 0x00040000
303 #define CPUID_FEAT2_SSE41 0x00080000
304 #define CPUID_FEAT2_SSE42 0x00100000
305 #define CPUID_FEAT2_X2APIC 0x00200000
306 #define CPUID_FEAT2_MOVBE 0x00400000
307 #define CPUID_FEAT2_POPCNT 0x00800000
308 #define CPUID_FEAT2_AES 0x02000000
309 #define CPUID_FEAT2_XSAVE 0x04000000
310 #define CPUID_FEAT2_OSXSAVE 0x08000000
311 #define CPUID_FEAT2_AVX 0x10000000
313 int read_cpuid(struct cpuid_info *info);