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 : /* 256-bit YMM registers */
28 : PG_AVX2,
29 :
30 : /* 512-bit ZMM registers */
31 : PG_AVX512_BW,
32 : PG_AVX512_VL,
33 : PG_AVX512_VPCLMULQDQ,
34 : PG_AVX512_VPOPCNTDQ,
35 :
36 : /* identification */
37 : PG_HYPERVISOR,
38 :
39 : /* Time-Stamp Counter (TSC) flags */
40 : PG_RDTSCP,
41 : PG_TSC_INVARIANT,
42 : PG_TSC_ADJUST,
43 : } X86FeatureId;
44 : #define X86FeaturesSize (PG_TSC_ADJUST + 1)
45 :
46 : extern PGDLLIMPORT bool X86Features[];
47 :
48 : extern void set_x86_features(void);
49 :
50 : static inline bool
51 25303 : x86_feature_available(X86FeatureId feature)
52 : {
53 25303 : if (X86Features[INIT_PG_X86] == false)
54 1805 : set_x86_features();
55 :
56 25303 : return X86Features[feature];
57 : }
58 :
59 : extern uint32 x86_tsc_frequency_khz(void);
60 :
61 : #endif /* defined(USE_SSE2) || defined(__i386__) */
62 :
63 : #endif /* PG_CPU_H */
|