* Copyright (c) Huawei Technologies Co., Ltd. 2024-2024. All rights reserved.
*/
#ifndef OMNI_SET_MACROS_H
#define OMNI_SET_MACROS_H
#include "simd/targets.h"
#undef OMNI_NAMESPACE
#undef OMNI_ALIGN
#undef OMNI_MAX_BYTES
#undef OMNI_LANES
#undef OMNI_HAVE_SCALABLE
#undef OMNI_HAVE_TUPLE
#undef OMNI_HAVE_INTEGER64
#undef OMNI_HAVE_FLOAT16
#undef OMNI_HAVE_FLOAT64
#undef OMNI_MEM_OPS_MIGHT_FAULT
#undef OMNI_NATIVE_FMA
#undef OMNI_NATIVE_DOT_BF16
#undef OMNI_CAP_GE256
#undef OMNI_CAP_GE512
#undef OMNI_TARGET_IS_SVE
#if OMNI_TARGET == OMNI_SVE_256
#define OMNI_TARGET_IS_SVE 1
#else
#define OMNI_TARGET_IS_SVE 0
#endif
#undef OMNI_TARGET_IS_NEON
#if OMNI_TARGET == OMNI_NEON
#define OMNI_TARGET_IS_NEON 1
#else
#define OMNI_TARGET_IS_NEON 0
#endif
#define OMNI_MAX_N 65536
#define OMNI_MAX_POW2 3
#define OMNI_MIN_POW2 -8
#if OMNI_TARGET_IS_NEON
#define OMNI_ALIGN alignas(16)
#define OMNI_MAX_BYTES 16
#define OMNI_LANES(T) static_cast<int32_t>(16 / sizeof(T))
#define OMNI_HAVE_SCALABLE 0
#define OMNI_HAVE_INTEGER64 1
#define OMNI_HAVE_FLOAT16 0
#define OMNI_HAVE_FLOAT64 1
#define OMNI_MEM_OPS_MIGHT_FAULT 1
#define OMNI_NATIVE_FMA 1
#if OMNI_NEON_HAVE_F32_TO_BF16C || OMNI_TARGET == OMNI_NEON_BF16
#define OMNI_NATIVE_DOT_BF16 1
#else
#define OMNI_NATIVE_DOT_BF16 0
#endif
#define OMNI_CAP_GE256 0
#define OMNI_CAP_GE512 0
#if OMNI_TARGET == OMNI_NEON_WITHOUT_AES
#define OMNI_NAMESPACE N_NEON_WITHOUT_AES
#elif OMNI_TARGET == OMNI_NEON
#define OMNI_NAMESPACE N_NEON
#elif OMNI_TARGET == OMNI_NEON_BF16
#define OMNI_NAMESPACE N_NEON_BF16
#else
#error "Logic error, missing case"
#endif
#if OMNI_HAVE_RUNTIME_DISPATCH
#if OMNI_ARCH_ARM_V7
#if OMNI_COMPILER_GCC_ACTUAL >= 800
#define OMNI_TARGET_STR "+neon-vfpv4"
#else
#endif
#else
#if (OMNI_COMPILER_GCC_ACTUAL && OMNI_COMPILER_GCC_ACTUAL < 1300) ||
(OMNI_COMPILER_CLANG && OMNI_COMPILER_CLANG < 1300)
#define OMNI_TARGET_STR_NEON "+crypto"
#else
#define OMNI_TARGET_STR_NEON "+aes"
#endif
#define OMNI_TARGET_STR_FP16 "+fp16"
#if OMNI_TARGET == OMNI_NEON_WITHOUT_AES
#elif OMNI_TARGET == OMNI_NEON
#define OMNI_TARGET_STR OMNI_TARGET_STR_NEON
#elif OMNI_TARGET == OMNI_NEON_BF16
#define OMNI_TARGET_STR OMNI_TARGET_STR_FP16 "+bf16+dotprod" OMNI_TARGET_STR_NEON
#else
#error "Logic error, missing case"
#endif
#endif
#else
#endif
#elif OMNI_TARGET_IS_SVE
#define OMNI_ALIGN alignas(8)
#define OMNI_MAX_BYTES 32
#define OMNI_LANES(T) ((OMNI_MAX_BYTES) / sizeof(T))
#define OMNI_HAVE_INTEGER64 1
#define OMNI_HAVE_FLOAT16 1
#define OMNI_HAVE_FLOAT64 1
#define OMNI_MEM_OPS_MIGHT_FAULT 0
#define OMNI_NATIVE_FMA 1
#define OMNI_NATIVE_DOT_BF16 0
#endif
#define OMNI_CAP_GE256 0
#define OMNI_CAP_GE512 0
#define OMNI_MAX_BYTES 32
#define OMNI_HAVE_SCALABLE 0
#endif