@@ -98,7 +98,7 @@ static bool eval_const_numeric_expr(ray_graph_t* g, ray_op_t* op,
9898 }
9999
100100 if (op -> arity != 2 || !op -> inputs [0 ] || !op -> inputs [1 ]) return false;
101- if (op -> opcode < OP_ADD || op -> opcode > OP_MAX2 ) return false;
101+ if (( op -> opcode < OP_ADD || op -> opcode > OP_MAX2 ) && op -> opcode != OP_IDIV ) return false;
102102
103103 double lf = 0.0 , rf = 0.0 ;
104104 int64_t li = 0 , ri = 0 ;
@@ -115,6 +115,7 @@ static bool eval_const_numeric_expr(ray_graph_t* g, ray_op_t* op,
115115 case OP_SUB : r = lv - rv ; break ;
116116 case OP_MUL : r = lv * rv ; break ;
117117 case OP_DIV : r = rv != 0.0 ? lv / rv : NAN ; break ;
118+ case OP_IDIV : r = rv != 0.0 ? floor (lv / rv ) : NAN ; break ;
118119 case OP_MOD : { if (rv != 0.0 ) { r = fmod (lv , rv ); if (r && ((r > 0 ) != (rv > 0 ))) r += rv ; } else { r = NAN ; } } break ;
119120 case OP_MIN2 : r = lv < rv ? lv : rv ; break ;
120121 case OP_MAX2 : r = lv > rv ? lv : rv ; break ;
@@ -135,6 +136,10 @@ static bool eval_const_numeric_expr(ray_graph_t* g, ray_op_t* op,
135136 if (ri == 0 ) return false;
136137 r = li /ri ; if ((li ^ri )< 0 && r * ri != li ) r -- ;
137138 break ;
139+ case OP_IDIV :
140+ if (ri == 0 ) return false;
141+ r = li /ri ; if ((li ^ri )< 0 && r * ri != li ) r -- ;
142+ break ;
138143 case OP_MOD :
139144 if (ri == 0 ) return false;
140145 r = li %ri ; if (r && (r ^ri )< 0 ) r += ri ;
@@ -1538,6 +1543,7 @@ static void binary_range(ray_op_t* op, int8_t out_type,
15381543 case OP_SUB : for (int64_t i = 0 ;i < n ;i ++ ) { double lv = LV_READ (i ),rv = RV_READ (i ); odst [i ]= lv - rv ; } break ;
15391544 case OP_MUL : for (int64_t i = 0 ;i < n ;i ++ ) { double lv = LV_READ (i ),rv = RV_READ (i ); odst [i ]= lv * rv ; } break ;
15401545 case OP_DIV : for (int64_t i = 0 ;i < n ;i ++ ) { double lv = LV_READ (i ),rv = RV_READ (i ); odst [i ]= rv != 0.0 ?lv /rv :NAN ; } break ;
1546+ case OP_IDIV : for (int64_t i = 0 ;i < n ;i ++ ) { double lv = LV_READ (i ),rv = RV_READ (i ); odst [i ]= rv != 0.0 ?floor (lv /rv ):NAN ; } break ;
15411547 case OP_MOD : for (int64_t i = 0 ;i < n ;i ++ ) { double lv = LV_READ (i ),rv = RV_READ (i ); double r ; if (rv != 0.0 ){r = fmod (lv ,rv );if (r && ((r > 0 )!= (rv > 0 )))r += rv ;}else r = NAN ; odst [i ]= r ; } break ;
15421548 case OP_MIN2 : for (int64_t i = 0 ;i < n ;i ++ ) { double lv = LV_READ (i ),rv = RV_READ (i ); odst [i ]= lv < rv ?lv :rv ; } break ;
15431549 case OP_MAX2 : for (int64_t i = 0 ;i < n ;i ++ ) { double lv = LV_READ (i ),rv = RV_READ (i ); odst [i ]= lv > rv ?lv :rv ; } break ;
@@ -1550,6 +1556,7 @@ static void binary_range(ray_op_t* op, int8_t out_type,
15501556 case OP_SUB : for (int64_t i = 0 ;i < n ;i ++ ){int64_t li = (int64_t )LV_READ (i ),ri = (int64_t )RV_READ (i );odst [i ]= (int64_t )((uint64_t )li - (uint64_t )ri );}break ;
15511557 case OP_MUL : for (int64_t i = 0 ;i < n ;i ++ ){int64_t li = (int64_t )LV_READ (i ),ri = (int64_t )RV_READ (i );odst [i ]= (int64_t )((uint64_t )li * (uint64_t )ri );}break ;
15521558 case OP_DIV : for (int64_t i = 0 ;i < n ;i ++ ){int64_t li = (int64_t )LV_READ (i ),ri = (int64_t )RV_READ (i );int64_t r ;if (ri == 0 || (ri == -1 && li == ((int64_t )1 <<63 ))){r = 0 ;}else {r = li /ri ;if ((li ^ri )< 0 && r * ri != li )r -- ;}odst [i ]= r ;}break ;
1559+ case OP_IDIV :for (int64_t i = 0 ;i < n ;i ++ ){double lv = LV_READ (i ),rv = RV_READ (i );odst [i ]= rv != 0.0 ?(int64_t )floor (lv /rv ):0 ;}break ;
15531560 case OP_MOD : for (int64_t i = 0 ;i < n ;i ++ ){int64_t li = (int64_t )LV_READ (i ),ri = (int64_t )RV_READ (i );int64_t r ;if (ri == 0 || (ri == -1 && li == ((int64_t )1 <<63 ))){r = 0 ;}else {r = li %ri ;if (r && (r ^ri )< 0 )r += ri ;}odst [i ]= r ;}break ;
15541561 case OP_MIN2 :for (int64_t i = 0 ;i < n ;i ++ ){int64_t li = (int64_t )LV_READ (i ),ri = (int64_t )RV_READ (i );odst [i ]= li < ri ?li :ri ;}break ;
15551562 case OP_MAX2 :for (int64_t i = 0 ;i < n ;i ++ ){int64_t li = (int64_t )LV_READ (i ),ri = (int64_t )RV_READ (i );odst [i ]= li > ri ?li :ri ;}break ;
@@ -1562,6 +1569,7 @@ static void binary_range(ray_op_t* op, int8_t out_type,
15621569 case OP_SUB : for (int64_t i = 0 ;i < n ;i ++ ){int32_t li = (int32_t )LV_READ (i ),ri = (int32_t )RV_READ (i );odst [i ]= (int32_t )((uint32_t )li - (uint32_t )ri );}break ;
15631570 case OP_MUL : for (int64_t i = 0 ;i < n ;i ++ ){int32_t li = (int32_t )LV_READ (i ),ri = (int32_t )RV_READ (i );odst [i ]= (int32_t )((uint32_t )li * (uint32_t )ri );}break ;
15641571 case OP_DIV : for (int64_t i = 0 ;i < n ;i ++ ){int32_t li = (int32_t )LV_READ (i ),ri = (int32_t )RV_READ (i );int32_t r ;if (ri == 0 || (ri == -1 && li == ((int32_t )1 <<31 ))){r = 0 ;}else {r = li /ri ;if ((li ^ri )< 0 && r * ri != li )r -- ;}odst [i ]= r ;}break ;
1572+ case OP_IDIV :for (int64_t i = 0 ;i < n ;i ++ ){double lv = LV_READ (i ),rv = RV_READ (i );odst [i ]= rv != 0.0 ?(int32_t )floor (lv /rv ):0 ;}break ;
15651573 case OP_MOD : for (int64_t i = 0 ;i < n ;i ++ ){int32_t li = (int32_t )LV_READ (i ),ri = (int32_t )RV_READ (i );int32_t r ;if (ri == 0 || (ri == -1 && li == ((int32_t )1 <<31 ))){r = 0 ;}else {r = li %ri ;if (r && (r ^ri )< 0 )r += ri ;}odst [i ]= r ;}break ;
15661574 case OP_MIN2 :for (int64_t i = 0 ;i < n ;i ++ ){int32_t li = (int32_t )LV_READ (i ),ri = (int32_t )RV_READ (i );odst [i ]= li < ri ?li :ri ;}break ;
15671575 case OP_MAX2 :for (int64_t i = 0 ;i < n ;i ++ ){int32_t li = (int32_t )LV_READ (i ),ri = (int32_t )RV_READ (i );odst [i ]= li > ri ?li :ri ;}break ;
@@ -1574,6 +1582,7 @@ static void binary_range(ray_op_t* op, int8_t out_type,
15741582 case OP_SUB : for (int64_t i = 0 ;i < n ;i ++ ){int16_t li = (int16_t )LV_READ (i ),ri = (int16_t )RV_READ (i );odst [i ]= (int16_t )((uint16_t )li - (uint16_t )ri );}break ;
15751583 case OP_MUL : for (int64_t i = 0 ;i < n ;i ++ ){int16_t li = (int16_t )LV_READ (i ),ri = (int16_t )RV_READ (i );odst [i ]= (int16_t )((uint16_t )li * (uint16_t )ri );}break ;
15761584 case OP_DIV : for (int64_t i = 0 ;i < n ;i ++ ){int16_t li = (int16_t )LV_READ (i ),ri = (int16_t )RV_READ (i );odst [i ]= ri ?li /ri :0 ;}break ;
1585+ case OP_IDIV :for (int64_t i = 0 ;i < n ;i ++ ){double lv = LV_READ (i ),rv = RV_READ (i );odst [i ]= rv != 0.0 ?(int16_t )floor (lv /rv ):0 ;}break ;
15771586 case OP_MOD : for (int64_t i = 0 ;i < n ;i ++ ){int16_t li = (int16_t )LV_READ (i ),ri = (int16_t )RV_READ (i );odst [i ]= ri ?li %ri :0 ;}break ;
15781587 case OP_MIN2 :for (int64_t i = 0 ;i < n ;i ++ ){int16_t li = (int16_t )LV_READ (i ),ri = (int16_t )RV_READ (i );odst [i ]= li < ri ?li :ri ;}break ;
15791588 case OP_MAX2 :for (int64_t i = 0 ;i < n ;i ++ ){int16_t li = (int16_t )LV_READ (i ),ri = (int16_t )RV_READ (i );odst [i ]= li > ri ?li :ri ;}break ;
@@ -1586,6 +1595,7 @@ static void binary_range(ray_op_t* op, int8_t out_type,
15861595 case OP_SUB : for (int64_t i = 0 ;i < n ;i ++ ){uint8_t li = (uint8_t )LV_READ (i ),ri = (uint8_t )RV_READ (i );odst [i ]= li - ri ;}break ;
15871596 case OP_MUL : for (int64_t i = 0 ;i < n ;i ++ ){uint8_t li = (uint8_t )LV_READ (i ),ri = (uint8_t )RV_READ (i );odst [i ]= li * ri ;}break ;
15881597 case OP_DIV : for (int64_t i = 0 ;i < n ;i ++ ){uint8_t li = (uint8_t )LV_READ (i ),ri = (uint8_t )RV_READ (i );odst [i ]= ri ?li /ri :0 ;}break ;
1598+ case OP_IDIV :for (int64_t i = 0 ;i < n ;i ++ ){double lv = LV_READ (i ),rv = RV_READ (i );odst [i ]= rv != 0.0 ?(uint8_t )floor (lv /rv ):0 ;}break ;
15891599 case OP_MOD : for (int64_t i = 0 ;i < n ;i ++ ){uint8_t li = (uint8_t )LV_READ (i ),ri = (uint8_t )RV_READ (i );odst [i ]= ri ?li %ri :0 ;}break ;
15901600 case OP_MIN2 :for (int64_t i = 0 ;i < n ;i ++ ){uint8_t li = (uint8_t )LV_READ (i ),ri = (uint8_t )RV_READ (i );odst [i ]= li < ri ?li :ri ;}break ;
15911601 case OP_MAX2 :for (int64_t i = 0 ;i < n ;i ++ ){uint8_t li = (uint8_t )LV_READ (i ),ri = (uint8_t )RV_READ (i );odst [i ]= li > ri ?li :ri ;}break ;
@@ -1794,7 +1804,7 @@ ray_t* exec_elementwise_binary(ray_graph_t* g, ray_op_t* op, ray_t* lhs, ray_t*
17941804 /* Div/mod: mark zero-divisor positions as null.
17951805 * The morsel loop writes 0 for b==0 but can't set bitmap nulls. */
17961806 uint16_t opc = op -> opcode ;
1797- if (opc == OP_DIV || opc == OP_MOD ) {
1807+ if (opc == OP_DIV || opc == OP_IDIV || opc == OP_MOD ) {
17981808 if (!r_scalar ) {
17991809 int8_t rt = rhs -> type ;
18001810 if (rt == RAY_I64 || rt == RAY_TIMESTAMP ) {
0 commit comments