summaryrefslogtreecommitdiff
path: root/Zend/zend_cpuinfo.h
diff options
context:
space:
mode:
authorXinchen Hui <laruence@gmail.com>2018-02-10 16:58:27 +0800
committerXinchen Hui <laruence@gmail.com>2018-02-10 16:58:27 +0800
commit87b71804804a0a76115267a34acd27b7d01d6e85 (patch)
treed6b89957171c058a68536326eeee64d64eb79c22 /Zend/zend_cpuinfo.h
parentab44dddfe4f0270f7ae84f5e61578e75c2005bc3 (diff)
downloadphp-git-87b71804804a0a76115267a34acd27b7d01d6e85.tar.gz
Fixed cpu feature check in reslover functions
Diffstat (limited to 'Zend/zend_cpuinfo.h')
-rw-r--r--Zend/zend_cpuinfo.h67
1 files changed, 66 insertions, 1 deletions
diff --git a/Zend/zend_cpuinfo.h b/Zend/zend_cpuinfo.h
index 97e33a55cc..c077366bd8 100644
--- a/Zend/zend_cpuinfo.h
+++ b/Zend/zend_cpuinfo.h
@@ -19,6 +19,8 @@
#ifndef ZEND_CPU_INFO_H
#define ZEND_CPU_INFO_H
+#include "zend.h"
+
#define ZEND_CPU_EDX_MASK (1<<31)
typedef enum _zend_cpu_feature {
@@ -91,9 +93,72 @@ typedef enum _zend_cpu_feature {
/*intentionally don't support = (1<<31 | ZEND_CPU_EDX_MASK)*/
} zend_cpu_feature;
+void zend_cpu_startup();
ZEND_API int zend_cpu_supports(zend_cpu_feature feature);
-void zend_cpu_startup(void);
+#ifdef PHP_HAVE_BUILTIN_CPU_SUPPORTS
+/* NOTE: you should use following inline function in
+ * resolver functions (ifunc), as it could be called
+ * before all PLT symbols are resloved. in other words,
+ * resolver functions should not depends any external
+ * functions */
+static zend_always_inline int zend_cpu_support_sse2() {
+ __builtin_cpu_init();
+ return __builtin_cpu_supports("sse2");
+}
+
+static zend_always_inline int zend_cpu_support_sse3() {
+ __builtin_cpu_init();
+ return __builtin_cpu_supports("sse3");
+}
+
+static zend_always_inline int zend_cpu_support_sse41() {
+ __builtin_cpu_init();
+ return __builtin_cpu_supports("sse4.1");
+}
+
+static zend_always_inline int zend_cpu_support_sse42() {
+ __builtin_cpu_init();
+ return __builtin_cpu_supports("sse4.2");
+}
+
+static zend_always_inline int zend_cpu_support_avx() {
+ __builtin_cpu_init();
+ return __builtin_cpu_supports("avx");
+}
+
+static zend_always_inline int zend_cpu_support_avx2() {
+ __builtin_cpu_init();
+ return __builtin_cpu_supports("avx2");
+}
+#else
+
+static zend_always_inline int zend_cpu_support_sse2() {
+ return zend_cpu_supports(ZEND_CPU_FEATURE_SSE2);
+}
+
+static zend_always_inline int zend_cpu_support_sse3() {
+ return zend_cpu_supports(ZEND_CPU_FEATURE_SSE3);
+}
+
+static zend_always_inline int zend_cpu_support_sse41() {
+ return zend_cpu_supports(ZEND_CPU_FEATURE_SSE41);
+}
+
+static zend_always_inline int zend_cpu_support_sse42() {
+ return zend_cpu_supports(ZEND_CPU_FEATURE_SSE42);
+}
+
+static zend_always_inline int zend_cpu_support_avx() {
+ return zend_cpu_supports(ZEND_CPU_FEATURE_AVX);
+}
+
+static zend_always_inline int zend_cpu_support_avx2() {
+ /* TODO */
+ return 0;
+}
+
+#endif
#endif