simdjson  3.7.0
Ridiculously Fast JSON
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 
14 #define SIMDJSON_IMPLEMENTATION_ID_FOR(IMPL) SIMDJSON_CAT(SIMDJSON_IMPLEMENTATION_ID_, IMPL)
15 #define SIMDJSON_IMPLEMENTATION_ID SIMDJSON_IMPLEMENTATION_ID_FOR(SIMDJSON_IMPLEMENTATION)
16 
17 #define SIMDJSON_IMPLEMENTATION_IS(IMPL) SIMDJSON_IMPLEMENTATION_ID == SIMDJSON_IMPLEMENTATION_ID_FOR(IMPL)
18 
19 //
20 // First, figure out which implementations can be run. Doing it here makes it so we don't have to worry about the order
21 // in which we include them.
22 //
23 
24 #ifndef SIMDJSON_IMPLEMENTATION_ARM64
25 #define SIMDJSON_IMPLEMENTATION_ARM64 (SIMDJSON_IS_ARM64)
26 #endif
27 #define SIMDJSON_CAN_ALWAYS_RUN_ARM64 SIMDJSON_IMPLEMENTATION_ARM64 && SIMDJSON_IS_ARM64
28 
29 // Default Icelake to on if this is x86-64. Even if we're not compiled for it, it could be selected
30 // at runtime.
31 #ifndef SIMDJSON_IMPLEMENTATION_ICELAKE
32 #define SIMDJSON_IMPLEMENTATION_ICELAKE ((SIMDJSON_IS_X86_64) && (SIMDJSON_AVX512_ALLOWED) && (SIMDJSON_COMPILER_SUPPORTS_VBMI2))
33 #endif
34 
35 #ifdef _MSC_VER
36 // To see why (__BMI__) && (__PCLMUL__) && (__LZCNT__) are not part of this next line, see
37 // https://github.com/simdjson/simdjson/issues/1247
38 #define SIMDJSON_CAN_ALWAYS_RUN_ICELAKE ((SIMDJSON_IMPLEMENTATION_ICELAKE) && (__AVX2__) && (__AVX512F__) && (__AVX512DQ__) && (__AVX512CD__) && (__AVX512BW__) && (__AVX512VL__) && (__AVX512VBMI2__))
39 #else
40 #define SIMDJSON_CAN_ALWAYS_RUN_ICELAKE ((SIMDJSON_IMPLEMENTATION_ICELAKE) && (__AVX2__) && (__BMI__) && (__PCLMUL__) && (__LZCNT__) && (__AVX512F__) && (__AVX512DQ__) && (__AVX512CD__) && (__AVX512BW__) && (__AVX512VL__) && (__AVX512VBMI2__))
41 #endif
42 
43 // Default Haswell to on if this is x86-64. Even if we're not compiled for it, it could be selected
44 // at runtime.
45 #ifndef SIMDJSON_IMPLEMENTATION_HASWELL
46 #if SIMDJSON_CAN_ALWAYS_RUN_ICELAKE
47 // if icelake is always available, never enable haswell.
48 #define SIMDJSON_IMPLEMENTATION_HASWELL 0
49 #else
50 #define SIMDJSON_IMPLEMENTATION_HASWELL SIMDJSON_IS_X86_64
51 #endif
52 #endif
53 #ifdef _MSC_VER
54 // To see why (__BMI__) && (__PCLMUL__) && (__LZCNT__) are not part of this next line, see
55 // https://github.com/simdjson/simdjson/issues/1247
56 #define SIMDJSON_CAN_ALWAYS_RUN_HASWELL ((SIMDJSON_IMPLEMENTATION_HASWELL) && (SIMDJSON_IS_X86_64) && (__AVX2__))
57 #else
58 #define SIMDJSON_CAN_ALWAYS_RUN_HASWELL ((SIMDJSON_IMPLEMENTATION_HASWELL) && (SIMDJSON_IS_X86_64) && (__AVX2__) && (__BMI__) && (__PCLMUL__) && (__LZCNT__))
59 #endif
60 
61 // Default Westmere to on if this is x86-64.
62 #ifndef SIMDJSON_IMPLEMENTATION_WESTMERE
63 #if SIMDJSON_CAN_ALWAYS_RUN_ICELAKE || SIMDJSON_CAN_ALWAYS_RUN_HASWELL
64 // if icelake or haswell are always available, never enable westmere.
65 #define SIMDJSON_IMPLEMENTATION_WESTMERE 0
66 #else
67 #define SIMDJSON_IMPLEMENTATION_WESTMERE SIMDJSON_IS_X86_64
68 #endif
69 #endif
70 #define SIMDJSON_CAN_ALWAYS_RUN_WESTMERE (SIMDJSON_IMPLEMENTATION_WESTMERE && SIMDJSON_IS_X86_64 && __SSE4_2__ && __PCLMUL__)
71 
72 #ifndef SIMDJSON_IMPLEMENTATION_PPC64
73 #define SIMDJSON_IMPLEMENTATION_PPC64 (SIMDJSON_IS_PPC64 && SIMDJSON_IS_PPC64_VMX)
74 #endif
75 #define SIMDJSON_CAN_ALWAYS_RUN_PPC64 SIMDJSON_IMPLEMENTATION_PPC64 && SIMDJSON_IS_PPC64 && SIMDJSON_IS_PPC64_VMX
76 
77 // Default Fallback to on unless a builtin implementation has already been selected.
78 #ifndef SIMDJSON_IMPLEMENTATION_FALLBACK
79 #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
80 // if anything at all except fallback can always run, then disable fallback.
81 #define SIMDJSON_IMPLEMENTATION_FALLBACK 0
82 #else
83 #define SIMDJSON_IMPLEMENTATION_FALLBACK 1
84 #endif
85 #endif
86 #define SIMDJSON_CAN_ALWAYS_RUN_FALLBACK SIMDJSON_IMPLEMENTATION_FALLBACK
87 
88 // Determine the best builtin implementation
89 #ifndef SIMDJSON_BUILTIN_IMPLEMENTATION
90 
91 #if SIMDJSON_CAN_ALWAYS_RUN_ICELAKE
92 #define SIMDJSON_BUILTIN_IMPLEMENTATION icelake
93 #elif SIMDJSON_CAN_ALWAYS_RUN_HASWELL
94 #define SIMDJSON_BUILTIN_IMPLEMENTATION haswell
95 #elif SIMDJSON_CAN_ALWAYS_RUN_WESTMERE
96 #define SIMDJSON_BUILTIN_IMPLEMENTATION westmere
97 #elif SIMDJSON_CAN_ALWAYS_RUN_ARM64
98 #define SIMDJSON_BUILTIN_IMPLEMENTATION arm64
99 #elif SIMDJSON_CAN_ALWAYS_RUN_PPC64
100 #define SIMDJSON_BUILTIN_IMPLEMENTATION ppc64
101 #elif SIMDJSON_CAN_ALWAYS_RUN_FALLBACK
102 #define SIMDJSON_BUILTIN_IMPLEMENTATION fallback
103 #else
104 #error "All possible implementations (including fallback) have been disabled! simdjson will not run."
105 #endif
106 
107 #endif // SIMDJSON_BUILTIN_IMPLEMENTATION
108 
109 #define SIMDJSON_BUILTIN_IMPLEMENTATION_ID SIMDJSON_IMPLEMENTATION_ID_FOR(SIMDJSON_BUILTIN_IMPLEMENTATION)
110 #define SIMDJSON_BUILTIN_IMPLEMENTATION_IS(IMPL) SIMDJSON_BUILTIN_IMPLEMENTATION_ID == SIMDJSON_IMPLEMENTATION_ID_FOR(IMPL)
111 
112 #endif // SIMDJSON_IMPLEMENTATION_DETECTION_H