summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend_operators.h54
1 files changed, 54 insertions, 0 deletions
diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h
index d7967c458a..c6d40b8f85 100644
--- a/Zend/zend_operators.h
+++ b/Zend/zend_operators.h
@@ -443,6 +443,33 @@ static zend_always_inline int fast_increment_function(zval *op1)
"n"(IS_DOUBLE),
"n"(ZVAL_OFFSETOF_TYPE)
: "cc");
+#elif defined(__GNUC__) && defined(__powerpc64__)
+ __asm__(
+ "ld 14, 0(%0)\n\t"
+ "li 15, 1\n\t"
+ "li 16, 0\n\t"
+ "mtxer 16\n\t"
+ "addo. 14, 14, 15\n\t"
+ "std 14, 0(%0)\n\t"
+ "bns+ 0f\n\t"
+ "xor 14, 14, 14\n\t"
+ "lis 15, 0x43e00000@h\n\t"
+ "ori 15, 15, 0x43e00000@l\n\t"
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+ "stw 14, 0(%0)\n\t"
+ "stw 15, 0x4(%0)\n\t"
+#else
+ "stw 14, 0x4(%0)\n\t"
+ "stw 15, 0(%0)\n\t"
+#endif
+ "li 14, %1\n\t"
+ "stw 14, %c2(%0)\n"
+ "0:"
+ :
+ : "r"(&op1->value),
+ "n"(IS_DOUBLE),
+ "n"(ZVAL_OFFSETOF_TYPE)
+ : "r14", "r15", "r16", "cc");
#else
if (UNEXPECTED(Z_LVAL_P(op1) == ZEND_LONG_MAX)) {
/* switch to double */
@@ -485,6 +512,33 @@ static zend_always_inline int fast_decrement_function(zval *op1)
"n"(IS_DOUBLE),
"n"(ZVAL_OFFSETOF_TYPE)
: "cc");
+#elif defined(__GNUC__) && defined(__powerpc64__)
+ __asm__(
+ "ld 14, 0(%0)\n\t"
+ "li 15, 1\n\t"
+ "li 16, 0\n\t"
+ "mtxer 16\n\t"
+ "subo. 14, 14, 15\n\t"
+ "std 14, 0(%0)\n\t"
+ "bns+ 0f\n\t"
+ "xor 14, 14, 14\n\t"
+ "lis 15, 0xc3e00000@h\n\t"
+ "ori 15, 15, 0xc3e00000@l\n\t"
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+ "stw 14, 0(%0)\n\t"
+ "stw 15, 0x4(%0)\n\t"
+#else
+ "stw 14, 0x4(%0)\n\t"
+ "stw 15, 0(%0)\n\t"
+#endif
+ "li 14, %1\n\t"
+ "stw 14, %c2(%0)\n"
+ "0:"
+ :
+ : "r"(&op1->value),
+ "n"(IS_DOUBLE),
+ "n"(ZVAL_OFFSETOF_TYPE)
+ : "r14", "r15", "r16", "cc");
#else
if (UNEXPECTED(Z_LVAL_P(op1) == ZEND_LONG_MIN)) {
/* switch to double */