#ifndef __MDFN_TYPES_H #define __MDFN_TYPES_H #if defined(__x86_64__) && defined(__code_model_large__) #error "Compiling with large memory model is not recommended, for performance reasons." #endif // // // #include #include #include #include #include #include #include #include #ifdef __cplusplus #include #include #include #include #include #include #include #include #include #endif typedef int8_t int8; typedef int16_t int16; typedef int32_t int32; typedef int64_t int64; typedef uint8_t uint8; typedef uint16_t uint16; typedef uint32_t uint32; typedef uint64_t uint64; #if !defined(HAVE_NATIVE64BIT) && (SIZEOF_VOID_P >= 8 || defined(__x86_64__)) #define HAVE_NATIVE64BIT 1 #endif #if defined(__GNUC__) || defined(__clang__) || defined(__ICC) || defined(__INTEL_COMPILER) #define HAVE_COMPUTED_GOTO 1 #endif #if defined(__clang__) // // Begin clang // #define MDFN_MAKE_CLANGV(maj,min,pl) (((maj)*100*100) + ((min) * 100) + (pl)) #define MDFN_CLANG_VERSION MDFN_MAKE_CLANGV(__clang_major__, __clang_minor__, __clang_patchlevel__) #ifndef INLINE #define INLINE inline __attribute__((always_inline)) #endif #define NO_INLINE __attribute__((noinline)) #define NO_CLONE #if defined(__386__) || defined(__i386__) || defined(__i386) || defined(_M_IX86) || defined(_M_I386) #define MDFN_FASTCALL __attribute__((fastcall)) #else #define MDFN_FASTCALL #endif #define MDFN_FORMATSTR(a,b,c) #define MDFN_WARN_UNUSED_RESULT __attribute__ ((warn_unused_result)) #define MDFN_NOWARN_UNUSED __attribute__((unused)) #define MDFN_UNLIKELY(n) __builtin_expect((n) != 0, 0) #define MDFN_LIKELY(n) __builtin_expect((n) != 0, 1) #define MDFN_COLD __attribute__((cold)) #define MDFN_HOT __attribute__((hot)) #if MDFN_CLANG_VERSION >= MDFN_MAKE_CLANGV(3,6,0) && defined(HAS_CXX11) #define MDFN_ASSUME_ALIGNED(p, align) ((decltype(p))__builtin_assume_aligned((p), (align))) #else #define MDFN_ASSUME_ALIGNED(p, align) (p) #endif #elif defined(__GNUC__) // // Begin gcc // #define MDFN_MAKE_GCCV(maj,min,pl) (((maj)*100*100) + ((min) * 100) + (pl)) #define MDFN_GCC_VERSION MDFN_MAKE_GCCV(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) #ifndef INLINE #define INLINE inline __attribute__((always_inline)) #endif #define NO_INLINE __attribute__((noinline)) #if MDFN_GCC_VERSION >= MDFN_MAKE_GCCV(4,5,0) #define NO_CLONE __attribute__((noclone)) #else #define NO_CLONE #endif #if MDFN_GCC_VERSION < MDFN_MAKE_GCCV(4,8,0) #define alignas(n) __attribute__ ((aligned (n))) // Kludge for 4.7.x, remove eventually when 4.8+ are not so new. #endif // // Just avoid using fastcall with gcc before 4.1.0, as it(and similar regparm) // tend to generate bad code on the older versions(between about 3.1.x and 4.0.x, at least) // // http://gcc.gnu.org/bugzilla/show_bug.cgi?id=12236 // http://gcc.gnu.org/bugzilla/show_bug.cgi?id=7574 // http://gcc.gnu.org/bugzilla/show_bug.cgi?id=17025 // #if MDFN_GCC_VERSION >= MDFN_MAKE_GCCV(4,1,0) #if defined(__386__) || defined(__i386__) || defined(__i386) || defined(_M_IX86) || defined(_M_I386) #define MDFN_FASTCALL __attribute__((fastcall)) #else #define MDFN_FASTCALL #endif #else #define MDFN_FASTCALL #endif #define MDFN_FORMATSTR(a,b,c) __attribute__ ((format (a, b, c))) #define MDFN_WARN_UNUSED_RESULT __attribute__ ((warn_unused_result)) #define MDFN_NOWARN_UNUSED __attribute__((unused)) #define MDFN_UNLIKELY(n) __builtin_expect((n) != 0, 0) #define MDFN_LIKELY(n) __builtin_expect((n) != 0, 1) #if MDFN_GCC_VERSION >= MDFN_MAKE_GCCV(4,3,0) #define MDFN_COLD __attribute__((cold)) #define MDFN_HOT __attribute__((hot)) #else #define MDFN_COLD #define MDFN_HOT #endif #if MDFN_GCC_VERSION >= MDFN_MAKE_GCCV(4,7,0) && defined(HAS_CXX11) #define MDFN_ASSUME_ALIGNED(p, align) ((decltype(p))__builtin_assume_aligned((p), (align))) #else #define MDFN_ASSUME_ALIGNED(p, align) (p) #endif #elif defined(_MSC_VER) // // Begin MSVC // #define INLINE __forceinline #define NO_INLINE __declspec(noinline) #define NO_CLONE #define MDFN_FASTCALL __fastcall #define MDFN_FORMATSTR(a,b,c) #define MDFN_WARN_UNUSED_RESULT #define MDFN_NOWARN_UNUSED #define MDFN_UNLIKELY(n) ((n) != 0) #define MDFN_LIKELY(n) ((n) != 0) #define MDFN_COLD #define MDFN_HOT #define MDFN_ASSUME_ALIGNED(p, align) (p) #else #define INLINE inline #define NO_INLINE #define NO_CLONE #define MDFN_FASTCALL #define MDFN_FORMATSTR(a,b,c) #define MDFN_WARN_UNUSED_RESULT #define MDFN_NOWARN_UNUSED #define MDFN_UNLIKELY(n) ((n) != 0) #define MDFN_LIKELY(n) ((n) != 0) #define MDFN_COLD #define MDFN_HOT #define MDFN_ASSUME_ALIGNED(p, align) (p) #endif #ifndef FALSE #define FALSE 0 #endif #ifndef TRUE #define TRUE 1 #endif #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ #define MSB_FIRST #else #define LSB_FIRST #endif #if !defined(MSB_FIRST) && !defined(LSB_FIRST) #error "Define MSB_FIRST or LSB_FIRST!" #elif defined(MSB_FIRST) && defined(LSB_FIRST) #error "Define only one of MSB_FIRST or LSB_FIRST, not both!" #endif #ifdef MSB_FIRST #define MDFN_IS_BIGENDIAN true #else #define MDFN_IS_BIGENDIAN false #endif #ifdef _MSC_VER #define MDFN_ALIGN(n) __declspec(align(n)) #else #define MDFN_ALIGN(n) __attribute__ ((aligned (n))) #endif #endif