]> granicus.if.org Git - php/commitdiff
Use "lea" to add/sub register with constant
authorDmitry Stogov <dmitry@zend.com>
Tue, 16 Jun 2020 11:04:05 +0000 (14:04 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 16 Jun 2020 11:04:05 +0000 (14:04 +0300)
ext/opcache/jit/zend_jit_x86.dasc

index 2a157c8c11bbd1b0a5e38a26493f2b246cf414bd..fb634378f2c549ecc870648149dc85d263ff5fd7 100644 (file)
@@ -3826,6 +3826,21 @@ static int zend_jit_math_long_long(dasm_State    **Dst,
                        is_power_of_two(Z_LVAL_P(Z_ZV(op2_addr))))) {
                |       GET_ZVAL_LVAL result_reg, op1_addr
                |       shr Ra(result_reg), floor_log2(Z_LVAL_P(Z_ZV(op2_addr)))
+       } else if (opcode == ZEND_ADD &&
+                       !may_overflow &&
+                       Z_MODE(op1_addr) == IS_REG &&
+                       Z_MODE(op2_addr) == IS_CONST_ZVAL) {
+               |       lea Ra(result_reg), [Ra(Z_REG(op1_addr))+Z_LVAL_P(Z_ZV(op2_addr))]
+       } else if (opcode == ZEND_ADD &&
+                       !may_overflow &&
+                       Z_MODE(op2_addr) == IS_REG &&
+                       Z_MODE(op1_addr) == IS_CONST_ZVAL) {
+               |       lea Ra(result_reg), [Ra(Z_REG(op2_addr))+Z_LVAL_P(Z_ZV(op1_addr))]
+       } else if (opcode == ZEND_SUB &&
+                       !may_overflow &&
+                       Z_MODE(op1_addr) == IS_REG &&
+                       Z_MODE(op2_addr) == IS_CONST_ZVAL) {
+               |       lea Ra(result_reg), [Ra(Z_REG(op1_addr))-Z_LVAL_P(Z_ZV(op2_addr))]
        } else {
                |       GET_ZVAL_LVAL result_reg, op1_addr
                if (same_ops && opcode != ZEND_DIV) {