Skip to content

Commit 3d35ac0

Browse files
committed
JIT: Use zend_compare() instead of comapre_function()
1 parent 7be7ec3 commit 3d35ac0

File tree

2 files changed

+48
-52
lines changed

2 files changed

+48
-52
lines changed

ext/opcache/jit/zend_jit_arm64.dasc

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7016,7 +7016,7 @@ static int zend_jit_cmp_double_double(dasm_State **Dst, const zend_op *opline, z
70167016

70177017
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)
70187018
{
7019-
| LONG_CMP_WITH_CONST res_addr, Z_L(0), TMP1, TMP2
7019+
| tst RETVALw, RETVALw
70207020
if (smart_branch_opcode) {
70217021
if (smart_branch_opcode == ZEND_JMPZ_EX ||
70227022
smart_branch_opcode == ZEND_JMPNZ_EX) {
@@ -7333,36 +7333,43 @@ static int zend_jit_cmp(dasm_State **Dst,
73337333
}
73347334
op2_addr = real_addr;
73357335
}
7336-
| LOAD_ZVAL_ADDR FCARG2x, op1_addr
7336+
| LOAD_ZVAL_ADDR FCARG1x, op1_addr
73377337
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
73397339
| LOAD_32BIT_VAL FCARG1x, opline->op1.var
73407340
| 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
73427342
|1:
73437343
}
73447344
if (opline->op2_type == IS_CV && (op2_info & MAY_BE_UNDEF)) {
73457345
| IF_NOT_ZVAL_TYPE op2_addr, IS_UNDEF, >1, ZREG_TMP1
7346-
| str FCARG2x, T1 // save
7346+
| str FCARG1x, T1 // save
73477347
| LOAD_32BIT_VAL FCARG1x, opline->op2.var
73487348
| 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
73517351
| b >2
73527352
|1:
7353-
| LOAD_ZVAL_ADDR CARG3, op2_addr
7353+
| LOAD_ZVAL_ADDR FCARG2x, op2_addr
73547354
|2:
73557355
} 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
73627357
}
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
73667373
}
73677374
if (!zend_jit_cmp_slow(Dst, opline, res_addr, smart_branch_opcode, target_label, target_label2, exit_addr)) {
73687375
return 0;

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 24 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -7549,7 +7549,7 @@ static int zend_jit_cmp_double_double(dasm_State **Dst, const zend_op *opline, z
75497549

75507550
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)
75517551
{
7552-
| LONG_OP_WITH_CONST cmp, res_addr, Z_L(0)
7552+
| test, eax, eax
75537553
if (smart_branch_opcode) {
75547554
if (smart_branch_opcode == ZEND_JMPZ_EX ||
75557555
smart_branch_opcode == ZEND_JMPNZ_EX) {
@@ -7868,54 +7868,43 @@ static int zend_jit_cmp(dasm_State **Dst,
78687868
}
78697869
op2_addr = real_addr;
78707870
}
7871-
| LOAD_ZVAL_ADDR FCARG2a, op1_addr
7871+
| LOAD_ZVAL_ADDR FCARG1a, op1_addr
78727872
if (opline->op1_type == IS_CV && (op1_info & MAY_BE_UNDEF)) {
7873-
| IF_NOT_Z_TYPE FCARG2a, IS_UNDEF, >1
7873+
| IF_NOT_Z_TYPE FCARG1a, IS_UNDEF, >1
78747874
| mov FCARG1a, opline->op1.var
78757875
| EXT_CALL zend_jit_undefined_op_helper, r0
7876-
| LOAD_ADDR_ZTS FCARG2a, executor_globals, uninitialized_zval
7876+
| LOAD_ADDR_ZTS FCARG1a, executor_globals, uninitialized_zval
78777877
|1:
78787878
}
78797879
if (opline->op2_type == IS_CV && (op2_info & MAY_BE_UNDEF)) {
78807880
| IF_NOT_ZVAL_TYPE op2_addr, IS_UNDEF, >1
7881-
| mov T1, FCARG2a // save
7881+
| mov T1, FCARG1a // save
78827882
| mov FCARG1a, opline->op2.var
78837883
| EXT_CALL zend_jit_undefined_op_helper, r0
7884-
| mov FCARG2a, T1 // restore
7885-
|.if X64
7886-
| LOAD_ADDR_ZTS CARG3, executor_globals, uninitialized_zval
7887-
|.else
7888-
| sub r4, 12
7889-
| PUSH_ADDR_ZTS executor_globals, uninitialized_zval, r0
7890-
|.endif
7884+
| mov FCARG1a, T1 // restore
7885+
| LOAD_ADDR_ZTS FCARG2a, executor_globals, uninitialized_zval
78917886
| jmp >2
78927887
|1:
7893-
|.if X64
7894-
| LOAD_ZVAL_ADDR CARG3, op2_addr
7895-
|.else
7896-
| sub r4, 12
7897-
| PUSH_ZVAL_ADDR op2_addr, r0
7898-
|.endif
7888+
| LOAD_ZVAL_ADDR FCARG2a, op2_addr
78997889
|2:
79007890
} else {
7901-
|.if X64
7902-
| LOAD_ZVAL_ADDR CARG3, op2_addr
7903-
|.else
7904-
| sub r4, 12
7905-
| PUSH_ZVAL_ADDR op2_addr, r0
7906-
|.endif
7907-
}
7908-
| LOAD_ZVAL_ADDR FCARG1a, res_addr
7909-
| EXT_CALL compare_function, r0
7910-
|.if not(X64)
7911-
| add r4, 12
7912-
|.endif
7913-
if (opline->opcode != ZEND_CASE) {
7914-
| FREE_OP opline->op1_type, opline->op1, op1_info, 0, opline
7891+
| LOAD_ZVAL_ADDR FCARG2a, op2_addr
79157892
}
7916-
| FREE_OP opline->op2_type, opline->op2, op2_info, 0, opline
7917-
if (may_throw) {
7918-
zend_jit_check_exception_undef_result(Dst, opline);
7893+
| EXT_CALL zend_compare, r0
7894+
if ((opline->opcode != ZEND_CASE &&
7895+
(opline->op1_type & (IS_VAR|IS_TMP_VAR)) &&
7896+
(op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF))) ||
7897+
((opline->op2_type & (IS_VAR|IS_TMP_VAR)) &&
7898+
(op2_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)))) {
7899+
| mov dword T1, eax // save
7900+
if (opline->opcode != ZEND_CASE) {
7901+
| FREE_OP opline->op1_type, opline->op1, op1_info, 0, opline
7902+
}
7903+
| FREE_OP opline->op2_type, opline->op2, op2_info, 0, opline
7904+
if (may_throw) {
7905+
zend_jit_check_exception_undef_result(Dst, opline);
7906+
}
7907+
| mov eax, dword T1 // restore
79197908
}
79207909
if (!zend_jit_cmp_slow(Dst, opline, res_addr, smart_branch_opcode, target_label, target_label2, exit_addr)) {
79217910
return 0;

0 commit comments

Comments
 (0)