Line data Source code
1 : /*-------------------------------------------------------------------------
2 : *
3 : * pg_cpu.h
4 : * Runtime CPU feature detection
5 : *
6 : * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
7 : * Portions Copyright (c) 1994, Regents of the University of California
8 : *
9 : * src/include/port/pg_cpu.h
10 : *
11 : *-------------------------------------------------------------------------
12 : */
13 : #ifndef PG_CPU_H
14 : #define PG_CPU_H
15 :
16 : #if defined(USE_SSE2) || defined(__i386__)
17 :
18 : typedef enum X86FeatureId
19 : {
20 : /* Have we run feature detection? */
21 : INIT_PG_X86,
22 :
23 : /* scalar registers and 128-bit XMM registers */
24 : PG_SSE4_2,
25 : PG_POPCNT,
26 :
27 : /* 512-bit ZMM registers */
28 : PG_AVX512_BW,
29 : PG_AVX512_VL,
30 : PG_AVX512_VPCLMULQDQ,
31 : PG_AVX512_VPOPCNTDQ,
32 : } X86FeatureId;
33 : #define X86FeaturesSize (PG_AVX512_VPOPCNTDQ + 1)
34 :
35 : extern PGDLLIMPORT bool X86Features[];
36 :
37 : extern void set_x86_features(void);
38 :
39 : static inline bool
40 8403 : x86_feature_available(X86FeatureId feature)
41 : {
42 8403 : if (X86Features[INIT_PG_X86] == false)
43 1500 : set_x86_features();
44 :
45 8403 : return X86Features[feature];
46 : }
47 :
48 : #endif /* defined(USE_SSE2) || defined(__i386__) */
49 :
50 : #endif /* PG_CPU_H */
|