From: Gustavo Frederico Temple Pedrosa Date: Tue, 25 Nov 2014 15:41:15 +0000 (+0000) Subject: PowerPC64 support in long multiplication X-Git-Tag: PRE_NATIVE_TLS_MERGE~90 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=87e0802a997001954603e64ca3987080b50afb21;p=php PowerPC64 support in long multiplication In long integer multiplications, avoid casting both operands to long double and use an inline assembly-based overflow checking function instead. --- diff --git a/Zend/zend_multiply.h b/Zend/zend_multiply.h index 6dce8fb6ac..ab5fd6279d 100644 --- a/Zend/zend_multiply.h +++ b/Zend/zend_multiply.h @@ -84,6 +84,24 @@ } \ } while (0) +#elif defined(__powerpc64__) && defined(__GNUC__) + +#define ZEND_SIGNED_MULTIPLY_LONG(a, b, lval, dval, usedval) do { \ + long __tmpvar; \ + __asm__("li 14, 0\n\t" \ + "mtxer 14\n\t" \ + "mulldo. %0, %2,%3\n\t" \ + "xor %1, %1, %1\n\t" \ + "bns+ 0f\n\t" \ + "li %1, 1\n\t" \ + "0:\n" \ + : "=r"(__tmpvar),"=r"(usedval) \ + : "r"(a), "r"(b) \ + : "r14", "cc"); \ + if (usedval) (dval) = (double) (a) * (double) (b); \ + else (lval) = __tmpvar; \ +} while (0) + #elif SIZEOF_ZEND_LONG == 4 #define ZEND_SIGNED_MULTIPLY_LONG(a, b, lval, dval, usedval) do { \