mirror of
https://github.com/php/php-src.git
synced 2025-08-16 14:08:47 +02:00
PowerPC64 support for operators with overflow check
This adds fast architecture-specific implementations of the following functions for the ppc64: * fast_increment_function * fast_decrement_function
This commit is contained in:
parent
14e29f5146
commit
fd045c7021
1 changed files with 54 additions and 0 deletions
|
@ -443,6 +443,33 @@ static zend_always_inline int fast_increment_function(zval *op1)
|
||||||
"n"(IS_DOUBLE),
|
"n"(IS_DOUBLE),
|
||||||
"n"(ZVAL_OFFSETOF_TYPE)
|
"n"(ZVAL_OFFSETOF_TYPE)
|
||||||
: "cc");
|
: "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
|
#else
|
||||||
if (UNEXPECTED(Z_LVAL_P(op1) == ZEND_LONG_MAX)) {
|
if (UNEXPECTED(Z_LVAL_P(op1) == ZEND_LONG_MAX)) {
|
||||||
/* switch to double */
|
/* switch to double */
|
||||||
|
@ -485,6 +512,33 @@ static zend_always_inline int fast_decrement_function(zval *op1)
|
||||||
"n"(IS_DOUBLE),
|
"n"(IS_DOUBLE),
|
||||||
"n"(ZVAL_OFFSETOF_TYPE)
|
"n"(ZVAL_OFFSETOF_TYPE)
|
||||||
: "cc");
|
: "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
|
#else
|
||||||
if (UNEXPECTED(Z_LVAL_P(op1) == ZEND_LONG_MIN)) {
|
if (UNEXPECTED(Z_LVAL_P(op1) == ZEND_LONG_MIN)) {
|
||||||
/* switch to double */
|
/* switch to double */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue