mirror of https://github.com/PCSX2/pcsx2.git
160 lines
4.8 KiB
C
160 lines
4.8 KiB
C
/* Compiler.h : Compiler specific defines and pragmas
|
|
2023-04-02 : Igor Pavlov : Public domain */
|
|
|
|
#ifndef ZIP7_INC_COMPILER_H
|
|
#define ZIP7_INC_COMPILER_H
|
|
|
|
#if defined(__clang__)
|
|
# define Z7_CLANG_VERSION (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__)
|
|
#endif
|
|
#if defined(__clang__) && defined(__apple_build_version__)
|
|
# define Z7_APPLE_CLANG_VERSION Z7_CLANG_VERSION
|
|
#elif defined(__clang__)
|
|
# define Z7_LLVM_CLANG_VERSION Z7_CLANG_VERSION
|
|
#elif defined(__GNUC__)
|
|
# define Z7_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
|
|
#endif
|
|
|
|
#ifdef _MSC_VER
|
|
#if !defined(__clang__) && !defined(__GNUC__)
|
|
#define Z7_MSC_VER_ORIGINAL _MSC_VER
|
|
#endif
|
|
#endif
|
|
|
|
#if defined(__MINGW32__) || defined(__MINGW64__)
|
|
#define Z7_MINGW
|
|
#endif
|
|
|
|
// #pragma GCC diagnostic ignored "-Wunknown-pragmas"
|
|
|
|
#ifdef __clang__
|
|
// padding size of '' with 4 bytes to alignment boundary
|
|
#pragma GCC diagnostic ignored "-Wpadded"
|
|
#endif
|
|
|
|
|
|
#ifdef _MSC_VER
|
|
|
|
#ifdef UNDER_CE
|
|
#define RPC_NO_WINDOWS_H
|
|
/* #pragma warning(disable : 4115) // '_RPC_ASYNC_STATE' : named type definition in parentheses */
|
|
#pragma warning(disable : 4201) // nonstandard extension used : nameless struct/union
|
|
#pragma warning(disable : 4214) // nonstandard extension used : bit field types other than int
|
|
#endif
|
|
|
|
#if defined(_MSC_VER) && _MSC_VER >= 1800
|
|
#pragma warning(disable : 4464) // relative include path contains '..'
|
|
#endif
|
|
|
|
// == 1200 : -O1 : for __forceinline
|
|
// >= 1900 : -O1 : for printf
|
|
#pragma warning(disable : 4710) // function not inlined
|
|
|
|
#if _MSC_VER < 1900
|
|
// winnt.h: 'Int64ShllMod32'
|
|
#pragma warning(disable : 4514) // unreferenced inline function has been removed
|
|
#endif
|
|
|
|
#if _MSC_VER < 1300
|
|
// #pragma warning(disable : 4702) // unreachable code
|
|
// Bra.c : -O1:
|
|
#pragma warning(disable : 4714) // function marked as __forceinline not inlined
|
|
#endif
|
|
|
|
/*
|
|
#if _MSC_VER > 1400 && _MSC_VER <= 1900
|
|
// strcat: This function or variable may be unsafe
|
|
// sysinfoapi.h: kit10: GetVersion was declared deprecated
|
|
#pragma warning(disable : 4996)
|
|
#endif
|
|
*/
|
|
|
|
#if _MSC_VER > 1200
|
|
// -Wall warnings
|
|
|
|
#pragma warning(disable : 4711) // function selected for automatic inline expansion
|
|
#pragma warning(disable : 4820) // '2' bytes padding added after data member
|
|
|
|
#if _MSC_VER >= 1400 && _MSC_VER < 1920
|
|
// 1400: string.h: _DBG_MEMCPY_INLINE_
|
|
// 1600 - 191x : smmintrin.h __cplusplus'
|
|
// is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'
|
|
#pragma warning(disable : 4668)
|
|
|
|
// 1400 - 1600 : WinDef.h : 'FARPROC' :
|
|
// 1900 - 191x : immintrin.h: _readfsbase_u32
|
|
// no function prototype given : converting '()' to '(void)'
|
|
#pragma warning(disable : 4255)
|
|
#endif
|
|
|
|
#if _MSC_VER >= 1914
|
|
// Compiler will insert Spectre mitigation for memory load if /Qspectre switch specified
|
|
#pragma warning(disable : 5045)
|
|
#endif
|
|
|
|
#endif // _MSC_VER > 1200
|
|
#endif // _MSC_VER
|
|
|
|
|
|
#if defined(__clang__) && (__clang_major__ >= 4)
|
|
#define Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE \
|
|
_Pragma("clang loop unroll(disable)") \
|
|
_Pragma("clang loop vectorize(disable)")
|
|
#define Z7_ATTRIB_NO_VECTORIZE
|
|
#elif defined(__GNUC__) && (__GNUC__ >= 5)
|
|
#define Z7_ATTRIB_NO_VECTORIZE __attribute__((optimize("no-tree-vectorize")))
|
|
// __attribute__((optimize("no-unroll-loops")));
|
|
#define Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE
|
|
#elif defined(_MSC_VER) && (_MSC_VER >= 1920)
|
|
#define Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE \
|
|
_Pragma("loop( no_vector )")
|
|
#define Z7_ATTRIB_NO_VECTORIZE
|
|
#else
|
|
#define Z7_PRAGMA_OPT_DISABLE_LOOP_UNROLL_VECTORIZE
|
|
#define Z7_ATTRIB_NO_VECTORIZE
|
|
#endif
|
|
|
|
#if defined(MY_CPU_X86_OR_AMD64) && ( \
|
|
defined(__clang__) && (__clang_major__ >= 4) \
|
|
|| defined(__GNUC__) && (__GNUC__ >= 5))
|
|
#define Z7_ATTRIB_NO_SSE __attribute__((__target__("no-sse")))
|
|
#else
|
|
#define Z7_ATTRIB_NO_SSE
|
|
#endif
|
|
|
|
#define Z7_ATTRIB_NO_VECTOR \
|
|
Z7_ATTRIB_NO_VECTORIZE \
|
|
Z7_ATTRIB_NO_SSE
|
|
|
|
|
|
#if defined(__clang__) && (__clang_major__ >= 8) \
|
|
|| defined(__GNUC__) && (__GNUC__ >= 1000) \
|
|
/* || defined(_MSC_VER) && (_MSC_VER >= 1920) */
|
|
// GCC is not good for __builtin_expect()
|
|
#define Z7_LIKELY(x) (__builtin_expect((x), 1))
|
|
#define Z7_UNLIKELY(x) (__builtin_expect((x), 0))
|
|
// #define Z7_unlikely [[unlikely]]
|
|
// #define Z7_likely [[likely]]
|
|
#else
|
|
#define Z7_LIKELY(x) (x)
|
|
#define Z7_UNLIKELY(x) (x)
|
|
// #define Z7_likely
|
|
#endif
|
|
|
|
|
|
#if (defined(Z7_CLANG_VERSION) && (Z7_CLANG_VERSION >= 36000))
|
|
#define Z7_DIAGNOSCTIC_IGNORE_BEGIN_RESERVED_MACRO_IDENTIFIER \
|
|
_Pragma("GCC diagnostic push") \
|
|
_Pragma("GCC diagnostic ignored \"-Wreserved-macro-identifier\"")
|
|
#define Z7_DIAGNOSCTIC_IGNORE_END_RESERVED_MACRO_IDENTIFIER \
|
|
_Pragma("GCC diagnostic pop")
|
|
#else
|
|
#define Z7_DIAGNOSCTIC_IGNORE_BEGIN_RESERVED_MACRO_IDENTIFIER
|
|
#define Z7_DIAGNOSCTIC_IGNORE_END_RESERVED_MACRO_IDENTIFIER
|
|
#endif
|
|
|
|
#define UNUSED_VAR(x) (void)x;
|
|
/* #define UNUSED_VAR(x) x=x; */
|
|
|
|
#endif
|