tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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_