X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2Futil.h;h=cda59bfec453cf6c59461f2018b07e878b8b68f9;hb=8b08e899b6ffcfd2d1b31790de5b3a4412cde64c;hp=7f418a9485c023364d4f05993e4b6ad35a8030e1;hpb=c4a043b45ff38d532579cfdf0b6a7e3f50527559;p=retroray diff --git a/src/util.h b/src/util.h index 7f418a9..cda59bf 100644 --- a/src/util.h +++ b/src/util.h @@ -27,6 +27,19 @@ along with this program. If not, see . #include #endif +#ifdef __GNUC__ +#define PACKED __attribute__((packed)) +#else +#define PACKED +#endif + +unsigned int get_cs(void); +#define get_cpl() ((int)(get_cs() & 3)) + +void get_msr(uint32_t msr, uint32_t *low, uint32_t *high); +void set_msr(uint32_t msr, uint32_t low, uint32_t high); + + /* Non-failing versions of malloc/calloc/realloc. They never return 0, they call * demo_abort on failure. Use the macros, don't call the *_impl functions. */ @@ -44,4 +57,28 @@ int match_prefix(const char *str, const char *prefix); void enable_fpexcept(void); void disable_fpexcept(void); +#ifndef INLINE +#if (__STDC_VERSION__ >= 199901) || defined(__GNUC__) +#define INLINE inline +#else +#define INLINE __inline +#endif +#endif + +#if defined(__i386__) || defined(__386__) || defined(MSDOS) + +/* fast conversion of double -> 32bit int + * for details see: + * - http://chrishecker.com/images/f/fb/Gdmfp.pdf + * - http://stereopsis.com/FPU.html#convert + */ +static INLINE int32_t cround64(double val) +{ + val += 6755399441055744.0; + return *(int32_t*)&val; +} +#else +#define cround64(x) ((int32_t)(x)) +#endif + #endif /* UTIL_H_ */