From 451314111b9942c8389415f04e9017c3e3d3cb56 Mon Sep 17 00:00:00 2001
From: Nikita Popov <nikita.ppv@gmail.com>
Date: Mon, 4 Nov 2019 11:32:46 +0100
Subject: [PATCH] Revert "Remove configure checks for supported instruction
 sets"

This reverts commit edccf32f7f36a8bc759b9482737e0c3efcb3a005.

This was reported to cause issues for as yet unknown reasons in
bug #78769. As this was intended as code cleanup, revert this from
7.4 at least. May reapply it to master later.
---
 Zend/zend_portability.h | 12 ++++++------
 build/php.m4            | 24 ++++++++++++++++++++++++
 configure.ac            |  6 ++++++
 3 files changed, 36 insertions(+), 6 deletions(-)

diff --git a/Zend/zend_portability.h b/Zend/zend_portability.h
index 3331b9ed10..1e549d300b 100644
--- a/Zend/zend_portability.h
+++ b/Zend/zend_portability.h
@@ -532,21 +532,21 @@ static zend_always_inline double _zend_get_nan(void) /* {{{ */
 #endif
 
 #if (defined(__i386__) || defined(__x86_64__))
-# if defined(HAVE_TMMINTRIN_H)
-#  define PHP_HAVE_SSSE3
+# if PHP_HAVE_SSSE3_INSTRUCTIONS && defined(HAVE_TMMINTRIN_H)
+# define PHP_HAVE_SSSE3
 # endif
 
-# if defined(HAVE_NMMINTRIN_H)
-#  define PHP_HAVE_SSE4_2
+# if PHP_HAVE_SSE4_2_INSTRUCTIONS && defined(HAVE_NMMINTRIN_H)
+# define PHP_HAVE_SSE4_2
 # endif
 
 /*
  * AVX2 support was added in gcc 4.7, but AVX2 intrinsics don't work in
  * __attribute__((target("avx2"))) functions until gcc 4.9.
  */
-# if defined(HAVE_IMMINTRIN_H) && \
+# if PHP_HAVE_AVX2_INSTRUCTIONS && defined(HAVE_IMMINTRIN_H) && \
   (defined(__llvm__) || defined(__clang__) || (defined(__GNUC__) && ZEND_GCC_VERSION >= 4009))
-#  define PHP_HAVE_AVX2
+# define PHP_HAVE_AVX2
 # endif
 #endif
 
diff --git a/build/php.m4 b/build/php.m4
index fd37373f20..e91ef9887c 100644
--- a/build/php.m4
+++ b/build/php.m4
@@ -2674,6 +2674,30 @@ AC_DEFUN([PHP_CHECK_BUILTIN_CPU_SUPPORTS], [
    [$have_builtin_cpu_supports], [Whether the compiler supports __builtin_cpu_supports])
 ])
 
+dnl
+dnl PHP_CHECK_CPU_SUPPORTS
+dnl
+AC_DEFUN([PHP_CHECK_CPU_SUPPORTS], [
+  AC_REQUIRE([PHP_CHECK_BUILTIN_CPU_INIT])
+  AC_REQUIRE([PHP_CHECK_BUILTIN_CPU_SUPPORTS])
+  have_ext_instructions=0
+  if test $have_builtin_cpu_supports = 1; then
+    AC_MSG_CHECKING([for $1 instructions supports])
+    AC_RUN_IFELSE([AC_LANG_SOURCE([[
+int main() {
+	return __builtin_cpu_supports("$1")? 0 : 1;
+}
+    ]])], [
+      have_ext_instructions=1
+      AC_MSG_RESULT([yes])
+    ], [
+      AC_MSG_RESULT([no])
+    ], [AC_MSG_RESULT([no])])
+  fi
+  AC_DEFINE_UNQUOTED(AS_TR_CPP([PHP_HAVE_$1_INSTRUCTIONS]),
+   [$have_ext_instructions], [Whether the compiler supports $1 instructions])
+])
+
 dnl
 dnl PHP_PATCH_CONFIG_HEADERS([FILE])
 dnl
diff --git a/configure.ac b/configure.ac
index 39dc519a6c..038a3fbb9f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -541,6 +541,12 @@ PHP_CHECK_BUILTIN_CPU_INIT
 dnl Check __builtin_cpu_supports
 PHP_CHECK_BUILTIN_CPU_SUPPORTS
 
+dnl Check instructions.
+PHP_CHECK_CPU_SUPPORTS([ssse3])
+PHP_CHECK_CPU_SUPPORTS([sse4.2])
+PHP_CHECK_CPU_SUPPORTS([avx])
+PHP_CHECK_CPU_SUPPORTS([avx2])
+
 dnl Check for structure members.
 AC_CHECK_MEMBERS([struct tm.tm_gmtoff],,,[#include <time.h>])
 AC_CHECK_MEMBERS([struct stat.st_blksize, struct stat.st_rdev])
-- 
2.40.0