simdjson  3.1.8
Ridiculously Fast JSON
implementations.h
1 #ifndef SIMDJSON_IMPLEMENTATIONS_H
2 #define SIMDJSON_IMPLEMENTATIONS_H
3 
5 
6 //
7 // First, figure out which implementations can be run. Doing it here makes it so we don't have to worry about the order
8 // in which we include them.
9 //
10 
11 #ifndef SIMDJSON_IMPLEMENTATION_ARM64
12 #define SIMDJSON_IMPLEMENTATION_ARM64 (SIMDJSON_IS_ARM64)
13 #endif
14 #define SIMDJSON_CAN_ALWAYS_RUN_ARM64 SIMDJSON_IMPLEMENTATION_ARM64 && SIMDJSON_IS_ARM64
15 
16 #ifdef __has_include
17 // How do we detect that a compiler supports vbmi2?
18 // For sure if the following header is found, we are ok?
19 #if __has_include(<avx512vbmi2intrin.h>)
20 #define SIMDJSON_COMPILER_SUPPORTS_VBMI2 1
21 #endif
22 #endif
23 
24 #ifdef _MSC_VER
25 #if _MSC_VER >= 1920
26 // Visual Studio 2019 and up support VBMI2 under x64 even if the header
27 // avx512vbmi2intrin.h is not found.
28 #define SIMDJSON_COMPILER_SUPPORTS_VBMI2 1
29 #endif
30 #endif
31 
32 // By default, we allow AVX512.
33 #ifndef SIMDJSON_AVX512_ALLOWED
34 #define SIMDJSON_AVX512_ALLOWED 1
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 #define SIMDJSON_CAN_ALWAYS_RUN_ICELAKE ((SIMDJSON_IMPLEMENTATION_ICELAKE) && (__AVX2__) && (__AVX512F__) && (__AVX512DQ__) && (__AVX512CD__) && (__AVX512BW__) && (__AVX512VL__) && (__AVX512VBMI2__))
47 #else
48 #define SIMDJSON_CAN_ALWAYS_RUN_ICELAKE ((SIMDJSON_IMPLEMENTATION_ICELAKE) && (__AVX2__) && (__BMI__) && (__PCLMUL__) && (__LZCNT__) && (__AVX512F__) && (__AVX512DQ__) && (__AVX512CD__) && (__AVX512BW__) && (__AVX512VL__) && (__AVX512VBMI2__))
49 #endif
50 
51 // Default Haswell to on if this is x86-64. Even if we're not compiled for it, it could be selected
52 // at runtime.
53 #ifndef SIMDJSON_IMPLEMENTATION_HASWELL
54 #if SIMDJSON_CAN_ALWAYS_RUN_ICELAKE
55 // if icelake is always available, never enable haswell.
56 #define SIMDJSON_IMPLEMENTATION_HASWELL 0
57 #else
58 #define SIMDJSON_IMPLEMENTATION_HASWELL SIMDJSON_IS_X86_64
59 #endif
60 #endif
61 #ifdef _MSC_VER
62 // To see why (__BMI__) && (__PCLMUL__) && (__LZCNT__) are not part of this next line, see
63 // https://github.com/simdjson/simdjson/issues/1247
64 #define SIMDJSON_CAN_ALWAYS_RUN_HASWELL ((SIMDJSON_IMPLEMENTATION_HASWELL) && (SIMDJSON_IS_X86_64) && (__AVX2__))
65 #else
66 #define SIMDJSON_CAN_ALWAYS_RUN_HASWELL ((SIMDJSON_IMPLEMENTATION_HASWELL) && (SIMDJSON_IS_X86_64) && (__AVX2__) && (__BMI__) && (__PCLMUL__) && (__LZCNT__))
67 #endif
68 
69 // Default Westmere to on if this is x86-64.
70 #ifndef SIMDJSON_IMPLEMENTATION_WESTMERE
71 #if SIMDJSON_CAN_ALWAYS_RUN_ICELAKE || SIMDJSON_CAN_ALWAYS_RUN_HASWELL
72 // if icelake or haswell are always available, never enable westmere.
73 #define SIMDJSON_IMPLEMENTATION_WESTMERE 0
74 #else
75 #define SIMDJSON_IMPLEMENTATION_WESTMERE SIMDJSON_IS_X86_64
76 #endif
77 #endif
78 #define SIMDJSON_CAN_ALWAYS_RUN_WESTMERE (SIMDJSON_IMPLEMENTATION_WESTMERE && SIMDJSON_IS_X86_64 && __SSE4_2__ && __PCLMUL__)
79 
80 #ifndef SIMDJSON_IMPLEMENTATION_PPC64
81 #define SIMDJSON_IMPLEMENTATION_PPC64 (SIMDJSON_IS_PPC64 && SIMDJSON_IS_PPC64_VMX)
82 #endif
83 #define SIMDJSON_CAN_ALWAYS_RUN_PPC64 SIMDJSON_IMPLEMENTATION_PPC64 && SIMDJSON_IS_PPC64 && SIMDJSON_IS_PPC64_VMX
84 
85 // Default Fallback to on unless a builtin implementation has already been selected.
86 #ifndef SIMDJSON_IMPLEMENTATION_FALLBACK
87 #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
88 // if anything at all except fallback can always run, then disable fallback.
89 #define SIMDJSON_IMPLEMENTATION_FALLBACK 0
90 #else
91 #define SIMDJSON_IMPLEMENTATION_FALLBACK 1
92 #endif
93 #endif
94 #define SIMDJSON_CAN_ALWAYS_RUN_FALLBACK SIMDJSON_IMPLEMENTATION_FALLBACK
95 
96 SIMDJSON_PUSH_DISABLE_WARNINGS
97 SIMDJSON_DISABLE_UNDESIRED_WARNINGS
98 
99 // Implementations
100 #include "simdjson/arm64.h"
101 #include "simdjson/fallback.h"
102 #include "simdjson/icelake.h"
103 #include "simdjson/haswell.h"
104 #include "simdjson/ppc64.h"
105 #include "simdjson/westmere.h"
106 
107 // Builtin implementation
108 #include "simdjson/builtin.h"
109 
110 SIMDJSON_POP_DISABLE_WARNINGS
111 
112 #endif // SIMDJSON_IMPLEMENTATIONS_H
Includes common stuff needed for implementations.