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 : /* modulo (any numeric type) */
20 :
21 : #define MOD_3TYPE(TYPE1, TYPE2, TYPE3) \
22 : static BUN \
23 : mod_##TYPE1##_##TYPE2##_##TYPE3(const TYPE1 *lft, bool incr1, \
24 : const TYPE2 *rgt, bool incr2, \
25 : TYPE3 *restrict dst, \
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 : } \
52 : } \
53 : TIMEOUT_CHECK(timeoffset, TIMEOUT_HANDLER(BUN_NONE)); \
54 : } else { \
55 : TIMEOUT_LOOP_IDX_DECL(k, ncand, timeoffset) { \
56 : if (incr1) \
57 : i = canditer_next(ci1) - candoff1; \
58 : if (incr2) \
59 : j = canditer_next(ci2) - candoff2; \
60 : if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
61 : dst[k] = TYPE3##_nil; \
62 : nils++; \
63 : } else if (rgt[j] == 0) { \
64 : return BUN_NONE + 1; \
65 : } else { \
66 : dst[k] = (TYPE3) lft[i] % rgt[j]; \
67 : } \
68 : } \
69 : TIMEOUT_CHECK(timeoffset, TIMEOUT_HANDLER(BUN_NONE)); \
70 : } \
71 : return nils; \
72 : }
73 :
74 : #define FMOD_3TYPE(TYPE1, TYPE2, TYPE3, FUNC) \
75 : static BUN \
76 : mod_##TYPE1##_##TYPE2##_##TYPE3(const TYPE1 *lft, bool incr1, \
77 : const TYPE2 *rgt, bool incr2, \
78 : TYPE3 *restrict dst, \
79 : struct canditer *restrict ci1, \
80 : struct canditer *restrict ci2, \
81 : oid candoff1, oid candoff2) \
82 : { \
83 : BUN nils = 0; \
84 : BUN i = 0, j = 0, ncand = ci1->ncand; \
85 : lng timeoffset = 0; \
86 : QryCtx *qry_ctx = MT_thread_get_qry_ctx(); \
87 : if (qry_ctx != NULL) { \
88 : timeoffset = (qry_ctx->starttime && qry_ctx->querytimeout) ? (qry_ctx->starttime + qry_ctx->querytimeout) : 0; \
89 : } \
90 : \
91 : if (ci1->tpe == cand_dense && ci2->tpe == cand_dense) { \
92 : TIMEOUT_LOOP_IDX_DECL(k, ncand, timeoffset) { \
93 : if (incr1) \
94 : i = canditer_next_dense(ci1) - candoff1; \
95 : if (incr2) \
96 : j = canditer_next_dense(ci2) - candoff2; \
97 : if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
98 : dst[k] = TYPE3##_nil; \
99 : nils++; \
100 : } else if (rgt[j] == 0) { \
101 : return BUN_NONE + 1; \
102 : } else { \
103 : dst[k] = (TYPE3) FUNC((TYPE3) lft[i], \
104 : (TYPE3) rgt[j]); \
105 : } \
106 : } \
107 : TIMEOUT_CHECK(timeoffset, TIMEOUT_HANDLER(BUN_NONE)); \
108 : } else { \
109 : TIMEOUT_LOOP_IDX_DECL(k, ncand, timeoffset) { \
110 : if (incr1) \
111 : i = canditer_next(ci1) - candoff1; \
112 : if (incr2) \
113 : j = canditer_next(ci2) - candoff2; \
114 : if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
115 : dst[k] = TYPE3##_nil; \
116 : nils++; \
117 : } else if (rgt[j] == 0) { \
118 : return BUN_NONE + 1; \
119 : } else { \
120 : dst[k] = (TYPE3) FUNC((TYPE3) lft[i], \
121 : (TYPE3) rgt[j]); \
122 : } \
123 : } \
124 : TIMEOUT_CHECK(timeoffset, TIMEOUT_HANDLER(BUN_NONE)); \
125 : } \
126 : return nils; \
127 : }
128 :
129 240 : MOD_3TYPE(bte, bte, bte)
130 0 : MOD_3TYPE(bte, bte, sht)
131 0 : MOD_3TYPE(bte, bte, int)
132 0 : MOD_3TYPE(bte, bte, lng)
133 : #ifdef HAVE_HGE
134 0 : MOD_3TYPE(bte, bte, hge)
135 : #endif
136 0 : MOD_3TYPE(bte, sht, bte)
137 0 : MOD_3TYPE(bte, sht, sht)
138 0 : MOD_3TYPE(bte, sht, int)
139 0 : MOD_3TYPE(bte, sht, lng)
140 : #ifdef HAVE_HGE
141 0 : MOD_3TYPE(bte, sht, hge)
142 : #endif
143 0 : MOD_3TYPE(bte, int, bte)
144 0 : MOD_3TYPE(bte, int, sht)
145 0 : MOD_3TYPE(bte, int, int)
146 0 : MOD_3TYPE(bte, int, lng)
147 : #ifdef HAVE_HGE
148 0 : MOD_3TYPE(bte, int, hge)
149 : #endif
150 0 : MOD_3TYPE(bte, lng, bte)
151 0 : MOD_3TYPE(bte, lng, sht)
152 0 : MOD_3TYPE(bte, lng, int)
153 0 : MOD_3TYPE(bte, lng, lng)
154 : #ifdef HAVE_HGE
155 0 : MOD_3TYPE(bte, lng, hge)
156 : #endif
157 : #ifdef HAVE_HGE
158 0 : MOD_3TYPE(bte, hge, bte)
159 0 : MOD_3TYPE(bte, hge, sht)
160 0 : MOD_3TYPE(bte, hge, int)
161 0 : MOD_3TYPE(bte, hge, lng)
162 0 : MOD_3TYPE(bte, hge, hge)
163 : #endif
164 0 : MOD_3TYPE(sht, bte, bte)
165 0 : MOD_3TYPE(sht, bte, sht)
166 0 : MOD_3TYPE(sht, bte, int)
167 0 : MOD_3TYPE(sht, bte, lng)
168 : #ifdef HAVE_HGE
169 0 : MOD_3TYPE(sht, bte, hge)
170 : #endif
171 21 : MOD_3TYPE(sht, sht, sht)
172 0 : MOD_3TYPE(sht, sht, int)
173 0 : MOD_3TYPE(sht, sht, lng)
174 : #ifdef HAVE_HGE
175 0 : MOD_3TYPE(sht, sht, hge)
176 : #endif
177 0 : MOD_3TYPE(sht, int, sht)
178 0 : MOD_3TYPE(sht, int, int)
179 0 : MOD_3TYPE(sht, int, lng)
180 : #ifdef HAVE_HGE
181 0 : MOD_3TYPE(sht, int, hge)
182 : #endif
183 0 : MOD_3TYPE(sht, lng, sht)
184 0 : MOD_3TYPE(sht, lng, int)
185 0 : MOD_3TYPE(sht, lng, lng)
186 : #ifdef HAVE_HGE
187 0 : MOD_3TYPE(sht, lng, hge)
188 : #endif
189 : #ifdef HAVE_HGE
190 0 : MOD_3TYPE(sht, hge, sht)
191 0 : MOD_3TYPE(sht, hge, int)
192 0 : MOD_3TYPE(sht, hge, lng)
193 0 : MOD_3TYPE(sht, hge, hge)
194 : #endif
195 0 : MOD_3TYPE(int, bte, bte)
196 0 : MOD_3TYPE(int, bte, sht)
197 0 : MOD_3TYPE(int, bte, int)
198 0 : MOD_3TYPE(int, bte, lng)
199 : #ifdef HAVE_HGE
200 0 : MOD_3TYPE(int, bte, hge)
201 : #endif
202 0 : MOD_3TYPE(int, sht, sht)
203 0 : MOD_3TYPE(int, sht, int)
204 0 : MOD_3TYPE(int, sht, lng)
205 : #ifdef HAVE_HGE
206 0 : MOD_3TYPE(int, sht, hge)
207 : #endif
208 24254689 : MOD_3TYPE(int, int, int)
209 0 : MOD_3TYPE(int, int, lng)
210 : #ifdef HAVE_HGE
211 0 : MOD_3TYPE(int, int, hge)
212 : #endif
213 0 : MOD_3TYPE(int, lng, int)
214 0 : MOD_3TYPE(int, lng, lng)
215 : #ifdef HAVE_HGE
216 0 : MOD_3TYPE(int, lng, hge)
217 : #endif
218 : #ifdef HAVE_HGE
219 0 : MOD_3TYPE(int, hge, int)
220 0 : MOD_3TYPE(int, hge, lng)
221 0 : MOD_3TYPE(int, hge, hge)
222 : #endif
223 0 : MOD_3TYPE(lng, bte, bte)
224 0 : MOD_3TYPE(lng, bte, sht)
225 0 : MOD_3TYPE(lng, bte, int)
226 0 : MOD_3TYPE(lng, bte, lng)
227 : #ifdef HAVE_HGE
228 0 : MOD_3TYPE(lng, bte, hge)
229 : #endif
230 0 : MOD_3TYPE(lng, sht, sht)
231 0 : MOD_3TYPE(lng, sht, int)
232 0 : MOD_3TYPE(lng, sht, lng)
233 : #ifdef HAVE_HGE
234 0 : MOD_3TYPE(lng, sht, hge)
235 : #endif
236 0 : MOD_3TYPE(lng, int, int)
237 0 : MOD_3TYPE(lng, int, lng)
238 : #ifdef HAVE_HGE
239 0 : MOD_3TYPE(lng, int, hge)
240 : #endif
241 50506 : MOD_3TYPE(lng, lng, lng)
242 : #ifdef HAVE_HGE
243 0 : MOD_3TYPE(lng, lng, hge)
244 : #endif
245 : #ifdef HAVE_HGE
246 0 : MOD_3TYPE(lng, hge, lng)
247 0 : MOD_3TYPE(lng, hge, hge)
248 : #endif
249 : #ifdef HAVE_HGE
250 0 : MOD_3TYPE(hge, bte, bte)
251 0 : MOD_3TYPE(hge, bte, sht)
252 0 : MOD_3TYPE(hge, bte, int)
253 0 : MOD_3TYPE(hge, bte, lng)
254 0 : MOD_3TYPE(hge, bte, hge)
255 0 : MOD_3TYPE(hge, sht, sht)
256 0 : MOD_3TYPE(hge, sht, int)
257 0 : MOD_3TYPE(hge, sht, lng)
258 0 : MOD_3TYPE(hge, sht, hge)
259 0 : MOD_3TYPE(hge, int, int)
260 0 : MOD_3TYPE(hge, int, lng)
261 0 : MOD_3TYPE(hge, int, hge)
262 0 : MOD_3TYPE(hge, lng, lng)
263 0 : MOD_3TYPE(hge, lng, hge)
264 25259404 : MOD_3TYPE(hge, hge, hge)
265 : #endif
266 :
267 0 : FMOD_3TYPE(bte, flt, flt, fmodf)
268 0 : FMOD_3TYPE(sht, flt, flt, fmodf)
269 0 : FMOD_3TYPE(int, flt, flt, fmodf)
270 0 : FMOD_3TYPE(lng, flt, flt, fmodf)
271 : #ifdef HAVE_HGE
272 0 : FMOD_3TYPE(hge, flt, flt, fmodf)
273 : #endif
274 0 : FMOD_3TYPE(flt, bte, flt, fmodf)
275 0 : FMOD_3TYPE(flt, sht, flt, fmodf)
276 0 : FMOD_3TYPE(flt, int, flt, fmodf)
277 0 : FMOD_3TYPE(flt, lng, flt, fmodf)
278 : #ifdef HAVE_HGE
279 0 : FMOD_3TYPE(flt, hge, flt, fmodf)
280 : #endif
281 7 : FMOD_3TYPE(flt, flt, flt, fmodf)
282 0 : FMOD_3TYPE(bte, dbl, dbl, fmod)
283 0 : FMOD_3TYPE(sht, dbl, dbl, fmod)
284 0 : FMOD_3TYPE(int, dbl, dbl, fmod)
285 0 : FMOD_3TYPE(lng, dbl, dbl, fmod)
286 : #ifdef HAVE_HGE
287 0 : FMOD_3TYPE(hge, dbl, dbl, fmod)
288 : #endif
289 0 : FMOD_3TYPE(flt, dbl, dbl, fmod)
290 0 : FMOD_3TYPE(dbl, bte, dbl, fmod)
291 0 : FMOD_3TYPE(dbl, sht, dbl, fmod)
292 0 : FMOD_3TYPE(dbl, int, dbl, fmod)
293 0 : FMOD_3TYPE(dbl, lng, dbl, fmod)
294 : #ifdef HAVE_HGE
295 0 : FMOD_3TYPE(dbl, hge, dbl, fmod)
296 : #endif
297 0 : FMOD_3TYPE(dbl, flt, dbl, fmod)
298 80 : FMOD_3TYPE(dbl, dbl, dbl, fmod)
299 :
300 : static BUN
301 608 : mod_typeswitchloop(const void *lft, int tp1, bool incr1,
302 : const void *rgt, int tp2, bool incr2,
303 : void *restrict dst, int tp,
304 : struct canditer *restrict ci1, struct canditer *restrict ci2,
305 : oid candoff1, oid candoff2, const char *func)
306 : {
307 608 : BUN nils;
308 :
309 608 : tp1 = ATOMbasetype(tp1);
310 608 : tp2 = ATOMbasetype(tp2);
311 608 : tp = ATOMbasetype(tp);
312 608 : switch (tp1) {
313 11 : case TYPE_bte:
314 11 : switch (tp2) {
315 11 : case TYPE_bte:
316 11 : switch (tp) {
317 11 : case TYPE_bte:
318 11 : nils = mod_bte_bte_bte(lft, incr1, rgt, incr2,
319 : dst, ci1, ci2, candoff1, candoff2);
320 11 : break;
321 0 : case TYPE_sht:
322 0 : nils = mod_bte_bte_sht(lft, incr1, rgt, incr2,
323 : dst, ci1, ci2, candoff1, candoff2);
324 0 : break;
325 0 : case TYPE_int:
326 0 : nils = mod_bte_bte_int(lft, incr1, rgt, incr2,
327 : dst, ci1, ci2, candoff1, candoff2);
328 0 : break;
329 0 : case TYPE_lng:
330 0 : nils = mod_bte_bte_lng(lft, incr1, rgt, incr2,
331 : dst, ci1, ci2, candoff1, candoff2);
332 0 : break;
333 : #ifdef HAVE_HGE
334 0 : case TYPE_hge:
335 0 : nils = mod_bte_bte_hge(lft, incr1, rgt, incr2,
336 : dst, ci1, ci2, candoff1, candoff2);
337 0 : break;
338 : #endif
339 0 : default:
340 0 : goto unsupported;
341 : }
342 : break;
343 0 : case TYPE_sht:
344 0 : switch (tp) {
345 0 : case TYPE_bte:
346 0 : nils = mod_bte_sht_bte(lft, incr1, rgt, incr2,
347 : dst, ci1, ci2, candoff1, candoff2);
348 0 : break;
349 0 : case TYPE_sht:
350 0 : nils = mod_bte_sht_sht(lft, incr1, rgt, incr2,
351 : dst, ci1, ci2, candoff1, candoff2);
352 0 : break;
353 0 : case TYPE_int:
354 0 : nils = mod_bte_sht_int(lft, incr1, rgt, incr2,
355 : dst, ci1, ci2, candoff1, candoff2);
356 0 : break;
357 0 : case TYPE_lng:
358 0 : nils = mod_bte_sht_lng(lft, incr1, rgt, incr2,
359 : dst, ci1, ci2, candoff1, candoff2);
360 0 : break;
361 : #ifdef HAVE_HGE
362 0 : case TYPE_hge:
363 0 : nils = mod_bte_sht_hge(lft, incr1, rgt, incr2,
364 : dst, ci1, ci2, candoff1, candoff2);
365 0 : break;
366 : #endif
367 0 : default:
368 0 : goto unsupported;
369 : }
370 : break;
371 0 : case TYPE_int:
372 0 : switch (tp) {
373 0 : case TYPE_bte:
374 0 : nils = mod_bte_int_bte(lft, incr1, rgt, incr2,
375 : dst, ci1, ci2, candoff1, candoff2);
376 0 : break;
377 0 : case TYPE_sht:
378 0 : nils = mod_bte_int_sht(lft, incr1, rgt, incr2,
379 : dst, ci1, ci2, candoff1, candoff2);
380 0 : break;
381 0 : case TYPE_int:
382 0 : nils = mod_bte_int_int(lft, incr1, rgt, incr2,
383 : dst, ci1, ci2, candoff1, candoff2);
384 0 : break;
385 0 : case TYPE_lng:
386 0 : nils = mod_bte_int_lng(lft, incr1, rgt, incr2,
387 : dst, ci1, ci2, candoff1, candoff2);
388 0 : break;
389 : #ifdef HAVE_HGE
390 0 : case TYPE_hge:
391 0 : nils = mod_bte_int_hge(lft, incr1, rgt, incr2,
392 : dst, ci1, ci2, candoff1, candoff2);
393 0 : break;
394 : #endif
395 0 : default:
396 0 : goto unsupported;
397 : }
398 : break;
399 0 : case TYPE_lng:
400 0 : switch (tp) {
401 0 : case TYPE_bte:
402 0 : nils = mod_bte_lng_bte(lft, incr1, rgt, incr2,
403 : dst, ci1, ci2, candoff1, candoff2);
404 0 : break;
405 0 : case TYPE_sht:
406 0 : nils = mod_bte_lng_sht(lft, incr1, rgt, incr2,
407 : dst, ci1, ci2, candoff1, candoff2);
408 0 : break;
409 0 : case TYPE_int:
410 0 : nils = mod_bte_lng_int(lft, incr1, rgt, incr2,
411 : dst, ci1, ci2, candoff1, candoff2);
412 0 : break;
413 0 : case TYPE_lng:
414 0 : nils = mod_bte_lng_lng(lft, incr1, rgt, incr2,
415 : dst, ci1, ci2, candoff1, candoff2);
416 0 : break;
417 : #ifdef HAVE_HGE
418 0 : case TYPE_hge:
419 0 : nils = mod_bte_lng_hge(lft, incr1, rgt, incr2,
420 : dst, ci1, ci2, candoff1, candoff2);
421 0 : break;
422 : #endif
423 0 : default:
424 0 : goto unsupported;
425 : }
426 : break;
427 : #ifdef HAVE_HGE
428 0 : case TYPE_hge:
429 0 : switch (tp) {
430 0 : case TYPE_bte:
431 0 : nils = mod_bte_hge_bte(lft, incr1, rgt, incr2,
432 : dst, ci1, ci2, candoff1, candoff2);
433 0 : break;
434 0 : case TYPE_sht:
435 0 : nils = mod_bte_hge_sht(lft, incr1, rgt, incr2,
436 : dst, ci1, ci2, candoff1, candoff2);
437 0 : break;
438 0 : case TYPE_int:
439 0 : nils = mod_bte_hge_int(lft, incr1, rgt, incr2,
440 : dst, ci1, ci2, candoff1, candoff2);
441 0 : break;
442 0 : case TYPE_lng:
443 0 : nils = mod_bte_hge_lng(lft, incr1, rgt, incr2,
444 : dst, ci1, ci2, candoff1, candoff2);
445 0 : break;
446 0 : case TYPE_hge:
447 0 : nils = mod_bte_hge_hge(lft, incr1, rgt, incr2,
448 : dst, ci1, ci2, candoff1, candoff2);
449 0 : break;
450 0 : default:
451 0 : goto unsupported;
452 : }
453 : break;
454 : #endif
455 0 : case TYPE_flt:
456 0 : switch (tp) {
457 0 : case TYPE_flt:
458 0 : nils = mod_bte_flt_flt(lft, incr1, rgt, incr2,
459 : dst, ci1, ci2, candoff1, candoff2);
460 0 : break;
461 0 : default:
462 0 : goto unsupported;
463 : }
464 0 : break;
465 0 : case TYPE_dbl:
466 0 : switch (tp) {
467 0 : case TYPE_dbl:
468 0 : nils = mod_bte_dbl_dbl(lft, incr1, rgt, incr2,
469 : dst, ci1, ci2, candoff1, candoff2);
470 0 : break;
471 0 : default:
472 0 : goto unsupported;
473 : }
474 0 : break;
475 0 : default:
476 0 : goto unsupported;
477 : }
478 : break;
479 5 : case TYPE_sht:
480 5 : switch (tp2) {
481 0 : case TYPE_bte:
482 0 : switch (tp) {
483 0 : case TYPE_bte:
484 0 : nils = mod_sht_bte_bte(lft, incr1, rgt, incr2,
485 : dst, ci1, ci2, candoff1, candoff2);
486 0 : break;
487 0 : case TYPE_sht:
488 0 : nils = mod_sht_bte_sht(lft, incr1, rgt, incr2,
489 : dst, ci1, ci2, candoff1, candoff2);
490 0 : break;
491 0 : case TYPE_int:
492 0 : nils = mod_sht_bte_int(lft, incr1, rgt, incr2,
493 : dst, ci1, ci2, candoff1, candoff2);
494 0 : break;
495 0 : case TYPE_lng:
496 0 : nils = mod_sht_bte_lng(lft, incr1, rgt, incr2,
497 : dst, ci1, ci2, candoff1, candoff2);
498 0 : break;
499 : #ifdef HAVE_HGE
500 0 : case TYPE_hge:
501 0 : nils = mod_sht_bte_hge(lft, incr1, rgt, incr2,
502 : dst, ci1, ci2, candoff1, candoff2);
503 0 : break;
504 : #endif
505 0 : default:
506 0 : goto unsupported;
507 : }
508 : break;
509 5 : case TYPE_sht:
510 5 : switch (tp) {
511 5 : case TYPE_sht:
512 5 : nils = mod_sht_sht_sht(lft, incr1, rgt, incr2,
513 : dst, ci1, ci2, candoff1, candoff2);
514 5 : break;
515 0 : case TYPE_int:
516 0 : nils = mod_sht_sht_int(lft, incr1, rgt, incr2,
517 : dst, ci1, ci2, candoff1, candoff2);
518 0 : break;
519 0 : case TYPE_lng:
520 0 : nils = mod_sht_sht_lng(lft, incr1, rgt, incr2,
521 : dst, ci1, ci2, candoff1, candoff2);
522 0 : break;
523 : #ifdef HAVE_HGE
524 0 : case TYPE_hge:
525 0 : nils = mod_sht_sht_hge(lft, incr1, rgt, incr2,
526 : dst, ci1, ci2, candoff1, candoff2);
527 0 : break;
528 : #endif
529 0 : default:
530 0 : goto unsupported;
531 : }
532 : break;
533 0 : case TYPE_int:
534 0 : switch (tp) {
535 0 : case TYPE_sht:
536 0 : nils = mod_sht_int_sht(lft, incr1, rgt, incr2,
537 : dst, ci1, ci2, candoff1, candoff2);
538 0 : break;
539 0 : case TYPE_int:
540 0 : nils = mod_sht_int_int(lft, incr1, rgt, incr2,
541 : dst, ci1, ci2, candoff1, candoff2);
542 0 : break;
543 0 : case TYPE_lng:
544 0 : nils = mod_sht_int_lng(lft, incr1, rgt, incr2,
545 : dst, ci1, ci2, candoff1, candoff2);
546 0 : break;
547 : #ifdef HAVE_HGE
548 0 : case TYPE_hge:
549 0 : nils = mod_sht_int_hge(lft, incr1, rgt, incr2,
550 : dst, ci1, ci2, candoff1, candoff2);
551 0 : break;
552 : #endif
553 0 : default:
554 0 : goto unsupported;
555 : }
556 : break;
557 0 : case TYPE_lng:
558 0 : switch (tp) {
559 0 : case TYPE_sht:
560 0 : nils = mod_sht_lng_sht(lft, incr1, rgt, incr2,
561 : dst, ci1, ci2, candoff1, candoff2);
562 0 : break;
563 0 : case TYPE_int:
564 0 : nils = mod_sht_lng_int(lft, incr1, rgt, incr2,
565 : dst, ci1, ci2, candoff1, candoff2);
566 0 : break;
567 0 : case TYPE_lng:
568 0 : nils = mod_sht_lng_lng(lft, incr1, rgt, incr2,
569 : dst, ci1, ci2, candoff1, candoff2);
570 0 : break;
571 : #ifdef HAVE_HGE
572 0 : case TYPE_hge:
573 0 : nils = mod_sht_lng_hge(lft, incr1, rgt, incr2,
574 : dst, ci1, ci2, candoff1, candoff2);
575 0 : break;
576 : #endif
577 0 : default:
578 0 : goto unsupported;
579 : }
580 : break;
581 : #ifdef HAVE_HGE
582 0 : case TYPE_hge:
583 0 : switch (tp) {
584 0 : case TYPE_sht:
585 0 : nils = mod_sht_hge_sht(lft, incr1, rgt, incr2,
586 : dst, ci1, ci2, candoff1, candoff2);
587 0 : break;
588 0 : case TYPE_int:
589 0 : nils = mod_sht_hge_int(lft, incr1, rgt, incr2,
590 : dst, ci1, ci2, candoff1, candoff2);
591 0 : break;
592 0 : case TYPE_lng:
593 0 : nils = mod_sht_hge_lng(lft, incr1, rgt, incr2,
594 : dst, ci1, ci2, candoff1, candoff2);
595 0 : break;
596 0 : case TYPE_hge:
597 0 : nils = mod_sht_hge_hge(lft, incr1, rgt, incr2,
598 : dst, ci1, ci2, candoff1, candoff2);
599 0 : break;
600 0 : default:
601 0 : goto unsupported;
602 : }
603 : break;
604 : #endif
605 0 : case TYPE_flt:
606 0 : switch (tp) {
607 0 : case TYPE_flt:
608 0 : nils = mod_sht_flt_flt(lft, incr1, rgt, incr2,
609 : dst, ci1, ci2, candoff1, candoff2);
610 0 : break;
611 0 : default:
612 0 : goto unsupported;
613 : }
614 0 : break;
615 0 : case TYPE_dbl:
616 0 : switch (tp) {
617 0 : case TYPE_dbl:
618 0 : nils = mod_sht_dbl_dbl(lft, incr1, rgt, incr2,
619 : dst, ci1, ci2, candoff1, candoff2);
620 0 : break;
621 0 : default:
622 0 : goto unsupported;
623 : }
624 0 : break;
625 0 : default:
626 0 : goto unsupported;
627 : }
628 : break;
629 317 : case TYPE_int:
630 317 : switch (tp2) {
631 0 : case TYPE_bte:
632 0 : switch (tp) {
633 0 : case TYPE_bte:
634 0 : nils = mod_int_bte_bte(lft, incr1, rgt, incr2,
635 : dst, ci1, ci2, candoff1, candoff2);
636 0 : break;
637 0 : case TYPE_sht:
638 0 : nils = mod_int_bte_sht(lft, incr1, rgt, incr2,
639 : dst, ci1, ci2, candoff1, candoff2);
640 0 : break;
641 0 : case TYPE_int:
642 0 : nils = mod_int_bte_int(lft, incr1, rgt, incr2,
643 : dst, ci1, ci2, candoff1, candoff2);
644 0 : break;
645 0 : case TYPE_lng:
646 0 : nils = mod_int_bte_lng(lft, incr1, rgt, incr2,
647 : dst, ci1, ci2, candoff1, candoff2);
648 0 : break;
649 : #ifdef HAVE_HGE
650 0 : case TYPE_hge:
651 0 : nils = mod_int_bte_hge(lft, incr1, rgt, incr2,
652 : dst, ci1, ci2, candoff1, candoff2);
653 0 : break;
654 : #endif
655 0 : default:
656 0 : goto unsupported;
657 : }
658 : break;
659 0 : case TYPE_sht:
660 0 : switch (tp) {
661 0 : case TYPE_sht:
662 0 : nils = mod_int_sht_sht(lft, incr1, rgt, incr2,
663 : dst, ci1, ci2, candoff1, candoff2);
664 0 : break;
665 0 : case TYPE_int:
666 0 : nils = mod_int_sht_int(lft, incr1, rgt, incr2,
667 : dst, ci1, ci2, candoff1, candoff2);
668 0 : break;
669 0 : case TYPE_lng:
670 0 : nils = mod_int_sht_lng(lft, incr1, rgt, incr2,
671 : dst, ci1, ci2, candoff1, candoff2);
672 0 : break;
673 : #ifdef HAVE_HGE
674 0 : case TYPE_hge:
675 0 : nils = mod_int_sht_hge(lft, incr1, rgt, incr2,
676 : dst, ci1, ci2, candoff1, candoff2);
677 0 : break;
678 : #endif
679 0 : default:
680 0 : goto unsupported;
681 : }
682 : break;
683 317 : case TYPE_int:
684 317 : switch (tp) {
685 317 : case TYPE_int:
686 317 : nils = mod_int_int_int(lft, incr1, rgt, incr2,
687 : dst, ci1, ci2, candoff1, candoff2);
688 317 : break;
689 0 : case TYPE_lng:
690 0 : nils = mod_int_int_lng(lft, incr1, rgt, incr2,
691 : dst, ci1, ci2, candoff1, candoff2);
692 0 : break;
693 : #ifdef HAVE_HGE
694 0 : case TYPE_hge:
695 0 : nils = mod_int_int_hge(lft, incr1, rgt, incr2,
696 : dst, ci1, ci2, candoff1, candoff2);
697 0 : break;
698 : #endif
699 0 : default:
700 0 : goto unsupported;
701 : }
702 : break;
703 0 : case TYPE_lng:
704 0 : switch (tp) {
705 0 : case TYPE_int:
706 0 : nils = mod_int_lng_int(lft, incr1, rgt, incr2,
707 : dst, ci1, ci2, candoff1, candoff2);
708 0 : break;
709 0 : case TYPE_lng:
710 0 : nils = mod_int_lng_lng(lft, incr1, rgt, incr2,
711 : dst, ci1, ci2, candoff1, candoff2);
712 0 : break;
713 : #ifdef HAVE_HGE
714 0 : case TYPE_hge:
715 0 : nils = mod_int_lng_hge(lft, incr1, rgt, incr2,
716 : dst, ci1, ci2, candoff1, candoff2);
717 0 : break;
718 : #endif
719 0 : default:
720 0 : goto unsupported;
721 : }
722 : break;
723 : #ifdef HAVE_HGE
724 0 : case TYPE_hge:
725 0 : switch (tp) {
726 0 : case TYPE_int:
727 0 : nils = mod_int_hge_int(lft, incr1, rgt, incr2,
728 : dst, ci1, ci2, candoff1, candoff2);
729 0 : break;
730 0 : case TYPE_lng:
731 0 : nils = mod_int_hge_lng(lft, incr1, rgt, incr2,
732 : dst, ci1, ci2, candoff1, candoff2);
733 0 : break;
734 0 : case TYPE_hge:
735 0 : nils = mod_int_hge_hge(lft, incr1, rgt, incr2,
736 : dst, ci1, ci2, candoff1, candoff2);
737 0 : break;
738 0 : default:
739 0 : goto unsupported;
740 : }
741 : break;
742 : #endif
743 0 : case TYPE_flt:
744 0 : switch (tp) {
745 0 : case TYPE_flt:
746 0 : nils = mod_int_flt_flt(lft, incr1, rgt, incr2,
747 : dst, ci1, ci2, candoff1, candoff2);
748 0 : break;
749 0 : default:
750 0 : goto unsupported;
751 : }
752 0 : break;
753 0 : case TYPE_dbl:
754 0 : switch (tp) {
755 0 : case TYPE_dbl:
756 0 : nils = mod_int_dbl_dbl(lft, incr1, rgt, incr2,
757 : dst, ci1, ci2, candoff1, candoff2);
758 0 : break;
759 0 : default:
760 0 : goto unsupported;
761 : }
762 0 : break;
763 0 : default:
764 0 : goto unsupported;
765 : }
766 : break;
767 8 : case TYPE_lng:
768 8 : switch (tp2) {
769 0 : case TYPE_bte:
770 0 : switch (tp) {
771 0 : case TYPE_bte:
772 0 : nils = mod_lng_bte_bte(lft, incr1, rgt, incr2,
773 : dst, ci1, ci2, candoff1, candoff2);
774 0 : break;
775 0 : case TYPE_sht:
776 0 : nils = mod_lng_bte_sht(lft, incr1, rgt, incr2,
777 : dst, ci1, ci2, candoff1, candoff2);
778 0 : break;
779 0 : case TYPE_int:
780 0 : nils = mod_lng_bte_int(lft, incr1, rgt, incr2,
781 : dst, ci1, ci2, candoff1, candoff2);
782 0 : break;
783 0 : case TYPE_lng:
784 0 : nils = mod_lng_bte_lng(lft, incr1, rgt, incr2,
785 : dst, ci1, ci2, candoff1, candoff2);
786 0 : break;
787 : #ifdef HAVE_HGE
788 0 : case TYPE_hge:
789 0 : nils = mod_lng_bte_hge(lft, incr1, rgt, incr2,
790 : dst, ci1, ci2, candoff1, candoff2);
791 0 : break;
792 : #endif
793 0 : default:
794 0 : goto unsupported;
795 : }
796 : break;
797 0 : case TYPE_sht:
798 0 : switch (tp) {
799 0 : case TYPE_sht:
800 0 : nils = mod_lng_sht_sht(lft, incr1, rgt, incr2,
801 : dst, ci1, ci2, candoff1, candoff2);
802 0 : break;
803 0 : case TYPE_int:
804 0 : nils = mod_lng_sht_int(lft, incr1, rgt, incr2,
805 : dst, ci1, ci2, candoff1, candoff2);
806 0 : break;
807 0 : case TYPE_lng:
808 0 : nils = mod_lng_sht_lng(lft, incr1, rgt, incr2,
809 : dst, ci1, ci2, candoff1, candoff2);
810 0 : break;
811 : #ifdef HAVE_HGE
812 0 : case TYPE_hge:
813 0 : nils = mod_lng_sht_hge(lft, incr1, rgt, incr2,
814 : dst, ci1, ci2, candoff1, candoff2);
815 0 : break;
816 : #endif
817 0 : default:
818 0 : goto unsupported;
819 : }
820 : break;
821 0 : case TYPE_int:
822 0 : switch (tp) {
823 0 : case TYPE_int:
824 0 : nils = mod_lng_int_int(lft, incr1, rgt, incr2,
825 : dst, ci1, ci2, candoff1, candoff2);
826 0 : break;
827 0 : case TYPE_lng:
828 0 : nils = mod_lng_int_lng(lft, incr1, rgt, incr2,
829 : dst, ci1, ci2, candoff1, candoff2);
830 0 : break;
831 : #ifdef HAVE_HGE
832 0 : case TYPE_hge:
833 0 : nils = mod_lng_int_hge(lft, incr1, rgt, incr2,
834 : dst, ci1, ci2, candoff1, candoff2);
835 0 : break;
836 : #endif
837 0 : default:
838 0 : goto unsupported;
839 : }
840 : break;
841 8 : case TYPE_lng:
842 8 : switch (tp) {
843 8 : case TYPE_lng:
844 8 : nils = mod_lng_lng_lng(lft, incr1, rgt, incr2,
845 : dst, ci1, ci2, candoff1, candoff2);
846 8 : break;
847 : #ifdef HAVE_HGE
848 0 : case TYPE_hge:
849 0 : nils = mod_lng_lng_hge(lft, incr1, rgt, incr2,
850 : dst, ci1, ci2, candoff1, candoff2);
851 0 : break;
852 : #endif
853 0 : default:
854 0 : goto unsupported;
855 : }
856 : break;
857 : #ifdef HAVE_HGE
858 0 : case TYPE_hge:
859 0 : switch (tp) {
860 0 : case TYPE_lng:
861 0 : nils = mod_lng_hge_lng(lft, incr1, rgt, incr2,
862 : dst, ci1, ci2, candoff1, candoff2);
863 0 : break;
864 0 : case TYPE_hge:
865 0 : nils = mod_lng_hge_hge(lft, incr1, rgt, incr2,
866 : dst, ci1, ci2, candoff1, candoff2);
867 0 : break;
868 0 : default:
869 0 : goto unsupported;
870 : }
871 : break;
872 : #endif
873 0 : case TYPE_flt:
874 0 : switch (tp) {
875 0 : case TYPE_flt:
876 0 : nils = mod_lng_flt_flt(lft, incr1, rgt, incr2,
877 : dst, ci1, ci2, candoff1, candoff2);
878 0 : break;
879 0 : default:
880 0 : goto unsupported;
881 : }
882 0 : break;
883 0 : case TYPE_dbl:
884 0 : switch (tp) {
885 0 : case TYPE_dbl:
886 0 : nils = mod_lng_dbl_dbl(lft, incr1, rgt, incr2,
887 : dst, ci1, ci2, candoff1, candoff2);
888 0 : break;
889 0 : default:
890 0 : goto unsupported;
891 : }
892 0 : break;
893 0 : default:
894 0 : goto unsupported;
895 : }
896 : break;
897 : #ifdef HAVE_HGE
898 261 : case TYPE_hge:
899 261 : switch (tp2) {
900 0 : case TYPE_bte:
901 0 : switch (tp) {
902 0 : case TYPE_bte:
903 0 : nils = mod_hge_bte_bte(lft, incr1, rgt, incr2,
904 : dst, ci1, ci2, candoff1, candoff2);
905 0 : break;
906 0 : case TYPE_sht:
907 0 : nils = mod_hge_bte_sht(lft, incr1, rgt, incr2,
908 : dst, ci1, ci2, candoff1, candoff2);
909 0 : break;
910 0 : case TYPE_int:
911 0 : nils = mod_hge_bte_int(lft, incr1, rgt, incr2,
912 : dst, ci1, ci2, candoff1, candoff2);
913 0 : break;
914 0 : case TYPE_lng:
915 0 : nils = mod_hge_bte_lng(lft, incr1, rgt, incr2,
916 : dst, ci1, ci2, candoff1, candoff2);
917 0 : break;
918 0 : case TYPE_hge:
919 0 : nils = mod_hge_bte_hge(lft, incr1, rgt, incr2,
920 : dst, ci1, ci2, candoff1, candoff2);
921 0 : break;
922 0 : default:
923 0 : goto unsupported;
924 : }
925 : break;
926 0 : case TYPE_sht:
927 0 : switch (tp) {
928 0 : case TYPE_sht:
929 0 : nils = mod_hge_sht_sht(lft, incr1, rgt, incr2,
930 : dst, ci1, ci2, candoff1, candoff2);
931 0 : break;
932 0 : case TYPE_int:
933 0 : nils = mod_hge_sht_int(lft, incr1, rgt, incr2,
934 : dst, ci1, ci2, candoff1, candoff2);
935 0 : break;
936 0 : case TYPE_lng:
937 0 : nils = mod_hge_sht_lng(lft, incr1, rgt, incr2,
938 : dst, ci1, ci2, candoff1, candoff2);
939 0 : break;
940 0 : case TYPE_hge:
941 0 : nils = mod_hge_sht_hge(lft, incr1, rgt, incr2,
942 : dst, ci1, ci2, candoff1, candoff2);
943 0 : break;
944 0 : default:
945 0 : goto unsupported;
946 : }
947 : break;
948 0 : case TYPE_int:
949 0 : switch (tp) {
950 0 : case TYPE_int:
951 0 : nils = mod_hge_int_int(lft, incr1, rgt, incr2,
952 : dst, ci1, ci2, candoff1, candoff2);
953 0 : break;
954 0 : case TYPE_lng:
955 0 : nils = mod_hge_int_lng(lft, incr1, rgt, incr2,
956 : dst, ci1, ci2, candoff1, candoff2);
957 0 : break;
958 0 : case TYPE_hge:
959 0 : nils = mod_hge_int_hge(lft, incr1, rgt, incr2,
960 : dst, ci1, ci2, candoff1, candoff2);
961 0 : break;
962 0 : default:
963 0 : goto unsupported;
964 : }
965 : break;
966 0 : case TYPE_lng:
967 0 : switch (tp) {
968 0 : case TYPE_lng:
969 0 : nils = mod_hge_lng_lng(lft, incr1, rgt, incr2,
970 : dst, ci1, ci2, candoff1, candoff2);
971 0 : break;
972 0 : case TYPE_hge:
973 0 : nils = mod_hge_lng_hge(lft, incr1, rgt, incr2,
974 : dst, ci1, ci2, candoff1, candoff2);
975 0 : break;
976 0 : default:
977 0 : goto unsupported;
978 : }
979 : break;
980 261 : case TYPE_hge:
981 261 : switch (tp) {
982 261 : case TYPE_hge:
983 261 : nils = mod_hge_hge_hge(lft, incr1, rgt, incr2,
984 : dst, ci1, ci2, candoff1, candoff2);
985 261 : break;
986 0 : default:
987 0 : goto unsupported;
988 : }
989 261 : break;
990 0 : case TYPE_flt:
991 0 : switch (tp) {
992 0 : case TYPE_flt:
993 0 : nils = mod_hge_flt_flt(lft, incr1, rgt, incr2,
994 : dst, ci1, ci2, candoff1, candoff2);
995 0 : break;
996 0 : default:
997 0 : goto unsupported;
998 : }
999 0 : break;
1000 0 : case TYPE_dbl:
1001 0 : switch (tp) {
1002 0 : case TYPE_dbl:
1003 0 : nils = mod_hge_dbl_dbl(lft, incr1, rgt, incr2,
1004 : dst, ci1, ci2, candoff1, candoff2);
1005 0 : break;
1006 0 : default:
1007 0 : goto unsupported;
1008 : }
1009 0 : break;
1010 0 : default:
1011 0 : goto unsupported;
1012 : }
1013 : break;
1014 : #endif
1015 1 : case TYPE_flt:
1016 1 : switch (tp2) {
1017 0 : case TYPE_bte:
1018 0 : switch (tp) {
1019 0 : case TYPE_flt:
1020 0 : nils = mod_flt_bte_flt(lft, incr1, rgt, incr2,
1021 : dst, ci1, ci2, candoff1, candoff2);
1022 0 : break;
1023 0 : default:
1024 0 : goto unsupported;
1025 : }
1026 0 : break;
1027 0 : case TYPE_sht:
1028 0 : switch (tp) {
1029 0 : case TYPE_flt:
1030 0 : nils = mod_flt_sht_flt(lft, incr1, rgt, incr2,
1031 : dst, ci1, ci2, candoff1, candoff2);
1032 0 : break;
1033 0 : default:
1034 0 : goto unsupported;
1035 : }
1036 0 : break;
1037 0 : case TYPE_int:
1038 0 : switch (tp) {
1039 0 : case TYPE_flt:
1040 0 : nils = mod_flt_int_flt(lft, incr1, rgt, incr2,
1041 : dst, ci1, ci2, candoff1, candoff2);
1042 0 : break;
1043 0 : default:
1044 0 : goto unsupported;
1045 : }
1046 0 : break;
1047 0 : case TYPE_lng:
1048 0 : switch (tp) {
1049 0 : case TYPE_flt:
1050 0 : nils = mod_flt_lng_flt(lft, incr1, rgt, incr2,
1051 : dst, ci1, ci2, candoff1, candoff2);
1052 0 : break;
1053 0 : default:
1054 0 : goto unsupported;
1055 : }
1056 0 : break;
1057 : #ifdef HAVE_HGE
1058 0 : case TYPE_hge:
1059 0 : switch (tp) {
1060 0 : case TYPE_flt:
1061 0 : nils = mod_flt_hge_flt(lft, incr1, rgt, incr2,
1062 : dst, ci1, ci2, candoff1, candoff2);
1063 0 : break;
1064 0 : default:
1065 0 : goto unsupported;
1066 : }
1067 0 : break;
1068 : #endif
1069 1 : case TYPE_flt:
1070 1 : switch (tp) {
1071 1 : case TYPE_flt:
1072 1 : nils = mod_flt_flt_flt(lft, incr1, rgt, incr2,
1073 : dst, ci1, ci2, candoff1, candoff2);
1074 1 : break;
1075 0 : default:
1076 0 : goto unsupported;
1077 : }
1078 1 : break;
1079 0 : case TYPE_dbl:
1080 0 : switch (tp) {
1081 0 : case TYPE_dbl:
1082 0 : nils = mod_flt_dbl_dbl(lft, incr1, rgt, incr2,
1083 : dst, ci1, ci2, candoff1, candoff2);
1084 0 : break;
1085 0 : default:
1086 0 : goto unsupported;
1087 : }
1088 0 : break;
1089 0 : default:
1090 0 : goto unsupported;
1091 : }
1092 : break;
1093 5 : case TYPE_dbl:
1094 5 : switch (tp2) {
1095 0 : case TYPE_bte:
1096 0 : switch (tp) {
1097 0 : case TYPE_dbl:
1098 0 : nils = mod_dbl_bte_dbl(lft, incr1, rgt, incr2,
1099 : dst, ci1, ci2, candoff1, candoff2);
1100 0 : break;
1101 0 : default:
1102 0 : goto unsupported;
1103 : }
1104 0 : break;
1105 0 : case TYPE_sht:
1106 0 : switch (tp) {
1107 0 : case TYPE_dbl:
1108 0 : nils = mod_dbl_sht_dbl(lft, incr1, rgt, incr2,
1109 : dst, ci1, ci2, candoff1, candoff2);
1110 0 : break;
1111 0 : default:
1112 0 : goto unsupported;
1113 : }
1114 0 : break;
1115 0 : case TYPE_int:
1116 0 : switch (tp) {
1117 0 : case TYPE_dbl:
1118 0 : nils = mod_dbl_int_dbl(lft, incr1, rgt, incr2,
1119 : dst, ci1, ci2, candoff1, candoff2);
1120 0 : break;
1121 0 : default:
1122 0 : goto unsupported;
1123 : }
1124 0 : break;
1125 0 : case TYPE_lng:
1126 0 : switch (tp) {
1127 0 : case TYPE_dbl:
1128 0 : nils = mod_dbl_lng_dbl(lft, incr1, rgt, incr2,
1129 : dst, ci1, ci2, candoff1, candoff2);
1130 0 : break;
1131 0 : default:
1132 0 : goto unsupported;
1133 : }
1134 0 : break;
1135 : #ifdef HAVE_HGE
1136 0 : case TYPE_hge:
1137 0 : switch (tp) {
1138 0 : case TYPE_dbl:
1139 0 : nils = mod_dbl_hge_dbl(lft, incr1, rgt, incr2,
1140 : dst, ci1, ci2, candoff1, candoff2);
1141 0 : break;
1142 0 : default:
1143 0 : goto unsupported;
1144 : }
1145 0 : break;
1146 : #endif
1147 0 : case TYPE_flt:
1148 0 : switch (tp) {
1149 0 : case TYPE_dbl:
1150 0 : nils = mod_dbl_flt_dbl(lft, incr1, rgt, incr2,
1151 : dst, ci1, ci2, candoff1, candoff2);
1152 0 : break;
1153 0 : default:
1154 0 : goto unsupported;
1155 : }
1156 0 : break;
1157 5 : case TYPE_dbl:
1158 5 : switch (tp) {
1159 5 : case TYPE_dbl:
1160 5 : nils = mod_dbl_dbl_dbl(lft, incr1, rgt, incr2,
1161 : dst, ci1, ci2, candoff1, candoff2);
1162 5 : break;
1163 0 : default:
1164 0 : goto unsupported;
1165 : }
1166 5 : break;
1167 0 : default:
1168 0 : goto unsupported;
1169 : }
1170 : break;
1171 0 : default:
1172 0 : goto unsupported;
1173 : }
1174 :
1175 608 : if (nils == BUN_NONE + 1)
1176 1 : GDKerror("22012!division by zero.\n");
1177 :
1178 : return nils;
1179 :
1180 0 : unsupported:
1181 0 : GDKerror("%s: type combination (mod(%s,%s)->%s) not supported.\n",
1182 : func, ATOMname(tp1), ATOMname(tp2), ATOMname(tp));
1183 0 : return BUN_NONE;
1184 : }
1185 :
1186 : BAT *
1187 4 : BATcalcmod(BAT *b1, BAT *b2, BAT *s1, BAT *s2, int tp)
1188 : {
1189 4 : return BATcalcmuldivmod(b1, b2, s1, s2, tp,
1190 : mod_typeswitchloop, __func__);
1191 : }
1192 :
1193 : BAT *
1194 584 : BATcalcmodcst(BAT *b, const ValRecord *v, BAT *s, int tp)
1195 : {
1196 584 : lng t0 = 0;
1197 584 : BAT *bn;
1198 584 : BUN nils;
1199 584 : struct canditer ci;
1200 :
1201 584 : TRC_DEBUG_IF(ALGO) t0 = GDKusec();
1202 :
1203 584 : BATcheck(b, NULL);
1204 :
1205 584 : canditer_init(&ci, b, s);
1206 :
1207 584 : bn = COLnew(ci.hseq, tp, ci.ncand, TRANSIENT);
1208 584 : if (bn == NULL)
1209 : return NULL;
1210 584 : if (ci.ncand == 0)
1211 : return bn;
1212 :
1213 584 : BATiter bi = bat_iterator(b);
1214 1168 : nils = mod_typeswitchloop(bi.base, bi.type, true,
1215 584 : VALptr(v), v->vtype, false,
1216 584 : Tloc(bn, 0), tp,
1217 : &ci,
1218 584 : &(struct canditer){.tpe=cand_dense, .ncand=ci.ncand},
1219 : b->hseqbase, 0, __func__);
1220 584 : bat_iterator_end(&bi);
1221 :
1222 584 : if (nils >= BUN_NONE) {
1223 0 : BBPunfix(bn->batCacheid);
1224 0 : return NULL;
1225 : }
1226 :
1227 584 : BATsetcount(bn, ci.ncand);
1228 :
1229 584 : bn->tsorted = ci.ncand <= 1 || nils == ci.ncand;
1230 584 : bn->trevsorted = ci.ncand <= 1 || nils == ci.ncand;
1231 584 : bn->tkey = ci.ncand <= 1;
1232 584 : bn->tnil = nils != 0;
1233 584 : bn->tnonil = nils == 0;
1234 :
1235 584 : TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
1236 : " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
1237 : ALGOBATPAR(b), ALGOOPTBATPAR(s),
1238 : ALGOOPTBATPAR(bn), GDKusec() - t0);
1239 :
1240 : return bn;
1241 : }
1242 :
1243 : BAT *
1244 3 : BATcalccstmod(const ValRecord *v, BAT *b, BAT *s, int tp)
1245 : {
1246 3 : lng t0 = 0;
1247 3 : BAT *bn;
1248 3 : BUN nils;
1249 3 : struct canditer ci;
1250 :
1251 3 : TRC_DEBUG_IF(ALGO) t0 = GDKusec();
1252 :
1253 3 : BATcheck(b, NULL);
1254 :
1255 3 : canditer_init(&ci, b, s);
1256 3 : bn = COLnew(ci.hseq, tp, ci.ncand, TRANSIENT);
1257 3 : if (bn == NULL)
1258 : return NULL;
1259 3 : if (ci.ncand == 0)
1260 : return bn;
1261 :
1262 2 : BATiter bi = bat_iterator(b);
1263 4 : nils = mod_typeswitchloop(VALptr(v), v->vtype, false,
1264 2 : bi.base, bi.type, true,
1265 2 : Tloc(bn, 0), tp,
1266 2 : &(struct canditer){.tpe=cand_dense, .ncand=ci.ncand},
1267 : &ci,
1268 : 0, b->hseqbase, __func__);
1269 2 : bat_iterator_end(&bi);
1270 :
1271 2 : if (nils >= BUN_NONE) {
1272 0 : BBPunfix(bn->batCacheid);
1273 0 : return NULL;
1274 : }
1275 :
1276 2 : BATsetcount(bn, ci.ncand);
1277 :
1278 2 : bn->tsorted = ci.ncand <= 1 || nils == ci.ncand;
1279 2 : bn->trevsorted = ci.ncand <= 1 || nils == ci.ncand;
1280 2 : bn->tkey = ci.ncand <= 1;
1281 2 : bn->tnil = nils != 0;
1282 2 : bn->tnonil = nils == 0;
1283 :
1284 2 : TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
1285 : " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
1286 : ALGOBATPAR(b), ALGOOPTBATPAR(s),
1287 : ALGOOPTBATPAR(bn), GDKusec() - t0);
1288 :
1289 : return bn;
1290 : }
1291 :
1292 : gdk_return
1293 19 : VARcalcmod(ValPtr ret, const ValRecord *lft, const ValRecord *rgt)
1294 : {
1295 19 : if (mod_typeswitchloop(VALptr(lft), lft->vtype, false,
1296 19 : VALptr(rgt), rgt->vtype, false,
1297 : VALget(ret), ret->vtype,
1298 19 : &(struct canditer){.tpe=cand_dense, .ncand=1},
1299 19 : &(struct canditer){.tpe=cand_dense, .ncand=1},
1300 : 0, 0, __func__) >= BUN_NONE)
1301 0 : return GDK_FAIL;
1302 19 : return GDK_SUCCEED;
1303 : }
|