16#ifndef HIGHWAY_HWY_TARGETS_H_
17#define HIGHWAY_HWY_TARGETS_H_
32#if !HWY_ARCH_RISCV && !defined(HWY_NO_LIBCXX)
46#if (HWY_TARGETS & (HWY_TARGETS - 1)) == 0
47#define HWY_SUPPORTED_TARGETS HWY_TARGETS
49#define HWY_SUPPORTED_TARGETS hwy::SupportedTargets()
74 std::vector<int64_t> ret;
76 targets = targets & (targets - 1)) {
77 int64_t current_target = targets & ~(targets - 1);
78 ret.push_back(current_target);
118 return "NEON_WITHOUT_AES";
141 return "WASM_EMU256";
179#define HWY_CHOSEN_TARGET_MASK_SCALAR (1LL << (HWY_MAX_DYNAMIC_TARGETS + 1))
183#define HWY_CHOSEN_TARGET_SHIFT(X) \
184 ((((X) >> (HWY_HIGHEST_TARGET_BIT + 1 - HWY_MAX_DYNAMIC_TARGETS)) & \
185 ((1LL << HWY_MAX_DYNAMIC_TARGETS) - 1)) \
189#define HWY_CHOSEN_TARGET_MASK_TARGETS \
190 (HWY_CHOSEN_TARGET_SHIFT(HWY_TARGETS) | HWY_CHOSEN_TARGET_MASK_SCALAR | 1LL)
195#define HWY_MAX_DYNAMIC_TARGETS 15
196#define HWY_HIGHEST_TARGET_BIT HWY_HIGHEST_TARGET_BIT_X86
202#define HWY_CHOOSE_TARGET_LIST(func_name) \
207 HWY_CHOOSE_AVX3_SPR(func_name), \
209 HWY_CHOOSE_AVX3_ZEN4(func_name), \
210 HWY_CHOOSE_AVX3_DL(func_name), \
211 HWY_CHOOSE_AVX3(func_name), \
212 HWY_CHOOSE_AVX2(func_name), \
214 HWY_CHOOSE_SSE4(func_name), \
215 HWY_CHOOSE_SSSE3(func_name), \
217 HWY_CHOOSE_SSE2(func_name)
221#define HWY_MAX_DYNAMIC_TARGETS 15
222#define HWY_HIGHEST_TARGET_BIT HWY_HIGHEST_TARGET_BIT_ARM
223#define HWY_CHOOSE_TARGET_LIST(func_name) \
233 HWY_CHOOSE_SVE2_128(func_name), \
234 HWY_CHOOSE_SVE_256(func_name), \
235 HWY_CHOOSE_SVE2(func_name), \
236 HWY_CHOOSE_SVE(func_name), \
237 HWY_CHOOSE_NEON(func_name), \
238 HWY_CHOOSE_NEON_WITHOUT_AES(func_name)
242#define HWY_MAX_DYNAMIC_TARGETS 9
243#define HWY_HIGHEST_TARGET_BIT HWY_HIGHEST_TARGET_BIT_RVV
244#define HWY_CHOOSE_TARGET_LIST(func_name) \
252 HWY_CHOOSE_RVV(func_name), \
255#elif HWY_ARCH_PPC || HWY_ARCH_S390X
257#define HWY_MAX_DYNAMIC_TARGETS 9
258#define HWY_HIGHEST_TARGET_BIT HWY_HIGHEST_TARGET_BIT_PPC
259#define HWY_CHOOSE_TARGET_LIST(func_name) \
264 HWY_CHOOSE_PPC10(func_name), \
265 HWY_CHOOSE_PPC9(func_name), \
266 HWY_CHOOSE_PPC8(func_name), \
267 HWY_CHOOSE_Z15(func_name), \
268 HWY_CHOOSE_Z14(func_name)
272#define HWY_MAX_DYNAMIC_TARGETS 9
273#define HWY_HIGHEST_TARGET_BIT HWY_HIGHEST_TARGET_BIT_WASM
274#define HWY_CHOOSE_TARGET_LIST(func_name) \
281 HWY_CHOOSE_WASM_EMU256(func_name), \
282 HWY_CHOOSE_WASM(func_name), \
288#define HWY_MAX_DYNAMIC_TARGETS 1
289#define HWY_HIGHEST_TARGET_BIT HWY_HIGHEST_TARGET_BIT_SCALAR
327#if HWY_ARCH_RISCV || defined(HWY_NO_LIBCXX)
#define HWY_INLINE
Definition base.h:101
#define HWY_MAYBE_UNUSED
Definition base.h:113
#define HWY_WASM_EMU256
Definition detect_targets.h:117
#define HWY_SSE2
Definition detect_targets.h:80
#define HWY_AVX3_DL
Definition detect_targets.h:73
#define HWY_NEON
Definition detect_targets.h:93
#define HWY_EMU128
Definition detect_targets.h:124
#define HWY_AVX3_SPR
Definition detect_targets.h:63
#define HWY_PPC8
Definition detect_targets.h:110
#define HWY_Z15
Definition detect_targets.h:111
#define HWY_PPC10
Definition detect_targets.h:108
#define HWY_SVE2
Definition detect_targets.h:91
#define HWY_AVX3
Definition detect_targets.h:74
#define HWY_AVX2
Definition detect_targets.h:75
#define HWY_SCALAR
Definition detect_targets.h:126
#define HWY_SVE_256
Definition detect_targets.h:90
#define HWY_SVE2_128
Definition detect_targets.h:89
#define HWY_AVX3_ZEN4
Definition detect_targets.h:68
#define HWY_Z14
Definition detect_targets.h:112
#define HWY_PPC9
Definition detect_targets.h:109
#define HWY_WASM
Definition detect_targets.h:118
#define HWY_SVE
Definition detect_targets.h:92
#define HWY_RVV
Definition detect_targets.h:99
#define HWY_TARGETS
Definition detect_targets.h:680
#define HWY_SSE4
Definition detect_targets.h:77
#define HWY_NEON_WITHOUT_AES
Definition detect_targets.h:94
#define HWY_SSSE3
Definition detect_targets.h:78
#define HWY_DLLEXPORT
Definition highway_export.h:13
HWY_API size_t Num0BitsBelowLS1Bit_Nonzero64(const uint64_t x)
Definition base.h:2551
static HWY_MAYBE_UNUSED const char * TargetName(int64_t target)
Definition targets.h:85
HWY_DLLEXPORT ChosenTarget & GetChosenTarget()
HWY_DLLEXPORT void DisableTargets(int64_t disabled_targets)
HWY_INLINE std::vector< int64_t > SupportedAndGeneratedTargets()
Definition targets.h:73
HWY_DLLEXPORT int64_t SupportedTargets()
HWY_DLLEXPORT void SetSupportedTargetsForTest(int64_t targets)
bool IsInitialized() const
Definition targets.h:313
void StoreMask(int64_t mask)
Definition targets.h:334
size_t HWY_INLINE GetIndex() const
Definition targets.h:320
void DeInit()
Definition targets.h:309
void Update(int64_t targets)
Definition targets.h:301
int64_t LoadMask() const
Definition targets.h:333
std::atomic< int64_t > mask_
Definition targets.h:336
#define HWY_CHOSEN_TARGET_MASK_TARGETS
Definition targets.h:189
#define HWY_CHOSEN_TARGET_SHIFT(X)
Definition targets.h:183
#define HWY_CHOSEN_TARGET_MASK_SCALAR
Definition targets.h:179