Last active
June 15, 2022 06:19
-
-
Save JJL772/4c10ee2b35114a88393696f6a6f93054 to your computer and use it in GitHub Desktop.
Somewhat comprehensive list of feature test macros for C/C++. Leave a comment if I forgot anything
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Compile time info | |
#pragma once | |
//==========================================================// | |
// Feature test macros. Enjoy (or not) | |
//==========================================================// | |
// FORBID_XXX stuff is used to force disable various intrinsics | |
// See the OS_XXX section (near the bottom) to find which OS you're using | |
#if ( defined(__AVX__) ) && !( defined(FORBID_SIMD) || defined(FORBID_AVX) ) | |
# undef USE_AVX | |
# define USE_AVX 1 | |
#endif | |
#if ( defined(__AVX2__) ) && !( defined(FORBID_SIMD) || defined(FORBID_AVX2) ) | |
# undef USE_AVX2 | |
# define USE_AVX2 1 | |
#endif | |
#if ( defined(__SSE__) || defined(_M_X64) || (_M_IX86_FP >= 1) ) && !( defined(FORBID_SIMD) || defined(FORBID_SSE) ) | |
# undef USE_SSE | |
# define USE_SSE 1 | |
#endif | |
#if ( defined(__SSE2__) || defined(_M_X64) || (_M_IX86_FP >= 2) ) && !( defined(FORBID_SIMD) || defined(FORBID_SSE2) ) | |
# undef USE_SSE2 | |
# define USE_SSE2 1 | |
#endif | |
#if ( defined(__SSE3__) || defined(_M_X64) ) && !( defined(FORBID_SIMD) || defined(FORBID_SSE3) ) | |
# undef USE_SSE3 | |
# define USE_SSE3 1 | |
#endif | |
#if ( defined(__SSE4_1__) ) && !( defined(FORBID_SIMD) || defined(FORBID_SSE41) ) | |
# undef USE_SSE41 | |
# define USE_SSE41 1 | |
#endif | |
#if ( defined(__SSE4_2__) ) && !( defined(FORBID_SIMD) || defined(FORBID_SSE42) ) | |
# undef USE_SSE42 | |
# define USE_SSE42 1 | |
#endif | |
#if ( defined(__SSSE3__) ) && !( defined(FORBID_SIMD) || defined(FORBID_SSSE3) ) | |
# undef USE_SSSE3 | |
# define USE_SSSE3 1 | |
#endif | |
#if ( defined(__ARM_NEON) ) && !( defined(FORBID_SIMD) || defined(FORBID_NEON) ) | |
# undef USE_NEON | |
# define USE_NEON 1 | |
#endif | |
#if ( defined(__ARM_FEATURE_SVE) ) && !( defined(FORBID_SIMD) || defined(FORBID_SVE) ) | |
# undef USE_SVE | |
# define USE_SVE 1 | |
#endif | |
#if ( defined(__ARM_FEATURE_SVE2) ) && !( defined(FORBID_SIMD) || defined(FORBID_SVE2) ) | |
# undef USE_SVE2 | |
# define USE_SVE2 1 | |
#endif | |
#if ( defined(__ARM_FEATURE_CRC32) ) | |
# undef HAS_ARM_CRC32 | |
# define HAS_ARM_CRC32 1 | |
#endif | |
#if ( defined(__ARM_FEATURE_FMA) ) | |
# undef HAS_ARM_FMA | |
# define HAS_ARM_FMA 1 | |
#endif | |
#if ( defined(__ARM_FEATURE_COMPLEX) ) | |
# undef HAS_ARM_COMPLEX | |
# define HAS_ARM_COMPLEX 1 | |
#endif | |
#if ( defined(__ARM_FEATURE_SVE) ) | |
# undef HAS_ARM_SVE | |
# define HAS_ARM_SVE 1 | |
#endif | |
#if ( defined(__ARM_FEATURE_SVE2) ) | |
# undef HAS_ARM_SVE2 | |
# define HAS_ARM_SVE2 1 | |
#endif | |
#if ( defined(__amd64__) || defined(_M_X64_) ) | |
# undef PLATFORM_64BITS | |
# undef _X64_ | |
# undef PLATFORM_AMD64 | |
# define PLATFORM_64BITS 1 | |
# define _X64_ 1 | |
# define PLATFORM_AMD64 1 | |
#endif | |
#if ( defined(__i386__) || defined(_M_IX86_) ) | |
# undef PLATFORM_32BITS | |
# undef PLATFORM_X86 | |
# undef _X86_ | |
# define PLATFORM_32BITS 1 | |
# define PLATFORM_X86 1 | |
# define _X86_ 1 | |
#endif | |
#if ( defined(_M_ARM) || defined(__arm__) ) | |
# undef PLATFORM_32BITS | |
# undef PLATFORM_ARM | |
# undef PLATFORM_ARM32 | |
# define PLATFORM_32BITS 1 | |
# define PLATFORM_ARM 1 | |
# define PLATFORM_ARM32 1 | |
#endif | |
#if ( defined(_M_ARM64) || defined(__aarch64__) ) | |
# undef PLATFORM_64BITS | |
# undef PLATFORM_ARM | |
# undef PLATFORM_ARM64 | |
# define PLATFORM_64BITS 1 | |
# define PLATFORM_ARM 1 | |
# define PLATFORM_ARM64 1 | |
#endif | |
#if ( defined(__ppc64__) ) | |
# undef PLATFORM_64BITS | |
# undef PLATFORM_PPC | |
# undef PLATFORM_PPC64 | |
# define PLATFORM_64BITS 1 | |
# define PLATFORM_PPC 1 | |
# define PLATFORM_PPC64 1 | |
#elif ( defined(__ppc__) ) | |
# undef PLATFORM_32BITS | |
# undef PLATFORM_PPC | |
# undef PLATFORM_PPC32 | |
# define PLATFORM_32BITS 1 | |
# define PLATFORM_PPC 1 | |
# define PLATFORM_PPC32 1 | |
#endif | |
#if ( defined(__riscv) ) | |
# undef PLATFORM_64BITS | |
# undef PLATFORM_RISCV | |
# undef PLATFORM_RISCV64 | |
# define PLATFORM_64BITS 1 | |
# define PLATFORM_RISCV 1 | |
# define PLATFORM_RISCV64 1 | |
#endif | |
#if ( defined(__GNUC__) ) | |
# undef COMPILER_GCC | |
# define COMPILER_GCC 1 | |
#endif | |
#if ( defined(_MSC_VER) ) | |
# undef COMPILER_MSVC | |
# define COMPILER_MSVC 1 | |
#endif | |
#if ( defined(__clang__) ) | |
# undef COMPILER_CLANG | |
# define COMPILER_CLANG 1 | |
#endif | |
#if ( defined(__linux__) ) | |
# undef OS_STRING | |
# define OS_STRING "Linux" | |
# undef OS_LINUX | |
# define OS_LINUX 1 | |
# undef OS_POSIX | |
# define OS_POSIX 1 | |
#endif | |
#if ( defined(_WIN32) || defined(__CYGWIN__) ) | |
# undef OS_STRING | |
# define OS_STRING "Windows" | |
# undef OS_WINDOWS | |
# define OS_WINDOWS 1 | |
#endif | |
#if ( defined(__APPLE__) ) | |
# undef OS_STRING | |
# define OS_STRING "OSX" | |
# undef OS_OSX | |
# define OS_OSX 1 | |
# undef OS_POSIX | |
# define OS_POSIX 1 | |
#endif | |
#if ( defined(__ANDROID__) ) | |
# undef OS_STRING | |
# define OS_STRING "Android" | |
# undef OS_ANDROID | |
# define OS_ANDROID | |
# undef OS_POSIX | |
# define OS_POSIX 1 | |
#endif | |
// For mingw/cygwin, we're mostly posix compliant, barring some small problems. Indicate that core posix features are available, but not everything | |
#if defined(__CYGWIN__) || defined(__MINGW32__) || defined(__MINGW__) || defined(__MINGW64__) || defined(OS_POSIX) | |
# undef OS_PARTIAL_POSIX | |
# define OS_PARTIAL_POSIX 1 | |
#endif | |
#if defined(__MINGW__) || defined(__MINGW64__) || defined(__MINGW32__) | |
# undef COMPILER_MINGW 0 | |
# define COMPILER_MINGW 1 | |
#endif | |
#if defined(__CYGWIN__) | |
# undef COMPILER_CYGWIN 0 | |
# define COMPILER_CYGWIN 1 | |
#endif | |
// GCC/Clang only, afaik | |
#if ( __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ ) | |
# undef PLATFORM_BIG_ENDIAN | |
# define PLATFORM_BIG_ENDIAN 1 | |
#else | |
# undef PLATFORM_LITTLE_ENDIAN | |
# define PLATFORM_LITTLE_ENDIAN 1 | |
#endif | |
#ifdef OS_WINDOWS | |
# undef DLL_EXT | |
# define DLL_EXT ".dll" | |
# undef LIB_EXT | |
# define LIB_EXT ".lib" | |
# undef EXE_EXT | |
# define EXE_EXT ".exe" | |
#elif OS_OSX | |
# undef DLL_EXT | |
# define DLL_EXT ".dylib" | |
# undef LIB_EXT | |
# define LIB_EXT ".a" | |
# undef EXE_EXT | |
# define EXE_EXT "" | |
#else | |
# undef DLL_EXT | |
# define DLL_EXT ".so" | |
# undef LIB_EXT | |
# define LIB_EXT ".a" | |
# undef EXE_EXT | |
# define EXE_EXT "" | |
#endif | |
#if (COMPILER_CLANG == 1) || (COMPILER_GCC == 1) | |
# ifdef OS_WINDOWS | |
# undef COMPILER_DLLEXPORT | |
# define COMPILER_DLLEXPORT __attribute__((dllexport)) | |
# undef COMPILER_DLLIMPORT | |
# define COMPILER_DLLIMPORT __attribute__((dllimport)) | |
# else | |
# undef COMPILER_DLLEXPORT | |
# define COMPILER_DLLEXPORT __attribute__((visibility("default"))) | |
# undef COMPILER_DLLIMPORT | |
# define COMPILER_DLLIMPORT /* N/A :) */ | |
# endif | |
#else | |
# undef COMPILER_DLLEXPORT | |
# define COMPILER_DLLEXPORT __declspec(dllexport) | |
# undef COMPILER_DLLIMPORT | |
# define COMPILER_DLLIMPORT __declspec(dllimport) | |
#endif | |
#ifdef OS_POSIX | |
#undef _POSIX | |
#define _POSIX 1 | |
#endif | |
#ifdef OS_LINUX | |
#undef _LINUX | |
#define _LINUX 1 | |
#endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment