@@ -2295,7 +2295,8 @@ static int zend_jit_check_exception(dasm_State **Dst)
2295
2295
static int zend_jit_check_exception_undef_result(dasm_State **Dst, const zend_op *opline)
2296
2296
{
2297
2297
if (opline->result_type & (IS_TMP_VAR|IS_VAR)) {
2298
- | brk #0 // TODO
2298
+ | MEM_LOAD_CMP_ZTS ldr, xzr, executor_globals, exception, REG0, TMP1
2299
+ | bne ->exception_handler_undef
2299
2300
return 1;
2300
2301
}
2301
2302
return zend_jit_check_exception(Dst);
@@ -3274,7 +3275,6 @@ static int zend_jit_long_math_helper(dasm_State **Dst,
3274
3275
zval tmp;
3275
3276
3276
3277
if (op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_LONG)) {
3277
- | brk #0 // TODO
3278
3278
| IF_NOT_ZVAL_TYPE op1_addr, IS_LONG, >6, TMP1w, TMP2
3279
3279
}
3280
3280
if (!same_ops && (op2_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-MAY_BE_LONG))) {
@@ -5008,7 +5008,46 @@ static int zend_jit_cmp_double_double(dasm_State **Dst, const zend_op *opline, z
5008
5008
5009
5009
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)
5010
5010
{
5011
- | brk #0 // TODO
5011
+ | LONG_CMP_WITH_CONST cmp, res_addr, Z_L(0), TMP1, TMP2
5012
+ if (smart_branch_opcode) {
5013
+ if (smart_branch_opcode == ZEND_JMPZ_EX ||
5014
+ smart_branch_opcode == ZEND_JMPNZ_EX) {
5015
+ | brk #0 // TODO
5016
+ }
5017
+ if (smart_branch_opcode == ZEND_JMPZ ||
5018
+ smart_branch_opcode == ZEND_JMPZ_EX) {
5019
+ switch (opline->opcode) {
5020
+ case ZEND_IS_EQUAL:
5021
+ case ZEND_CASE:
5022
+ if (exit_addr) {
5023
+ | brk #0 // TODO
5024
+ } else {
5025
+ | bne => target_label
5026
+ }
5027
+ break;
5028
+ case ZEND_IS_NOT_EQUAL:
5029
+ | brk #0 // TODO
5030
+ break;
5031
+ case ZEND_IS_SMALLER:
5032
+ | brk #0 // TODO
5033
+ break;
5034
+ case ZEND_IS_SMALLER_OR_EQUAL:
5035
+ | brk #0 // TODO
5036
+ break;
5037
+ default:
5038
+ ZEND_UNREACHABLE();
5039
+ }
5040
+ } else if (smart_branch_opcode == ZEND_JMPNZ ||
5041
+ smart_branch_opcode == ZEND_JMPNZ_EX) {
5042
+ | brk #0 // TODO
5043
+ } else if (smart_branch_opcode == ZEND_JMPZNZ) {
5044
+ | brk #0 // TODO
5045
+ } else {
5046
+ ZEND_UNREACHABLE();
5047
+ }
5048
+ } else {
5049
+ | brk #0 // TODO
5050
+ }
5012
5051
5013
5052
return 1;
5014
5053
}
@@ -5115,7 +5154,42 @@ static int zend_jit_cmp(dasm_State **Dst,
5115
5154
|.cold_code
5116
5155
|9:
5117
5156
}
5118
- | brk #0 // TODO
5157
+ | SET_EX_OPLINE opline, REG0
5158
+ if (Z_MODE(op1_addr) == IS_REG) {
5159
+ zend_jit_addr real_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op1.var);
5160
+ if (!zend_jit_spill_store(Dst, op1_addr, real_addr, op1_info, 1)) {
5161
+ return 0;
5162
+ }
5163
+ op1_addr = real_addr;
5164
+ }
5165
+ if (Z_MODE(op2_addr) == IS_REG) {
5166
+ zend_jit_addr real_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->op2.var);
5167
+ if (!zend_jit_spill_store(Dst, op2_addr, real_addr, op2_info, 1)) {
5168
+ return 0;
5169
+ }
5170
+ op2_addr = real_addr;
5171
+ }
5172
+ | LOAD_ZVAL_ADDR FCARG2x, op1_addr
5173
+ if (opline->op1_type == IS_CV && (op1_info & MAY_BE_UNDEF)) {
5174
+ | brk #0 // TODO
5175
+ }
5176
+ if (opline->op2_type == IS_CV && (op2_info & MAY_BE_UNDEF)) {
5177
+ | brk #0 // TODO
5178
+ } else {
5179
+ | LOAD_ZVAL_ADDR CARG3, op2_addr
5180
+ }
5181
+ | LOAD_ZVAL_ADDR FCARG1x, res_addr
5182
+ | EXT_CALL compare_function, REG0
5183
+ if (opline->opcode != ZEND_CASE) {
5184
+ | FREE_OP opline->op1_type, opline->op1, op1_info, 0, opline, ZREG_TMP1, ZREG_TMP2
5185
+ }
5186
+ | FREE_OP opline->op2_type, opline->op2, op2_info, 0, opline, ZREG_TMP1, ZREG_TMP2
5187
+ if (may_throw) {
5188
+ zend_jit_check_exception_undef_result(Dst, opline);
5189
+ }
5190
+ if (!zend_jit_cmp_slow(Dst, opline, res_addr, smart_branch_opcode, target_label, target_label2, exit_addr)) {
5191
+ return 0;
5192
+ }
5119
5193
if (has_slow) {
5120
5194
| b >6
5121
5195
|.code
@@ -5334,7 +5408,28 @@ static int zend_jit_bool_jmpznz(dasm_State **Dst, const zend_op *opline, uint32_
5334
5408
if (op1_info & (MAY_BE_ANY-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG))) {
5335
5409
| IF_NOT_ZVAL_TYPE op1_addr, IS_LONG, >2, TMP1w, TMP2
5336
5410
}
5337
- | brk #0
5411
+ if (Z_MODE(op1_addr) == IS_REG) {
5412
+ | brk #0 // TODO
5413
+ | tst Rx(Z_REG(op1_addr)), Rx(Z_REG(op1_addr))
5414
+ } else {
5415
+ | LONG_CMP_WITH_CONST cmp, op1_addr, Z_L(0), TMP1, TMP2
5416
+ }
5417
+ if (set_bool) {
5418
+ | cset REG0w, ne
5419
+ if (set_bool_not) {
5420
+ | neg REG0w, REG0w
5421
+ | add REG0w, REG0w, #3
5422
+ } else {
5423
+ | brk #0 // TODO
5424
+ | add REG0w, REG0w, #2
5425
+ }
5426
+ | SET_ZVAL_TYPE_INFO_FROM_REG res_addr, REG0w, TMP1
5427
+ }
5428
+ if (exit_addr) {
5429
+ | brk #0 // TODO
5430
+ } else if (true_label != (uint32_t)-1 || false_label != (uint32_t)-1) {
5431
+ | brk #0 // TODO
5432
+ }
5338
5433
}
5339
5434
5340
5435
if ((op1_info & MAY_BE_ANY) == MAY_BE_DOUBLE) {
0 commit comments