summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend_multiply.h24
-rw-r--r--[-rwxr-xr-x]ext/openssl/openssl.c0
-rw-r--r--[-rwxr-xr-x]ext/phar/phar_object.c0
3 files changed, 24 insertions, 0 deletions
diff --git a/Zend/zend_multiply.h b/Zend/zend_multiply.h
index ab5fd6279d..b0000449af 100644
--- a/Zend/zend_multiply.h
+++ b/Zend/zend_multiply.h
@@ -224,6 +224,30 @@ static zend_always_inline size_t zend_safe_address(size_t nmemb, size_t size, si
return res;
}
+#elif defined(__GNUC__) && defined(__powerpc64__)
+
+static zend_always_inline size_t zend_safe_address(size_t nmemb, size_t size, size_t offset, int *overflow)
+{
+ size_t res;
+ unsigned long m_overflow;
+
+ __asm__ ("mulld %0,%2,%3\n\t"
+ "mulhdu %1,%2,%3\n\t"
+ "addc %0,%0,%4\n\t"
+ "addze %1,%1\n"
+ : "=&r"(res), "=&r"(m_overflow)
+ : "r"(nmemb),
+ "r"(size),
+ "r"(offset));
+
+ if (UNEXPECTED(m_overflow)) {
+ *overflow = 1;
+ return 0;
+ }
+ *overflow = 0;
+ return res;
+}
+
#elif SIZEOF_SIZE_T == 4
static zend_always_inline size_t zend_safe_address(size_t nmemb, size_t size, size_t offset, int *overflow)
diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c
index a69ce8190b..a69ce8190b 100755..100644
--- a/ext/openssl/openssl.c
+++ b/ext/openssl/openssl.c
diff --git a/ext/phar/phar_object.c b/ext/phar/phar_object.c
index 70577ff496..70577ff496 100755..100644
--- a/ext/phar/phar_object.c
+++ b/ext/phar/phar_object.c