Line data Source code
1 : /*
2 : * SPDX-License-Identifier: MPL-2.0
3 : *
4 : * This Source Code Form is subject to the terms of the Mozilla Public
5 : * License, v. 2.0. If a copy of the MPL was not distributed with this
6 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7 : *
8 : * Copyright 2024 MonetDB Foundation;
9 : * Copyright August 2008 - 2023 MonetDB B.V.;
10 : * Copyright 1997 - July 2008 CWI.
11 : */
12 :
13 : #include "monetdb_config.h"
14 : #include "gdk.h"
15 : #include "gdk_private.h"
16 : #include "gdk_calc_private.h"
17 :
18 : /* ---------------------------------------------------------------------- */
19 : /* division (any numeric type) */
20 :
21 : #define DIV_3TYPE(TYPE1, TYPE2, TYPE3) \
22 : static BUN \
23 : div_##TYPE1##_##TYPE2##_##TYPE3(const TYPE1 *lft, bool incr1, \
24 : const TYPE2 *rgt, bool incr2, \
25 : TYPE3 *restrict dst, TYPE3 max, \
26 : struct canditer *restrict ci1, \
27 : struct canditer *restrict ci2, \
28 : oid candoff1, oid candoff2) \
29 : { \
30 : BUN nils = 0; \
31 : BUN i = 0, j = 0, ncand = ci1->ncand; \
32 : lng timeoffset = 0; \
33 : QryCtx *qry_ctx = MT_thread_get_qry_ctx(); \
34 : if (qry_ctx != NULL) { \
35 : timeoffset = (qry_ctx->starttime && qry_ctx->querytimeout) ? (qry_ctx->starttime + qry_ctx->querytimeout) : 0; \
36 : } \
37 : \
38 : if (ci1->tpe == cand_dense && ci2->tpe == cand_dense) { \
39 : TIMEOUT_LOOP_IDX_DECL(k, ncand, timeoffset) { \
40 : if (incr1) \
41 : i = canditer_next_dense(ci1) - candoff1; \
42 : if (incr2) \
43 : j = canditer_next_dense(ci2) - candoff2; \
44 : if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
45 : dst[k] = TYPE3##_nil; \
46 : nils++; \
47 : } else if (rgt[j] == 0) { \
48 : return BUN_NONE + 1; \
49 : } else { \
50 : dst[k] = (TYPE3) (lft[i] / rgt[j]); \
51 : if (dst[k] < -max || dst[k] > max) { \
52 : return BUN_NONE + 2; \
53 : } \
54 : } \
55 : } \
56 : TIMEOUT_CHECK(timeoffset, TIMEOUT_HANDLER(BUN_NONE)); \
57 : } else { \
58 : TIMEOUT_LOOP_IDX_DECL(k, ncand, timeoffset) { \
59 : if (incr1) \
60 : i = canditer_next(ci1) - candoff1; \
61 : if (incr2) \
62 : j = canditer_next(ci2) - candoff2; \
63 : if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
64 : dst[k] = TYPE3##_nil; \
65 : nils++; \
66 : } else if (rgt[j] == 0) { \
67 : return BUN_NONE + 1; \
68 : } else { \
69 : dst[k] = (TYPE3) (lft[i] / rgt[j]); \
70 : if (dst[k] < -max || dst[k] > max) { \
71 : return BUN_NONE + 2; \
72 : } \
73 : } \
74 : } \
75 : TIMEOUT_CHECK(timeoffset, TIMEOUT_HANDLER(BUN_NONE)); \
76 : } \
77 : return nils; \
78 : }
79 :
80 : #define DIV_3TYPE_float(TYPE1, TYPE2, TYPE3) \
81 : static BUN \
82 : div_##TYPE1##_##TYPE2##_##TYPE3(const TYPE1 *lft, bool incr1, \
83 : const TYPE2 *rgt, bool incr2, \
84 : TYPE3 *restrict dst, TYPE3 max, \
85 : struct canditer *restrict ci1, \
86 : struct canditer *restrict ci2, \
87 : oid candoff1, oid candoff2) \
88 : { \
89 : BUN nils = 0; \
90 : BUN i = 0, j = 0, ncand = ci1->ncand; \
91 : lng timeoffset = 0; \
92 : QryCtx *qry_ctx = MT_thread_get_qry_ctx(); \
93 : if (qry_ctx != NULL) { \
94 : timeoffset = (qry_ctx->starttime && qry_ctx->querytimeout) ? (qry_ctx->starttime + qry_ctx->querytimeout) : 0; \
95 : } \
96 : \
97 : if (ci1->tpe == cand_dense && ci2->tpe == cand_dense) { \
98 : TIMEOUT_LOOP_IDX_DECL(k, ncand, timeoffset) { \
99 : if (incr1) \
100 : i = canditer_next_dense(ci1) - candoff1; \
101 : if (incr2) \
102 : j = canditer_next_dense(ci2) - candoff2; \
103 : if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
104 : dst[k] = TYPE3##_nil; \
105 : nils++; \
106 : } else if (rgt[j] == 0 || \
107 : (ABSOLUTE(rgt[j]) < 1 && \
108 : GDK_##TYPE3##_max * ABSOLUTE(rgt[j]) < ABSOLUTE(lft[i]))) { \
109 : /* only check for overflow, not for underflow */ \
110 : if (rgt[j] == 0) \
111 : return BUN_NONE + 1; \
112 : ON_OVERFLOW(TYPE1, TYPE2, "/"); \
113 : } else { \
114 : dst[k] = (TYPE3) lft[i] / rgt[j]; \
115 : if (dst[k] < -max || dst[k] > max) { \
116 : return BUN_NONE + 2; \
117 : } \
118 : } \
119 : } \
120 : TIMEOUT_CHECK(timeoffset, TIMEOUT_HANDLER(BUN_NONE)); \
121 : } else { \
122 : TIMEOUT_LOOP_IDX_DECL(k, ncand, timeoffset) { \
123 : if (incr1) \
124 : i = canditer_next(ci1) - candoff1; \
125 : if (incr2) \
126 : j = canditer_next(ci2) - candoff2; \
127 : if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
128 : dst[k] = TYPE3##_nil; \
129 : nils++; \
130 : } else if (rgt[j] == 0 || \
131 : (ABSOLUTE(rgt[j]) < 1 && \
132 : GDK_##TYPE3##_max * ABSOLUTE(rgt[j]) < ABSOLUTE(lft[i]))) { \
133 : /* only check for overflow, not for underflow */ \
134 : if (rgt[j] == 0) \
135 : return BUN_NONE + 1; \
136 : ON_OVERFLOW(TYPE1, TYPE2, "/"); \
137 : } else { \
138 : dst[k] = (TYPE3) lft[i] / rgt[j]; \
139 : if (dst[k] < -max || dst[k] > max) { \
140 : return BUN_NONE + 2; \
141 : } \
142 : } \
143 : } \
144 : TIMEOUT_CHECK(timeoffset, TIMEOUT_HANDLER(BUN_NONE)); \
145 : } \
146 : return nils; \
147 : }
148 :
149 : #define DIV_INT_FLT_INT(TYPE1, TYPE2, TYPE3) \
150 : static BUN \
151 : div_##TYPE1##_##TYPE2##_##TYPE3( \
152 : const TYPE1 *lft, bool incr1, const TYPE2 *rgt, bool incr2, \
153 : TYPE3 *restrict dst, TYPE3 max, \
154 : struct canditer *restrict ci1, struct canditer *restrict ci2, \
155 : oid candoff1, oid candoff2) \
156 : { \
157 : BUN nils = 0; \
158 : BUN i = 0, j = 0, ncand = ci1->ncand; \
159 : lng timeoffset = 0; \
160 : QryCtx *qry_ctx = MT_thread_get_qry_ctx(); \
161 : if (qry_ctx != NULL) { \
162 : timeoffset = (qry_ctx->starttime && qry_ctx->querytimeout) ? (qry_ctx->starttime + qry_ctx->querytimeout) : 0; \
163 : } \
164 : \
165 : if (ci1->tpe == cand_dense && ci2->tpe == cand_dense) { \
166 : TIMEOUT_LOOP_IDX_DECL(k, ncand, timeoffset) { \
167 : if (incr1) \
168 : i = canditer_next_dense(ci1) - candoff1; \
169 : if (incr2) \
170 : j = canditer_next_dense(ci2) - candoff2; \
171 : if (is_##TYPE1##_nil(lft[i]) || \
172 : is_##TYPE2##_nil(rgt[j])) { \
173 : dst[k] = TYPE3##_nil; \
174 : nils++; \
175 : } else if (lft[i] == 0) { \
176 : dst[k] = 0; \
177 : } else if (rgt[j] == 0) { \
178 : return BUN_NONE + 1; \
179 : } else { \
180 : double m = fabs(rgt[j]); \
181 : if (m < 1 && abs##TYPE1(lft[i]) > m * max) { \
182 : ON_OVERFLOW(TYPE1, TYPE2, "/"); \
183 : } else { \
184 : dst[k] = (TYPE3) rounddbl(lft[i] / (ldouble) rgt[j]); \
185 : } \
186 : } \
187 : } \
188 : TIMEOUT_CHECK(timeoffset, TIMEOUT_HANDLER(BUN_NONE)); \
189 : } else { \
190 : TIMEOUT_LOOP_IDX_DECL(k, ncand, timeoffset) { \
191 : if (incr1) \
192 : i = canditer_next(ci1) - candoff1; \
193 : if (incr2) \
194 : j = canditer_next(ci2) - candoff2; \
195 : if (is_##TYPE1##_nil(lft[i]) || \
196 : is_##TYPE2##_nil(rgt[j])) { \
197 : dst[k] = TYPE3##_nil; \
198 : nils++; \
199 : } else if (lft[i] == 0) { \
200 : dst[k] = 0; \
201 : } else if (rgt[j] == 0) { \
202 : return BUN_NONE + 1; \
203 : } else { \
204 : double m = fabs(rgt[j]); \
205 : if (m < 1 && abs##TYPE1(lft[i]) > m * max) { \
206 : ON_OVERFLOW(TYPE1, TYPE2, "/"); \
207 : } else { \
208 : dst[k] = (TYPE3) rounddbl(lft[i] / (ldouble) rgt[j]); \
209 : } \
210 : } \
211 : } \
212 : TIMEOUT_CHECK(timeoffset, TIMEOUT_HANDLER(BUN_NONE)); \
213 : } \
214 : return nils; \
215 : }
216 :
217 0 : DIV_INT_FLT_INT(bte, flt, bte)
218 0 : DIV_INT_FLT_INT(bte, flt, sht)
219 0 : DIV_INT_FLT_INT(bte, flt, int)
220 0 : DIV_INT_FLT_INT(bte, flt, lng)
221 0 : DIV_INT_FLT_INT(sht, flt, bte)
222 0 : DIV_INT_FLT_INT(sht, flt, sht)
223 0 : DIV_INT_FLT_INT(sht, flt, int)
224 0 : DIV_INT_FLT_INT(sht, flt, lng)
225 0 : DIV_INT_FLT_INT(int, flt, bte)
226 0 : DIV_INT_FLT_INT(int, flt, sht)
227 16 : DIV_INT_FLT_INT(int, flt, int)
228 0 : DIV_INT_FLT_INT(int, flt, lng)
229 0 : DIV_INT_FLT_INT(lng, flt, bte)
230 0 : DIV_INT_FLT_INT(lng, flt, sht)
231 0 : DIV_INT_FLT_INT(lng, flt, int)
232 22 : DIV_INT_FLT_INT(lng, flt, lng)
233 : #ifdef HAVE_HGE
234 0 : DIV_INT_FLT_INT(bte, flt, hge)
235 0 : DIV_INT_FLT_INT(sht, flt, hge)
236 0 : DIV_INT_FLT_INT(int, flt, hge)
237 0 : DIV_INT_FLT_INT(lng, flt, hge)
238 0 : DIV_INT_FLT_INT(hge, flt, bte)
239 0 : DIV_INT_FLT_INT(hge, flt, sht)
240 0 : DIV_INT_FLT_INT(hge, flt, int)
241 0 : DIV_INT_FLT_INT(hge, flt, lng)
242 0 : DIV_INT_FLT_INT(hge, flt, hge)
243 : #endif
244 :
245 0 : DIV_INT_FLT_INT(bte, dbl, bte)
246 0 : DIV_INT_FLT_INT(bte, dbl, sht)
247 0 : DIV_INT_FLT_INT(bte, dbl, int)
248 0 : DIV_INT_FLT_INT(bte, dbl, lng)
249 0 : DIV_INT_FLT_INT(sht, dbl, bte)
250 0 : DIV_INT_FLT_INT(sht, dbl, sht)
251 0 : DIV_INT_FLT_INT(sht, dbl, int)
252 0 : DIV_INT_FLT_INT(sht, dbl, lng)
253 0 : DIV_INT_FLT_INT(int, dbl, bte)
254 0 : DIV_INT_FLT_INT(int, dbl, sht)
255 12 : DIV_INT_FLT_INT(int, dbl, int)
256 0 : DIV_INT_FLT_INT(int, dbl, lng)
257 0 : DIV_INT_FLT_INT(lng, dbl, bte)
258 0 : DIV_INT_FLT_INT(lng, dbl, sht)
259 0 : DIV_INT_FLT_INT(lng, dbl, int)
260 24 : DIV_INT_FLT_INT(lng, dbl, lng)
261 : #ifdef HAVE_HGE
262 0 : DIV_INT_FLT_INT(bte, dbl, hge)
263 0 : DIV_INT_FLT_INT(sht, dbl, hge)
264 0 : DIV_INT_FLT_INT(int, dbl, hge)
265 0 : DIV_INT_FLT_INT(lng, dbl, hge)
266 0 : DIV_INT_FLT_INT(hge, dbl, bte)
267 0 : DIV_INT_FLT_INT(hge, dbl, sht)
268 0 : DIV_INT_FLT_INT(hge, dbl, int)
269 0 : DIV_INT_FLT_INT(hge, dbl, lng)
270 0 : DIV_INT_FLT_INT(hge, dbl, hge)
271 : #endif
272 :
273 169 : DIV_3TYPE(bte, bte, bte)
274 0 : DIV_3TYPE(bte, bte, sht)
275 0 : DIV_3TYPE(bte, bte, int)
276 0 : DIV_3TYPE(bte, bte, lng)
277 : #ifdef HAVE_HGE
278 0 : DIV_3TYPE(bte, bte, hge)
279 : #endif
280 0 : DIV_3TYPE(bte, bte, flt)
281 0 : DIV_3TYPE(bte, bte, dbl)
282 0 : DIV_3TYPE(bte, sht, bte)
283 0 : DIV_3TYPE(bte, sht, sht)
284 0 : DIV_3TYPE(bte, sht, int)
285 0 : DIV_3TYPE(bte, sht, lng)
286 : #ifdef HAVE_HGE
287 0 : DIV_3TYPE(bte, sht, hge)
288 : #endif
289 0 : DIV_3TYPE(bte, sht, flt)
290 0 : DIV_3TYPE(bte, sht, dbl)
291 0 : DIV_3TYPE(bte, int, bte)
292 0 : DIV_3TYPE(bte, int, sht)
293 0 : DIV_3TYPE(bte, int, int)
294 0 : DIV_3TYPE(bte, int, lng)
295 : #ifdef HAVE_HGE
296 0 : DIV_3TYPE(bte, int, hge)
297 : #endif
298 0 : DIV_3TYPE(bte, int, flt)
299 0 : DIV_3TYPE(bte, int, dbl)
300 0 : DIV_3TYPE(bte, lng, bte)
301 0 : DIV_3TYPE(bte, lng, sht)
302 0 : DIV_3TYPE(bte, lng, int)
303 0 : DIV_3TYPE(bte, lng, lng)
304 : #ifdef HAVE_HGE
305 0 : DIV_3TYPE(bte, lng, hge)
306 : #endif
307 0 : DIV_3TYPE(bte, lng, flt)
308 0 : DIV_3TYPE(bte, lng, dbl)
309 : #ifdef HAVE_HGE
310 0 : DIV_3TYPE(bte, hge, bte)
311 0 : DIV_3TYPE(bte, hge, sht)
312 0 : DIV_3TYPE(bte, hge, int)
313 0 : DIV_3TYPE(bte, hge, lng)
314 0 : DIV_3TYPE(bte, hge, hge)
315 0 : DIV_3TYPE(bte, hge, flt)
316 0 : DIV_3TYPE(bte, hge, dbl)
317 : #endif
318 0 : DIV_3TYPE_float(bte, flt, flt)
319 0 : DIV_3TYPE_float(bte, flt, dbl)
320 0 : DIV_3TYPE_float(bte, dbl, dbl)
321 40 : DIV_3TYPE(sht, bte, sht)
322 0 : DIV_3TYPE(sht, bte, int)
323 0 : DIV_3TYPE(sht, bte, lng)
324 : #ifdef HAVE_HGE
325 0 : DIV_3TYPE(sht, bte, hge)
326 : #endif
327 0 : DIV_3TYPE(sht, bte, flt)
328 0 : DIV_3TYPE(sht, bte, dbl)
329 73 : DIV_3TYPE(sht, sht, sht)
330 0 : DIV_3TYPE(sht, sht, int)
331 0 : DIV_3TYPE(sht, sht, lng)
332 : #ifdef HAVE_HGE
333 0 : DIV_3TYPE(sht, sht, hge)
334 : #endif
335 0 : DIV_3TYPE(sht, sht, flt)
336 0 : DIV_3TYPE(sht, sht, dbl)
337 0 : DIV_3TYPE(sht, int, sht)
338 0 : DIV_3TYPE(sht, int, int)
339 0 : DIV_3TYPE(sht, int, lng)
340 : #ifdef HAVE_HGE
341 0 : DIV_3TYPE(sht, int, hge)
342 : #endif
343 0 : DIV_3TYPE(sht, int, flt)
344 0 : DIV_3TYPE(sht, int, dbl)
345 0 : DIV_3TYPE(sht, lng, sht)
346 0 : DIV_3TYPE(sht, lng, int)
347 0 : DIV_3TYPE(sht, lng, lng)
348 : #ifdef HAVE_HGE
349 0 : DIV_3TYPE(sht, lng, hge)
350 : #endif
351 0 : DIV_3TYPE(sht, lng, flt)
352 0 : DIV_3TYPE(sht, lng, dbl)
353 : #ifdef HAVE_HGE
354 0 : DIV_3TYPE(sht, hge, sht)
355 0 : DIV_3TYPE(sht, hge, int)
356 0 : DIV_3TYPE(sht, hge, lng)
357 0 : DIV_3TYPE(sht, hge, hge)
358 0 : DIV_3TYPE(sht, hge, flt)
359 0 : DIV_3TYPE(sht, hge, dbl)
360 : #endif
361 0 : DIV_3TYPE_float(sht, flt, flt)
362 0 : DIV_3TYPE_float(sht, flt, dbl)
363 0 : DIV_3TYPE_float(sht, dbl, dbl)
364 4838515 : DIV_3TYPE(int, bte, int)
365 0 : DIV_3TYPE(int, bte, lng)
366 : #ifdef HAVE_HGE
367 0 : DIV_3TYPE(int, bte, hge)
368 : #endif
369 0 : DIV_3TYPE(int, bte, flt)
370 0 : DIV_3TYPE(int, bte, dbl)
371 76 : DIV_3TYPE(int, sht, int)
372 0 : DIV_3TYPE(int, sht, lng)
373 : #ifdef HAVE_HGE
374 0 : DIV_3TYPE(int, sht, hge)
375 : #endif
376 0 : DIV_3TYPE(int, sht, flt)
377 0 : DIV_3TYPE(int, sht, dbl)
378 409 : DIV_3TYPE(int, int, int)
379 0 : DIV_3TYPE(int, int, lng)
380 : #ifdef HAVE_HGE
381 0 : DIV_3TYPE(int, int, hge)
382 : #endif
383 0 : DIV_3TYPE(int, int, flt)
384 0 : DIV_3TYPE(int, int, dbl)
385 0 : DIV_3TYPE(int, lng, int)
386 0 : DIV_3TYPE(int, lng, lng)
387 : #ifdef HAVE_HGE
388 0 : DIV_3TYPE(int, lng, hge)
389 : #endif
390 0 : DIV_3TYPE(int, lng, flt)
391 0 : DIV_3TYPE(int, lng, dbl)
392 : #ifdef HAVE_HGE
393 0 : DIV_3TYPE(int, hge, int)
394 0 : DIV_3TYPE(int, hge, lng)
395 0 : DIV_3TYPE(int, hge, hge)
396 0 : DIV_3TYPE(int, hge, flt)
397 0 : DIV_3TYPE(int, hge, dbl)
398 : #endif
399 0 : DIV_3TYPE_float(int, flt, flt)
400 0 : DIV_3TYPE_float(int, flt, dbl)
401 0 : DIV_3TYPE_float(int, dbl, dbl)
402 19779 : DIV_3TYPE(lng, bte, lng)
403 : #ifdef HAVE_HGE
404 0 : DIV_3TYPE(lng, bte, hge)
405 : #endif
406 0 : DIV_3TYPE(lng, bte, flt)
407 0 : DIV_3TYPE(lng, bte, dbl)
408 12 : DIV_3TYPE(lng, sht, lng)
409 : #ifdef HAVE_HGE
410 0 : DIV_3TYPE(lng, sht, hge)
411 : #endif
412 0 : DIV_3TYPE(lng, sht, flt)
413 0 : DIV_3TYPE(lng, sht, dbl)
414 124 : DIV_3TYPE(lng, int, lng)
415 : #ifdef HAVE_HGE
416 0 : DIV_3TYPE(lng, int, hge)
417 : #endif
418 0 : DIV_3TYPE(lng, int, flt)
419 0 : DIV_3TYPE(lng, int, dbl)
420 218 : DIV_3TYPE(lng, lng, lng)
421 : #ifdef HAVE_HGE
422 0 : DIV_3TYPE(lng, lng, hge)
423 : #endif
424 0 : DIV_3TYPE(lng, lng, flt)
425 0 : DIV_3TYPE(lng, lng, dbl)
426 : #ifdef HAVE_HGE
427 0 : DIV_3TYPE(lng, hge, lng)
428 0 : DIV_3TYPE(lng, hge, hge)
429 0 : DIV_3TYPE(lng, hge, flt)
430 0 : DIV_3TYPE(lng, hge, dbl)
431 : #endif
432 0 : DIV_3TYPE_float(lng, flt, flt)
433 0 : DIV_3TYPE_float(lng, flt, dbl)
434 0 : DIV_3TYPE_float(lng, dbl, dbl)
435 : #ifdef HAVE_HGE
436 21733 : DIV_3TYPE(hge, bte, hge)
437 0 : DIV_3TYPE(hge, bte, flt)
438 0 : DIV_3TYPE(hge, bte, dbl)
439 0 : DIV_3TYPE(hge, sht, hge)
440 0 : DIV_3TYPE(hge, sht, flt)
441 0 : DIV_3TYPE(hge, sht, dbl)
442 3474 : DIV_3TYPE(hge, int, hge)
443 0 : DIV_3TYPE(hge, int, flt)
444 0 : DIV_3TYPE(hge, int, dbl)
445 980 : DIV_3TYPE(hge, lng, hge)
446 0 : DIV_3TYPE(hge, lng, flt)
447 0 : DIV_3TYPE(hge, lng, dbl)
448 218575 : DIV_3TYPE(hge, hge, hge)
449 0 : DIV_3TYPE(hge, hge, flt)
450 0 : DIV_3TYPE(hge, hge, dbl)
451 0 : DIV_3TYPE_float(hge, flt, flt)
452 0 : DIV_3TYPE_float(hge, flt, dbl)
453 0 : DIV_3TYPE_float(hge, dbl, dbl)
454 : #endif
455 0 : DIV_3TYPE(flt, bte, flt)
456 0 : DIV_3TYPE(flt, bte, dbl)
457 0 : DIV_3TYPE(flt, sht, flt)
458 0 : DIV_3TYPE(flt, sht, dbl)
459 0 : DIV_3TYPE(flt, int, flt)
460 0 : DIV_3TYPE(flt, int, dbl)
461 0 : DIV_3TYPE(flt, lng, flt)
462 0 : DIV_3TYPE(flt, lng, dbl)
463 : #ifdef HAVE_HGE
464 0 : DIV_3TYPE(flt, hge, flt)
465 0 : DIV_3TYPE(flt, hge, dbl)
466 : #endif
467 19 : DIV_3TYPE_float(flt, flt, flt)
468 0 : DIV_3TYPE_float(flt, flt, dbl)
469 0 : DIV_3TYPE_float(flt, dbl, dbl)
470 0 : DIV_3TYPE(dbl, bte, dbl)
471 0 : DIV_3TYPE(dbl, sht, dbl)
472 0 : DIV_3TYPE(dbl, int, dbl)
473 32890 : DIV_3TYPE(dbl, lng, dbl)
474 : #ifdef HAVE_HGE
475 0 : DIV_3TYPE(dbl, hge, dbl)
476 : #endif
477 0 : DIV_3TYPE_float(dbl, flt, dbl)
478 1279733 : DIV_3TYPE_float(dbl, dbl, dbl)
479 :
480 : static BUN
481 3440 : div_typeswitchloop(const void *lft, int tp1, bool incr1,
482 : const void *rgt, int tp2, bool incr2,
483 : void *restrict dst, int tp,
484 : struct canditer *restrict ci1, struct canditer *restrict ci2,
485 : oid candoff1, oid candoff2, const char *func)
486 : {
487 3440 : BUN nils;
488 :
489 3440 : tp1 = ATOMbasetype(tp1);
490 3440 : tp2 = ATOMbasetype(tp2);
491 3440 : tp = ATOMbasetype(tp);
492 3440 : switch (tp1) {
493 49 : case TYPE_bte:
494 49 : switch (tp2) {
495 49 : case TYPE_bte:
496 49 : switch (tp) {
497 49 : case TYPE_bte:
498 49 : nils = div_bte_bte_bte(lft, incr1, rgt, incr2,
499 : dst, GDK_bte_max,
500 : ci1, ci2, candoff1, candoff2);
501 49 : break;
502 0 : case TYPE_sht:
503 0 : nils = div_bte_bte_sht(lft, incr1, rgt, incr2,
504 : dst, GDK_sht_max,
505 : ci1, ci2, candoff1, candoff2);
506 0 : break;
507 0 : case TYPE_int:
508 0 : nils = div_bte_bte_int(lft, incr1, rgt, incr2,
509 : dst, GDK_int_max,
510 : ci1, ci2, candoff1, candoff2);
511 0 : break;
512 0 : case TYPE_lng:
513 0 : nils = div_bte_bte_lng(lft, incr1, rgt, incr2,
514 : dst, GDK_lng_max,
515 : ci1, ci2, candoff1, candoff2);
516 0 : break;
517 : #ifdef HAVE_HGE
518 0 : case TYPE_hge:
519 0 : nils = div_bte_bte_hge(lft, incr1, rgt, incr2,
520 : dst, GDK_hge_max,
521 : ci1, ci2, candoff1, candoff2);
522 0 : break;
523 : #endif
524 0 : case TYPE_flt:
525 0 : nils = div_bte_bte_flt(lft, incr1, rgt, incr2,
526 : dst, GDK_flt_max,
527 : ci1, ci2, candoff1, candoff2);
528 0 : break;
529 0 : case TYPE_dbl:
530 0 : nils = div_bte_bte_dbl(lft, incr1, rgt, incr2,
531 : dst, GDK_dbl_max,
532 : ci1, ci2, candoff1, candoff2);
533 0 : break;
534 0 : default:
535 0 : goto unsupported;
536 : }
537 : break;
538 0 : case TYPE_sht:
539 0 : switch (tp) {
540 0 : case TYPE_bte:
541 0 : nils = div_bte_sht_bte(lft, incr1, rgt, incr2,
542 : dst, GDK_bte_max,
543 : ci1, ci2, candoff1, candoff2);
544 0 : break;
545 0 : case TYPE_sht:
546 0 : nils = div_bte_sht_sht(lft, incr1, rgt, incr2,
547 : dst, GDK_sht_max,
548 : ci1, ci2, candoff1, candoff2);
549 0 : break;
550 0 : case TYPE_int:
551 0 : nils = div_bte_sht_int(lft, incr1, rgt, incr2,
552 : dst, GDK_int_max,
553 : ci1, ci2, candoff1, candoff2);
554 0 : break;
555 0 : case TYPE_lng:
556 0 : nils = div_bte_sht_lng(lft, incr1, rgt, incr2,
557 : dst, GDK_lng_max,
558 : ci1, ci2, candoff1, candoff2);
559 0 : break;
560 : #ifdef HAVE_HGE
561 0 : case TYPE_hge:
562 0 : nils = div_bte_sht_hge(lft, incr1, rgt, incr2,
563 : dst, GDK_hge_max,
564 : ci1, ci2, candoff1, candoff2);
565 0 : break;
566 : #endif
567 0 : case TYPE_flt:
568 0 : nils = div_bte_sht_flt(lft, incr1, rgt, incr2,
569 : dst, GDK_flt_max,
570 : ci1, ci2, candoff1, candoff2);
571 0 : break;
572 0 : case TYPE_dbl:
573 0 : nils = div_bte_sht_dbl(lft, incr1, rgt, incr2,
574 : dst, GDK_dbl_max,
575 : ci1, ci2, candoff1, candoff2);
576 0 : break;
577 0 : default:
578 0 : goto unsupported;
579 : }
580 : break;
581 0 : case TYPE_int:
582 0 : switch (tp) {
583 0 : case TYPE_bte:
584 0 : nils = div_bte_int_bte(lft, incr1, rgt, incr2,
585 : dst, GDK_bte_max,
586 : ci1, ci2, candoff1, candoff2);
587 0 : break;
588 0 : case TYPE_sht:
589 0 : nils = div_bte_int_sht(lft, incr1, rgt, incr2,
590 : dst, GDK_sht_max,
591 : ci1, ci2, candoff1, candoff2);
592 0 : break;
593 0 : case TYPE_int:
594 0 : nils = div_bte_int_int(lft, incr1, rgt, incr2,
595 : dst, GDK_int_max,
596 : ci1, ci2, candoff1, candoff2);
597 0 : break;
598 0 : case TYPE_lng:
599 0 : nils = div_bte_int_lng(lft, incr1, rgt, incr2,
600 : dst, GDK_lng_max,
601 : ci1, ci2, candoff1, candoff2);
602 0 : break;
603 : #ifdef HAVE_HGE
604 0 : case TYPE_hge:
605 0 : nils = div_bte_int_hge(lft, incr1, rgt, incr2,
606 : dst, GDK_hge_max,
607 : ci1, ci2, candoff1, candoff2);
608 0 : break;
609 : #endif
610 0 : case TYPE_flt:
611 0 : nils = div_bte_int_flt(lft, incr1, rgt, incr2,
612 : dst, GDK_flt_max,
613 : ci1, ci2, candoff1, candoff2);
614 0 : break;
615 0 : case TYPE_dbl:
616 0 : nils = div_bte_int_dbl(lft, incr1, rgt, incr2,
617 : dst, GDK_dbl_max,
618 : ci1, ci2, candoff1, candoff2);
619 0 : break;
620 0 : default:
621 0 : goto unsupported;
622 : }
623 : break;
624 0 : case TYPE_lng:
625 0 : switch (tp) {
626 0 : case TYPE_bte:
627 0 : nils = div_bte_lng_bte(lft, incr1, rgt, incr2,
628 : dst, GDK_bte_max,
629 : ci1, ci2, candoff1, candoff2);
630 0 : break;
631 0 : case TYPE_sht:
632 0 : nils = div_bte_lng_sht(lft, incr1, rgt, incr2,
633 : dst, GDK_sht_max,
634 : ci1, ci2, candoff1, candoff2);
635 0 : break;
636 0 : case TYPE_int:
637 0 : nils = div_bte_lng_int(lft, incr1, rgt, incr2,
638 : dst, GDK_int_max,
639 : ci1, ci2, candoff1, candoff2);
640 0 : break;
641 0 : case TYPE_lng:
642 0 : nils = div_bte_lng_lng(lft, incr1, rgt, incr2,
643 : dst, GDK_lng_max,
644 : ci1, ci2, candoff1, candoff2);
645 0 : break;
646 : #ifdef HAVE_HGE
647 0 : case TYPE_hge:
648 0 : nils = div_bte_lng_hge(lft, incr1, rgt, incr2,
649 : dst, GDK_hge_max,
650 : ci1, ci2, candoff1, candoff2);
651 0 : break;
652 : #endif
653 0 : case TYPE_flt:
654 0 : nils = div_bte_lng_flt(lft, incr1, rgt, incr2,
655 : dst, GDK_flt_max,
656 : ci1, ci2, candoff1, candoff2);
657 0 : break;
658 0 : case TYPE_dbl:
659 0 : nils = div_bte_lng_dbl(lft, incr1, rgt, incr2,
660 : dst, GDK_dbl_max,
661 : ci1, ci2, candoff1, candoff2);
662 0 : break;
663 0 : default:
664 0 : goto unsupported;
665 : }
666 : break;
667 : #ifdef HAVE_HGE
668 0 : case TYPE_hge:
669 0 : switch (tp) {
670 0 : case TYPE_bte:
671 0 : nils = div_bte_hge_bte(lft, incr1, rgt, incr2,
672 : dst, GDK_bte_max,
673 : ci1, ci2, candoff1, candoff2);
674 0 : break;
675 0 : case TYPE_sht:
676 0 : nils = div_bte_hge_sht(lft, incr1, rgt, incr2,
677 : dst, GDK_sht_max,
678 : ci1, ci2, candoff1, candoff2);
679 0 : break;
680 0 : case TYPE_int:
681 0 : nils = div_bte_hge_int(lft, incr1, rgt, incr2,
682 : dst, GDK_int_max,
683 : ci1, ci2, candoff1, candoff2);
684 0 : break;
685 0 : case TYPE_lng:
686 0 : nils = div_bte_hge_lng(lft, incr1, rgt, incr2,
687 : dst, GDK_lng_max,
688 : ci1, ci2, candoff1, candoff2);
689 0 : break;
690 0 : case TYPE_hge:
691 0 : nils = div_bte_hge_hge(lft, incr1, rgt, incr2,
692 : dst, GDK_hge_max,
693 : ci1, ci2, candoff1, candoff2);
694 0 : break;
695 0 : case TYPE_flt:
696 0 : nils = div_bte_hge_flt(lft, incr1, rgt, incr2,
697 : dst, GDK_flt_max,
698 : ci1, ci2, candoff1, candoff2);
699 0 : break;
700 0 : case TYPE_dbl:
701 0 : nils = div_bte_hge_dbl(lft, incr1, rgt, incr2,
702 : dst, GDK_dbl_max,
703 : ci1, ci2, candoff1, candoff2);
704 0 : break;
705 0 : default:
706 0 : goto unsupported;
707 : }
708 : break;
709 : #endif
710 0 : case TYPE_flt:
711 0 : switch (tp) {
712 0 : case TYPE_bte:
713 0 : nils = div_bte_flt_bte(lft, incr1, rgt, incr2,
714 : dst, GDK_bte_max,
715 : ci1, ci2, candoff1, candoff2);
716 0 : break;
717 0 : case TYPE_sht:
718 0 : nils = div_bte_flt_sht(lft, incr1, rgt, incr2,
719 : dst, GDK_sht_max,
720 : ci1, ci2, candoff1, candoff2);
721 0 : break;
722 0 : case TYPE_int:
723 0 : nils = div_bte_flt_int(lft, incr1, rgt, incr2,
724 : dst, GDK_int_max,
725 : ci1, ci2, candoff1, candoff2);
726 0 : break;
727 0 : case TYPE_lng:
728 0 : nils = div_bte_flt_lng(lft, incr1, rgt, incr2,
729 : dst, GDK_lng_max,
730 : ci1, ci2, candoff1, candoff2);
731 0 : break;
732 : #ifdef HAVE_HGE
733 0 : case TYPE_hge:
734 0 : nils = div_bte_flt_hge(lft, incr1, rgt, incr2,
735 : dst, GDK_hge_max,
736 : ci1, ci2, candoff1, candoff2);
737 0 : break;
738 : #endif
739 0 : case TYPE_flt:
740 0 : nils = div_bte_flt_flt(lft, incr1, rgt, incr2,
741 : dst, GDK_flt_max,
742 : ci1, ci2, candoff1, candoff2);
743 0 : break;
744 0 : case TYPE_dbl:
745 0 : nils = div_bte_flt_dbl(lft, incr1, rgt, incr2,
746 : dst, GDK_dbl_max,
747 : ci1, ci2, candoff1, candoff2);
748 0 : break;
749 0 : default:
750 0 : goto unsupported;
751 : }
752 : break;
753 0 : case TYPE_dbl:
754 0 : switch (tp) {
755 0 : case TYPE_bte:
756 0 : nils = div_bte_dbl_bte(lft, incr1, rgt, incr2,
757 : dst, GDK_bte_max,
758 : ci1, ci2, candoff1, candoff2);
759 0 : break;
760 0 : case TYPE_sht:
761 0 : nils = div_bte_dbl_sht(lft, incr1, rgt, incr2,
762 : dst, GDK_sht_max,
763 : ci1, ci2, candoff1, candoff2);
764 0 : break;
765 0 : case TYPE_int:
766 0 : nils = div_bte_dbl_int(lft, incr1, rgt, incr2,
767 : dst, GDK_int_max,
768 : ci1, ci2, candoff1, candoff2);
769 0 : break;
770 0 : case TYPE_lng:
771 0 : nils = div_bte_dbl_lng(lft, incr1, rgt, incr2,
772 : dst, GDK_lng_max,
773 : ci1, ci2, candoff1, candoff2);
774 0 : break;
775 : #ifdef HAVE_HGE
776 0 : case TYPE_hge:
777 0 : nils = div_bte_dbl_hge(lft, incr1, rgt, incr2,
778 : dst, GDK_hge_max,
779 : ci1, ci2, candoff1, candoff2);
780 0 : break;
781 : #endif
782 0 : case TYPE_dbl:
783 0 : nils = div_bte_dbl_dbl(lft, incr1, rgt, incr2,
784 : dst, GDK_dbl_max,
785 : ci1, ci2, candoff1, candoff2);
786 0 : break;
787 0 : default:
788 0 : goto unsupported;
789 : }
790 : break;
791 0 : default:
792 0 : goto unsupported;
793 : }
794 : break;
795 28 : case TYPE_sht:
796 28 : switch (tp2) {
797 10 : case TYPE_bte:
798 10 : switch (tp) {
799 10 : case TYPE_sht:
800 10 : nils = div_sht_bte_sht(lft, incr1, rgt, incr2,
801 : dst, GDK_sht_max,
802 : ci1, ci2, candoff1, candoff2);
803 10 : break;
804 0 : case TYPE_int:
805 0 : nils = div_sht_bte_int(lft, incr1, rgt, incr2,
806 : dst, GDK_int_max,
807 : ci1, ci2, candoff1, candoff2);
808 0 : break;
809 0 : case TYPE_lng:
810 0 : nils = div_sht_bte_lng(lft, incr1, rgt, incr2,
811 : dst, GDK_lng_max,
812 : ci1, ci2, candoff1, candoff2);
813 0 : break;
814 : #ifdef HAVE_HGE
815 0 : case TYPE_hge:
816 0 : nils = div_sht_bte_hge(lft, incr1, rgt, incr2,
817 : dst, GDK_hge_max,
818 : ci1, ci2, candoff1, candoff2);
819 0 : break;
820 : #endif
821 0 : case TYPE_flt:
822 0 : nils = div_sht_bte_flt(lft, incr1, rgt, incr2,
823 : dst, GDK_flt_max,
824 : ci1, ci2, candoff1, candoff2);
825 0 : break;
826 0 : case TYPE_dbl:
827 0 : nils = div_sht_bte_dbl(lft, incr1, rgt, incr2,
828 : dst, GDK_dbl_max,
829 : ci1, ci2, candoff1, candoff2);
830 0 : break;
831 0 : default:
832 0 : goto unsupported;
833 : }
834 : break;
835 18 : case TYPE_sht:
836 18 : switch (tp) {
837 18 : case TYPE_sht:
838 18 : nils = div_sht_sht_sht(lft, incr1, rgt, incr2,
839 : dst, GDK_sht_max,
840 : ci1, ci2, candoff1, candoff2);
841 18 : break;
842 0 : case TYPE_int:
843 0 : nils = div_sht_sht_int(lft, incr1, rgt, incr2,
844 : dst, GDK_int_max,
845 : ci1, ci2, candoff1, candoff2);
846 0 : break;
847 0 : case TYPE_lng:
848 0 : nils = div_sht_sht_lng(lft, incr1, rgt, incr2,
849 : dst, GDK_lng_max,
850 : ci1, ci2, candoff1, candoff2);
851 0 : break;
852 : #ifdef HAVE_HGE
853 0 : case TYPE_hge:
854 0 : nils = div_sht_sht_hge(lft, incr1, rgt, incr2,
855 : dst, GDK_hge_max,
856 : ci1, ci2, candoff1, candoff2);
857 0 : break;
858 : #endif
859 0 : case TYPE_flt:
860 0 : nils = div_sht_sht_flt(lft, incr1, rgt, incr2,
861 : dst, GDK_flt_max,
862 : ci1, ci2, candoff1, candoff2);
863 0 : break;
864 0 : case TYPE_dbl:
865 0 : nils = div_sht_sht_dbl(lft, incr1, rgt, incr2,
866 : dst, GDK_dbl_max,
867 : ci1, ci2, candoff1, candoff2);
868 0 : break;
869 0 : default:
870 0 : goto unsupported;
871 : }
872 : break;
873 0 : case TYPE_int:
874 0 : switch (tp) {
875 0 : case TYPE_sht:
876 0 : nils = div_sht_int_sht(lft, incr1, rgt, incr2,
877 : dst, GDK_sht_max,
878 : ci1, ci2, candoff1, candoff2);
879 0 : break;
880 0 : case TYPE_int:
881 0 : nils = div_sht_int_int(lft, incr1, rgt, incr2,
882 : dst, GDK_int_max,
883 : ci1, ci2, candoff1, candoff2);
884 0 : break;
885 0 : case TYPE_lng:
886 0 : nils = div_sht_int_lng(lft, incr1, rgt, incr2,
887 : dst, GDK_lng_max,
888 : ci1, ci2, candoff1, candoff2);
889 0 : break;
890 : #ifdef HAVE_HGE
891 0 : case TYPE_hge:
892 0 : nils = div_sht_int_hge(lft, incr1, rgt, incr2,
893 : dst, GDK_hge_max,
894 : ci1, ci2, candoff1, candoff2);
895 0 : break;
896 : #endif
897 0 : case TYPE_flt:
898 0 : nils = div_sht_int_flt(lft, incr1, rgt, incr2,
899 : dst, GDK_flt_max,
900 : ci1, ci2, candoff1, candoff2);
901 0 : break;
902 0 : case TYPE_dbl:
903 0 : nils = div_sht_int_dbl(lft, incr1, rgt, incr2,
904 : dst, GDK_dbl_max,
905 : ci1, ci2, candoff1, candoff2);
906 0 : break;
907 0 : default:
908 0 : goto unsupported;
909 : }
910 : break;
911 0 : case TYPE_lng:
912 0 : switch (tp) {
913 0 : case TYPE_sht:
914 0 : nils = div_sht_lng_sht(lft, incr1, rgt, incr2,
915 : dst, GDK_sht_max,
916 : ci1, ci2, candoff1, candoff2);
917 0 : break;
918 0 : case TYPE_int:
919 0 : nils = div_sht_lng_int(lft, incr1, rgt, incr2,
920 : dst, GDK_int_max,
921 : ci1, ci2, candoff1, candoff2);
922 0 : break;
923 0 : case TYPE_lng:
924 0 : nils = div_sht_lng_lng(lft, incr1, rgt, incr2,
925 : dst, GDK_lng_max,
926 : ci1, ci2, candoff1, candoff2);
927 0 : break;
928 : #ifdef HAVE_HGE
929 0 : case TYPE_hge:
930 0 : nils = div_sht_lng_hge(lft, incr1, rgt, incr2,
931 : dst, GDK_hge_max,
932 : ci1, ci2, candoff1, candoff2);
933 0 : break;
934 : #endif
935 0 : case TYPE_flt:
936 0 : nils = div_sht_lng_flt(lft, incr1, rgt, incr2,
937 : dst, GDK_flt_max,
938 : ci1, ci2, candoff1, candoff2);
939 0 : break;
940 0 : case TYPE_dbl:
941 0 : nils = div_sht_lng_dbl(lft, incr1, rgt, incr2,
942 : dst, GDK_dbl_max,
943 : ci1, ci2, candoff1, candoff2);
944 0 : break;
945 0 : default:
946 0 : goto unsupported;
947 : }
948 : break;
949 : #ifdef HAVE_HGE
950 0 : case TYPE_hge:
951 0 : switch (tp) {
952 0 : case TYPE_sht:
953 0 : nils = div_sht_hge_sht(lft, incr1, rgt, incr2,
954 : dst, GDK_sht_max,
955 : ci1, ci2, candoff1, candoff2);
956 0 : break;
957 0 : case TYPE_int:
958 0 : nils = div_sht_hge_int(lft, incr1, rgt, incr2,
959 : dst, GDK_int_max,
960 : ci1, ci2, candoff1, candoff2);
961 0 : break;
962 0 : case TYPE_lng:
963 0 : nils = div_sht_hge_lng(lft, incr1, rgt, incr2,
964 : dst, GDK_lng_max,
965 : ci1, ci2, candoff1, candoff2);
966 0 : break;
967 0 : case TYPE_hge:
968 0 : nils = div_sht_hge_hge(lft, incr1, rgt, incr2,
969 : dst, GDK_hge_max,
970 : ci1, ci2, candoff1, candoff2);
971 0 : break;
972 0 : case TYPE_flt:
973 0 : nils = div_sht_hge_flt(lft, incr1, rgt, incr2,
974 : dst, GDK_flt_max,
975 : ci1, ci2, candoff1, candoff2);
976 0 : break;
977 0 : case TYPE_dbl:
978 0 : nils = div_sht_hge_dbl(lft, incr1, rgt, incr2,
979 : dst, GDK_dbl_max,
980 : ci1, ci2, candoff1, candoff2);
981 0 : break;
982 0 : default:
983 0 : goto unsupported;
984 : }
985 : break;
986 : #endif
987 0 : case TYPE_flt:
988 0 : switch (tp) {
989 0 : case TYPE_bte:
990 0 : nils = div_sht_flt_bte(lft, incr1, rgt, incr2,
991 : dst, GDK_bte_max,
992 : ci1, ci2, candoff1, candoff2);
993 0 : break;
994 0 : case TYPE_sht:
995 0 : nils = div_sht_flt_sht(lft, incr1, rgt, incr2,
996 : dst, GDK_sht_max,
997 : ci1, ci2, candoff1, candoff2);
998 0 : break;
999 0 : case TYPE_int:
1000 0 : nils = div_sht_flt_int(lft, incr1, rgt, incr2,
1001 : dst, GDK_int_max,
1002 : ci1, ci2, candoff1, candoff2);
1003 0 : break;
1004 0 : case TYPE_lng:
1005 0 : nils = div_sht_flt_lng(lft, incr1, rgt, incr2,
1006 : dst, GDK_lng_max,
1007 : ci1, ci2, candoff1, candoff2);
1008 0 : break;
1009 : #ifdef HAVE_HGE
1010 0 : case TYPE_hge:
1011 0 : nils = div_sht_flt_hge(lft, incr1, rgt, incr2,
1012 : dst, GDK_hge_max,
1013 : ci1, ci2, candoff1, candoff2);
1014 0 : break;
1015 : #endif
1016 0 : case TYPE_flt:
1017 0 : nils = div_sht_flt_flt(lft, incr1, rgt, incr2,
1018 : dst, GDK_flt_max,
1019 : ci1, ci2, candoff1, candoff2);
1020 0 : break;
1021 0 : case TYPE_dbl:
1022 0 : nils = div_sht_flt_dbl(lft, incr1, rgt, incr2,
1023 : dst, GDK_dbl_max,
1024 : ci1, ci2, candoff1, candoff2);
1025 0 : break;
1026 0 : default:
1027 0 : goto unsupported;
1028 : }
1029 : break;
1030 0 : case TYPE_dbl:
1031 0 : switch (tp) {
1032 0 : case TYPE_bte:
1033 0 : nils = div_sht_dbl_bte(lft, incr1, rgt, incr2,
1034 : dst, GDK_bte_max,
1035 : ci1, ci2, candoff1, candoff2);
1036 0 : break;
1037 0 : case TYPE_sht:
1038 0 : nils = div_sht_dbl_sht(lft, incr1, rgt, incr2,
1039 : dst, GDK_sht_max,
1040 : ci1, ci2, candoff1, candoff2);
1041 0 : break;
1042 0 : case TYPE_int:
1043 0 : nils = div_sht_dbl_int(lft, incr1, rgt, incr2,
1044 : dst, GDK_int_max,
1045 : ci1, ci2, candoff1, candoff2);
1046 0 : break;
1047 0 : case TYPE_lng:
1048 0 : nils = div_sht_dbl_lng(lft, incr1, rgt, incr2,
1049 : dst, GDK_lng_max,
1050 : ci1, ci2, candoff1, candoff2);
1051 0 : break;
1052 : #ifdef HAVE_HGE
1053 0 : case TYPE_hge:
1054 0 : nils = div_sht_dbl_hge(lft, incr1, rgt, incr2,
1055 : dst, GDK_hge_max,
1056 : ci1, ci2, candoff1, candoff2);
1057 0 : break;
1058 : #endif
1059 0 : case TYPE_dbl:
1060 0 : nils = div_sht_dbl_dbl(lft, incr1, rgt, incr2,
1061 : dst, GDK_dbl_max,
1062 : ci1, ci2, candoff1, candoff2);
1063 0 : break;
1064 0 : default:
1065 0 : goto unsupported;
1066 : }
1067 : break;
1068 0 : default:
1069 0 : goto unsupported;
1070 : }
1071 : break;
1072 239 : case TYPE_int:
1073 239 : switch (tp2) {
1074 124 : case TYPE_bte:
1075 124 : switch (tp) {
1076 124 : case TYPE_int:
1077 124 : nils = div_int_bte_int(lft, incr1, rgt, incr2,
1078 : dst, GDK_int_max,
1079 : ci1, ci2, candoff1, candoff2);
1080 124 : break;
1081 0 : case TYPE_lng:
1082 0 : nils = div_int_bte_lng(lft, incr1, rgt, incr2,
1083 : dst, GDK_lng_max,
1084 : ci1, ci2, candoff1, candoff2);
1085 0 : break;
1086 : #ifdef HAVE_HGE
1087 0 : case TYPE_hge:
1088 0 : nils = div_int_bte_hge(lft, incr1, rgt, incr2,
1089 : dst, GDK_hge_max,
1090 : ci1, ci2, candoff1, candoff2);
1091 0 : break;
1092 : #endif
1093 0 : case TYPE_flt:
1094 0 : nils = div_int_bte_flt(lft, incr1, rgt, incr2,
1095 : dst, GDK_flt_max,
1096 : ci1, ci2, candoff1, candoff2);
1097 0 : break;
1098 0 : case TYPE_dbl:
1099 0 : nils = div_int_bte_dbl(lft, incr1, rgt, incr2,
1100 : dst, GDK_dbl_max,
1101 : ci1, ci2, candoff1, candoff2);
1102 0 : break;
1103 0 : default:
1104 0 : goto unsupported;
1105 : }
1106 : break;
1107 18 : case TYPE_sht:
1108 18 : switch (tp) {
1109 18 : case TYPE_int:
1110 18 : nils = div_int_sht_int(lft, incr1, rgt, incr2,
1111 : dst, GDK_int_max,
1112 : ci1, ci2, candoff1, candoff2);
1113 18 : break;
1114 0 : case TYPE_lng:
1115 0 : nils = div_int_sht_lng(lft, incr1, rgt, incr2,
1116 : dst, GDK_lng_max,
1117 : ci1, ci2, candoff1, candoff2);
1118 0 : break;
1119 : #ifdef HAVE_HGE
1120 0 : case TYPE_hge:
1121 0 : nils = div_int_sht_hge(lft, incr1, rgt, incr2,
1122 : dst, GDK_hge_max,
1123 : ci1, ci2, candoff1, candoff2);
1124 0 : break;
1125 : #endif
1126 0 : case TYPE_flt:
1127 0 : nils = div_int_sht_flt(lft, incr1, rgt, incr2,
1128 : dst, GDK_flt_max,
1129 : ci1, ci2, candoff1, candoff2);
1130 0 : break;
1131 0 : case TYPE_dbl:
1132 0 : nils = div_int_sht_dbl(lft, incr1, rgt, incr2,
1133 : dst, GDK_dbl_max,
1134 : ci1, ci2, candoff1, candoff2);
1135 0 : break;
1136 0 : default:
1137 0 : goto unsupported;
1138 : }
1139 : break;
1140 90 : case TYPE_int:
1141 90 : switch (tp) {
1142 90 : case TYPE_int:
1143 90 : nils = div_int_int_int(lft, incr1, rgt, incr2,
1144 : dst, GDK_int_max,
1145 : ci1, ci2, candoff1, candoff2);
1146 90 : break;
1147 0 : case TYPE_lng:
1148 0 : nils = div_int_int_lng(lft, incr1, rgt, incr2,
1149 : dst, GDK_lng_max,
1150 : ci1, ci2, candoff1, candoff2);
1151 0 : break;
1152 : #ifdef HAVE_HGE
1153 0 : case TYPE_hge:
1154 0 : nils = div_int_int_hge(lft, incr1, rgt, incr2,
1155 : dst, GDK_hge_max,
1156 : ci1, ci2, candoff1, candoff2);
1157 0 : break;
1158 : #endif
1159 0 : case TYPE_flt:
1160 0 : nils = div_int_int_flt(lft, incr1, rgt, incr2,
1161 : dst, GDK_flt_max,
1162 : ci1, ci2, candoff1, candoff2);
1163 0 : break;
1164 0 : case TYPE_dbl:
1165 0 : nils = div_int_int_dbl(lft, incr1, rgt, incr2,
1166 : dst, GDK_dbl_max,
1167 : ci1, ci2, candoff1, candoff2);
1168 0 : break;
1169 0 : default:
1170 0 : goto unsupported;
1171 : }
1172 : break;
1173 0 : case TYPE_lng:
1174 0 : switch (tp) {
1175 0 : case TYPE_int:
1176 0 : nils = div_int_lng_int(lft, incr1, rgt, incr2,
1177 : dst, GDK_int_max,
1178 : ci1, ci2, candoff1, candoff2);
1179 0 : break;
1180 0 : case TYPE_lng:
1181 0 : nils = div_int_lng_lng(lft, incr1, rgt, incr2,
1182 : dst, GDK_lng_max,
1183 : ci1, ci2, candoff1, candoff2);
1184 0 : break;
1185 : #ifdef HAVE_HGE
1186 0 : case TYPE_hge:
1187 0 : nils = div_int_lng_hge(lft, incr1, rgt, incr2,
1188 : dst, GDK_hge_max,
1189 : ci1, ci2, candoff1, candoff2);
1190 0 : break;
1191 : #endif
1192 0 : case TYPE_flt:
1193 0 : nils = div_int_lng_flt(lft, incr1, rgt, incr2,
1194 : dst, GDK_flt_max,
1195 : ci1, ci2, candoff1, candoff2);
1196 0 : break;
1197 0 : case TYPE_dbl:
1198 0 : nils = div_int_lng_dbl(lft, incr1, rgt, incr2,
1199 : dst, GDK_dbl_max,
1200 : ci1, ci2, candoff1, candoff2);
1201 0 : break;
1202 0 : default:
1203 0 : goto unsupported;
1204 : }
1205 : break;
1206 : #ifdef HAVE_HGE
1207 0 : case TYPE_hge:
1208 0 : switch (tp) {
1209 0 : case TYPE_int:
1210 0 : nils = div_int_hge_int(lft, incr1, rgt, incr2,
1211 : dst, GDK_int_max,
1212 : ci1, ci2, candoff1, candoff2);
1213 0 : break;
1214 0 : case TYPE_lng:
1215 0 : nils = div_int_hge_lng(lft, incr1, rgt, incr2,
1216 : dst, GDK_lng_max,
1217 : ci1, ci2, candoff1, candoff2);
1218 0 : break;
1219 0 : case TYPE_hge:
1220 0 : nils = div_int_hge_hge(lft, incr1, rgt, incr2,
1221 : dst, GDK_hge_max,
1222 : ci1, ci2, candoff1, candoff2);
1223 0 : break;
1224 0 : case TYPE_flt:
1225 0 : nils = div_int_hge_flt(lft, incr1, rgt, incr2,
1226 : dst, GDK_flt_max,
1227 : ci1, ci2, candoff1, candoff2);
1228 0 : break;
1229 0 : case TYPE_dbl:
1230 0 : nils = div_int_hge_dbl(lft, incr1, rgt, incr2,
1231 : dst, GDK_dbl_max,
1232 : ci1, ci2, candoff1, candoff2);
1233 0 : break;
1234 0 : default:
1235 0 : goto unsupported;
1236 : }
1237 : break;
1238 : #endif
1239 4 : case TYPE_flt:
1240 4 : switch (tp) {
1241 0 : case TYPE_bte:
1242 0 : nils = div_int_flt_bte(lft, incr1, rgt, incr2,
1243 : dst, GDK_bte_max,
1244 : ci1, ci2, candoff1, candoff2);
1245 0 : break;
1246 0 : case TYPE_sht:
1247 0 : nils = div_int_flt_sht(lft, incr1, rgt, incr2,
1248 : dst, GDK_sht_max,
1249 : ci1, ci2, candoff1, candoff2);
1250 0 : break;
1251 4 : case TYPE_int:
1252 4 : nils = div_int_flt_int(lft, incr1, rgt, incr2,
1253 : dst, GDK_int_max,
1254 : ci1, ci2, candoff1, candoff2);
1255 4 : break;
1256 0 : case TYPE_lng:
1257 0 : nils = div_int_flt_lng(lft, incr1, rgt, incr2,
1258 : dst, GDK_lng_max,
1259 : ci1, ci2, candoff1, candoff2);
1260 0 : break;
1261 : #ifdef HAVE_HGE
1262 0 : case TYPE_hge:
1263 0 : nils = div_int_flt_hge(lft, incr1, rgt, incr2,
1264 : dst, GDK_hge_max,
1265 : ci1, ci2, candoff1, candoff2);
1266 0 : break;
1267 : #endif
1268 0 : case TYPE_flt:
1269 0 : nils = div_int_flt_flt(lft, incr1, rgt, incr2,
1270 : dst, GDK_flt_max,
1271 : ci1, ci2, candoff1, candoff2);
1272 0 : break;
1273 0 : case TYPE_dbl:
1274 0 : nils = div_int_flt_dbl(lft, incr1, rgt, incr2,
1275 : dst, GDK_dbl_max,
1276 : ci1, ci2, candoff1, candoff2);
1277 0 : break;
1278 0 : default:
1279 0 : goto unsupported;
1280 : }
1281 : break;
1282 3 : case TYPE_dbl:
1283 3 : switch (tp) {
1284 0 : case TYPE_bte:
1285 0 : nils = div_int_dbl_bte(lft, incr1, rgt, incr2,
1286 : dst, GDK_bte_max,
1287 : ci1, ci2, candoff1, candoff2);
1288 0 : break;
1289 0 : case TYPE_sht:
1290 0 : nils = div_int_dbl_sht(lft, incr1, rgt, incr2,
1291 : dst, GDK_sht_max,
1292 : ci1, ci2, candoff1, candoff2);
1293 0 : break;
1294 3 : case TYPE_int:
1295 3 : nils = div_int_dbl_int(lft, incr1, rgt, incr2,
1296 : dst, GDK_int_max,
1297 : ci1, ci2, candoff1, candoff2);
1298 3 : break;
1299 0 : case TYPE_lng:
1300 0 : nils = div_int_dbl_lng(lft, incr1, rgt, incr2,
1301 : dst, GDK_lng_max,
1302 : ci1, ci2, candoff1, candoff2);
1303 0 : break;
1304 : #ifdef HAVE_HGE
1305 0 : case TYPE_hge:
1306 0 : nils = div_int_dbl_hge(lft, incr1, rgt, incr2,
1307 : dst, GDK_hge_max,
1308 : ci1, ci2, candoff1, candoff2);
1309 0 : break;
1310 : #endif
1311 0 : case TYPE_dbl:
1312 0 : nils = div_int_dbl_dbl(lft, incr1, rgt, incr2,
1313 : dst, GDK_dbl_max,
1314 : ci1, ci2, candoff1, candoff2);
1315 0 : break;
1316 0 : default:
1317 0 : goto unsupported;
1318 : }
1319 : break;
1320 0 : default:
1321 0 : goto unsupported;
1322 : }
1323 : break;
1324 120 : case TYPE_lng:
1325 120 : switch (tp2) {
1326 16 : case TYPE_bte:
1327 16 : switch (tp) {
1328 16 : case TYPE_lng:
1329 16 : nils = div_lng_bte_lng(lft, incr1, rgt, incr2,
1330 : dst, GDK_lng_max,
1331 : ci1, ci2, candoff1, candoff2);
1332 16 : break;
1333 : #ifdef HAVE_HGE
1334 0 : case TYPE_hge:
1335 0 : nils = div_lng_bte_hge(lft, incr1, rgt, incr2,
1336 : dst, GDK_hge_max,
1337 : ci1, ci2, candoff1, candoff2);
1338 0 : break;
1339 : #endif
1340 0 : case TYPE_flt:
1341 0 : nils = div_lng_bte_flt(lft, incr1, rgt, incr2,
1342 : dst, GDK_flt_max,
1343 : ci1, ci2, candoff1, candoff2);
1344 0 : break;
1345 0 : case TYPE_dbl:
1346 0 : nils = div_lng_bte_dbl(lft, incr1, rgt, incr2,
1347 : dst, GDK_dbl_max,
1348 : ci1, ci2, candoff1, candoff2);
1349 0 : break;
1350 0 : default:
1351 0 : goto unsupported;
1352 : }
1353 : break;
1354 3 : case TYPE_sht:
1355 3 : switch (tp) {
1356 3 : case TYPE_lng:
1357 3 : nils = div_lng_sht_lng(lft, incr1, rgt, incr2,
1358 : dst, GDK_lng_max,
1359 : ci1, ci2, candoff1, candoff2);
1360 3 : break;
1361 : #ifdef HAVE_HGE
1362 0 : case TYPE_hge:
1363 0 : nils = div_lng_sht_hge(lft, incr1, rgt, incr2,
1364 : dst, GDK_hge_max,
1365 : ci1, ci2, candoff1, candoff2);
1366 0 : break;
1367 : #endif
1368 0 : case TYPE_flt:
1369 0 : nils = div_lng_sht_flt(lft, incr1, rgt, incr2,
1370 : dst, GDK_flt_max,
1371 : ci1, ci2, candoff1, candoff2);
1372 0 : break;
1373 0 : case TYPE_dbl:
1374 0 : nils = div_lng_sht_dbl(lft, incr1, rgt, incr2,
1375 : dst, GDK_dbl_max,
1376 : ci1, ci2, candoff1, candoff2);
1377 0 : break;
1378 0 : default:
1379 0 : goto unsupported;
1380 : }
1381 : break;
1382 31 : case TYPE_int:
1383 31 : switch (tp) {
1384 31 : case TYPE_lng:
1385 31 : nils = div_lng_int_lng(lft, incr1, rgt, incr2,
1386 : dst, GDK_lng_max,
1387 : ci1, ci2, candoff1, candoff2);
1388 31 : break;
1389 : #ifdef HAVE_HGE
1390 0 : case TYPE_hge:
1391 0 : nils = div_lng_int_hge(lft, incr1, rgt, incr2,
1392 : dst, GDK_hge_max,
1393 : ci1, ci2, candoff1, candoff2);
1394 0 : break;
1395 : #endif
1396 0 : case TYPE_flt:
1397 0 : nils = div_lng_int_flt(lft, incr1, rgt, incr2,
1398 : dst, GDK_flt_max,
1399 : ci1, ci2, candoff1, candoff2);
1400 0 : break;
1401 0 : case TYPE_dbl:
1402 0 : nils = div_lng_int_dbl(lft, incr1, rgt, incr2,
1403 : dst, GDK_dbl_max,
1404 : ci1, ci2, candoff1, candoff2);
1405 0 : break;
1406 0 : default:
1407 0 : goto unsupported;
1408 : }
1409 : break;
1410 59 : case TYPE_lng:
1411 59 : switch (tp) {
1412 59 : case TYPE_lng:
1413 59 : nils = div_lng_lng_lng(lft, incr1, rgt, incr2,
1414 : dst, GDK_lng_max,
1415 : ci1, ci2, candoff1, candoff2);
1416 59 : break;
1417 : #ifdef HAVE_HGE
1418 0 : case TYPE_hge:
1419 0 : nils = div_lng_lng_hge(lft, incr1, rgt, incr2,
1420 : dst, GDK_hge_max,
1421 : ci1, ci2, candoff1, candoff2);
1422 0 : break;
1423 : #endif
1424 0 : case TYPE_flt:
1425 0 : nils = div_lng_lng_flt(lft, incr1, rgt, incr2,
1426 : dst, GDK_flt_max,
1427 : ci1, ci2, candoff1, candoff2);
1428 0 : break;
1429 0 : case TYPE_dbl:
1430 0 : nils = div_lng_lng_dbl(lft, incr1, rgt, incr2,
1431 : dst, GDK_dbl_max,
1432 : ci1, ci2, candoff1, candoff2);
1433 0 : break;
1434 0 : default:
1435 0 : goto unsupported;
1436 : }
1437 : break;
1438 : #ifdef HAVE_HGE
1439 0 : case TYPE_hge:
1440 0 : switch (tp) {
1441 0 : case TYPE_lng:
1442 0 : nils = div_lng_hge_lng(lft, incr1, rgt, incr2,
1443 : dst, GDK_lng_max,
1444 : ci1, ci2, candoff1, candoff2);
1445 0 : break;
1446 0 : case TYPE_hge:
1447 0 : nils = div_lng_hge_hge(lft, incr1, rgt, incr2,
1448 : dst, GDK_hge_max,
1449 : ci1, ci2, candoff1, candoff2);
1450 0 : break;
1451 0 : case TYPE_flt:
1452 0 : nils = div_lng_hge_flt(lft, incr1, rgt, incr2,
1453 : dst, GDK_flt_max,
1454 : ci1, ci2, candoff1, candoff2);
1455 0 : break;
1456 0 : case TYPE_dbl:
1457 0 : nils = div_lng_hge_dbl(lft, incr1, rgt, incr2,
1458 : dst, GDK_dbl_max,
1459 : ci1, ci2, candoff1, candoff2);
1460 0 : break;
1461 0 : default:
1462 0 : goto unsupported;
1463 : }
1464 : break;
1465 : #endif
1466 7 : case TYPE_flt:
1467 7 : switch (tp) {
1468 0 : case TYPE_bte:
1469 0 : nils = div_lng_flt_bte(lft, incr1, rgt, incr2,
1470 : dst, GDK_bte_max,
1471 : ci1, ci2, candoff1, candoff2);
1472 0 : break;
1473 0 : case TYPE_sht:
1474 0 : nils = div_lng_flt_sht(lft, incr1, rgt, incr2,
1475 : dst, GDK_sht_max,
1476 : ci1, ci2, candoff1, candoff2);
1477 0 : break;
1478 0 : case TYPE_int:
1479 0 : nils = div_lng_flt_int(lft, incr1, rgt, incr2,
1480 : dst, GDK_int_max,
1481 : ci1, ci2, candoff1, candoff2);
1482 0 : break;
1483 7 : case TYPE_lng:
1484 7 : nils = div_lng_flt_lng(lft, incr1, rgt, incr2,
1485 : dst, GDK_lng_max,
1486 : ci1, ci2, candoff1, candoff2);
1487 7 : break;
1488 : #ifdef HAVE_HGE
1489 0 : case TYPE_hge:
1490 0 : nils = div_lng_flt_hge(lft, incr1, rgt, incr2,
1491 : dst, GDK_hge_max,
1492 : ci1, ci2, candoff1, candoff2);
1493 0 : break;
1494 : #endif
1495 0 : case TYPE_flt:
1496 0 : nils = div_lng_flt_flt(lft, incr1, rgt, incr2,
1497 : dst, GDK_flt_max,
1498 : ci1, ci2, candoff1, candoff2);
1499 0 : break;
1500 0 : case TYPE_dbl:
1501 0 : nils = div_lng_flt_dbl(lft, incr1, rgt, incr2,
1502 : dst, GDK_dbl_max,
1503 : ci1, ci2, candoff1, candoff2);
1504 0 : break;
1505 0 : default:
1506 0 : goto unsupported;
1507 : }
1508 : break;
1509 4 : case TYPE_dbl:
1510 4 : switch (tp) {
1511 0 : case TYPE_bte:
1512 0 : nils = div_lng_dbl_bte(lft, incr1, rgt, incr2,
1513 : dst, GDK_bte_max,
1514 : ci1, ci2, candoff1, candoff2);
1515 0 : break;
1516 0 : case TYPE_sht:
1517 0 : nils = div_lng_dbl_sht(lft, incr1, rgt, incr2,
1518 : dst, GDK_sht_max,
1519 : ci1, ci2, candoff1, candoff2);
1520 0 : break;
1521 0 : case TYPE_int:
1522 0 : nils = div_lng_dbl_int(lft, incr1, rgt, incr2,
1523 : dst, GDK_int_max,
1524 : ci1, ci2, candoff1, candoff2);
1525 0 : break;
1526 4 : case TYPE_lng:
1527 4 : nils = div_lng_dbl_lng(lft, incr1, rgt, incr2,
1528 : dst, GDK_lng_max,
1529 : ci1, ci2, candoff1, candoff2);
1530 4 : break;
1531 : #ifdef HAVE_HGE
1532 0 : case TYPE_hge:
1533 0 : nils = div_lng_dbl_hge(lft, incr1, rgt, incr2,
1534 : dst, GDK_hge_max,
1535 : ci1, ci2, candoff1, candoff2);
1536 0 : break;
1537 : #endif
1538 0 : case TYPE_dbl:
1539 0 : nils = div_lng_dbl_dbl(lft, incr1, rgt, incr2,
1540 : dst, GDK_dbl_max,
1541 : ci1, ci2, candoff1, candoff2);
1542 0 : break;
1543 0 : default:
1544 0 : goto unsupported;
1545 : }
1546 : break;
1547 0 : default:
1548 0 : goto unsupported;
1549 : }
1550 : break;
1551 : #ifdef HAVE_HGE
1552 1842 : case TYPE_hge:
1553 1842 : switch (tp2) {
1554 1717 : case TYPE_bte:
1555 1717 : switch (tp) {
1556 1717 : case TYPE_hge:
1557 1717 : nils = div_hge_bte_hge(lft, incr1, rgt, incr2,
1558 : dst, GDK_hge_max,
1559 : ci1, ci2, candoff1, candoff2);
1560 1717 : break;
1561 0 : case TYPE_flt:
1562 0 : nils = div_hge_bte_flt(lft, incr1, rgt, incr2,
1563 : dst, GDK_flt_max,
1564 : ci1, ci2, candoff1, candoff2);
1565 0 : break;
1566 0 : case TYPE_dbl:
1567 0 : nils = div_hge_bte_dbl(lft, incr1, rgt, incr2,
1568 : dst, GDK_dbl_max,
1569 : ci1, ci2, candoff1, candoff2);
1570 0 : break;
1571 0 : default:
1572 0 : goto unsupported;
1573 : }
1574 : break;
1575 0 : case TYPE_sht:
1576 0 : switch (tp) {
1577 0 : case TYPE_hge:
1578 0 : nils = div_hge_sht_hge(lft, incr1, rgt, incr2,
1579 : dst, GDK_hge_max,
1580 : ci1, ci2, candoff1, candoff2);
1581 0 : break;
1582 0 : case TYPE_flt:
1583 0 : nils = div_hge_sht_flt(lft, incr1, rgt, incr2,
1584 : dst, GDK_flt_max,
1585 : ci1, ci2, candoff1, candoff2);
1586 0 : break;
1587 0 : case TYPE_dbl:
1588 0 : nils = div_hge_sht_dbl(lft, incr1, rgt, incr2,
1589 : dst, GDK_dbl_max,
1590 : ci1, ci2, candoff1, candoff2);
1591 0 : break;
1592 0 : default:
1593 0 : goto unsupported;
1594 : }
1595 : break;
1596 30 : case TYPE_int:
1597 30 : switch (tp) {
1598 30 : case TYPE_hge:
1599 30 : nils = div_hge_int_hge(lft, incr1, rgt, incr2,
1600 : dst, GDK_hge_max,
1601 : ci1, ci2, candoff1, candoff2);
1602 30 : break;
1603 0 : case TYPE_flt:
1604 0 : nils = div_hge_int_flt(lft, incr1, rgt, incr2,
1605 : dst, GDK_flt_max,
1606 : ci1, ci2, candoff1, candoff2);
1607 0 : break;
1608 0 : case TYPE_dbl:
1609 0 : nils = div_hge_int_dbl(lft, incr1, rgt, incr2,
1610 : dst, GDK_dbl_max,
1611 : ci1, ci2, candoff1, candoff2);
1612 0 : break;
1613 0 : default:
1614 0 : goto unsupported;
1615 : }
1616 : break;
1617 22 : case TYPE_lng:
1618 22 : switch (tp) {
1619 22 : case TYPE_hge:
1620 22 : nils = div_hge_lng_hge(lft, incr1, rgt, incr2,
1621 : dst, GDK_hge_max,
1622 : ci1, ci2, candoff1, candoff2);
1623 22 : break;
1624 0 : case TYPE_flt:
1625 0 : nils = div_hge_lng_flt(lft, incr1, rgt, incr2,
1626 : dst, GDK_flt_max,
1627 : ci1, ci2, candoff1, candoff2);
1628 0 : break;
1629 0 : case TYPE_dbl:
1630 0 : nils = div_hge_lng_dbl(lft, incr1, rgt, incr2,
1631 : dst, GDK_dbl_max,
1632 : ci1, ci2, candoff1, candoff2);
1633 0 : break;
1634 0 : default:
1635 0 : goto unsupported;
1636 : }
1637 : break;
1638 73 : case TYPE_hge:
1639 73 : switch (tp) {
1640 73 : case TYPE_hge:
1641 73 : nils = div_hge_hge_hge(lft, incr1, rgt, incr2,
1642 : dst, GDK_hge_max,
1643 : ci1, ci2, candoff1, candoff2);
1644 73 : break;
1645 0 : case TYPE_flt:
1646 0 : nils = div_hge_hge_flt(lft, incr1, rgt, incr2,
1647 : dst, GDK_flt_max,
1648 : ci1, ci2, candoff1, candoff2);
1649 0 : break;
1650 0 : case TYPE_dbl:
1651 0 : nils = div_hge_hge_dbl(lft, incr1, rgt, incr2,
1652 : dst, GDK_dbl_max,
1653 : ci1, ci2, candoff1, candoff2);
1654 0 : break;
1655 0 : default:
1656 0 : goto unsupported;
1657 : }
1658 : break;
1659 0 : case TYPE_flt:
1660 0 : switch (tp) {
1661 0 : case TYPE_bte:
1662 0 : nils = div_hge_flt_bte(lft, incr1, rgt, incr2,
1663 : dst, GDK_bte_max,
1664 : ci1, ci2, candoff1, candoff2);
1665 0 : break;
1666 0 : case TYPE_sht:
1667 0 : nils = div_hge_flt_sht(lft, incr1, rgt, incr2,
1668 : dst, GDK_sht_max,
1669 : ci1, ci2, candoff1, candoff2);
1670 0 : break;
1671 0 : case TYPE_int:
1672 0 : nils = div_hge_flt_int(lft, incr1, rgt, incr2,
1673 : dst, GDK_int_max,
1674 : ci1, ci2, candoff1, candoff2);
1675 0 : break;
1676 0 : case TYPE_lng:
1677 0 : nils = div_hge_flt_lng(lft, incr1, rgt, incr2,
1678 : dst, GDK_lng_max,
1679 : ci1, ci2, candoff1, candoff2);
1680 0 : break;
1681 0 : case TYPE_hge:
1682 0 : nils = div_hge_flt_hge(lft, incr1, rgt, incr2,
1683 : dst, GDK_hge_max,
1684 : ci1, ci2, candoff1, candoff2);
1685 0 : break;
1686 0 : case TYPE_flt:
1687 0 : nils = div_hge_flt_flt(lft, incr1, rgt, incr2,
1688 : dst, GDK_flt_max,
1689 : ci1, ci2, candoff1, candoff2);
1690 0 : break;
1691 0 : case TYPE_dbl:
1692 0 : nils = div_hge_flt_dbl(lft, incr1, rgt, incr2,
1693 : dst, GDK_dbl_max,
1694 : ci1, ci2, candoff1, candoff2);
1695 0 : break;
1696 0 : default:
1697 0 : goto unsupported;
1698 : }
1699 : break;
1700 0 : case TYPE_dbl:
1701 0 : switch (tp) {
1702 0 : case TYPE_bte:
1703 0 : nils = div_hge_dbl_bte(lft, incr1, rgt, incr2,
1704 : dst, GDK_bte_max,
1705 : ci1, ci2, candoff1, candoff2);
1706 0 : break;
1707 0 : case TYPE_sht:
1708 0 : nils = div_hge_dbl_sht(lft, incr1, rgt, incr2,
1709 : dst, GDK_sht_max,
1710 : ci1, ci2, candoff1, candoff2);
1711 0 : break;
1712 0 : case TYPE_int:
1713 0 : nils = div_hge_dbl_int(lft, incr1, rgt, incr2,
1714 : dst, GDK_int_max,
1715 : ci1, ci2, candoff1, candoff2);
1716 0 : break;
1717 0 : case TYPE_lng:
1718 0 : nils = div_hge_dbl_lng(lft, incr1, rgt, incr2,
1719 : dst, GDK_lng_max,
1720 : ci1, ci2, candoff1, candoff2);
1721 0 : break;
1722 0 : case TYPE_hge:
1723 0 : nils = div_hge_dbl_hge(lft, incr1, rgt, incr2,
1724 : dst, GDK_hge_max,
1725 : ci1, ci2, candoff1, candoff2);
1726 0 : break;
1727 0 : case TYPE_dbl:
1728 0 : nils = div_hge_dbl_dbl(lft, incr1, rgt, incr2,
1729 : dst, GDK_dbl_max,
1730 : ci1, ci2, candoff1, candoff2);
1731 0 : break;
1732 0 : default:
1733 0 : goto unsupported;
1734 : }
1735 : break;
1736 0 : default:
1737 0 : goto unsupported;
1738 : }
1739 : break;
1740 : #endif
1741 5 : case TYPE_flt:
1742 5 : switch (tp2) {
1743 0 : case TYPE_bte:
1744 0 : switch (tp) {
1745 0 : case TYPE_flt:
1746 0 : nils = div_flt_bte_flt(lft, incr1, rgt, incr2,
1747 : dst, GDK_flt_max,
1748 : ci1, ci2, candoff1, candoff2);
1749 0 : break;
1750 0 : case TYPE_dbl:
1751 0 : nils = div_flt_bte_dbl(lft, incr1, rgt, incr2,
1752 : dst, GDK_dbl_max,
1753 : ci1, ci2, candoff1, candoff2);
1754 0 : break;
1755 0 : default:
1756 0 : goto unsupported;
1757 : }
1758 : break;
1759 0 : case TYPE_sht:
1760 0 : switch (tp) {
1761 0 : case TYPE_flt:
1762 0 : nils = div_flt_sht_flt(lft, incr1, rgt, incr2,
1763 : dst, GDK_flt_max,
1764 : ci1, ci2, candoff1, candoff2);
1765 0 : break;
1766 0 : case TYPE_dbl:
1767 0 : nils = div_flt_sht_dbl(lft, incr1, rgt, incr2,
1768 : dst, GDK_dbl_max,
1769 : ci1, ci2, candoff1, candoff2);
1770 0 : break;
1771 0 : default:
1772 0 : goto unsupported;
1773 : }
1774 : break;
1775 0 : case TYPE_int:
1776 0 : switch (tp) {
1777 0 : case TYPE_flt:
1778 0 : nils = div_flt_int_flt(lft, incr1, rgt, incr2,
1779 : dst, GDK_flt_max,
1780 : ci1, ci2, candoff1, candoff2);
1781 0 : break;
1782 0 : case TYPE_dbl:
1783 0 : nils = div_flt_int_dbl(lft, incr1, rgt, incr2,
1784 : dst, GDK_dbl_max,
1785 : ci1, ci2, candoff1, candoff2);
1786 0 : break;
1787 0 : default:
1788 0 : goto unsupported;
1789 : }
1790 : break;
1791 0 : case TYPE_lng:
1792 0 : switch (tp) {
1793 0 : case TYPE_flt:
1794 0 : nils = div_flt_lng_flt(lft, incr1, rgt, incr2,
1795 : dst, GDK_flt_max,
1796 : ci1, ci2, candoff1, candoff2);
1797 0 : break;
1798 0 : case TYPE_dbl:
1799 0 : nils = div_flt_lng_dbl(lft, incr1, rgt, incr2,
1800 : dst, GDK_dbl_max,
1801 : ci1, ci2, candoff1, candoff2);
1802 0 : break;
1803 0 : default:
1804 0 : goto unsupported;
1805 : }
1806 : break;
1807 : #ifdef HAVE_HGE
1808 0 : case TYPE_hge:
1809 0 : switch (tp) {
1810 0 : case TYPE_flt:
1811 0 : nils = div_flt_hge_flt(lft, incr1, rgt, incr2,
1812 : dst, GDK_flt_max,
1813 : ci1, ci2, candoff1, candoff2);
1814 0 : break;
1815 0 : case TYPE_dbl:
1816 0 : nils = div_flt_hge_dbl(lft, incr1, rgt, incr2,
1817 : dst, GDK_dbl_max,
1818 : ci1, ci2, candoff1, candoff2);
1819 0 : break;
1820 0 : default:
1821 0 : goto unsupported;
1822 : }
1823 : break;
1824 : #endif
1825 5 : case TYPE_flt:
1826 5 : switch (tp) {
1827 5 : case TYPE_flt:
1828 5 : nils = div_flt_flt_flt(lft, incr1, rgt, incr2,
1829 : dst, GDK_flt_max,
1830 : ci1, ci2, candoff1, candoff2);
1831 5 : break;
1832 0 : case TYPE_dbl:
1833 0 : nils = div_flt_flt_dbl(lft, incr1, rgt, incr2,
1834 : dst, GDK_dbl_max,
1835 : ci1, ci2, candoff1, candoff2);
1836 0 : break;
1837 0 : default:
1838 0 : goto unsupported;
1839 : }
1840 : break;
1841 0 : case TYPE_dbl:
1842 0 : switch (tp) {
1843 0 : case TYPE_dbl:
1844 0 : nils = div_flt_dbl_dbl(lft, incr1, rgt, incr2,
1845 : dst, GDK_dbl_max,
1846 : ci1, ci2, candoff1, candoff2);
1847 0 : break;
1848 0 : default:
1849 0 : goto unsupported;
1850 : }
1851 0 : break;
1852 0 : default:
1853 0 : goto unsupported;
1854 : }
1855 : break;
1856 1157 : case TYPE_dbl:
1857 1157 : switch (tp2) {
1858 0 : case TYPE_bte:
1859 0 : switch (tp) {
1860 0 : case TYPE_dbl:
1861 0 : nils = div_dbl_bte_dbl(lft, incr1, rgt, incr2,
1862 : dst, GDK_dbl_max,
1863 : ci1, ci2, candoff1, candoff2);
1864 0 : break;
1865 0 : default:
1866 0 : goto unsupported;
1867 : }
1868 0 : break;
1869 0 : case TYPE_sht:
1870 0 : switch (tp) {
1871 0 : case TYPE_dbl:
1872 0 : nils = div_dbl_sht_dbl(lft, incr1, rgt, incr2,
1873 : dst, GDK_dbl_max,
1874 : ci1, ci2, candoff1, candoff2);
1875 0 : break;
1876 0 : default:
1877 0 : goto unsupported;
1878 : }
1879 0 : break;
1880 0 : case TYPE_int:
1881 0 : switch (tp) {
1882 0 : case TYPE_dbl:
1883 0 : nils = div_dbl_int_dbl(lft, incr1, rgt, incr2,
1884 : dst, GDK_dbl_max,
1885 : ci1, ci2, candoff1, candoff2);
1886 0 : break;
1887 0 : default:
1888 0 : goto unsupported;
1889 : }
1890 0 : break;
1891 1032 : case TYPE_lng:
1892 1032 : switch (tp) {
1893 1032 : case TYPE_dbl:
1894 1032 : nils = div_dbl_lng_dbl(lft, incr1, rgt, incr2,
1895 : dst, GDK_dbl_max,
1896 : ci1, ci2, candoff1, candoff2);
1897 1032 : break;
1898 0 : default:
1899 0 : goto unsupported;
1900 : }
1901 1032 : break;
1902 : #ifdef HAVE_HGE
1903 0 : case TYPE_hge:
1904 0 : switch (tp) {
1905 0 : case TYPE_dbl:
1906 0 : nils = div_dbl_hge_dbl(lft, incr1, rgt, incr2,
1907 : dst, GDK_dbl_max,
1908 : ci1, ci2, candoff1, candoff2);
1909 0 : break;
1910 0 : default:
1911 0 : goto unsupported;
1912 : }
1913 0 : break;
1914 : #endif
1915 0 : case TYPE_flt:
1916 0 : switch (tp) {
1917 0 : case TYPE_dbl:
1918 0 : nils = div_dbl_flt_dbl(lft, incr1, rgt, incr2,
1919 : dst, GDK_dbl_max,
1920 : ci1, ci2, candoff1, candoff2);
1921 0 : break;
1922 0 : default:
1923 0 : goto unsupported;
1924 : }
1925 0 : break;
1926 125 : case TYPE_dbl:
1927 125 : switch (tp) {
1928 125 : case TYPE_dbl:
1929 125 : nils = div_dbl_dbl_dbl(lft, incr1, rgt, incr2,
1930 : dst, GDK_dbl_max,
1931 : ci1, ci2, candoff1, candoff2);
1932 125 : break;
1933 0 : default:
1934 0 : goto unsupported;
1935 : }
1936 125 : break;
1937 0 : default:
1938 0 : goto unsupported;
1939 : }
1940 : break;
1941 0 : default:
1942 0 : goto unsupported;
1943 : }
1944 :
1945 3440 : if (nils == BUN_NONE + 1)
1946 41 : GDKerror("22012!division by zero.\n");
1947 :
1948 : return nils;
1949 :
1950 0 : unsupported:
1951 0 : GDKerror("%s: type combination (div(%s,%s)->%s) not supported.\n",
1952 : func, ATOMname(tp1), ATOMname(tp2), ATOMname(tp));
1953 0 : return BUN_NONE;
1954 : }
1955 :
1956 : BAT *
1957 243 : BATcalcdiv(BAT *b1, BAT *b2, BAT *s1, BAT *s2, int tp)
1958 : {
1959 243 : return BATcalcmuldivmod(b1, b2, s1, s2, tp,
1960 : div_typeswitchloop, __func__);
1961 : }
1962 :
1963 : BAT *
1964 3218 : BATcalcdivcst(BAT *b, const ValRecord *v, BAT *s, int tp)
1965 : {
1966 3218 : lng t0 = 0;
1967 3218 : BAT *bn;
1968 3218 : BUN nils;
1969 3218 : struct canditer ci;
1970 :
1971 3218 : TRC_DEBUG_IF(ALGO) t0 = GDKusec();
1972 :
1973 3218 : BATcheck(b, NULL);
1974 :
1975 3218 : canditer_init(&ci, b, s);
1976 :
1977 3218 : bn = COLnew(ci.hseq, tp, ci.ncand, TRANSIENT);
1978 3218 : if (bn == NULL)
1979 : return NULL;
1980 3218 : if (ci.ncand == 0)
1981 : return bn;
1982 :
1983 2785 : BATiter bi = bat_iterator(b);
1984 5570 : nils = div_typeswitchloop(bi.base, bi.type, true,
1985 2785 : VALptr(v), v->vtype, false,
1986 2785 : Tloc(bn, 0), tp,
1987 : &ci,
1988 2785 : &(struct canditer){.tpe=cand_dense, .ncand=ci.ncand},
1989 : b->hseqbase, 0, __func__);
1990 :
1991 2785 : if (nils >= BUN_NONE) {
1992 2 : BBPunfix(bn->batCacheid);
1993 2 : bat_iterator_end(&bi);
1994 2 : return NULL;
1995 : }
1996 :
1997 2783 : BATsetcount(bn, ci.ncand);
1998 :
1999 : /* if the input is sorted, and no zero division occurred, the
2000 : * result is also sorted, or reverse sorted if the constant is
2001 : * negative */
2002 2783 : ValRecord sign;
2003 :
2004 2783 : VARcalcsign(&sign, v);
2005 2783 : bn->tsorted = (sign.val.btval > 0 && bi.sorted && nils == 0) ||
2006 : (sign.val.btval < 0 && bi.revsorted && nils == 0) ||
2007 : ci.ncand <= 1 || nils == ci.ncand;
2008 2783 : bn->trevsorted = (sign.val.btval > 0 && bi.revsorted && nils == 0) ||
2009 : (sign.val.btval < 0 && bi.sorted && nils == 0) ||
2010 : ci.ncand <= 1 || nils == ci.ncand;
2011 2783 : bn->tsorted = ci.ncand <= 1 || nils == ci.ncand;
2012 2783 : bn->trevsorted = ci.ncand <= 1 || nils == ci.ncand;
2013 2783 : bn->tkey = ci.ncand <= 1;
2014 2783 : bn->tnil = nils != 0;
2015 2783 : bn->tnonil = nils == 0;
2016 2783 : bat_iterator_end(&bi);
2017 :
2018 2783 : TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
2019 : " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
2020 : ALGOBATPAR(b), ALGOOPTBATPAR(s),
2021 : ALGOOPTBATPAR(bn), GDKusec() - t0);
2022 :
2023 : return bn;
2024 : }
2025 :
2026 : BAT *
2027 44 : BATcalccstdiv(const ValRecord *v, BAT *b, BAT *s, int tp)
2028 : {
2029 44 : lng t0 = 0;
2030 44 : BAT *bn;
2031 44 : BUN nils;
2032 44 : struct canditer ci;
2033 :
2034 44 : TRC_DEBUG_IF(ALGO) t0 = GDKusec();
2035 :
2036 44 : BATcheck(b, NULL);
2037 :
2038 44 : canditer_init(&ci, b, s);
2039 44 : if (ci.ncand == 0)
2040 16 : return BATconstant(ci.hseq, tp, ATOMnilptr(tp),
2041 : ci.ncand, TRANSIENT);
2042 :
2043 28 : bn = COLnew(ci.hseq, tp, ci.ncand, TRANSIENT);
2044 28 : if (bn == NULL)
2045 : return NULL;
2046 :
2047 28 : BATiter bi = bat_iterator(b);
2048 56 : nils = div_typeswitchloop(VALptr(v), v->vtype, false,
2049 28 : bi.base, bi.type, true,
2050 28 : Tloc(bn, 0), tp,
2051 28 : &(struct canditer){.tpe=cand_dense, .ncand=ci.ncand},
2052 : &ci,
2053 : 0, b->hseqbase, __func__);
2054 28 : bat_iterator_end(&bi);
2055 :
2056 28 : if (nils >= BUN_NONE) {
2057 1 : BBPunfix(bn->batCacheid);
2058 1 : return NULL;
2059 : }
2060 :
2061 27 : BATsetcount(bn, ci.ncand);
2062 :
2063 27 : bn->tsorted = ci.ncand <= 1 || nils == ci.ncand;
2064 27 : bn->trevsorted = ci.ncand <= 1 || nils == ci.ncand;
2065 27 : bn->tkey = ci.ncand <= 1;
2066 27 : bn->tnil = nils != 0;
2067 27 : bn->tnonil = nils == 0;
2068 :
2069 27 : TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
2070 : " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
2071 : ALGOBATPAR(b), ALGOOPTBATPAR(s),
2072 : ALGOOPTBATPAR(bn), GDKusec() - t0);
2073 :
2074 : return bn;
2075 : }
2076 :
2077 : gdk_return
2078 430 : VARcalcdiv(ValPtr ret, const ValRecord *lft, const ValRecord *rgt)
2079 : {
2080 430 : if (div_typeswitchloop(VALptr(lft), lft->vtype, false,
2081 430 : VALptr(rgt), rgt->vtype, false,
2082 : VALget(ret), ret->vtype,
2083 430 : &(struct canditer){.tpe=cand_dense, .ncand=1},
2084 430 : &(struct canditer){.tpe=cand_dense, .ncand=1},
2085 : 0, 0, __func__) >= BUN_NONE)
2086 39 : return GDK_FAIL;
2087 391 : return GDK_SUCCEED;
2088 : }
|