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