@@ -7016,7 +7016,7 @@ static int zend_jit_cmp_double_double(dasm_State **Dst, const zend_op *opline, z
7016
7016
7017
7017
static int zend_jit_cmp_slow(dasm_State **Dst, const zend_op *opline, zend_jit_addr res_addr, zend_uchar smart_branch_opcode, uint32_t target_label, uint32_t target_label2, const void *exit_addr)
7018
7018
{
7019
- | LONG_CMP_WITH_CONST res_addr, Z_L(0), TMP1, TMP2
7019
+ | tst RETVALw, RETVALw
7020
7020
if (smart_branch_opcode) {
7021
7021
if (smart_branch_opcode == ZEND_JMPZ_EX ||
7022
7022
smart_branch_opcode == ZEND_JMPNZ_EX) {
@@ -7333,36 +7333,43 @@ static int zend_jit_cmp(dasm_State **Dst,
7333
7333
}
7334
7334
op2_addr = real_addr;
7335
7335
}
7336
- | LOAD_ZVAL_ADDR FCARG2x , op1_addr
7336
+ | LOAD_ZVAL_ADDR FCARG1x , op1_addr
7337
7337
if (opline->op1_type == IS_CV && (op1_info & MAY_BE_UNDEF)) {
7338
- | IF_NOT_Z_TYPE FCARG2x , IS_UNDEF, >1, TMP1w
7338
+ | IF_NOT_Z_TYPE FCARG1x , IS_UNDEF, >1, TMP1w
7339
7339
| LOAD_32BIT_VAL FCARG1x, opline->op1.var
7340
7340
| EXT_CALL zend_jit_undefined_op_helper, REG0
7341
- | LOAD_ADDR_ZTS FCARG2x , executor_globals, uninitialized_zval
7341
+ | LOAD_ADDR_ZTS FCARG1x , executor_globals, uninitialized_zval
7342
7342
|1:
7343
7343
}
7344
7344
if (opline->op2_type == IS_CV && (op2_info & MAY_BE_UNDEF)) {
7345
7345
| IF_NOT_ZVAL_TYPE op2_addr, IS_UNDEF, >1, ZREG_TMP1
7346
- | str FCARG2x , T1 // save
7346
+ | str FCARG1x , T1 // save
7347
7347
| LOAD_32BIT_VAL FCARG1x, opline->op2.var
7348
7348
| EXT_CALL zend_jit_undefined_op_helper, REG0
7349
- | ldr FCARG2x , T1 // restore
7350
- | LOAD_ADDR_ZTS CARG3 , executor_globals, uninitialized_zval
7349
+ | ldr FCARG1x , T1 // restore
7350
+ | LOAD_ADDR_ZTS FCARG2x , executor_globals, uninitialized_zval
7351
7351
| b >2
7352
7352
|1:
7353
- | LOAD_ZVAL_ADDR CARG3 , op2_addr
7353
+ | LOAD_ZVAL_ADDR FCARG2x , op2_addr
7354
7354
|2:
7355
7355
} else {
7356
- | LOAD_ZVAL_ADDR CARG3, op2_addr
7357
- }
7358
- | LOAD_ZVAL_ADDR FCARG1x, res_addr
7359
- | EXT_CALL compare_function, REG0
7360
- if (opline->opcode != ZEND_CASE) {
7361
- | FREE_OP opline->op1_type, opline->op1, op1_info, 0, opline, ZREG_TMP1, ZREG_TMP2
7356
+ | LOAD_ZVAL_ADDR FCARG2x, op2_addr
7362
7357
}
7363
- | FREE_OP opline->op2_type, opline->op2, op2_info, 0, opline, ZREG_TMP1, ZREG_TMP2
7364
- if (may_throw) {
7365
- zend_jit_check_exception_undef_result(Dst, opline);
7358
+ | EXT_CALL zend_compare, REG0
7359
+ if ((opline->opcode != ZEND_CASE &&
7360
+ (opline->op1_type & (IS_VAR|IS_TMP_VAR)) &&
7361
+ (op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) ||
7362
+ ((opline->op2_type & (IS_VAR|IS_TMP_VAR)) &&
7363
+ (op2_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)))) {
7364
+ | str RETVALw, T1 // save
7365
+ if (opline->opcode != ZEND_CASE) {
7366
+ | FREE_OP opline->op1_type, opline->op1, op1_info, 0, opline, ZREG_TMP1, ZREG_TMP2
7367
+ }
7368
+ | FREE_OP opline->op2_type, opline->op2, op2_info, 0, opline, ZREG_TMP1, ZREG_TMP2
7369
+ if (may_throw) {
7370
+ zend_jit_check_exception_undef_result(Dst, opline);
7371
+ }
7372
+ | ldr RETVALw, T1 // restore
7366
7373
}
7367
7374
if (!zend_jit_cmp_slow(Dst, opline, res_addr, smart_branch_opcode, target_label, target_label2, exit_addr)) {
7368
7375
return 0;
0 commit comments