platform.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. #pragma once
  2. // ya style breaks indentation in ifdef's and code becomes unreadable
  3. // clang-format off
  4. // What OS ?
  5. // our definition has the form _{osname}_
  6. #if defined(_WIN64)
  7. #define _win64_
  8. #define _win32_
  9. #elif defined(__WIN32__) || defined(_WIN32) // _WIN32 is also defined by the 64-bit compiler for backward compatibility
  10. #define _win32_
  11. #else
  12. #define _unix_
  13. #if defined(__sun__) || defined(sun) || defined(sparc) || defined(__sparc)
  14. #define _sun_
  15. #endif
  16. #if defined(__hpux__)
  17. #define _hpux_
  18. #endif
  19. #if defined(__linux__)
  20. // Stands for "Linux" in the means of Linux kernel (i. e. Android is included)
  21. #define _linux_
  22. #endif
  23. #if defined(__FreeBSD__)
  24. #define _freebsd_
  25. #endif
  26. #if defined(__CYGWIN__)
  27. #define _cygwin_
  28. #endif
  29. #if defined(__APPLE__)
  30. #define _darwin_
  31. #endif
  32. #if defined(__ANDROID__)
  33. #define _android_
  34. #endif
  35. #endif
  36. #if defined(__IOS__)
  37. #define _ios_
  38. #endif
  39. #if defined(_linux_)
  40. #if defined(_musl_)
  41. // nothing to do
  42. #elif defined(_android_)
  43. // Please do not mix with android-based systems.
  44. // This definition describes Standard Library (libc) type.
  45. #define _bionic_
  46. #else
  47. #define _glibc_
  48. #endif
  49. #endif
  50. #if defined(_darwin_)
  51. #define unix
  52. #define __unix__
  53. #endif
  54. #if defined(_win32_) || defined(_win64_)
  55. #define _win_
  56. #endif
  57. #if defined(__arm__) || defined(__ARM__) || defined(__ARM_NEON) || defined(__aarch64__) || defined(_M_ARM)
  58. #if defined(__arm64) || defined(__arm64__) || defined(__aarch64__)
  59. #define _arm64_
  60. #else
  61. #define _arm32_
  62. #endif
  63. #endif
  64. #if defined(_arm64_) || defined(_arm32_)
  65. #define _arm_
  66. #endif
  67. /* __ia64__ and __x86_64__ - defined by GNU C.
  68. * _M_IA64, _M_X64, _M_AMD64 - defined by Visual Studio.
  69. *
  70. * Microsoft can define _M_IX86, _M_AMD64 (before Visual Studio 8)
  71. * or _M_X64 (starting in Visual Studio 8).
  72. */
  73. #if defined(__x86_64__) || defined(_M_X64) || defined(_M_AMD64)
  74. #define _x86_64_
  75. #endif
  76. #if defined(__i386__) || defined(_M_IX86)
  77. #define _i386_
  78. #endif
  79. #if defined(__ia64__) || defined(_M_IA64)
  80. #define _ia64_
  81. #endif
  82. #if defined(__powerpc__)
  83. #define _ppc_
  84. #endif
  85. #if defined(__powerpc64__)
  86. #define _ppc64_
  87. #endif
  88. #if !defined(sparc) && !defined(__sparc) && !defined(__hpux__) && !defined(__alpha__) && !defined(_ia64_) && !defined(_x86_64_) && !defined(_arm_) && !defined(_i386_) && !defined(_ppc_) && !defined(_ppc64_)
  89. #error "platform not defined, please, define one"
  90. #endif
  91. #if defined(_x86_64_) || defined(_i386_)
  92. #define _x86_
  93. #endif
  94. #if defined(__MIC__)
  95. #define _mic_
  96. #define _k1om_
  97. #endif
  98. // stdio or MessageBox
  99. #if defined(__CONSOLE__) || defined(_CONSOLE)
  100. #define _console_
  101. #endif
  102. #if (defined(_win_) && !defined(_console_))
  103. #define _windows_
  104. #elif !defined(_console_)
  105. #define _console_
  106. #endif
  107. #if defined(__SSE__) || defined(SSE_ENABLED)
  108. #define _sse_
  109. #endif
  110. #if defined(__SSE2__) || defined(SSE2_ENABLED)
  111. #define _sse2_
  112. #endif
  113. #if defined(__SSE3__) || defined(SSE3_ENABLED)
  114. #define _sse3_
  115. #endif
  116. #if defined(__SSSE3__) || defined(SSSE3_ENABLED)
  117. #define _ssse3_
  118. #endif
  119. #if defined(__SSE4_1__) || defined(SSE41_ENABLED)
  120. #define _sse4_1_
  121. #endif
  122. #if defined(__SSE4_2__) || defined(SSE42_ENABLED)
  123. #define _sse4_2_
  124. #endif
  125. #if defined(__POPCNT__) || defined(POPCNT_ENABLED)
  126. #define _popcnt_
  127. #endif
  128. #if defined(__PCLMUL__) || defined(PCLMUL_ENABLED)
  129. #define _pclmul_
  130. #endif
  131. #if defined(__AES__) || defined(AES_ENABLED)
  132. #define _aes_
  133. #endif
  134. #if defined(__AVX__) || defined(AVX_ENABLED)
  135. #define _avx_
  136. #endif
  137. #if defined(__AVX2__) || defined(AVX2_ENABLED)
  138. #define _avx2_
  139. #endif
  140. #if defined(__FMA__) || defined(FMA_ENABLED)
  141. #define _fma_
  142. #endif
  143. #if defined(__DLL__) || defined(_DLL)
  144. #define _dll_
  145. #endif
  146. // 16, 32 or 64
  147. #if defined(__sparc_v9__) || defined(_x86_64_) || defined(_ia64_) || defined(_arm64_) || defined(_ppc64_)
  148. #define _64_
  149. #else
  150. #define _32_
  151. #endif
  152. /* All modern 64-bit Unix systems use scheme LP64 (long, pointers are 64-bit).
  153. * Microsoft uses a different scheme: LLP64 (long long, pointers are 64-bit).
  154. *
  155. * Scheme LP64 LLP64
  156. * char 8 8
  157. * short 16 16
  158. * int 32 32
  159. * long 64 32
  160. * long long 64 64
  161. * pointer 64 64
  162. */
  163. #if defined(_32_)
  164. #define SIZEOF_PTR 4
  165. #elif defined(_64_)
  166. #define SIZEOF_PTR 8
  167. #endif
  168. #define PLATFORM_DATA_ALIGN SIZEOF_PTR
  169. #if !defined(SIZEOF_PTR)
  170. #error todo
  171. #endif
  172. #define SIZEOF_CHAR 1
  173. #define SIZEOF_UNSIGNED_CHAR 1
  174. #define SIZEOF_SHORT 2
  175. #define SIZEOF_UNSIGNED_SHORT 2
  176. #define SIZEOF_INT 4
  177. #define SIZEOF_UNSIGNED_INT 4
  178. #if defined(_32_)
  179. #define SIZEOF_LONG 4
  180. #define SIZEOF_UNSIGNED_LONG 4
  181. #elif defined(_64_)
  182. #if defined(_win_)
  183. #define SIZEOF_LONG 4
  184. #define SIZEOF_UNSIGNED_LONG 4
  185. #else
  186. #define SIZEOF_LONG 8
  187. #define SIZEOF_UNSIGNED_LONG 8
  188. #endif // _win_
  189. #endif // _32_
  190. #if !defined(SIZEOF_LONG)
  191. #error todo
  192. #endif
  193. #define SIZEOF_LONG_LONG 8
  194. #define SIZEOF_UNSIGNED_LONG_LONG 8
  195. #undef SIZEOF_SIZE_T // in case we include <Python.h> which defines it, too
  196. #define SIZEOF_SIZE_T SIZEOF_PTR
  197. // clang-format on