diff options
author | Xinchen Hui <laruence@gmail.com> | 2018-02-12 20:46:17 +0800 |
---|---|---|
committer | Xinchen Hui <laruence@gmail.com> | 2018-02-12 20:53:14 +0800 |
commit | cf0fae5e975f542453e80d9b082bceee98699db5 (patch) | |
tree | 9031b781f7b8551d8b5eb46ce4b52d83feb3e94c /Zend/zend_portability.h | |
parent | 97353cda99bb053916b3ec1cf29f88cd1207cdfe (diff) | |
download | php-git-cf0fae5e975f542453e80d9b082bceee98699db5.tar.gz |
Optimized base64_encode/decode with SIMD instructions
Diffstat (limited to 'Zend/zend_portability.h')
-rw-r--r-- | Zend/zend_portability.h | 64 |
1 files changed, 63 insertions, 1 deletions
diff --git a/Zend/zend_portability.h b/Zend/zend_portability.h index bd3e23edfe..abf7dcc5a4 100644 --- a/Zend/zend_portability.h +++ b/Zend/zend_portability.h @@ -520,10 +520,48 @@ static zend_always_inline double _zend_get_nan(void) /* {{{ */ # define ZEND_INTRIN_HAVE_IFUNC_TARGET 1 #endif +#if (defined(__i386__) || defined(__x86_64__)) +# if PHP_HAVE_SSSE3_INSTRUCTIONS && defined(HAVE_TMMINTRIN_H) +# define PHP_HAVE_SSSE3 +# endif + +# if PHP_HAVE_SSE4_2_INSTRUCTIONS && defined(HAVE_NMMINTRIN_H) +# define PHP_HAVE_SSE4_2 +# endif + +# if PHP_HAVE_AVX2_INSTRUCTIONS && defined(HAVE_IMMINTRIN_H) +# define PHP_HAVE_AVX2 +# endif +#endif + +#ifdef __SSSE3__ +/* Instructions compiled directly. */ +# define ZEND_INTRIN_SSSE3_NATIVE 1 +#elif (defined(HAVE_FUNC_ATTRIBUTE_TARGET) && defined(PHP_HAVE_SSSE3)) || defined(ZEND_WIN32) +/* Function resolved by ifunc or MINIT. */ +# define ZEND_INTRIN_SSSE3_RESOLVER 1 +#endif + +#if ZEND_INTRIN_HAVE_IFUNC_TARGET && (ZEND_INTRIN_SSSE3_NATIVE || ZEND_INTRIN_SSSE3_RESOLVER) +# define ZEND_INTRIN_SSSE3_FUNC_PROTO 1 +#elif ZEND_INTRIN_SSSE3_RESOLVER +# define ZEND_INTRIN_SSSE3_FUNC_PTR 1 +#endif + +#if ZEND_INTRIN_SSSE3_RESOLVER +# if defined(HAVE_FUNC_ATTRIBUTE_TARGET) +# define ZEND_INTRIN_SSSE3_FUNC_DECL(func) ZEND_API func __attribute__((target("ssse3"))) +# else +# define ZEND_INTRIN_SSSE3_FUNC_DECL(func) func +# endif +#else +# define ZEND_INTRIN_SSSE3_FUNC_DECL(func) +#endif + #ifdef __SSE4_2__ /* Instructions compiled directly. */ # define ZEND_INTRIN_SSE4_2_NATIVE 1 -#elif (defined(__i386__) || defined(__x86_64__)) && defined(HAVE_NMMINTRIN_H) || defined(ZEND_WIN32) +#elif (defined(HAVE_FUNC_ATTRIBUTE_TARGET) && defined(PHP_HAVE_SSE4_2)) || defined(ZEND_WIN32) /* Function resolved by ifunc or MINIT. */ # define ZEND_INTRIN_SSE4_2_RESOLVER 1 #endif @@ -544,6 +582,30 @@ static zend_always_inline double _zend_get_nan(void) /* {{{ */ # define ZEND_INTRIN_SSE4_2_FUNC_DECL(func) #endif +#ifdef __AVX2__ +/* Instructions compiled directly. */ +# define ZEND_INTRIN_AVX2_NATIVE 1 +#elif (defined(HAVE_FUNC_ATTRIBUTE_TARGET) && defined(PHP_HAVE_AVX2)) || defined(ZEND_WIN32) +/* Function resolved by ifunc or MINIT. */ +# define ZEND_INTRIN_AVX2_RESOLVER 1 +#endif + +#if ZEND_INTRIN_HAVE_IFUNC_TARGET && (ZEND_INTRIN_AVX2_NATIVE || ZEND_INTRIN_AVX2_RESOLVER) +# define ZEND_INTRIN_AVX2_FUNC_PROTO 1 +#elif ZEND_INTRIN_AVX2_RESOLVER +# define ZEND_INTRIN_AVX2_FUNC_PTR 1 +#endif + +#if ZEND_INTRIN_AVX2_RESOLVER +# if defined(HAVE_FUNC_ATTRIBUTE_TARGET) +# define ZEND_INTRIN_AVX2_FUNC_DECL(func) ZEND_API func __attribute__((target("avx2"))) +# else +# define ZEND_INTRIN_AVX2_FUNC_DECL(func) func +# endif +#else +# define ZEND_INTRIN_AVX2_FUNC_DECL(func) +#endif + /* Intrinsics macros end. */ #ifdef ZEND_WIN32 |