SDL_intrin.h 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. /*
  2. Simple DirectMedia Layer
  3. Copyright (C) 1997-2023 Sam Lantinga <[email protected]>
  4. This software is provided 'as-is', without any express or implied
  5. warranty. In no event will the authors be held liable for any damages
  6. arising from the use of this software.
  7. Permission is granted to anyone to use this software for any purpose,
  8. including commercial applications, and to alter it and redistribute it
  9. freely, subject to the following restrictions:
  10. 1. The origin of this software must not be misrepresented; you must not
  11. claim that you wrote the original software. If you use this software
  12. in a product, an acknowledgment in the product documentation would be
  13. appreciated but is not required.
  14. 2. Altered source versions must be plainly marked as such, and must not be
  15. misrepresented as being the original software.
  16. 3. This notice may not be removed or altered from any source distribution.
  17. */
  18. /**
  19. * \file SDL_intrin.h
  20. *
  21. * \brief Header file for CPU intrinsics for SDL
  22. */
  23. #ifndef SDL_intrin_h_
  24. #define SDL_intrin_h_
  25. #include <SDL3/SDL_stdinc.h>
  26. /* Need to do this here because intrin.h has C++ code in it */
  27. /* Visual Studio 2005 has a bug where intrin.h conflicts with winnt.h */
  28. #if defined(_MSC_VER) && (_MSC_VER >= 1500) && (defined(_M_IX86) || defined(_M_X64))
  29. #ifdef __clang__
  30. /* As of Clang 11, '_m_prefetchw' is conflicting with the winnt.h's version,
  31. so we define the needed '_m_prefetch' here as a pseudo-header, until the issue is fixed. */
  32. #ifndef __PRFCHWINTRIN_H
  33. #define __PRFCHWINTRIN_H
  34. static __inline__ void __attribute__((__always_inline__, __nodebug__))
  35. _m_prefetch(void *__P)
  36. {
  37. __builtin_prefetch (__P, 0, 3 /* _MM_HINT_T0 */);
  38. }
  39. #endif /* __PRFCHWINTRIN_H */
  40. #endif /* __clang__ */
  41. #include <intrin.h>
  42. #elif defined(__MINGW64_VERSION_MAJOR)
  43. #include <intrin.h>
  44. #if defined(__ARM_NEON) && !defined(SDL_DISABLE_NEON)
  45. # define SDL_NEON_INTRINSICS 1
  46. # include <arm_neon.h>
  47. #endif
  48. #else
  49. /* altivec.h redefining bool causes a number of problems, see bugs 3993 and 4392, so you need to explicitly define SDL_ENABLE_ALTIVEC to have it included. */
  50. #if defined(__ALTIVEC__) && defined(SDL_ENABLE_ALTIVEC)
  51. #define SDL_ALTIVEC_INTRINSICS 1
  52. #include <altivec.h>
  53. #endif
  54. #ifndef SDL_DISABLE_NEON
  55. # ifdef __ARM_NEON
  56. # define SDL_NEON_INTRINSICS 1
  57. # include <arm_neon.h>
  58. # elif defined(__WINDOWS__) || defined(__WINRT__) || defined(__GDK__)
  59. /* Visual Studio doesn't define __ARM_ARCH, but _M_ARM (if set, always 7), and _M_ARM64 (if set, always 1). */
  60. # ifdef _M_ARM
  61. # define SDL_NEON_INTRINSICS 1
  62. # include <armintr.h>
  63. # include <arm_neon.h>
  64. # define __ARM_NEON 1 /* Set __ARM_NEON so that it can be used elsewhere, at compile time */
  65. # endif
  66. # if defined (_M_ARM64)
  67. # define SDL_NEON_INTRINSICS 1
  68. # include <arm64intr.h>
  69. # include <arm64_neon.h>
  70. # define __ARM_NEON 1 /* Set __ARM_NEON so that it can be used elsewhere, at compile time */
  71. # define __ARM_ARCH 8
  72. # endif
  73. # endif
  74. #endif
  75. #endif /* compiler version */
  76. #if defined(__clang__) && defined(__has_attribute)
  77. # if __has_attribute(target)
  78. # define SDL_HAS_TARGET_ATTRIBS
  79. # endif
  80. #elif defined(__GNUC__) && (__GNUC__ + (__GNUC_MINOR__ >= 9) > 4) /* gcc >= 4.9 */
  81. # define SDL_HAS_TARGET_ATTRIBS
  82. #elif defined(__ICC) && __ICC >= 1600
  83. # define SDL_HAS_TARGET_ATTRIBS
  84. #endif
  85. #ifdef SDL_HAS_TARGET_ATTRIBS
  86. # define SDL_TARGETING(x) __attribute__((target(x)))
  87. #else
  88. # define SDL_TARGETING(x)
  89. #endif
  90. #ifdef __loongarch64
  91. # ifndef SDL_DISABLE_LSX
  92. # define SDL_LSX_INTRINSICS 1
  93. # include <lsxintrin.h>
  94. # endif
  95. # ifndef SDL_DISABLE_LASX
  96. # define SDL_LASX_INTRINSICS 1
  97. # include <lasxintrin.h>
  98. # endif
  99. #endif
  100. #if defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86)
  101. # if ((defined(_MSC_VER) && !defined(_M_X64)) || defined(__MMX__) || defined(SDL_HAS_TARGET_ATTRIBS)) && !defined(SDL_DISABLE_MMX)
  102. # define SDL_MMX_INTRINSICS 1
  103. # include <mmintrin.h>
  104. # endif
  105. # if (defined(_MSC_VER) || defined(__SSE__) || defined(SDL_HAS_TARGET_ATTRIBS)) && !defined(SDL_DISABLE_SSE)
  106. # define SDL_SSE_INTRINSICS 1
  107. # include <xmmintrin.h>
  108. # endif
  109. # if (defined(_MSC_VER) || defined(__SSE2__) || defined(SDL_HAS_TARGET_ATTRIBS)) && !defined(SDL_DISABLE_SSE2)
  110. # define SDL_SSE2_INTRINSICS 1
  111. # include <emmintrin.h>
  112. # endif
  113. # if (defined(_MSC_VER) || defined(__SSE3__) || defined(SDL_HAS_TARGET_ATTRIBS)) && !defined(SDL_DISABLE_SSE3)
  114. # define SDL_SSE3_INTRINSICS 1
  115. # include <pmmintrin.h>
  116. # endif
  117. # if (defined(_MSC_VER) || defined(__SSE4_1__) || defined(SDL_HAS_TARGET_ATTRIBS)) && !defined(SDL_DISABLE_SSE4_1)
  118. # define SDL_SSE4_1_INTRINSICS 1
  119. # include <smmintrin.h>
  120. # endif
  121. # if (defined(_MSC_VER) || defined(__SSE4_2__) || defined(SDL_HAS_TARGET_ATTRIBS)) && !defined(SDL_DISABLE_SSE4_2)
  122. # define SDL_SSE4_2_INTRINSICS 1
  123. # include <nmmintrin.h>
  124. # endif
  125. # if defined(__clang__) && (defined(_MSC_VER) || defined(__SCE__)) && !defined(__AVX__) && !defined(SDL_DISABLE_AVX)
  126. # define SDL_DISABLE_AVX /* see https://reviews.llvm.org/D20291 and https://reviews.llvm.org/D79194 */
  127. # endif
  128. # if (defined(_MSC_VER) || defined(__AVX__) || defined(SDL_HAS_TARGET_ATTRIBS)) && !defined(SDL_DISABLE_AVX)
  129. # define SDL_AVX_INTRINSICS 1
  130. # include <immintrin.h>
  131. # endif
  132. # if defined(__clang__) && (defined(_MSC_VER) || defined(__SCE__)) && !defined(__AVX2__) && !defined(SDL_DISABLE_AVX2)
  133. # define SDL_DISABLE_AVX2 /* see https://reviews.llvm.org/D20291 and https://reviews.llvm.org/D79194 */
  134. # endif
  135. # if (defined(_MSC_VER) || defined(__AVX2__) || defined(SDL_HAS_TARGET_ATTRIBS)) && !defined(SDL_DISABLE_AVX2)
  136. # define SDL_AVX2_INTRINSICS 1
  137. # include <immintrin.h>
  138. # endif
  139. # if defined(__clang__) && (defined(_MSC_VER) || defined(__SCE__)) && !defined(__AVX512F__) && !defined(SDL_DISABLE_AVX512F)
  140. # define SDL_DISABLE_AVX512F /* see https://reviews.llvm.org/D20291 and https://reviews.llvm.org/D79194 */
  141. # endif
  142. # if (defined(_MSC_VER) || defined(__AVX512F__) || defined(SDL_HAS_TARGET_ATTRIBS)) && !defined(SDL_DISABLE_AVX512F)
  143. # define SDL_AVX512F_INTRINSICS 1
  144. # include <immintrin.h>
  145. # endif
  146. #endif /* defined(__x86_64__) || defined(_M_X64) || defined(__i386__) || defined(_M_IX86) */
  147. #endif /* SDL_intrin_h_ */