diff options
author | Dmitry Stogov <dmitry@zend.com> | 2018-01-16 10:34:15 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2018-01-16 10:34:15 +0300 |
commit | d7f3b9b4e9dfab3bff8bece4fa38ff6a20877df2 (patch) | |
tree | 9ae076e384d8bc1d1840205dd0ee068f32cbc885 | |
parent | 267b78550e14ffa47206645fbd74471c6dbaeaac (diff) | |
parent | 3cb7fff9f1e2efdd3042682bc14a481bea3e0d44 (diff) | |
download | php-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.INTERNALS | 3 | ||||
-rw-r--r-- | Zend/Makefile.am | 2 | ||||
-rw-r--r-- | Zend/zend_cpuinfo.c | 73 | ||||
-rw-r--r-- | Zend/zend_cpuinfo.h | 104 | ||||
-rw-r--r-- | configure.ac | 4 | ||||
-rw-r--r-- | ext/standard/string.c | 9 | ||||
-rw-r--r-- | win32/build/config.w32 | 2 |
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"); |