@@ -2067,6 +2067,32 @@ static zend_lifetime_interval** zend_jit_allocate_registers(const zend_op_array
2067
2067
return NULL ;
2068
2068
}
2069
2069
2070
+
2071
+ static bool zend_jit_supported_binary_op (zend_uchar op , uint32_t op1_info , uint32_t op2_info )
2072
+ {
2073
+ switch (op ) {
2074
+ case ZEND_POW :
2075
+ case ZEND_DIV :
2076
+ // TODO: check for division by zero ???
2077
+ return false;
2078
+ case ZEND_ADD :
2079
+ case ZEND_SUB :
2080
+ case ZEND_MUL :
2081
+ return (op1_info & (MAY_BE_LONG |MAY_BE_DOUBLE ))
2082
+ && (op2_info & (MAY_BE_LONG |MAY_BE_DOUBLE ));
2083
+ case ZEND_BW_OR :
2084
+ case ZEND_BW_AND :
2085
+ case ZEND_BW_XOR :
2086
+ case ZEND_SL :
2087
+ case ZEND_SR :
2088
+ case ZEND_MOD :
2089
+ return (op1_info & MAY_BE_LONG ) && (op2_info & MAY_BE_LONG );
2090
+ case ZEND_CONCAT :
2091
+ return (op1_info & MAY_BE_STRING ) && (op2_info & MAY_BE_STRING );
2092
+ EMPTY_SWITCH_DEFAULT_CASE ()
2093
+ }
2094
+ }
2095
+
2070
2096
static int zend_jit (const zend_op_array * op_array , zend_ssa * ssa , const zend_op * rt_opline )
2071
2097
{
2072
2098
int b , i , end ;
@@ -2488,11 +2514,6 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
2488
2514
}
2489
2515
goto done ;
2490
2516
case ZEND_ASSIGN_OP :
2491
- if (opline -> extended_value == ZEND_POW
2492
- || opline -> extended_value == ZEND_DIV ) {
2493
- // TODO: check for division by zero ???
2494
- break ;
2495
- }
2496
2517
if (opline -> op1_type != IS_CV || opline -> result_type != IS_UNUSED ) {
2497
2518
break ;
2498
2519
}
@@ -2504,29 +2525,9 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
2504
2525
if ((op1_info & MAY_BE_UNDEF ) || (op2_info & MAY_BE_UNDEF )) {
2505
2526
break ;
2506
2527
}
2507
- if (opline -> extended_value == ZEND_ADD
2508
- || opline -> extended_value == ZEND_SUB
2509
- || opline -> extended_value == ZEND_MUL
2510
- || opline -> extended_value == ZEND_DIV ) {
2511
- if (!(op1_info & (MAY_BE_LONG |MAY_BE_DOUBLE ))
2512
- || !(op2_info & (MAY_BE_LONG |MAY_BE_DOUBLE ))) {
2513
- break ;
2514
- }
2515
- } else if (opline -> extended_value == ZEND_BW_OR
2516
- || opline -> extended_value == ZEND_BW_AND
2517
- || opline -> extended_value == ZEND_BW_XOR
2518
- || opline -> extended_value == ZEND_SL
2519
- || opline -> extended_value == ZEND_SR
2520
- || opline -> extended_value == ZEND_MOD ) {
2521
- if (!(op1_info & MAY_BE_LONG )
2522
- || !(op2_info & MAY_BE_LONG )) {
2523
- break ;
2524
- }
2525
- } else if (opline -> extended_value == ZEND_CONCAT ) {
2526
- if (!(op1_info & MAY_BE_STRING )
2527
- || !(op2_info & MAY_BE_STRING )) {
2528
- break ;
2529
- }
2528
+ if (!zend_jit_supported_binary_op (
2529
+ opline -> extended_value , op1_info , op2_info )) {
2530
+ break ;
2530
2531
}
2531
2532
op1_def_info = OP1_DEF_INFO ();
2532
2533
if (!zend_jit_assign_op (& dasm_state , opline ,
@@ -2538,17 +2539,16 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
2538
2539
}
2539
2540
goto done ;
2540
2541
case ZEND_ASSIGN_DIM_OP :
2541
- if (opline -> extended_value == ZEND_POW
2542
- || opline -> extended_value == ZEND_DIV ) {
2543
- // TODO: check for division by zero ???
2544
- break ;
2545
- }
2546
2542
if (opline -> op1_type != IS_CV || opline -> result_type != IS_UNUSED ) {
2547
2543
break ;
2548
2544
}
2549
2545
if (PROFITABILITY_CHECKS && (!ssa -> ops || !ssa -> var_info )) {
2550
2546
break ;
2551
2547
}
2548
+ if (!zend_jit_supported_binary_op (
2549
+ opline -> extended_value , MAY_BE_ANY , OP1_DATA_INFO ())) {
2550
+ break ;
2551
+ }
2552
2552
if (!zend_jit_assign_dim_op (& dasm_state , opline ,
2553
2553
OP1_INFO (), OP1_DEF_INFO (), OP1_REG_ADDR (), OP2_INFO (),
2554
2554
OP1_DATA_INFO (), OP1_DATA_RANGE (),
@@ -2613,11 +2613,6 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
2613
2613
}
2614
2614
goto done ;
2615
2615
case ZEND_ASSIGN_OBJ_OP :
2616
- if (opline -> extended_value == ZEND_POW
2617
- || opline -> extended_value == ZEND_DIV ) {
2618
- // TODO: check for division by zero ???
2619
- break ;
2620
- }
2621
2616
if (opline -> result_type != IS_UNUSED ) {
2622
2617
break ;
2623
2618
}
@@ -2629,6 +2624,10 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
2629
2624
if (PROFITABILITY_CHECKS && (!ssa -> ops || !ssa -> var_info )) {
2630
2625
break ;
2631
2626
}
2627
+ if (!zend_jit_supported_binary_op (
2628
+ opline -> extended_value , MAY_BE_ANY , OP1_DATA_INFO ())) {
2629
+ break ;
2630
+ }
2632
2631
ce = NULL ;
2633
2632
ce_is_instanceof = 0 ;
2634
2633
if (opline -> op1_type == IS_UNUSED ) {
0 commit comments