]> granicus.if.org Git - php/commitdiff
PowerPC64 support in safe_address function
authorGustavo Frederico Temple Pedrosa <gustavo.pedrosa@eldorado.org.br>
Mon, 15 Dec 2014 12:59:55 +0000 (12:59 +0000)
committerRemi Collet <remi@php.net>
Tue, 16 Dec 2014 07:20:01 +0000 (08:20 +0100)
Add a ppc64-specific implementation of the safe_address
function with overflow checking.

Zend/zend_multiply.h

index ab5fd6279d3eb78e792f7081c6f00a2a33928947..b0000449af3bcfa4f287753ba624b2e8e4a13b2b 100644 (file)
@@ -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)