@@ -6039,6 +6039,7 @@ static int zend_jit_simple_assign(dasm_State **Dst,
6039
6039
val_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R2, 0);
6040
6040
} else {
6041
6041
zend_jit_addr ref_addr;
6042
+ zend_reg type_reg = tmp_reg;
6042
6043
6043
6044
if (in_cold) {
6044
6045
| IF_NOT_ZVAL_TYPE val_addr, IS_REFERENCE, >1
@@ -6047,21 +6048,24 @@ static int zend_jit_simple_assign(dasm_State **Dst,
6047
6048
|.cold_code
6048
6049
|1:
6049
6050
}
6050
- if (Z_REG(val_addr) == ZREG_R2) {
6051
- | mov aword T1, r2 // save
6052
- }
6053
6051
| // zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
6054
6052
| GET_ZVAL_PTR r2, val_addr
6055
6053
| GC_DELREF r2
6056
6054
| // ZVAL_COPY_VALUE(return_value, &ref->value);
6057
6055
ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R2, 8);
6058
6056
if (!res_addr) {
6059
- | ZVAL_COPY_VALUE var_addr, var_info, ref_addr, val_info, ZREG_R2 , tmp_reg
6057
+ | ZVAL_COPY_VALUE var_addr, var_info, ref_addr, val_info, type_reg , tmp_reg
6060
6058
} else {
6061
- | ZVAL_COPY_VALUE_2 var_addr, var_info, res_addr, ref_addr, val_info, ZREG_R2 , tmp_reg
6059
+ | ZVAL_COPY_VALUE_2 var_addr, var_info, res_addr, ref_addr, val_info, type_reg , tmp_reg
6062
6060
}
6063
6061
| je >2
6064
- | IF_NOT_REFCOUNTED dh, >3
6062
+ if (tmp_reg == ZREG_R0) {
6063
+ | IF_NOT_REFCOUNTED ah, >3
6064
+ } else {
6065
+ | IF_NOT_FLAGS Rd(tmp_reg), IS_TYPE_REFCOUNTED, >3
6066
+ }
6067
+ | GET_ZVAL_PTR Ra(tmp_reg), var_addr
6068
+
6065
6069
if (!res_addr) {
6066
6070
| GC_ADDREF Ra(tmp_reg)
6067
6071
} else {
@@ -6070,17 +6074,19 @@ static int zend_jit_simple_assign(dasm_State **Dst,
6070
6074
| jmp >3
6071
6075
|2:
6072
6076
if (res_addr) {
6073
- | IF_NOT_REFCOUNTED dh, >2
6077
+ if (tmp_reg == ZREG_R0) {
6078
+ | IF_NOT_REFCOUNTED ah, >2
6079
+ } else {
6080
+ | IF_NOT_FLAGS Rd(tmp_reg), IS_TYPE_REFCOUNTED, >2
6081
+ }
6082
+ | GET_ZVAL_PTR Ra(tmp_reg), var_addr
6074
6083
| GC_ADDREF Ra(tmp_reg)
6075
6084
|2:
6076
6085
}
6077
- if (Z_REG(val_addr) == ZREG_R2) {
6078
- | mov r2, aword T1 // restore
6079
- }
6080
6086
if (save_r1) {
6081
6087
| mov aword T1, FCARG1a // save
6082
6088
}
6083
- | EFREE_REFERENCE aword [Ra(Z_REG(val_addr))+Z_OFFSET(val_addr)]
6089
+ | EFREE_REFERENCE r2
6084
6090
if (save_r1) {
6085
6091
| mov FCARG1a, aword T1 // restore
6086
6092
}
0 commit comments