@@ -2647,6 +2647,31 @@ static bool zend_jit_next_is_send_result(const zend_op *opline)
2647
2647
return 0 ;
2648
2648
}
2649
2649
2650
+ static bool zend_jit_supported_binary_op (zend_uchar op , uint32_t op1_info , uint32_t op2_info )
2651
+ {
2652
+ switch (op ) {
2653
+ case ZEND_POW :
2654
+ case ZEND_DIV :
2655
+ // TODO: check for division by zero ???
2656
+ return false;
2657
+ case ZEND_ADD :
2658
+ case ZEND_SUB :
2659
+ case ZEND_MUL :
2660
+ return (op1_info & (MAY_BE_LONG |MAY_BE_DOUBLE ))
2661
+ && (op2_info & (MAY_BE_LONG |MAY_BE_DOUBLE ));
2662
+ case ZEND_BW_OR :
2663
+ case ZEND_BW_AND :
2664
+ case ZEND_BW_XOR :
2665
+ case ZEND_SL :
2666
+ case ZEND_SR :
2667
+ case ZEND_MOD :
2668
+ return (op1_info & MAY_BE_LONG ) && (op2_info & MAY_BE_LONG );
2669
+ case ZEND_CONCAT :
2670
+ return (op1_info & MAY_BE_STRING ) && (op2_info & MAY_BE_STRING );
2671
+ EMPTY_SWITCH_DEFAULT_CASE ()
2672
+ }
2673
+ }
2674
+
2650
2675
static int zend_jit (const zend_op_array * op_array , zend_ssa * ssa , const zend_op * rt_opline )
2651
2676
{
2652
2677
int b , i , end ;
@@ -3058,11 +3083,6 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
3058
3083
}
3059
3084
goto done ;
3060
3085
case ZEND_ASSIGN_OP :
3061
- if (opline -> extended_value == ZEND_POW
3062
- || opline -> extended_value == ZEND_DIV ) {
3063
- // TODO: check for division by zero ???
3064
- break ;
3065
- }
3066
3086
if (opline -> op1_type != IS_CV || opline -> result_type != IS_UNUSED ) {
3067
3087
break ;
3068
3088
}
@@ -3074,29 +3094,9 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
3074
3094
if ((op1_info & MAY_BE_UNDEF ) || (op2_info & MAY_BE_UNDEF )) {
3075
3095
break ;
3076
3096
}
3077
- if (opline -> extended_value == ZEND_ADD
3078
- || opline -> extended_value == ZEND_SUB
3079
- || opline -> extended_value == ZEND_MUL
3080
- || opline -> extended_value == ZEND_DIV ) {
3081
- if (!(op1_info & (MAY_BE_LONG |MAY_BE_DOUBLE ))
3082
- || !(op2_info & (MAY_BE_LONG |MAY_BE_DOUBLE ))) {
3083
- break ;
3084
- }
3085
- } else if (opline -> extended_value == ZEND_BW_OR
3086
- || opline -> extended_value == ZEND_BW_AND
3087
- || opline -> extended_value == ZEND_BW_XOR
3088
- || opline -> extended_value == ZEND_SL
3089
- || opline -> extended_value == ZEND_SR
3090
- || opline -> extended_value == ZEND_MOD ) {
3091
- if (!(op1_info & MAY_BE_LONG )
3092
- || !(op2_info & MAY_BE_LONG )) {
3093
- break ;
3094
- }
3095
- } else if (opline -> extended_value == ZEND_CONCAT ) {
3096
- if (!(op1_info & MAY_BE_STRING )
3097
- || !(op2_info & MAY_BE_STRING )) {
3098
- break ;
3099
- }
3097
+ if (!zend_jit_supported_binary_op (
3098
+ opline -> extended_value , op1_info , op2_info )) {
3099
+ break ;
3100
3100
}
3101
3101
op1_def_info = OP1_DEF_INFO ();
3102
3102
if (!zend_jit_assign_op (& dasm_state , opline ,
@@ -3108,17 +3108,16 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
3108
3108
}
3109
3109
goto done ;
3110
3110
case ZEND_ASSIGN_DIM_OP :
3111
- if (opline -> extended_value == ZEND_POW
3112
- || opline -> extended_value == ZEND_DIV ) {
3113
- // TODO: check for division by zero ???
3114
- break ;
3115
- }
3116
3111
if (opline -> op1_type != IS_CV || opline -> result_type != IS_UNUSED ) {
3117
3112
break ;
3118
3113
}
3119
3114
if (PROFITABILITY_CHECKS && (!ssa -> ops || !ssa -> var_info )) {
3120
3115
break ;
3121
3116
}
3117
+ if (!zend_jit_supported_binary_op (
3118
+ opline -> extended_value , MAY_BE_ANY , OP1_DATA_INFO ())) {
3119
+ break ;
3120
+ }
3122
3121
if (!zend_jit_assign_dim_op (& dasm_state , opline ,
3123
3122
OP1_INFO (), OP1_DEF_INFO (), OP1_REG_ADDR (), OP2_INFO (),
3124
3123
OP1_DATA_INFO (), OP1_DATA_RANGE (),
@@ -3183,11 +3182,6 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
3183
3182
}
3184
3183
goto done ;
3185
3184
case ZEND_ASSIGN_OBJ_OP :
3186
- if (opline -> extended_value == ZEND_POW
3187
- || opline -> extended_value == ZEND_DIV ) {
3188
- // TODO: check for division by zero ???
3189
- break ;
3190
- }
3191
3185
if (opline -> result_type != IS_UNUSED ) {
3192
3186
break ;
3193
3187
}
@@ -3199,6 +3193,10 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
3199
3193
if (PROFITABILITY_CHECKS && (!ssa -> ops || !ssa -> var_info )) {
3200
3194
break ;
3201
3195
}
3196
+ if (!zend_jit_supported_binary_op (
3197
+ opline -> extended_value , MAY_BE_ANY , OP1_DATA_INFO ())) {
3198
+ break ;
3199
+ }
3202
3200
ce = NULL ;
3203
3201
ce_is_instanceof = 0 ;
3204
3202
if (opline -> op1_type == IS_UNUSED ) {
0 commit comments