Grok 12.0.1
foreach_target.h
Go to the documentation of this file.
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// ------------------------------ HWY_ARCH_ARM
147
148#if (HWY_TARGETS & HWY_NEON_WITHOUT_AES) && \
149 (HWY_STATIC_TARGET != HWY_NEON_WITHOUT_AES)
150#undef HWY_TARGET
151#define HWY_TARGET HWY_NEON_WITHOUT_AES
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
160#if (HWY_TARGETS & HWY_NEON) && (HWY_STATIC_TARGET != HWY_NEON)
161#undef HWY_TARGET
162#define HWY_TARGET HWY_NEON
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_SVE) && (HWY_STATIC_TARGET != HWY_SVE)
172#undef HWY_TARGET
173#define HWY_TARGET HWY_SVE
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_SVE2) && (HWY_STATIC_TARGET != HWY_SVE2)
183#undef HWY_TARGET
184#define HWY_TARGET HWY_SVE2
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_256) && (HWY_STATIC_TARGET != HWY_SVE_256)
194#undef HWY_TARGET
195#define HWY_TARGET HWY_SVE_256
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_128) && (HWY_STATIC_TARGET != HWY_SVE2_128)
205#undef HWY_TARGET
206#define HWY_TARGET HWY_SVE2_128
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// ------------------------------ HWY_ARCH_WASM
216
217#if (HWY_TARGETS & HWY_WASM_EMU256) && (HWY_STATIC_TARGET != HWY_WASM_EMU256)
218#undef HWY_TARGET
219#define HWY_TARGET HWY_WASM_EMU256
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
227
228#if (HWY_TARGETS & HWY_WASM) && (HWY_STATIC_TARGET != HWY_WASM)
229#undef HWY_TARGET
230#define HWY_TARGET HWY_WASM
231#include HWY_TARGET_INCLUDE
232#ifdef HWY_TARGET_TOGGLE
233#undef HWY_TARGET_TOGGLE
234#else
235#define HWY_TARGET_TOGGLE
236#endif
237#endif
238
239// ------------------------------ HWY_ARCH_PPC
240
241#if (HWY_TARGETS & HWY_PPC8) && (HWY_STATIC_TARGET != HWY_PPC8)
242#undef HWY_TARGET
243#define HWY_TARGET HWY_PPC8
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
252#if (HWY_TARGETS & HWY_PPC9) && (HWY_STATIC_TARGET != HWY_PPC9)
253#undef HWY_TARGET
254#define HWY_TARGET HWY_PPC9
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
263#if (HWY_TARGETS & HWY_PPC10) && (HWY_STATIC_TARGET != HWY_PPC10)
264#undef HWY_TARGET
265#define HWY_TARGET HWY_PPC10
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// ------------------------------ HWY_ARCH_S390X
275
276#if (HWY_TARGETS & HWY_Z14) && (HWY_STATIC_TARGET != HWY_Z14)
277#undef HWY_TARGET
278#define HWY_TARGET HWY_Z14
279#include HWY_TARGET_INCLUDE
280#ifdef HWY_TARGET_TOGGLE
281#undef HWY_TARGET_TOGGLE
282#else
283#define HWY_TARGET_TOGGLE
284#endif
285#endif
286
287#if (HWY_TARGETS & HWY_Z15) && (HWY_STATIC_TARGET != HWY_Z15)
288#undef HWY_TARGET
289#define HWY_TARGET HWY_Z15
290#include HWY_TARGET_INCLUDE
291#ifdef HWY_TARGET_TOGGLE
292#undef HWY_TARGET_TOGGLE
293#else
294#define HWY_TARGET_TOGGLE
295#endif
296#endif
297
298// ------------------------------ HWY_ARCH_RISCV
299
300#if (HWY_TARGETS & HWY_RVV) && (HWY_STATIC_TARGET != HWY_RVV)
301#undef HWY_TARGET
302#define HWY_TARGET HWY_RVV
303#include HWY_TARGET_INCLUDE
304#ifdef HWY_TARGET_TOGGLE
305#undef HWY_TARGET_TOGGLE
306#else
307#define HWY_TARGET_TOGGLE
308#endif
309#endif
310
311// ------------------------------ Scalar
312
313#if (HWY_TARGETS & HWY_EMU128) && (HWY_STATIC_TARGET != HWY_EMU128)
314#undef HWY_TARGET
315#define HWY_TARGET HWY_EMU128
316#include HWY_TARGET_INCLUDE
317#ifdef HWY_TARGET_TOGGLE
318#undef HWY_TARGET_TOGGLE
319#else
320#define HWY_TARGET_TOGGLE
321#endif
322#endif
323
324#if (HWY_TARGETS & HWY_SCALAR) && (HWY_STATIC_TARGET != HWY_SCALAR)
325#undef HWY_TARGET
326#define HWY_TARGET HWY_SCALAR
327#include HWY_TARGET_INCLUDE
328#ifdef HWY_TARGET_TOGGLE
329#undef HWY_TARGET_TOGGLE
330#else
331#define HWY_TARGET_TOGGLE
332#endif
333#endif
334
335#endif // !HWY_IDE && (HWY_TARGETS != HWY_STATIC_TARGET)
336
337// Now that all but the static target have been generated, re-enable HWY_EXPORT.
338#undef HWY_ONCE
339#define HWY_ONCE 1
340
341// If we re-include once per enabled target, the translation unit's
342// implementation would have to be skipped via #if to avoid redefining symbols.
343// We instead skip the re-include for HWY_STATIC_TARGET, and generate its
344// implementation when resuming compilation of the translation unit.
345#undef HWY_TARGET
346#define HWY_TARGET HWY_STATIC_TARGET
347
348#ifdef HWY_ALREADY_INCLUDED
349// Revert the previous toggle to prevent redefinitions for the static target.
350#ifdef HWY_TARGET_TOGGLE
351#undef HWY_TARGET_TOGGLE
352#else
353#define HWY_TARGET_TOGGLE
354#endif
355
356// Force re-inclusion of set_macros-inl.h now that HWY_TARGET is restored.
357#ifdef HWY_SET_MACROS_PER_TARGET
358#undef HWY_SET_MACROS_PER_TARGET
359#else
360#define HWY_SET_MACROS_PER_TARGET
361#endif
362#endif
363
364#endif // HIGHWAY_HWY_FOREACH_TARGET_H_