LCOV - code coverage report
Current view: top level - gdk - gdk_calc_mul.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 370 1115 33.2 %
Date: 2024-11-15 19:37:45 Functions: 51 196 26.0 %

          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           0 : 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       45671 : 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     3713525 : MUL_4TYPE(bte, int, int, lng, I)
     425       36118 : 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         106 : 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     3831508 : MUL_3TYPE_enlarge(sht, bte, int, I)
     447     3647820 : 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      244242 : MUL_4TYPE(int, bte, int, lng, I)
     483     5463393 : 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      535415 : MUL_4TYPE(int, sht, int, lng, I)
     490          36 : 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         972 : MUL_4TYPE(int, int, int, lng, I)
     497       18876 : 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    20225505 : 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     2043360 : 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     4628400 : 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       74762 : 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     3319397 : 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       10305 : MUL_2TYPE_hge(hge, int)
     557           0 : MUL_3TYPE_enlarge(hge, int, flt, F)
     558           0 : MUL_3TYPE_enlarge(hge, int, dbl, F)
     559       51952 : 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          86 : 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      793052 : MUL_2TYPE_float(dbl, dbl, dbl)
     593             : 
     594             : static BUN
     595       46305 : 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       46305 :         BUN nils;
     604             : 
     605       46305 :         tp1 = ATOMbasetype(tp1);
     606       46305 :         tp2 = ATOMbasetype(tp2);
     607       46305 :         tp = ATOMbasetype(tp);
     608       46305 :         switch (tp1) {
     609         518 :         case TYPE_bte:
     610         518 :                 switch (tp2) {
     611         404 :                 case TYPE_bte:
     612         404 :                         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         121 :                         case TYPE_sht:
     619         121 :                                 nils = mul_bte_bte_sht(lft, incr1, rgt, incr2,
     620             :                                                        dst, GDK_sht_max,
     621             :                                                        ci1, ci2, candoff1, candoff2);
     622         121 :                                 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          77 :                 case TYPE_int:
     693          77 :                         switch (tp) {
     694          56 :                         case TYPE_int:
     695          56 :                                 nils = mul_bte_int_int(lft, incr1, rgt, incr2,
     696             :                                                        dst, GDK_int_max,
     697             :                                                        ci1, ci2, candoff1, candoff2);
     698          56 :                                 break;
     699          21 :                         case TYPE_lng:
     700          21 :                                 nils = mul_bte_int_lng(lft, incr1, rgt, incr2,
     701             :                                                        dst, GDK_lng_max,
     702             :                                                        ci1, ci2, candoff1, candoff2);
     703          21 :                                 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          29 :                 case TYPE_lng:
     726          29 :                         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          26 :                         case TYPE_hge:
     734          26 :                                 nils = mul_bte_lng_hge(lft, incr1, rgt, incr2,
     735             :                                                        dst, GDK_hge_max,
     736             :                                                        ci1, ci2, candoff1, candoff2);
     737          26 :                                 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       42528 :         case TYPE_int:
    1129       42528 :                 switch (tp2) {
    1130       37487 :                 case TYPE_bte:
    1131       37487 :                         switch (tp) {
    1132       28587 :                         case TYPE_int:
    1133       28587 :                                 nils = mul_int_bte_int(lft, incr1, rgt, incr2,
    1134             :                                                        dst, GDK_int_max,
    1135             :                                                        ci1, ci2, candoff1, candoff2);
    1136       28587 :                                 break;
    1137        8900 :                         case TYPE_lng:
    1138        8900 :                                 nils = mul_int_bte_lng(lft, incr1, rgt, incr2,
    1139             :                                                        dst, GDK_lng_max,
    1140             :                                                        ci1, ci2, candoff1, candoff2);
    1141        8900 :                                 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        4705 :                 case TYPE_sht:
    1164        4705 :                         switch (tp) {
    1165        4697 :                         case TYPE_int:
    1166        4697 :                                 nils = mul_int_sht_int(lft, incr1, rgt, incr2,
    1167             :                                                        dst, GDK_int_max,
    1168             :                                                        ci1, ci2, candoff1, candoff2);
    1169        4697 :                                 break;
    1170           8 :                         case TYPE_lng:
    1171           8 :                                 nils = mul_int_sht_lng(lft, incr1, rgt, incr2,
    1172             :                                                        dst, GDK_lng_max,
    1173             :                                                        ci1, ci2, candoff1, candoff2);
    1174           8 :                                 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         238 :                 case TYPE_int:
    1197         238 :                         switch (tp) {
    1198         173 :                         case TYPE_int:
    1199         173 :                                 nils = mul_int_int_int(lft, incr1, rgt, incr2,
    1200             :                                                        dst, GDK_int_max,
    1201             :                                                        ci1, ci2, candoff1, candoff2);
    1202         173 :                                 break;
    1203          65 :                         case TYPE_lng:
    1204          65 :                                 nils = mul_int_int_lng(lft, incr1, rgt, incr2,
    1205             :                                                        dst, GDK_lng_max,
    1206             :                                                        ci1, ci2, candoff1, candoff2);
    1207          65 :                                 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          89 :                 case TYPE_lng:
    1230          89 :                         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          84 :                         case TYPE_hge:
    1238          84 :                                 nils = mul_int_lng_hge(lft, incr1, rgt, incr2,
    1239             :                                                        dst, GDK_hge_max,
    1240             :                                                        ci1, ci2, candoff1, candoff2);
    1241          84 :                                 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           1 :                 case TYPE_flt:
    1281           1 :                         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           0 :                         case TYPE_lng:
    1301           0 :                                 nils = mul_int_flt_lng(lft, incr1, rgt, incr2,
    1302             :                                                        dst, GDK_lng_max,
    1303             :                                                        ci1, ci2,
    1304             :                                                        candoff1, candoff2);
    1305           0 :                                 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        1457 :         case TYPE_lng:
    1376        1457 :                 switch (tp2) {
    1377        1117 :                 case TYPE_bte:
    1378        1117 :                         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          73 :                         case TYPE_hge:
    1386          73 :                                 nils = mul_lng_bte_hge(lft, incr1, rgt, incr2,
    1387             :                                                        dst, GDK_hge_max,
    1388             :                                                        ci1, ci2, candoff1, candoff2);
    1389          73 :                                 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         157 :                 case TYPE_int:
    1434         157 :                         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         108 :                         case TYPE_hge:
    1442         108 :                                 nils = mul_lng_int_hge(lft, incr1, rgt, incr2,
    1443             :                                                        dst, GDK_hge_max,
    1444             :                                                        ci1, ci2, candoff1, candoff2);
    1445         108 :                                 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         165 :                 case TYPE_lng:
    1462         165 :                         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         130 :                         case TYPE_hge:
    1470         130 :                                 nils = mul_lng_lng_hge(lft, incr1, rgt, incr2,
    1471             :                                                        dst, GDK_hge_max,
    1472             :                                                        ci1, ci2, candoff1, candoff2);
    1473         130 :                                 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         220 :         case TYPE_hge:
    1609         220 :                 switch (tp2) {
    1610         147 :                 case TYPE_bte:
    1611         147 :                         switch (tp) {
    1612         147 :                         case TYPE_hge:
    1613         147 :                                 nils = mul_hge_bte_hge(lft, incr1, rgt, incr2,
    1614             :                                                        dst, GDK_hge_max,
    1615             :                                                        ci1, ci2, candoff1, candoff2);
    1616         147 :                                 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          29 :                 case TYPE_int:
    1653          29 :                         switch (tp) {
    1654          29 :                         case TYPE_hge:
    1655          29 :                                 nils = mul_hge_int_hge(lft, incr1, rgt, incr2,
    1656             :                                                        dst, GDK_hge_max,
    1657             :                                                        ci1, ci2, candoff1, candoff2);
    1658          29 :                                 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          16 :                 case TYPE_lng:
    1674          16 :                         switch (tp) {
    1675          16 :                         case TYPE_hge:
    1676          16 :                                 nils = mul_hge_lng_hge(lft, incr1, rgt, incr2,
    1677             :                                                        dst, GDK_hge_max,
    1678             :                                                        ci1, ci2, candoff1, candoff2);
    1679          16 :                                 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          21 :         case TYPE_flt:
    1808          21 :                 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          21 :                 case TYPE_flt:
    1892          21 :                         switch (tp) {
    1893          21 :                         case TYPE_flt:
    1894          21 :                                 nils = mul_flt_flt_flt(lft, incr1, rgt, incr2,
    1895             :                                                        dst, GDK_flt_max,
    1896             :                                                        ci1, ci2, candoff1, candoff2);
    1897          21 :                                 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        1407 :         case TYPE_dbl:
    1923        1407 :                 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        1407 :                 case TYPE_dbl:
    1993        1407 :                         switch (tp) {
    1994        1407 :                         case TYPE_dbl:
    1995        1407 :                                 nils = mul_dbl_dbl_dbl(lft, incr1, rgt, incr2,
    1996             :                                                        dst, GDK_dbl_max,
    1997             :                                                        ci1, ci2, candoff1, candoff2);
    1998        1407 :                                 break;
    1999           0 :                         default:
    2000           0 :                                 goto unsupported;
    2001             :                         }
    2002        1407 :                         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        2102 : 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        2102 :         lng t0 = 0;
    2030        2102 :         BAT *bn;
    2031        2102 :         BUN nils;
    2032        2102 :         struct canditer ci1, ci2;
    2033             : 
    2034        2102 :         TRC_DEBUG_IF(ALGO) t0 = GDKusec();
    2035             : 
    2036        2102 :         BATcheck(b1, NULL);
    2037        2102 :         BATcheck(b2, NULL);
    2038             : 
    2039        2102 :         canditer_init(&ci1, b1, s1);
    2040        2104 :         canditer_init(&ci2, b2, s2);
    2041        2103 :         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        2103 :         bn = COLnew(ci1.hseq, tp, ci1.ncand, TRANSIENT);
    2047        2104 :         if (bn == NULL)
    2048             :                 return NULL;
    2049        2104 :         if (ci1.ncand == 0)
    2050             :                 return bn;
    2051             : 
    2052        1781 :         BATiter b1i = bat_iterator(b1);
    2053        1779 :         BATiter b2i = bat_iterator(b2);
    2054        3557 :         nils = (*typeswitchloop)(b1i.base, b1i.type, true,
    2055        1779 :                                  b2i.base, b2i.type, true,
    2056        1779 :                                  Tloc(bn, 0), tp,
    2057             :                                  &ci1, &ci2, b1->hseqbase, b2->hseqbase, func);
    2058        1778 :         bat_iterator_end(&b1i);
    2059        1778 :         bat_iterator_end(&b2i);
    2060             : 
    2061        1780 :         if (nils >= BUN_NONE) {
    2062           5 :                 BBPunfix(bn->batCacheid);
    2063           5 :                 return NULL;
    2064             :         }
    2065             : 
    2066        1775 :         BATsetcount(bn, ci1.ncand);
    2067             : 
    2068        1775 :         bn->tsorted = ci1.ncand <= 1 || nils == ci1.ncand;
    2069        1775 :         bn->trevsorted = ci1.ncand <= 1 || nils == ci1.ncand;
    2070        1775 :         bn->tkey = ci1.ncand <= 1;
    2071        1775 :         bn->tnil = nils != 0;
    2072        1775 :         bn->tnonil = nils == 0;
    2073             : 
    2074        1775 :         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        1758 : BATcalcmul(BAT *b1, BAT *b2, BAT *s1, BAT *s2, int tp)
    2086             : {
    2087        1758 :         return BATcalcmuldivmod(b1, b2, s1, s2, tp,
    2088             :                                 mul_typeswitchloop, __func__);
    2089             : }
    2090             : 
    2091             : BAT *
    2092       43254 : BATcalcmulcst(BAT *b, const ValRecord *v, BAT *s, int tp)
    2093             : {
    2094       43254 :         lng t0 = 0;
    2095       43254 :         BAT *bn;
    2096       43254 :         BUN nils;
    2097       43254 :         struct canditer ci;
    2098             : 
    2099       43254 :         TRC_DEBUG_IF(ALGO) t0 = GDKusec();
    2100             : 
    2101       43254 :         BATcheck(b, NULL);
    2102             : 
    2103       43254 :         canditer_init(&ci, b, s);
    2104             : 
    2105       43276 :         bn = COLnew(ci.hseq, tp, ci.ncand, TRANSIENT);
    2106       43312 :         if (bn == NULL)
    2107             :                 return NULL;
    2108       43312 :         if (ci.ncand == 0)
    2109             :                 return bn;
    2110             : 
    2111       26483 :         BATiter bi = bat_iterator(b);
    2112       52871 :         nils = mul_typeswitchloop(bi.base, bi.type, true,
    2113       26489 :                                   VALptr(v), v->vtype, false,
    2114       26489 :                                   Tloc(bn, 0), tp,
    2115             :                                   &ci,
    2116       26489 :                                   &(struct canditer){.tpe=cand_dense, .ncand=ci.ncand},
    2117             :                                   b->hseqbase, 0, __func__);
    2118             : 
    2119       26382 :         if (nils == BUN_NONE) {
    2120           1 :                 BBPunfix(bn->batCacheid);
    2121           1 :                 bat_iterator_end(&bi);
    2122           1 :                 return NULL;
    2123             :         }
    2124             : 
    2125       26381 :         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       26383 :         ValRecord sign;
    2131             : 
    2132       26383 :         VARcalcsign(&sign, v);
    2133       26367 :         bn->tsorted = (sign.val.btval >= 0 && bi.sorted && nils == 0) ||
    2134          52 :                 (sign.val.btval <= 0 && bi.revsorted && nils == 0) ||
    2135       38596 :                 ci.ncand <= 1 || nils == ci.ncand;
    2136       26368 :         bn->trevsorted = (sign.val.btval >= 0 && bi.revsorted && nils == 0) ||
    2137          51 :                 (sign.val.btval <= 0 && bi.sorted && nils == 0) ||
    2138       46929 :                 ci.ncand <= 1 || nils == ci.ncand;
    2139       26345 :         bn->tkey = ci.ncand <= 1;
    2140       26345 :         bn->tnil = nils != 0;
    2141       26345 :         bn->tnonil = nils == 0;
    2142       26345 :         bat_iterator_end(&bi);
    2143             : 
    2144       26419 :         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          47 : BATcalccstmul(const ValRecord *v, BAT *b, BAT *s, int tp)
    2154             : {
    2155          47 :         lng t0 = 0;
    2156          47 :         BAT *bn;
    2157          47 :         BUN nils;
    2158          47 :         struct canditer ci;
    2159             : 
    2160          47 :         TRC_DEBUG_IF(ALGO) t0 = GDKusec();
    2161             : 
    2162          47 :         BATcheck(b, NULL);
    2163             : 
    2164          47 :         canditer_init(&ci, b, s);
    2165             : 
    2166          48 :         bn = COLnew(ci.hseq, tp, ci.ncand, TRANSIENT);
    2167          50 :         if (bn == NULL)
    2168             :                 return NULL;
    2169          50 :         if (ci.ncand == 0)
    2170             :                 return bn;
    2171             : 
    2172          31 :         BATiter bi = bat_iterator(b);
    2173          61 :         nils = mul_typeswitchloop(VALptr(v), v->vtype, false,
    2174          31 :                                   bi.base, bi.type, true,
    2175          31 :                                   Tloc(bn, 0), tp,
    2176          31 :                                   &(struct canditer){.tpe=cand_dense, .ncand=ci.ncand},
    2177             :                                   &ci,
    2178             :                                   0, b->hseqbase, __func__);
    2179             : 
    2180          30 :         if (nils == BUN_NONE) {
    2181           0 :                 BBPunfix(bn->batCacheid);
    2182           0 :                 bat_iterator_end(&bi);
    2183           0 :                 return NULL;
    2184             :         }
    2185             : 
    2186          30 :         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          29 :         ValRecord sign;
    2192             : 
    2193          29 :         VARcalcsign(&sign, v);
    2194          32 :         bn->tsorted = (sign.val.btval >= 0 && bi.sorted && nils == 0) ||
    2195           1 :                 (sign.val.btval <= 0 && bi.revsorted && nils == 0) ||
    2196          50 :                 ci.ncand <= 1 || nils == ci.ncand;
    2197          32 :         bn->trevsorted = (sign.val.btval >= 0 && bi.revsorted && nils == 0) ||
    2198           1 :                 (sign.val.btval <= 0 && bi.sorted && nils == 0) ||
    2199          53 :                 ci.ncand <= 1 || nils == ci.ncand;
    2200          31 :         bn->tkey = ci.ncand <= 1;
    2201          31 :         bn->tnil = nils != 0;
    2202          31 :         bn->tnonil = nils == 0;
    2203          31 :         bat_iterator_end(&bi);
    2204             : 
    2205          31 :         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       18362 : VARcalcmul(ValPtr ret, const ValRecord *lft, const ValRecord *rgt)
    2215             : {
    2216       18362 :         ret->bat = false;
    2217       18363 :         if (mul_typeswitchloop(VALptr(lft), lft->vtype, false,
    2218       18362 :                                VALptr(rgt), rgt->vtype, false,
    2219       18362 :                                VALget(ret), ret->vtype,
    2220       18362 :                                &(struct canditer){.tpe=cand_dense, .ncand=1},
    2221       18362 :                                &(struct canditer){.tpe=cand_dense, .ncand=1},
    2222             :                                0, 0, __func__) == BUN_NONE)
    2223         138 :                 return GDK_FAIL;
    2224       18225 :         return GDK_SUCCEED;
    2225             : }

Generated by: LCOV version 1.14