]> granicus.if.org Git - php/commitdiff
Improved JIT for SEPARATE_ARRAY
authorDmitry Stogov <dmitry@zend.com>
Wed, 17 Jun 2020 11:45:25 +0000 (14:45 +0300)
committerDmitry Stogov <dmitry@zend.com>
Wed, 17 Jun 2020 11:45:25 +0000 (14:45 +0300)
ext/opcache/jit/zend_jit_disasm_x86.c
ext/opcache/jit/zend_jit_helpers.c
ext/opcache/jit/zend_jit_x86.dasc

index 1d718b7bd2d5c6c0d5d361d6f45f446aed55ec67..ccabb564c9feaa9e09f33abc96b3089d4c6038d7 100644 (file)
@@ -454,6 +454,7 @@ static int zend_jit_disasm_init(void)
        REGISTER_HELPER(zend_jit_hot_func);
        REGISTER_HELPER(zend_jit_check_constant);
        REGISTER_HELPER(zend_jit_array_free);
+       REGISTER_HELPER(zend_jit_zval_array_dup);
 #undef  REGISTER_HELPER
 
 #ifndef _WIN32
index 83cd44a554eec7099821b659c02d1d70fb9ac810..99b3f8817d567626fa142f7f7f14f76474c047f4 100644 (file)
@@ -1558,3 +1558,12 @@ static void ZEND_FASTCALL zend_jit_array_free(HashTable *ht)
        }
        FREE_HASHTABLE(ht);
 }
+
+static HashTable *ZEND_FASTCALL zend_jit_zval_array_dup(zval *arr)
+{
+       HashTable *ht = Z_ARRVAL_P(arr);
+
+       ht = zend_array_dup(ht);
+       ZVAL_ARR(arr, ht);
+       return ht;
+}
index 6c7eb925638718158238049f20da20f9872c9feb..d0be13b10846f2352c9d49eb97d07f3c0fe557d4 100644 (file)
@@ -1416,7 +1416,7 @@ static void* dasm_labels[zend_lb_MAX];
 ||             tmp_reg = (Z_REG(addr) == ZREG_FCARG1a) ? ZREG_R0 : ZREG_FCARG1a;
 |              GET_ZVAL_LVAL tmp_reg, addr
 ||             if (RC_MAY_BE_1(op_info)) {
-|                      cmp dword [Ra(tmp_reg)], 1 // if (GC_REFCOUNTED() > 1)
+|                      cmp dword [Ra(tmp_reg)], 1 // if (GC_REFCOUNT() > 1)
 ||                     if (cold) {
 |                              ja >1
 |.cold_code
@@ -1429,13 +1429,12 @@ static void* dasm_labels[zend_lb_MAX];
 |              GC_DELREF Ra(tmp_reg)
 |1:
 ||             if (Z_REG(addr) == ZREG_FCARG1a) {
-|                      mov aword T1, FCARG1a // save
-||             } else {
-|                      LOAD_ZVAL_ADDR FCARG1a, addr
-||             }
-|              EXT_CALL zval_copy_ctor_func, r0
-||             if (Z_REG(addr) == ZREG_FCARG1a) {
-|                      mov FCARG1a, aword T1 // restore
+|                      EXT_CALL zend_jit_zval_array_dup, r0
+||      } else {
+|                      EXT_CALL zend_array_dup, r0
+|                      SET_ZVAL_PTR addr, r0
+|                      SET_ZVAL_TYPE_INFO addr, IS_ARRAY_EX
+|                      mov FCARG1a, r0
 ||             }
 ||             if (RC_MAY_BE_1(op_info)) {
 ||                     if (cold) {
@@ -1444,8 +1443,12 @@ static void* dasm_labels[zend_lb_MAX];
 ||                     }
 ||             }
 |2:
-||     }
+||             if (Z_REG(addr) == ZREG_FCARG1a) {
+|                      mov FCARG1a, r0
+||             }
+||     } else {
 |              GET_ZVAL_LVAL ZREG_FCARG1a, addr
+||     }
 |.endmacro
 
 |.macro EFREE_REG_24, op_array, opline