@@ -3533,7 +3533,6 @@ static int zend_jit_concat_helper(dasm_State **Dst,
3533
3533
{
3534
3534
if ((op1_info & MAY_BE_STRING) && (op2_info & MAY_BE_STRING)) {
3535
3535
if (op1_info & ((MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF) - MAY_BE_STRING)) {
3536
- | brk #0 // TODO
3537
3536
| IF_NOT_ZVAL_TYPE op1_addr, IS_STRING, >6, TMP1w, TMP2
3538
3537
}
3539
3538
if (op2_info & ((MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF) - MAY_BE_STRING)) {
@@ -7009,7 +7008,87 @@ static int zend_jit_type_check(dasm_State **Dst, const zend_op *opline, uint32_t
7009
7008
// TODO: support for is_resource() ???
7010
7009
ZEND_ASSERT(opline->extended_value != MAY_BE_RESOURCE);
7011
7010
7012
- | brk #0 // TODO
7011
+ if (op1_info & MAY_BE_UNDEF) {
7012
+ | brk #0 // TODO
7013
+ }
7014
+
7015
+ if (op1_info & (MAY_BE_ANY|MAY_BE_REF)) {
7016
+ mask = opline->extended_value;
7017
+ if (!(op1_info & MAY_BE_GUARD) && !(op1_info & (MAY_BE_ANY - mask))) {
7018
+ | brk #0 // TODO
7019
+ } else if (!(op1_info & MAY_BE_GUARD) && !(op1_info & mask)) {
7020
+ | brk #0 // TODO
7021
+ } else {
7022
+ bool invert = 0;
7023
+ zend_uchar type;
7024
+
7025
+ switch (mask) {
7026
+ case MAY_BE_NULL: type = IS_NULL; break;
7027
+ case MAY_BE_FALSE: type = IS_FALSE; break;
7028
+ case MAY_BE_TRUE: type = IS_TRUE; break;
7029
+ case MAY_BE_LONG: type = IS_LONG; break;
7030
+ case MAY_BE_DOUBLE: type = IS_DOUBLE; break;
7031
+ case MAY_BE_STRING: type = IS_STRING; break;
7032
+ case MAY_BE_ARRAY: type = IS_ARRAY; break;
7033
+ case MAY_BE_OBJECT: type = IS_OBJECT; break;
7034
+ case MAY_BE_ANY - MAY_BE_NULL: type = IS_NULL; invert = 1; break;
7035
+ case MAY_BE_ANY - MAY_BE_FALSE: type = IS_FALSE; invert = 1; break;
7036
+ case MAY_BE_ANY - MAY_BE_TRUE: type = IS_TRUE; invert = 1; break;
7037
+ case MAY_BE_ANY - MAY_BE_LONG: type = IS_LONG; invert = 1; break;
7038
+ case MAY_BE_ANY - MAY_BE_DOUBLE: type = IS_DOUBLE; invert = 1; break;
7039
+ case MAY_BE_ANY - MAY_BE_STRING: type = IS_STRING; invert = 1; break;
7040
+ case MAY_BE_ANY - MAY_BE_ARRAY: type = IS_ARRAY; invert = 1; break;
7041
+ case MAY_BE_ANY - MAY_BE_OBJECT: type = IS_OBJECT; invert = 1; break;
7042
+ case MAY_BE_ANY - MAY_BE_RESOURCE: type = IS_OBJECT; invert = 1; break;
7043
+ default:
7044
+ type = 0;
7045
+ }
7046
+
7047
+ if (op1_info & MAY_BE_REF) {
7048
+ | brk #0 // TODO
7049
+ }
7050
+ if (type == 0) {
7051
+ | brk #0 // TODO
7052
+ } else {
7053
+ if (smart_branch_opcode &&
7054
+ (opline->op1_type & (IS_VAR|IS_TMP_VAR)) &&
7055
+ (op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE))) {
7056
+ | brk #0 // TODO
7057
+ } else {
7058
+ if (op1_info & MAY_BE_REF) {
7059
+ | brk #0 // TODO
7060
+ } else {
7061
+ | LOAD_32BIT_VAL TMP1w, (opline->op1.var + 8)
7062
+ | ldrb TMP2w, [FP, TMP1]
7063
+ | cmp TMP2w, #type
7064
+ }
7065
+ }
7066
+ if (exit_addr) {
7067
+ | brk #0 // TODO
7068
+ } else if (smart_branch_opcode) {
7069
+ if (invert) {
7070
+ | brk #0 // TODO
7071
+ } else {
7072
+ if (smart_branch_opcode == ZEND_JMPZ) {
7073
+ | bne =>target_label
7074
+ } else if (smart_branch_opcode == ZEND_JMPNZ) {
7075
+ | brk #0 // TODO
7076
+ } else if (smart_branch_opcode == ZEND_JMPZNZ) {
7077
+ | brk #0 // TODO
7078
+ } else {
7079
+ ZEND_UNREACHABLE();
7080
+ }
7081
+ }
7082
+ } else {
7083
+ zend_jit_addr res_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, opline->result.var);
7084
+
7085
+ | brk #0 // TODO
7086
+ }
7087
+ }
7088
+ }
7089
+ }
7090
+
7091
+ |7:
7013
7092
7014
7093
return 1;
7015
7094
}
@@ -7338,7 +7417,17 @@ static int zend_jit_return(dasm_State **Dst, const zend_op *opline, const zend_o
7338
7417
}
7339
7418
| ZVAL_COPY_VALUE ret_addr, MAY_BE_ANY, op1_addr, op1_info, ZREG_REG0, ZREG_REG2, ZREG_TMP1, ZREG_TMP2, ZREG_FPR0
7340
7419
if (op1_info & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) {
7341
- | brk #0 // TODO
7420
+ if (JIT_G(trigger) != ZEND_JIT_ON_HOT_TRACE ||
7421
+ (op1_info & (MAY_BE_REF|MAY_BE_OBJECT)) ||
7422
+ !op_array->function_name) {
7423
+ | lsr REG0w, REG0w, #8
7424
+ | and REG0w, REG0w, #0xff
7425
+ | TRY_ADDREF op1_info, REG0w, REG2, TMP1
7426
+ } else if (return_value_used != 1) {
7427
+ | // if (EXPECTED(!(EX_CALL_INFO() & ZEND_CALL_CODE))) ZVAL_NULL(retval_ptr);
7428
+ | brk #0 // TODO
7429
+ | SET_ZVAL_TYPE_INFO op1_addr, IS_NULL, TMP1w, TMP2
7430
+ }
7342
7431
}
7343
7432
} else {
7344
7433
| brk #0 // TODO
0 commit comments