@@ -6107,6 +6107,7 @@ static int zend_jit_simple_assign(dasm_State **Dst,
6107
6107
val_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R2, 0);
6108
6108
} else {
6109
6109
zend_jit_addr ref_addr;
6110
+ zend_reg type_reg = tmp_reg;
6110
6111
6111
6112
if (in_cold) {
6112
6113
| IF_NOT_ZVAL_TYPE val_addr, IS_REFERENCE, >1
@@ -6115,21 +6116,24 @@ static int zend_jit_simple_assign(dasm_State **Dst,
6115
6116
|.cold_code
6116
6117
|1:
6117
6118
}
6118
- if (Z_REG(val_addr) == ZREG_R2) {
6119
- | mov aword T1, r2 // save
6120
- }
6121
6119
| // zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
6122
6120
| GET_ZVAL_PTR r2, val_addr
6123
6121
| GC_DELREF r2
6124
6122
| // ZVAL_COPY_VALUE(return_value, &ref->value);
6125
6123
ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R2, 8);
6126
6124
if (!res_addr) {
6127
- | ZVAL_COPY_VALUE var_addr, var_info, ref_addr, val_info, ZREG_R2 , tmp_reg
6125
+ | ZVAL_COPY_VALUE var_addr, var_info, ref_addr, val_info, type_reg , tmp_reg
6128
6126
} else {
6129
- | ZVAL_COPY_VALUE_2 var_addr, var_info, res_addr, ref_addr, val_info, ZREG_R2 , tmp_reg
6127
+ | ZVAL_COPY_VALUE_2 var_addr, var_info, res_addr, ref_addr, val_info, type_reg , tmp_reg
6130
6128
}
6131
6129
| je >2
6132
- | IF_NOT_REFCOUNTED dh, >3
6130
+ if (tmp_reg == ZREG_R0) {
6131
+ | IF_NOT_REFCOUNTED ah, >3
6132
+ } else {
6133
+ | IF_NOT_FLAGS Rd(tmp_reg), IS_TYPE_REFCOUNTED, >3
6134
+ }
6135
+ | GET_ZVAL_PTR Ra(tmp_reg), var_addr
6136
+
6133
6137
if (!res_addr) {
6134
6138
| GC_ADDREF Ra(tmp_reg)
6135
6139
} else {
@@ -6138,17 +6142,19 @@ static int zend_jit_simple_assign(dasm_State **Dst,
6138
6142
| jmp >3
6139
6143
|2:
6140
6144
if (res_addr) {
6141
- | IF_NOT_REFCOUNTED dh, >2
6145
+ if (tmp_reg == ZREG_R0) {
6146
+ | IF_NOT_REFCOUNTED ah, >2
6147
+ } else {
6148
+ | IF_NOT_FLAGS Rd(tmp_reg), IS_TYPE_REFCOUNTED, >2
6149
+ }
6150
+ | GET_ZVAL_PTR Ra(tmp_reg), var_addr
6142
6151
| GC_ADDREF Ra(tmp_reg)
6143
6152
|2:
6144
6153
}
6145
- if (Z_REG(val_addr) == ZREG_R2) {
6146
- | mov r2, aword T1 // restore
6147
- }
6148
6154
if (save_r1) {
6149
6155
| mov aword T1, FCARG1a // save
6150
6156
}
6151
- | EFREE_REFERENCE aword [Ra(Z_REG(val_addr))+Z_OFFSET(val_addr)]
6157
+ | EFREE_REFERENCE r2
6152
6158
if (save_r1) {
6153
6159
| mov FCARG1a, aword T1 // restore
6154
6160
}
0 commit comments