@@ -483,6 +483,11 @@ static void* dasm_labels[zend_lb_MAX];
483
483
| mov dword [zv+offsetof(zval,u1.type_info)], type
484
484
|.endmacro
485
485
486
+ |.macro GET_ZVAL_TYPE, reg, addr
487
+ || ZEND_ASSERT(Z_MODE(addr) == IS_MEM_ZVAL);
488
+ | mov reg, byte [Ra(Z_REG(addr))+Z_OFFSET(addr)+offsetof(zval,u1.v.type)]
489
+ |.endmacro
490
+
486
491
|.macro GET_ZVAL_TYPE_INFO, reg, addr
487
492
|| ZEND_ASSERT(Z_MODE(addr) == IS_MEM_ZVAL);
488
493
| mov reg, dword [Ra(Z_REG(addr))+Z_OFFSET(addr)+offsetof(zval,u1.type_info)]
@@ -12393,53 +12398,65 @@ static zend_bool zend_jit_verify_return_type(dasm_State **Dst, const zend_op *op
12393
12398
zend_arg_info *arg_info = &op_array->arg_info[-1];
12394
12399
ZEND_ASSERT(ZEND_TYPE_IS_SET(arg_info->type));
12395
12400
zend_jit_addr op1_addr = OP1_ADDR();
12396
-
12397
- | LOAD_ZVAL_ADDR r0, op1_addr
12398
-
12401
+ zend_bool needs_slow_check = 1;
12402
+ zend_bool slow_check_in_cold = 1;
12399
12403
uint32_t type_mask = ZEND_TYPE_PURE_MASK(arg_info->type) & MAY_BE_ANY;
12404
+
12400
12405
if (type_mask == 0) {
12401
- | jmp >7
12402
- } else if (is_power_of_two(type_mask)) {
12403
- uint32_t type_code = concrete_type(type_mask);
12404
- | cmp byte [r0 + 8], type_code
12405
- | jne >7
12406
+ slow_check_in_cold = 0;
12406
12407
} else {
12407
- | mov edx, 1
12408
- | mov cl, byte [r0 + 8]
12409
- | shl edx, cl
12410
- | test edx, type_mask
12411
- | je >7
12412
- }
12413
- |.cold_code
12414
- |7:
12415
- | SAVE_VALID_OPLINE opline, r1
12416
- if (op1_info & MAY_BE_UNDEF) {
12417
- | IF_NOT_ZVAL_TYPE op1_addr, IS_UNDEF, >8
12418
- | mov FCARG1a, opline->op1.var
12419
- | EXT_CALL zend_jit_undefined_op_helper, FCARG2a
12420
- | LOAD_ADDR_ZTS r0, executor_globals, uninitialized_zval
12408
+ if (((op1_info & MAY_BE_ANY) & type_mask) == 0) {
12409
+ slow_check_in_cold = 0;
12410
+ } else if (((op1_info & MAY_BE_ANY) | type_mask) == type_mask) {
12411
+ needs_slow_check = 0;
12412
+ } else if (is_power_of_two(type_mask)) {
12413
+ uint32_t type_code = concrete_type(type_mask);
12414
+ | IF_NOT_ZVAL_TYPE op1_addr, type_code, >7
12415
+ } else {
12416
+ | mov edx, 1
12417
+ | GET_ZVAL_TYPE cl, op1_addr
12418
+ | shl edx, cl
12419
+ | test edx, type_mask
12420
+ | je >7
12421
+ }
12421
12422
}
12422
- |8:
12423
- | mov FCARG1a, r0
12424
- | mov r0, EX->run_time_cache
12425
- | add r0, opline->op2.num
12426
- | mov FCARG2a, EX->func
12427
- |.if X64
12428
- | LOAD_ADDR CARG3, (ptrdiff_t)arg_info
12429
- | mov CARG4, r0
12430
- | EXT_CALL zend_jit_verify_return_slow, r0
12431
- |.else
12432
- | sub r4, 8
12433
- | push r0
12434
- | push (ptrdiff_t)arg_info
12435
- | EXT_CALL zend_jit_verify_return_slow, r0
12436
- | add r4, 8
12437
- |.endif
12438
- if (!zend_jit_check_exception(Dst)) {
12439
- return 0;
12423
+ if (needs_slow_check) {
12424
+ if (slow_check_in_cold) {
12425
+ |.cold_code
12426
+ |7:
12427
+ }
12428
+ | SAVE_VALID_OPLINE opline, r1
12429
+ if (op1_info & MAY_BE_UNDEF) {
12430
+ | IF_NOT_ZVAL_TYPE op1_addr, IS_UNDEF, >8
12431
+ | mov FCARG1a, opline->op1.var
12432
+ | EXT_CALL zend_jit_undefined_op_helper, FCARG2a
12433
+ | LOAD_ADDR_ZTS r0, executor_globals, uninitialized_zval
12434
+ }
12435
+ |8:
12436
+ | LOAD_ZVAL_ADDR FCARG1a, op1_addr
12437
+ | mov FCARG2a, EX->func
12438
+ |.if X64
12439
+ | LOAD_ADDR CARG3, (ptrdiff_t)arg_info
12440
+ | mov r0, EX->run_time_cache
12441
+ | lea CARG4, aword [r0+opline->op2.num]
12442
+ | EXT_CALL zend_jit_verify_return_slow, r0
12443
+ |.else
12444
+ | sub r4, 8
12445
+ | mov r0, EX->run_time_cache
12446
+ | add r0, opline->op2.num
12447
+ | push r0
12448
+ | push (ptrdiff_t)arg_info
12449
+ | EXT_CALL zend_jit_verify_return_slow, r0
12450
+ | add r4, 8
12451
+ |.endif
12452
+ if (!zend_jit_check_exception(Dst)) {
12453
+ return 0;
12454
+ }
12455
+ if (slow_check_in_cold) {
12456
+ | jmp >9
12457
+ |.code
12458
+ }
12440
12459
}
12441
- | jmp >9
12442
- |.code
12443
12460
|9:
12444
12461
return 1;
12445
12462
}
0 commit comments