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