@@ -11022,21 +11022,6 @@ static int zend_jit_return(dasm_State **Dst, const zend_op *opline, const zend_o
11022
11022
return_value_used = -1;
11023
11023
}
11024
11024
11025
- if (ZEND_OBSERVER_ENABLED) {
11026
- if (Z_MODE(op1_addr) == IS_REG) {
11027
- zend_jit_addr dst = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var);
11028
-
11029
- if (!zend_jit_spill_store(Dst, op1_addr, dst, op1_info, 1)) {
11030
- return 0;
11031
- }
11032
- op1_addr = dst;
11033
- }
11034
- | LOAD_ZVAL_ADDR FCARG2x, op1_addr
11035
- | mov FCARG1x, FP
11036
- | SET_EX_OPLINE opline, REG0
11037
- | EXT_CALL zend_observer_fcall_end, REG0
11038
- }
11039
-
11040
11025
// if (!EX(return_value))
11041
11026
if (Z_MODE(op1_addr) == IS_REG && Z_REG(op1_addr) == ZREG_REG1) {
11042
11027
if (return_value_used != 0) {
@@ -11095,77 +11080,88 @@ static int zend_jit_return(dasm_State **Dst, const zend_op *opline, const zend_o
11095
11080
}
11096
11081
}
11097
11082
11098
- if (return_value_used == 0) {
11099
- |9:
11100
- return 1;
11101
- }
11102
-
11103
- if (opline->op1_type == IS_CONST) {
11104
- zval *zv = RT_CONSTANT(opline, opline->op1);
11105
- | ZVAL_COPY_CONST ret_addr, MAY_BE_ANY, MAY_BE_ANY, zv, ZREG_REG0, ZREG_TMP1, ZREG_FPR0
11106
- if (Z_REFCOUNTED_P(zv)) {
11107
- | ADDREF_CONST zv, REG0, TMP1
11108
- }
11109
- } else if (opline->op1_type == IS_TMP_VAR) {
11110
- | ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_REG0, ZREG_REG2, ZREG_TMP1, ZREG_TMP2, ZREG_FPR0
11111
- } else if (opline->op1_type == IS_CV) {
11112
- if (op1_info & MAY_BE_REF) {
11113
- | LOAD_ZVAL_ADDR REG0, op1_addr
11114
- | ZVAL_DEREF REG0, op1_info, TMP1w
11115
- op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_REG0, 0);
11116
- }
11117
- | ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_REG0, ZREG_REG2, ZREG_TMP1, ZREG_TMP2, ZREG_FPR0
11118
- if (op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) {
11119
- if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE ||
11120
- (op1_info & (MAY_BE_REF|MAY_BE_OBJECT)) ||
11121
- !op_array->function_name) {
11122
- | TRY_ADDREF op1_info, REG0w, REG2, TMP1w
11123
- } else if (return_value_used != 1) {
11124
- | // if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) ZVAL_NULL(retval_ptr);
11125
- | SET_ZVAL_TYPE_INFO op1_addr, IS_NULL, TMP1w, TMP2
11083
+ if (return_value_used != 0) {
11084
+ if (opline->op1_type == IS_CONST) {
11085
+ zval *zv = RT_CONSTANT(opline, opline->op1);
11086
+ | ZVAL_COPY_CONST ret_addr, MAY_BE_ANY, MAY_BE_ANY, zv, ZREG_REG0, ZREG_TMP1, ZREG_FPR0
11087
+ if (Z_REFCOUNTED_P(zv)) {
11088
+ | ADDREF_CONST zv, REG0, TMP1
11126
11089
}
11127
- }
11128
- } else {
11129
- if (op1_info & MAY_BE_REF) {
11130
- zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_REG0, offsetof(zend_reference, val));
11131
-
11132
- | IF_ZVAL_TYPE op1_addr, IS_REFERENCE, >1, ZREG_TMP1
11133
- |.cold_code
11134
- |1:
11135
- | // zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
11136
- | GET_ZVAL_PTR REG0, op1_addr, TMP1
11137
- | // ZVAL_COPY_VALUE(return_value, &ref->value);
11138
- | ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, ref_addr, op1_info, ZREG_REG2, ZREG_REG2, ZREG_TMP1, ZREG_TMP2, ZREG_FPR0
11139
- | GC_DELREF REG0, TMP1w
11140
- | beq >2
11141
- | // if (IS_REFCOUNTED())
11142
- if (jit_return_label >= 0) {
11143
- | IF_NOT_REFCOUNTED REG2w, =>jit_return_label, TMP1w
11144
- } else {
11145
- | IF_NOT_REFCOUNTED REG2w, >9, TMP1w
11090
+ } else if (opline->op1_type == IS_TMP_VAR) {
11091
+ | ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_REG0, ZREG_REG2, ZREG_TMP1, ZREG_TMP2, ZREG_FPR0
11092
+ } else if (opline->op1_type == IS_CV) {
11093
+ if (op1_info & MAY_BE_REF) {
11094
+ | LOAD_ZVAL_ADDR REG0, op1_addr
11095
+ | ZVAL_DEREF REG0, op1_info, TMP1w
11096
+ op1_addr = ZEND_ADDR_MEM_ZVAL(ZREG_REG0, 0);
11146
11097
}
11147
- | // ADDREF
11148
- | GET_ZVAL_PTR REG2, ret_addr, TMP1 // reload
11149
- | GC_ADDREF REG2, TMP1w
11150
- if (jit_return_label >= 0) {
11151
- | b =>jit_return_label
11152
- } else {
11153
- | b >9
11098
+ | ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_REG0, ZREG_REG2, ZREG_TMP1, ZREG_TMP2, ZREG_FPR0
11099
+ if (op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) {
11100
+ if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE ||
11101
+ (op1_info & (MAY_BE_REF|MAY_BE_OBJECT)) ||
11102
+ !op_array->function_name) {
11103
+ | TRY_ADDREF op1_info, REG0w, REG2, TMP1w
11104
+ } else if (return_value_used != 1) {
11105
+ | // if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) ZVAL_NULL(retval_ptr);
11106
+ | SET_ZVAL_TYPE_INFO op1_addr, IS_NULL, TMP1w, TMP2
11107
+ }
11154
11108
}
11155
- |2:
11156
- | mov FCARG1x, REG0
11157
- | EFREE_REFERENCE
11158
- if (jit_return_label >= 0) {
11159
- | b =>jit_return_label
11160
- } else {
11161
- | b >9
11109
+ } else {
11110
+ if (op1_info & MAY_BE_REF) {
11111
+ zend_jit_addr ref_addr = ZEND_ADDR_MEM_ZVAL(ZREG_REG0, offsetof(zend_reference, val));
11112
+
11113
+ | IF_ZVAL_TYPE op1_addr, IS_REFERENCE, >1, ZREG_TMP1
11114
+ |.cold_code
11115
+ |1:
11116
+ | // zend_refcounted *ref = Z_COUNTED_P(retval_ptr);
11117
+ | GET_ZVAL_PTR REG0, op1_addr, TMP1
11118
+ | // ZVAL_COPY_VALUE(return_value, &ref->value);
11119
+ | ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, ref_addr, op1_info, ZREG_REG2, ZREG_REG2, ZREG_TMP1, ZREG_TMP2, ZREG_FPR0
11120
+ | GC_DELREF REG0, TMP1w
11121
+ | beq >2
11122
+ | // if (IS_REFCOUNTED())
11123
+ if (jit_return_label >= 0) {
11124
+ | IF_NOT_REFCOUNTED REG2w, =>jit_return_label, TMP1w
11125
+ } else {
11126
+ | IF_NOT_REFCOUNTED REG2w, >9, TMP1w
11127
+ }
11128
+ | // ADDREF
11129
+ | GET_ZVAL_PTR REG2, ret_addr, TMP1 // reload
11130
+ | GC_ADDREF REG2, TMP1w
11131
+ if (jit_return_label >= 0) {
11132
+ | b =>jit_return_label
11133
+ } else {
11134
+ | b >9
11135
+ }
11136
+ |2:
11137
+ | mov FCARG1x, REG0
11138
+ | EFREE_REFERENCE
11139
+ if (jit_return_label >= 0) {
11140
+ | b =>jit_return_label
11141
+ } else {
11142
+ | b >9
11143
+ }
11144
+ |.code
11162
11145
}
11163
- |.code
11146
+ | ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_REG0, ZREG_REG2, ZREG_TMP1, ZREG_TMP2, ZREG_FPR0
11164
11147
}
11165
- | ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_REG0, ZREG_REG2, ZREG_TMP1, ZREG_TMP2, ZREG_FPR0
11166
11148
}
11167
-
11149
+
11168
11150
|9:
11151
+ if (ZEND_OBSERVER_ENABLED) {
11152
+ if (Z_MODE(op1_addr) == IS_REG) {
11153
+ zend_jit_addr dst = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var);
11154
+
11155
+ if (!zend_jit_spill_store(Dst, op1_addr, dst, op1_info, 1)) {
11156
+ return 0;
11157
+ }
11158
+ op1_addr = dst;
11159
+ }
11160
+ | LOAD_ZVAL_ADDR FCARG2x, op1_addr
11161
+ | mov FCARG1x, FP
11162
+ | SET_EX_OPLINE opline, REG0
11163
+ | EXT_CALL zend_observer_fcall_end, REG0
11164
+ }
11169
11165
return 1;
11170
11166
}
11171
11167
0 commit comments