summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2018-01-16 10:34:15 +0300
committerDmitry Stogov <dmitry@zend.com>2018-01-16 10:34:15 +0300
commitd7f3b9b4e9dfab3bff8bece4fa38ff6a20877df2 (patch)
tree9ae076e384d8bc1d1840205dd0ee068f32cbc885
parent267b78550e14ffa47206645fbd74471c6dbaeaac (diff)
parent3cb7fff9f1e2efdd3042682bc14a481bea3e0d44 (diff)
downloadphp-git-d7f3b9b4e9dfab3bff8bece4fa38ff6a20877df2.tar.gz
Merge branch 'master' of git.php.net:php-src
* 'master' of git.php.net:php-src: Added missed header file Added ZEND_API zend_cpu_supports
-rw-r--r--UPGRADING.INTERNALS3
-rw-r--r--Zend/Makefile.am2
-rw-r--r--Zend/zend_cpuinfo.c73
-rw-r--r--Zend/zend_cpuinfo.h104
-rw-r--r--configure.ac4
-rw-r--r--ext/standard/string.c9
-rw-r--r--win32/build/config.w322
7 files changed, 187 insertions, 10 deletions
diff --git a/UPGRADING.INTERNALS b/UPGRADING.INTERNALS
index bf3a63b9b3..45143ead7c 100644
--- a/UPGRADING.INTERNALS
+++ b/UPGRADING.INTERNALS
@@ -13,6 +13,7 @@ PHP 7.3 INTERNALS UPGRADE NOTES
j. cast_object() with _IS_NUMBER
k. zend_fcall_info_cache.initialized
l. php_hrtime_current()
+ m. zend_cpu_supports()
2. Build system changes
a. Unix build system changes
@@ -99,6 +100,8 @@ PHP 7.3 INTERNALS UPGRADE NOTES
l. php_hrtime_current() delivers the number of nanoseconds since an uncertain
point in the past.
+ m. zend_cpu_supports() determines if a feature is supported by current cpu.
+
========================
2. Build system changes
========================
diff --git a/Zend/Makefile.am b/Zend/Makefile.am
index 5f7f25df67..dc62bf681c 100644
--- a/Zend/Makefile.am
+++ b/Zend/Makefile.am
@@ -18,7 +18,7 @@ libZend_la_SOURCES=\
zend_default_classes.c \
zend_iterators.c zend_interfaces.c zend_exceptions.c \
zend_strtod.c zend_closures.c zend_float.c zend_string.c zend_signal.c \
- zend_generators.c zend_virtual_cwd.c zend_ast.c zend_smart_str.c
+ zend_generators.c zend_virtual_cwd.c zend_ast.c zend_smart_str.c zend_cpuinfo.c
libZend_la_CFLAGS = -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1
libZend_la_LDFLAGS =
diff --git a/Zend/zend_cpuinfo.c b/Zend/zend_cpuinfo.c
new file mode 100644
index 0000000000..9defda05b3
--- /dev/null
+++ b/Zend/zend_cpuinfo.c
@@ -0,0 +1,73 @@
+/*
+ +----------------------------------------------------------------------+
+ | Zend Engine |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 2018-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 2.00 of the Zend license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.zend.com/license/2_00.txt. |
+ | If you did not receive a copy of the Zend license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@zend.com so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Authors: Xinchen Hui <xinchen.h@zend.com> |
+ +----------------------------------------------------------------------+
+*/
+
+#include "zend.h"
+#include "zend_cpuinfo.h"
+
+typedef struct _zend_cpu_info {
+ uint32_t eax;
+ uint32_t ebx;
+ uint32_t ecx;
+ uint32_t edx;
+ uint32_t initialized;
+} zend_cpu_info;
+
+static zend_cpu_info cpuinfo;
+
+#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
+static void __zend_cpuid(uint32_t func, uint32_t subfunc) {
+ __asm__ __volatile__ (
+ "cpuid"
+ : "=a"(cpuinfo.eax), "=b"(cpuinfo.ebx), "=c"(cpuinfo.ecx), "=d"(cpuinfo.edx)
+ : "a"(func), "c"(subfunc)
+ );
+}
+#elif defined(ZEND_WIN32)
+# include <intrin.h>
+static void __zend_cpuid(uint32_t func, uint32_t subfunc) {
+ __cpuidex(&cpuinfo, func, subfunc)
+}
+#else
+static void __zend_cpuid(uint32_t func, uint32_t subfunc) {
+ cpuinfo.eax = 0;
+}
+#endif
+
+ZEND_API int zend_cpu_supports(zend_cpu_feature feature) {
+ if (!cpuinfo.initialized) {
+ cpuinfo.initialized = 1;
+ __zend_cpuid(0, 0);
+ if (cpuinfo.eax == 0) {
+ return 0;
+ }
+ __zend_cpuid(1, 0);
+ }
+ if (feature & ZEND_CPU_EDX_MASK) {
+ return (cpuinfo.edx & (feature & ~ZEND_CPU_EDX_MASK));
+ } else {
+ return (cpuinfo.ecx & feature);
+ }
+}
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ */
diff --git a/Zend/zend_cpuinfo.h b/Zend/zend_cpuinfo.h
new file mode 100644
index 0000000000..e44938fd98
--- /dev/null
+++ b/Zend/zend_cpuinfo.h
@@ -0,0 +1,104 @@
+/*
+ +----------------------------------------------------------------------+
+ | Zend Engine |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 2018-2018 Zend Technologies Ltd. (http://www.zend.com) |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 2.00 of the Zend license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.zend.com/license/2_00.txt. |
+ | If you did not receive a copy of the Zend license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@zend.com so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Authors: Xinchen Hui <xinchen.h@zend.com> |
+ +----------------------------------------------------------------------+
+*/
+
+#ifndef ZEND_CPU_INFO_H
+#define ZEND_CPU_INFO_H
+
+#define ZEND_CPU_EDX_MASK (1<<31)
+
+typedef enum _zend_cpu_feature {
+ /* ECX */
+ ZEND_CPU_FEATURE_SSE3 = (1<<0),
+ ZEND_CPU_FEATURE_PCLMULQDQ = (1<<1),
+ ZEND_CPU_FEATURE_DTES64 = (1<<2),
+ ZEND_CPU_FEATURE_MONITOR = (1<<3),
+ ZEND_CPU_FEATURE_DSCPL = (1<<4),
+ ZEND_CPU_FEATURE_VMX = (1<<5),
+ ZEND_CPU_FEATURE_SMX = (1<<6),
+ ZEND_CPU_FEATURE_EST = (1<<7),
+ ZEND_CPU_FEATURE_TM2 = (1<<8),
+ ZEND_CPU_FEATURE_SSSE3 = (1<<9),
+ ZEND_CPU_FEATURE_CID = (1<<10),
+ ZEND_CPU_FEATURE_SDBG = (1<<11),
+ ZEND_CPU_FEATURE_FMA = (1<<12),
+ ZEND_CPU_FEATURE_CX16 = (1<<13),
+ ZEND_CPU_FEATURE_XTPR = (1<<14),
+ ZEND_CPU_FEATURE_PDCM = (1<<15),
+ /* reserved = (1<<16),*/
+ ZEND_CPU_FEATURE_PCID = (1<<17),
+ ZEND_CPU_FEATURE_DCA = (1<<18),
+ ZEND_CPU_FEATURE_SSE41 = (1<<19),
+ ZEND_CPU_FEATURE_SSE42 = (1<<20),
+ ZEND_CPU_FEATURE_X2APIC = (1<<21),
+ ZEND_CPU_FEATURE_MOVBE = (1<<22),
+ ZEND_CPU_FEATURE_POPCNT = (1<<23),
+ ZEND_CPU_FEATURE_TSC_DEADLINE = (1<<24),
+ ZEND_CPU_FEATURE_AES = (1<<25),
+ ZEND_CPU_FEATURE_XSAVE = (1<<26),
+ ZEND_CPU_FEATURE_OSXSAVE = (1<<27) ,
+ ZEND_CPU_FEATURE_AVX = (1<<28),
+ ZEND_CPU_FEATURE_F16C = (1<<29),
+ ZEND_CPU_FEATURE_RDRAND = (1<<30),
+ /* intentionally don't support = (1<<31) */
+
+ /* EDX */
+ ZEND_CPU_FEATURE_FPU = (1<<0 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_VME = (1<<1 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_DE = (1<<2 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_PSE = (1<<3 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_TSC = (1<<4 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_MSR = (1<<5 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_PAE = (1<<6 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_MCE = (1<<7 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_CX8 = (1<<8 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_APIC = (1<<9 | ZEND_CPU_EDX_MASK),
+ /* reserved = (1<<10 | ZEND_CPU_EDX_MASK),*/
+ ZEND_CPU_FEATURE_SEP = (1<<11 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_MTRR = (1<<12 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_PGE = (1<<13 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_MCA = (1<<14 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_CMOV = (1<<15 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_PAT = (1<<16 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_PSE36 = (1<<17 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_PN = (1<<18 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_CLFLUSH = (1<<19 | ZEND_CPU_EDX_MASK),
+ /* reserved = (1<<20 | ZEND_CPU_EDX_MASK),*/
+ ZEND_CPU_FEATURE_DS = (1<<21 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_ACPI = (1<<22 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_MMX = (1<<23 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_FXSR = (1<<24 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_SSE = (1<<25 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_SSE2 = (1<<26 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_SS = (1<<27 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_HT = (1<<28 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_TM = (1<<29 | ZEND_CPU_EDX_MASK),
+ ZEND_CPU_FEATURE_IA64 = (1<<30 | ZEND_CPU_EDX_MASK)
+ /*intentionally don't support = (1<<31 | ZEND_CPU_EDX_MASK)*/
+} zend_cpu_feature;
+
+ZEND_API int zend_cpu_supports(zend_cpu_feature feature);
+
+#endif
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ */
diff --git a/configure.ac b/configure.ac
index 9c033fafbc..0d3c83ee1b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -566,8 +566,6 @@ dnl Check __builtin_ssubl_overflow
PHP_CHECK_BUILTIN_SSUBL_OVERFLOW
dnl Check __builtin_ssubll_overflow
PHP_CHECK_BUILTIN_SSUBLL_OVERFLOW
-dnl Check __builtin_cpu_init
-PHP_CHECK_BUILTIN_CPU_INIT
dnl Check for members of the stat structure
AC_STRUCT_ST_BLKSIZE
@@ -1488,7 +1486,7 @@ PHP_ADD_SOURCES(Zend, \
zend_iterators.c zend_interfaces.c zend_exceptions.c zend_strtod.c zend_gc.c \
zend_closures.c zend_float.c zend_string.c zend_signal.c zend_generators.c \
zend_virtual_cwd.c zend_ast.c zend_objects.c zend_object_handlers.c zend_objects_API.c \
- zend_default_classes.c zend_inheritance.c zend_smart_str.c, \
+ zend_default_classes.c zend_inheritance.c zend_smart_str.c zend_cpuinfo.c, \
-DZEND_ENABLE_STATIC_TSRMLS_CACHE=1)
dnl Selectively disable optimization due to high RAM usage during
diff --git a/ext/standard/string.c b/ext/standard/string.c
index 2abd2c796a..05512786a8 100644
--- a/ext/standard/string.c
+++ b/ext/standard/string.c
@@ -3865,10 +3865,12 @@ PHPAPI zend_string *php_addcslashes(zend_string *str, int should_free, char *wha
/* }}} */
/* {{{ php_addslashes */
-#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) && HAVE_FUNC_ATTRIBUTE_IFUNC && HAVE_FUNC_ATTRIBUTE_TARGET && HAVE_NMMINTRIN_H
+#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) && \
+ defined(HAVE_FUNC_ATTRIBUTE_IFUNC) && defined(HAVE_FUNC_ATTRIBUTE_TARGET) && defined(HAVE_NMMINTRIN_H)
#include <nmmintrin.h>
#include "Zend/zend_bitset.h"
+#include "Zend/zend_cpuinfo.h"
PHPAPI zend_string *php_addslashes(zend_string *str, int should_free) __attribute__((ifunc("resolve_addslashes")));
@@ -3877,12 +3879,9 @@ zend_string *php_addslashes_default(zend_string *str, int should_free);
/* {{{ resolve_addslashes */
static void *resolve_addslashes() {
-#if PHP_HAVE_BUILTIN_CPU_INIT
- __builtin_cpu_init();
- if (__builtin_cpu_supports("sse4.2")) {
+ if (zend_cpu_supports(ZEND_CPU_FEATURE_SSE42)) {
return php_addslashes_sse4;
}
-#endif
return php_addslashes_default;
}
/* }}} */
diff --git a/win32/build/config.w32 b/win32/build/config.w32
index 71cf49156f..a043ddbb20 100644
--- a/win32/build/config.w32
+++ b/win32/build/config.w32
@@ -234,7 +234,7 @@ ADD_SOURCES("Zend", "zend_language_parser.c zend_language_scanner.c \
zend_object_handlers.c zend_objects_API.c \
zend_default_classes.c zend_execute.c zend_strtod.c zend_gc.c zend_closures.c \
zend_float.c zend_string.c zend_generators.c zend_virtual_cwd.c zend_ast.c \
- zend_inheritance.c zend_smart_str.c");
+ zend_inheritance.c zend_smart_str.c zend_cpuinfo.c");
ADD_FLAG("CFLAGS_BD_ZEND", "/D ZEND_ENABLE_STATIC_TSRMLS_CACHE=1");