Go to the documentation of this file.
20#if defined(HWY_SET_MACROS_PER_TARGET) == defined(HWY_TARGET_TOGGLE)
21#ifdef HWY_SET_MACROS_PER_TARGET
22#undef HWY_SET_MACROS_PER_TARGET
24#define HWY_SET_MACROS_PER_TARGET
36#undef HWY_HAVE_SCALABLE
37#undef HWY_HAVE_INTEGER64
38#undef HWY_HAVE_FLOAT16
39#undef HWY_HAVE_FLOAT64
40#undef HWY_MEM_OPS_MIGHT_FAULT
47#if defined(HWY_DISABLE_PCLMUL_AES)
48#define HWY_TARGET_STR_PCLMUL_AES ""
50#define HWY_TARGET_STR_PCLMUL_AES ",pclmul,aes"
53#if defined(HWY_DISABLE_BMI2_FMA)
54#define HWY_TARGET_STR_BMI2_FMA ""
56#define HWY_TARGET_STR_BMI2_FMA ",bmi,bmi2,fma"
59#if defined(HWY_DISABLE_F16C)
60#define HWY_TARGET_STR_F16C ""
62#define HWY_TARGET_STR_F16C ",f16c"
65#define HWY_TARGET_STR_SSSE3 "sse2,ssse3"
67#define HWY_TARGET_STR_SSE4 \
68 HWY_TARGET_STR_SSSE3 ",sse4.1,sse4.2" HWY_TARGET_STR_PCLMUL_AES
70#define HWY_TARGET_STR_AVX2 \
71 HWY_TARGET_STR_SSE4 ",avx,avx2" HWY_TARGET_STR_BMI2_FMA HWY_TARGET_STR_F16C
72#define HWY_TARGET_STR_AVX3 \
73 HWY_TARGET_STR_AVX2 ",avx512f,avx512vl,avx512dq,avx512bw"
80#if HWY_TARGET == HWY_SSSE3
82#define HWY_NAMESPACE N_SSSE3
83#define HWY_ALIGN alignas(16)
84#define HWY_MAX_BYTES 16
85#define HWY_LANES(T) (16 / sizeof(T))
87#define HWY_HAVE_SCALABLE 0
88#define HWY_HAVE_INTEGER64 1
89#define HWY_HAVE_FLOAT16 1
90#define HWY_HAVE_FLOAT64 1
91#define HWY_MEM_OPS_MIGHT_FAULT 1
92#define HWY_NATIVE_FMA 0
93#define HWY_CAP_GE256 0
94#define HWY_CAP_GE512 0
96#define HWY_TARGET_STR HWY_TARGET_STR_SSSE3
100#elif HWY_TARGET == HWY_SSE4
102#define HWY_NAMESPACE N_SSE4
103#define HWY_ALIGN alignas(16)
104#define HWY_MAX_BYTES 16
105#define HWY_LANES(T) (16 / sizeof(T))
107#define HWY_HAVE_SCALABLE 0
108#define HWY_HAVE_INTEGER64 1
109#define HWY_HAVE_FLOAT16 1
110#define HWY_HAVE_FLOAT64 1
111#define HWY_MEM_OPS_MIGHT_FAULT 1
112#define HWY_NATIVE_FMA 0
113#define HWY_CAP_GE256 0
114#define HWY_CAP_GE512 0
116#define HWY_TARGET_STR HWY_TARGET_STR_SSE4
120#elif HWY_TARGET == HWY_AVX2
122#define HWY_NAMESPACE N_AVX2
123#define HWY_ALIGN alignas(32)
124#define HWY_MAX_BYTES 32
125#define HWY_LANES(T) (32 / sizeof(T))
127#define HWY_HAVE_SCALABLE 0
128#define HWY_HAVE_INTEGER64 1
129#define HWY_HAVE_FLOAT16 1
130#define HWY_HAVE_FLOAT64 1
131#define HWY_MEM_OPS_MIGHT_FAULT 1
133#ifdef HWY_DISABLE_BMI2_FMA
134#define HWY_NATIVE_FMA 0
136#define HWY_NATIVE_FMA 1
139#define HWY_CAP_GE256 1
140#define HWY_CAP_GE512 0
142#define HWY_TARGET_STR HWY_TARGET_STR_AVX2
146#elif HWY_TARGET == HWY_AVX3 || HWY_TARGET == HWY_AVX3_DL
148#define HWY_ALIGN alignas(64)
149#define HWY_MAX_BYTES 64
150#define HWY_LANES(T) (64 / sizeof(T))
152#define HWY_HAVE_SCALABLE 0
153#define HWY_HAVE_INTEGER64 1
154#define HWY_HAVE_FLOAT16 1
155#define HWY_HAVE_FLOAT64 1
156#define HWY_MEM_OPS_MIGHT_FAULT 0
157#define HWY_NATIVE_FMA 1
158#define HWY_CAP_GE256 1
159#define HWY_CAP_GE512 1
161#if HWY_TARGET == HWY_AVX3
163#define HWY_NAMESPACE N_AVX3
164#define HWY_TARGET_STR HWY_TARGET_STR_AVX3
166#elif HWY_TARGET == HWY_AVX3_DL
168#define HWY_NAMESPACE N_AVX3_DL
169#define HWY_TARGET_STR \
170 HWY_TARGET_STR_AVX3 \
171 ",vpclmulqdq,avx512vbmi,avx512vbmi2,vaes,avxvnni,avx512bitalg," \
180#elif HWY_TARGET == HWY_PPC8
182#define HWY_ALIGN alignas(16)
183#define HWY_MAX_BYTES 16
184#define HWY_LANES(T) (16 / sizeof(T))
186#define HWY_HAVE_SCALABLE 0
187#define HWY_HAVE_INTEGER64 1
188#define HWY_HAVE_FLOAT16 0
189#define HWY_HAVE_FLOAT64 1
190#define HWY_MEM_OPS_MIGHT_FAULT 1
191#define HWY_NATIVE_FMA 1
192#define HWY_CAP_GE256 0
193#define HWY_CAP_GE512 0
195#define HWY_NAMESPACE N_PPC8
197#define HWY_TARGET_STR "altivec,vsx"
201#elif HWY_TARGET == HWY_NEON
203#define HWY_ALIGN alignas(16)
204#define HWY_MAX_BYTES 16
205#define HWY_LANES(T) (16 / sizeof(T))
207#define HWY_HAVE_SCALABLE 0
208#define HWY_HAVE_INTEGER64 1
209#define HWY_HAVE_FLOAT16 1
212#define HWY_HAVE_FLOAT64 1
214#define HWY_HAVE_FLOAT64 0
217#define HWY_MEM_OPS_MIGHT_FAULT 1
219#if defined(__ARM_VFPV4__) || HWY_ARCH_ARM_A64
220#define HWY_NATIVE_FMA 1
222#define HWY_NATIVE_FMA 0
225#define HWY_CAP_GE256 0
226#define HWY_CAP_GE512 0
228#define HWY_NAMESPACE N_NEON
231#if HWY_HAVE_RUNTIME_DISPATCH
233#define HWY_TARGET_STR "+neon-vfpv4"
235#define HWY_TARGET_STR "+crypto"
243#elif HWY_TARGET == HWY_SVE2 || HWY_TARGET == HWY_SVE || \
244 HWY_TARGET == HWY_SVE_256 || HWY_TARGET == HWY_SVE2_128
247#define HWY_ALIGN alignas(8)
251#define HWY_LANES(T) ((HWY_MAX_BYTES) / sizeof(T))
253#define HWY_HAVE_SCALABLE 1
254#define HWY_HAVE_INTEGER64 1
255#define HWY_HAVE_FLOAT16 1
256#define HWY_HAVE_FLOAT64 1
257#define HWY_MEM_OPS_MIGHT_FAULT 0
258#define HWY_NATIVE_FMA 1
259#define HWY_CAP_GE256 0
260#define HWY_CAP_GE512 0
262#if HWY_TARGET == HWY_SVE2
263#define HWY_NAMESPACE N_SVE2
264#define HWY_MAX_BYTES 256
265#elif HWY_TARGET == HWY_SVE_256
266#define HWY_NAMESPACE N_SVE_256
267#define HWY_MAX_BYTES 32
268#elif HWY_TARGET == HWY_SVE2_128
269#define HWY_NAMESPACE N_SVE2_128
270#define HWY_MAX_BYTES 16
272#define HWY_NAMESPACE N_SVE
273#define HWY_MAX_BYTES 256
277#if HWY_HAVE_RUNTIME_DISPATCH
278#if HWY_TARGET == HWY_SVE2 || HWY_TARGET == HWY_SVE2_128
279#define HWY_TARGET_STR "+sve2-aes"
281#define HWY_TARGET_STR "+sve"
289#elif HWY_TARGET == HWY_WASM
291#define HWY_ALIGN alignas(16)
292#define HWY_MAX_BYTES 16
293#define HWY_LANES(T) (16 / sizeof(T))
295#define HWY_HAVE_SCALABLE 0
296#define HWY_HAVE_INTEGER64 1
297#define HWY_HAVE_FLOAT16 1
298#define HWY_HAVE_FLOAT64 0
299#define HWY_MEM_OPS_MIGHT_FAULT 1
300#define HWY_NATIVE_FMA 0
301#define HWY_CAP_GE256 0
302#define HWY_CAP_GE512 0
304#define HWY_NAMESPACE N_WASM
306#define HWY_TARGET_STR "simd128"
310#elif HWY_TARGET == HWY_WASM_EMU256
312#define HWY_ALIGN alignas(32)
313#define HWY_MAX_BYTES 32
314#define HWY_LANES(T) (32 / sizeof(T))
316#define HWY_HAVE_SCALABLE 0
317#define HWY_HAVE_INTEGER64 1
318#define HWY_HAVE_FLOAT16 1
319#define HWY_HAVE_FLOAT64 0
320#define HWY_MEM_OPS_MIGHT_FAULT 1
321#define HWY_NATIVE_FMA 0
322#define HWY_CAP_GE256 1
323#define HWY_CAP_GE512 0
325#define HWY_NAMESPACE N_WASM_EMU256
327#define HWY_TARGET_STR "simd128"
331#elif HWY_TARGET == HWY_RVV
338#define HWY_MAX_BYTES 65536
342#define HWY_LANES(T) (8192 / sizeof(T))
344#define HWY_HAVE_SCALABLE 1
345#define HWY_HAVE_INTEGER64 1
346#define HWY_HAVE_FLOAT64 1
347#define HWY_MEM_OPS_MIGHT_FAULT 0
348#define HWY_NATIVE_FMA 1
349#define HWY_CAP_GE256 0
350#define HWY_CAP_GE512 0
352#if defined(__riscv_zvfh)
353#define HWY_HAVE_FLOAT16 1
355#define HWY_HAVE_FLOAT16 0
358#define HWY_NAMESPACE N_RVV
365#elif HWY_TARGET == HWY_EMU128
367#define HWY_ALIGN alignas(16)
368#define HWY_MAX_BYTES 16
369#define HWY_LANES(T) (16 / sizeof(T))
371#define HWY_HAVE_SCALABLE 0
372#define HWY_HAVE_INTEGER64 1
373#define HWY_HAVE_FLOAT16 1
374#define HWY_HAVE_FLOAT64 1
375#define HWY_MEM_OPS_MIGHT_FAULT 1
376#define HWY_NATIVE_FMA 0
377#define HWY_CAP_GE256 0
378#define HWY_CAP_GE512 0
380#define HWY_NAMESPACE N_EMU128
386#elif HWY_TARGET == HWY_SCALAR
389#define HWY_MAX_BYTES 8
390#define HWY_LANES(T) 1
392#define HWY_HAVE_SCALABLE 0
393#define HWY_HAVE_INTEGER64 1
394#define HWY_HAVE_FLOAT16 1
395#define HWY_HAVE_FLOAT64 1
396#define HWY_MEM_OPS_MIGHT_FAULT 0
397#define HWY_NATIVE_FMA 0
398#define HWY_CAP_GE256 0
399#define HWY_CAP_GE512 0
401#define HWY_NAMESPACE N_SCALAR
406#pragma message("HWY_TARGET does not match any known target")
410#if HWY_IS_ASAN || HWY_IS_MSAN
411#undef HWY_MEM_OPS_MIGHT_FAULT
412#define HWY_MEM_OPS_MIGHT_FAULT 1
416#undef HWY_BEFORE_NAMESPACE
417#if defined(HWY_TARGET_STR)
418#define HWY_BEFORE_NAMESPACE() \
419 HWY_PUSH_ATTRIBUTES(HWY_TARGET_STR) \
420 static_assert(true, "For requiring trailing semicolon")
423#define HWY_BEFORE_NAMESPACE() \
424 static_assert(true, "For requiring trailing semicolon")
428#undef HWY_AFTER_NAMESPACE
429#if defined(HWY_TARGET_STR)
430#define HWY_AFTER_NAMESPACE() \
432 static_assert(true, "For requiring trailing semicolon")
435#define HWY_AFTER_NAMESPACE() \
436 static_assert(true, "For requiring trailing semicolon")
440#if defined(HWY_TARGET_STR) && HWY_HAS_ATTRIBUTE(target)
441#define HWY_ATTR __attribute__((target(HWY_TARGET_STR)))