Bug 1867925 - Mark some storage-access-api tests as intermittent after wpt-sync....
[gecko.git] / third_party / highway / hwy / foreach_target.h
blobb7ad752d83d826a50a7d2e39f0848086fdde952f
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.
16 #ifndef HIGHWAY_HWY_FOREACH_TARGET_H_
17 #define HIGHWAY_HWY_FOREACH_TARGET_H_
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.
23 #include "hwy/detect_targets.h"
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
34 #ifdef HWY_HIGHWAY_INCLUDED // highway.h include guard
35 // Trigger fixup at the bottom of this header.
36 #define HWY_ALREADY_INCLUDED
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
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)
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)
52 #if !defined(HWY_TARGET_INCLUDE)
53 #error ">1 target enabled => define HWY_TARGET_INCLUDE before foreach_target.h"
54 #endif
56 // ------------------------------ HWY_ARCH_X86
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
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
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
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
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
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
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
135 // ------------------------------ HWY_ARCH_ARM
137 #if (HWY_TARGETS & HWY_NEON_WITHOUT_AES) && \
138 (HWY_STATIC_TARGET != HWY_NEON_WITHOUT_AES)
139 #undef HWY_TARGET
140 #define HWY_TARGET HWY_NEON_WITHOUT_AES
141 #include HWY_TARGET_INCLUDE
142 #ifdef HWY_TARGET_TOGGLE
143 #undef HWY_TARGET_TOGGLE
144 #else
145 #define HWY_TARGET_TOGGLE
146 #endif
147 #endif
149 #if (HWY_TARGETS & HWY_NEON) && (HWY_STATIC_TARGET != HWY_NEON)
150 #undef HWY_TARGET
151 #define HWY_TARGET HWY_NEON
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
160 #if (HWY_TARGETS & HWY_SVE) && (HWY_STATIC_TARGET != HWY_SVE)
161 #undef HWY_TARGET
162 #define HWY_TARGET HWY_SVE
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
171 #if (HWY_TARGETS & HWY_SVE2) && (HWY_STATIC_TARGET != HWY_SVE2)
172 #undef HWY_TARGET
173 #define HWY_TARGET HWY_SVE2
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
182 #if (HWY_TARGETS & HWY_SVE_256) && (HWY_STATIC_TARGET != HWY_SVE_256)
183 #undef HWY_TARGET
184 #define HWY_TARGET HWY_SVE_256
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
193 #if (HWY_TARGETS & HWY_SVE2_128) && (HWY_STATIC_TARGET != HWY_SVE2_128)
194 #undef HWY_TARGET
195 #define HWY_TARGET HWY_SVE2_128
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
204 // ------------------------------ HWY_ARCH_WASM
206 #if (HWY_TARGETS & HWY_WASM_EMU256) && (HWY_STATIC_TARGET != HWY_WASM_EMU256)
207 #undef HWY_TARGET
208 #define HWY_TARGET HWY_WASM_EMU256
209 #include HWY_TARGET_INCLUDE
210 #ifdef HWY_TARGET_TOGGLE
211 #undef HWY_TARGET_TOGGLE
212 #else
213 #define HWY_TARGET_TOGGLE
214 #endif
215 #endif
217 #if (HWY_TARGETS & HWY_WASM) && (HWY_STATIC_TARGET != HWY_WASM)
218 #undef HWY_TARGET
219 #define HWY_TARGET HWY_WASM
220 #include HWY_TARGET_INCLUDE
221 #ifdef HWY_TARGET_TOGGLE
222 #undef HWY_TARGET_TOGGLE
223 #else
224 #define HWY_TARGET_TOGGLE
225 #endif
226 #endif
228 // ------------------------------ HWY_ARCH_PPC
230 #if (HWY_TARGETS & HWY_PPC8) && (HWY_STATIC_TARGET != HWY_PPC8)
231 #undef HWY_TARGET
232 #define HWY_TARGET HWY_PPC8
233 #include HWY_TARGET_INCLUDE
234 #ifdef HWY_TARGET_TOGGLE
235 #undef HWY_TARGET_TOGGLE
236 #else
237 #define HWY_TARGET_TOGGLE
238 #endif
239 #endif
241 #if (HWY_TARGETS & HWY_PPC9) && (HWY_STATIC_TARGET != HWY_PPC9)
242 #undef HWY_TARGET
243 #define HWY_TARGET HWY_PPC9
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
252 #if (HWY_TARGETS & HWY_PPC10) && (HWY_STATIC_TARGET != HWY_PPC10)
253 #undef HWY_TARGET
254 #define HWY_TARGET HWY_PPC10
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
263 // ------------------------------ HWY_ARCH_RVV
265 #if (HWY_TARGETS & HWY_RVV) && (HWY_STATIC_TARGET != HWY_RVV)
266 #undef HWY_TARGET
267 #define HWY_TARGET HWY_RVV
268 #include HWY_TARGET_INCLUDE
269 #ifdef HWY_TARGET_TOGGLE
270 #undef HWY_TARGET_TOGGLE
271 #else
272 #define HWY_TARGET_TOGGLE
273 #endif
274 #endif
276 // ------------------------------ Scalar
278 #if (HWY_TARGETS & HWY_EMU128) && (HWY_STATIC_TARGET != HWY_EMU128)
279 #undef HWY_TARGET
280 #define HWY_TARGET HWY_EMU128
281 #include HWY_TARGET_INCLUDE
282 #ifdef HWY_TARGET_TOGGLE
283 #undef HWY_TARGET_TOGGLE
284 #else
285 #define HWY_TARGET_TOGGLE
286 #endif
287 #endif
289 #if (HWY_TARGETS & HWY_SCALAR) && (HWY_STATIC_TARGET != HWY_SCALAR)
290 #undef HWY_TARGET
291 #define HWY_TARGET HWY_SCALAR
292 #include HWY_TARGET_INCLUDE
293 #ifdef HWY_TARGET_TOGGLE
294 #undef HWY_TARGET_TOGGLE
295 #else
296 #define HWY_TARGET_TOGGLE
297 #endif
298 #endif
300 #endif // !HWY_IDE && (HWY_TARGETS != HWY_STATIC_TARGET)
302 // Now that all but the static target have been generated, re-enable HWY_EXPORT.
303 #undef HWY_ONCE
304 #define HWY_ONCE 1
306 // If we re-include once per enabled target, the translation unit's
307 // implementation would have to be skipped via #if to avoid redefining symbols.
308 // We instead skip the re-include for HWY_STATIC_TARGET, and generate its
309 // implementation when resuming compilation of the translation unit.
310 #undef HWY_TARGET
311 #define HWY_TARGET HWY_STATIC_TARGET
313 #ifdef HWY_ALREADY_INCLUDED
314 // Revert the previous toggle to prevent redefinitions for the static target.
315 #ifdef HWY_TARGET_TOGGLE
316 #undef HWY_TARGET_TOGGLE
317 #else
318 #define HWY_TARGET_TOGGLE
319 #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
329 #endif // HIGHWAY_HWY_FOREACH_TARGET_H_