simdjson 4.4.0
Ridiculously Fast JSON
Loading...
Searching...
No Matches
implementation_detection.h
1#ifndef SIMDJSON_IMPLEMENTATION_DETECTION_H
2#define SIMDJSON_IMPLEMENTATION_DETECTION_H
3
4#include "simdjson/base.h"
5
6// 0 is reserved, because undefined SIMDJSON_IMPLEMENTATION equals 0 in preprocessor macros.
7#define SIMDJSON_IMPLEMENTATION_ID_arm64 1
8#define SIMDJSON_IMPLEMENTATION_ID_fallback 2
9#define SIMDJSON_IMPLEMENTATION_ID_haswell 3
10#define SIMDJSON_IMPLEMENTATION_ID_icelake 4
11#define SIMDJSON_IMPLEMENTATION_ID_ppc64 5
12#define SIMDJSON_IMPLEMENTATION_ID_westmere 6
13#define SIMDJSON_IMPLEMENTATION_ID_lsx 7
14#define SIMDJSON_IMPLEMENTATION_ID_lasx 8
15//#define SIMDJSON_IMPLEMENTATION_ID_rvv 9
16#define SIMDJSON_IMPLEMENTATION_ID_rvv_vls 10
17
18#define SIMDJSON_IMPLEMENTATION_ID_FOR(IMPL) SIMDJSON_CAT(SIMDJSON_IMPLEMENTATION_ID_, IMPL)
19#define SIMDJSON_IMPLEMENTATION_ID SIMDJSON_IMPLEMENTATION_ID_FOR(SIMDJSON_IMPLEMENTATION)
20
21#define SIMDJSON_IMPLEMENTATION_IS(IMPL) SIMDJSON_IMPLEMENTATION_ID == SIMDJSON_IMPLEMENTATION_ID_FOR(IMPL)
22
23//
24// First, figure out which implementations can be run. Doing it here makes it so we don't have to worry about the order
25// in which we include them.
26//
27
28#ifndef SIMDJSON_IMPLEMENTATION_ARM64
29#define SIMDJSON_IMPLEMENTATION_ARM64 (SIMDJSON_IS_ARM64)
30#endif
31#if SIMDJSON_IMPLEMENTATION_ARM64 && SIMDJSON_IS_ARM64
32#define SIMDJSON_CAN_ALWAYS_RUN_ARM64 1
33#else
34#define SIMDJSON_CAN_ALWAYS_RUN_ARM64 0
35#endif
36
37// Default Icelake to on if this is x86-64. Even if we're not compiled for it, it could be selected
38// at runtime.
39#ifndef SIMDJSON_IMPLEMENTATION_ICELAKE
40#define SIMDJSON_IMPLEMENTATION_ICELAKE ((SIMDJSON_IS_X86_64) && (SIMDJSON_AVX512_ALLOWED) && (SIMDJSON_COMPILER_SUPPORTS_VBMI2))
41#endif
42
43#ifdef _MSC_VER
44// To see why (__BMI__) && (__PCLMUL__) && (__LZCNT__) are not part of this next line, see
45// https://github.com/simdjson/simdjson/issues/1247
46#if ((SIMDJSON_IMPLEMENTATION_ICELAKE) && (__AVX2__) && (__AVX512F__) && (__AVX512DQ__) && (__AVX512CD__) && (__AVX512BW__) && (__AVX512VL__) && (__AVX512VBMI2__))
47#define SIMDJSON_CAN_ALWAYS_RUN_ICELAKE 1
48#else
49#define SIMDJSON_CAN_ALWAYS_RUN_ICELAKE 0
50#endif
51
52#else
53
54#if ((SIMDJSON_IMPLEMENTATION_ICELAKE) && (__AVX2__) && (__BMI__) && (__PCLMUL__) && (__LZCNT__) && (__AVX512F__) && (__AVX512DQ__) && (__AVX512CD__) && (__AVX512BW__) && (__AVX512VL__) && (__AVX512VBMI2__))
55#define SIMDJSON_CAN_ALWAYS_RUN_ICELAKE 1
56#else
57#define SIMDJSON_CAN_ALWAYS_RUN_ICELAKE 0
58#endif
59
60#endif
61
62// Default Haswell to on if this is x86-64. Even if we're not compiled for it, it could be selected
63// at runtime.
64#ifndef SIMDJSON_IMPLEMENTATION_HASWELL
65#if SIMDJSON_CAN_ALWAYS_RUN_ICELAKE
66// if icelake is always available, never enable haswell.
67#define SIMDJSON_IMPLEMENTATION_HASWELL 0
68#else
69#define SIMDJSON_IMPLEMENTATION_HASWELL SIMDJSON_IS_X86_64
70#endif
71#endif
72#ifdef _MSC_VER
73// To see why (__BMI__) && (__PCLMUL__) && (__LZCNT__) are not part of this next line, see
74// https://github.com/simdjson/simdjson/issues/1247
75#if ((SIMDJSON_IMPLEMENTATION_HASWELL) && (SIMDJSON_IS_X86_64) && (__AVX2__))
76#define SIMDJSON_CAN_ALWAYS_RUN_HASWELL 1
77#else
78#define SIMDJSON_CAN_ALWAYS_RUN_HASWELL 0
79#endif
80
81#else
82
83#if ((SIMDJSON_IMPLEMENTATION_HASWELL) && (SIMDJSON_IS_X86_64) && (__AVX2__) && (__BMI__) && (__PCLMUL__) && (__LZCNT__))
84#define SIMDJSON_CAN_ALWAYS_RUN_HASWELL 1
85#else
86#define SIMDJSON_CAN_ALWAYS_RUN_HASWELL 0
87#endif
88
89#endif
90
91// Default Westmere to on if this is x86-64.
92#ifndef SIMDJSON_IMPLEMENTATION_WESTMERE
93#if SIMDJSON_CAN_ALWAYS_RUN_ICELAKE || SIMDJSON_CAN_ALWAYS_RUN_HASWELL
94// if icelake or haswell are always available, never enable westmere.
95#define SIMDJSON_IMPLEMENTATION_WESTMERE 0
96#else
97#define SIMDJSON_IMPLEMENTATION_WESTMERE SIMDJSON_IS_X86_64
98#endif
99#endif
100
101#if (SIMDJSON_IMPLEMENTATION_WESTMERE && SIMDJSON_IS_X86_64 && __SSE4_2__ && __PCLMUL__)
102#define SIMDJSON_CAN_ALWAYS_RUN_WESTMERE 1
103#else
104#define SIMDJSON_CAN_ALWAYS_RUN_WESTMERE 0
105#endif
106
107
108#ifndef SIMDJSON_IMPLEMENTATION_PPC64
109#define SIMDJSON_IMPLEMENTATION_PPC64 (SIMDJSON_IS_PPC64 && SIMDJSON_IS_PPC64_VMX)
110#endif
111#if SIMDJSON_IMPLEMENTATION_PPC64 && SIMDJSON_IS_PPC64 && SIMDJSON_IS_PPC64_VMX
112#define SIMDJSON_CAN_ALWAYS_RUN_PPC64 1
113#else
114#define SIMDJSON_CAN_ALWAYS_RUN_PPC64 0
115#endif
116
117#ifndef SIMDJSON_IMPLEMENTATION_LASX
118#define SIMDJSON_IMPLEMENTATION_LASX (SIMDJSON_IS_LSX)
119#endif
120#define SIMDJSON_CAN_ALWAYS_RUN_LASX (SIMDJSON_IS_LASX)
121
122#ifndef SIMDJSON_IMPLEMENTATION_LSX
123#if SIMDJSON_CAN_ALWAYS_RUN_LASX
124#define SIMDJSON_IMPLEMENTATION_LSX 0
125#else
126#define SIMDJSON_IMPLEMENTATION_LSX (SIMDJSON_IS_LSX)
127#endif
128#endif
129#define SIMDJSON_CAN_ALWAYS_RUN_LSX (SIMDJSON_IMPLEMENTATION_LSX)
130
131#define SIMDJSON_CAN_ALWAYS_RUN_RVV_VLS SIMDJSON_IS_RVV_VLS
132#ifndef SIMDJSON_IMPLEMENTATION_RVV_VLS
133#define SIMDJSON_IMPLEMENTATION_RVV_VLS SIMDJSON_CAN_ALWAYS_RUN_RVV_VLS
134#endif
135
136// Default Fallback to on unless a builtin implementation has already been selected.
137#ifndef SIMDJSON_IMPLEMENTATION_FALLBACK
138#if SIMDJSON_CAN_ALWAYS_RUN_ARM64 || SIMDJSON_CAN_ALWAYS_RUN_ICELAKE || SIMDJSON_CAN_ALWAYS_RUN_HASWELL || SIMDJSON_CAN_ALWAYS_RUN_WESTMERE || SIMDJSON_CAN_ALWAYS_RUN_PPC64 || SIMDJSON_CAN_ALWAYS_RUN_LSX || SIMDJSON_CAN_ALWAYS_RUN_LASX || SIMDJSON_CAN_ALWAYS_RUN_RVV_VLS
139// if anything at all except fallback can always run, then disable fallback.
140#define SIMDJSON_IMPLEMENTATION_FALLBACK 0
141#else
142#define SIMDJSON_IMPLEMENTATION_FALLBACK 1
143#endif
144#endif
145#define SIMDJSON_CAN_ALWAYS_RUN_FALLBACK SIMDJSON_IMPLEMENTATION_FALLBACK
146
147// Determine the best builtin implementation
148#ifndef SIMDJSON_BUILTIN_IMPLEMENTATION
149
150#if SIMDJSON_CAN_ALWAYS_RUN_ICELAKE
151#define SIMDJSON_BUILTIN_IMPLEMENTATION icelake
152#elif SIMDJSON_CAN_ALWAYS_RUN_HASWELL
153#define SIMDJSON_BUILTIN_IMPLEMENTATION haswell
154#elif SIMDJSON_CAN_ALWAYS_RUN_WESTMERE
155#define SIMDJSON_BUILTIN_IMPLEMENTATION westmere
156#elif SIMDJSON_CAN_ALWAYS_RUN_ARM64
157#define SIMDJSON_BUILTIN_IMPLEMENTATION arm64
158#elif SIMDJSON_CAN_ALWAYS_RUN_PPC64
159#define SIMDJSON_BUILTIN_IMPLEMENTATION ppc64
160#elif SIMDJSON_CAN_ALWAYS_RUN_LSX
161#define SIMDJSON_BUILTIN_IMPLEMENTATION lsx
162#elif SIMDJSON_CAN_ALWAYS_RUN_LASX
163#define SIMDJSON_BUILTIN_IMPLEMENTATION lasx
164#elif SIMDJSON_CAN_ALWAYS_RUN_RVV_VLS
165#define SIMDJSON_BUILTIN_IMPLEMENTATION rvv_vls
166#elif SIMDJSON_CAN_ALWAYS_RUN_FALLBACK
167#define SIMDJSON_BUILTIN_IMPLEMENTATION fallback
168#else
169#error "All possible implementations (including fallback) have been disabled! simdjson will not run."
170#endif
171
172#endif // SIMDJSON_BUILTIN_IMPLEMENTATION
173
174#define SIMDJSON_BUILTIN_IMPLEMENTATION_ID SIMDJSON_IMPLEMENTATION_ID_FOR(SIMDJSON_BUILTIN_IMPLEMENTATION)
175#define SIMDJSON_BUILTIN_IMPLEMENTATION_IS(IMPL) SIMDJSON_BUILTIN_IMPLEMENTATION_ID == SIMDJSON_IMPLEMENTATION_ID_FOR(IMPL)
176
177#endif // SIMDJSON_IMPLEMENTATION_DETECTION_H