summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-02-14 10:21:27 +0100
committerNikita Popov <nikita.ppv@gmail.com>2019-02-14 11:49:21 +0100
commit96daef0458e2ae7cef4079f9a75cf90fff4b4e02 (patch)
tree85bc6cdfb6440f8dee7d0fcb230700bbfca2b527
parent1a5cff334d5f93336f3ee645dd73c9297ed24056 (diff)
downloadphp-git-96daef0458e2ae7cef4079f9a75cf90fff4b4e02.tar.gz
Make ABI of SIMD optimized functions independent of compiler flags
Always export these as normal functions and only use function pointers internally if necessary.
-rw-r--r--Zend/zend_portability.h5
-rw-r--r--configure.ac18
-rw-r--r--ext/standard/base64.c23
-rw-r--r--ext/standard/base64.h6
-rw-r--r--ext/standard/php_string.h5
-rw-r--r--ext/standard/string.c23
6 files changed, 36 insertions, 44 deletions
diff --git a/Zend/zend_portability.h b/Zend/zend_portability.h
index e550651753..577f8a909c 100644
--- a/Zend/zend_portability.h
+++ b/Zend/zend_portability.h
@@ -559,6 +559,7 @@ static zend_always_inline double _zend_get_nan(void) /* {{{ */
# define ZEND_INTRIN_SSSE3_RESOLVER 1
#endif
+/* Do not use for conditional declaration of API functions! */
#if ZEND_INTRIN_SSSE3_RESOLVER && ZEND_INTRIN_HAVE_IFUNC_TARGET
# define ZEND_INTRIN_SSSE3_FUNC_PROTO 1
#elif ZEND_INTRIN_SSSE3_RESOLVER
@@ -575,7 +576,7 @@ static zend_always_inline double _zend_get_nan(void) /* {{{ */
# define ZEND_INTRIN_SSSE3_FUNC_DECL(func)
#endif
-#if defined(HAVE_SSE4_2_DEF) || (defined(ZEND_WIN32) && defined(__SSE4_2__))
+#if __SSE4_2__
/* Instructions compiled directly. */
# define ZEND_INTRIN_SSE4_2_NATIVE 1
#elif (defined(HAVE_FUNC_ATTRIBUTE_TARGET) && defined(PHP_HAVE_SSE4_2)) || defined(ZEND_WIN32)
@@ -583,6 +584,7 @@ static zend_always_inline double _zend_get_nan(void) /* {{{ */
# define ZEND_INTRIN_SSE4_2_RESOLVER 1
#endif
+/* Do not use for conditional declaration of API functions! */
#if ZEND_INTRIN_SSE4_2_RESOLVER && ZEND_INTRIN_HAVE_IFUNC_TARGET
# define ZEND_INTRIN_SSE4_2_FUNC_PROTO 1
#elif ZEND_INTRIN_SSE4_2_RESOLVER
@@ -605,6 +607,7 @@ static zend_always_inline double _zend_get_nan(void) /* {{{ */
# define ZEND_INTRIN_AVX2_RESOLVER 1
#endif
+/* Do not use for conditional declaration of API functions! */
#if ZEND_INTRIN_AVX2_RESOLVER && ZEND_INTRIN_HAVE_IFUNC_TARGET
# define ZEND_INTRIN_AVX2_FUNC_PROTO 1
#elif ZEND_INTRIN_AVX2_RESOLVER
diff --git a/configure.ac b/configure.ac
index 4a91cd214d..ad110b2213 100644
--- a/configure.ac
+++ b/configure.ac
@@ -561,24 +561,6 @@ PHP_CHECK_CPU_SUPPORTS([sse4.2])
PHP_CHECK_CPU_SUPPORTS([avx])
PHP_CHECK_CPU_SUPPORTS([avx2])
-dnl The ABI of php_addslashes in PHP 7.3 is dependent on __SSE4_2__,
-dnl which depends on target attributes. Use this check to make sure that
-dnl SSE 4.2 availability during the PHP compilation is used, independently
-dnl of whether extensions are compiled with SSE 4.2 support.
-AC_MSG_CHECKING([whether __SSE4_2__ is defined])
-AC_RUN_IFELSE([AC_LANG_SOURCE([[
-int main() {
-#if defined(__SSE4_2__)
- return 0;
-#else
- return 1;
-#endif
-}
-]])], [
- AC_MSG_RESULT([yes])
- AC_DEFINE(HAVE_SSE4_2_DEF, 1, [Define if __SSE4_2__ has been defined])
-], [AC_MSG_RESULT([no])], [AC_MSG_RESULT([no])])
-
dnl Check for members of the stat structure
AC_CHECK_MEMBERS([struct stat.st_blksize, struct stat.st_rdev])
dnl AC_STRUCT_ST_BLOCKS will screw QNX because fileblocks.o does not exist
diff --git a/ext/standard/base64.c b/ext/standard/base64.c
index 3553e79f4e..3286b7d30d 100644
--- a/ext/standard/base64.c
+++ b/ext/standard/base64.c
@@ -247,26 +247,33 @@ static void *resolve_base64_decode() {
}
# else /* (ZEND_INTRIN_AVX2_FUNC_PROTO || ZEND_INTRIN_SSSE3_FUNC_PROTO) */
-PHPAPI zend_string *(*php_base64_encode)(const unsigned char *str, size_t length) = NULL;
-PHPAPI zend_string *(*php_base64_decode_ex)(const unsigned char *str, size_t length, zend_bool strict) = NULL;
+PHPAPI zend_string *(*php_base64_encode_ptr)(const unsigned char *str, size_t length) = NULL;
+PHPAPI zend_string *(*php_base64_decode_ex_ptr)(const unsigned char *str, size_t length, zend_bool strict) = NULL;
+
+PHPAPI zend_string *php_base64_encode(const unsigned char *str, size_t length) {
+ return php_base64_encode_ptr(str, length);
+}
+PHPAPI zend_string *php_base64_decode_ex(const unsigned char *str, size_t length, zend_bool strict) {
+ return php_base64_decode_ex_ptr(str, length, strict);
+}
PHP_MINIT_FUNCTION(base64_intrin)
{
# if ZEND_INTRIN_AVX2_FUNC_PTR
if (zend_cpu_supports_avx2()) {
- php_base64_encode = php_base64_encode_avx2;
- php_base64_decode_ex = php_base64_decode_ex_avx2;
+ php_base64_encode_ptr = php_base64_encode_avx2;
+ php_base64_decode_ex_ptr = php_base64_decode_ex_avx2;
} else
# endif
#if ZEND_INTRIN_SSSE3_FUNC_PTR
if (zend_cpu_supports_ssse3()) {
- php_base64_encode = php_base64_encode_ssse3;
- php_base64_decode_ex = php_base64_decode_ex_ssse3;
+ php_base64_encode_ptr = php_base64_encode_ssse3;
+ php_base64_decode_ex_ptr = php_base64_decode_ex_ssse3;
} else
#endif
{
- php_base64_encode = php_base64_encode_default;
- php_base64_decode_ex = php_base64_decode_ex_default;
+ php_base64_encode_ptr = php_base64_encode_default;
+ php_base64_decode_ex_ptr = php_base64_decode_ex_default;
}
return SUCCESS;
}
diff --git a/ext/standard/base64.h b/ext/standard/base64.h
index b0ed3f6dfc..f44ee2147a 100644
--- a/ext/standard/base64.h
+++ b/ext/standard/base64.h
@@ -59,12 +59,10 @@ PHP_FUNCTION(base64_encode);
#if (ZEND_INTRIN_AVX2_FUNC_PTR || ZEND_INTRIN_SSSE3_FUNC_PTR) && !ZEND_INTRIN_AVX2_NATIVE
PHP_MINIT_FUNCTION(base64_intrin);
-PHPAPI extern zend_string *(*php_base64_encode)(const unsigned char *, size_t);
-PHPAPI extern zend_string *(*php_base64_decode_ex)(const unsigned char *, size_t, zend_bool);
-#else
+#endif
+
PHPAPI extern zend_string *php_base64_encode(const unsigned char *, size_t);
PHPAPI extern zend_string *php_base64_decode_ex(const unsigned char *, size_t, zend_bool);
-#endif
static inline zend_string *php_base64_encode_str(const zend_string *str) {
return php_base64_encode((const unsigned char*)(ZSTR_VAL(str)), ZSTR_LEN(str));
diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h
index cafe1cd666..f88861cd5b 100644
--- a/ext/standard/php_string.h
+++ b/ext/standard/php_string.h
@@ -124,13 +124,8 @@ PHPAPI char *php_strtolower(char *s, size_t len);
PHPAPI zend_string *php_string_toupper(zend_string *s);
PHPAPI zend_string *php_string_tolower(zend_string *s);
PHPAPI char *php_strtr(char *str, size_t len, const char *str_from, const char *str_to, size_t trlen);
-#if ZEND_INTRIN_SSE4_2_FUNC_PTR
-PHPAPI extern zend_string *(*php_addslashes)(zend_string *str);
-PHPAPI extern void (*php_stripslashes)(zend_string *str);
-#else
PHPAPI zend_string *php_addslashes(zend_string *str);
PHPAPI void php_stripslashes(zend_string *str);
-#endif
PHPAPI zend_string *php_addcslashes_str(const char *str, size_t len, char *what, size_t what_len);
PHPAPI zend_string *php_addcslashes(zend_string *str, char *what, size_t what_len);
PHPAPI void php_stripcslashes(zend_string *str);
diff --git a/ext/standard/string.c b/ext/standard/string.c
index 28fd4b8753..6f3571e855 100644
--- a/ext/standard/string.c
+++ b/ext/standard/string.c
@@ -3905,7 +3905,7 @@ static void *resolve_addslashes() {
if (zend_cpu_supports_sse42()) {
return php_addslashes_sse42;
}
- return php_addslashes_default;
+ return php_addslashes_default;
}
ZEND_NO_SANITIZE_ADDRESS
@@ -3913,23 +3913,30 @@ static void *resolve_stripslashes() {
if (zend_cpu_supports_sse42()) {
return php_stripslashes_sse42;
}
- return php_stripslashes_default;
+ return php_stripslashes_default;
}
# else /* ZEND_INTRIN_SSE4_2_FUNC_PTR */
-PHPAPI zend_string *(*php_addslashes)(zend_string *str) = NULL;
-PHPAPI void (*php_stripslashes)(zend_string *str) = NULL;
+static zend_string *(*php_addslashes_ptr)(zend_string *str) = NULL;
+static void (*php_stripslashes_ptr)(zend_string *str) = NULL;
+
+PHPAPI zend_string *php_addslashes(zend_string *str) {
+ return php_addslashes_ptr(str);
+}
+PHPAPI void php_stripslashes(zend_string *str) {
+ php_stripslashes_ptr(str);
+}
/* {{{ PHP_MINIT_FUNCTION
*/
PHP_MINIT_FUNCTION(string_intrin)
{
if (zend_cpu_supports(ZEND_CPU_FEATURE_SSE42)) {
- php_addslashes = php_addslashes_sse42;
- php_stripslashes = php_stripslashes_sse42;
+ php_addslashes_ptr = php_addslashes_sse42;
+ php_stripslashes_ptr = php_stripslashes_sse42;
} else {
- php_addslashes = php_addslashes_default;
- php_stripslashes = php_stripslashes_default;
+ php_addslashes_ptr = php_addslashes_default;
+ php_stripslashes_ptr = php_stripslashes_default;
}
return SUCCESS;
}