summaryrefslogtreecommitdiffstats
path: root/src/corelib/tools/qsimd_x86_p.h
blob: 45d5f2895f38fe259af3ea86252899b9433ce242 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
// This is a generated file. DO NOT EDIT.
// Please see util/x86simdgen/generate.pl
#ifndef QSIMD_P_H
#  error "Please include <private/qsimd_p.h> instead"
#endif
#ifndef QSIMD_X86_P_H
#define QSIMD_X86_P_H

#include "qsimd_p.h"

//
//  W A R N I N G
//  -------------
//
// This file is not part of the Qt API.  It exists purely as an
// implementation detail.  This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//

QT_BEGIN_NAMESPACE

// Macros for QT_FUNCTION_TARGET (for Clang and GCC)
#define QT_FUNCTION_TARGET_STRING_SSE2              "sse2"
#define QT_FUNCTION_TARGET_STRING_SSE3              "sse3"
#define QT_FUNCTION_TARGET_STRING_SSSE3             "ssse3"
#define QT_FUNCTION_TARGET_STRING_FMA               "fma"
#define QT_FUNCTION_TARGET_STRING_SSE4_1            "sse4.1"
#define QT_FUNCTION_TARGET_STRING_SSE4_2            "sse4.2"
#define QT_FUNCTION_TARGET_STRING_MOVBE             "movbe"
#define QT_FUNCTION_TARGET_STRING_POPCNT            "popcnt"
#define QT_FUNCTION_TARGET_STRING_AES               "aes,sse4.2"
#define QT_FUNCTION_TARGET_STRING_AVX               "avx"
#define QT_FUNCTION_TARGET_STRING_F16C              "f16c"
#define QT_FUNCTION_TARGET_STRING_RDRND             "rdrnd"
#define QT_FUNCTION_TARGET_STRING_BMI               "bmi"
#define QT_FUNCTION_TARGET_STRING_HLE               "hle"
#define QT_FUNCTION_TARGET_STRING_AVX2              "avx2"
#define QT_FUNCTION_TARGET_STRING_BMI2              "bmi2"
#define QT_FUNCTION_TARGET_STRING_RTM               "rtm"
#define QT_FUNCTION_TARGET_STRING_AVX512F           "avx512f"
#define QT_FUNCTION_TARGET_STRING_AVX512DQ          "avx512dq"
#define QT_FUNCTION_TARGET_STRING_RDSEED            "rdseed"
#define QT_FUNCTION_TARGET_STRING_AVX512IFMA        "avx512ifma"
#define QT_FUNCTION_TARGET_STRING_AVX512PF          "avx512pf"
#define QT_FUNCTION_TARGET_STRING_AVX512ER          "avx512er"
#define QT_FUNCTION_TARGET_STRING_AVX512CD          "avx512cd"
#define QT_FUNCTION_TARGET_STRING_SHA               "sha"
#define QT_FUNCTION_TARGET_STRING_AVX512BW          "avx512bw"
#define QT_FUNCTION_TARGET_STRING_AVX512VL          "avx512vl"
#define QT_FUNCTION_TARGET_STRING_AVX512VBMI        "avx512vbmi"
#define QT_FUNCTION_TARGET_STRING_AVX512VBMI2       "avx512vbmi2"
#define QT_FUNCTION_TARGET_STRING_GFNI              "gfni"
#define QT_FUNCTION_TARGET_STRING_VAES              "vaes"
#define QT_FUNCTION_TARGET_STRING_AVX512VNNI        "avx512vnni"
#define QT_FUNCTION_TARGET_STRING_AVX512BITALG      "avx512bitalg"
#define QT_FUNCTION_TARGET_STRING_AVX512VPOPCNTDQ   "avx512vpopcntdq"
#define QT_FUNCTION_TARGET_STRING_AVX5124NNIW       "avx5124nniw"
#define QT_FUNCTION_TARGET_STRING_AVX5124FMAPS      "avx5124fmaps"

enum CPUFeatures {
    // in CPUID Leaf 1, EDX:
    CpuFeatureSSE2          = 1,

    // in CPUID Leaf 1, ECX:
    CpuFeatureSSE3          = 2,
    CpuFeatureSSSE3         = 3,
    CpuFeatureFMA           = 4,
    CpuFeatureSSE4_1        = 5,
    CpuFeatureSSE4_2        = 6,
    CpuFeatureMOVBE         = 7,
    CpuFeaturePOPCNT        = 8,
    CpuFeatureAES           = 9,
    CpuFeatureAVX           = 10,
    CpuFeatureF16C          = 11,
    CpuFeatureRDRND         = 12,

    // in CPUID Leaf 7, Sub-leaf 0, EBX:
    CpuFeatureBMI           = 13,
    CpuFeatureHLE           = 14,
    CpuFeatureAVX2          = 15,
    CpuFeatureBMI2          = 16,
    CpuFeatureRTM           = 17,
    CpuFeatureAVX512F       = 18,
    CpuFeatureAVX512DQ      = 19,
    CpuFeatureRDSEED        = 20,
    CpuFeatureAVX512IFMA    = 21,
    CpuFeatureAVX512PF      = 22,
    CpuFeatureAVX512ER      = 23,
    CpuFeatureAVX512CD      = 24,
    CpuFeatureSHA           = 25,
    CpuFeatureAVX512BW      = 26,
    CpuFeatureAVX512VL      = 27,

