Skip to content

Commit 6ae4196

Browse files
shqkingdstogov
authored andcommitted
Support failed JIT test case: fetch_dim_rw_001.phpt
Opcode FETCH_DIM_RW is not touched before and the udpates in function zend_jit_fetch_dim() and zend_jit_fetch_dimension_address_inner() are made to support it. Besides, one new path is covered in function zend_jit_return() when leaving.
1 parent aad06e3 commit 6ae4196

File tree

1 file changed

+58
-5
lines changed

1 file changed

+58
-5
lines changed

ext/opcache/jit/zend_jit_arm64.dasc

Lines changed: 58 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3302,7 +3302,20 @@ static int zend_jit_fetch_dimension_address_inner(dasm_State **Dst, const zend_o
33023302
case BP_VAR_IS:
33033303
case BP_VAR_UNSET:
33043304
if (packed_loaded) {
3305-
| brk #0 // TODO
3305+
if (op1_info & MAY_BE_ARRAY_HASH) {
3306+
| IF_NOT_Z_TYPE REG0, IS_UNDEF, >8, TMP1w
3307+
} else if (JIT_G(trigger) == ZEND_JIT_ON_HOT_TRACE && type == BP_VAR_R) {
3308+
/* perform IS_UNDEF check only after result type guard (during deoptimization) */
3309+
if (!found_exit_addr || (op1_info & MAY_BE_ARRAY_HASH)) {
3310+
| brk #0 // TODO
3311+
}
3312+
} else if (type == BP_VAR_IS && not_found_exit_addr) {
3313+
| brk #0 // TODO
3314+
} else if (type == BP_VAR_IS && found_exit_addr) {
3315+
| brk #0 // TODO
3316+
} else {
3317+
| brk #0 // TODO
3318+
}
33063319
}
33073320
if (!(op1_info & MAY_BE_ARRAY_KEY_LONG) || (packed_loaded && (op1_info & MAY_BE_ARRAY_HASH))) {
33083321
| brk #0 // TODO
@@ -3331,7 +3344,19 @@ static int zend_jit_fetch_dimension_address_inner(dasm_State **Dst, const zend_o
33313344
|.code
33323345
break;
33333346
case BP_VAR_RW:
3334-
| brk #0 // TODO
3347+
if (packed_loaded) {
3348+
| brk #0 // TODO
3349+
}
3350+
|2:
3351+
|4:
3352+
if (!op2_loaded) {
3353+
| // hval = Z_LVAL_P(dim);
3354+
| GET_ZVAL_LVAL ZREG_FCARG2x, op2_addr, TMP1
3355+
}
3356+
| SET_EX_OPLINE opline, REG0
3357+
| EXT_CALL zend_jit_hash_index_lookup_rw, REG0
3358+
| mov REG0, RETVALx
3359+
| cbz REG0, >9
33353360
break;
33363361
case BP_VAR_W:
33373362
if (packed_loaded) {
@@ -6073,7 +6098,28 @@ static int zend_jit_return(dasm_State **Dst, const zend_op *opline, const zend_o
60736098
}
60746099
if ((opline->op1_type & (IS_VAR|IS_TMP_VAR)) &&
60756100
(op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) {
6076-
| brk #0 // TODO: test
6101+
if (return_value_used == -1) {
6102+
| beq >1
6103+
|.cold_code
6104+
|1:
6105+
}
6106+
if (return_value_used != 1) {
6107+
if (op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) {
6108+
| brk #0 // TODO
6109+
}
6110+
| brk #0 // TODO
6111+
if (RC_MAY_BE_1(op1_info)) {
6112+
| brk #0 // TODO
6113+
}
6114+
if (return_value_used == -1) {
6115+
if (jit_return_label >= 0) {
6116+
| brk #0 // TODO
6117+
} else {
6118+
| brk #0 // TODO
6119+
}
6120+
|.code
6121+
}
6122+
}
60776123
} else if (return_value_used == -1) {
60786124
if (jit_return_label >= 0) {
60796125
| brk #0 // TODO: test
@@ -6095,7 +6141,7 @@ static int zend_jit_return(dasm_State **Dst, const zend_op *opline, const zend_o
60956141
| brk #0 // TODO: test
60966142
}
60976143
} else if (opline->op1_type == IS_TMP_VAR) {
6098-
| brk #0 // TODO
6144+
| ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_REG0, ZREG_REG2, ZREG_TMP1, ZREG_TMP2, ZREG_FPR0
60996145
} else if (opline->op1_type == IS_CV) {
61006146
if (op1_info & MAY_BE_REF) {
61016147
| brk #0 // TODO
@@ -6359,7 +6405,14 @@ static int zend_jit_fetch_dim(dasm_State **Dst,
63596405
}
63606406
if ((op1_info & MAY_BE_UNDEF)
63616407
&& opline->opcode == ZEND_FETCH_DIM_RW) {
6362-
| brk #0 // TODO
6408+
if (op1_info & (MAY_BE_NULL|MAY_BE_FALSE)) {
6409+
| brk #0 // TODO
6410+
| IF_NOT_ZVAL_TYPE op1_addr, IS_UNDEF, >1, TMP1w, TMP2
6411+
}
6412+
| SET_EX_OPLINE opline, REG0
6413+
| LOAD_32BIT_VAL FCARG1w, opline->op1.var
6414+
| EXT_CALL zend_jit_undefined_op_helper, REG0
6415+
|1:
63636416
}
63646417
| // ZVAL_ARR(container, zend_new_array(8));
63656418
if (Z_REG(op1_addr) != ZREG_FP) {

0 commit comments

Comments
 (0)