Skip to content

Commit 1684d27

Browse files
shqkingdstogov
authored andcommitted
Support failed JIT test case: assign_010.phpt
Following the previous patch, we continue to support failed JIT test cases involving reference. In assign_010.phpt, major changes are done to support the assignment "$a = $b" where "$b" is a reference. Honestly speaking, I didn't fully understand the syntax here but rather to translate the x86 implementation into AArch64. Besides, test case assign_011.phpt would pass as well with this patch.
1 parent 7976127 commit 1684d27

File tree

1 file changed

+115
-1
lines changed

1 file changed

+115
-1
lines changed

ext/opcache/jit/zend_jit_arm64.dasc

Lines changed: 115 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3176,7 +3176,39 @@ static int zend_jit_assign_to_typed_ref(dasm_State **Dst,
31763176
zend_jit_addr val_addr,
31773177
bool check_exception)
31783178
{
3179+
| // if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(variable_ptr)))) {
3180+
| ldr TMP1, [FCARG1x, #offsetof(zend_reference, sources.ptr)]
3181+
| cmp TMP1, #0
3182+
| bne >2
3183+
|.cold_code
3184+
|2:
31793185
| brk #0 // TODO
3186+
if (Z_MODE(val_addr) != IS_MEM_ZVAL || Z_REG(val_addr) != ZREG_FCARG2x || Z_OFFSET(val_addr) != 0) {
3187+
| LOAD_ZVAL_ADDR FCARG2x, val_addr
3188+
}
3189+
if (opline) {
3190+
| SET_EX_OPLINE opline, REG0
3191+
}
3192+
if (val_type == IS_CONST) {
3193+
| EXT_CALL zend_jit_assign_const_to_typed_ref, REG0
3194+
} else if (val_type == IS_TMP_VAR) {
3195+
| EXT_CALL zend_jit_assign_tmp_to_typed_ref, REG0
3196+
} else if (val_type == IS_VAR) {
3197+
| EXT_CALL zend_jit_assign_var_to_typed_ref, REG0
3198+
} else if (val_type == IS_CV) {
3199+
| EXT_CALL zend_jit_assign_cv_to_typed_ref, REG0
3200+
} else {
3201+
ZEND_UNREACHABLE();
3202+
}
3203+
if (check_exception) {
3204+
| // if (UNEXPECTED(EG(exception) != NULL)) {
3205+
| MEM_LOAD_CMP_ZTS ldr, xzr, executor_globals, exception, REG0, TMP1
3206+
| beq >8 // END OF zend_jit_assign_to_variable()
3207+
| b ->exception_handler
3208+
} else {
3209+
| b >8
3210+
}
3211+
|.code
31803212

31813213
return 1;
31823214
}
@@ -3214,7 +3246,89 @@ static int zend_jit_assign_to_variable(dasm_State **Dst,
32143246
int done = 0;
32153247
zend_reg ref_reg, tmp_reg;
32163248

3217-
| brk #0 // TODO
3249+
if (Z_MODE(var_addr) == IS_REG || Z_REG(var_use_addr) != ZREG_REG0) {
3250+
ref_reg = ZREG_FCARG1x;
3251+
tmp_reg = ZREG_REG0;
3252+
} else {
3253+
/* ASSIGN_DIM */
3254+
ref_reg = ZREG_REG0;
3255+
tmp_reg = ZREG_FCARG1x;
3256+
}
3257+
3258+
if (var_info & MAY_BE_REF) {
3259+
if (Z_MODE(var_use_addr) != IS_MEM_ZVAL || Z_REG(var_use_addr) != ref_reg || Z_OFFSET(var_use_addr) != 0) {
3260+
| LOAD_ZVAL_ADDR Rx(ref_reg), var_use_addr
3261+
var_addr = var_use_addr = ZEND_ADDR_MEM_ZVAL(ref_reg, 0);
3262+
}
3263+
| // if (Z_ISREF_P(variable_ptr)) {
3264+
| IF_NOT_Z_TYPE Rx(ref_reg), IS_REFERENCE, >1, TMP1w
3265+
| // if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(variable_ptr)))) {
3266+
| GET_Z_PTR FCARG1x, Rx(ref_reg)
3267+
if (!zend_jit_assign_to_typed_ref(Dst, opline, val_type, val_addr, check_exception)) {
3268+
return 0;
3269+
}
3270+
| add Rx(ref_reg), FCARG1x, #offsetof(zend_reference, val)
3271+
|1:
3272+
}
3273+
if (var_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) {
3274+
if (RC_MAY_BE_1(var_info)) {
3275+
int in_cold = 0;
3276+
3277+
if (var_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_OBJECT|MAY_BE_RESOURCE))) {
3278+
| IF_ZVAL_REFCOUNTED var_use_addr, >1, TMP1w, TMP2
3279+
|.cold_code
3280+
|1:
3281+
| brk #0 // TODO
3282+
in_cold = 1;
3283+
}
3284+
if (Z_REG(var_use_addr) == ZREG_FCARG1x || Z_REG(var_use_addr) == ZREG_REG0) {
3285+
bool keep_gc = 0;
3286+
3287+
| brk #0 // TODO
3288+
} else {
3289+
| brk #0 // TODO
3290+
| GET_ZVAL_PTR FCARG1x, var_use_addr, TMP1
3291+
if (!zend_jit_simple_assign(Dst, opline, var_addr, var_info, var_def_info, val_type, val_addr, val_info, res_addr, in_cold, 1)) {
3292+
return 0;
3293+
}
3294+
}
3295+
| GC_DELREF FCARG1x, TMP1w
3296+
if (RC_MAY_BE_N(var_info) && (var_info & (MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0) {
3297+
| brk #0 // TODO
3298+
} else {
3299+
| brk #0 // TODO
3300+
}
3301+
| ZVAL_DTOR_FUNC var_info, opline, TMP1
3302+
if (in_cold || (RC_MAY_BE_N(var_info) && (var_info & (MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0)) {
3303+
if (check_exception) {
3304+
| brk #0 // TODO
3305+
} else {
3306+
| brk #0 // TODO
3307+
}
3308+
}
3309+
if (RC_MAY_BE_N(var_info) && (var_info & (MAY_BE_ARRAY|MAY_BE_OBJECT)) != 0) {
3310+
|4:
3311+
| brk #0 // TODO
3312+
if (in_cold) {
3313+
| brk #0 // TODO
3314+
}
3315+
}
3316+
if (in_cold) {
3317+
|.code
3318+
} else {
3319+
done = 1;
3320+
}
3321+
} else /* if (RC_MAY_BE_N(var_info)) */ {
3322+
| brk #0
3323+
}
3324+
}
3325+
3326+
if (!done && !zend_jit_simple_assign(Dst, opline, var_addr, var_info, var_def_info, val_type, val_addr, val_info, res_addr, 0, 0)) {
3327+
return 0;
3328+
}
3329+
3330+
|8:
3331+
32183332
return 1;
32193333
}
32203334

0 commit comments

Comments
 (0)