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 : /* multiplication (any numeric type) */
20 :
21 : /* TYPE4 must be a type larger than both TYPE1 and TYPE2 so that
22 : * multiplying into it doesn't cause overflow */
23 : #define MUL_4TYPE(TYPE1, TYPE2, TYPE3, TYPE4, IF) \
24 : static BUN \
25 : mul_##TYPE1##_##TYPE2##_##TYPE3(const TYPE1 *lft, bool incr1, \
26 : const TYPE2 *rgt, bool incr2, \
27 : TYPE3 *restrict dst, TYPE3 max, \
28 : struct canditer *restrict ci1, \
29 : struct canditer *restrict ci2, \
30 : oid candoff1, oid candoff2) \
31 : { \
32 : BUN nils = 0; \
33 : BUN i = 0, j = 0, ncand = ci1->ncand; \
34 : QryCtx *qry_ctx = MT_thread_get_qry_ctx(); \
35 : \
36 : if (ci1->tpe == cand_dense && ci2->tpe == cand_dense) { \
37 : TIMEOUT_LOOP_IDX_DECL(k, ncand, qry_ctx) { \
38 : if (incr1) \
39 : i = canditer_next_dense(ci1) - candoff1; \
40 : if (incr2) \
41 : j = canditer_next_dense(ci2) - candoff2; \
42 : if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
43 : dst[k] = TYPE3##_nil; \
44 : nils++; \
45 : } else { \
46 : MUL##IF##4_WITH_CHECK(lft[i], rgt[j], \
47 : TYPE3, dst[k], \
48 : max, \
49 : TYPE4, \
50 : ON_OVERFLOW(TYPE1, TYPE2, "*")); \
51 : } \
52 : } \
53 : TIMEOUT_CHECK(qry_ctx, TIMEOUT_HANDLER(BUN_NONE, qry_ctx)); \
54 : } else { \
55 : TIMEOUT_LOOP_IDX_DECL(k, ncand, qry_ctx) { \
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 { \
64 : MUL##IF##4_WITH_CHECK(lft[i], rgt[j], \
65 : TYPE3, dst[k], \
66 : max, \
67 : TYPE4, \
68 : ON_OVERFLOW(TYPE1, TYPE2, "*")); \
69 : } \
70 : } \
71 : TIMEOUT_CHECK(qry_ctx, TIMEOUT_HANDLER(BUN_NONE, qry_ctx)); \
72 : } \
73 : return nils; \
74 : }
75 :
76 : #define MUL_3TYPE_enlarge(TYPE1, TYPE2, TYPE3, IF) \
77 : static BUN \
78 : mul_##TYPE1##_##TYPE2##_##TYPE3(const TYPE1 *lft, bool incr1, \
79 : const TYPE2 *rgt, bool incr2, \
80 : TYPE3 *restrict dst, TYPE3 max, \
81 : struct canditer *restrict ci1, \
82 : struct canditer *restrict ci2, \
83 : oid candoff1, oid candoff2) \
84 : { \
85 : BUN nils = 0; \
86 : BUN i = 0, j = 0, ncand = ci1->ncand; \
87 : const bool couldoverflow = (max < (TYPE3) GDK_##TYPE1##_max * (TYPE3) GDK_##TYPE2##_max); \
88 : QryCtx *qry_ctx = MT_thread_get_qry_ctx(); \
89 : \
90 : if (ci1->tpe == cand_dense && ci2->tpe == cand_dense) { \
91 : TIMEOUT_LOOP_IDX_DECL(k, ncand, qry_ctx) { \
92 : if (incr1) \
93 : i = canditer_next_dense(ci1) - candoff1; \
94 : if (incr2) \
95 : j = canditer_next_dense(ci2) - candoff2; \
96 : if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
97 : dst[k] = TYPE3##_nil; \
98 : nils++; \
99 : } else if (couldoverflow) { \
100 : MUL##IF##4_WITH_CHECK(lft[i], rgt[j], \
101 : TYPE3, dst[k], \
102 : max, \
103 : TYPE3, \
104 : ON_OVERFLOW(TYPE1, TYPE2, "*")); \
105 : } else { \
106 : dst[k] = (TYPE3) lft[i] * rgt[j]; \
107 : } \
108 : } \
109 : TIMEOUT_CHECK(qry_ctx, TIMEOUT_HANDLER(BUN_NONE, qry_ctx)); \
110 : } else { \
111 : TIMEOUT_LOOP_IDX_DECL(k, ncand, qry_ctx) { \
112 : if (incr1) \
113 : i = canditer_next(ci1) - candoff1; \
114 : if (incr2) \
115 : j = canditer_next(ci2) - candoff2; \
116 : if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
117 : dst[k] = TYPE3##_nil; \
118 : nils++; \
119 : } else if (couldoverflow) { \
120 : MUL##IF##4_WITH_CHECK(lft[i], rgt[j], \
121 : TYPE3, dst[k], \
122 : max, \
123 : TYPE3, \
124 : ON_OVERFLOW(TYPE1, TYPE2, "*")); \
125 : } else { \
126 : dst[k] = (TYPE3) lft[i] * rgt[j]; \
127 : } \
128 : } \
129 : TIMEOUT_CHECK(qry_ctx, TIMEOUT_HANDLER(BUN_NONE, qry_ctx)); \
130 : } \
131 : return nils; \
132 : }
133 :
134 : #ifdef HAVE_HGE
135 :
136 : #define MUL_2TYPE_lng(TYPE1, TYPE2) MUL_4TYPE(TYPE1, TYPE2, lng, hge, I)
137 :
138 : #define MUL_2TYPE_hge(TYPE1, TYPE2) \
139 : static BUN \
140 : mul_##TYPE1##_##TYPE2##_hge(const TYPE1 *lft, bool incr1, \
141 : const TYPE2 *rgt, bool incr2, \
142 : hge *restrict dst, hge max, \
143 : struct canditer *restrict ci1, \
144 : struct canditer *restrict ci2, \
145 : oid candoff1, oid candoff2) \
146 : { \
147 : BUN nils = 0; \
148 : BUN i = 0, j = 0, ncand = ci1->ncand; \
149 : QryCtx *qry_ctx = MT_thread_get_qry_ctx(); \
150 : \
151 : if (ci1->tpe == cand_dense && ci2->tpe == cand_dense) { \
152 : TIMEOUT_LOOP_IDX_DECL(k, ncand, qry_ctx) { \
153 : if (incr1) \
154 : i = canditer_next_dense(ci1) - candoff1; \
155 : if (incr2) \
156 : j = canditer_next_dense(ci2) - candoff2; \
157 : if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
158 : dst[k] = hge_nil; \
159 : nils++; \
160 : } else { \
161 : HGEMUL_CHECK(lft[i], rgt[j], \
162 : dst[k], \
163 : max, \
164 : ON_OVERFLOW(TYPE1, TYPE2, "*")); \
165 : } \
166 : } \
167 : TIMEOUT_CHECK(qry_ctx, TIMEOUT_HANDLER(BUN_NONE, qry_ctx)); \
168 : } else { \
169 : TIMEOUT_LOOP_IDX_DECL(k, ncand, qry_ctx) { \
170 : if (incr1) \
171 : i = canditer_next(ci1) - candoff1; \
172 : if (incr2) \
173 : j = canditer_next(ci2) - candoff2; \
174 : if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
175 : dst[k] = hge_nil; \
176 : nils++; \
177 : } else { \
178 : HGEMUL_CHECK(lft[i], rgt[j], \
179 : dst[k], \
180 : max, \
181 : ON_OVERFLOW(TYPE1, TYPE2, "*")); \
182 : } \
183 : } \
184 : TIMEOUT_CHECK(qry_ctx, TIMEOUT_HANDLER(BUN_NONE, qry_ctx)); \
185 : } \
186 : return nils; \
187 : }
188 :
189 : #else
190 :
191 : #define MUL_2TYPE_lng(TYPE1, TYPE2) \
192 : static BUN \
193 : mul_##TYPE1##_##TYPE2##_lng(const TYPE1 *lft, bool incr1, \
194 : const TYPE2 *rgt, bool incr2, \
195 : lng *restrict dst, lng max, \
196 : struct canditer *restrict ci1, \
197 : struct canditer *restrict ci2, \
198 : oid candoff1, oid candoff2) \
199 : { \
200 : BUN nils = 0; \
201 : BUN i = 0, j = 0, ncand = ci1->ncand; \
202 : QryCtx *qry_ctx = MT_thread_get_qry_ctx(); \
203 : \
204 : if (ci1->tpe == cand_dense && ci2->tpe == cand_dense) { \
205 : TIMEOUT_LOOP_IDX_DECL(k, ncand, qry_ctx) { \
206 : if (incr1) \
207 : i = canditer_next_dense(ci1) - candoff1; \
208 : if (incr2) \
209 : j = canditer_next_dense(ci2) - candoff2; \
210 : if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
211 : dst[k] = lng_nil; \
212 : nils++; \
213 : } else { \
214 : LNGMUL_CHECK(lft[i], rgt[j], \
215 : dst[k], \
216 : max, \
217 : ON_OVERFLOW(TYPE1, TYPE2, "*")); \
218 : } \
219 : } \
220 : TIMEOUT_CHECK(qry_ctx, TIMEOUT_HANDLER(BUN_NONE, qry_ctx)); \
221 : } else { \
222 : TIMEOUT_LOOP_IDX_DECL(k, ncand, qry_ctx) { \
223 : if (incr1) \
224 : i = canditer_next(ci1) - candoff1; \
225 : if (incr2) \
226 : j = canditer_next(ci2) - candoff2; \
227 : if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
228 : dst[k] = lng_nil; \
229 : nils++; \
230 : } else { \
231 : LNGMUL_CHECK(lft[i], rgt[j], \
232 : dst[k], \
233 : max, \
234 : ON_OVERFLOW(TYPE1, TYPE2, "*")); \
235 : } \
236 : } \
237 : TIMEOUT_CHECK(qry_ctx, TIMEOUT_HANDLER(BUN_NONE, qry_ctx)); \
238 : } \
239 : return nils; \
240 : }
241 :
242 : #endif
243 :
244 : #define MUL_2TYPE_float(TYPE1, TYPE2, TYPE3) \
245 : static BUN \
246 : mul_##TYPE1##_##TYPE2##_##TYPE3(const TYPE1 *lft, bool incr1, \
247 : const TYPE2 *rgt, bool incr2, \
248 : TYPE3 *restrict dst, TYPE3 max, \
249 : struct canditer *restrict ci1, \
250 : struct canditer *restrict ci2, \
251 : oid candoff1, oid candoff2) \
252 : { \
253 : BUN nils = 0; \
254 : BUN i = 0, j = 0, ncand = ci1->ncand; \
255 : QryCtx *qry_ctx = MT_thread_get_qry_ctx(); \
256 : \
257 : if (ci1->tpe == cand_dense && ci2->tpe == cand_dense) { \
258 : TIMEOUT_LOOP_IDX_DECL(k, ncand, qry_ctx) { \
259 : if (incr1) \
260 : i = canditer_next_dense(ci1) - candoff1; \
261 : if (incr2) \
262 : j = canditer_next_dense(ci2) - candoff2; \
263 : if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
264 : dst[k] = TYPE3##_nil; \
265 : nils++; \
266 : } else { \
267 : /* only check for overflow, not for underflow */ \
268 : dst[k] = (TYPE3) (lft[i] * rgt[j]); \
269 : if (isinf(dst[k]) || ABSOLUTE(dst[k]) > max) { \
270 : ON_OVERFLOW(TYPE1, TYPE2, "*"); \
271 : } \
272 : } \
273 : } \
274 : TIMEOUT_CHECK(qry_ctx, TIMEOUT_HANDLER(BUN_NONE, qry_ctx)); \
275 : } else { \
276 : TIMEOUT_LOOP_IDX_DECL(k, ncand, qry_ctx) { \
277 : if (incr1) \
278 : i = canditer_next(ci1) - candoff1; \
279 : if (incr2) \
280 : j = canditer_next(ci2) - candoff2; \
281 : if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
282 : dst[k] = TYPE3##_nil; \
283 : nils++; \
284 : } else { \
285 : /* only check for overflow, not for underflow */ \
286 : dst[k] = (TYPE3) (lft[i] * rgt[j]); \
287 : if (isinf(dst[k]) || ABSOLUTE(dst[k]) > max) { \
288 : ON_OVERFLOW(TYPE1, TYPE2, "*"); \
289 : } \
290 : } \
291 : } \
292 : TIMEOUT_CHECK(qry_ctx, TIMEOUT_HANDLER(BUN_NONE, qry_ctx)); \
293 : } \
294 : return nils; \
295 : }
296 :
297 : #define MUL_INT_FLT_INT(TYPE1, TYPE2, TYPE3) \
298 : static BUN \
299 : mul_##TYPE1##_##TYPE2##_##TYPE3( \
300 : const TYPE1 *lft, bool incr1, const TYPE2 *rgt, bool incr2, \
301 : TYPE3 *restrict dst, TYPE3 max, \
302 : struct canditer *restrict ci1, struct canditer *restrict ci2, \
303 : oid candoff1, oid candoff2) \
304 : { \
305 : BUN nils = 0; \
306 : BUN i = 0, j = 0, ncand = ci1->ncand; \
307 : QryCtx *qry_ctx = MT_thread_get_qry_ctx(); \
308 : \
309 : if (ci1->tpe == cand_dense && ci2->tpe == cand_dense) { \
310 : TIMEOUT_LOOP_IDX_DECL(k, ncand, qry_ctx) { \
311 : if (incr1) \
312 : i = canditer_next_dense(ci1) - candoff1; \
313 : if (incr2) \
314 : j = canditer_next_dense(ci2) - candoff2; \
315 : if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
316 : dst[k] = TYPE3##_nil; \
317 : nils++; \
318 : } else if (lft[i] == 0 || rgt[j] == 0) { \
319 : dst[k] = 0; \
320 : } else if (max / fabs(rgt[j]) < abs##TYPE1(lft[i])) { \
321 : ON_OVERFLOW(TYPE1, TYPE2, "*"); \
322 : } else { \
323 : ldouble m = lft[i] * (ldouble) rgt[j]; \
324 : dst[k] = (TYPE3) rounddbl(m); \
325 : } \
326 : } \
327 : TIMEOUT_CHECK(qry_ctx, TIMEOUT_HANDLER(BUN_NONE, qry_ctx)); \
328 : } else { \
329 : TIMEOUT_LOOP_IDX_DECL(k, ncand, qry_ctx) { \
330 : if (incr1) \
331 : i = canditer_next(ci1) - candoff1; \
332 : if (incr2) \
333 : j = canditer_next(ci2) - candoff2; \
334 : if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
335 : dst[k] = TYPE3##_nil; \
336 : nils++; \
337 : } else if (lft[i] == 0 || rgt[j] == 0) { \
338 : dst[k] = 0; \
339 : } else if (max / fabs(rgt[j]) < abs##TYPE1(lft[i])) { \
340 : ON_OVERFLOW(TYPE1, TYPE2, "*"); \
341 : } else { \
342 : ldouble m = lft[i] * (ldouble) rgt[j]; \
343 : dst[k] = (TYPE3) rounddbl(m); \
344 : } \
345 : } \
346 : TIMEOUT_CHECK(qry_ctx, TIMEOUT_HANDLER(BUN_NONE, qry_ctx)); \
347 : } \
348 : return nils; \
349 : }
350 :
351 0 : MUL_INT_FLT_INT(bte, flt, bte)
352 0 : MUL_INT_FLT_INT(bte, flt, sht)
353 0 : MUL_INT_FLT_INT(bte, flt, int)
354 0 : MUL_INT_FLT_INT(bte, flt, lng)
355 0 : MUL_INT_FLT_INT(sht, flt, bte)
356 0 : MUL_INT_FLT_INT(sht, flt, sht)
357 0 : MUL_INT_FLT_INT(sht, flt, int)
358 0 : MUL_INT_FLT_INT(sht, flt, lng)
359 0 : MUL_INT_FLT_INT(int, flt, bte)
360 0 : MUL_INT_FLT_INT(int, flt, sht)
361 4 : MUL_INT_FLT_INT(int, flt, int)
362 4 : MUL_INT_FLT_INT(int, flt, lng)
363 0 : MUL_INT_FLT_INT(lng, flt, bte)
364 0 : MUL_INT_FLT_INT(lng, flt, sht)
365 0 : MUL_INT_FLT_INT(lng, flt, int)
366 8 : MUL_INT_FLT_INT(lng, flt, lng)
367 : #ifdef HAVE_HGE
368 0 : MUL_INT_FLT_INT(bte, flt, hge)
369 0 : MUL_INT_FLT_INT(sht, flt, hge)
370 0 : MUL_INT_FLT_INT(int, flt, hge)
371 0 : MUL_INT_FLT_INT(lng, flt, hge)
372 0 : MUL_INT_FLT_INT(hge, flt, bte)
373 0 : MUL_INT_FLT_INT(hge, flt, sht)
374 0 : MUL_INT_FLT_INT(hge, flt, int)
375 0 : MUL_INT_FLT_INT(hge, flt, lng)
376 0 : MUL_INT_FLT_INT(hge, flt, hge)
377 : #endif
378 :
379 0 : MUL_INT_FLT_INT(bte, dbl, bte)
380 0 : MUL_INT_FLT_INT(bte, dbl, sht)
381 0 : MUL_INT_FLT_INT(bte, dbl, int)
382 0 : MUL_INT_FLT_INT(bte, dbl, lng)
383 0 : MUL_INT_FLT_INT(sht, dbl, bte)
384 0 : MUL_INT_FLT_INT(sht, dbl, sht)
385 0 : MUL_INT_FLT_INT(sht, dbl, int)
386 0 : MUL_INT_FLT_INT(sht, dbl, lng)
387 0 : MUL_INT_FLT_INT(int, dbl, bte)
388 0 : MUL_INT_FLT_INT(int, dbl, sht)
389 32 : MUL_INT_FLT_INT(int, dbl, int)
390 0 : MUL_INT_FLT_INT(int, dbl, lng)
391 0 : MUL_INT_FLT_INT(lng, dbl, bte)
392 0 : MUL_INT_FLT_INT(lng, dbl, sht)
393 0 : MUL_INT_FLT_INT(lng, dbl, int)
394 16 : MUL_INT_FLT_INT(lng, dbl, lng)
395 : #ifdef HAVE_HGE
396 0 : MUL_INT_FLT_INT(bte, dbl, hge)
397 0 : MUL_INT_FLT_INT(sht, dbl, hge)
398 0 : MUL_INT_FLT_INT(int, dbl, hge)
399 0 : MUL_INT_FLT_INT(lng, dbl, hge)
400 0 : MUL_INT_FLT_INT(hge, dbl, bte)
401 0 : MUL_INT_FLT_INT(hge, dbl, sht)
402 0 : MUL_INT_FLT_INT(hge, dbl, int)
403 0 : MUL_INT_FLT_INT(hge, dbl, lng)
404 0 : MUL_INT_FLT_INT(hge, dbl, hge)
405 : #endif
406 :
407 776 : MUL_4TYPE(bte, bte, bte, sht, I)
408 49753 : MUL_3TYPE_enlarge(bte, bte, sht, I)
409 0 : MUL_3TYPE_enlarge(bte, bte, int, I)
410 0 : MUL_3TYPE_enlarge(bte, bte, lng, I)
411 : #ifdef HAVE_HGE
412 0 : MUL_3TYPE_enlarge(bte, bte, hge, I)
413 : #endif
414 0 : MUL_3TYPE_enlarge(bte, bte, flt, F)
415 0 : MUL_3TYPE_enlarge(bte, bte, dbl, F)
416 4 : MUL_4TYPE(bte, sht, sht, int, I)
417 12 : MUL_3TYPE_enlarge(bte, sht, int, I)
418 0 : MUL_3TYPE_enlarge(bte, sht, lng, I)
419 : #ifdef HAVE_HGE
420 0 : MUL_3TYPE_enlarge(bte, sht, hge, I)
421 : #endif
422 0 : MUL_3TYPE_enlarge(bte, sht, flt, F)
423 0 : MUL_3TYPE_enlarge(bte, sht, dbl, F)
424 4000546 : MUL_4TYPE(bte, int, int, lng, I)
425 36115 : MUL_3TYPE_enlarge(bte, int, lng, I)
426 : #ifdef HAVE_HGE
427 0 : MUL_3TYPE_enlarge(bte, int, hge, I)
428 : #endif
429 0 : MUL_3TYPE_enlarge(bte, int, flt, F)
430 0 : MUL_3TYPE_enlarge(bte, int, dbl, F)
431 20 : MUL_2TYPE_lng(bte, lng)
432 : #ifdef HAVE_HGE
433 108 : MUL_3TYPE_enlarge(bte, lng, hge, I)
434 : #endif
435 0 : MUL_3TYPE_enlarge(bte, lng, flt, F)
436 0 : MUL_3TYPE_enlarge(bte, lng, dbl, F)
437 : #ifdef HAVE_HGE
438 60 : MUL_2TYPE_hge(bte, hge)
439 0 : MUL_3TYPE_enlarge(bte, hge, flt, F)
440 0 : MUL_3TYPE_enlarge(bte, hge, dbl, F)
441 : #endif
442 0 : MUL_2TYPE_float(bte, flt, flt)
443 0 : MUL_3TYPE_enlarge(bte, flt, dbl, F)
444 0 : MUL_2TYPE_float(bte, dbl, dbl)
445 144 : MUL_4TYPE(sht, bte, sht, int, I)
446 3982356 : MUL_3TYPE_enlarge(sht, bte, int, I)
447 3898668 : MUL_3TYPE_enlarge(sht, bte, lng, I)
448 : #ifdef HAVE_HGE
449 0 : MUL_3TYPE_enlarge(sht, bte, hge, I)
450 : #endif
451 0 : MUL_3TYPE_enlarge(sht, bte, flt, F)
452 0 : MUL_3TYPE_enlarge(sht, bte, dbl, F)
453 0 : MUL_4TYPE(sht, sht, sht, int, I)
454 32 : MUL_3TYPE_enlarge(sht, sht, int, I)
455 0 : MUL_3TYPE_enlarge(sht, sht, lng, I)
456 : #ifdef HAVE_HGE
457 0 : MUL_3TYPE_enlarge(sht, sht, hge, I)
458 : #endif
459 0 : MUL_3TYPE_enlarge(sht, sht, flt, F)
460 0 : MUL_3TYPE_enlarge(sht, sht, dbl, F)
461 4 : MUL_4TYPE(sht, int, int, lng, I)
462 28 : MUL_3TYPE_enlarge(sht, int, lng, I)
463 : #ifdef HAVE_HGE
464 0 : MUL_3TYPE_enlarge(sht, int, hge, I)
465 : #endif
466 0 : MUL_3TYPE_enlarge(sht, int, flt, F)
467 0 : MUL_3TYPE_enlarge(sht, int, dbl, F)
468 0 : MUL_2TYPE_lng(sht, lng)
469 : #ifdef HAVE_HGE
470 4 : MUL_3TYPE_enlarge(sht, lng, hge, I)
471 : #endif
472 0 : MUL_3TYPE_enlarge(sht, lng, flt, F)
473 0 : MUL_3TYPE_enlarge(sht, lng, dbl, F)
474 : #ifdef HAVE_HGE
475 12 : MUL_2TYPE_hge(sht, hge)
476 0 : MUL_3TYPE_enlarge(sht, hge, flt, F)
477 0 : MUL_3TYPE_enlarge(sht, hge, dbl, F)
478 : #endif
479 0 : MUL_2TYPE_float(sht, flt, flt)
480 0 : MUL_3TYPE_enlarge(sht, flt, dbl, F)
481 0 : MUL_2TYPE_float(sht, dbl, dbl)
482 234844 : MUL_4TYPE(int, bte, int, lng, I)
483 6000204 : MUL_3TYPE_enlarge(int, bte, lng, I)
484 : #ifdef HAVE_HGE
485 0 : MUL_3TYPE_enlarge(int, bte, hge, I)
486 : #endif
487 0 : MUL_3TYPE_enlarge(int, bte, flt, F)
488 0 : MUL_3TYPE_enlarge(int, bte, dbl, F)
489 540444 : MUL_4TYPE(int, sht, int, lng, I)
490 24 : MUL_3TYPE_enlarge(int, sht, lng, I)
491 : #ifdef HAVE_HGE
492 0 : MUL_3TYPE_enlarge(int, sht, hge, I)
493 : #endif
494 0 : MUL_3TYPE_enlarge(int, sht, flt, F)
495 0 : MUL_3TYPE_enlarge(int, sht, dbl, F)
496 956 : MUL_4TYPE(int, int, int, lng, I)
497 18816 : MUL_3TYPE_enlarge(int, int, lng, I)
498 : #ifdef HAVE_HGE
499 0 : MUL_3TYPE_enlarge(int, int, hge, I)
500 : #endif
501 0 : MUL_3TYPE_enlarge(int, int, flt, F)
502 0 : MUL_3TYPE_enlarge(int, int, dbl, F)
503 56 : MUL_2TYPE_lng(int, lng)
504 : #ifdef HAVE_HGE
505 20880114 : MUL_3TYPE_enlarge(int, lng, hge, I)
506 : #endif
507 0 : MUL_3TYPE_enlarge(int, lng, flt, F)
508 0 : MUL_3TYPE_enlarge(int, lng, dbl, F)
509 : #ifdef HAVE_HGE
510 181732 : MUL_2TYPE_hge(int, hge)
511 0 : MUL_3TYPE_enlarge(int, hge, flt, F)
512 0 : MUL_3TYPE_enlarge(int, hge, dbl, F)
513 : #endif
514 0 : MUL_2TYPE_float(int, flt, flt)
515 0 : MUL_3TYPE_enlarge(int, flt, dbl, F)
516 0 : MUL_2TYPE_float(int, dbl, dbl)
517 2004290 : MUL_2TYPE_lng(lng, bte)
518 : #ifdef HAVE_HGE
519 2043714 : MUL_3TYPE_enlarge(lng, bte, hge, I)
520 : #endif
521 0 : MUL_3TYPE_enlarge(lng, bte, flt, F)
522 0 : MUL_3TYPE_enlarge(lng, bte, dbl, F)
523 16 : MUL_2TYPE_lng(lng, sht)
524 : #ifdef HAVE_HGE
525 0 : MUL_3TYPE_enlarge(lng, sht, hge, I)
526 : #endif
527 0 : MUL_3TYPE_enlarge(lng, sht, flt, F)
528 0 : MUL_3TYPE_enlarge(lng, sht, dbl, F)
529 196 : MUL_2TYPE_lng(lng, int)
530 : #ifdef HAVE_HGE
531 5147959 : MUL_3TYPE_enlarge(lng, int, hge, I)
532 : #endif
533 0 : MUL_3TYPE_enlarge(lng, int, flt, F)
534 0 : MUL_3TYPE_enlarge(lng, int, dbl, F)
535 178 : MUL_2TYPE_lng(lng, lng)
536 : #ifdef HAVE_HGE
537 74307 : MUL_3TYPE_enlarge(lng, lng, hge, I)
538 : #endif
539 0 : MUL_3TYPE_enlarge(lng, lng, flt, F)
540 0 : MUL_3TYPE_enlarge(lng, lng, dbl, F)
541 : #ifdef HAVE_HGE
542 7881 : MUL_2TYPE_hge(lng, hge)
543 0 : MUL_3TYPE_enlarge(lng, hge, flt, F)
544 0 : MUL_3TYPE_enlarge(lng, hge, dbl, F)
545 : #endif
546 0 : MUL_2TYPE_float(lng, flt, flt)
547 0 : MUL_3TYPE_enlarge(lng, flt, dbl, F)
548 0 : MUL_2TYPE_float(lng, dbl, dbl)
549 : #ifdef HAVE_HGE
550 3844084 : MUL_2TYPE_hge(hge, bte)
551 0 : MUL_3TYPE_enlarge(hge, bte, flt, F)
552 0 : MUL_3TYPE_enlarge(hge, bte, dbl, F)
553 3136 : MUL_2TYPE_hge(hge, sht)
554 0 : MUL_3TYPE_enlarge(hge, sht, flt, F)
555 0 : MUL_3TYPE_enlarge(hge, sht, dbl, F)
556 10296 : MUL_2TYPE_hge(hge, int)
557 0 : MUL_3TYPE_enlarge(hge, int, flt, F)
558 0 : MUL_3TYPE_enlarge(hge, int, dbl, F)
559 14935 : MUL_2TYPE_hge(hge, lng)
560 0 : MUL_3TYPE_enlarge(hge, lng, flt, F)
561 0 : MUL_3TYPE_enlarge(hge, lng, dbl, F)
562 40 : MUL_2TYPE_hge(hge, hge)
563 0 : MUL_3TYPE_enlarge(hge, hge, flt, F)
564 0 : MUL_3TYPE_enlarge(hge, hge, dbl, F)
565 0 : MUL_2TYPE_float(hge, flt, flt)
566 0 : MUL_3TYPE_enlarge(hge, flt, dbl, F)
567 0 : MUL_2TYPE_float(hge, dbl, dbl)
568 : #endif
569 0 : MUL_2TYPE_float(flt, bte, flt)
570 0 : MUL_3TYPE_enlarge(flt, bte, dbl, F)
571 0 : MUL_2TYPE_float(flt, sht, flt)
572 0 : MUL_3TYPE_enlarge(flt, sht, dbl, F)
573 0 : MUL_2TYPE_float(flt, int, flt)
574 0 : MUL_3TYPE_enlarge(flt, int, dbl, F)
575 0 : MUL_2TYPE_float(flt, lng, flt)
576 0 : MUL_3TYPE_enlarge(flt, lng, dbl, F)
577 : #ifdef HAVE_HGE
578 0 : MUL_2TYPE_float(flt, hge, flt)
579 0 : MUL_3TYPE_enlarge(flt, hge, dbl, F)
580 : #endif
581 75 : MUL_2TYPE_float(flt, flt, flt)
582 0 : MUL_3TYPE_enlarge(flt, flt, dbl, F)
583 0 : MUL_2TYPE_float(flt, dbl, dbl)
584 0 : MUL_2TYPE_float(dbl, bte, dbl)
585 0 : MUL_2TYPE_float(dbl, sht, dbl)
586 0 : MUL_2TYPE_float(dbl, int, dbl)
587 0 : MUL_2TYPE_float(dbl, lng, dbl)
588 : #ifdef HAVE_HGE
589 0 : MUL_2TYPE_float(dbl, hge, dbl)
590 : #endif
591 0 : MUL_2TYPE_float(dbl, flt, dbl)
592 809412 : MUL_2TYPE_float(dbl, dbl, dbl)
593 :
594 : static BUN
595 39336 : mul_typeswitchloop(const void *lft, int tp1, bool incr1,
596 : const void *rgt, int tp2, bool incr2,
597 : void *restrict dst, int tp,
598 : struct canditer *restrict ci1,
599 : struct canditer *restrict ci2,
600 : oid candoff1, oid candoff2,
601 : const char *func)
602 : {
603 39336 : BUN nils;
604 :
605 39336 : tp1 = ATOMbasetype(tp1);
606 39336 : tp2 = ATOMbasetype(tp2);
607 39336 : tp = ATOMbasetype(tp);
608 39336 : switch (tp1) {
609 512 : case TYPE_bte:
610 512 : switch (tp2) {
611 399 : case TYPE_bte:
612 399 : switch (tp) {
613 283 : case TYPE_bte:
614 283 : nils = mul_bte_bte_bte(lft, incr1, rgt, incr2,
615 : dst, GDK_bte_max,
616 : ci1, ci2, candoff1, candoff2);
617 283 : break;
618 116 : case TYPE_sht:
619 116 : nils = mul_bte_bte_sht(lft, incr1, rgt, incr2,
620 : dst, GDK_sht_max,
621 : ci1, ci2, candoff1, candoff2);
622 116 : break;
623 0 : case TYPE_int:
624 0 : nils = mul_bte_bte_int(lft, incr1, rgt, incr2,
625 : dst, GDK_int_max,
626 : ci1, ci2, candoff1, candoff2);
627 0 : break;
628 0 : case TYPE_lng:
629 0 : nils = mul_bte_bte_lng(lft, incr1, rgt, incr2,
630 : dst, GDK_lng_max,
631 : ci1, ci2, candoff1, candoff2);
632 0 : break;
633 : #ifdef HAVE_HGE
634 0 : case TYPE_hge:
635 0 : nils = mul_bte_bte_hge(lft, incr1, rgt, incr2,
636 : dst, GDK_hge_max,
637 : ci1, ci2, candoff1, candoff2);
638 0 : break;
639 : #endif
640 0 : case TYPE_flt:
641 0 : nils = mul_bte_bte_flt(lft, incr1, rgt, incr2,
642 : dst, GDK_flt_max,
643 : ci1, ci2, candoff1, candoff2);
644 0 : break;
645 0 : case TYPE_dbl:
646 0 : nils = mul_bte_bte_dbl(lft, incr1, rgt, incr2,
647 : dst, GDK_dbl_max,
648 : ci1, ci2, candoff1, candoff2);
649 0 : break;
650 0 : default:
651 0 : goto unsupported;
652 : }
653 : break;
654 4 : case TYPE_sht:
655 4 : switch (tp) {
656 1 : case TYPE_sht:
657 1 : nils = mul_bte_sht_sht(lft, incr1, rgt, incr2,
658 : dst, GDK_sht_max,
659 : ci1, ci2, candoff1, candoff2);
660 1 : break;
661 3 : case TYPE_int:
662 3 : nils = mul_bte_sht_int(lft, incr1, rgt, incr2,
663 : dst, GDK_int_max,
664 : ci1, ci2, candoff1, candoff2);
665 3 : break;
666 0 : case TYPE_lng:
667 0 : nils = mul_bte_sht_lng(lft, incr1, rgt, incr2,
668 : dst, GDK_lng_max,
669 : ci1, ci2, candoff1, candoff2);
670 0 : break;
671 : #ifdef HAVE_HGE
672 0 : case TYPE_hge:
673 0 : nils = mul_bte_sht_hge(lft, incr1, rgt, incr2,
674 : dst, GDK_hge_max,
675 : ci1, ci2, candoff1, candoff2);
676 0 : break;
677 : #endif
678 0 : case TYPE_flt:
679 0 : nils = mul_bte_sht_flt(lft, incr1, rgt, incr2,
680 : dst, GDK_flt_max,
681 : ci1, ci2, candoff1, candoff2);
682 0 : break;
683 0 : case TYPE_dbl:
684 0 : nils = mul_bte_sht_dbl(lft, incr1, rgt, incr2,
685 : dst, GDK_dbl_max,
686 : ci1, ci2, candoff1, candoff2);
687 0 : break;
688 0 : default:
689 0 : goto unsupported;
690 : }
691 : break;
692 75 : case TYPE_int:
693 75 : switch (tp) {
694 57 : case TYPE_int:
695 57 : nils = mul_bte_int_int(lft, incr1, rgt, incr2,
696 : dst, GDK_int_max,
697 : ci1, ci2, candoff1, candoff2);
698 57 : break;
699 18 : case TYPE_lng:
700 18 : nils = mul_bte_int_lng(lft, incr1, rgt, incr2,
701 : dst, GDK_lng_max,
702 : ci1, ci2, candoff1, candoff2);
703 18 : break;
704 : #ifdef HAVE_HGE
705 0 : case TYPE_hge:
706 0 : nils = mul_bte_int_hge(lft, incr1, rgt, incr2,
707 : dst, GDK_hge_max,
708 : ci1, ci2, candoff1, candoff2);
709 0 : break;
710 : #endif
711 0 : case TYPE_flt:
712 0 : nils = mul_bte_int_flt(lft, incr1, rgt, incr2,
713 : dst, GDK_flt_max,
714 : ci1, ci2, candoff1, candoff2);
715 0 : break;
716 0 : case TYPE_dbl:
717 0 : nils = mul_bte_int_dbl(lft, incr1, rgt, incr2,
718 : dst, GDK_dbl_max,
719 : ci1, ci2, candoff1, candoff2);
720 0 : break;
721 0 : default:
722 0 : goto unsupported;
723 : }
724 : break;
725 30 : case TYPE_lng:
726 30 : switch (tp) {
727 3 : case TYPE_lng:
728 3 : nils = mul_bte_lng_lng(lft, incr1, rgt, incr2,
729 : dst, GDK_lng_max,
730 : ci1, ci2, candoff1, candoff2);
731 3 : break;
732 : #ifdef HAVE_HGE
733 27 : case TYPE_hge:
734 27 : nils = mul_bte_lng_hge(lft, incr1, rgt, incr2,
735 : dst, GDK_hge_max,
736 : ci1, ci2, candoff1, candoff2);
737 27 : break;
738 : #endif
739 0 : case TYPE_flt:
740 0 : nils = mul_bte_lng_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 = mul_bte_lng_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 : #ifdef HAVE_HGE
754 4 : case TYPE_hge:
755 4 : switch (tp) {
756 4 : case TYPE_hge:
757 4 : nils = mul_bte_hge_hge(lft, incr1, rgt, incr2,
758 : dst, GDK_hge_max,
759 : ci1, ci2, candoff1, candoff2);
760 4 : break;
761 0 : case TYPE_flt:
762 0 : nils = mul_bte_hge_flt(lft, incr1, rgt, incr2,
763 : dst, GDK_flt_max,
764 : ci1, ci2, candoff1, candoff2);
765 0 : break;
766 0 : case TYPE_dbl:
767 0 : nils = mul_bte_hge_dbl(lft, incr1, rgt, incr2,
768 : dst, GDK_dbl_max,
769 : ci1, ci2, candoff1, candoff2);
770 0 : break;
771 0 : default:
772 0 : goto unsupported;
773 : }
774 : break;
775 : #endif
776 0 : case TYPE_flt:
777 0 : switch (tp) {
778 0 : case TYPE_bte:
779 0 : nils = mul_bte_flt_bte(lft, incr1, rgt, incr2,
780 : dst, GDK_bte_max,
781 : ci1, ci2,
782 : candoff1, candoff2);
783 0 : break;
784 0 : case TYPE_sht:
785 0 : nils = mul_bte_flt_sht(lft, incr1, rgt, incr2,
786 : dst, GDK_sht_max,
787 : ci1, ci2,
788 : candoff1, candoff2);
789 0 : break;
790 0 : case TYPE_int:
791 0 : nils = mul_bte_flt_int(lft, incr1, rgt, incr2,
792 : dst, GDK_int_max,
793 : ci1, ci2,
794 : candoff1, candoff2);
795 0 : break;
796 0 : case TYPE_lng:
797 0 : nils = mul_bte_flt_lng(lft, incr1, rgt, incr2,
798 : dst, GDK_lng_max,
799 : ci1, ci2,
800 : candoff1, candoff2);
801 0 : break;
802 : #ifdef HAVE_HGE
803 0 : case TYPE_hge:
804 0 : nils = mul_bte_flt_hge(lft, incr1, rgt, incr2,
805 : dst, GDK_hge_max,
806 : ci1, ci2,
807 : candoff1, candoff2);
808 0 : break;
809 : #endif
810 0 : case TYPE_flt:
811 0 : nils = mul_bte_flt_flt(lft, incr1, rgt, incr2,
812 : dst, GDK_flt_max,
813 : ci1, ci2, candoff1, candoff2);
814 0 : break;
815 0 : case TYPE_dbl:
816 0 : nils = mul_bte_flt_dbl(lft, incr1, rgt, incr2,
817 : dst, GDK_dbl_max,
818 : ci1, ci2, candoff1, candoff2);
819 0 : break;
820 0 : default:
821 0 : goto unsupported;
822 : }
823 : break;
824 0 : case TYPE_dbl:
825 0 : switch (tp) {
826 0 : case TYPE_bte:
827 0 : nils = mul_bte_dbl_bte(lft, incr1, rgt, incr2,
828 : dst, GDK_bte_max,
829 : ci1, ci2,
830 : candoff1, candoff2);
831 0 : break;
832 0 : case TYPE_sht:
833 0 : nils = mul_bte_dbl_sht(lft, incr1, rgt, incr2,
834 : dst, GDK_sht_max,
835 : ci1, ci2,
836 : candoff1, candoff2);
837 0 : break;
838 0 : case TYPE_int:
839 0 : nils = mul_bte_dbl_int(lft, incr1, rgt, incr2,
840 : dst, GDK_int_max,
841 : ci1, ci2,
842 : candoff1, candoff2);
843 0 : break;
844 0 : case TYPE_lng:
845 0 : nils = mul_bte_dbl_lng(lft, incr1, rgt, incr2,
846 : dst, GDK_lng_max,
847 : ci1, ci2,
848 : candoff1, candoff2);
849 0 : break;
850 : #ifdef HAVE_HGE
851 0 : case TYPE_hge:
852 0 : nils = mul_bte_dbl_hge(lft, incr1, rgt, incr2,
853 : dst, GDK_hge_max,
854 : ci1, ci2,
855 : candoff1, candoff2);
856 0 : break;
857 : #endif
858 0 : case TYPE_dbl:
859 0 : nils = mul_bte_dbl_dbl(lft, incr1, rgt, incr2,
860 : dst, GDK_dbl_max,
861 : ci1, ci2, candoff1, candoff2);
862 0 : break;
863 0 : default:
864 0 : goto unsupported;
865 : }
866 : break;
867 0 : default:
868 0 : goto unsupported;
869 : }
870 : break;
871 154 : case TYPE_sht:
872 154 : switch (tp2) {
873 136 : case TYPE_bte:
874 136 : switch (tp) {
875 36 : case TYPE_sht:
876 36 : nils = mul_sht_bte_sht(lft, incr1, rgt, incr2,
877 : dst, GDK_sht_max,
878 : ci1, ci2, candoff1, candoff2);
879 36 : break;
880 59 : case TYPE_int:
881 59 : nils = mul_sht_bte_int(lft, incr1, rgt, incr2,
882 : dst, GDK_int_max,
883 : ci1, ci2, candoff1, candoff2);
884 59 : break;
885 41 : case TYPE_lng:
886 41 : nils = mul_sht_bte_lng(lft, incr1, rgt, incr2,
887 : dst, GDK_lng_max,
888 : ci1, ci2, candoff1, candoff2);
889 41 : break;
890 : #ifdef HAVE_HGE
891 0 : case TYPE_hge:
892 0 : nils = mul_sht_bte_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 = mul_sht_bte_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 = mul_sht_bte_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 7 : case TYPE_sht:
912 7 : switch (tp) {
913 0 : case TYPE_sht:
914 0 : nils = mul_sht_sht_sht(lft, incr1, rgt, incr2,
915 : dst, GDK_sht_max,
916 : ci1, ci2, candoff1, candoff2);
917 0 : break;
918 7 : case TYPE_int:
919 7 : nils = mul_sht_sht_int(lft, incr1, rgt, incr2,
920 : dst, GDK_int_max,
921 : ci1, ci2, candoff1, candoff2);
922 7 : break;
923 0 : case TYPE_lng:
924 0 : nils = mul_sht_sht_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 = mul_sht_sht_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 = mul_sht_sht_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 = mul_sht_sht_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 7 : case TYPE_int:
950 7 : switch (tp) {
951 1 : case TYPE_int:
952 1 : nils = mul_sht_int_int(lft, incr1, rgt, incr2,
953 : dst, GDK_int_max,
954 : ci1, ci2, candoff1, candoff2);
955 1 : break;
956 6 : case TYPE_lng:
957 6 : nils = mul_sht_int_lng(lft, incr1, rgt, incr2,
958 : dst, GDK_lng_max,
959 : ci1, ci2, candoff1, candoff2);
960 6 : break;
961 : #ifdef HAVE_HGE
962 0 : case TYPE_hge:
963 0 : nils = mul_sht_int_hge(lft, incr1, rgt, incr2,
964 : dst, GDK_hge_max,
965 : ci1, ci2, candoff1, candoff2);
966 0 : break;
967 : #endif
968 0 : case TYPE_flt:
969 0 : nils = mul_sht_int_flt(lft, incr1, rgt, incr2,
970 : dst, GDK_flt_max,
971 : ci1, ci2, candoff1, candoff2);
972 0 : break;
973 0 : case TYPE_dbl:
974 0 : nils = mul_sht_int_dbl(lft, incr1, rgt, incr2,
975 : dst, GDK_dbl_max,
976 : ci1, ci2, candoff1, candoff2);
977 0 : break;
978 0 : default:
979 0 : goto unsupported;
980 : }
981 : break;
982 1 : case TYPE_lng:
983 1 : switch (tp) {
984 0 : case TYPE_lng:
985 0 : nils = mul_sht_lng_lng(lft, incr1, rgt, incr2,
986 : dst, GDK_lng_max,
987 : ci1, ci2, candoff1, candoff2);
988 0 : break;
989 : #ifdef HAVE_HGE
990 1 : case TYPE_hge:
991 1 : nils = mul_sht_lng_hge(lft, incr1, rgt, incr2,
992 : dst, GDK_hge_max,
993 : ci1, ci2, candoff1, candoff2);
994 1 : break;
995 : #endif
996 0 : case TYPE_flt:
997 0 : nils = mul_sht_lng_flt(lft, incr1, rgt, incr2,
998 : dst, GDK_flt_max,
999 : ci1, ci2, candoff1, candoff2);
1000 0 : break;
1001 0 : case TYPE_dbl:
1002 0 : nils = mul_sht_lng_dbl(lft, incr1, rgt, incr2,
1003 : dst, GDK_dbl_max,
1004 : ci1, ci2, candoff1, candoff2);
1005 0 : break;
1006 0 : default:
1007 0 : goto unsupported;
1008 : }
1009 : break;
1010 : #ifdef HAVE_HGE
1011 3 : case TYPE_hge:
1012 3 : switch (tp) {
1013 3 : case TYPE_hge:
1014 3 : nils = mul_sht_hge_hge(lft, incr1, rgt, incr2,
1015 : dst, GDK_hge_max,
1016 : ci1, ci2, candoff1, candoff2);
1017 3 : break;
1018 0 : case TYPE_flt:
1019 0 : nils = mul_sht_hge_flt(lft, incr1, rgt, incr2,
1020 : dst, GDK_flt_max,
1021 : ci1, ci2, candoff1, candoff2);
1022 0 : break;
1023 0 : case TYPE_dbl:
1024 0 : nils = mul_sht_hge_dbl(lft, incr1, rgt, incr2,
1025 : dst, GDK_dbl_max,
1026 : ci1, ci2, candoff1, candoff2);
1027 0 : break;
1028 0 : default:
1029 0 : goto unsupported;
1030 : }
1031 : break;
1032 : #endif
1033 0 : case TYPE_flt:
1034 0 : switch (tp) {
1035 0 : case TYPE_bte:
1036 0 : nils = mul_sht_flt_bte(lft, incr1, rgt, incr2,
1037 : dst, GDK_bte_max,
1038 : ci1, ci2,
1039 : candoff1, candoff2);
1040 0 : break;
1041 0 : case TYPE_sht:
1042 0 : nils = mul_sht_flt_sht(lft, incr1, rgt, incr2,
1043 : dst, GDK_sht_max,
1044 : ci1, ci2,
1045 : candoff1, candoff2);
1046 0 : break;
1047 0 : case TYPE_int:
1048 0 : nils = mul_sht_flt_int(lft, incr1, rgt, incr2,
1049 : dst, GDK_int_max,
1050 : ci1, ci2,
1051 : candoff1, candoff2);
1052 0 : break;
1053 0 : case TYPE_lng:
1054 0 : nils = mul_sht_flt_lng(lft, incr1, rgt, incr2,
1055 : dst, GDK_lng_max,
1056 : ci1, ci2,
1057 : candoff1, candoff2);
1058 0 : break;
1059 : #ifdef HAVE_HGE
1060 0 : case TYPE_hge:
1061 0 : nils = mul_sht_flt_hge(lft, incr1, rgt, incr2,
1062 : dst, GDK_hge_max,
1063 : ci1, ci2,
1064 : candoff1, candoff2);
1065 0 : break;
1066 : #endif
1067 0 : case TYPE_flt:
1068 0 : nils = mul_sht_flt_flt(lft, incr1, rgt, incr2,
1069 : dst, GDK_flt_max,
1070 : ci1, ci2, candoff1, candoff2);
1071 0 : break;
1072 0 : case TYPE_dbl:
1073 0 : nils = mul_sht_flt_dbl(lft, incr1, rgt, incr2,
1074 : dst, GDK_dbl_max,
1075 : ci1, ci2, candoff1, candoff2);
1076 0 : break;
1077 0 : default:
1078 0 : goto unsupported;
1079 : }
1080 : break;
1081 0 : case TYPE_dbl:
1082 0 : switch (tp) {
1083 0 : case TYPE_bte:
1084 0 : nils = mul_sht_dbl_bte(lft, incr1, rgt, incr2,
1085 : dst, GDK_bte_max,
1086 : ci1, ci2,
1087 : candoff1, candoff2);
1088 0 : break;
1089 0 : case TYPE_sht:
1090 0 : nils = mul_sht_dbl_sht(lft, incr1, rgt, incr2,
1091 : dst, GDK_sht_max,
1092 : ci1, ci2,
1093 : candoff1, candoff2);
1094 0 : break;
1095 0 : case TYPE_int:
1096 0 : nils = mul_sht_dbl_int(lft, incr1, rgt, incr2,
1097 : dst, GDK_int_max,
1098 : ci1, ci2,
1099 : candoff1, candoff2);
1100 0 : break;
1101 0 : case TYPE_lng:
1102 0 : nils = mul_sht_dbl_lng(lft, incr1, rgt, incr2,
1103 : dst, GDK_lng_max,
1104 : ci1, ci2,
1105 : candoff1, candoff2);
1106 0 : break;
1107 : #ifdef HAVE_HGE
1108 0 : case TYPE_hge:
1109 0 : nils = mul_sht_dbl_hge(lft, incr1, rgt, incr2,
1110 : dst, GDK_hge_max,
1111 : ci1, ci2,
1112 : candoff1, candoff2);
1113 0 : break;
1114 : #endif
1115 0 : case TYPE_dbl:
1116 0 : nils = mul_sht_dbl_dbl(lft, incr1, rgt, incr2,
1117 : dst, GDK_dbl_max,
1118 : ci1, ci2, candoff1, candoff2);
1119 0 : break;
1120 0 : default:
1121 0 : goto unsupported;
1122 : }
1123 : break;
1124 0 : default:
1125 0 : goto unsupported;
1126 : }
1127 : break;
1128 35663 : case TYPE_int:
1129 35663 : switch (tp2) {
1130 31204 : case TYPE_bte:
1131 31204 : switch (tp) {
1132 24746 : case TYPE_int:
1133 24746 : nils = mul_int_bte_int(lft, incr1, rgt, incr2,
1134 : dst, GDK_int_max,
1135 : ci1, ci2, candoff1, candoff2);
1136 24746 : break;
1137 6458 : case TYPE_lng:
1138 6458 : nils = mul_int_bte_lng(lft, incr1, rgt, incr2,
1139 : dst, GDK_lng_max,
1140 : ci1, ci2, candoff1, candoff2);
1141 6458 : break;
1142 : #ifdef HAVE_HGE
1143 0 : case TYPE_hge:
1144 0 : nils = mul_int_bte_hge(lft, incr1, rgt, incr2,
1145 : dst, GDK_hge_max,
1146 : ci1, ci2, candoff1, candoff2);
1147 0 : break;
1148 : #endif
1149 0 : case TYPE_flt:
1150 0 : nils = mul_int_bte_flt(lft, incr1, rgt, incr2,
1151 : dst, GDK_flt_max,
1152 : ci1, ci2, candoff1, candoff2);
1153 0 : break;
1154 0 : case TYPE_dbl:
1155 0 : nils = mul_int_bte_dbl(lft, incr1, rgt, incr2,
1156 : dst, GDK_dbl_max,
1157 : ci1, ci2, candoff1, candoff2);
1158 0 : break;
1159 0 : default:
1160 0 : goto unsupported;
1161 : }
1162 : break;
1163 4161 : case TYPE_sht:
1164 4161 : switch (tp) {
1165 4156 : case TYPE_int:
1166 4156 : nils = mul_int_sht_int(lft, incr1, rgt, incr2,
1167 : dst, GDK_int_max,
1168 : ci1, ci2, candoff1, candoff2);
1169 4156 : break;
1170 5 : case TYPE_lng:
1171 5 : nils = mul_int_sht_lng(lft, incr1, rgt, incr2,
1172 : dst, GDK_lng_max,
1173 : ci1, ci2, candoff1, candoff2);
1174 5 : break;
1175 : #ifdef HAVE_HGE
1176 0 : case TYPE_hge:
1177 0 : nils = mul_int_sht_hge(lft, incr1, rgt, incr2,
1178 : dst, GDK_hge_max,
1179 : ci1, ci2, candoff1, candoff2);
1180 0 : break;
1181 : #endif
1182 0 : case TYPE_flt:
1183 0 : nils = mul_int_sht_flt(lft, incr1, rgt, incr2,
1184 : dst, GDK_flt_max,
1185 : ci1, ci2, candoff1, candoff2);
1186 0 : break;
1187 0 : case TYPE_dbl:
1188 0 : nils = mul_int_sht_dbl(lft, incr1, rgt, incr2,
1189 : dst, GDK_dbl_max,
1190 : ci1, ci2, candoff1, candoff2);
1191 0 : break;
1192 0 : default:
1193 0 : goto unsupported;
1194 : }
1195 : break;
1196 215 : case TYPE_int:
1197 215 : switch (tp) {
1198 169 : case TYPE_int:
1199 169 : nils = mul_int_int_int(lft, incr1, rgt, incr2,
1200 : dst, GDK_int_max,
1201 : ci1, ci2, candoff1, candoff2);
1202 169 : break;
1203 46 : case TYPE_lng:
1204 46 : nils = mul_int_int_lng(lft, incr1, rgt, incr2,
1205 : dst, GDK_lng_max,
1206 : ci1, ci2, candoff1, candoff2);
1207 46 : break;
1208 : #ifdef HAVE_HGE
1209 0 : case TYPE_hge:
1210 0 : nils = mul_int_int_hge(lft, incr1, rgt, incr2,
1211 : dst, GDK_hge_max,
1212 : ci1, ci2, candoff1, candoff2);
1213 0 : break;
1214 : #endif
1215 0 : case TYPE_flt:
1216 0 : nils = mul_int_int_flt(lft, incr1, rgt, incr2,
1217 : dst, GDK_flt_max,
1218 : ci1, ci2, candoff1, candoff2);
1219 0 : break;
1220 0 : case TYPE_dbl:
1221 0 : nils = mul_int_int_dbl(lft, incr1, rgt, incr2,
1222 : dst, GDK_dbl_max,
1223 : ci1, ci2, candoff1, candoff2);
1224 0 : break;
1225 0 : default:
1226 0 : goto unsupported;
1227 : }
1228 : break;
1229 73 : case TYPE_lng:
1230 73 : switch (tp) {
1231 5 : case TYPE_lng:
1232 5 : nils = mul_int_lng_lng(lft, incr1, rgt, incr2,
1233 : dst, GDK_lng_max,
1234 : ci1, ci2, candoff1, candoff2);
1235 5 : break;
1236 : #ifdef HAVE_HGE
1237 68 : case TYPE_hge:
1238 68 : nils = mul_int_lng_hge(lft, incr1, rgt, incr2,
1239 : dst, GDK_hge_max,
1240 : ci1, ci2, candoff1, candoff2);
1241 68 : break;
1242 : #endif
1243 0 : case TYPE_flt:
1244 0 : nils = mul_int_lng_flt(lft, incr1, rgt, incr2,
1245 : dst, GDK_flt_max,
1246 : ci1, ci2, candoff1, candoff2);
1247 0 : break;
1248 0 : case TYPE_dbl:
1249 0 : nils = mul_int_lng_dbl(lft, incr1, rgt, incr2,
1250 : dst, GDK_dbl_max,
1251 : ci1, ci2, candoff1, candoff2);
1252 0 : break;
1253 0 : default:
1254 0 : goto unsupported;
1255 : }
1256 : break;
1257 : #ifdef HAVE_HGE
1258 2 : case TYPE_hge:
1259 2 : switch (tp) {
1260 2 : case TYPE_hge:
1261 2 : nils = mul_int_hge_hge(lft, incr1, rgt, incr2,
1262 : dst, GDK_hge_max,
1263 : ci1, ci2, candoff1, candoff2);
1264 2 : break;
1265 0 : case TYPE_flt:
1266 0 : nils = mul_int_hge_flt(lft, incr1, rgt, incr2,
1267 : dst, GDK_flt_max,
1268 : ci1, ci2, candoff1, candoff2);
1269 0 : break;
1270 0 : case TYPE_dbl:
1271 0 : nils = mul_int_hge_dbl(lft, incr1, rgt, incr2,
1272 : dst, GDK_dbl_max,
1273 : ci1, ci2, candoff1, candoff2);
1274 0 : break;
1275 0 : default:
1276 0 : goto unsupported;
1277 : }
1278 : break;
1279 : #endif
1280 2 : case TYPE_flt:
1281 2 : switch (tp) {
1282 0 : case TYPE_bte:
1283 0 : nils = mul_int_flt_bte(lft, incr1, rgt, incr2,
1284 : dst, GDK_bte_max,
1285 : ci1, ci2,
1286 : candoff1, candoff2);
1287 0 : break;
1288 0 : case TYPE_sht:
1289 0 : nils = mul_int_flt_sht(lft, incr1, rgt, incr2,
1290 : dst, GDK_sht_max,
1291 : ci1, ci2,
1292 : candoff1, candoff2);
1293 0 : break;
1294 1 : case TYPE_int:
1295 1 : nils = mul_int_flt_int(lft, incr1, rgt, incr2,
1296 : dst, GDK_int_max,
1297 : ci1, ci2,
1298 : candoff1, candoff2);
1299 1 : break;
1300 1 : case TYPE_lng:
1301 1 : nils = mul_int_flt_lng(lft, incr1, rgt, incr2,
1302 : dst, GDK_lng_max,
1303 : ci1, ci2,
1304 : candoff1, candoff2);
1305 1 : break;
1306 : #ifdef HAVE_HGE
1307 0 : case TYPE_hge:
1308 0 : nils = mul_int_flt_hge(lft, incr1, rgt, incr2,
1309 : dst, GDK_hge_max,
1310 : ci1, ci2,
1311 : candoff1, candoff2);
1312 0 : break;
1313 : #endif
1314 0 : case TYPE_flt:
1315 0 : nils = mul_int_flt_flt(lft, incr1, rgt, incr2,
1316 : dst, GDK_flt_max,
1317 : ci1, ci2, candoff1, candoff2);
1318 0 : break;
1319 0 : case TYPE_dbl:
1320 0 : nils = mul_int_flt_dbl(lft, incr1, rgt, incr2,
1321 : dst, GDK_dbl_max,
1322 : ci1, ci2, candoff1, candoff2);
1323 0 : break;
1324 0 : default:
1325 0 : goto unsupported;
1326 : }
1327 : break;
1328 6 : case TYPE_dbl:
1329 6 : switch (tp) {
1330 0 : case TYPE_bte:
1331 0 : nils = mul_int_dbl_bte(lft, incr1, rgt, incr2,
1332 : dst, GDK_bte_max,
1333 : ci1, ci2,
1334 : candoff1, candoff2);
1335 0 : break;
1336 0 : case TYPE_sht:
1337 0 : nils = mul_int_dbl_sht(lft, incr1, rgt, incr2,
1338 : dst, GDK_sht_max,
1339 : ci1, ci2,
1340 : candoff1, candoff2);
1341 0 : break;
1342 6 : case TYPE_int:
1343 6 : nils = mul_int_dbl_int(lft, incr1, rgt, incr2,
1344 : dst, GDK_int_max,
1345 : ci1, ci2,
1346 : candoff1, candoff2);
1347 6 : break;
1348 0 : case TYPE_lng:
1349 0 : nils = mul_int_dbl_lng(lft, incr1, rgt, incr2,
1350 : dst, GDK_lng_max,
1351 : ci1, ci2,
1352 : candoff1, candoff2);
1353 0 : break;
1354 : #ifdef HAVE_HGE
1355 0 : case TYPE_hge:
1356 0 : nils = mul_int_dbl_hge(lft, incr1, rgt, incr2,
1357 : dst, GDK_hge_max,
1358 : ci1, ci2,
1359 : candoff1, candoff2);
1360 0 : break;
1361 : #endif
1362 0 : case TYPE_dbl:
1363 0 : nils = mul_int_dbl_dbl(lft, incr1, rgt, incr2,
1364 : dst, GDK_dbl_max,
1365 : ci1, ci2, candoff1, candoff2);
1366 0 : break;
1367 0 : default:
1368 0 : goto unsupported;
1369 : }
1370 : break;
1371 0 : default:
1372 0 : goto unsupported;
1373 : }
1374 : break;
1375 1387 : case TYPE_lng:
1376 1387 : switch (tp2) {
1377 1107 : case TYPE_bte:
1378 1107 : switch (tp) {
1379 1044 : case TYPE_lng:
1380 1044 : nils = mul_lng_bte_lng(lft, incr1, rgt, incr2,
1381 : dst, GDK_lng_max,
1382 : ci1, ci2, candoff1, candoff2);
1383 1044 : break;
1384 : #ifdef HAVE_HGE
1385 63 : case TYPE_hge:
1386 63 : nils = mul_lng_bte_hge(lft, incr1, rgt, incr2,
1387 : dst, GDK_hge_max,
1388 : ci1, ci2, candoff1, candoff2);
1389 63 : break;
1390 : #endif
1391 0 : case TYPE_flt:
1392 0 : nils = mul_lng_bte_flt(lft, incr1, rgt, incr2,
1393 : dst, GDK_flt_max,
1394 : ci1, ci2, candoff1, candoff2);
1395 0 : break;
1396 0 : case TYPE_dbl:
1397 0 : nils = mul_lng_bte_dbl(lft, incr1, rgt, incr2,
1398 : dst, GDK_dbl_max,
1399 : ci1, ci2, candoff1, candoff2);
1400 0 : break;
1401 0 : default:
1402 0 : goto unsupported;
1403 : }
1404 : break;
1405 4 : case TYPE_sht:
1406 4 : switch (tp) {
1407 4 : case TYPE_lng:
1408 4 : nils = mul_lng_sht_lng(lft, incr1, rgt, incr2,
1409 : dst, GDK_lng_max,
1410 : ci1, ci2, candoff1, candoff2);
1411 4 : break;
1412 : #ifdef HAVE_HGE
1413 0 : case TYPE_hge:
1414 0 : nils = mul_lng_sht_hge(lft, incr1, rgt, incr2,
1415 : dst, GDK_hge_max,
1416 : ci1, ci2, candoff1, candoff2);
1417 0 : break;
1418 : #endif
1419 0 : case TYPE_flt:
1420 0 : nils = mul_lng_sht_flt(lft, incr1, rgt, incr2,
1421 : dst, GDK_flt_max,
1422 : ci1, ci2, candoff1, candoff2);
1423 0 : break;
1424 0 : case TYPE_dbl:
1425 0 : nils = mul_lng_sht_dbl(lft, incr1, rgt, incr2,
1426 : dst, GDK_dbl_max,
1427 : ci1, ci2, candoff1, candoff2);
1428 0 : break;
1429 0 : default:
1430 0 : goto unsupported;
1431 : }
1432 : break;
1433 151 : case TYPE_int:
1434 151 : switch (tp) {
1435 49 : case TYPE_lng:
1436 49 : nils = mul_lng_int_lng(lft, incr1, rgt, incr2,
1437 : dst, GDK_lng_max,
1438 : ci1, ci2, candoff1, candoff2);
1439 49 : break;
1440 : #ifdef HAVE_HGE
1441 102 : case TYPE_hge:
1442 102 : nils = mul_lng_int_hge(lft, incr1, rgt, incr2,
1443 : dst, GDK_hge_max,
1444 : ci1, ci2, candoff1, candoff2);
1445 102 : break;
1446 : #endif
1447 0 : case TYPE_flt:
1448 0 : nils = mul_lng_int_flt(lft, incr1, rgt, incr2,
1449 : dst, GDK_flt_max,
1450 : ci1, ci2, candoff1, candoff2);
1451 0 : break;
1452 0 : case TYPE_dbl:
1453 0 : nils = mul_lng_int_dbl(lft, incr1, rgt, incr2,
1454 : dst, GDK_dbl_max,
1455 : ci1, ci2, candoff1, candoff2);
1456 0 : break;
1457 0 : default:
1458 0 : goto unsupported;
1459 : }
1460 : break;
1461 111 : case TYPE_lng:
1462 111 : switch (tp) {
1463 35 : case TYPE_lng:
1464 35 : nils = mul_lng_lng_lng(lft, incr1, rgt, incr2,
1465 : dst, GDK_lng_max,
1466 : ci1, ci2, candoff1, candoff2);
1467 35 : break;
1468 : #ifdef HAVE_HGE
1469 76 : case TYPE_hge:
1470 76 : nils = mul_lng_lng_hge(lft, incr1, rgt, incr2,
1471 : dst, GDK_hge_max,
1472 : ci1, ci2, candoff1, candoff2);
1473 76 : break;
1474 : #endif
1475 0 : case TYPE_flt:
1476 0 : nils = mul_lng_lng_flt(lft, incr1, rgt, incr2,
1477 : dst, GDK_flt_max,
1478 : ci1, ci2, candoff1, candoff2);
1479 0 : break;
1480 0 : case TYPE_dbl:
1481 0 : nils = mul_lng_lng_dbl(lft, incr1, rgt, incr2,
1482 : dst, GDK_dbl_max,
1483 : ci1, ci2, candoff1, candoff2);
1484 0 : break;
1485 0 : default:
1486 0 : goto unsupported;
1487 : }
1488 : break;
1489 : #ifdef HAVE_HGE
1490 8 : case TYPE_hge:
1491 8 : switch (tp) {
1492 8 : case TYPE_hge:
1493 8 : nils = mul_lng_hge_hge(lft, incr1, rgt, incr2,
1494 : dst, GDK_hge_max,
1495 : ci1, ci2, candoff1, candoff2);
1496 8 : break;
1497 0 : case TYPE_flt:
1498 0 : nils = mul_lng_hge_flt(lft, incr1, rgt, incr2,
1499 : dst, GDK_flt_max,
1500 : ci1, ci2, candoff1, candoff2);
1501 0 : break;
1502 0 : case TYPE_dbl:
1503 0 : nils = mul_lng_hge_dbl(lft, incr1, rgt, incr2,
1504 : dst, GDK_dbl_max,
1505 : ci1, ci2, candoff1, candoff2);
1506 0 : break;
1507 0 : default:
1508 0 : goto unsupported;
1509 : }
1510 : break;
1511 : #endif
1512 2 : case TYPE_flt:
1513 2 : switch (tp) {
1514 0 : case TYPE_bte:
1515 0 : nils = mul_lng_flt_bte(lft, incr1, rgt, incr2,
1516 : dst, GDK_bte_max,
1517 : ci1, ci2,
1518 : candoff1, candoff2);
1519 0 : break;
1520 0 : case TYPE_sht:
1521 0 : nils = mul_lng_flt_sht(lft, incr1, rgt, incr2,
1522 : dst, GDK_sht_max,
1523 : ci1, ci2,
1524 : candoff1, candoff2);
1525 0 : break;
1526 0 : case TYPE_int:
1527 0 : nils = mul_lng_flt_int(lft, incr1, rgt, incr2,
1528 : dst, GDK_int_max,
1529 : ci1, ci2,
1530 : candoff1, candoff2);
1531 0 : break;
1532 2 : case TYPE_lng:
1533 2 : nils = mul_lng_flt_lng(lft, incr1, rgt, incr2,
1534 : dst, GDK_lng_max,
1535 : ci1, ci2,
1536 : candoff1, candoff2);
1537 2 : break;
1538 : #ifdef HAVE_HGE
1539 0 : case TYPE_hge:
1540 0 : nils = mul_lng_flt_hge(lft, incr1, rgt, incr2,
1541 : dst, GDK_hge_max,
1542 : ci1, ci2,
1543 : candoff1, candoff2);
1544 0 : break;
1545 : #endif
1546 0 : case TYPE_flt:
1547 0 : nils = mul_lng_flt_flt(lft, incr1, rgt, incr2,
1548 : dst, GDK_flt_max,
1549 : ci1, ci2, candoff1, candoff2);
1550 0 : break;
1551 0 : case TYPE_dbl:
1552 0 : nils = mul_lng_flt_dbl(lft, incr1, rgt, incr2,
1553 : dst, GDK_dbl_max,
1554 : ci1, ci2, candoff1, candoff2);
1555 0 : break;
1556 0 : default:
1557 0 : goto unsupported;
1558 : }
1559 : break;
1560 4 : case TYPE_dbl:
1561 4 : switch (tp) {
1562 0 : case TYPE_bte:
1563 0 : nils = mul_lng_dbl_bte(lft, incr1, rgt, incr2,
1564 : dst, GDK_bte_max,
1565 : ci1, ci2,
1566 : candoff1, candoff2);
1567 0 : break;
1568 0 : case TYPE_sht:
1569 0 : nils = mul_lng_dbl_sht(lft, incr1, rgt, incr2,
1570 : dst, GDK_sht_max,
1571 : ci1, ci2,
1572 : candoff1, candoff2);
1573 0 : break;
1574 0 : case TYPE_int:
1575 0 : nils = mul_lng_dbl_int(lft, incr1, rgt, incr2,
1576 : dst, GDK_int_max,
1577 : ci1, ci2,
1578 : candoff1, candoff2);
1579 0 : break;
1580 4 : case TYPE_lng:
1581 4 : nils = mul_lng_dbl_lng(lft, incr1, rgt, incr2,
1582 : dst, GDK_lng_max,
1583 : ci1, ci2,
1584 : candoff1, candoff2);
1585 4 : break;
1586 : #ifdef HAVE_HGE
1587 0 : case TYPE_hge:
1588 0 : nils = mul_lng_dbl_hge(lft, incr1, rgt, incr2,
1589 : dst, GDK_hge_max,
1590 : ci1, ci2,
1591 : candoff1, candoff2);
1592 0 : break;
1593 : #endif
1594 0 : case TYPE_dbl:
1595 0 : nils = mul_lng_dbl_dbl(lft, incr1, rgt, incr2,
1596 : dst, GDK_dbl_max,
1597 : ci1, ci2, candoff1, candoff2);
1598 0 : break;
1599 0 : default:
1600 0 : goto unsupported;
1601 : }
1602 : break;
1603 0 : default:
1604 0 : goto unsupported;
1605 : }
1606 : break;
1607 : #ifdef HAVE_HGE
1608 216 : case TYPE_hge:
1609 216 : switch (tp2) {
1610 150 : case TYPE_bte:
1611 150 : switch (tp) {
1612 150 : case TYPE_hge:
1613 150 : nils = mul_hge_bte_hge(lft, incr1, rgt, incr2,
1614 : dst, GDK_hge_max,
1615 : ci1, ci2, candoff1, candoff2);
1616 150 : break;
1617 0 : case TYPE_flt:
1618 0 : nils = mul_hge_bte_flt(lft, incr1, rgt, incr2,
1619 : dst, GDK_flt_max,
1620 : ci1, ci2, candoff1, candoff2);
1621 0 : break;
1622 0 : case TYPE_dbl:
1623 0 : nils = mul_hge_bte_dbl(lft, incr1, rgt, incr2,
1624 : dst, GDK_dbl_max,
1625 : ci1, ci2, candoff1, candoff2);
1626 0 : break;
1627 0 : default:
1628 0 : goto unsupported;
1629 : }
1630 : break;
1631 18 : case TYPE_sht:
1632 18 : switch (tp) {
1633 18 : case TYPE_hge:
1634 18 : nils = mul_hge_sht_hge(lft, incr1, rgt, incr2,
1635 : dst, GDK_hge_max,
1636 : ci1, ci2, candoff1, candoff2);
1637 18 : break;
1638 0 : case TYPE_flt:
1639 0 : nils = mul_hge_sht_flt(lft, incr1, rgt, incr2,
1640 : dst, GDK_flt_max,
1641 : ci1, ci2, candoff1, candoff2);
1642 0 : break;
1643 0 : case TYPE_dbl:
1644 0 : nils = mul_hge_sht_dbl(lft, incr1, rgt, incr2,
1645 : dst, GDK_dbl_max,
1646 : ci1, ci2, candoff1, candoff2);
1647 0 : break;
1648 0 : default:
1649 0 : goto unsupported;
1650 : }
1651 : break;
1652 26 : case TYPE_int:
1653 26 : switch (tp) {
1654 26 : case TYPE_hge:
1655 26 : nils = mul_hge_int_hge(lft, incr1, rgt, incr2,
1656 : dst, GDK_hge_max,
1657 : ci1, ci2, candoff1, candoff2);
1658 26 : break;
1659 0 : case TYPE_flt:
1660 0 : nils = mul_hge_int_flt(lft, incr1, rgt, incr2,
1661 : dst, GDK_flt_max,
1662 : ci1, ci2, candoff1, candoff2);
1663 0 : break;
1664 0 : case TYPE_dbl:
1665 0 : nils = mul_hge_int_dbl(lft, incr1, rgt, incr2,
1666 : dst, GDK_dbl_max,
1667 : ci1, ci2, candoff1, candoff2);
1668 0 : break;
1669 0 : default:
1670 0 : goto unsupported;
1671 : }
1672 : break;
1673 12 : case TYPE_lng:
1674 12 : switch (tp) {
1675 12 : case TYPE_hge:
1676 12 : nils = mul_hge_lng_hge(lft, incr1, rgt, incr2,
1677 : dst, GDK_hge_max,
1678 : ci1, ci2, candoff1, candoff2);
1679 12 : break;
1680 0 : case TYPE_flt:
1681 0 : nils = mul_hge_lng_flt(lft, incr1, rgt, incr2,
1682 : dst, GDK_flt_max,
1683 : ci1, ci2, candoff1, candoff2);
1684 0 : break;
1685 0 : case TYPE_dbl:
1686 0 : nils = mul_hge_lng_dbl(lft, incr1, rgt, incr2,
1687 : dst, GDK_dbl_max,
1688 : ci1, ci2, candoff1, candoff2);
1689 0 : break;
1690 0 : default:
1691 0 : goto unsupported;
1692 : }
1693 : break;
1694 10 : case TYPE_hge:
1695 10 : switch (tp) {
1696 10 : case TYPE_hge:
1697 10 : nils = mul_hge_hge_hge(lft, incr1, rgt, incr2,
1698 : dst, GDK_hge_max,
1699 : ci1, ci2, candoff1, candoff2);
1700 10 : break;
1701 0 : case TYPE_flt:
1702 0 : nils = mul_hge_hge_flt(lft, incr1, rgt, incr2,
1703 : dst, GDK_flt_max,
1704 : ci1, ci2, candoff1, candoff2);
1705 0 : break;
1706 0 : case TYPE_dbl:
1707 0 : nils = mul_hge_hge_dbl(lft, incr1, rgt, incr2,
1708 : dst, GDK_dbl_max,
1709 : ci1, ci2, candoff1, candoff2);
1710 0 : break;
1711 0 : default:
1712 0 : goto unsupported;
1713 : }
1714 : break;
1715 0 : case TYPE_flt:
1716 0 : switch (tp) {
1717 0 : case TYPE_bte:
1718 0 : nils = mul_hge_flt_bte(lft, incr1, rgt, incr2,
1719 : dst, GDK_bte_max,
1720 : ci1, ci2,
1721 : candoff1, candoff2);
1722 0 : break;
1723 0 : case TYPE_sht:
1724 0 : nils = mul_hge_flt_sht(lft, incr1, rgt, incr2,
1725 : dst, GDK_sht_max,
1726 : ci1, ci2,
1727 : candoff1, candoff2);
1728 0 : break;
1729 0 : case TYPE_int:
1730 0 : nils = mul_hge_flt_int(lft, incr1, rgt, incr2,
1731 : dst, GDK_int_max,
1732 : ci1, ci2,
1733 : candoff1, candoff2);
1734 0 : break;
1735 0 : case TYPE_lng:
1736 0 : nils = mul_hge_flt_lng(lft, incr1, rgt, incr2,
1737 : dst, GDK_lng_max,
1738 : ci1, ci2,
1739 : candoff1, candoff2);
1740 0 : break;
1741 0 : case TYPE_hge:
1742 0 : nils = mul_hge_flt_hge(lft, incr1, rgt, incr2,
1743 : dst, GDK_hge_max,
1744 : ci1, ci2,
1745 : candoff1, candoff2);
1746 0 : break;
1747 0 : case TYPE_flt:
1748 0 : nils = mul_hge_flt_flt(lft, incr1, rgt, incr2,
1749 : dst, GDK_flt_max,
1750 : ci1, ci2, candoff1, candoff2);
1751 0 : break;
1752 0 : case TYPE_dbl:
1753 0 : nils = mul_hge_flt_dbl(lft, incr1, rgt, incr2,
1754 : dst, GDK_dbl_max,
1755 : ci1, ci2, candoff1, candoff2);
1756 0 : break;
1757 0 : default:
1758 0 : goto unsupported;
1759 : }
1760 : break;
1761 0 : case TYPE_dbl:
1762 0 : switch (tp) {
1763 0 : case TYPE_bte:
1764 0 : nils = mul_hge_dbl_bte(lft, incr1, rgt, incr2,
1765 : dst, GDK_bte_max,
1766 : ci1, ci2,
1767 : candoff1, candoff2);
1768 0 : break;
1769 0 : case TYPE_sht:
1770 0 : nils = mul_hge_dbl_sht(lft, incr1, rgt, incr2,
1771 : dst, GDK_sht_max,
1772 : ci1, ci2,
1773 : candoff1, candoff2);
1774 0 : break;
1775 0 : case TYPE_int:
1776 0 : nils = mul_hge_dbl_int(lft, incr1, rgt, incr2,
1777 : dst, GDK_int_max,
1778 : ci1, ci2,
1779 : candoff1, candoff2);
1780 0 : break;
1781 0 : case TYPE_lng:
1782 0 : nils = mul_hge_dbl_lng(lft, incr1, rgt, incr2,
1783 : dst, GDK_lng_max,
1784 : ci1, ci2,
1785 : candoff1, candoff2);
1786 0 : break;
1787 0 : case TYPE_hge:
1788 0 : nils = mul_hge_dbl_hge(lft, incr1, rgt, incr2,
1789 : dst, GDK_hge_max,
1790 : ci1, ci2,
1791 : candoff1, candoff2);
1792 0 : break;
1793 0 : case TYPE_dbl:
1794 0 : nils = mul_hge_dbl_dbl(lft, incr1, rgt, incr2,
1795 : dst, GDK_dbl_max,
1796 : ci1, ci2, candoff1, candoff2);
1797 0 : break;
1798 0 : default:
1799 0 : goto unsupported;
1800 : }
1801 : break;
1802 0 : default:
1803 0 : goto unsupported;
1804 : }
1805 : break;
1806 : #endif
1807 17 : case TYPE_flt:
1808 17 : switch (tp2) {
1809 0 : case TYPE_bte:
1810 0 : switch (tp) {
1811 0 : case TYPE_flt:
1812 0 : nils = mul_flt_bte_flt(lft, incr1, rgt, incr2,
1813 : dst, GDK_flt_max,
1814 : ci1, ci2, candoff1, candoff2);
1815 0 : break;
1816 0 : case TYPE_dbl:
1817 0 : nils = mul_flt_bte_dbl(lft, incr1, rgt, incr2,
1818 : dst, GDK_dbl_max,
1819 : ci1, ci2, candoff1, candoff2);
1820 0 : break;
1821 0 : default:
1822 0 : goto unsupported;
1823 : }
1824 : break;
1825 0 : case TYPE_sht:
1826 0 : switch (tp) {
1827 0 : case TYPE_flt:
1828 0 : nils = mul_flt_sht_flt(lft, incr1, rgt, incr2,
1829 : dst, GDK_flt_max,
1830 : ci1, ci2, candoff1, candoff2);
1831 0 : break;
1832 0 : case TYPE_dbl:
1833 0 : nils = mul_flt_sht_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_int:
1842 0 : switch (tp) {
1843 0 : case TYPE_flt:
1844 0 : nils = mul_flt_int_flt(lft, incr1, rgt, incr2,
1845 : dst, GDK_flt_max,
1846 : ci1, ci2, candoff1, candoff2);
1847 0 : break;
1848 0 : case TYPE_dbl:
1849 0 : nils = mul_flt_int_dbl(lft, incr1, rgt, incr2,
1850 : dst, GDK_dbl_max,
1851 : ci1, ci2, candoff1, candoff2);
1852 0 : break;
1853 0 : default:
1854 0 : goto unsupported;
1855 : }
1856 : break;
1857 0 : case TYPE_lng:
1858 0 : switch (tp) {
1859 0 : case TYPE_flt:
1860 0 : nils = mul_flt_lng_flt(lft, incr1, rgt, incr2,
1861 : dst, GDK_flt_max,
1862 : ci1, ci2, candoff1, candoff2);
1863 0 : break;
1864 0 : case TYPE_dbl:
1865 0 : nils = mul_flt_lng_dbl(lft, incr1, rgt, incr2,
1866 : dst, GDK_dbl_max,
1867 : ci1, ci2, candoff1, candoff2);
1868 0 : break;
1869 0 : default:
1870 0 : goto unsupported;
1871 : }
1872 : break;
1873 : #ifdef HAVE_HGE
1874 0 : case TYPE_hge:
1875 0 : switch (tp) {
1876 0 : case TYPE_flt:
1877 0 : nils = mul_flt_hge_flt(lft, incr1, rgt, incr2,
1878 : dst, GDK_flt_max,
1879 : ci1, ci2, candoff1, candoff2);
1880 0 : break;
1881 0 : case TYPE_dbl:
1882 0 : nils = mul_flt_hge_dbl(lft, incr1, rgt, incr2,
1883 : dst, GDK_dbl_max,
1884 : ci1, ci2, candoff1, candoff2);
1885 0 : break;
1886 0 : default:
1887 0 : goto unsupported;
1888 : }
1889 : break;
1890 : #endif
1891 17 : case TYPE_flt:
1892 17 : switch (tp) {
1893 17 : case TYPE_flt:
1894 17 : nils = mul_flt_flt_flt(lft, incr1, rgt, incr2,
1895 : dst, GDK_flt_max,
1896 : ci1, ci2, candoff1, candoff2);
1897 17 : break;
1898 0 : case TYPE_dbl:
1899 0 : nils = mul_flt_flt_dbl(lft, incr1, rgt, incr2,
1900 : dst, GDK_dbl_max,
1901 : ci1, ci2, candoff1, candoff2);
1902 0 : break;
1903 0 : default:
1904 0 : goto unsupported;
1905 : }
1906 : break;
1907 0 : case TYPE_dbl:
1908 0 : switch (tp) {
1909 0 : case TYPE_dbl:
1910 0 : nils = mul_flt_dbl_dbl(lft, incr1, rgt, incr2,
1911 : dst, GDK_dbl_max,
1912 : ci1, ci2, candoff1, candoff2);
1913 0 : break;
1914 0 : default:
1915 0 : goto unsupported;
1916 : }
1917 0 : break;
1918 0 : default:
1919 0 : goto unsupported;
1920 : }
1921 : break;
1922 1387 : case TYPE_dbl:
1923 1387 : switch (tp2) {
1924 0 : case TYPE_bte:
1925 0 : switch (tp) {
1926 0 : case TYPE_dbl:
1927 0 : nils = mul_dbl_bte_dbl(lft, incr1, rgt, incr2,
1928 : dst, GDK_dbl_max,
1929 : ci1, ci2, candoff1, candoff2);
1930 0 : break;
1931 0 : default:
1932 0 : goto unsupported;
1933 : }
1934 0 : break;
1935 0 : case TYPE_sht:
1936 0 : switch (tp) {
1937 0 : case TYPE_dbl:
1938 0 : nils = mul_dbl_sht_dbl(lft, incr1, rgt, incr2,
1939 : dst, GDK_dbl_max,
1940 : ci1, ci2, candoff1, candoff2);
1941 0 : break;
1942 0 : default:
1943 0 : goto unsupported;
1944 : }
1945 0 : break;
1946 0 : case TYPE_int:
1947 0 : switch (tp) {
1948 0 : case TYPE_dbl:
1949 0 : nils = mul_dbl_int_dbl(lft, incr1, rgt, incr2,
1950 : dst, GDK_dbl_max,
1951 : ci1, ci2, candoff1, candoff2);
1952 0 : break;
1953 0 : default:
1954 0 : goto unsupported;
1955 : }
1956 0 : break;
1957 0 : case TYPE_lng:
1958 0 : switch (tp) {
1959 0 : case TYPE_dbl:
1960 0 : nils = mul_dbl_lng_dbl(lft, incr1, rgt, incr2,
1961 : dst, GDK_dbl_max,
1962 : ci1, ci2, candoff1, candoff2);
1963 0 : break;
1964 0 : default:
1965 0 : goto unsupported;
1966 : }
1967 0 : break;
1968 : #ifdef HAVE_HGE
1969 0 : case TYPE_hge:
1970 0 : switch (tp) {
1971 0 : case TYPE_dbl:
1972 0 : nils = mul_dbl_hge_dbl(lft, incr1, rgt, incr2,
1973 : dst, GDK_dbl_max,
1974 : ci1, ci2, candoff1, candoff2);
1975 0 : break;
1976 0 : default:
1977 0 : goto unsupported;
1978 : }
1979 0 : break;
1980 : #endif
1981 0 : case TYPE_flt:
1982 0 : switch (tp) {
1983 0 : case TYPE_dbl:
1984 0 : nils = mul_dbl_flt_dbl(lft, incr1, rgt, incr2,
1985 : dst, GDK_dbl_max,
1986 : ci1, ci2, candoff1, candoff2);
1987 0 : break;
1988 0 : default:
1989 0 : goto unsupported;
1990 : }
1991 0 : break;
1992 1387 : case TYPE_dbl:
1993 1387 : switch (tp) {
1994 1387 : case TYPE_dbl:
1995 1387 : nils = mul_dbl_dbl_dbl(lft, incr1, rgt, incr2,
1996 : dst, GDK_dbl_max,
1997 : ci1, ci2, candoff1, candoff2);
1998 1387 : break;
1999 0 : default:
2000 0 : goto unsupported;
2001 : }
2002 1387 : break;
2003 0 : default:
2004 0 : goto unsupported;
2005 : }
2006 : break;
2007 0 : default:
2008 0 : goto unsupported;
2009 : }
2010 :
2011 : return nils;
2012 :
2013 0 : unsupported:
2014 0 : GDKerror("%s: type combination mul(%s,%s)->%s) not supported.\n",
2015 : func, ATOMname(tp1), ATOMname(tp2), ATOMname(tp));
2016 0 : return BUN_NONE;
2017 : }
2018 :
2019 : BAT *
2020 1818 : BATcalcmuldivmod(BAT *b1, BAT *b2, BAT *s1, BAT *s2, int tp,
2021 : BUN (*typeswitchloop)(const void *, int, bool,
2022 : const void *, int, bool,
2023 : void *restrict, int,
2024 : struct canditer *restrict,
2025 : struct canditer *restrict,
2026 : oid, oid, const char *),
2027 : const char *func)
2028 : {
2029 1818 : lng t0 = 0;
2030 1818 : BAT *bn;
2031 1818 : BUN nils;
2032 1818 : struct canditer ci1, ci2;
2033 :
2034 1818 : TRC_DEBUG_IF(ALGO) t0 = GDKusec();
2035 :
2036 1818 : BATcheck(b1, NULL);
2037 1818 : BATcheck(b2, NULL);
2038 :
2039 1818 : canditer_init(&ci1, b1, s1);
2040 1818 : canditer_init(&ci2, b2, s2);
2041 1818 : if (ci1.ncand != ci2.ncand || ci1.hseq != ci2.hseq) {
2042 0 : GDKerror("%s: inputs not the same size.\n", func);
2043 0 : return NULL;
2044 : }
2045 :
2046 1818 : bn = COLnew(ci1.hseq, tp, ci1.ncand, TRANSIENT);
2047 1818 : if (bn == NULL)
2048 : return NULL;
2049 1818 : if (ci1.ncand == 0)
2050 : return bn;
2051 :
2052 1662 : BATiter b1i = bat_iterator(b1);
2053 1662 : BATiter b2i = bat_iterator(b2);
2054 3324 : nils = (*typeswitchloop)(b1i.base, b1i.type, true,
2055 1662 : b2i.base, b2i.type, true,
2056 1662 : Tloc(bn, 0), tp,
2057 : &ci1, &ci2, b1->hseqbase, b2->hseqbase, func);
2058 1662 : bat_iterator_end(&b1i);
2059 1662 : bat_iterator_end(&b2i);
2060 :
2061 1662 : if (nils >= BUN_NONE) {
2062 5 : BBPunfix(bn->batCacheid);
2063 5 : return NULL;
2064 : }
2065 :
2066 1657 : BATsetcount(bn, ci1.ncand);
2067 :
2068 1657 : bn->tsorted = ci1.ncand <= 1 || nils == ci1.ncand;
2069 1657 : bn->trevsorted = ci1.ncand <= 1 || nils == ci1.ncand;
2070 1657 : bn->tkey = ci1.ncand <= 1;
2071 1657 : bn->tnil = nils != 0;
2072 1657 : bn->tnonil = nils == 0;
2073 :
2074 1657 : TRC_DEBUG(ALGO, "%s: b1=" ALGOBATFMT ",b2=" ALGOBATFMT
2075 : ",s1=" ALGOOPTBATFMT ",s2=" ALGOOPTBATFMT
2076 : " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
2077 : func, ALGOBATPAR(b1), ALGOBATPAR(b2),
2078 : ALGOOPTBATPAR(s1), ALGOOPTBATPAR(s2),
2079 : ALGOOPTBATPAR(bn), GDKusec() - t0);
2080 :
2081 : return bn;
2082 : }
2083 :
2084 : BAT *
2085 1534 : BATcalcmul(BAT *b1, BAT *b2, BAT *s1, BAT *s2, int tp)
2086 : {
2087 1534 : return BATcalcmuldivmod(b1, b2, s1, s2, tp,
2088 : mul_typeswitchloop, __func__);
2089 : }
2090 :
2091 : BAT *
2092 25649 : BATcalcmulcst(BAT *b, const ValRecord *v, BAT *s, int tp)
2093 : {
2094 25649 : lng t0 = 0;
2095 25649 : BAT *bn;
2096 25649 : BUN nils;
2097 25649 : struct canditer ci;
2098 :
2099 25649 : TRC_DEBUG_IF(ALGO) t0 = GDKusec();
2100 :
2101 25649 : BATcheck(b, NULL);
2102 :
2103 25649 : canditer_init(&ci, b, s);
2104 :
2105 25647 : bn = COLnew(ci.hseq, tp, ci.ncand, TRANSIENT);
2106 25647 : if (bn == NULL)
2107 : return NULL;
2108 25647 : if (ci.ncand == 0)
2109 : return bn;
2110 :
2111 19514 : BATiter bi = bat_iterator(b);
2112 39026 : nils = mul_typeswitchloop(bi.base, bi.type, true,
2113 19513 : VALptr(v), v->vtype, false,
2114 19513 : Tloc(bn, 0), tp,
2115 : &ci,
2116 19513 : &(struct canditer){.tpe=cand_dense, .ncand=ci.ncand},
2117 : b->hseqbase, 0, __func__);
2118 :
2119 19513 : if (nils == BUN_NONE) {
2120 1 : BBPunfix(bn->batCacheid);
2121 1 : bat_iterator_end(&bi);
2122 1 : return NULL;
2123 : }
2124 :
2125 19512 : BATsetcount(bn, ci.ncand);
2126 :
2127 : /* if the input is sorted, and no overflow occurred, the result
2128 : * is also sorted, or reverse sorted if the constant is
2129 : * negative */
2130 19512 : ValRecord sign;
2131 :
2132 19512 : VARcalcsign(&sign, v);
2133 19524 : bn->tsorted = (sign.val.btval >= 0 && bi.sorted && nils == 0) ||
2134 46 : (sign.val.btval <= 0 && bi.revsorted && nils == 0) ||
2135 31217 : ci.ncand <= 1 || nils == ci.ncand;
2136 19526 : bn->trevsorted = (sign.val.btval >= 0 && bi.revsorted && nils == 0) ||
2137 46 : (sign.val.btval <= 0 && bi.sorted && nils == 0) ||
2138 36451 : ci.ncand <= 1 || nils == ci.ncand;
2139 19512 : bn->tkey = ci.ncand <= 1;
2140 19512 : bn->tnil = nils != 0;
2141 19512 : bn->tnonil = nils == 0;
2142 19512 : bat_iterator_end(&bi);
2143 :
2144 19513 : TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
2145 : " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
2146 : ALGOBATPAR(b), ALGOOPTBATPAR(s),
2147 : ALGOOPTBATPAR(bn), GDKusec() - t0);
2148 :
2149 : return bn;
2150 : }
2151 :
2152 : BAT *
2153 38 : BATcalccstmul(const ValRecord *v, BAT *b, BAT *s, int tp)
2154 : {
2155 38 : lng t0 = 0;
2156 38 : BAT *bn;
2157 38 : BUN nils;
2158 38 : struct canditer ci;
2159 :
2160 38 : TRC_DEBUG_IF(ALGO) t0 = GDKusec();
2161 :
2162 38 : BATcheck(b, NULL);
2163 :
2164 38 : canditer_init(&ci, b, s);
2165 :
2166 38 : bn = COLnew(ci.hseq, tp, ci.ncand, TRANSIENT);
2167 38 : if (bn == NULL)
2168 : return NULL;
2169 38 : if (ci.ncand == 0)
2170 : return bn;
2171 :
2172 28 : BATiter bi = bat_iterator(b);
2173 56 : nils = mul_typeswitchloop(VALptr(v), v->vtype, false,
2174 28 : bi.base, bi.type, true,
2175 28 : Tloc(bn, 0), tp,
2176 28 : &(struct canditer){.tpe=cand_dense, .ncand=ci.ncand},
2177 : &ci,
2178 : 0, b->hseqbase, __func__);
2179 :
2180 28 : if (nils == BUN_NONE) {
2181 0 : BBPunfix(bn->batCacheid);
2182 0 : bat_iterator_end(&bi);
2183 0 : return NULL;
2184 : }
2185 :
2186 28 : BATsetcount(bn, ci.ncand);
2187 :
2188 : /* if the input is sorted, and no overflow occurred, the result
2189 : * is also sorted, or reverse sorted if the constant is
2190 : * negative */
2191 28 : ValRecord sign;
2192 :
2193 28 : VARcalcsign(&sign, v);
2194 29 : bn->tsorted = (sign.val.btval >= 0 && bi.sorted && nils == 0) ||
2195 1 : (sign.val.btval <= 0 && bi.revsorted && nils == 0) ||
2196 45 : ci.ncand <= 1 || nils == ci.ncand;
2197 29 : bn->trevsorted = (sign.val.btval >= 0 && bi.revsorted && nils == 0) ||
2198 1 : (sign.val.btval <= 0 && bi.sorted && nils == 0) ||
2199 46 : ci.ncand <= 1 || nils == ci.ncand;
2200 28 : bn->tkey = ci.ncand <= 1;
2201 28 : bn->tnil = nils != 0;
2202 28 : bn->tnonil = nils == 0;
2203 28 : bat_iterator_end(&bi);
2204 :
2205 28 : TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
2206 : " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
2207 : ALGOBATPAR(b), ALGOOPTBATPAR(s),
2208 : ALGOOPTBATPAR(bn), GDKusec() - t0);
2209 :
2210 : return bn;
2211 : }
2212 :
2213 : gdk_return
2214 18360 : VARcalcmul(ValPtr ret, const ValRecord *lft, const ValRecord *rgt)
2215 : {
2216 18360 : ret->bat = false;
2217 18360 : if (mul_typeswitchloop(VALptr(lft), lft->vtype, false,
2218 18360 : VALptr(rgt), rgt->vtype, false,
2219 18360 : VALget(ret), ret->vtype,
2220 18360 : &(struct canditer){.tpe=cand_dense, .ncand=1},
2221 18360 : &(struct canditer){.tpe=cand_dense, .ncand=1},
2222 : 0, 0, __func__) == BUN_NONE)
2223 138 : return GDK_FAIL;
2224 18222 : return GDK_SUCCEED;
2225 : }
|