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
include
simdjson
implementation_detection.h
Generated by
1.9.8