foreach_target.h (10330B)
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 16 #ifndef HIGHWAY_HWY_FOREACH_TARGET_H_ 17 #define HIGHWAY_HWY_FOREACH_TARGET_H_ 18 19 // Re-includes the translation unit zero or more times to compile for any 20 // targets except HWY_STATIC_TARGET. Defines unique HWY_TARGET each time so that 21 // highway.h defines the corresponding macro/namespace. 22 23 #include "hwy/detect_targets.h" 24 25 // *_inl.h may include other headers, which requires include guards to prevent 26 // repeated inclusion. The guards must be reset after compiling each target, so 27 // the header is again visible. This is done by flipping HWY_TARGET_TOGGLE, 28 // defining it if undefined and vice versa. This macro is initially undefined 29 // so that IDEs don't gray out the contents of each header. 30 #ifdef HWY_TARGET_TOGGLE 31 #error "This macro must not be defined outside foreach_target.h" 32 #endif 33 34 #ifdef HWY_HIGHWAY_INCLUDED // highway.h include guard 35 // Trigger fixup at the bottom of this header. 36 #define HWY_ALREADY_INCLUDED 37 38 // The next highway.h must re-include set_macros-inl.h because the first 39 // highway.h chose the static target instead of what we will set below. 40 #undef HWY_SET_MACROS_PER_TARGET 41 #endif 42 43 // Disable HWY_EXPORT in user code until we have generated all targets. Note 44 // that a subsequent highway.h will not override this definition. 45 #undef HWY_ONCE 46 #define HWY_ONCE (0 || HWY_IDE) 47 48 // Avoid warnings on #include HWY_TARGET_INCLUDE by hiding them from the IDE; 49 // also skip if only 1 target defined (no re-inclusion will be necessary). 50 #if !HWY_IDE && (HWY_TARGETS != HWY_STATIC_TARGET) 51 52 #if !defined(HWY_TARGET_INCLUDE) 53 #error ">1 target enabled => define HWY_TARGET_INCLUDE before foreach_target.h" 54 #endif 55 56 // ------------------------------ HWY_ARCH_X86 57 58 #if (HWY_TARGETS & HWY_SSE2) && (HWY_STATIC_TARGET != HWY_SSE2) 59 #undef HWY_TARGET 60 #define HWY_TARGET HWY_SSE2 61 #include HWY_TARGET_INCLUDE 62 #ifdef HWY_TARGET_TOGGLE 63 #undef HWY_TARGET_TOGGLE 64 #else 65 #define HWY_TARGET_TOGGLE 66 #endif 67 #endif 68 69 #if (HWY_TARGETS & HWY_SSSE3) && (HWY_STATIC_TARGET != HWY_SSSE3) 70 #undef HWY_TARGET 71 #define HWY_TARGET HWY_SSSE3 72 #include HWY_TARGET_INCLUDE 73 #ifdef HWY_TARGET_TOGGLE 74 #undef HWY_TARGET_TOGGLE 75 #else 76 #define HWY_TARGET_TOGGLE 77 #endif 78 #endif 79 80 #if (HWY_TARGETS & HWY_SSE4) && (HWY_STATIC_TARGET != HWY_SSE4) 81 #undef HWY_TARGET 82 #define HWY_TARGET HWY_SSE4 83 #include HWY_TARGET_INCLUDE 84 #ifdef HWY_TARGET_TOGGLE 85 #undef HWY_TARGET_TOGGLE 86 #else 87 #define HWY_TARGET_TOGGLE 88 #endif 89 #endif 90 91 #if (HWY_TARGETS & HWY_AVX2) && (HWY_STATIC_TARGET != HWY_AVX2) 92 #undef HWY_TARGET 93 #define HWY_TARGET HWY_AVX2 94 #include HWY_TARGET_INCLUDE 95 #ifdef HWY_TARGET_TOGGLE 96 #undef HWY_TARGET_TOGGLE 97 #else 98 #define HWY_TARGET_TOGGLE 99 #endif 100 #endif 101 102 #if (HWY_TARGETS & HWY_AVX3) && (HWY_STATIC_TARGET != HWY_AVX3) 103 #undef HWY_TARGET 104 #define HWY_TARGET HWY_AVX3 105 #include HWY_TARGET_INCLUDE 106 #ifdef HWY_TARGET_TOGGLE 107 #undef HWY_TARGET_TOGGLE 108 #else 109 #define HWY_TARGET_TOGGLE 110 #endif 111 #endif 112 113 #if (HWY_TARGETS & HWY_AVX3_DL) && (HWY_STATIC_TARGET != HWY_AVX3_DL) 114 #undef HWY_TARGET 115 #define HWY_TARGET HWY_AVX3_DL 116 #include HWY_TARGET_INCLUDE 117 #ifdef HWY_TARGET_TOGGLE 118 #undef HWY_TARGET_TOGGLE 119 #else 120 #define HWY_TARGET_TOGGLE 121 #endif 122 #endif 123 124 #if (HWY_TARGETS & HWY_AVX3_ZEN4) && (HWY_STATIC_TARGET != HWY_AVX3_ZEN4) 125 #undef HWY_TARGET 126 #define HWY_TARGET HWY_AVX3_ZEN4 127 #include HWY_TARGET_INCLUDE 128 #ifdef HWY_TARGET_TOGGLE 129 #undef HWY_TARGET_TOGGLE 130 #else 131 #define HWY_TARGET_TOGGLE 132 #endif 133 #endif 134 135 #if (HWY_TARGETS & HWY_AVX3_SPR) && (HWY_STATIC_TARGET != HWY_AVX3_SPR) 136 #undef HWY_TARGET 137 #define HWY_TARGET HWY_AVX3_SPR 138 #include HWY_TARGET_INCLUDE 139 #ifdef HWY_TARGET_TOGGLE 140 #undef HWY_TARGET_TOGGLE 141 #else 142 #define HWY_TARGET_TOGGLE 143 #endif 144 #endif 145 146 #if (HWY_TARGETS & HWY_AVX10_2) && (HWY_STATIC_TARGET != HWY_AVX10_2) 147 #undef HWY_TARGET 148 #define HWY_TARGET HWY_AVX10_2 149 #include HWY_TARGET_INCLUDE 150 #ifdef HWY_TARGET_TOGGLE 151 #undef HWY_TARGET_TOGGLE 152 #else 153 #define HWY_TARGET_TOGGLE 154 #endif 155 #endif 156 157 // ------------------------------ HWY_ARCH_ARM 158 159 #if (HWY_TARGETS & HWY_NEON_WITHOUT_AES) && \ 160 (HWY_STATIC_TARGET != HWY_NEON_WITHOUT_AES) 161 #undef HWY_TARGET 162 #define HWY_TARGET HWY_NEON_WITHOUT_AES 163 #include HWY_TARGET_INCLUDE 164 #ifdef HWY_TARGET_TOGGLE 165 #undef HWY_TARGET_TOGGLE 166 #else 167 #define HWY_TARGET_TOGGLE 168 #endif 169 #endif 170 171 #if (HWY_TARGETS & HWY_NEON) && (HWY_STATIC_TARGET != HWY_NEON) 172 #undef HWY_TARGET 173 #define HWY_TARGET HWY_NEON 174 #include HWY_TARGET_INCLUDE 175 #ifdef HWY_TARGET_TOGGLE 176 #undef HWY_TARGET_TOGGLE 177 #else 178 #define HWY_TARGET_TOGGLE 179 #endif 180 #endif 181 182 #if (HWY_TARGETS & HWY_NEON_BF16) && (HWY_STATIC_TARGET != HWY_NEON_BF16) 183 #undef HWY_TARGET 184 #define HWY_TARGET HWY_NEON_BF16 185 #include HWY_TARGET_INCLUDE 186 #ifdef HWY_TARGET_TOGGLE 187 #undef HWY_TARGET_TOGGLE 188 #else 189 #define HWY_TARGET_TOGGLE 190 #endif 191 #endif 192 193 #if (HWY_TARGETS & HWY_SVE) && (HWY_STATIC_TARGET != HWY_SVE) 194 #undef HWY_TARGET 195 #define HWY_TARGET HWY_SVE 196 #include HWY_TARGET_INCLUDE 197 #ifdef HWY_TARGET_TOGGLE 198 #undef HWY_TARGET_TOGGLE 199 #else 200 #define HWY_TARGET_TOGGLE 201 #endif 202 #endif 203 204 #if (HWY_TARGETS & HWY_SVE2) && (HWY_STATIC_TARGET != HWY_SVE2) 205 #undef HWY_TARGET 206 #define HWY_TARGET HWY_SVE2 207 #include HWY_TARGET_INCLUDE 208 #ifdef HWY_TARGET_TOGGLE 209 #undef HWY_TARGET_TOGGLE 210 #else 211 #define HWY_TARGET_TOGGLE 212 #endif 213 #endif 214 215 #if (HWY_TARGETS & HWY_SVE_256) && (HWY_STATIC_TARGET != HWY_SVE_256) 216 #undef HWY_TARGET 217 #define HWY_TARGET HWY_SVE_256 218 #include HWY_TARGET_INCLUDE 219 #ifdef HWY_TARGET_TOGGLE 220 #undef HWY_TARGET_TOGGLE 221 #else 222 #define HWY_TARGET_TOGGLE 223 #endif 224 #endif 225 226 #if (HWY_TARGETS & HWY_SVE2_128) && (HWY_STATIC_TARGET != HWY_SVE2_128) 227 #undef HWY_TARGET 228 #define HWY_TARGET HWY_SVE2_128 229 #include HWY_TARGET_INCLUDE 230 #ifdef HWY_TARGET_TOGGLE 231 #undef HWY_TARGET_TOGGLE 232 #else 233 #define HWY_TARGET_TOGGLE 234 #endif 235 #endif 236 237 // ------------------------------ HWY_ARCH_WASM 238 239 #if (HWY_TARGETS & HWY_WASM_EMU256) && (HWY_STATIC_TARGET != HWY_WASM_EMU256) 240 #undef HWY_TARGET 241 #define HWY_TARGET HWY_WASM_EMU256 242 #include HWY_TARGET_INCLUDE 243 #ifdef HWY_TARGET_TOGGLE 244 #undef HWY_TARGET_TOGGLE 245 #else 246 #define HWY_TARGET_TOGGLE 247 #endif 248 #endif 249 250 #if (HWY_TARGETS & HWY_WASM) && (HWY_STATIC_TARGET != HWY_WASM) 251 #undef HWY_TARGET 252 #define HWY_TARGET HWY_WASM 253 #include HWY_TARGET_INCLUDE 254 #ifdef HWY_TARGET_TOGGLE 255 #undef HWY_TARGET_TOGGLE 256 #else 257 #define HWY_TARGET_TOGGLE 258 #endif 259 #endif 260 261 // ------------------------------ HWY_ARCH_PPC 262 263 #if (HWY_TARGETS & HWY_PPC8) && (HWY_STATIC_TARGET != HWY_PPC8) 264 #undef HWY_TARGET 265 #define HWY_TARGET HWY_PPC8 266 #include HWY_TARGET_INCLUDE 267 #ifdef HWY_TARGET_TOGGLE 268 #undef HWY_TARGET_TOGGLE 269 #else 270 #define HWY_TARGET_TOGGLE 271 #endif 272 #endif 273 274 #if (HWY_TARGETS & HWY_PPC9) && (HWY_STATIC_TARGET != HWY_PPC9) 275 #undef HWY_TARGET 276 #define HWY_TARGET HWY_PPC9 277 #include HWY_TARGET_INCLUDE 278 #ifdef HWY_TARGET_TOGGLE 279 #undef HWY_TARGET_TOGGLE 280 #else 281 #define HWY_TARGET_TOGGLE 282 #endif 283 #endif 284 285 #if (HWY_TARGETS & HWY_PPC10) && (HWY_STATIC_TARGET != HWY_PPC10) 286 #undef HWY_TARGET 287 #define HWY_TARGET HWY_PPC10 288 #include HWY_TARGET_INCLUDE 289 #ifdef HWY_TARGET_TOGGLE 290 #undef HWY_TARGET_TOGGLE 291 #else 292 #define HWY_TARGET_TOGGLE 293 #endif 294 #endif 295 296 // ------------------------------ HWY_ARCH_S390X 297 298 #if (HWY_TARGETS & HWY_Z14) && (HWY_STATIC_TARGET != HWY_Z14) 299 #undef HWY_TARGET 300 #define HWY_TARGET HWY_Z14 301 #include HWY_TARGET_INCLUDE 302 #ifdef HWY_TARGET_TOGGLE 303 #undef HWY_TARGET_TOGGLE 304 #else 305 #define HWY_TARGET_TOGGLE 306 #endif 307 #endif 308 309 #if (HWY_TARGETS & HWY_Z15) && (HWY_STATIC_TARGET != HWY_Z15) 310 #undef HWY_TARGET 311 #define HWY_TARGET HWY_Z15 312 #include HWY_TARGET_INCLUDE 313 #ifdef HWY_TARGET_TOGGLE 314 #undef HWY_TARGET_TOGGLE 315 #else 316 #define HWY_TARGET_TOGGLE 317 #endif 318 #endif 319 320 // ------------------------------ HWY_ARCH_RISCV 321 322 #if (HWY_TARGETS & HWY_RVV) && (HWY_STATIC_TARGET != HWY_RVV) 323 #undef HWY_TARGET 324 #define HWY_TARGET HWY_RVV 325 #include HWY_TARGET_INCLUDE 326 #ifdef HWY_TARGET_TOGGLE 327 #undef HWY_TARGET_TOGGLE 328 #else 329 #define HWY_TARGET_TOGGLE 330 #endif 331 #endif 332 333 // ------------------------------ HWY_ARCH_LOONGARCH 334 335 #if (HWY_TARGETS & HWY_LSX) && (HWY_STATIC_TARGET != HWY_LSX) 336 #undef HWY_TARGET 337 #define HWY_TARGET HWY_LSX 338 #include HWY_TARGET_INCLUDE 339 #ifdef HWY_TARGET_TOGGLE 340 #undef HWY_TARGET_TOGGLE 341 #else 342 #define HWY_TARGET_TOGGLE 343 #endif 344 #endif 345 346 #if (HWY_TARGETS & HWY_LASX) && (HWY_STATIC_TARGET != HWY_LASX) 347 #undef HWY_TARGET 348 #define HWY_TARGET HWY_LASX 349 #include HWY_TARGET_INCLUDE 350 #ifdef HWY_TARGET_TOGGLE 351 #undef HWY_TARGET_TOGGLE 352 #else 353 #define HWY_TARGET_TOGGLE 354 #endif 355 #endif 356 357 // ------------------------------ Scalar 358 359 #if (HWY_TARGETS & HWY_EMU128) && (HWY_STATIC_TARGET != HWY_EMU128) 360 #undef HWY_TARGET 361 #define HWY_TARGET HWY_EMU128 362 #include HWY_TARGET_INCLUDE 363 #ifdef HWY_TARGET_TOGGLE 364 #undef HWY_TARGET_TOGGLE 365 #else 366 #define HWY_TARGET_TOGGLE 367 #endif 368 #endif 369 370 #if (HWY_TARGETS & HWY_SCALAR) && (HWY_STATIC_TARGET != HWY_SCALAR) 371 #undef HWY_TARGET 372 #define HWY_TARGET HWY_SCALAR 373 #include HWY_TARGET_INCLUDE 374 #ifdef HWY_TARGET_TOGGLE 375 #undef HWY_TARGET_TOGGLE 376 #else 377 #define HWY_TARGET_TOGGLE 378 #endif 379 #endif 380 381 #endif // !HWY_IDE && (HWY_TARGETS != HWY_STATIC_TARGET) 382 383 // Now that all but the static target have been generated, re-enable HWY_EXPORT. 384 #undef HWY_ONCE 385 #define HWY_ONCE 1 386 387 // If we re-include once per enabled target, the translation unit's 388 // implementation would have to be skipped via #if to avoid redefining symbols. 389 // We instead skip the re-include for HWY_STATIC_TARGET, and generate its 390 // implementation when resuming compilation of the translation unit. 391 #undef HWY_TARGET 392 #define HWY_TARGET HWY_STATIC_TARGET 393 394 #ifdef HWY_ALREADY_INCLUDED 395 // Revert the previous toggle to prevent redefinitions for the static target. 396 #ifdef HWY_TARGET_TOGGLE 397 #undef HWY_TARGET_TOGGLE 398 #else 399 #define HWY_TARGET_TOGGLE 400 #endif 401 402 // Force re-inclusion of set_macros-inl.h now that HWY_TARGET is restored. 403 #ifdef HWY_SET_MACROS_PER_TARGET 404 #undef HWY_SET_MACROS_PER_TARGET 405 #else 406 #define HWY_SET_MACROS_PER_TARGET 407 #endif 408 #endif 409 410 #endif // HIGHWAY_HWY_FOREACH_TARGET_H_