simde-arch.h 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688
  1. /* Architecture detection
  2. * Created by Evan Nemerson <evan@nemerson.com>
  3. *
  4. * To the extent possible under law, the authors have waived all
  5. * copyright and related or neighboring rights to this code. For
  6. * details, see the Creative Commons Zero 1.0 Universal license at
  7. * <https://creativecommons.org/publicdomain/zero/1.0/>
  8. *
  9. * SPDX-License-Identifier: CC0-1.0
  10. *
  11. * Different compilers define different preprocessor macros for the
  12. * same architecture. This is an attempt to provide a single
  13. * interface which is usable on any compiler.
  14. *
  15. * In general, a macro named SIMDE_ARCH_* is defined for each
  16. * architecture the CPU supports. When there are multiple possible
  17. * versions, we try to define the macro to the target version. For
  18. * example, if you want to check for i586+, you could do something
  19. * like:
  20. *
  21. * #if defined(SIMDE_ARCH_X86) && (SIMDE_ARCH_X86 >= 5)
  22. * ...
  23. * #endif
  24. *
  25. * You could also just check that SIMDE_ARCH_X86 >= 5 without checking
  26. * if it's defined first, but some compilers may emit a warning about
  27. * an undefined macro being used (e.g., GCC with -Wundef).
  28. *
  29. * This was originally created for SIMDe
  30. * <https://github.com/simd-everywhere/simde> (hence the prefix), but this
  31. * header has no dependencies and may be used anywhere. It is
  32. * originally based on information from
  33. * <https://sourceforge.net/p/predef/wiki/Architectures/>, though it
  34. * has been enhanced with additional information.
  35. *
  36. * If you improve this file, or find a bug, please file the issue at
  37. * <https://github.com/simd-everywhere/simde/issues>. If you copy this into
  38. * your project, even if you change the prefix, please keep the links
  39. * to SIMDe intact so others know where to report issues, submit
  40. * enhancements, and find the latest version. */
  41. #if !defined(SIMDE_ARCH_H)
  42. #define SIMDE_ARCH_H
  43. #include "hedley.h"
  44. /* Alpha
  45. <https://en.wikipedia.org/wiki/DEC_Alpha> */
  46. #if defined(__alpha__) || defined(__alpha) || defined(_M_ALPHA)
  47. # if defined(__alpha_ev6__)
  48. # define SIMDE_ARCH_ALPHA 6
  49. # elif defined(__alpha_ev5__)
  50. # define SIMDE_ARCH_ALPHA 5
  51. # elif defined(__alpha_ev4__)
  52. # define SIMDE_ARCH_ALPHA 4
  53. # else
  54. # define SIMDE_ARCH_ALPHA 1
  55. # endif
  56. #endif
  57. #if defined(SIMDE_ARCH_ALPHA)
  58. # define SIMDE_ARCH_ALPHA_CHECK(version) ((version) <= SIMDE_ARCH_ALPHA)
  59. #else
  60. # define SIMDE_ARCH_ALPHA_CHECK(version) (0)
  61. #endif
  62. /* Atmel AVR
  63. <https://en.wikipedia.org/wiki/Atmel_AVR> */
  64. #if defined(__AVR_ARCH__)
  65. # define SIMDE_ARCH_AVR __AVR_ARCH__
  66. #endif
  67. /* AMD64 / x86_64
  68. <https://en.wikipedia.org/wiki/X86-64> */
  69. #if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64)
  70. # if !defined(_M_ARM64EC)
  71. # define SIMDE_ARCH_AMD64 1000
  72. # endif
  73. #endif
  74. /* ARM
  75. <https://en.wikipedia.org/wiki/ARM_architecture> */
  76. #if defined(__ARM_ARCH)
  77. # if __ARM_ARCH > 100
  78. # define SIMDE_ARCH_ARM (__ARM_ARCH)
  79. # else
  80. # define SIMDE_ARCH_ARM (__ARM_ARCH * 100)
  81. # endif
  82. #elif defined(_M_ARM)
  83. # if _M_ARM > 100
  84. # define SIMDE_ARCH_ARM (_M_ARM)
  85. # else
  86. # define SIMDE_ARCH_ARM (_M_ARM * 100)
  87. # endif
  88. #elif defined(_M_ARM64) || defined(_M_ARM64EC)
  89. # define SIMDE_ARCH_ARM 800
  90. #elif defined(__arm__) || defined(__thumb__) || defined(__TARGET_ARCH_ARM) || defined(_ARM) || defined(_M_ARM) || defined(_M_ARM)
  91. # define SIMDE_ARCH_ARM 1
  92. #endif
  93. #if defined(SIMDE_ARCH_ARM)
  94. # define SIMDE_ARCH_ARM_CHECK(major, minor) (((major * 100) + (minor)) <= SIMDE_ARCH_ARM)
  95. #else
  96. # define SIMDE_ARCH_ARM_CHECK(major, minor) (0)
  97. #endif
  98. /* AArch64
  99. <https://en.wikipedia.org/wiki/ARM_architecture> */
  100. #if defined(__aarch64__) || defined(_M_ARM64) || defined(_M_ARM64EC)
  101. # define SIMDE_ARCH_AARCH64 1000
  102. #endif
  103. #if defined(SIMDE_ARCH_AARCH64)
  104. # define SIMDE_ARCH_AARCH64_CHECK(version) ((version) <= SIMDE_ARCH_AARCH64)
  105. #else
  106. # define SIMDE_ARCH_AARCH64_CHECK(version) (0)
  107. #endif
  108. /* ARM SIMD ISA extensions */
  109. #if defined(__ARM_NEON) || defined(SIMDE_ARCH_AARCH64)
  110. # if defined(SIMDE_ARCH_AARCH64)
  111. # define SIMDE_ARCH_ARM_NEON SIMDE_ARCH_AARCH64
  112. # elif defined(SIMDE_ARCH_ARM)
  113. # define SIMDE_ARCH_ARM_NEON SIMDE_ARCH_ARM
  114. # endif
  115. #endif
  116. #if defined(__ARM_FEATURE_AES) && __ARM_FEATURE_AES
  117. # define SIMDE_ARCH_ARM_AES
  118. #endif
  119. #if defined(__ARM_FEATURE_COMPLEX) && __ARM_FEATURE_COMPLEX
  120. # define SIMDE_ARCH_ARM_COMPLEX
  121. #endif
  122. #if defined(__ARM_FEATURE_CRYPTO) && __ARM_FEATURE_CRYPTO
  123. # define SIMDE_ARCH_ARM_CRYPTO
  124. #endif
  125. #if defined(__ARM_FEATURE_DOTPROD) && __ARM_FEATURE_DOTPROD
  126. # define SIMDE_ARCH_ARM_DOTPROD
  127. #endif
  128. #if defined(__ARM_FEATURE_FMA) && __ARM_FEATURE_FMA
  129. # define SIMDE_ARCH_ARM_FMA
  130. #endif
  131. #if defined(__ARM_FEATURE_FP16_FML) && __ARM_FEATURE_FP16_FML
  132. # define SIMDE_ARCH_ARM_FP16_FML
  133. #endif
  134. #if defined(__ARM_FEATURE_FRINT) && __ARM_FEATURE_FRINT
  135. # define SIMDE_ARCH_ARM_FRINT
  136. #endif
  137. #if defined(__ARM_FEATURE_MATMUL_INT8) && __ARM_FEATURE_MATMUL_INT8
  138. # define SIMDE_ARCH_ARM_MATMUL_INT8
  139. #endif
  140. #if defined(__ARM_FEATURE_SHA2) && __ARM_FEATURE_SHA2 && !defined(__APPLE_CC__)
  141. # define SIMDE_ARCH_ARM_SHA2
  142. #endif
  143. #if defined(__ARM_FEATURE_SHA3) && __ARM_FEATURE_SHA3
  144. # define SIMDE_ARCH_ARM_SHA3
  145. #endif
  146. #if defined(__ARM_FEATURE_SHA512) && __ARM_FEATURE_SHA512
  147. # define SIMDE_ARCH_ARM_SHA512
  148. #endif
  149. #if defined(__ARM_FEATURE_SM3) && __ARM_FEATURE_SM3
  150. # define SIMDE_ARCH_ARM_SM3
  151. #endif
  152. #if defined(__ARM_FEATURE_SM4) && __ARM_FEATURE_SM4
  153. # define SIMDE_ARCH_ARM_SM4
  154. #endif
  155. #if defined(__ARM_FEATURE_SVE) && __ARM_FEATURE_SVE
  156. # define SIMDE_ARCH_ARM_SVE
  157. #endif
  158. #if defined(__ARM_FEATURE_QRDMX) && __ARM_FEATURE_QRDMX
  159. # define SIMDE_ARCH_ARM_QRDMX
  160. #endif
  161. /* Blackfin
  162. <https://en.wikipedia.org/wiki/Blackfin> */
  163. #if defined(__bfin) || defined(__BFIN__) || defined(__bfin__)
  164. # define SIMDE_ARCH_BLACKFIN 1
  165. #endif
  166. /* CRIS
  167. <https://en.wikipedia.org/wiki/ETRAX_CRIS> */
  168. #if defined(__CRIS_arch_version)
  169. # define SIMDE_ARCH_CRIS __CRIS_arch_version
  170. #elif defined(__cris__) || defined(__cris) || defined(__CRIS) || defined(__CRIS__)
  171. # define SIMDE_ARCH_CRIS 1
  172. #endif
  173. /* Convex
  174. <https://en.wikipedia.org/wiki/Convex_Computer> */
  175. #if defined(__convex_c38__)
  176. # define SIMDE_ARCH_CONVEX 38
  177. #elif defined(__convex_c34__)
  178. # define SIMDE_ARCH_CONVEX 34
  179. #elif defined(__convex_c32__)
  180. # define SIMDE_ARCH_CONVEX 32
  181. #elif defined(__convex_c2__)
  182. # define SIMDE_ARCH_CONVEX 2
  183. #elif defined(__convex__)
  184. # define SIMDE_ARCH_CONVEX 1
  185. #endif
  186. #if defined(SIMDE_ARCH_CONVEX)
  187. # define SIMDE_ARCH_CONVEX_CHECK(version) ((version) <= SIMDE_ARCH_CONVEX)
  188. #else
  189. # define SIMDE_ARCH_CONVEX_CHECK(version) (0)
  190. #endif
  191. /* Adapteva Epiphany
  192. <https://en.wikipedia.org/wiki/Adapteva_Epiphany> */
  193. #if defined(__epiphany__)
  194. # define SIMDE_ARCH_EPIPHANY 1
  195. #endif
  196. /* Fujitsu FR-V
  197. <https://en.wikipedia.org/wiki/FR-V_(microprocessor)> */
  198. #if defined(__frv__)
  199. # define SIMDE_ARCH_FRV 1
  200. #endif
  201. /* H8/300
  202. <https://en.wikipedia.org/wiki/H8_Family> */
  203. #if defined(__H8300__)
  204. # define SIMDE_ARCH_H8300
  205. #endif
  206. /* Elbrus (8S, 8SV and successors)
  207. <https://en.wikipedia.org/wiki/Elbrus-8S> */
  208. #if defined(__e2k__)
  209. # define SIMDE_ARCH_E2K
  210. #endif
  211. /* HP/PA / PA-RISC
  212. <https://en.wikipedia.org/wiki/PA-RISC> */
  213. #if defined(__PA8000__) || defined(__HPPA20__) || defined(__RISC2_0__) || defined(_PA_RISC2_0)
  214. # define SIMDE_ARCH_HPPA 20
  215. #elif defined(__PA7100__) || defined(__HPPA11__) || defined(_PA_RISC1_1)
  216. # define SIMDE_ARCH_HPPA 11
  217. #elif defined(_PA_RISC1_0)
  218. # define SIMDE_ARCH_HPPA 10
  219. #elif defined(__hppa__) || defined(__HPPA__) || defined(__hppa)
  220. # define SIMDE_ARCH_HPPA 1
  221. #endif
  222. #if defined(SIMDE_ARCH_HPPA)
  223. # define SIMDE_ARCH_HPPA_CHECK(version) ((version) <= SIMDE_ARCH_HPPA)
  224. #else
  225. # define SIMDE_ARCH_HPPA_CHECK(version) (0)
  226. #endif
  227. /* x86
  228. <https://en.wikipedia.org/wiki/X86> */
  229. #if defined(_M_IX86)
  230. # define SIMDE_ARCH_X86 (_M_IX86 / 100)
  231. #elif defined(__I86__)
  232. # define SIMDE_ARCH_X86 __I86__
  233. #elif defined(i686) || defined(__i686) || defined(__i686__)
  234. # define SIMDE_ARCH_X86 6
  235. #elif defined(i586) || defined(__i586) || defined(__i586__)
  236. # define SIMDE_ARCH_X86 5
  237. #elif defined(i486) || defined(__i486) || defined(__i486__)
  238. # define SIMDE_ARCH_X86 4
  239. #elif defined(i386) || defined(__i386) || defined(__i386__)
  240. # define SIMDE_ARCH_X86 3
  241. #elif defined(_X86_) || defined(__X86__) || defined(__THW_INTEL__)
  242. # define SIMDE_ARCH_X86 3
  243. #endif
  244. #if defined(SIMDE_ARCH_X86)
  245. # define SIMDE_ARCH_X86_CHECK(version) ((version) <= SIMDE_ARCH_X86)
  246. #else
  247. # define SIMDE_ARCH_X86_CHECK(version) (0)
  248. #endif
  249. /* SIMD ISA extensions for x86/x86_64 and Elbrus */
  250. #if defined(SIMDE_ARCH_X86) || defined(SIMDE_ARCH_AMD64) || defined(SIMDE_ARCH_E2K)
  251. # if defined(_M_IX86_FP)
  252. # define SIMDE_ARCH_X86_MMX
  253. # if (_M_IX86_FP >= 1)
  254. # define SIMDE_ARCH_X86_SSE 1
  255. # endif
  256. # if (_M_IX86_FP >= 2)
  257. # define SIMDE_ARCH_X86_SSE2 1
  258. # endif
  259. # elif defined(_M_X64)
  260. # define SIMDE_ARCH_X86_SSE 1
  261. # define SIMDE_ARCH_X86_SSE2 1
  262. # else
  263. # if defined(__MMX__)
  264. # define SIMDE_ARCH_X86_MMX 1
  265. # endif
  266. # if defined(__SSE__)
  267. # define SIMDE_ARCH_X86_SSE 1
  268. # endif
  269. # if defined(__SSE2__)
  270. # define SIMDE_ARCH_X86_SSE2 1
  271. # endif
  272. # endif
  273. # if defined(__SSE3__)
  274. # define SIMDE_ARCH_X86_SSE3 1
  275. # endif
  276. # if defined(__SSSE3__)
  277. # define SIMDE_ARCH_X86_SSSE3 1
  278. # endif
  279. # if defined(__SSE4_1__)
  280. # define SIMDE_ARCH_X86_SSE4_1 1
  281. # endif
  282. # if defined(__SSE4_2__)
  283. # define SIMDE_ARCH_X86_SSE4_2 1
  284. # endif
  285. # if defined(__XOP__)
  286. # define SIMDE_ARCH_X86_XOP 1
  287. # endif
  288. # if defined(__AVX__)
  289. # define SIMDE_ARCH_X86_AVX 1
  290. # if !defined(SIMDE_ARCH_X86_SSE3)
  291. # define SIMDE_ARCH_X86_SSE3 1
  292. # endif
  293. # if !defined(SIMDE_ARCH_X86_SSE4_1)
  294. # define SIMDE_ARCH_X86_SSE4_1 1
  295. # endif
  296. # if !defined(SIMDE_ARCH_X86_SSE4_2)
  297. # define SIMDE_ARCH_X86_SSE4_2 1
  298. # endif
  299. # endif
  300. # if defined(__AVX2__)
  301. # define SIMDE_ARCH_X86_AVX2 1
  302. # if defined(_MSC_VER)
  303. # define SIMDE_ARCH_X86_FMA 1
  304. # endif
  305. # endif
  306. # if defined(__FMA__)
  307. # define SIMDE_ARCH_X86_FMA 1
  308. # if !defined(SIMDE_ARCH_X86_AVX)
  309. # define SIMDE_ARCH_X86_AVX 1
  310. # endif
  311. # endif
  312. # if defined(__AVX512VP2INTERSECT__)
  313. # define SIMDE_ARCH_X86_AVX512VP2INTERSECT 1
  314. # endif
  315. # if defined(__AVX512BITALG__)
  316. # define SIMDE_ARCH_X86_AVX512BITALG 1
  317. # endif
  318. # if defined(__AVX512VPOPCNTDQ__)
  319. # define SIMDE_ARCH_X86_AVX512VPOPCNTDQ 1
  320. # endif
  321. # if defined(__AVX512VBMI__)
  322. # define SIMDE_ARCH_X86_AVX512VBMI 1
  323. # endif
  324. # if defined(__AVX512VBMI2__)
  325. # define SIMDE_ARCH_X86_AVX512VBMI2 1
  326. # endif
  327. # if defined(__AVX512VNNI__)
  328. # define SIMDE_ARCH_X86_AVX512VNNI 1
  329. # endif
  330. # if defined(__AVX5124VNNIW__)
  331. # define SIMDE_ARCH_X86_AVX5124VNNIW 1
  332. # endif
  333. # if defined(__AVX512BW__)
  334. # define SIMDE_ARCH_X86_AVX512BW 1
  335. # endif
  336. # if defined(__AVX512BF16__)
  337. # define SIMDE_ARCH_X86_AVX512BF16 1
  338. # endif
  339. # if defined(__AVX512CD__)
  340. # define SIMDE_ARCH_X86_AVX512CD 1
  341. # endif
  342. # if defined(__AVX512DQ__)
  343. # define SIMDE_ARCH_X86_AVX512DQ 1
  344. # endif
  345. # if defined(__AVX512F__)
  346. # define SIMDE_ARCH_X86_AVX512F 1
  347. # endif
  348. # if defined(__AVX512VL__)
  349. # define SIMDE_ARCH_X86_AVX512VL 1
  350. # endif
  351. # if defined(__AVX512FP16__)
  352. # define SIMDE_ARCH_X86_AVX512FP16 1
  353. # endif
  354. # if defined(__GFNI__)
  355. # define SIMDE_ARCH_X86_GFNI 1
  356. # endif
  357. # if defined(__PCLMUL__)
  358. # define SIMDE_ARCH_X86_PCLMUL 1
  359. # endif
  360. # if defined(__VPCLMULQDQ__)
  361. # define SIMDE_ARCH_X86_VPCLMULQDQ 1
  362. # endif
  363. # if defined(__F16C__) || (defined(HEDLEY_MSVC_VERSION) && HEDLEY_MSVC_VERSION_CHECK(19,30,0) && defined(SIMDE_ARCH_X86_AVX2) )
  364. # define SIMDE_ARCH_X86_F16C 1
  365. # endif
  366. # if defined(__AES__)
  367. # define SIMDE_ARCH_X86_AES 1
  368. # endif
  369. #endif
  370. /* Itanium
  371. <https://en.wikipedia.org/wiki/Itanium> */
  372. #if defined(__ia64__) || defined(_IA64) || defined(__IA64__) || defined(__ia64) || defined(_M_IA64) || defined(__itanium__)
  373. # define SIMDE_ARCH_IA64 1
  374. #endif
  375. /* Renesas M32R
  376. <https://en.wikipedia.org/wiki/M32R> */
  377. #if defined(__m32r__) || defined(__M32R__)
  378. # define SIMDE_ARCH_M32R
  379. #endif
  380. /* Motorola 68000
  381. <https://en.wikipedia.org/wiki/Motorola_68000> */
  382. #if defined(__mc68060__) || defined(__MC68060__)
  383. # define SIMDE_ARCH_M68K 68060
  384. #elif defined(__mc68040__) || defined(__MC68040__)
  385. # define SIMDE_ARCH_M68K 68040
  386. #elif defined(__mc68030__) || defined(__MC68030__)
  387. # define SIMDE_ARCH_M68K 68030
  388. #elif defined(__mc68020__) || defined(__MC68020__)
  389. # define SIMDE_ARCH_M68K 68020
  390. #elif defined(__mc68010__) || defined(__MC68010__)
  391. # define SIMDE_ARCH_M68K 68010
  392. #elif defined(__mc68000__) || defined(__MC68000__)
  393. # define SIMDE_ARCH_M68K 68000
  394. #endif
  395. #if defined(SIMDE_ARCH_M68K)
  396. # define SIMDE_ARCH_M68K_CHECK(version) ((version) <= SIMDE_ARCH_M68K)
  397. #else
  398. # define SIMDE_ARCH_M68K_CHECK(version) (0)
  399. #endif
  400. /* Xilinx MicroBlaze
  401. <https://en.wikipedia.org/wiki/MicroBlaze> */
  402. #if defined(__MICROBLAZE__) || defined(__microblaze__)
  403. # define SIMDE_ARCH_MICROBLAZE
  404. #endif
  405. /* MIPS
  406. <https://en.wikipedia.org/wiki/MIPS_architecture> */
  407. #if defined(_MIPS_ISA_MIPS64R2)
  408. # define SIMDE_ARCH_MIPS 642
  409. #elif defined(_MIPS_ISA_MIPS64)
  410. # define SIMDE_ARCH_MIPS 640
  411. #elif defined(_MIPS_ISA_MIPS32R2)
  412. # define SIMDE_ARCH_MIPS 322
  413. #elif defined(_MIPS_ISA_MIPS32)
  414. # define SIMDE_ARCH_MIPS 320
  415. #elif defined(_MIPS_ISA_MIPS4)
  416. # define SIMDE_ARCH_MIPS 4
  417. #elif defined(_MIPS_ISA_MIPS3)
  418. # define SIMDE_ARCH_MIPS 3
  419. #elif defined(_MIPS_ISA_MIPS2)
  420. # define SIMDE_ARCH_MIPS 2
  421. #elif defined(_MIPS_ISA_MIPS1)
  422. # define SIMDE_ARCH_MIPS 1
  423. #elif defined(_MIPS_ISA_MIPS) || defined(__mips) || defined(__MIPS__)
  424. # define SIMDE_ARCH_MIPS 1
  425. #endif
  426. #if defined(SIMDE_ARCH_MIPS)
  427. # define SIMDE_ARCH_MIPS_CHECK(version) ((version) <= SIMDE_ARCH_MIPS)
  428. #else
  429. # define SIMDE_ARCH_MIPS_CHECK(version) (0)
  430. #endif
  431. #if defined(__mips_loongson_mmi)
  432. # define SIMDE_ARCH_MIPS_LOONGSON_MMI 1
  433. #endif
  434. #if defined(__mips_msa)
  435. # define SIMDE_ARCH_MIPS_MSA 1
  436. #endif
  437. /* Matsushita MN10300
  438. <https://en.wikipedia.org/wiki/MN103> */
  439. #if defined(__MN10300__) || defined(__mn10300__)
  440. # define SIMDE_ARCH_MN10300 1
  441. #endif
  442. /* POWER
  443. <https://en.wikipedia.org/wiki/IBM_POWER_Instruction_Set_Architecture> */
  444. #if defined(_M_PPC)
  445. # define SIMDE_ARCH_POWER _M_PPC
  446. #elif defined(_ARCH_PWR9)
  447. # define SIMDE_ARCH_POWER 900
  448. #elif defined(_ARCH_PWR8)
  449. # define SIMDE_ARCH_POWER 800
  450. #elif defined(_ARCH_PWR7)
  451. # define SIMDE_ARCH_POWER 700
  452. #elif defined(_ARCH_PWR6)
  453. # define SIMDE_ARCH_POWER 600
  454. #elif defined(_ARCH_PWR5)
  455. # define SIMDE_ARCH_POWER 500
  456. #elif defined(_ARCH_PWR4)
  457. # define SIMDE_ARCH_POWER 400
  458. #elif defined(_ARCH_440) || defined(__ppc440__)
  459. # define SIMDE_ARCH_POWER 440
  460. #elif defined(_ARCH_450) || defined(__ppc450__)
  461. # define SIMDE_ARCH_POWER 450
  462. #elif defined(_ARCH_601) || defined(__ppc601__)
  463. # define SIMDE_ARCH_POWER 601
  464. #elif defined(_ARCH_603) || defined(__ppc603__)
  465. # define SIMDE_ARCH_POWER 603
  466. #elif defined(_ARCH_604) || defined(__ppc604__)
  467. # define SIMDE_ARCH_POWER 604
  468. #elif defined(_ARCH_605) || defined(__ppc605__)
  469. # define SIMDE_ARCH_POWER 605
  470. #elif defined(_ARCH_620) || defined(__ppc620__)
  471. # define SIMDE_ARCH_POWER 620
  472. #elif defined(__powerpc) || defined(__powerpc__) || defined(__POWERPC__) || defined(__ppc__) || defined(__PPC__) || defined(_ARCH_PPC) || defined(__ppc)
  473. # define SIMDE_ARCH_POWER 1
  474. #endif
  475. #if defined(SIMDE_ARCH_POWER)
  476. #define SIMDE_ARCH_POWER_CHECK(version) ((version) <= SIMDE_ARCH_POWER)
  477. #else
  478. #define SIMDE_ARCH_POWER_CHECK(version) (0)
  479. #endif
  480. #if defined(__ALTIVEC__)
  481. # define SIMDE_ARCH_POWER_ALTIVEC SIMDE_ARCH_POWER
  482. #define SIMDE_ARCH_POWER_ALTIVEC_CHECK(version) ((version) <= SIMDE_ARCH_POWER)
  483. #else
  484. #define SIMDE_ARCH_POWER_ALTIVEC_CHECK(version) (0)
  485. #endif
  486. /* RISC-V
  487. <https://en.wikipedia.org/wiki/RISC-V> */
  488. #if defined(__riscv) || defined(__riscv__)
  489. # if __riscv_xlen == 64
  490. # define SIMDE_ARCH_RISCV64
  491. # elif __riscv_xlen == 32
  492. # define SIMDE_ARCH_RISCV32
  493. # endif
  494. #endif
  495. /* RISC-V SIMD ISA extensions */
  496. #if defined(__riscv_zve32x)
  497. # define SIMDE_ARCH_RISCV_ZVE32X 1
  498. #endif
  499. #if defined(__riscv_zve32f)
  500. # define SIMDE_ARCH_RISCV_ZVE32F 1
  501. #endif
  502. #if defined(__riscv_zve64x)
  503. # define SIMDE_ARCH_RISCV_ZVE64X 1
  504. #endif
  505. #if defined(__riscv_zve64f)
  506. # define SIMDE_ARCH_RISCV_ZVE64F 1
  507. #endif
  508. #if defined(__riscv_zve64d)
  509. # define SIMDE_ARCH_RISCV_ZVE64D 1
  510. #endif
  511. #if defined(__riscv_v)
  512. # define SIMDE_ARCH_RISCV_V 1
  513. #endif
  514. #if defined(__riscv_zvfh)
  515. # define SIMDE_ARCH_RISCV_ZVFH 1
  516. #endif
  517. #if defined(__riscv_zvfhmin)
  518. # define SIMDE_ARCH_RISCV_ZVFHMIN 1
  519. #endif
  520. /* SPARC
  521. <https://en.wikipedia.org/wiki/SPARC> */
  522. #if defined(__sparc_v9__) || defined(__sparcv9)
  523. # define SIMDE_ARCH_SPARC 9
  524. #elif defined(__sparc_v8__) || defined(__sparcv8)
  525. # define SIMDE_ARCH_SPARC 8
  526. #elif defined(__sparc_v7__) || defined(__sparcv7)
  527. # define SIMDE_ARCH_SPARC 7
  528. #elif defined(__sparc_v6__) || defined(__sparcv6)
  529. # define SIMDE_ARCH_SPARC 6
  530. #elif defined(__sparc_v5__) || defined(__sparcv5)
  531. # define SIMDE_ARCH_SPARC 5
  532. #elif defined(__sparc_v4__) || defined(__sparcv4)
  533. # define SIMDE_ARCH_SPARC 4
  534. #elif defined(__sparc_v3__) || defined(__sparcv3)
  535. # define SIMDE_ARCH_SPARC 3
  536. #elif defined(__sparc_v2__) || defined(__sparcv2)
  537. # define SIMDE_ARCH_SPARC 2
  538. #elif defined(__sparc_v1__) || defined(__sparcv1)
  539. # define SIMDE_ARCH_SPARC 1
  540. #elif defined(__sparc__) || defined(__sparc)
  541. # define SIMDE_ARCH_SPARC 1
  542. #endif
  543. #if defined(SIMDE_ARCH_SPARC)
  544. #define SIMDE_ARCH_SPARC_CHECK(version) ((version) <= SIMDE_ARCH_SPARC)
  545. #else
  546. #define SIMDE_ARCH_SPARC_CHECK(version) (0)
  547. #endif
  548. /* SuperH
  549. <https://en.wikipedia.org/wiki/SuperH> */
  550. #if defined(__sh5__) || defined(__SH5__)
  551. # define SIMDE_ARCH_SUPERH 5
  552. #elif defined(__sh4__) || defined(__SH4__)
  553. # define SIMDE_ARCH_SUPERH 4
  554. #elif defined(__sh3__) || defined(__SH3__)
  555. # define SIMDE_ARCH_SUPERH 3
  556. #elif defined(__sh2__) || defined(__SH2__)
  557. # define SIMDE_ARCH_SUPERH 2
  558. #elif defined(__sh1__) || defined(__SH1__)
  559. # define SIMDE_ARCH_SUPERH 1
  560. #elif defined(__sh__) || defined(__SH__)
  561. # define SIMDE_ARCH_SUPERH 1
  562. #endif
  563. /* IBM System z
  564. <https://en.wikipedia.org/wiki/IBM_System_z> */
  565. #if defined(__370__) || defined(__THW_370__) || defined(__s390__) || defined(__s390x__) || defined(__zarch__) || defined(__SYSC_ZARCH__)
  566. # define SIMDE_ARCH_ZARCH __ARCH__
  567. #endif
  568. #if defined(SIMDE_ARCH_ZARCH)
  569. #define SIMDE_ARCH_ZARCH_CHECK(version) ((version) <= SIMDE_ARCH_ZARCH)
  570. #else
  571. #define SIMDE_ARCH_ZARCH_CHECK(version) (0)
  572. #endif
  573. #if defined(SIMDE_ARCH_ZARCH) && defined(__VEC__)
  574. #define SIMDE_ARCH_ZARCH_ZVECTOR SIMDE_ARCH_ZARCH
  575. #endif
  576. /* TMS320 DSP
  577. <https://en.wikipedia.org/wiki/Texas_Instruments_TMS320> */
  578. #if defined(_TMS320C6740) || defined(__TMS320C6740__)
  579. # define SIMDE_ARCH_TMS320 6740
  580. #elif defined(_TMS320C6700_PLUS) || defined(__TMS320C6700_PLUS__)
  581. # define SIMDE_ARCH_TMS320 6701
  582. #elif defined(_TMS320C6700) || defined(__TMS320C6700__)
  583. # define SIMDE_ARCH_TMS320 6700
  584. #elif defined(_TMS320C6600) || defined(__TMS320C6600__)
  585. # define SIMDE_ARCH_TMS320 6600
  586. #elif defined(_TMS320C6400_PLUS) || defined(__TMS320C6400_PLUS__)
  587. # define SIMDE_ARCH_TMS320 6401
  588. #elif defined(_TMS320C6400) || defined(__TMS320C6400__)
  589. # define SIMDE_ARCH_TMS320 6400
  590. #elif defined(_TMS320C6200) || defined(__TMS320C6200__)
  591. # define SIMDE_ARCH_TMS320 6200
  592. #elif defined(_TMS320C55X) || defined(__TMS320C55X__)
  593. # define SIMDE_ARCH_TMS320 550
  594. #elif defined(_TMS320C54X) || defined(__TMS320C54X__)
  595. # define SIMDE_ARCH_TMS320 540
  596. #elif defined(_TMS320C28X) || defined(__TMS320C28X__)
  597. # define SIMDE_ARCH_TMS320 280
  598. #endif
  599. #if defined(SIMDE_ARCH_TMS320)
  600. #define SIMDE_ARCH_TMS320_CHECK(version) ((version) <= SIMDE_ARCH_TMS320)
  601. #else
  602. #define SIMDE_ARCH_TMS320_CHECK(version) (0)
  603. #endif
  604. /* WebAssembly */
  605. #if defined(__wasm__)
  606. # define SIMDE_ARCH_WASM 1
  607. #endif
  608. #if defined(SIMDE_ARCH_WASM) && defined(__wasm_simd128__)
  609. # define SIMDE_ARCH_WASM_SIMD128
  610. #endif
  611. #if defined(SIMDE_ARCH_WASM) && defined(__wasm_relaxed_simd__)
  612. # define SIMDE_ARCH_WASM_RELAXED_SIMD
  613. #endif
  614. /* Xtensa
  615. <https://en.wikipedia.org/wiki/> */
  616. #if defined(__xtensa__) || defined(__XTENSA__)
  617. # define SIMDE_ARCH_XTENSA 1
  618. #endif
  619. /* Availability of 16-bit floating-point arithmetic intrinsics */
  620. #if defined(__ARM_FEATURE_FP16_VECTOR_ARITHMETIC)
  621. # define SIMDE_ARCH_ARM_NEON_FP16
  622. #endif
  623. /* Availability of 16-bit brain floating-point arithmetic intrinsics */
  624. #if defined(__ARM_FEATURE_BF16_VECTOR_ARITHMETIC)
  625. # define SIMDE_ARCH_ARM_NEON_BF16
  626. #endif
  627. /* LoongArch
  628. <https://en.wikipedia.org/wiki/Loongson#LoongArch> */
  629. #if defined(__loongarch32)
  630. # define SIMDE_ARCH_LOONGARCH 1
  631. #elif defined(__loongarch64)
  632. # define SIMDE_ARCH_LOONGARCH 2
  633. #endif
  634. /* LSX: LoongArch 128-bits SIMD extension */
  635. #if defined(__loongarch_sx)
  636. # define SIMDE_ARCH_LOONGARCH_LSX 1
  637. #endif
  638. /* LASX: LoongArch 256-bits SIMD extension */
  639. #if defined(__loongarch_asx)
  640. # define SIMDE_ARCH_LOONGARCH_LASX 2
  641. #endif
  642. #endif /* !defined(SIMDE_ARCH_H) */