Go to the documentation of this file.
16#ifndef HIGHWAY_HWY_DETECT_COMPILER_ARCH_H_
17#define HIGHWAY_HWY_DETECT_COMPILER_ARCH_H_
23#if (defined __CDT_PARSER__) || (defined __INTELLISENSE__) || \
24 (defined Q_CREATOR_RUN) || (defined __CLANGD__) || \
25 (defined GROK_ELLIPSIS_BUILD)
36#if defined(_MSC_VER) && !defined(__clang__)
37#define HWY_COMPILER_MSVC _MSC_VER
39#define HWY_COMPILER_MSVC 0
42#if defined(_MSC_VER) && defined(__clang__)
43#define HWY_COMPILER_CLANGCL _MSC_VER
45#define HWY_COMPILER_CLANGCL 0
48#ifdef __INTEL_COMPILER
49#define HWY_COMPILER_ICC __INTEL_COMPILER
51#define HWY_COMPILER_ICC 0
54#ifdef __INTEL_LLVM_COMPILER
55#define HWY_COMPILER_ICX __INTEL_LLVM_COMPILER
57#define HWY_COMPILER_ICX 0
63#define HWY_COMPILER_GCC (__GNUC__ * 100 + __GNUC_MINOR__)
65#define HWY_COMPILER_GCC 0
73#if defined(__apple_build_version__) || __clang_major__ >= 999
74#if __has_warning("-Wbitwise-instead-of-logical")
75#define HWY_COMPILER_CLANG 1400
76#elif __has_warning("-Wreserved-identifier")
77#define HWY_COMPILER_CLANG 1300
78#elif __has_warning("-Wformat-insufficient-args")
79#define HWY_COMPILER_CLANG 1200
80#elif __has_warning("-Wimplicit-const-int-float-conversion")
81#define HWY_COMPILER_CLANG 1100
82#elif __has_warning("-Wmisleading-indentation")
83#define HWY_COMPILER_CLANG 1000
84#elif defined(__FILE_NAME__)
85#define HWY_COMPILER_CLANG 900
86#elif __has_warning("-Wextra-semi-stmt") || \
87 __has_builtin(__builtin_rotateleft32)
88#define HWY_COMPILER_CLANG 800
93#elif __has_warning("-Wc++98-compat-extra-semi") || \
94 (defined(__apple_build_version__) && __apple_build_version__ >= 10010000)
95#define HWY_COMPILER_CLANG 700
97#define HWY_COMPILER_CLANG 600
100#define HWY_COMPILER_CLANG (__clang_major__ * 100 + __clang_minor__)
103#define HWY_COMPILER_CLANG 0
106#if HWY_COMPILER_GCC && !HWY_COMPILER_CLANG
107#define HWY_COMPILER_GCC_ACTUAL HWY_COMPILER_GCC
109#define HWY_COMPILER_GCC_ACTUAL 0
113#if 0 == (HWY_COMPILER_MSVC + HWY_COMPILER_CLANGCL + HWY_COMPILER_ICC + \
114 HWY_COMPILER_GCC + HWY_COMPILER_CLANG)
115#error "Unsupported compiler"
120 (!!HWY_COMPILER_MSVC + !!HWY_COMPILER_ICC + !!HWY_COMPILER_GCC_ACTUAL + \
121 !!(HWY_COMPILER_CLANGCL | HWY_COMPILER_CLANG))
122#error "Detected multiple compilers"
126#define HWY_HAS_BUILTIN(name) __has_builtin(name)
128#define HWY_HAS_BUILTIN(name) 0
131#ifdef __has_attribute
132#define HWY_HAS_ATTRIBUTE(name) __has_attribute(name)
134#define HWY_HAS_ATTRIBUTE(name) 0
138#define HWY_HAS_FEATURE(name) __has_feature(name)
140#define HWY_HAS_FEATURE(name) 0
146#if defined(__i386__) || defined(_M_IX86)
147#define HWY_ARCH_X86_32 1
149#define HWY_ARCH_X86_32 0
152#if defined(__x86_64__) || defined(_M_X64)
153#define HWY_ARCH_X86_64 1
155#define HWY_ARCH_X86_64 0
158#if HWY_ARCH_X86_32 && HWY_ARCH_X86_64
159#error "Cannot have both x86-32 and x86-64"
162#if HWY_ARCH_X86_32 || HWY_ARCH_X86_64
163#define HWY_ARCH_X86 1
165#define HWY_ARCH_X86 0
168#if defined(__powerpc64__) || defined(_M_PPC)
169#define HWY_ARCH_PPC 1
171#define HWY_ARCH_PPC 0
174#if defined(__ARM_ARCH_ISA_A64) || defined(__aarch64__) || defined(_M_ARM64)
175#define HWY_ARCH_ARM_A64 1
177#define HWY_ARCH_ARM_A64 0
180#if (defined(__ARM_ARCH) && __ARM_ARCH == 7) || (defined(_M_ARM) && _M_ARM == 7)
181#define HWY_ARCH_ARM_V7 1
183#define HWY_ARCH_ARM_V7 0
186#if HWY_ARCH_ARM_A64 && HWY_ARCH_ARM_V7
187#error "Cannot have both A64 and V7"
191#if HWY_ARCH_ARM_A64 || HWY_ARCH_ARM_V7
192#define HWY_ARCH_ARM 1
194#define HWY_ARCH_ARM 0
198#if (defined(__arm__) || defined(_M_ARM)) && !HWY_ARCH_ARM
199#define HWY_ARCH_ARM_OLD 1
201#define HWY_ARCH_ARM_OLD 0
204#if defined(__EMSCRIPTEN__) || defined(__wasm__) || defined(__WASM__)
205#define HWY_ARCH_WASM 1
207#define HWY_ARCH_WASM 0
211#define HWY_ARCH_RVV 1
213#define HWY_ARCH_RVV 0
218#if (HWY_ARCH_X86 + HWY_ARCH_PPC + HWY_ARCH_ARM + HWY_ARCH_ARM_OLD + \
219 HWY_ARCH_WASM + HWY_ARCH_RVV) > 1
220#error "Must not detect more than one architecture"
223#if defined(_WIN32) || defined(_WIN64)
229#if defined(linux) || defined(__linux__)
230#define HWY_OS_LINUX 1
232#define HWY_OS_LINUX 0