    // in CPUID Leaf 7, Sub-leaf 0, ECX:
    CpuFeatureAVX512VBMI    = 28,
    CpuFeatureAVX512VBMI2   = 29,
    CpuFeatureGFNI          = 30,
    CpuFeatureVAES          = 31,
    CpuFeatureAVX512VNNI    = 32,
    CpuFeatureAVX512BITALG  = 33,
    CpuFeatureAVX512VPOPCNTDQ = 34,

    // in CPUID Leaf 7, Sub-leaf 0, EDX:
    CpuFeatureAVX5124NNIW   = 35,
    CpuFeatureAVX5124FMAPS  = 36,

    // used only to indicate that the CPU detection was initialized
    QSimdInitialized = 1
};

static const quint64 qCompilerCpuFeatures = 0
#ifdef __SSE2__
         | (Q_UINT64_C(1) << CpuFeatureSSE2)
#endif
#ifdef __SSE3__
         | (Q_UINT64_C(1) << CpuFeatureSSE3)
#endif
#ifdef __SSSE3__
         | (Q_UINT64_C(1) << CpuFeatureSSSE3)
#endif
#ifdef __FMA__
         | (Q_UINT64_C(1) << CpuFeatureFMA)
#endif
#ifdef __SSE4_1__
         | (Q_UINT64_C(1) << CpuFeatureSSE4_1)
#endif
#ifdef __SSE4_2__
         | (Q_UINT64_C(1) << CpuFeatureSSE4_2)
#endif
#ifdef __MOVBE__
         | (Q_UINT64_C(1) << CpuFeatureMOVBE)
#endif
#ifdef __POPCNT__
         | (Q_UINT64_C(1) << CpuFeaturePOPCNT)
#endif
#ifdef __AES__
         | (Q_UINT64_C(1) << CpuFeatureAES)
#endif
#ifdef __AVX__
         | (Q_UINT64_C(1) << CpuFeatureAVX)
#endif
#ifdef __F16C__
         | (Q_UINT64_C(1) << CpuFeatureF16C)
#endif
#ifdef __RDRND__
         | (Q_UINT64_C(1) << CpuFeatureRDRND)
#endif
#ifdef __BMI__
         | (Q_UINT64_C(1) << CpuFeatureBMI)
#endif
#ifdef __HLE__
         | (Q_UINT64_C(1) << CpuFeatureHLE)
#endif
#ifdef __AVX2__
         | (Q_UINT64_C(1) << CpuFeatureAVX2)
#endif
#ifdef __BMI2__
         | (Q_UINT64_C(1) << CpuFeatureBMI2)
#endif
#ifdef __RTM__
         | (Q_UINT64_C(1) << CpuFeatureRTM)
#endif
#ifdef __AVX512F__
         | (Q_UINT64_C(1) << CpuFeatureAVX512F)
#endif
#ifdef __AVX512DQ__
         | (Q_UINT64_C(1) << CpuFeatureAVX512DQ)
#endif
#ifdef __RDSEED__
         | (Q_UINT64_C(1) << CpuFeatureRDSEED)
#endif
#ifdef __AVX512IFMA__
         | (Q_UINT64_C(1) << CpuFeatureAVX512IFMA)
#endif
#ifdef __AVX512PF__
         | (Q_UINT64_C(1) << CpuFeatureAVX512PF)
#endif
#ifdef __AVX512ER__
         | (Q_UINT64_C(1) << CpuFeatureAVX512ER)
#endif
#ifdef __AVX512CD__
         | (Q_UINT64_C(1) << CpuFeatureAVX512CD)
#endif
#ifdef __SHA__
         | (Q_UINT64_C(1) << CpuFeatureSHA)
#endif
#ifdef __AVX512BW__
         | (Q_UINT64_C(1) << CpuFeatureAVX512BW)
#endif
#ifdef __AVX512VL__
         | (Q_UINT64_C(1) << CpuFeatureAVX512VL)
#endif
#ifdef __AVX512VBMI__
         | (Q_UINT64_C(1) << CpuFeatureAVX512VBMI)
#endif
#ifdef __AVX512VBMI2__
         | (Q_UINT64_C(1) << CpuFeatureAVX512VBMI2)
#endif
#ifdef __GFNI__
         | (Q_UINT64_C(1) << CpuFeatureGFNI)
#endif
#ifdef __VAES__
         | (Q_UINT64_C(1) << CpuFeatureVAES)
#endif
#ifdef __AVX512VNNI__
         | (Q_UINT64_C(1) << CpuFeatureAVX512VNNI)
#endif
#ifdef __AVX512BITALG__
         | (Q_UINT64_C(1) << CpuFeatureAVX512BITALG)
#endif
#ifdef __AVX512VPOPCNTDQ__
         | (Q_UINT64_C(1) << CpuFeatureAVX512VPOPCNTDQ)
#endif
#ifdef __AVX5124NNIW__
         | (Q_UINT64_C(1) << CpuFeatureAVX5124NNIW)
#endif
#ifdef __AVX5124FMAPS__
         | (Q_UINT64_C(1) << CpuFeatureAVX5124FMAPS)
#endif
        ;

QT_END_NAMESPACE

#endif // QSIMD_X86_P_H