foreach_target.h 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. // Copyright 2020 Google LLC
  2. // SPDX-License-Identifier: Apache-2.0
  3. //
  4. // Licensed under the Apache License, Version 2.0 (the "License");
  5. // you may not use this file except in compliance with the License.
  6. // You may obtain a copy of the License at
  7. //
  8. // http://www.apache.org/licenses/LICENSE-2.0
  9. //
  10. // Unless required by applicable law or agreed to in writing, software
  11. // distributed under the License is distributed on an "AS IS" BASIS,
  12. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. // See the License for the specific language governing permissions and
  14. // limitations under the License.
  15. #ifndef HIGHWAY_HWY_FOREACH_TARGET_H_
  16. #define HIGHWAY_HWY_FOREACH_TARGET_H_
  17. // Re-includes the translation unit zero or more times to compile for any
  18. // targets except HWY_STATIC_TARGET. Defines unique HWY_TARGET each time so that
  19. // highway.h defines the corresponding macro/namespace.
  20. #include "hwy/detect_targets.h"
  21. // *_inl.h may include other headers, which requires include guards to prevent
  22. // repeated inclusion. The guards must be reset after compiling each target, so
  23. // the header is again visible. This is done by flipping HWY_TARGET_TOGGLE,
  24. // defining it if undefined and vice versa. This macro is initially undefined
  25. // so that IDEs don't gray out the contents of each header.
  26. #ifdef HWY_TARGET_TOGGLE
  27. #error "This macro must not be defined outside foreach_target.h"
  28. #endif
  29. #ifdef HWY_HIGHWAY_INCLUDED // highway.h include guard
  30. // Trigger fixup at the bottom of this header.
  31. #define HWY_ALREADY_INCLUDED
  32. // The next highway.h must re-include set_macros-inl.h because the first
  33. // highway.h chose the static target instead of what we will set below.
  34. #undef HWY_SET_MACROS_PER_TARGET
  35. #endif
  36. // Disable HWY_EXPORT in user code until we have generated all targets. Note
  37. // that a subsequent highway.h will not override this definition.
  38. #undef HWY_ONCE
  39. #define HWY_ONCE (0 || HWY_IDE)
  40. // Avoid warnings on #include HWY_TARGET_INCLUDE by hiding them from the IDE;
  41. // also skip if only 1 target defined (no re-inclusion will be necessary).
  42. #if !HWY_IDE && (HWY_TARGETS != HWY_STATIC_TARGET)
  43. #if !defined(HWY_TARGET_INCLUDE)
  44. #error ">1 target enabled => define HWY_TARGET_INCLUDE before foreach_target.h"
  45. #endif
  46. // ------------------------------ HWY_ARCH_X86
  47. #if (HWY_TARGETS & HWY_SSE2) && (HWY_STATIC_TARGET != HWY_SSE2)
  48. #undef HWY_TARGET
  49. #define HWY_TARGET HWY_SSE2
  50. #include HWY_TARGET_INCLUDE
  51. #ifdef HWY_TARGET_TOGGLE
  52. #undef HWY_TARGET_TOGGLE
  53. #else
  54. #define HWY_TARGET_TOGGLE
  55. #endif
  56. #endif
  57. #if (HWY_TARGETS & HWY_SSSE3) && (HWY_STATIC_TARGET != HWY_SSSE3)
  58. #undef HWY_TARGET
  59. #define HWY_TARGET HWY_SSSE3
  60. #include HWY_TARGET_INCLUDE
  61. #ifdef HWY_TARGET_TOGGLE
  62. #undef HWY_TARGET_TOGGLE
  63. #else
  64. #define HWY_TARGET_TOGGLE
  65. #endif
  66. #endif
  67. #if (HWY_TARGETS & HWY_SSE4) && (HWY_STATIC_TARGET != HWY_SSE4)
  68. #undef HWY_TARGET
  69. #define HWY_TARGET HWY_SSE4
  70. #include HWY_TARGET_INCLUDE
  71. #ifdef HWY_TARGET_TOGGLE
  72. #undef HWY_TARGET_TOGGLE
  73. #else
  74. #define HWY_TARGET_TOGGLE
  75. #endif
  76. #endif
  77. #if (HWY_TARGETS & HWY_AVX2) && (HWY_STATIC_TARGET != HWY_AVX2)
  78. #undef HWY_TARGET
  79. #define HWY_TARGET HWY_AVX2
  80. #include HWY_TARGET_INCLUDE
  81. #ifdef HWY_TARGET_TOGGLE
  82. #undef HWY_TARGET_TOGGLE
  83. #else
  84. #define HWY_TARGET_TOGGLE
  85. #endif
  86. #endif
  87. #if (HWY_TARGETS & HWY_AVX3) && (HWY_STATIC_TARGET != HWY_AVX3)
  88. #undef HWY_TARGET
  89. #define HWY_TARGET HWY_AVX3
  90. #include HWY_TARGET_INCLUDE
  91. #ifdef HWY_TARGET_TOGGLE
  92. #undef HWY_TARGET_TOGGLE
  93. #else
  94. #define HWY_TARGET_TOGGLE
  95. #endif
  96. #endif
  97. #if (HWY_TARGETS & HWY_AVX3_DL) && (HWY_STATIC_TARGET != HWY_AVX3_DL)
  98. #undef HWY_TARGET
  99. #define HWY_TARGET HWY_AVX3_DL
  100. #include HWY_TARGET_INCLUDE
  101. #ifdef HWY_TARGET_TOGGLE
  102. #undef HWY_TARGET_TOGGLE
  103. #else
  104. #define HWY_TARGET_TOGGLE
  105. #endif
  106. #endif
  107. #if (HWY_TARGETS & HWY_AVX3_ZEN4) && (HWY_STATIC_TARGET != HWY_AVX3_ZEN4)
  108. #undef HWY_TARGET
  109. #define HWY_TARGET HWY_AVX3_ZEN4
  110. #include HWY_TARGET_INCLUDE
  111. #ifdef HWY_TARGET_TOGGLE
  112. #undef HWY_TARGET_TOGGLE
  113. #else
  114. #define HWY_TARGET_TOGGLE
  115. #endif
  116. #endif
  117. #if (HWY_TARGETS & HWY_AVX3_SPR) && (HWY_STATIC_TARGET != HWY_AVX3_SPR)
  118. #undef HWY_TARGET
  119. #define HWY_TARGET HWY_AVX3_SPR
  120. #include HWY_TARGET_INCLUDE
  121. #ifdef HWY_TARGET_TOGGLE
  122. #undef HWY_TARGET_TOGGLE
  123. #else
  124. #define HWY_TARGET_TOGGLE
  125. #endif
  126. #endif
  127. // ------------------------------ HWY_ARCH_ARM
  128. #if (HWY_TARGETS & HWY_NEON_WITHOUT_AES) && \
  129. (HWY_STATIC_TARGET != HWY_NEON_WITHOUT_AES)
  130. #undef HWY_TARGET
  131. #define HWY_TARGET HWY_NEON_WITHOUT_AES
  132. #include HWY_TARGET_INCLUDE
  133. #ifdef HWY_TARGET_TOGGLE
  134. #undef HWY_TARGET_TOGGLE
  135. #else
  136. #define HWY_TARGET_TOGGLE
  137. #endif
  138. #endif
  139. #if (HWY_TARGETS & HWY_NEON) && (HWY_STATIC_TARGET != HWY_NEON)
  140. #undef HWY_TARGET
  141. #define HWY_TARGET HWY_NEON
  142. #include HWY_TARGET_INCLUDE
  143. #ifdef HWY_TARGET_TOGGLE
  144. #undef HWY_TARGET_TOGGLE
  145. #else
  146. #define HWY_TARGET_TOGGLE
  147. #endif
  148. #endif
  149. #if (HWY_TARGETS & HWY_NEON_BF16) && (HWY_STATIC_TARGET != HWY_NEON_BF16)
  150. #undef HWY_TARGET
  151. #define HWY_TARGET HWY_NEON_BF16
  152. #include HWY_TARGET_INCLUDE
  153. #ifdef HWY_TARGET_TOGGLE
  154. #undef HWY_TARGET_TOGGLE
  155. #else
  156. #define HWY_TARGET_TOGGLE
  157. #endif
  158. #endif
  159. #if (HWY_TARGETS & HWY_SVE) && (HWY_STATIC_TARGET != HWY_SVE)
  160. #undef HWY_TARGET
  161. #define HWY_TARGET HWY_SVE
  162. #include HWY_TARGET_INCLUDE
  163. #ifdef HWY_TARGET_TOGGLE
  164. #undef HWY_TARGET_TOGGLE
  165. #else
  166. #define HWY_TARGET_TOGGLE
  167. #endif
  168. #endif
  169. #if (HWY_TARGETS & HWY_SVE2) && (HWY_STATIC_TARGET != HWY_SVE2)
  170. #undef HWY_TARGET
  171. #define HWY_TARGET HWY_SVE2
  172. #include HWY_TARGET_INCLUDE
  173. #ifdef HWY_TARGET_TOGGLE
  174. #undef HWY_TARGET_TOGGLE
  175. #else
  176. #define HWY_TARGET_TOGGLE
  177. #endif
  178. #endif
  179. #if (HWY_TARGETS & HWY_SVE_256) && (HWY_STATIC_TARGET != HWY_SVE_256)
  180. #undef HWY_TARGET
  181. #define HWY_TARGET HWY_SVE_256
  182. #include HWY_TARGET_INCLUDE
  183. #ifdef HWY_TARGET_TOGGLE
  184. #undef HWY_TARGET_TOGGLE
  185. #else
  186. #define HWY_TARGET_TOGGLE
  187. #endif
  188. #endif
  189. #if (HWY_TARGETS & HWY_SVE2_128) && (HWY_STATIC_TARGET != HWY_SVE2_128)
  190. #undef HWY_TARGET
  191. #define HWY_TARGET HWY_SVE2_128
  192. #include HWY_TARGET_INCLUDE
  193. #ifdef HWY_TARGET_TOGGLE
  194. #undef HWY_TARGET_TOGGLE
  195. #else
  196. #define HWY_TARGET_TOGGLE
  197. #endif
  198. #endif
  199. // ------------------------------ HWY_ARCH_WASM
  200. #if (HWY_TARGETS & HWY_WASM_EMU256) && (HWY_STATIC_TARGET != HWY_WASM_EMU256)
  201. #undef HWY_TARGET
  202. #define HWY_TARGET HWY_WASM_EMU256
  203. #include HWY_TARGET_INCLUDE
  204. #ifdef HWY_TARGET_TOGGLE
  205. #undef HWY_TARGET_TOGGLE
  206. #else
  207. #define HWY_TARGET_TOGGLE
  208. #endif
  209. #endif
  210. #if (HWY_TARGETS & HWY_WASM) && (HWY_STATIC_TARGET != HWY_WASM)
  211. #undef HWY_TARGET
  212. #define HWY_TARGET HWY_WASM
  213. #include HWY_TARGET_INCLUDE
  214. #ifdef HWY_TARGET_TOGGLE
  215. #undef HWY_TARGET_TOGGLE
  216. #else
  217. #define HWY_TARGET_TOGGLE
  218. #endif
  219. #endif
  220. // ------------------------------ HWY_ARCH_PPC
  221. #if (HWY_TARGETS & HWY_PPC8) && (HWY_STATIC_TARGET != HWY_PPC8)
  222. #undef HWY_TARGET
  223. #define HWY_TARGET HWY_PPC8
  224. #include HWY_TARGET_INCLUDE
  225. #ifdef HWY_TARGET_TOGGLE
  226. #undef HWY_TARGET_TOGGLE
  227. #else
  228. #define HWY_TARGET_TOGGLE
  229. #endif
  230. #endif
  231. #if (HWY_TARGETS & HWY_PPC9) && (HWY_STATIC_TARGET != HWY_PPC9)
  232. #undef HWY_TARGET
  233. #define HWY_TARGET HWY_PPC9
  234. #include HWY_TARGET_INCLUDE
  235. #ifdef HWY_TARGET_TOGGLE
  236. #undef HWY_TARGET_TOGGLE
  237. #else
  238. #define HWY_TARGET_TOGGLE
  239. #endif
  240. #endif
  241. #if (HWY_TARGETS & HWY_PPC10) && (HWY_STATIC_TARGET != HWY_PPC10)
  242. #undef HWY_TARGET
  243. #define HWY_TARGET HWY_PPC10
  244. #include HWY_TARGET_INCLUDE
  245. #ifdef HWY_TARGET_TOGGLE
  246. #undef HWY_TARGET_TOGGLE
  247. #else
  248. #define HWY_TARGET_TOGGLE
  249. #endif
  250. #endif
  251. // ------------------------------ HWY_ARCH_S390X
  252. #if (HWY_TARGETS & HWY_Z14) && (HWY_STATIC_TARGET != HWY_Z14)
  253. #undef HWY_TARGET
  254. #define HWY_TARGET HWY_Z14
  255. #include HWY_TARGET_INCLUDE
  256. #ifdef HWY_TARGET_TOGGLE
  257. #undef HWY_TARGET_TOGGLE
  258. #else
  259. #define HWY_TARGET_TOGGLE
  260. #endif
  261. #endif
  262. #if (HWY_TARGETS & HWY_Z15) && (HWY_STATIC_TARGET != HWY_Z15)
  263. #undef HWY_TARGET
  264. #define HWY_TARGET HWY_Z15
  265. #include HWY_TARGET_INCLUDE
  266. #ifdef HWY_TARGET_TOGGLE
  267. #undef HWY_TARGET_TOGGLE
  268. #else
  269. #define HWY_TARGET_TOGGLE
  270. #endif
  271. #endif
  272. // ------------------------------ HWY_ARCH_RISCV
  273. #if (HWY_TARGETS & HWY_RVV) && (HWY_STATIC_TARGET != HWY_RVV)
  274. #undef HWY_TARGET
  275. #define HWY_TARGET HWY_RVV
  276. #include HWY_TARGET_INCLUDE
  277. #ifdef HWY_TARGET_TOGGLE
  278. #undef HWY_TARGET_TOGGLE
  279. #else
  280. #define HWY_TARGET_TOGGLE
  281. #endif
  282. #endif
  283. // ------------------------------ Scalar
  284. #if (HWY_TARGETS & HWY_EMU128) && (HWY_STATIC_TARGET != HWY_EMU128)
  285. #undef HWY_TARGET
  286. #define HWY_TARGET HWY_EMU128
  287. #include HWY_TARGET_INCLUDE
  288. #ifdef HWY_TARGET_TOGGLE
  289. #undef HWY_TARGET_TOGGLE
  290. #else
  291. #define HWY_TARGET_TOGGLE
  292. #endif
  293. #endif
  294. #if (HWY_TARGETS & HWY_SCALAR) && (HWY_STATIC_TARGET != HWY_SCALAR)
  295. #undef HWY_TARGET
  296. #define HWY_TARGET HWY_SCALAR
  297. #include HWY_TARGET_INCLUDE
  298. #ifdef HWY_TARGET_TOGGLE
  299. #undef HWY_TARGET_TOGGLE
  300. #else
  301. #define HWY_TARGET_TOGGLE
  302. #endif
  303. #endif
  304. #endif // !HWY_IDE && (HWY_TARGETS != HWY_STATIC_TARGET)
  305. // Now that all but the static target have been generated, re-enable HWY_EXPORT.
  306. #undef HWY_ONCE
  307. #define HWY_ONCE 1
  308. // If we re-include once per enabled target, the translation unit's
  309. // implementation would have to be skipped via #if to avoid redefining symbols.
  310. // We instead skip the re-include for HWY_STATIC_TARGET, and generate its
  311. // implementation when resuming compilation of the translation unit.
  312. #undef HWY_TARGET
  313. #define HWY_TARGET HWY_STATIC_TARGET
  314. #ifdef HWY_ALREADY_INCLUDED
  315. // Revert the previous toggle to prevent redefinitions for the static target.
  316. #ifdef HWY_TARGET_TOGGLE
  317. #undef HWY_TARGET_TOGGLE
  318. #else
  319. #define HWY_TARGET_TOGGLE
  320. #endif
  321. // Force re-inclusion of set_macros-inl.h now that HWY_TARGET is restored.
  322. #ifdef HWY_SET_MACROS_PER_TARGET
  323. #undef HWY_SET_MACROS_PER_TARGET
  324. #else
  325. #define HWY_SET_MACROS_PER_TARGET
  326. #endif
  327. #endif
  328. #endif // HIGHWAY_HWY_FOREACH_TARGET_H_