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