]> granicus.if.org Git - php/commitdiff
Better instruction selection
authorDmitry Stogov <dmitry@zend.com>
Thu, 2 Jul 2020 20:41:15 +0000 (23:41 +0300)
committerDmitry Stogov <dmitry@zend.com>
Thu, 2 Jul 2020 20:41:15 +0000 (23:41 +0300)
ext/opcache/jit/zend_jit_x86.dasc

index 643a0f644a5d1898c6917d70ca5ba2a6765ea56b..f8b1f2145d02cfa11edf43f394053161e7292030 100644 (file)
@@ -1411,12 +1411,15 @@ static void* dasm_labels[zend_lb_MAX];
 
 |.macro SEPARATE_ARRAY, addr, op_info, cold
 ||     if (RC_MAY_BE_N(op_info)) {
-||             if (Z_REG(addr) == ZREG_FCARG1a) {
+||             if (Z_REG(addr) != ZREG_FP) {
 |                      GET_ZVAL_LVAL ZREG_R0, addr
 ||                     if (RC_MAY_BE_1(op_info)) {
 |                              cmp dword [r0], 1 // if (GC_REFCOUNT() > 1)
 |                              jbe >2
 ||                     }
+||                     if (Z_REG(addr) != ZREG_FCARG1a || Z_OFFSET(addr) != 0) {
+|                              LOAD_ZVAL_ADDR FCARG1a, addr
+||                     }
 |                      EXT_CALL zend_jit_zval_array_dup, r0
 |2:
 |                      mov FCARG1a, r0
@@ -11589,16 +11592,15 @@ static zend_bool zend_jit_fetch_reference(dasm_State **Dst, const zend_op *oplin
 
        |       IF_NOT_ZVAL_TYPE var_addr, IS_REFERENCE, &exit_addr
        |       GET_ZVAL_PTR FCARG1a, var_addr
-       |       add FCARG1a, offsetof(zend_reference, val)
 
-       var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1a, 0);
+       var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1a, offsetof(zend_reference, val));
        *var_addr_ptr = var_addr;
 
        var_type &= ~(IS_TRACE_REFERENCE|IS_TRACE_INDIRECT);
        if (add_type_guard
         && var_type != IS_UNKNOWN
         && (var_info & (MAY_BE_ANY|MAY_BE_UNDEF)) != (1 << var_type)) {
-               |       IF_NOT_Z_TYPE FCARG1a, var_type, &exit_addr
+               |       IF_NOT_ZVAL_TYPE var_addr, var_type, &exit_addr
 
                ZEND_ASSERT(var_info & (1 << var_type));
                if (var_type < IS_STRING) {