php-internal-docs 8.4.8
Unofficial docs for php/php-src
Loading...
Searching...
No Matches
zend_cpuinfo.h
Go to the documentation of this file.
1/*
2 +----------------------------------------------------------------------+
3 | Zend Engine |
4 +----------------------------------------------------------------------+
5 | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) |
6 +----------------------------------------------------------------------+
7 | This source file is subject to version 2.00 of the Zend license, |
8 | that is bundled with this package in the file LICENSE, and is |
9 | available through the world-wide-web at the following url: |
10 | http://www.zend.com/license/2_00.txt. |
11 | If you did not receive a copy of the Zend license and are unable to |
12 | obtain it through the world-wide-web, please send a note to |
13 | license@zend.com so we can mail you a copy immediately. |
14 +----------------------------------------------------------------------+
15 | Authors: Xinchen Hui <laruence@php.net> |
16 +----------------------------------------------------------------------+
17*/
18
19#ifndef ZEND_CPU_INFO_H
20#define ZEND_CPU_INFO_H
21
22#include "zend.h"
23
24#define ZEND_CPU_EBX_MASK (1<<30)
25#define ZEND_CPU_EDX_MASK (1U<<31)
26
27typedef enum _zend_cpu_feature {
28 /* ECX */
45 /* reserved = (1<<16),*/
59 /* intentionally don't support = (1<<30) */
60 /* intentionally don't support = (1<<31) */
61
62 /* EBX */
68 /* intentionally don't support = (1<<30 | ZEND_CPU_EBX_MASK) */
69 /* intentionally don't support = (1<<31 | ZEND_CPU_EBX_MASK) */
70
71 /* EDX */
82 /* reserved = (1<<10 | ZEND_CPU_EDX_MASK),*/
92 /* reserved = (1<<20 | ZEND_CPU_EDX_MASK),*/
102 /*intentionally don't support = (1<<30 | ZEND_CPU_EDX_MASK)*/
103 /*intentionally don't support = (1<<31 | ZEND_CPU_EDX_MASK)*/
105
106void zend_cpu_startup(void);
108
109#ifndef __has_attribute
110# define __has_attribute(x) 0
111#endif
112
113/* Address sanitizer is incompatible with ifunc resolvers, so exclude the
114 * CPU support helpers from asan.
115 * See also https://github.com/google/sanitizers/issues/342. */
116#if __has_attribute(no_sanitize_address)
117# define ZEND_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address))
118#else
119# define ZEND_NO_SANITIZE_ADDRESS
120#endif
121
122#ifdef PHP_HAVE_BUILTIN_CPU_SUPPORTS
123/* NOTE: you should use following inline function in
124 * resolver functions (ifunc), as it could be called
125 * before all PLT symbols are resolved. in other words,
126 * resolver functions should not depend on any external
127 * functions */
129static inline int zend_cpu_supports_sse2(void) {
130#ifdef PHP_HAVE_BUILTIN_CPU_INIT
131 __builtin_cpu_init();
132#endif
133 return __builtin_cpu_supports("sse2");
134}
135
137static inline int zend_cpu_supports_sse3(void) {
138#ifdef PHP_HAVE_BUILTIN_CPU_INIT
139 __builtin_cpu_init();
140#endif
141 return __builtin_cpu_supports("sse3");
142}
143
145static inline int zend_cpu_supports_ssse3(void) {
146#ifdef PHP_HAVE_BUILTIN_CPU_INIT
147 __builtin_cpu_init();
148#endif
149 return __builtin_cpu_supports("ssse3");
150}
151
153static inline int zend_cpu_supports_sse41(void) {
154#ifdef PHP_HAVE_BUILTIN_CPU_INIT
155 __builtin_cpu_init();
156#endif
157 return __builtin_cpu_supports("sse4.1");
158}
159
161static inline int zend_cpu_supports_sse42(void) {
162#ifdef PHP_HAVE_BUILTIN_CPU_INIT
163 __builtin_cpu_init();
164#endif
165 return __builtin_cpu_supports("sse4.2");
166}
167
169static inline int zend_cpu_supports_avx(void) {
170#ifdef PHP_HAVE_BUILTIN_CPU_INIT
171 __builtin_cpu_init();
172#endif
173 return __builtin_cpu_supports("avx");
174}
175
177static inline int zend_cpu_supports_avx2(void) {
178#ifdef PHP_HAVE_BUILTIN_CPU_INIT
179 __builtin_cpu_init();
180#endif
181 return __builtin_cpu_supports("avx2");
182}
183
184#ifdef PHP_HAVE_AVX512_SUPPORTS
186static inline int zend_cpu_supports_avx512(void) {
187#ifdef PHP_HAVE_BUILTIN_CPU_INIT
188 __builtin_cpu_init();
189#endif
190 return __builtin_cpu_supports("avx512f") && __builtin_cpu_supports("avx512dq")
191 && __builtin_cpu_supports("avx512cd") && __builtin_cpu_supports("avx512bw")
192 && __builtin_cpu_supports("avx512vl");
193}
194#endif
195
196#ifdef PHP_HAVE_AVX512_VBMI_SUPPORTS
198static inline int zend_cpu_supports_avx512_vbmi(void) {
199#ifdef PHP_HAVE_BUILTIN_CPU_INIT
200 __builtin_cpu_init();
201#endif
202 return zend_cpu_supports_avx512() && __builtin_cpu_supports("avx512vbmi");
203}
204#endif
205
206#else
207
208static inline int zend_cpu_supports_sse2(void) {
210}
211
212static inline int zend_cpu_supports_sse3(void) {
214}
215
216static inline int zend_cpu_supports_ssse3(void) {
218}
219
220static inline int zend_cpu_supports_sse41(void) {
222}
223
224static inline int zend_cpu_supports_sse42(void) {
226}
227
228static inline int zend_cpu_supports_avx(void) {
230}
231
232static inline int zend_cpu_supports_avx2(void) {
234}
235
236static inline int zend_cpu_supports_avx512(void) {
237 /* TODO: avx512_bw/avx512_vl use bit 30/31 which are reserved for mask */
238 return 0;
239}
240
241static zend_always_inline int zend_cpu_supports_avx512_vbmi(void) {
242 /* TODO: avx512_vbmi use ECX of cpuid 7 */
243 return 0;
244}
245#endif
246
247/* __builtin_cpu_supports has pclmul from gcc9 */
248#if defined(PHP_HAVE_BUILTIN_CPU_SUPPORTS) && (!defined(__GNUC__) || (ZEND_GCC_VERSION >= 9000))
250static inline int zend_cpu_supports_pclmul(void) {
251#ifdef PHP_HAVE_BUILTIN_CPU_INIT
252 __builtin_cpu_init();
253#endif
254 return __builtin_cpu_supports("pclmul");
255}
256#else
257static inline int zend_cpu_supports_pclmul(void) {
259}
260#endif
261
262/* __builtin_cpu_supports has cldemote from gcc11 */
263#if defined(PHP_HAVE_BUILTIN_CPU_SUPPORTS) && defined(__GNUC__) && (ZEND_GCC_VERSION >= 11000)
265static inline int zend_cpu_supports_cldemote(void) {
266#ifdef PHP_HAVE_BUILTIN_CPU_INIT
267 __builtin_cpu_init();
268#endif
269 return __builtin_cpu_supports("cldemote");
270}
271#endif
272
273#endif
#define ZEND_API
_zend_cpu_feature
@ ZEND_CPU_FEATURE_SSE
@ ZEND_CPU_FEATURE_DSCPL
@ ZEND_CPU_FEATURE_MCE
@ ZEND_CPU_FEATURE_VMX
@ ZEND_CPU_FEATURE_FMA
@ ZEND_CPU_FEATURE_AES
@ ZEND_CPU_FEATURE_MCA
@ ZEND_CPU_FEATURE_DCA
@ ZEND_CPU_FEATURE_MONITOR
@ ZEND_CPU_FEATURE_VME
@ ZEND_CPU_FEATURE_SDBG
@ ZEND_CPU_FEATURE_XSAVE
@ ZEND_CPU_FEATURE_SSE42
@ ZEND_CPU_FEATURE_CID
@ ZEND_CPU_FEATURE_TSC_DEADLINE
@ ZEND_CPU_FEATURE_CMOV
@ ZEND_CPU_FEATURE_PAE
@ ZEND_CPU_FEATURE_CX8
@ ZEND_CPU_FEATURE_HT
@ ZEND_CPU_FEATURE_SEP
@ ZEND_CPU_FEATURE_SS
@ ZEND_CPU_FEATURE_PSE36
@ ZEND_CPU_FEATURE_CLFLUSH
@ ZEND_CPU_FEATURE_SSSE3
@ ZEND_CPU_FEATURE_PSE
@ ZEND_CPU_FEATURE_EST
@ ZEND_CPU_FEATURE_POPCNT
@ ZEND_CPU_FEATURE_TSC
@ ZEND_CPU_FEATURE_MOVBE
@ ZEND_CPU_FEATURE_SSE41
@ ZEND_CPU_FEATURE_PCLMULQDQ
@ ZEND_CPU_FEATURE_PGE
@ ZEND_CPU_FEATURE_DE
@ ZEND_CPU_FEATURE_MTRR
@ ZEND_CPU_FEATURE_DTES64
@ ZEND_CPU_FEATURE_APIC
@ ZEND_CPU_FEATURE_SMX
@ ZEND_CPU_FEATURE_FPU
@ ZEND_CPU_FEATURE_AVX2
@ ZEND_CPU_FEATURE_ACPI
@ ZEND_CPU_FEATURE_PN
@ ZEND_CPU_FEATURE_SSE2
@ ZEND_CPU_FEATURE_AVX
@ ZEND_CPU_FEATURE_X2APIC
@ ZEND_CPU_FEATURE_AVX512F
@ ZEND_CPU_FEATURE_MSR
@ ZEND_CPU_FEATURE_SHA
@ ZEND_CPU_FEATURE_PAT
@ ZEND_CPU_FEATURE_SSE3
@ ZEND_CPU_FEATURE_AVX512CD
@ ZEND_CPU_FEATURE_MMX
@ ZEND_CPU_FEATURE_PCID
@ ZEND_CPU_FEATURE_XTPR
@ ZEND_CPU_FEATURE_CX16
@ ZEND_CPU_FEATURE_DS
@ ZEND_CPU_FEATURE_TM2
@ ZEND_CPU_FEATURE_PDCM
@ ZEND_CPU_FEATURE_AVX512DQ
@ ZEND_CPU_FEATURE_OSXSAVE
@ ZEND_CPU_FEATURE_TM
@ ZEND_CPU_FEATURE_FXSR
@ ZEND_CPU_FEATURE_F16C
enum _zend_cpu_feature zend_cpu_feature
ZEND_API int zend_cpu_supports(zend_cpu_feature feature)
#define ZEND_NO_SANITIZE_ADDRESS
void zend_cpu_startup(void)
#define ZEND_CPU_EDX_MASK
#define ZEND_CPU_EBX_MASK
#define zend_always_inline