LCOV - code coverage report
Current view: top level - gdk - gdk_calc_addsub.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 395 1916 20.6 %
Date: 2024-04-25 20:03:45 Functions: 33 296 11.1 %

          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             : /* addition (any numeric type) */
      20             : 
      21             : #define ADD_3TYPE(TYPE1, TYPE2, TYPE3, IF)                              \
      22             : static BUN                                                              \
      23             : add_##TYPE1##_##TYPE2##_##TYPE3(const TYPE1 *lft, bool incr1,           \
      24             :                                 const TYPE2 *rgt, bool incr2,           \
      25             :                                 TYPE3 *restrict dst, TYPE3 max,         \
      26             :                                 struct canditer *restrict ci1,          \
      27             :                                 struct canditer *restrict ci2,          \
      28             :                                 oid candoff1, oid candoff2)             \
      29             : {                                                                       \
      30             :         BUN nils = 0;                                                   \
      31             :         BUN i = 0, j = 0, ncand = ci1->ncand;                                \
      32             :         lng timeoffset = 0;                                             \
      33             :         QryCtx *qry_ctx = MT_thread_get_qry_ctx();                      \
      34             :         if (qry_ctx != NULL) {                                          \
      35             :                 timeoffset = (qry_ctx->starttime && qry_ctx->querytimeout) ? (qry_ctx->starttime + qry_ctx->querytimeout) : 0; \
      36             :         }                                                               \
      37             :                                                                         \
      38             :         if (ci1->tpe == cand_dense && ci2->tpe == cand_dense) {           \
      39             :                 TIMEOUT_LOOP_IDX_DECL(k, ncand, timeoffset) {           \
      40             :                         if (incr1)                                      \
      41             :                                 i = canditer_next_dense(ci1) - candoff1; \
      42             :                         if (incr2)                                      \
      43             :                                 j = canditer_next_dense(ci2) - candoff2; \
      44             :                         if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
      45             :                                 dst[k] = TYPE3##_nil;                   \
      46             :                                 nils++;                                 \
      47             :                         } else {                                        \
      48             :                                 ADD##IF##_WITH_CHECK(lft[i], rgt[j],    \
      49             :                                                      TYPE3, dst[k],     \
      50             :                                                      max,               \
      51             :                                                      ON_OVERFLOW(TYPE1, TYPE2, "+")); \
      52             :                         }                                               \
      53             :                 }                                                       \
      54             :                 TIMEOUT_CHECK(timeoffset, TIMEOUT_HANDLER(BUN_NONE));   \
      55             :         } else {                                                        \
      56             :                 TIMEOUT_LOOP_IDX_DECL(k, ncand, timeoffset) {           \
      57             :                         if (incr1)                                      \
      58             :                                 i = canditer_next(ci1) - candoff1;      \
      59             :                         if (incr2)                                      \
      60             :                                 j = canditer_next(ci2) - candoff2;      \
      61             :                         if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
      62             :                                 dst[k] = TYPE3##_nil;                   \
      63             :                                 nils++;                                 \
      64             :                         } else {                                        \
      65             :                                 ADD##IF##_WITH_CHECK(lft[i], rgt[j],    \
      66             :                                                      TYPE3, dst[k],     \
      67             :                                                      max,               \
      68             :                                                      ON_OVERFLOW(TYPE1, TYPE2, "+")); \
      69             :                         }                                               \
      70             :                 }                                                       \
      71             :                 TIMEOUT_CHECK(timeoffset, TIMEOUT_HANDLER(BUN_NONE));   \
      72             :         }                                                               \
      73             :         return nils;                                                    \
      74             : }
      75             : 
      76             : #define ADD_3TYPE_enlarge(TYPE1, TYPE2, TYPE3, IF)                      \
      77             : static BUN                                                              \
      78             : add_##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             :         lng timeoffset = 0;                                             \
      89             :         QryCtx *qry_ctx = MT_thread_get_qry_ctx();                      \
      90             :         if (qry_ctx != NULL) {                                          \
      91             :                 timeoffset = (qry_ctx->starttime && qry_ctx->querytimeout) ? (qry_ctx->starttime + qry_ctx->querytimeout) : 0; \
      92             :         }                                                               \
      93             :                                                                         \
      94             :         if (ci1->tpe == cand_dense && ci2->tpe == cand_dense) {           \
      95             :                 TIMEOUT_LOOP_IDX_DECL(k, ncand, timeoffset) {           \
      96             :                         if (incr1)                                      \
      97             :                                 i = canditer_next_dense(ci1) - candoff1; \
      98             :                         if (incr2)                                      \
      99             :                                 j = canditer_next_dense(ci2) - candoff2; \
     100             :                         if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
     101             :                                 dst[k] = TYPE3##_nil;                   \
     102             :                                 nils++;                                 \
     103             :                         } else if (couldoverflow) {                     \
     104             :                                 ADD##IF##_WITH_CHECK(lft[i], rgt[j],    \
     105             :                                                      TYPE3, dst[k],     \
     106             :                                                      max,               \
     107             :                                                      ON_OVERFLOW(TYPE1, TYPE2, "+")); \
     108             :                         } else {                                        \
     109             :                                 dst[k] = (TYPE3) lft[i] + rgt[j];       \
     110             :                         }                                               \
     111             :                 }                                                       \
     112             :                 TIMEOUT_CHECK(timeoffset, TIMEOUT_HANDLER(BUN_NONE));   \
     113             :         } else {                                                        \
     114             :                 TIMEOUT_LOOP_IDX_DECL(k, ncand, timeoffset) {           \
     115             :                         if (incr1)                                      \
     116             :                                 i = canditer_next(ci1) - candoff1;      \
     117             :                         if (incr2)                                      \
     118             :                                 j = canditer_next(ci2) - candoff2;      \
     119             :                         if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
     120             :                                 dst[k] = TYPE3##_nil;                   \
     121             :                                 nils++;                                 \
     122             :                         } else if (couldoverflow) {                     \
     123             :                                 ADD##IF##_WITH_CHECK(lft[i], rgt[j],    \
     124             :                                                      TYPE3, dst[k],     \
     125             :                                                      max,               \
     126             :                                                      ON_OVERFLOW(TYPE1, TYPE2, "+")); \
     127             :                         } else {                                        \
     128             :                                 dst[k] = (TYPE3) lft[i] + rgt[j];       \
     129             :                         }                                               \
     130             :                 }                                                       \
     131             :                 TIMEOUT_CHECK(timeoffset, TIMEOUT_HANDLER(BUN_NONE));   \
     132             :         }                                                               \
     133             :         return nils;                                                    \
     134             : }
     135             : 
     136        2729 : ADD_3TYPE(bte, bte, bte, I)
     137           0 : ADD_3TYPE_enlarge(bte, bte, sht, I)
     138           0 : ADD_3TYPE_enlarge(bte, bte, int, I)
     139           0 : ADD_3TYPE_enlarge(bte, bte, lng, I)
     140             : #ifdef HAVE_HGE
     141           0 : ADD_3TYPE_enlarge(bte, bte, hge, I)
     142             : #endif
     143           0 : ADD_3TYPE_enlarge(bte, bte, flt, F)
     144           0 : ADD_3TYPE_enlarge(bte, bte, dbl, F)
     145           0 : ADD_3TYPE(bte, sht, sht, I)
     146           0 : ADD_3TYPE_enlarge(bte, sht, int, I)
     147           0 : ADD_3TYPE_enlarge(bte, sht, lng, I)
     148             : #ifdef HAVE_HGE
     149           0 : ADD_3TYPE_enlarge(bte, sht, hge, I)
     150             : #endif
     151           0 : ADD_3TYPE_enlarge(bte, sht, flt, F)
     152           0 : ADD_3TYPE_enlarge(bte, sht, dbl, F)
     153           0 : ADD_3TYPE(bte, int, int, I)
     154           0 : ADD_3TYPE_enlarge(bte, int, lng, I)
     155             : #ifdef HAVE_HGE
     156           0 : ADD_3TYPE_enlarge(bte, int, hge, I)
     157             : #endif
     158           0 : ADD_3TYPE_enlarge(bte, int, flt, F)
     159           0 : ADD_3TYPE_enlarge(bte, int, dbl, F)
     160           0 : ADD_3TYPE(bte, lng, lng, I)
     161             : #ifdef HAVE_HGE
     162           0 : ADD_3TYPE_enlarge(bte, lng, hge, I)
     163             : #endif
     164           0 : ADD_3TYPE_enlarge(bte, lng, flt, F)
     165           0 : ADD_3TYPE_enlarge(bte, lng, dbl, F)
     166             : #ifdef HAVE_HGE
     167           0 : ADD_3TYPE(bte, hge, hge, I)
     168           0 : ADD_3TYPE_enlarge(bte, hge, flt, F)
     169           0 : ADD_3TYPE_enlarge(bte, hge, dbl, F)
     170             : #endif
     171           0 : ADD_3TYPE(bte, flt, flt, F)
     172           0 : ADD_3TYPE_enlarge(bte, flt, dbl, F)
     173           0 : ADD_3TYPE(bte, dbl, dbl, F)
     174         292 : ADD_3TYPE(sht, bte, sht, I)
     175           0 : ADD_3TYPE_enlarge(sht, bte, int, I)
     176           0 : ADD_3TYPE_enlarge(sht, bte, lng, I)
     177             : #ifdef HAVE_HGE
     178           0 : ADD_3TYPE_enlarge(sht, bte, hge, I)
     179             : #endif
     180           0 : ADD_3TYPE_enlarge(sht, bte, flt, F)
     181           0 : ADD_3TYPE_enlarge(sht, bte, dbl, F)
     182        3017 : ADD_3TYPE(sht, sht, sht, I)
     183           0 : ADD_3TYPE_enlarge(sht, sht, int, I)
     184           0 : ADD_3TYPE_enlarge(sht, sht, lng, I)
     185             : #ifdef HAVE_HGE
     186           0 : ADD_3TYPE_enlarge(sht, sht, hge, I)
     187             : #endif
     188           0 : ADD_3TYPE_enlarge(sht, sht, flt, F)
     189           0 : ADD_3TYPE_enlarge(sht, sht, dbl, F)
     190           0 : ADD_3TYPE(sht, int, int, I)
     191           0 : ADD_3TYPE_enlarge(sht, int, lng, I)
     192             : #ifdef HAVE_HGE
     193           0 : ADD_3TYPE_enlarge(sht, int, hge, I)
     194             : #endif
     195           0 : ADD_3TYPE_enlarge(sht, int, flt, F)
     196           0 : ADD_3TYPE_enlarge(sht, int, dbl, F)
     197           0 : ADD_3TYPE(sht, lng, lng, I)
     198             : #ifdef HAVE_HGE
     199           0 : ADD_3TYPE_enlarge(sht, lng, hge, I)
     200             : #endif
     201           0 : ADD_3TYPE_enlarge(sht, lng, flt, F)
     202           0 : ADD_3TYPE_enlarge(sht, lng, dbl, F)
     203             : #ifdef HAVE_HGE
     204           0 : ADD_3TYPE(sht, hge, hge, I)
     205           0 : ADD_3TYPE_enlarge(sht, hge, flt, F)
     206           0 : ADD_3TYPE_enlarge(sht, hge, dbl, F)
     207             : #endif
     208           0 : ADD_3TYPE(sht, flt, flt, F)
     209           0 : ADD_3TYPE_enlarge(sht, flt, dbl, F)
     210           0 : ADD_3TYPE(sht, dbl, dbl, F)
     211       69440 : ADD_3TYPE(int, bte, int, I)
     212           0 : ADD_3TYPE_enlarge(int, bte, lng, I)
     213             : #ifdef HAVE_HGE
     214           0 : ADD_3TYPE_enlarge(int, bte, hge, I)
     215             : #endif
     216           0 : ADD_3TYPE_enlarge(int, bte, flt, F)
     217           0 : ADD_3TYPE_enlarge(int, bte, dbl, F)
     218           0 : ADD_3TYPE(int, sht, int, I)
     219           0 : ADD_3TYPE_enlarge(int, sht, lng, I)
     220             : #ifdef HAVE_HGE
     221           0 : ADD_3TYPE_enlarge(int, sht, hge, I)
     222             : #endif
     223           0 : ADD_3TYPE_enlarge(int, sht, flt, F)
     224           0 : ADD_3TYPE_enlarge(int, sht, dbl, F)
     225     6730177 : ADD_3TYPE(int, int, int, I)
     226           0 : ADD_3TYPE_enlarge(int, int, lng, I)
     227             : #ifdef HAVE_HGE
     228           0 : ADD_3TYPE_enlarge(int, int, hge, I)
     229             : #endif
     230           0 : ADD_3TYPE_enlarge(int, int, flt, F)
     231           0 : ADD_3TYPE_enlarge(int, int, dbl, F)
     232           0 : ADD_3TYPE(int, lng, lng, I)
     233             : #ifdef HAVE_HGE
     234           0 : ADD_3TYPE_enlarge(int, lng, hge, I)
     235             : #endif
     236           0 : ADD_3TYPE_enlarge(int, lng, flt, F)
     237           0 : ADD_3TYPE_enlarge(int, lng, dbl, F)
     238             : #ifdef HAVE_HGE
     239           0 : ADD_3TYPE(int, hge, hge, I)
     240           0 : ADD_3TYPE_enlarge(int, hge, flt, F)
     241           0 : ADD_3TYPE_enlarge(int, hge, dbl, F)
     242             : #endif
     243           0 : ADD_3TYPE(int, flt, flt, F)
     244           0 : ADD_3TYPE_enlarge(int, flt, dbl, F)
     245           0 : ADD_3TYPE(int, dbl, dbl, F)
     246         307 : ADD_3TYPE(lng, bte, lng, I)
     247             : #ifdef HAVE_HGE
     248           0 : ADD_3TYPE_enlarge(lng, bte, hge, I)
     249             : #endif
     250           0 : ADD_3TYPE_enlarge(lng, bte, flt, F)
     251           0 : ADD_3TYPE_enlarge(lng, bte, dbl, F)
     252           0 : ADD_3TYPE(lng, sht, lng, I)
     253             : #ifdef HAVE_HGE
     254           0 : ADD_3TYPE_enlarge(lng, sht, hge, I)
     255             : #endif
     256           0 : ADD_3TYPE_enlarge(lng, sht, flt, F)
     257           0 : ADD_3TYPE_enlarge(lng, sht, dbl, F)
     258          40 : ADD_3TYPE(lng, int, lng, I)
     259             : #ifdef HAVE_HGE
     260           0 : ADD_3TYPE_enlarge(lng, int, hge, I)
     261             : #endif
     262           0 : ADD_3TYPE_enlarge(lng, int, flt, F)
     263           0 : ADD_3TYPE_enlarge(lng, int, dbl, F)
     264    10837832 : ADD_3TYPE(lng, lng, lng, I)
     265             : #ifdef HAVE_HGE
     266           0 : ADD_3TYPE_enlarge(lng, lng, hge, I)
     267             : #endif
     268           0 : ADD_3TYPE_enlarge(lng, lng, flt, F)
     269           0 : ADD_3TYPE_enlarge(lng, lng, dbl, F)
     270             : #ifdef HAVE_HGE
     271           0 : ADD_3TYPE(lng, hge, hge, I)
     272           0 : ADD_3TYPE_enlarge(lng, hge, flt, F)
     273           0 : ADD_3TYPE_enlarge(lng, hge, dbl, F)
     274             : #endif
     275           0 : ADD_3TYPE(lng, flt, flt, F)
     276           0 : ADD_3TYPE_enlarge(lng, flt, dbl, F)
     277           0 : ADD_3TYPE(lng, dbl, dbl, F)
     278             : #ifdef HAVE_HGE
     279          12 : ADD_3TYPE(hge, bte, hge, I)
     280           0 : ADD_3TYPE_enlarge(hge, bte, flt, F)
     281           0 : ADD_3TYPE_enlarge(hge, bte, dbl, F)
     282           0 : ADD_3TYPE(hge, sht, hge, I)
     283           0 : ADD_3TYPE_enlarge(hge, sht, flt, F)
     284           0 : ADD_3TYPE_enlarge(hge, sht, dbl, F)
     285           0 : ADD_3TYPE(hge, int, hge, I)
     286           0 : ADD_3TYPE_enlarge(hge, int, flt, F)
     287           0 : ADD_3TYPE_enlarge(hge, int, dbl, F)
     288           0 : ADD_3TYPE(hge, lng, hge, I)
     289           0 : ADD_3TYPE_enlarge(hge, lng, flt, F)
     290           0 : ADD_3TYPE_enlarge(hge, lng, dbl, F)
     291      480198 : ADD_3TYPE(hge, hge, hge, I)
     292           0 : ADD_3TYPE_enlarge(hge, hge, flt, F)
     293           0 : ADD_3TYPE_enlarge(hge, hge, dbl, F)
     294           0 : ADD_3TYPE(hge, flt, flt, F)
     295           0 : ADD_3TYPE_enlarge(hge, flt, dbl, F)
     296           0 : ADD_3TYPE(hge, dbl, dbl, F)
     297             : #endif
     298           0 : ADD_3TYPE(flt, bte, flt, F)
     299           0 : ADD_3TYPE_enlarge(flt, bte, dbl, F)
     300           0 : ADD_3TYPE(flt, sht, flt, F)
     301           0 : ADD_3TYPE_enlarge(flt, sht, dbl, F)
     302           4 : ADD_3TYPE(flt, int, flt, F)
     303           0 : ADD_3TYPE_enlarge(flt, int, dbl, F)
     304           0 : ADD_3TYPE(flt, lng, flt, F)
     305           0 : ADD_3TYPE_enlarge(flt, lng, dbl, F)
     306             : #ifdef HAVE_HGE
     307           0 : ADD_3TYPE(flt, hge, flt, F)
     308           0 : ADD_3TYPE_enlarge(flt, hge, dbl, F)
     309             : #endif
     310     3410010 : ADD_3TYPE(flt, flt, flt, F)
     311           0 : ADD_3TYPE_enlarge(flt, flt, dbl, F)
     312           0 : ADD_3TYPE(flt, dbl, dbl, F)
     313           0 : ADD_3TYPE(dbl, bte, dbl, F)
     314           0 : ADD_3TYPE(dbl, sht, dbl, F)
     315           0 : ADD_3TYPE(dbl, int, dbl, F)
     316           0 : ADD_3TYPE(dbl, lng, dbl, F)
     317             : #ifdef HAVE_HGE
     318           0 : ADD_3TYPE(dbl, hge, dbl, F)
     319             : #endif
     320           0 : ADD_3TYPE(dbl, flt, dbl, F)
     321        3728 : ADD_3TYPE(dbl, dbl, dbl, F)
     322             : 
     323             : static BUN
     324      217915 : add_typeswitchloop(const void *lft, int tp1, bool incr1,
     325             :                    const void *rgt, int tp2, bool incr2,
     326             :                    void *restrict dst, int tp,
     327             :                    struct canditer *restrict ci1, struct canditer *restrict ci2,
     328             :                    oid candoff1, oid candoff2,
     329             :                    const char *func)
     330             : {
     331      217915 :         BUN nils;
     332             : 
     333      217915 :         tp1 = ATOMbasetype(tp1);
     334      217915 :         tp2 = ATOMbasetype(tp2);
     335      217915 :         tp = ATOMbasetype(tp);
     336      217915 :         switch (tp1) {
     337         678 :         case TYPE_bte:
     338         678 :                 switch (tp2) {
     339         678 :                 case TYPE_bte:
     340         678 :                         switch (tp) {
     341         678 :                         case TYPE_bte:
     342         678 :                                 nils = add_bte_bte_bte(lft, incr1, rgt, incr2,
     343             :                                                        dst, GDK_bte_max,
     344             :                                                        ci1, ci2, candoff1, candoff2);
     345         678 :                                 break;
     346           0 :                         case TYPE_sht:
     347           0 :                                 nils = add_bte_bte_sht(lft, incr1, rgt, incr2,
     348             :                                                        dst, GDK_sht_max,
     349             :                                                        ci1, ci2, candoff1, candoff2);
     350           0 :                                 break;
     351           0 :                         case TYPE_int:
     352           0 :                                 nils = add_bte_bte_int(lft, incr1, rgt, incr2,
     353             :                                                        dst, GDK_int_max,
     354             :                                                        ci1, ci2, candoff1, candoff2);
     355           0 :                                 break;
     356           0 :                         case TYPE_lng:
     357           0 :                                 nils = add_bte_bte_lng(lft, incr1, rgt, incr2,
     358             :                                                        dst, GDK_lng_max,
     359             :                                                        ci1, ci2, candoff1, candoff2);
     360           0 :                                 break;
     361             : #ifdef HAVE_HGE
     362           0 :                         case TYPE_hge:
     363           0 :                                 nils = add_bte_bte_hge(lft, incr1, rgt, incr2,
     364             :                                                        dst, GDK_hge_max,
     365             :                                                        ci1, ci2, candoff1, candoff2);
     366           0 :                                 break;
     367             : #endif
     368           0 :                         case TYPE_flt:
     369           0 :                                 nils = add_bte_bte_flt(lft, incr1, rgt, incr2,
     370             :                                                        dst, GDK_flt_max,
     371             :                                                        ci1, ci2, candoff1, candoff2);
     372           0 :                                 break;
     373           0 :                         case TYPE_dbl:
     374           0 :                                 nils = add_bte_bte_dbl(lft, incr1, rgt, incr2,
     375             :                                                        dst, GDK_dbl_max,
     376             :                                                        ci1, ci2, candoff1, candoff2);
     377           0 :                                 break;
     378           0 :                         default:
     379           0 :                                 goto unsupported;
     380             :                         }
     381             :                         break;
     382           0 :                 case TYPE_sht:
     383           0 :                         switch (tp) {
     384           0 :                         case TYPE_sht:
     385           0 :                                 nils = add_bte_sht_sht(lft, incr1, rgt, incr2,
     386             :                                                        dst, GDK_sht_max,
     387             :                                                        ci1, ci2, candoff1, candoff2);
     388           0 :                                 break;
     389           0 :                         case TYPE_int:
     390           0 :                                 nils = add_bte_sht_int(lft, incr1, rgt, incr2,
     391             :                                                        dst, GDK_int_max,
     392             :                                                        ci1, ci2, candoff1, candoff2);
     393           0 :                                 break;
     394           0 :                         case TYPE_lng:
     395           0 :                                 nils = add_bte_sht_lng(lft, incr1, rgt, incr2,
     396             :                                                        dst, GDK_lng_max,
     397             :                                                        ci1, ci2, candoff1, candoff2);
     398           0 :                                 break;
     399             : #ifdef HAVE_HGE
     400           0 :                         case TYPE_hge:
     401           0 :                                 nils = add_bte_sht_hge(lft, incr1, rgt, incr2,
     402             :                                                        dst, GDK_hge_max,
     403             :                                                        ci1, ci2, candoff1, candoff2);
     404           0 :                                 break;
     405             : #endif
     406           0 :                         case TYPE_flt:
     407           0 :                                 nils = add_bte_sht_flt(lft, incr1, rgt, incr2,
     408             :                                                        dst, GDK_flt_max,
     409             :                                                        ci1, ci2, candoff1, candoff2);
     410           0 :                                 break;
     411           0 :                         case TYPE_dbl:
     412           0 :                                 nils = add_bte_sht_dbl(lft, incr1, rgt, incr2,
     413             :                                                        dst, GDK_dbl_max,
     414             :                                                        ci1, ci2, candoff1, candoff2);
     415           0 :                                 break;
     416           0 :                         default:
     417           0 :                                 goto unsupported;
     418             :                         }
     419             :                         break;
     420           0 :                 case TYPE_int:
     421           0 :                         switch (tp) {
     422           0 :                         case TYPE_int:
     423           0 :                                 nils = add_bte_int_int(lft, incr1, rgt, incr2,
     424             :                                                        dst, GDK_int_max,
     425             :                                                        ci1, ci2, candoff1, candoff2);
     426           0 :                                 break;
     427           0 :                         case TYPE_lng:
     428           0 :                                 nils = add_bte_int_lng(lft, incr1, rgt, incr2,
     429             :                                                        dst, GDK_lng_max,
     430             :                                                        ci1, ci2, candoff1, candoff2);
     431           0 :                                 break;
     432             : #ifdef HAVE_HGE
     433           0 :                         case TYPE_hge:
     434           0 :                                 nils = add_bte_int_hge(lft, incr1, rgt, incr2,
     435             :                                                        dst, GDK_hge_max,
     436             :                                                        ci1, ci2, candoff1, candoff2);
     437           0 :                                 break;
     438             : #endif
     439           0 :                         case TYPE_flt:
     440           0 :                                 nils = add_bte_int_flt(lft, incr1, rgt, incr2,
     441             :                                                        dst, GDK_flt_max,
     442             :                                                        ci1, ci2, candoff1, candoff2);
     443           0 :                                 break;
     444           0 :                         case TYPE_dbl:
     445           0 :                                 nils = add_bte_int_dbl(lft, incr1, rgt, incr2,
     446             :                                                        dst, GDK_dbl_max,
     447             :                                                        ci1, ci2, candoff1, candoff2);
     448           0 :                                 break;
     449           0 :                         default:
     450           0 :                                 goto unsupported;
     451             :                         }
     452             :                         break;
     453           0 :                 case TYPE_lng:
     454           0 :                         switch (tp) {
     455           0 :                         case TYPE_lng:
     456           0 :                                 nils = add_bte_lng_lng(lft, incr1, rgt, incr2,
     457             :                                                        dst, GDK_lng_max,
     458             :                                                        ci1, ci2, candoff1, candoff2);
     459           0 :                                 break;
     460             : #ifdef HAVE_HGE
     461           0 :                         case TYPE_hge:
     462           0 :                                 nils = add_bte_lng_hge(lft, incr1, rgt, incr2,
     463             :                                                        dst, GDK_hge_max,
     464             :                                                        ci1, ci2, candoff1, candoff2);
     465           0 :                                 break;
     466             : #endif
     467           0 :                         case TYPE_flt:
     468           0 :                                 nils = add_bte_lng_flt(lft, incr1, rgt, incr2,
     469             :                                                        dst, GDK_flt_max,
     470             :                                                        ci1, ci2, candoff1, candoff2);
     471           0 :                                 break;
     472           0 :                         case TYPE_dbl:
     473           0 :                                 nils = add_bte_lng_dbl(lft, incr1, rgt, incr2,
     474             :                                                        dst, GDK_dbl_max,
     475             :                                                        ci1, ci2, candoff1, candoff2);
     476           0 :                                 break;
     477           0 :                         default:
     478           0 :                                 goto unsupported;
     479             :                         }
     480             :                         break;
     481             : #ifdef HAVE_HGE
     482           0 :                 case TYPE_hge:
     483           0 :                         switch (tp) {
     484           0 :                         case TYPE_hge:
     485           0 :                                 nils = add_bte_hge_hge(lft, incr1, rgt, incr2,
     486             :                                                        dst, GDK_hge_max,
     487             :                                                        ci1, ci2, candoff1, candoff2);
     488           0 :                                 break;
     489           0 :                         case TYPE_flt:
     490           0 :                                 nils = add_bte_hge_flt(lft, incr1, rgt, incr2,
     491             :                                                        dst, GDK_flt_max,
     492             :                                                        ci1, ci2, candoff1, candoff2);
     493           0 :                                 break;
     494           0 :                         case TYPE_dbl:
     495           0 :                                 nils = add_bte_hge_dbl(lft, incr1, rgt, incr2,
     496             :                                                        dst, GDK_dbl_max,
     497             :                                                        ci1, ci2, candoff1, candoff2);
     498           0 :                                 break;
     499           0 :                         default:
     500           0 :                                 goto unsupported;
     501             :                         }
     502             :                         break;
     503             : #endif
     504           0 :                 case TYPE_flt:
     505           0 :                         switch (tp) {
     506           0 :                         case TYPE_flt:
     507           0 :                                 nils = add_bte_flt_flt(lft, incr1, rgt, incr2,
     508             :                                                        dst, GDK_flt_max,
     509             :                                                        ci1, ci2, candoff1, candoff2);
     510           0 :                                 break;
     511           0 :                         case TYPE_dbl:
     512           0 :                                 nils = add_bte_flt_dbl(lft, incr1, rgt, incr2,
     513             :                                                        dst, GDK_dbl_max,
     514             :                                                        ci1, ci2, candoff1, candoff2);
     515           0 :                                 break;
     516           0 :                         default:
     517           0 :                                 goto unsupported;
     518             :                         }
     519             :                         break;
     520           0 :                 case TYPE_dbl:
     521           0 :                         switch (tp) {
     522           0 :                         case TYPE_dbl:
     523           0 :                                 nils = add_bte_dbl_dbl(lft, incr1, rgt, incr2,
     524             :                                                        dst, GDK_dbl_max,
     525             :                                                        ci1, ci2, candoff1, candoff2);
     526           0 :                                 break;
     527           0 :                         default:
     528           0 :                                 goto unsupported;
     529             :                         }
     530           0 :                         break;
     531           0 :                 default:
     532           0 :                         goto unsupported;
     533             :                 }
     534             :                 break;
     535         689 :         case TYPE_sht:
     536         689 :                 switch (tp2) {
     537          73 :                 case TYPE_bte:
     538          73 :                         switch (tp) {
     539          73 :                         case TYPE_sht:
     540          73 :                                 nils = add_sht_bte_sht(lft, incr1, rgt, incr2,
     541             :                                                        dst, GDK_sht_max,
     542             :                                                        ci1, ci2, candoff1, candoff2);
     543          73 :                                 break;
     544           0 :                         case TYPE_int:
     545           0 :                                 nils = add_sht_bte_int(lft, incr1, rgt, incr2,
     546             :                                                        dst, GDK_int_max,
     547             :                                                        ci1, ci2, candoff1, candoff2);
     548           0 :                                 break;
     549           0 :                         case TYPE_lng:
     550           0 :                                 nils = add_sht_bte_lng(lft, incr1, rgt, incr2,
     551             :                                                        dst, GDK_lng_max,
     552             :                                                        ci1, ci2, candoff1, candoff2);
     553           0 :                                 break;
     554             : #ifdef HAVE_HGE
     555           0 :                         case TYPE_hge:
     556           0 :                                 nils = add_sht_bte_hge(lft, incr1, rgt, incr2,
     557             :                                                        dst, GDK_hge_max,
     558             :                                                        ci1, ci2, candoff1, candoff2);
     559           0 :                                 break;
     560             : #endif
     561           0 :                         case TYPE_flt:
     562           0 :                                 nils = add_sht_bte_flt(lft, incr1, rgt, incr2,
     563             :                                                        dst, GDK_flt_max,
     564             :                                                        ci1, ci2, candoff1, candoff2);
     565           0 :                                 break;
     566           0 :                         case TYPE_dbl:
     567           0 :                                 nils = add_sht_bte_dbl(lft, incr1, rgt, incr2,
     568             :                                                        dst, GDK_dbl_max,
     569             :                                                        ci1, ci2, candoff1, candoff2);
     570           0 :                                 break;
     571           0 :                         default:
     572           0 :                                 goto unsupported;
     573             :                         }
     574             :                         break;
     575         616 :                 case TYPE_sht:
     576         616 :                         switch (tp) {
     577         616 :                         case TYPE_sht:
     578         616 :                                 nils = add_sht_sht_sht(lft, incr1, rgt, incr2,
     579             :                                                        dst, GDK_sht_max,
     580             :                                                        ci1, ci2, candoff1, candoff2);
     581         616 :                                 break;
     582           0 :                         case TYPE_int:
     583           0 :                                 nils = add_sht_sht_int(lft, incr1, rgt, incr2,
     584             :                                                        dst, GDK_int_max,
     585             :                                                        ci1, ci2, candoff1, candoff2);
     586           0 :                                 break;
     587           0 :                         case TYPE_lng:
     588           0 :                                 nils = add_sht_sht_lng(lft, incr1, rgt, incr2,
     589             :                                                        dst, GDK_lng_max,
     590             :                                                        ci1, ci2, candoff1, candoff2);
     591           0 :                                 break;
     592             : #ifdef HAVE_HGE
     593           0 :                         case TYPE_hge:
     594           0 :                                 nils = add_sht_sht_hge(lft, incr1, rgt, incr2,
     595             :                                                        dst, GDK_hge_max,
     596             :                                                        ci1, ci2, candoff1, candoff2);
     597           0 :                                 break;
     598             : #endif
     599           0 :                         case TYPE_flt:
     600           0 :                                 nils = add_sht_sht_flt(lft, incr1, rgt, incr2,
     601             :                                                        dst, GDK_flt_max,
     602             :                                                        ci1, ci2, candoff1, candoff2);
     603           0 :                                 break;
     604           0 :                         case TYPE_dbl:
     605           0 :                                 nils = add_sht_sht_dbl(lft, incr1, rgt, incr2,
     606             :                                                        dst, GDK_dbl_max,
     607             :                                                        ci1, ci2, candoff1, candoff2);
     608           0 :                                 break;
     609           0 :                         default:
     610           0 :                                 goto unsupported;
     611             :                         }
     612             :                         break;
     613           0 :                 case TYPE_int:
     614           0 :                         switch (tp) {
     615           0 :                         case TYPE_int:
     616           0 :                                 nils = add_sht_int_int(lft, incr1, rgt, incr2,
     617             :                                                        dst, GDK_int_max,
     618             :                                                        ci1, ci2, candoff1, candoff2);
     619           0 :                                 break;
     620           0 :                         case TYPE_lng:
     621           0 :                                 nils = add_sht_int_lng(lft, incr1, rgt, incr2,
     622             :                                                        dst, GDK_lng_max,
     623             :                                                        ci1, ci2, candoff1, candoff2);
     624           0 :                                 break;
     625             : #ifdef HAVE_HGE
     626           0 :                         case TYPE_hge:
     627           0 :                                 nils = add_sht_int_hge(lft, incr1, rgt, incr2,
     628             :                                                        dst, GDK_hge_max,
     629             :                                                        ci1, ci2, candoff1, candoff2);
     630           0 :                                 break;
     631             : #endif
     632           0 :                         case TYPE_flt:
     633           0 :                                 nils = add_sht_int_flt(lft, incr1, rgt, incr2,
     634             :                                                        dst, GDK_flt_max,
     635             :                                                        ci1, ci2, candoff1, candoff2);
     636           0 :                                 break;
     637           0 :                         case TYPE_dbl:
     638           0 :                                 nils = add_sht_int_dbl(lft, incr1, rgt, incr2,
     639             :                                                        dst, GDK_dbl_max,
     640             :                                                        ci1, ci2, candoff1, candoff2);
     641           0 :                                 break;
     642           0 :                         default:
     643           0 :                                 goto unsupported;
     644             :                         }
     645             :                         break;
     646           0 :                 case TYPE_lng:
     647           0 :                         switch (tp) {
     648           0 :                         case TYPE_lng:
     649           0 :                                 nils = add_sht_lng_lng(lft, incr1, rgt, incr2,
     650             :                                                        dst, GDK_lng_max,
     651             :                                                        ci1, ci2, candoff1, candoff2);
     652           0 :                                 break;
     653             : #ifdef HAVE_HGE
     654           0 :                         case TYPE_hge:
     655           0 :                                 nils = add_sht_lng_hge(lft, incr1, rgt, incr2,
     656             :                                                        dst, GDK_hge_max,
     657             :                                                        ci1, ci2, candoff1, candoff2);
     658           0 :                                 break;
     659             : #endif
     660           0 :                         case TYPE_flt:
     661           0 :                                 nils = add_sht_lng_flt(lft, incr1, rgt, incr2,
     662             :                                                        dst, GDK_flt_max,
     663             :                                                        ci1, ci2, candoff1, candoff2);
     664           0 :                                 break;
     665           0 :                         case TYPE_dbl:
     666           0 :                                 nils = add_sht_lng_dbl(lft, incr1, rgt, incr2,
     667             :                                                        dst, GDK_dbl_max,
     668             :                                                        ci1, ci2, candoff1, candoff2);
     669           0 :                                 break;
     670           0 :                         default:
     671           0 :                                 goto unsupported;
     672             :                         }
     673             :                         break;
     674             : #ifdef HAVE_HGE
     675           0 :                 case TYPE_hge:
     676           0 :                         switch (tp) {
     677           0 :                         case TYPE_hge:
     678           0 :                                 nils = add_sht_hge_hge(lft, incr1, rgt, incr2,
     679             :                                                        dst, GDK_hge_max,
     680             :                                                        ci1, ci2, candoff1, candoff2);
     681           0 :                                 break;
     682           0 :                         case TYPE_flt:
     683           0 :                                 nils = add_sht_hge_flt(lft, incr1, rgt, incr2,
     684             :                                                        dst, GDK_flt_max,
     685             :                                                        ci1, ci2, candoff1, candoff2);
     686           0 :                                 break;
     687           0 :                         case TYPE_dbl:
     688           0 :                                 nils = add_sht_hge_dbl(lft, incr1, rgt, incr2,
     689             :                                                        dst, GDK_dbl_max,
     690             :                                                        ci1, ci2, candoff1, candoff2);
     691           0 :                                 break;
     692           0 :                         default:
     693           0 :                                 goto unsupported;
     694             :                         }
     695             :                         break;
     696             : #endif
     697           0 :                 case TYPE_flt:
     698           0 :                         switch (tp) {
     699           0 :                         case TYPE_flt:
     700           0 :                                 nils = add_sht_flt_flt(lft, incr1, rgt, incr2,
     701             :                                                        dst, GDK_flt_max,
     702             :                                                        ci1, ci2, candoff1, candoff2);
     703           0 :                                 break;
     704           0 :                         case TYPE_dbl:
     705           0 :                                 nils = add_sht_flt_dbl(lft, incr1, rgt, incr2,
     706             :                                                        dst, GDK_dbl_max,
     707             :                                                        ci1, ci2, candoff1, candoff2);
     708           0 :                                 break;
     709           0 :                         default:
     710           0 :                                 goto unsupported;
     711             :                         }
     712             :                         break;
     713           0 :                 case TYPE_dbl:
     714           0 :                         switch (tp) {
     715           0 :                         case TYPE_dbl:
     716           0 :                                 nils = add_sht_dbl_dbl(lft, incr1, rgt, incr2,
     717             :                                                        dst, GDK_dbl_max,
     718             :                                                        ci1, ci2, candoff1, candoff2);
     719           0 :                                 break;
     720           0 :                         default:
     721           0 :                                 goto unsupported;
     722             :                         }
     723           0 :                         break;
     724           0 :                 default:
     725           0 :                         goto unsupported;
     726             :                 }
     727             :                 break;
     728      132121 :         case TYPE_int:
     729      132121 :                 switch (tp2) {
     730       17360 :                 case TYPE_bte:
     731       17360 :                         switch (tp) {
     732       17360 :                         case TYPE_int:
     733       17360 :                                 nils = add_int_bte_int(lft, incr1, rgt, incr2,
     734             :                                                        dst, GDK_int_max,
     735             :                                                        ci1, ci2, candoff1, candoff2);
     736       17360 :                                 break;
     737           0 :                         case TYPE_lng:
     738           0 :                                 nils = add_int_bte_lng(lft, incr1, rgt, incr2,
     739             :                                                        dst, GDK_lng_max,
     740             :                                                        ci1, ci2, candoff1, candoff2);
     741           0 :                                 break;
     742             : #ifdef HAVE_HGE
     743           0 :                         case TYPE_hge:
     744           0 :                                 nils = add_int_bte_hge(lft, incr1, rgt, incr2,
     745             :                                                        dst, GDK_hge_max,
     746             :                                                        ci1, ci2, candoff1, candoff2);
     747           0 :                                 break;
     748             : #endif
     749           0 :                         case TYPE_flt:
     750           0 :                                 nils = add_int_bte_flt(lft, incr1, rgt, incr2,
     751             :                                                        dst, GDK_flt_max,
     752             :                                                        ci1, ci2, candoff1, candoff2);
     753           0 :                                 break;
     754           0 :                         case TYPE_dbl:
     755           0 :                                 nils = add_int_bte_dbl(lft, incr1, rgt, incr2,
     756             :                                                        dst, GDK_dbl_max,
     757             :                                                        ci1, ci2, candoff1, candoff2);
     758           0 :                                 break;
     759           0 :                         default:
     760           0 :                                 goto unsupported;
     761             :                         }
     762             :                         break;
     763           0 :                 case TYPE_sht:
     764           0 :                         switch (tp) {
     765           0 :                         case TYPE_int:
     766           0 :                                 nils = add_int_sht_int(lft, incr1, rgt, incr2,
     767             :                                                        dst, GDK_int_max,
     768             :                                                        ci1, ci2, candoff1, candoff2);
     769           0 :                                 break;
     770           0 :                         case TYPE_lng:
     771           0 :                                 nils = add_int_sht_lng(lft, incr1, rgt, incr2,
     772             :                                                        dst, GDK_lng_max,
     773             :                                                        ci1, ci2, candoff1, candoff2);
     774           0 :                                 break;
     775             : #ifdef HAVE_HGE
     776           0 :                         case TYPE_hge:
     777           0 :                                 nils = add_int_sht_hge(lft, incr1, rgt, incr2,
     778             :                                                        dst, GDK_hge_max,
     779             :                                                        ci1, ci2, candoff1, candoff2);
     780           0 :                                 break;
     781             : #endif
     782           0 :                         case TYPE_flt:
     783           0 :                                 nils = add_int_sht_flt(lft, incr1, rgt, incr2,
     784             :                                                        dst, GDK_flt_max,
     785             :                                                        ci1, ci2, candoff1, candoff2);
     786           0 :                                 break;
     787           0 :                         case TYPE_dbl:
     788           0 :                                 nils = add_int_sht_dbl(lft, incr1, rgt, incr2,
     789             :                                                        dst, GDK_dbl_max,
     790             :                                                        ci1, ci2, candoff1, candoff2);
     791           0 :                                 break;
     792           0 :                         default:
     793           0 :                                 goto unsupported;
     794             :                         }
     795             :                         break;
     796      114761 :                 case TYPE_int:
     797      114761 :                         switch (tp) {
     798      114761 :                         case TYPE_int:
     799      114761 :                                 nils = add_int_int_int(lft, incr1, rgt, incr2,
     800             :                                                        dst, GDK_int_max,
     801             :                                                        ci1, ci2, candoff1, candoff2);
     802      114761 :                                 break;
     803           0 :                         case TYPE_lng:
     804           0 :                                 nils = add_int_int_lng(lft, incr1, rgt, incr2,
     805             :                                                        dst, GDK_lng_max,
     806             :                                                        ci1, ci2, candoff1, candoff2);
     807           0 :                                 break;
     808             : #ifdef HAVE_HGE
     809           0 :                         case TYPE_hge:
     810           0 :                                 nils = add_int_int_hge(lft, incr1, rgt, incr2,
     811             :                                                        dst, GDK_hge_max,
     812             :                                                        ci1, ci2, candoff1, candoff2);
     813           0 :                                 break;
     814             : #endif
     815           0 :                         case TYPE_flt:
     816           0 :                                 nils = add_int_int_flt(lft, incr1, rgt, incr2,
     817             :                                                        dst, GDK_flt_max,
     818             :                                                        ci1, ci2, candoff1, candoff2);
     819           0 :                                 break;
     820           0 :                         case TYPE_dbl:
     821           0 :                                 nils = add_int_int_dbl(lft, incr1, rgt, incr2,
     822             :                                                        dst, GDK_dbl_max,
     823             :                                                        ci1, ci2, candoff1, candoff2);
     824           0 :                                 break;
     825           0 :                         default:
     826           0 :                                 goto unsupported;
     827             :                         }
     828             :                         break;
     829           0 :                 case TYPE_lng:
     830           0 :                         switch (tp) {
     831           0 :                         case TYPE_lng:
     832           0 :                                 nils = add_int_lng_lng(lft, incr1, rgt, incr2,
     833             :                                                        dst, GDK_lng_max,
     834             :                                                        ci1, ci2, candoff1, candoff2);
     835           0 :                                 break;
     836             : #ifdef HAVE_HGE
     837           0 :                         case TYPE_hge:
     838           0 :                                 nils = add_int_lng_hge(lft, incr1, rgt, incr2,
     839             :                                                        dst, GDK_hge_max,
     840             :                                                        ci1, ci2, candoff1, candoff2);
     841           0 :                                 break;
     842             : #endif
     843           0 :                         case TYPE_flt:
     844           0 :                                 nils = add_int_lng_flt(lft, incr1, rgt, incr2,
     845             :                                                        dst, GDK_flt_max,
     846             :                                                        ci1, ci2, candoff1, candoff2);
     847           0 :                                 break;
     848           0 :                         case TYPE_dbl:
     849           0 :                                 nils = add_int_lng_dbl(lft, incr1, rgt, incr2,
     850             :                                                        dst, GDK_dbl_max,
     851             :                                                        ci1, ci2, candoff1, candoff2);
     852           0 :                                 break;
     853           0 :                         default:
     854           0 :                                 goto unsupported;
     855             :                         }
     856             :                         break;
     857             : #ifdef HAVE_HGE
     858           0 :                 case TYPE_hge:
     859           0 :                         switch (tp) {
     860           0 :                         case TYPE_hge:
     861           0 :                                 nils = add_int_hge_hge(lft, incr1, rgt, incr2,
     862             :                                                        dst, GDK_hge_max,
     863             :                                                        ci1, ci2, candoff1, candoff2);
     864           0 :                                 break;
     865           0 :                         case TYPE_flt:
     866           0 :                                 nils = add_int_hge_flt(lft, incr1, rgt, incr2,
     867             :                                                        dst, GDK_flt_max,
     868             :                                                        ci1, ci2, candoff1, candoff2);
     869           0 :                                 break;
     870           0 :                         case TYPE_dbl:
     871           0 :                                 nils = add_int_hge_dbl(lft, incr1, rgt, incr2,
     872             :                                                        dst, GDK_dbl_max,
     873             :                                                        ci1, ci2, candoff1, candoff2);
     874           0 :                                 break;
     875           0 :                         default:
     876           0 :                                 goto unsupported;
     877             :                         }
     878             :                         break;
     879             : #endif
     880           0 :                 case TYPE_flt:
     881           0 :                         switch (tp) {
     882           0 :                         case TYPE_flt:
     883           0 :                                 nils = add_int_flt_flt(lft, incr1, rgt, incr2,
     884             :                                                        dst, GDK_flt_max,
     885             :                                                        ci1, ci2, candoff1, candoff2);
     886           0 :                                 break;
     887           0 :                         case TYPE_dbl:
     888           0 :                                 nils = add_int_flt_dbl(lft, incr1, rgt, incr2,
     889             :                                                        dst, GDK_dbl_max,
     890             :                                                        ci1, ci2, candoff1, candoff2);
     891           0 :                                 break;
     892           0 :                         default:
     893           0 :                                 goto unsupported;
     894             :                         }
     895             :                         break;
     896           0 :                 case TYPE_dbl:
     897           0 :                         switch (tp) {
     898           0 :                         case TYPE_dbl:
     899           0 :                                 nils = add_int_dbl_dbl(lft, incr1, rgt, incr2,
     900             :                                                        dst, GDK_dbl_max,
     901             :                                                        ci1, ci2, candoff1, candoff2);
     902           0 :                                 break;
     903           0 :                         default:
     904           0 :                                 goto unsupported;
     905             :                         }
     906           0 :                         break;
     907           0 :                 default:
     908           0 :                         goto unsupported;
     909             :                 }
     910             :                 break;
     911       67358 :         case TYPE_lng:
     912       67358 :                 switch (tp2) {
     913          77 :                 case TYPE_bte:
     914          77 :                         switch (tp) {
     915          77 :                         case TYPE_lng:
     916          77 :                                 nils = add_lng_bte_lng(lft, incr1, rgt, incr2,
     917             :                                                        dst, GDK_lng_max,
     918             :                                                        ci1, ci2, candoff1, candoff2);
     919          77 :                                 break;
     920             : #ifdef HAVE_HGE
     921           0 :                         case TYPE_hge:
     922           0 :                                 nils = add_lng_bte_hge(lft, incr1, rgt, incr2,
     923             :                                                        dst, GDK_hge_max,
     924             :                                                        ci1, ci2, candoff1, candoff2);
     925           0 :                                 break;
     926             : #endif
     927           0 :                         case TYPE_flt:
     928           0 :                                 nils = add_lng_bte_flt(lft, incr1, rgt, incr2,
     929             :                                                        dst, GDK_flt_max,
     930             :                                                        ci1, ci2, candoff1, candoff2);
     931           0 :                                 break;
     932           0 :                         case TYPE_dbl:
     933           0 :                                 nils = add_lng_bte_dbl(lft, incr1, rgt, incr2,
     934             :                                                        dst, GDK_dbl_max,
     935             :                                                        ci1, ci2, candoff1, candoff2);
     936           0 :                                 break;
     937           0 :                         default:
     938           0 :                                 goto unsupported;
     939             :                         }
     940             :                         break;
     941           0 :                 case TYPE_sht:
     942           0 :                         switch (tp) {
     943           0 :                         case TYPE_lng:
     944           0 :                                 nils = add_lng_sht_lng(lft, incr1, rgt, incr2,
     945             :                                                        dst, GDK_lng_max,
     946             :                                                        ci1, ci2, candoff1, candoff2);
     947           0 :                                 break;
     948             : #ifdef HAVE_HGE
     949           0 :                         case TYPE_hge:
     950           0 :                                 nils = add_lng_sht_hge(lft, incr1, rgt, incr2,
     951             :                                                        dst, GDK_hge_max,
     952             :                                                        ci1, ci2, candoff1, candoff2);
     953           0 :                                 break;
     954             : #endif
     955           0 :                         case TYPE_flt:
     956           0 :                                 nils = add_lng_sht_flt(lft, incr1, rgt, incr2,
     957             :                                                        dst, GDK_flt_max,
     958             :                                                        ci1, ci2, candoff1, candoff2);
     959           0 :                                 break;
     960           0 :                         case TYPE_dbl:
     961           0 :                                 nils = add_lng_sht_dbl(lft, incr1, rgt, incr2,
     962             :                                                        dst, GDK_dbl_max,
     963             :                                                        ci1, ci2, candoff1, candoff2);
     964           0 :                                 break;
     965           0 :                         default:
     966           0 :                                 goto unsupported;
     967             :                         }
     968             :                         break;
     969          10 :                 case TYPE_int:
     970          10 :                         switch (tp) {
     971          10 :                         case TYPE_lng:
     972          10 :                                 nils = add_lng_int_lng(lft, incr1, rgt, incr2,
     973             :                                                        dst, GDK_lng_max,
     974             :                                                        ci1, ci2, candoff1, candoff2);
     975          10 :                                 break;
     976             : #ifdef HAVE_HGE
     977           0 :                         case TYPE_hge:
     978           0 :                                 nils = add_lng_int_hge(lft, incr1, rgt, incr2,
     979             :                                                        dst, GDK_hge_max,
     980             :                                                        ci1, ci2, candoff1, candoff2);
     981           0 :                                 break;
     982             : #endif
     983           0 :                         case TYPE_flt:
     984           0 :                                 nils = add_lng_int_flt(lft, incr1, rgt, incr2,
     985             :                                                        dst, GDK_flt_max,
     986             :                                                        ci1, ci2, candoff1, candoff2);
     987           0 :                                 break;
     988           0 :                         case TYPE_dbl:
     989           0 :                                 nils = add_lng_int_dbl(lft, incr1, rgt, incr2,
     990             :                                                        dst, GDK_dbl_max,
     991             :                                                        ci1, ci2, candoff1, candoff2);
     992           0 :                                 break;
     993           0 :                         default:
     994           0 :                                 goto unsupported;
     995             :                         }
     996             :                         break;
     997       67271 :                 case TYPE_lng:
     998       67271 :                         switch (tp) {
     999       67271 :                         case TYPE_lng:
    1000       67271 :                                 nils = add_lng_lng_lng(lft, incr1, rgt, incr2,
    1001             :                                                        dst, GDK_lng_max,
    1002             :                                                        ci1, ci2, candoff1, candoff2);
    1003       67271 :                                 break;
    1004             : #ifdef HAVE_HGE
    1005           0 :                         case TYPE_hge:
    1006           0 :                                 nils = add_lng_lng_hge(lft, incr1, rgt, incr2,
    1007             :                                                        dst, GDK_hge_max,
    1008             :                                                        ci1, ci2, candoff1, candoff2);
    1009           0 :                                 break;
    1010             : #endif
    1011           0 :                         case TYPE_flt:
    1012           0 :                                 nils = add_lng_lng_flt(lft, incr1, rgt, incr2,
    1013             :                                                        dst, GDK_flt_max,
    1014             :                                                        ci1, ci2, candoff1, candoff2);
    1015           0 :                                 break;
    1016           0 :                         case TYPE_dbl:
    1017           0 :                                 nils = add_lng_lng_dbl(lft, incr1, rgt, incr2,
    1018             :                                                        dst, GDK_dbl_max,
    1019             :                                                        ci1, ci2, candoff1, candoff2);
    1020           0 :                                 break;
    1021           0 :                         default:
    1022           0 :                                 goto unsupported;
    1023             :                         }
    1024             :                         break;
    1025             : #ifdef HAVE_HGE
    1026           0 :                 case TYPE_hge:
    1027           0 :                         switch (tp) {
    1028           0 :                         case TYPE_hge:
    1029           0 :                                 nils = add_lng_hge_hge(lft, incr1, rgt, incr2,
    1030             :                                                        dst, GDK_hge_max,
    1031             :                                                        ci1, ci2, candoff1, candoff2);
    1032           0 :                                 break;
    1033           0 :                         case TYPE_flt:
    1034           0 :                                 nils = add_lng_hge_flt(lft, incr1, rgt, incr2,
    1035             :                                                        dst, GDK_flt_max,
    1036             :                                                        ci1, ci2, candoff1, candoff2);
    1037           0 :                                 break;
    1038           0 :                         case TYPE_dbl:
    1039           0 :                                 nils = add_lng_hge_dbl(lft, incr1, rgt, incr2,
    1040             :                                                        dst, GDK_dbl_max,
    1041             :                                                        ci1, ci2, candoff1, candoff2);
    1042           0 :                                 break;
    1043           0 :                         default:
    1044           0 :                                 goto unsupported;
    1045             :                         }
    1046             :                         break;
    1047             : #endif
    1048           0 :                 case TYPE_flt:
    1049           0 :                         switch (tp) {
    1050           0 :                         case TYPE_flt:
    1051           0 :                                 nils = add_lng_flt_flt(lft, incr1, rgt, incr2,
    1052             :                                                        dst, GDK_flt_max,
    1053             :                                                        ci1, ci2, candoff1, candoff2);
    1054           0 :                                 break;
    1055           0 :                         case TYPE_dbl:
    1056           0 :                                 nils = add_lng_flt_dbl(lft, incr1, rgt, incr2,
    1057             :                                                        dst, GDK_dbl_max,
    1058             :                                                        ci1, ci2, candoff1, candoff2);
    1059           0 :                                 break;
    1060           0 :                         default:
    1061           0 :                                 goto unsupported;
    1062             :                         }
    1063             :                         break;
    1064           0 :                 case TYPE_dbl:
    1065           0 :                         switch (tp) {
    1066           0 :                         case TYPE_dbl:
    1067           0 :                                 nils = add_lng_dbl_dbl(lft, incr1, rgt, incr2,
    1068             :                                                        dst, GDK_dbl_max,
    1069             :                                                        ci1, ci2, candoff1, candoff2);
    1070           0 :                                 break;
    1071           0 :                         default:
    1072           0 :                                 goto unsupported;
    1073             :                         }
    1074           0 :                         break;
    1075           0 :                 default:
    1076           0 :                         goto unsupported;
    1077             :                 }
    1078             :                 break;
    1079             : #ifdef HAVE_HGE
    1080       16907 :         case TYPE_hge:
    1081       16907 :                 switch (tp2) {
    1082           3 :                 case TYPE_bte:
    1083           3 :                         switch (tp) {
    1084           3 :                         case TYPE_hge:
    1085           3 :                                 nils = add_hge_bte_hge(lft, incr1, rgt, incr2,
    1086             :                                                        dst, GDK_hge_max,
    1087             :                                                        ci1, ci2, candoff1, candoff2);
    1088           3 :                                 break;
    1089           0 :                         case TYPE_flt:
    1090           0 :                                 nils = add_hge_bte_flt(lft, incr1, rgt, incr2,
    1091             :                                                        dst, GDK_flt_max,
    1092             :                                                        ci1, ci2, candoff1, candoff2);
    1093           0 :                                 break;
    1094           0 :                         case TYPE_dbl:
    1095           0 :                                 nils = add_hge_bte_dbl(lft, incr1, rgt, incr2,
    1096             :                                                        dst, GDK_dbl_max,
    1097             :                                                        ci1, ci2, candoff1, candoff2);
    1098           0 :                                 break;
    1099           0 :                         default:
    1100           0 :                                 goto unsupported;
    1101             :                         }
    1102             :                         break;
    1103           0 :                 case TYPE_sht:
    1104           0 :                         switch (tp) {
    1105           0 :                         case TYPE_hge:
    1106           0 :                                 nils = add_hge_sht_hge(lft, incr1, rgt, incr2,
    1107             :                                                        dst, GDK_hge_max,
    1108             :                                                        ci1, ci2, candoff1, candoff2);
    1109           0 :                                 break;
    1110           0 :                         case TYPE_flt:
    1111           0 :                                 nils = add_hge_sht_flt(lft, incr1, rgt, incr2,
    1112             :                                                        dst, GDK_flt_max,
    1113             :                                                        ci1, ci2, candoff1, candoff2);
    1114           0 :                                 break;
    1115           0 :                         case TYPE_dbl:
    1116           0 :                                 nils = add_hge_sht_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 :                 case TYPE_int:
    1125           0 :                         switch (tp) {
    1126           0 :                         case TYPE_hge:
    1127           0 :                                 nils = add_hge_int_hge(lft, incr1, rgt, incr2,
    1128             :                                                        dst, GDK_hge_max,
    1129             :                                                        ci1, ci2, candoff1, candoff2);
    1130           0 :                                 break;
    1131           0 :                         case TYPE_flt:
    1132           0 :                                 nils = add_hge_int_flt(lft, incr1, rgt, incr2,
    1133             :                                                        dst, GDK_flt_max,
    1134             :                                                        ci1, ci2, candoff1, candoff2);
    1135           0 :                                 break;
    1136           0 :                         case TYPE_dbl:
    1137           0 :                                 nils = add_hge_int_dbl(lft, incr1, rgt, incr2,
    1138             :                                                        dst, GDK_dbl_max,
    1139             :                                                        ci1, ci2, candoff1, candoff2);
    1140           0 :                                 break;
    1141           0 :                         default:
    1142           0 :                                 goto unsupported;
    1143             :                         }
    1144             :                         break;
    1145           0 :                 case TYPE_lng:
    1146           0 :                         switch (tp) {
    1147           0 :                         case TYPE_hge:
    1148           0 :                                 nils = add_hge_lng_hge(lft, incr1, rgt, incr2,
    1149             :                                                        dst, GDK_hge_max,
    1150             :                                                        ci1, ci2, candoff1, candoff2);
    1151           0 :                                 break;
    1152           0 :                         case TYPE_flt:
    1153           0 :                                 nils = add_hge_lng_flt(lft, incr1, rgt, incr2,
    1154             :                                                        dst, GDK_flt_max,
    1155             :                                                        ci1, ci2, candoff1, candoff2);
    1156           0 :                                 break;
    1157           0 :                         case TYPE_dbl:
    1158           0 :                                 nils = add_hge_lng_dbl(lft, incr1, rgt, incr2,
    1159             :                                                        dst, GDK_dbl_max,
    1160             :                                                        ci1, ci2, candoff1, candoff2);
    1161           0 :                                 break;
    1162           0 :                         default:
    1163           0 :                                 goto unsupported;
    1164             :                         }
    1165             :                         break;
    1166       16904 :                 case TYPE_hge:
    1167       16904 :                         switch (tp) {
    1168       16904 :                         case TYPE_hge:
    1169       16904 :                                 nils = add_hge_hge_hge(lft, incr1, rgt, incr2,
    1170             :                                                        dst, GDK_hge_max,
    1171             :                                                        ci1, ci2, candoff1, candoff2);
    1172       16904 :                                 break;
    1173           0 :                         case TYPE_flt:
    1174           0 :                                 nils = add_hge_hge_flt(lft, incr1, rgt, incr2,
    1175             :                                                        dst, GDK_flt_max,
    1176             :                                                        ci1, ci2, candoff1, candoff2);
    1177           0 :                                 break;
    1178           0 :                         case TYPE_dbl:
    1179           0 :                                 nils = add_hge_hge_dbl(lft, incr1, rgt, incr2,
    1180             :                                                        dst, GDK_dbl_max,
    1181             :                                                        ci1, ci2, candoff1, candoff2);
    1182           0 :                                 break;
    1183           0 :                         default:
    1184           0 :                                 goto unsupported;
    1185             :                         }
    1186             :                         break;
    1187           0 :                 case TYPE_flt:
    1188           0 :                         switch (tp) {
    1189           0 :                         case TYPE_flt:
    1190           0 :                                 nils = add_hge_flt_flt(lft, incr1, rgt, incr2,
    1191             :                                                        dst, GDK_flt_max,
    1192             :                                                        ci1, ci2, candoff1, candoff2);
    1193           0 :                                 break;
    1194           0 :                         case TYPE_dbl:
    1195           0 :                                 nils = add_hge_flt_dbl(lft, incr1, rgt, incr2,
    1196             :                                                        dst, GDK_dbl_max,
    1197             :                                                        ci1, ci2, candoff1, candoff2);
    1198           0 :                                 break;
    1199           0 :                         default:
    1200           0 :                                 goto unsupported;
    1201             :                         }
    1202             :                         break;
    1203           0 :                 case TYPE_dbl:
    1204           0 :                         switch (tp) {
    1205           0 :                         case TYPE_dbl:
    1206           0 :                                 nils = add_hge_dbl_dbl(lft, incr1, rgt, incr2,
    1207             :                                                        dst, GDK_dbl_max,
    1208             :                                                        ci1, ci2, candoff1, candoff2);
    1209           0 :                                 break;
    1210           0 :                         default:
    1211           0 :                                 goto unsupported;
    1212             :                         }
    1213           0 :                         break;
    1214           0 :                 default:
    1215           0 :                         goto unsupported;
    1216             :                 }
    1217             :                 break;
    1218             : #endif
    1219          53 :         case TYPE_flt:
    1220          53 :                 switch (tp2) {
    1221           0 :                 case TYPE_bte:
    1222           0 :                         switch (tp) {
    1223           0 :                         case TYPE_flt:
    1224           0 :                                 nils = add_flt_bte_flt(lft, incr1, rgt, incr2,
    1225             :                                                        dst, GDK_flt_max,
    1226             :                                                        ci1, ci2, candoff1, candoff2);
    1227           0 :                                 break;
    1228           0 :                         case TYPE_dbl:
    1229           0 :                                 nils = add_flt_bte_dbl(lft, incr1, rgt, incr2,
    1230             :                                                        dst, GDK_dbl_max,
    1231             :                                                        ci1, ci2, candoff1, candoff2);
    1232           0 :                                 break;
    1233           0 :                         default:
    1234           0 :                                 goto unsupported;
    1235             :                         }
    1236             :                         break;
    1237           0 :                 case TYPE_sht:
    1238           0 :                         switch (tp) {
    1239           0 :                         case TYPE_flt:
    1240           0 :                                 nils = add_flt_sht_flt(lft, incr1, rgt, incr2,
    1241             :                                                        dst, GDK_flt_max,
    1242             :                                                        ci1, ci2, candoff1, candoff2);
    1243           0 :                                 break;
    1244           0 :                         case TYPE_dbl:
    1245           0 :                                 nils = add_flt_sht_dbl(lft, incr1, rgt, incr2,
    1246             :                                                        dst, GDK_dbl_max,
    1247             :                                                        ci1, ci2, candoff1, candoff2);
    1248           0 :                                 break;
    1249           0 :                         default:
    1250           0 :                                 goto unsupported;
    1251             :                         }
    1252             :                         break;
    1253           1 :                 case TYPE_int:
    1254           1 :                         switch (tp) {
    1255           1 :                         case TYPE_flt:
    1256           1 :                                 nils = add_flt_int_flt(lft, incr1, rgt, incr2,
    1257             :                                                        dst, GDK_flt_max,
    1258             :                                                        ci1, ci2, candoff1, candoff2);
    1259           1 :                                 break;
    1260           0 :                         case TYPE_dbl:
    1261           0 :                                 nils = add_flt_int_dbl(lft, incr1, rgt, incr2,
    1262             :                                                        dst, GDK_dbl_max,
    1263             :                                                        ci1, ci2, candoff1, candoff2);
    1264           0 :                                 break;
    1265           0 :                         default:
    1266           0 :                                 goto unsupported;
    1267             :                         }
    1268             :                         break;
    1269           0 :                 case TYPE_lng:
    1270           0 :                         switch (tp) {
    1271           0 :                         case TYPE_flt:
    1272           0 :                                 nils = add_flt_lng_flt(lft, incr1, rgt, incr2,
    1273             :                                                        dst, GDK_flt_max,
    1274             :                                                        ci1, ci2, candoff1, candoff2);
    1275           0 :                                 break;
    1276           0 :                         case TYPE_dbl:
    1277           0 :                                 nils = add_flt_lng_dbl(lft, incr1, rgt, incr2,
    1278             :                                                        dst, GDK_dbl_max,
    1279             :                                                        ci1, ci2, candoff1, candoff2);
    1280           0 :                                 break;
    1281           0 :                         default:
    1282           0 :                                 goto unsupported;
    1283             :                         }
    1284             :                         break;
    1285             : #ifdef HAVE_HGE
    1286           0 :                 case TYPE_hge:
    1287           0 :                         switch (tp) {
    1288           0 :                         case TYPE_flt:
    1289           0 :                                 nils = add_flt_hge_flt(lft, incr1, rgt, incr2,
    1290             :                                                        dst, GDK_flt_max,
    1291             :                                                        ci1, ci2, candoff1, candoff2);
    1292           0 :                                 break;
    1293           0 :                         case TYPE_dbl:
    1294           0 :                                 nils = add_flt_hge_dbl(lft, incr1, rgt, incr2,
    1295             :                                                        dst, GDK_dbl_max,
    1296             :                                                        ci1, ci2, candoff1, candoff2);
    1297           0 :                                 break;
    1298           0 :                         default:
    1299           0 :                                 goto unsupported;
    1300             :                         }
    1301             :                         break;
    1302             : #endif
    1303          52 :                 case TYPE_flt:
    1304          52 :                         switch (tp) {
    1305          52 :                         case TYPE_flt:
    1306          52 :                                 nils = add_flt_flt_flt(lft, incr1, rgt, incr2,
    1307             :                                                        dst, GDK_flt_max,
    1308             :                                                        ci1, ci2, candoff1, candoff2);
    1309          52 :                                 break;
    1310           0 :                         case TYPE_dbl:
    1311           0 :                                 nils = add_flt_flt_dbl(lft, incr1, rgt, incr2,
    1312             :                                                        dst, GDK_dbl_max,
    1313             :                                                        ci1, ci2, candoff1, candoff2);
    1314           0 :                                 break;
    1315           0 :                         default:
    1316           0 :                                 goto unsupported;
    1317             :                         }
    1318             :                         break;
    1319           0 :                 case TYPE_dbl:
    1320           0 :                         switch (tp) {
    1321           0 :                         case TYPE_dbl:
    1322           0 :                                 nils = add_flt_dbl_dbl(lft, incr1, rgt, incr2,
    1323             :                                                        dst, GDK_dbl_max,
    1324             :                                                        ci1, ci2, candoff1, candoff2);
    1325           0 :                                 break;
    1326           0 :                         default:
    1327           0 :                                 goto unsupported;
    1328             :                         }
    1329           0 :                         break;
    1330           0 :                 default:
    1331           0 :                         goto unsupported;
    1332             :                 }
    1333             :                 break;
    1334         109 :         case TYPE_dbl:
    1335         109 :                 switch (tp2) {
    1336           0 :                 case TYPE_bte:
    1337           0 :                         switch (tp) {
    1338           0 :                         case TYPE_dbl:
    1339           0 :                                 nils = add_dbl_bte_dbl(lft, incr1, rgt, incr2,
    1340             :                                                        dst, GDK_dbl_max,
    1341             :                                                        ci1, ci2, candoff1, candoff2);
    1342           0 :                                 break;
    1343           0 :                         default:
    1344           0 :                                 goto unsupported;
    1345             :                         }
    1346           0 :                         break;
    1347           0 :                 case TYPE_sht:
    1348           0 :                         switch (tp) {
    1349           0 :                         case TYPE_dbl:
    1350           0 :                                 nils = add_dbl_sht_dbl(lft, incr1, rgt, incr2,
    1351             :                                                        dst, GDK_dbl_max,
    1352             :                                                        ci1, ci2, candoff1, candoff2);
    1353           0 :                                 break;
    1354           0 :                         default:
    1355           0 :                                 goto unsupported;
    1356             :                         }
    1357           0 :                         break;
    1358           0 :                 case TYPE_int:
    1359           0 :                         switch (tp) {
    1360           0 :                         case TYPE_dbl:
    1361           0 :                                 nils = add_dbl_int_dbl(lft, incr1, rgt, incr2,
    1362             :                                                        dst, GDK_dbl_max,
    1363             :                                                        ci1, ci2, candoff1, candoff2);
    1364           0 :                                 break;
    1365           0 :                         default:
    1366           0 :                                 goto unsupported;
    1367             :                         }
    1368           0 :                         break;
    1369           0 :                 case TYPE_lng:
    1370           0 :                         switch (tp) {
    1371           0 :                         case TYPE_dbl:
    1372           0 :                                 nils = add_dbl_lng_dbl(lft, incr1, rgt, incr2,
    1373             :                                                        dst, GDK_dbl_max,
    1374             :                                                        ci1, ci2, candoff1, candoff2);
    1375           0 :                                 break;
    1376           0 :                         default:
    1377           0 :                                 goto unsupported;
    1378             :                         }
    1379           0 :                         break;
    1380             : #ifdef HAVE_HGE
    1381           0 :                 case TYPE_hge:
    1382           0 :                         switch (tp) {
    1383           0 :                         case TYPE_dbl:
    1384           0 :                                 nils = add_dbl_hge_dbl(lft, incr1, rgt, incr2,
    1385             :                                                        dst, GDK_dbl_max,
    1386             :                                                        ci1, ci2, candoff1, candoff2);
    1387           0 :                                 break;
    1388           0 :                         default:
    1389           0 :                                 goto unsupported;
    1390             :                         }
    1391           0 :                         break;
    1392             : #endif
    1393           0 :                 case TYPE_flt:
    1394           0 :                         switch (tp) {
    1395           0 :                         case TYPE_dbl:
    1396           0 :                                 nils = add_dbl_flt_dbl(lft, incr1, rgt, incr2,
    1397             :                                                        dst, GDK_dbl_max,
    1398             :                                                        ci1, ci2, candoff1, candoff2);
    1399           0 :                                 break;
    1400           0 :                         default:
    1401           0 :                                 goto unsupported;
    1402             :                         }
    1403           0 :                         break;
    1404         109 :                 case TYPE_dbl:
    1405         109 :                         switch (tp) {
    1406         109 :                         case TYPE_dbl:
    1407         109 :                                 nils = add_dbl_dbl_dbl(lft, incr1, rgt, incr2,
    1408             :                                                        dst, GDK_dbl_max,
    1409             :                                                        ci1, ci2, candoff1, candoff2);
    1410         109 :                                 break;
    1411           0 :                         default:
    1412           0 :                                 goto unsupported;
    1413             :                         }
    1414         109 :                         break;
    1415           0 :                 default:
    1416           0 :                         goto unsupported;
    1417             :                 }
    1418             :                 break;
    1419           0 :         default:
    1420           0 :                 goto unsupported;
    1421             :         }
    1422             : 
    1423             :         return nils;
    1424             : 
    1425           0 :   unsupported:
    1426           0 :         GDKerror("%s: type combination (add(%s,%s)->%s) not supported.\n",
    1427             :                  func, ATOMname(tp1), ATOMname(tp2), ATOMname(tp));
    1428           0 :         return BUN_NONE;
    1429             : }
    1430             : 
    1431             : static BUN
    1432        1001 : addstr_loop(BAT *b1, const char *l, BAT *b2, const char *r, BAT *bn,
    1433             :             BATiter *b1i, BATiter *b2i,
    1434             :             struct canditer *restrict ci1, struct canditer *restrict ci2)
    1435             : {
    1436        1001 :         BUN nils = 0, ncand = ci1->ncand;
    1437        1001 :         char *s;
    1438        1001 :         size_t slen, llen, rlen;
    1439        1001 :         oid candoff1, candoff2;
    1440             : 
    1441        1001 :         lng timeoffset = 0;
    1442        1001 :         QryCtx *qry_ctx = MT_thread_get_qry_ctx();
    1443        1001 :         if (qry_ctx != NULL) {
    1444        1001 :                 timeoffset = (qry_ctx->starttime && qry_ctx->querytimeout) ? (qry_ctx->starttime + qry_ctx->querytimeout) : 0;
    1445             :         }
    1446             : 
    1447        1001 :         assert(b1 != NULL || b2 != NULL); /* at least one not NULL */
    1448        1001 :         candoff1 = b1 ? b1->hseqbase : 0;
    1449        1001 :         candoff2 = b2 ? b2->hseqbase : 0;
    1450        1001 :         slen = 1024;
    1451        1001 :         s = GDKmalloc(slen);
    1452        1001 :         if (s == NULL)
    1453             :                 return BUN_NONE;
    1454    12171756 :         TIMEOUT_LOOP_IDX_DECL(i, ncand, timeoffset) {
    1455    12168025 :                 oid x1 = canditer_next(ci1) - candoff1;
    1456    12094075 :                 oid x2 = canditer_next(ci2) - candoff2;
    1457    11959143 :                 if (b1)
    1458     4454851 :                         l = BUNtvar(*b1i, x1);
    1459    11965266 :                 if (b2)
    1460     8688839 :                         r = BUNtvar(*b2i, x2);
    1461    23826126 :                 if (strNil(l) || strNil(r)) {
    1462         409 :                         nils++;
    1463         409 :                         if (tfastins_nocheckVAR(bn, i, str_nil) != GDK_SUCCEED)
    1464           0 :                                 goto bailout;
    1465             :                 } else {
    1466    11912850 :                         llen = strlen(l);
    1467    11912850 :                         rlen = strlen(r);
    1468    11912850 :                         if (llen + rlen >= slen) {
    1469           0 :                                 slen = llen + rlen + 1024;
    1470           0 :                                 GDKfree(s);
    1471           0 :                                 s = GDKmalloc(slen);
    1472           0 :                                 if (s == NULL)
    1473           0 :                                         goto bailout;
    1474             :                         }
    1475    11912850 :                         (void) stpcpy(stpcpy(s, l), r);
    1476    11912850 :                         if (tfastins_nocheckVAR(bn, i, s) != GDK_SUCCEED)
    1477           0 :                                 goto bailout;
    1478             :                 }
    1479             :         }
    1480        1001 :         TIMEOUT_CHECK(timeoffset,
    1481             :                       GOTO_LABEL_TIMEOUT_HANDLER(bailout));
    1482        1001 :         GDKfree(s);
    1483        1001 :         bn->theap->dirty = true;
    1484        1001 :         return nils;
    1485             : 
    1486           0 :   bailout:
    1487           0 :         GDKfree(s);
    1488           0 :         return BUN_NONE;
    1489             : }
    1490             : 
    1491             : BAT *
    1492       40512 : BATcalcadd(BAT *b1, BAT *b2, BAT *s1, BAT *s2, int tp)
    1493             : {
    1494       40512 :         lng t0 = 0;
    1495       40512 :         BAT *bn;
    1496       40512 :         BUN nils;
    1497       40512 :         struct canditer ci1, ci2;
    1498             : 
    1499       40512 :         TRC_DEBUG_IF(ALGO) t0 = GDKusec();
    1500             : 
    1501       40512 :         BATcheck(b1, NULL);
    1502       40512 :         BATcheck(b2, NULL);
    1503             : 
    1504       40512 :         canditer_init(&ci1, b1, s1);
    1505       40512 :         canditer_init(&ci2, b2, s2);
    1506       40511 :         if (ci1.ncand != ci2.ncand || ci1.hseq != ci2.hseq) {
    1507           0 :                 GDKerror("inputs not the same size.\n");
    1508           0 :                 return NULL;
    1509             :         }
    1510             : 
    1511       40511 :         bn = COLnew(ci1.hseq, tp, ci1.ncand, TRANSIENT);
    1512       40512 :         if (bn == NULL)
    1513             :                 return NULL;
    1514       40512 :         if (ci1.ncand == 0)
    1515             :                 return bn;
    1516             : 
    1517       31306 :         BATiter b1i = bat_iterator(b1);
    1518       31306 :         BATiter b2i = bat_iterator(b2);
    1519       31303 :         if (b1i.type == TYPE_str && b2i.type == TYPE_str && tp == TYPE_str) {
    1520         296 :                 nils = addstr_loop(b1, NULL, b2, NULL, bn, &b1i, &b2i, &ci1, &ci2);
    1521             :         } else {
    1522       31007 :                 nils = add_typeswitchloop(b1i.base, b1i.type, true,
    1523       31007 :                                           b2i.base, b2i.type, true,
    1524       31007 :                                           Tloc(bn, 0), tp,
    1525             :                                           &ci1, &ci2,
    1526             :                                           b1->hseqbase, b2->hseqbase, __func__);
    1527             :         }
    1528             : 
    1529       31303 :         if (nils == BUN_NONE) {
    1530           0 :                 BBPunfix(bn->batCacheid);
    1531           0 :                 bat_iterator_end(&b1i);
    1532           0 :                 bat_iterator_end(&b2i);
    1533           0 :                 return NULL;
    1534             :         }
    1535             : 
    1536       31303 :         BATsetcount(bn, ci1.ncand);
    1537             : 
    1538             :         /* if both inputs are sorted the same way, and no overflow
    1539             :          * occurred, the result is also sorted */
    1540       12272 :         bn->tsorted = (b1i.sorted && b2i.sorted && nils == 0)
    1541       32206 :                 || ci1.ncand <= 1 || nils == ci1.ncand;
    1542        4567 :         bn->trevsorted = (b1i.revsorted && b2i.revsorted && nils == 0)
    1543       31934 :                 || ci1.ncand <= 1 || nils == ci1.ncand;
    1544       31302 :         bn->tkey = ci1.ncand <= 1;
    1545       31302 :         bn->tnil = nils != 0;
    1546       31302 :         bn->tnonil = nils == 0;
    1547       31302 :         bat_iterator_end(&b1i);
    1548       31303 :         bat_iterator_end(&b2i);
    1549             : 
    1550       31304 :         TRC_DEBUG(ALGO, "b1=" ALGOBATFMT ",b2=" ALGOBATFMT
    1551             :                   ",s1=" ALGOOPTBATFMT ",s2=" ALGOOPTBATFMT
    1552             :                   " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
    1553             :                   ALGOBATPAR(b1), ALGOBATPAR(b2),
    1554             :                   ALGOOPTBATPAR(s1), ALGOOPTBATPAR(s2),
    1555             :                   ALGOOPTBATPAR(bn), GDKusec() - t0);
    1556             : 
    1557             :         return bn;
    1558             : }
    1559             : 
    1560             : BAT *
    1561       30809 : BATcalcaddcst(BAT *b, const ValRecord *v, BAT *s, int tp)
    1562             : {
    1563       30809 :         lng t0 = 0;
    1564       30809 :         BAT *bn;
    1565       30809 :         BUN nils;
    1566       30809 :         struct canditer ci;
    1567             : 
    1568       30809 :         TRC_DEBUG_IF(ALGO) t0 = GDKusec();
    1569             : 
    1570       30809 :         BATcheck(b, NULL);
    1571             : 
    1572       30809 :         canditer_init(&ci, b, s);
    1573             : 
    1574       30808 :         bn = COLnew(ci.hseq, tp, ci.ncand, TRANSIENT);
    1575       30809 :         if (bn == NULL)
    1576             :                 return NULL;
    1577       30809 :         if (ci.ncand == 0)
    1578             :                 return bn;
    1579             : 
    1580       18561 :         BATiter bi = bat_iterator(b);
    1581       18559 :         if (bi.type == TYPE_str && v->vtype == TYPE_str && tp == TYPE_str) {
    1582         423 :                 nils = addstr_loop(b, NULL, NULL, v->val.sval, bn, &bi, &(BATiter){0}, &ci, &(struct canditer){.tpe=cand_dense, .ncand=ci.ncand});
    1583             :         } else {
    1584       18136 :                 nils = add_typeswitchloop(bi.base, bi.type, true,
    1585       18136 :                                           VALptr(v), v->vtype, false,
    1586       18136 :                                           Tloc(bn, 0), tp,
    1587             :                                           &ci,
    1588       18136 :                                           &(struct canditer){.tpe=cand_dense, .ncand=ci.ncand},
    1589             :                                           b->hseqbase, 0, __func__);
    1590             :         }
    1591             : 
    1592       18559 :         if (nils == BUN_NONE) {
    1593           0 :                 bat_iterator_end(&bi);
    1594           0 :                 BBPunfix(bn->batCacheid);
    1595           0 :                 return NULL;
    1596             :         }
    1597             : 
    1598       18559 :         BATsetcount(bn, ci.ncand);
    1599             : 
    1600             :         /* if the input is sorted, and no overflow occurred, the result
    1601             :          * is also sorted */
    1602        6692 :         bn->tsorted = (bi.sorted && nils == 0 && bi.type != TYPE_str) ||
    1603       18757 :                 ci.ncand <= 1 || nils == ci.ncand;
    1604        2706 :         bn->trevsorted = (bi.revsorted && nils == 0 && bi.type != TYPE_str) ||
    1605       18692 :                 ci.ncand <= 1 || nils == ci.ncand;
    1606       18560 :         bn->tkey = ci.ncand <= 1;
    1607       18560 :         bn->tnil = nils != 0;
    1608       18560 :         bn->tnonil = nils == 0;
    1609       18560 :         bat_iterator_end(&bi);
    1610             : 
    1611       18561 :         TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
    1612             :                   " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
    1613             :                   ALGOBATPAR(b), ALGOOPTBATPAR(s),
    1614             :                   ALGOOPTBATPAR(bn), GDKusec() - t0);
    1615             : 
    1616             :         return bn;
    1617             : }
    1618             : 
    1619             : BAT *
    1620         591 : BATcalccstadd(const ValRecord *v, BAT *b, BAT *s, int tp)
    1621             : {
    1622         591 :         lng t0 = 0;
    1623         591 :         BAT *bn;
    1624         591 :         BUN nils;
    1625         591 :         struct canditer ci;
    1626             : 
    1627         591 :         TRC_DEBUG_IF(ALGO) t0 = GDKusec();
    1628             : 
    1629         591 :         BATcheck(b, NULL);
    1630             : 
    1631         591 :         canditer_init(&ci, b, s);
    1632             : 
    1633         591 :         bn = COLnew(ci.hseq, tp, ci.ncand, TRANSIENT);
    1634         591 :         if (bn == NULL)
    1635             :                 return NULL;
    1636         591 :         if (ci.ncand == 0)
    1637             :                 return bn;
    1638             : 
    1639         288 :         BATiter bi = bat_iterator(b);
    1640         288 :         if (bi.type == TYPE_str && v->vtype == TYPE_str && tp == TYPE_str) {
    1641         282 :                 nils = addstr_loop(NULL, v->val.sval, b, NULL, bn, &(BATiter){0}, &bi, &(struct canditer){.tpe=cand_dense, .ncand=ci.ncand}, &ci);
    1642             :         } else {
    1643           6 :                 nils = add_typeswitchloop(VALptr(v), v->vtype, false,
    1644           6 :                                           bi.base, bi.type, true,
    1645           6 :                                           Tloc(bn, 0), tp,
    1646           6 :                                           &(struct canditer){.tpe=cand_dense, .ncand=ci.ncand},
    1647             :                                           &ci,
    1648             :                                           0, b->hseqbase, __func__);
    1649             :         }
    1650             : 
    1651         288 :         if (nils == BUN_NONE) {
    1652           0 :                 bat_iterator_end(&bi);
    1653           0 :                 BBPunfix(bn->batCacheid);
    1654           0 :                 return NULL;
    1655             :         }
    1656             : 
    1657         288 :         BATsetcount(bn, ci.ncand);
    1658             : 
    1659             :         /* if the input is sorted, and no overflow occurred, the result
    1660             :          * is also sorted */
    1661          87 :         bn->tsorted = (bi.sorted && nils == 0) ||
    1662         289 :                 ci.ncand <= 1 || nils == ci.ncand;
    1663          75 :         bn->trevsorted = (bi.revsorted && nils == 0) ||
    1664         289 :                 ci.ncand <= 1 || nils == ci.ncand;
    1665         288 :         bn->tkey = ci.ncand <= 1;
    1666         288 :         bn->tnil = nils != 0;
    1667         288 :         bn->tnonil = nils == 0;
    1668         288 :         bat_iterator_end(&bi);
    1669             : 
    1670         288 :         TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
    1671             :                   " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
    1672             :                   ALGOBATPAR(b), ALGOOPTBATPAR(s),
    1673             :                   ALGOOPTBATPAR(bn), GDKusec() - t0);
    1674             : 
    1675             :         return bn;
    1676             : }
    1677             : 
    1678             : gdk_return
    1679      150882 : VARcalcadd(ValPtr ret, const ValRecord *lft, const ValRecord *rgt)
    1680             : {
    1681      150880 :         if (add_typeswitchloop(VALptr(lft), lft->vtype, false,
    1682      150882 :                                VALptr(rgt), rgt->vtype, false,
    1683             :                                VALget(ret), ret->vtype,
    1684      150882 :                                &(struct canditer){.tpe=cand_dense, .ncand=1},
    1685      150882 :                                &(struct canditer){.tpe=cand_dense, .ncand=1},
    1686             :                                0, 0, __func__) == BUN_NONE)
    1687           0 :                 return GDK_FAIL;
    1688      150880 :         return GDK_SUCCEED;
    1689             : }
    1690             : 
    1691             : static BAT *
    1692           0 : BATcalcincrdecr(BAT *b, BAT *s,
    1693             :                 BUN (*typeswitchloop)(const void *, int, bool,
    1694             :                                       const void *, int, bool,
    1695             :                                       void *, int,
    1696             :                                       struct canditer *restrict,
    1697             :                                       struct canditer *restrict,
    1698             :                                       oid, oid, const char *),
    1699             :                 const char *func)
    1700             : {
    1701           0 :         lng t0 = 0;
    1702           0 :         BAT *bn;
    1703           0 :         BUN nils= 0;
    1704           0 :         struct canditer ci;
    1705             : 
    1706           0 :         TRC_DEBUG_IF(ALGO) t0 = GDKusec();
    1707             : 
    1708           0 :         BATcheck(b, NULL);
    1709             : 
    1710           0 :         canditer_init(&ci, b, s);
    1711             : 
    1712           0 :         bn = COLnew(ci.hseq, b->ttype, ci.ncand, TRANSIENT);
    1713           0 :         if (bn == NULL)
    1714             :                 return NULL;
    1715           0 :         if (ci.ncand == 0)
    1716             :                 return bn;
    1717             : 
    1718           0 :         BATiter bi = bat_iterator(b);
    1719           0 :         nils = (*typeswitchloop)(bi.base, bi.type, true,
    1720           0 :                                  &(bte){1}, TYPE_bte, false,
    1721           0 :                                  Tloc(bn, 0), bn->ttype,
    1722           0 :                                  &(struct canditer){.tpe=cand_dense, .ncand=1},
    1723             :                                  &ci,
    1724             :                                  0, b->hseqbase, func);
    1725             : 
    1726           0 :         if (nils == BUN_NONE) {
    1727           0 :                 bat_iterator_end(&bi);
    1728           0 :                 BBPunfix(bn->batCacheid);
    1729           0 :                 return NULL;
    1730             :         }
    1731             : 
    1732           0 :         BATsetcount(bn, ci.ncand);
    1733             : 
    1734             :         /* if the input is sorted, and no overflow occurred, the result
    1735             :          * is also sorted */
    1736           0 :         bn->tsorted = bi.sorted || ci.ncand <= 1 || nils == ci.ncand;
    1737           0 :         bn->trevsorted = bi.revsorted || ci.ncand <= 1 || nils == ci.ncand;
    1738           0 :         bn->tkey = ci.ncand <= 1;
    1739           0 :         bn->tnil = nils != 0;
    1740           0 :         bn->tnonil = nils == 0;
    1741           0 :         bat_iterator_end(&bi);
    1742             : 
    1743           0 :         TRC_DEBUG(ALGO, "%s: b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
    1744             :                   " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
    1745             :                   func, ALGOBATPAR(b), ALGOOPTBATPAR(s),
    1746             :                   ALGOOPTBATPAR(bn), GDKusec() - t0);
    1747             : 
    1748             :         return bn;
    1749             : }
    1750             : 
    1751             : BAT *
    1752           0 : BATcalcincr(BAT *b, BAT *s)
    1753             : {
    1754           0 :         return BATcalcincrdecr(b, s, add_typeswitchloop,
    1755             :                                __func__);
    1756             : }
    1757             : 
    1758             : gdk_return
    1759       17879 : VARcalcincr(ValPtr ret, const ValRecord *v)
    1760             : {
    1761       17879 :         if (add_typeswitchloop(VALptr(v), v->vtype, false,
    1762       17879 :                                &(bte){1}, TYPE_bte, false,
    1763             :                                VALget(ret), ret->vtype,
    1764       17879 :                                &(struct canditer){.tpe=cand_dense, .ncand=1},
    1765       17879 :                                &(struct canditer){.tpe=cand_dense, .ncand=1},
    1766             :                                0, 0, __func__) == BUN_NONE)
    1767           0 :                 return GDK_FAIL;
    1768       17879 :         return GDK_SUCCEED;
    1769             : }
    1770             : 
    1771             : /* ---------------------------------------------------------------------- */
    1772             : /* subtraction (any numeric type) */
    1773             : 
    1774             : #define SUB_3TYPE(TYPE1, TYPE2, TYPE3, IF)                              \
    1775             : static BUN                                                              \
    1776             : sub_##TYPE1##_##TYPE2##_##TYPE3(const TYPE1 *lft, bool incr1,           \
    1777             :                                 const TYPE2 *rgt, bool incr2,           \
    1778             :                                 TYPE3 *restrict dst, TYPE3 max,         \
    1779             :                                 struct canditer *restrict ci1,          \
    1780             :                                 struct canditer *restrict ci2,          \
    1781             :                                 oid candoff1, oid candoff2)             \
    1782             : {                                                                       \
    1783             :         BUN nils = 0;                                                   \
    1784             :         BUN i = 0, j = 0, ncand = ci1->ncand;                                \
    1785             :         lng timeoffset = 0;                                             \
    1786             :         QryCtx *qry_ctx = MT_thread_get_qry_ctx();                      \
    1787             :         if (qry_ctx != NULL) {                                          \
    1788             :                 timeoffset = (qry_ctx->starttime && qry_ctx->querytimeout) ? (qry_ctx->starttime + qry_ctx->querytimeout) : 0; \
    1789             :         }                                                               \
    1790             :                                                                         \
    1791             :         if (ci1->tpe == cand_dense && ci2->tpe == cand_dense) {           \
    1792             :                 TIMEOUT_LOOP_IDX_DECL(k, ncand, timeoffset) {           \
    1793             :                         if (incr1)                                      \
    1794             :                                 i = canditer_next_dense(ci1) - candoff1; \
    1795             :                         if (incr2)                                      \
    1796             :                                 j = canditer_next_dense(ci2) - candoff2; \
    1797             :                         if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
    1798             :                                 dst[k] = TYPE3##_nil;                   \
    1799             :                                 nils++;                                 \
    1800             :                         } else {                                        \
    1801             :                                 SUB##IF##_WITH_CHECK(lft[i], rgt[j],    \
    1802             :                                                      TYPE3, dst[k],     \
    1803             :                                                      max,               \
    1804             :                                                      ON_OVERFLOW(TYPE1, TYPE2, "-")); \
    1805             :                         }                                               \
    1806             :                 }                                                       \
    1807             :                 TIMEOUT_CHECK(timeoffset, TIMEOUT_HANDLER(BUN_NONE));   \
    1808             :         } else {                                                        \
    1809             :                 TIMEOUT_LOOP_IDX_DECL(k, ncand, timeoffset) {           \
    1810             :                         if (incr1)                                      \
    1811             :                                 i = canditer_next(ci1) - candoff1;      \
    1812             :                         if (incr2)                                      \
    1813             :                                 j = canditer_next(ci2) - candoff2;      \
    1814             :                         if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
    1815             :                                 dst[k] = TYPE3##_nil;                   \
    1816             :                                 nils++;                                 \
    1817             :                         } else {                                        \
    1818             :                                 SUB##IF##_WITH_CHECK(lft[i], rgt[j],    \
    1819             :                                                      TYPE3, dst[k],     \
    1820             :                                                      max,               \
    1821             :                                                      ON_OVERFLOW(TYPE1, TYPE2, "-")); \
    1822             :                         }                                               \
    1823             :                 }                                                       \
    1824             :                 TIMEOUT_CHECK(timeoffset, TIMEOUT_HANDLER(BUN_NONE));   \
    1825             :         }                                                               \
    1826             :         return nils;                                                    \
    1827             : }
    1828             : 
    1829             : #define SUB_3TYPE_enlarge(TYPE1, TYPE2, TYPE3, IF)                      \
    1830             : static BUN                                                              \
    1831             : sub_##TYPE1##_##TYPE2##_##TYPE3(const TYPE1 *lft, bool incr1,           \
    1832             :                                 const TYPE2 *rgt, bool incr2,           \
    1833             :                                 TYPE3 *restrict dst, TYPE3 max,         \
    1834             :                                 struct canditer *restrict ci1,          \
    1835             :                                 struct canditer *restrict ci2,          \
    1836             :                                 oid candoff1, oid candoff2)             \
    1837             : {                                                                       \
    1838             :         BUN nils = 0;                                                   \
    1839             :         BUN i = 0, j = 0, ncand = ci1->ncand;                                \
    1840             :         const bool couldoverflow = (max < (TYPE3) GDK_##TYPE1##_max + (TYPE3) GDK_##TYPE2##_max); \
    1841             :         lng timeoffset = 0;                                             \
    1842             :         QryCtx *qry_ctx = MT_thread_get_qry_ctx();                      \
    1843             :         if (qry_ctx != NULL) {                                          \
    1844             :                 timeoffset = (qry_ctx->starttime && qry_ctx->querytimeout) ? (qry_ctx->starttime + qry_ctx->querytimeout) : 0; \
    1845             :         }                                                               \
    1846             :                                                                         \
    1847             :         if (ci1->tpe == cand_dense && ci2->tpe == cand_dense) {           \
    1848             :                 TIMEOUT_LOOP_IDX_DECL(k, ncand, timeoffset) {           \
    1849             :                         if (incr1)                                      \
    1850             :                                 i = canditer_next_dense(ci1) - candoff1; \
    1851             :                         if (incr2)                                      \
    1852             :                                 j = canditer_next_dense(ci2) - candoff2; \
    1853             :                         if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
    1854             :                                 dst[k] = TYPE3##_nil;                   \
    1855             :                                 nils++;                                 \
    1856             :                         } else if (couldoverflow) {                     \
    1857             :                                 SUB##IF##_WITH_CHECK(lft[i], rgt[j],    \
    1858             :                                                      TYPE3, dst[k],     \
    1859             :                                                      max,               \
    1860             :                                                      ON_OVERFLOW(TYPE1, TYPE2, "-")); \
    1861             :                         } else {                                        \
    1862             :                                 dst[k] = (TYPE3) lft[i] - rgt[j];       \
    1863             :                         }                                               \
    1864             :                 }                                                       \
    1865             :                 TIMEOUT_CHECK(timeoffset, TIMEOUT_HANDLER(BUN_NONE));   \
    1866             :         } else {                                                        \
    1867             :                 TIMEOUT_LOOP_IDX_DECL(k, ncand, timeoffset) {           \
    1868             :                         if (incr1)                                      \
    1869             :                                 i = canditer_next(ci1) - candoff1;      \
    1870             :                         if (incr2)                                      \
    1871             :                                 j = canditer_next(ci2) - candoff2;      \
    1872             :                         if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
    1873             :                                 dst[k] = TYPE3##_nil;                   \
    1874             :                                 nils++;                                 \
    1875             :                         } else if (couldoverflow) {                     \
    1876             :                                 SUB##IF##_WITH_CHECK(lft[i], rgt[j],    \
    1877             :                                                      TYPE3, dst[k],     \
    1878             :                                                      max,               \
    1879             :                                                      ON_OVERFLOW(TYPE1, TYPE2, "-")); \
    1880             :                         } else {                                        \
    1881             :                                 dst[k] = (TYPE3) lft[i] - rgt[j];       \
    1882             :                         }                                               \
    1883             :                 }                                                       \
    1884             :                 TIMEOUT_CHECK(timeoffset, TIMEOUT_HANDLER(BUN_NONE));   \
    1885             :         }                                                               \
    1886             :         return nils;                                                    \
    1887             : }
    1888             : 
    1889        1744 : SUB_3TYPE(bte, bte, bte, I)
    1890           0 : SUB_3TYPE_enlarge(bte, bte, sht, I)
    1891           0 : SUB_3TYPE_enlarge(bte, bte, int, I)
    1892           0 : SUB_3TYPE_enlarge(bte, bte, lng, I)
    1893             : #ifdef HAVE_HGE
    1894           0 : SUB_3TYPE_enlarge(bte, bte, hge, I)
    1895             : #endif
    1896           0 : SUB_3TYPE_enlarge(bte, bte, flt, F)
    1897           0 : SUB_3TYPE_enlarge(bte, bte, dbl, F)
    1898           0 : SUB_3TYPE(bte, sht, sht, I)
    1899           0 : SUB_3TYPE_enlarge(bte, sht, int, I)
    1900           0 : SUB_3TYPE_enlarge(bte, sht, lng, I)
    1901             : #ifdef HAVE_HGE
    1902           0 : SUB_3TYPE_enlarge(bte, sht, hge, I)
    1903             : #endif
    1904           0 : SUB_3TYPE_enlarge(bte, sht, flt, F)
    1905           0 : SUB_3TYPE_enlarge(bte, sht, dbl, F)
    1906           0 : SUB_3TYPE(bte, int, int, I)
    1907           0 : SUB_3TYPE_enlarge(bte, int, lng, I)
    1908             : #ifdef HAVE_HGE
    1909           0 : SUB_3TYPE_enlarge(bte, int, hge, I)
    1910             : #endif
    1911           0 : SUB_3TYPE_enlarge(bte, int, flt, F)
    1912           0 : SUB_3TYPE_enlarge(bte, int, dbl, F)
    1913           0 : SUB_3TYPE(bte, lng, lng, I)
    1914             : #ifdef HAVE_HGE
    1915           0 : SUB_3TYPE_enlarge(bte, lng, hge, I)
    1916             : #endif
    1917           0 : SUB_3TYPE_enlarge(bte, lng, flt, F)
    1918           0 : SUB_3TYPE_enlarge(bte, lng, dbl, F)
    1919             : #ifdef HAVE_HGE
    1920           0 : SUB_3TYPE(bte, hge, hge, I)
    1921           0 : SUB_3TYPE_enlarge(bte, hge, flt, F)
    1922           0 : SUB_3TYPE_enlarge(bte, hge, dbl, F)
    1923             : #endif
    1924           0 : SUB_3TYPE(bte, flt, flt, F)
    1925           0 : SUB_3TYPE_enlarge(bte, flt, dbl, F)
    1926           0 : SUB_3TYPE(bte, dbl, dbl, F)
    1927           0 : SUB_3TYPE(sht, bte, sht, I)
    1928           0 : SUB_3TYPE_enlarge(sht, bte, int, I)
    1929           0 : SUB_3TYPE_enlarge(sht, bte, lng, I)
    1930             : #ifdef HAVE_HGE
    1931           0 : SUB_3TYPE_enlarge(sht, bte, hge, I)
    1932             : #endif
    1933           0 : SUB_3TYPE_enlarge(sht, bte, flt, F)
    1934           0 : SUB_3TYPE_enlarge(sht, bte, dbl, F)
    1935         484 : SUB_3TYPE(sht, sht, sht, I)
    1936           0 : SUB_3TYPE_enlarge(sht, sht, int, I)
    1937           0 : SUB_3TYPE_enlarge(sht, sht, lng, I)
    1938             : #ifdef HAVE_HGE
    1939           0 : SUB_3TYPE_enlarge(sht, sht, hge, I)
    1940             : #endif
    1941           0 : SUB_3TYPE_enlarge(sht, sht, flt, F)
    1942           0 : SUB_3TYPE_enlarge(sht, sht, dbl, F)
    1943           0 : SUB_3TYPE(sht, int, int, I)
    1944           0 : SUB_3TYPE_enlarge(sht, int, lng, I)
    1945             : #ifdef HAVE_HGE
    1946           0 : SUB_3TYPE_enlarge(sht, int, hge, I)
    1947             : #endif
    1948           0 : SUB_3TYPE_enlarge(sht, int, flt, F)
    1949           0 : SUB_3TYPE_enlarge(sht, int, dbl, F)
    1950           0 : SUB_3TYPE(sht, lng, lng, I)
    1951             : #ifdef HAVE_HGE
    1952           0 : SUB_3TYPE_enlarge(sht, lng, hge, I)
    1953             : #endif
    1954           0 : SUB_3TYPE_enlarge(sht, lng, flt, F)
    1955           0 : SUB_3TYPE_enlarge(sht, lng, dbl, F)
    1956             : #ifdef HAVE_HGE
    1957           0 : SUB_3TYPE(sht, hge, hge, I)
    1958           0 : SUB_3TYPE_enlarge(sht, hge, flt, F)
    1959           0 : SUB_3TYPE_enlarge(sht, hge, dbl, F)
    1960             : #endif
    1961           0 : SUB_3TYPE(sht, flt, flt, F)
    1962           0 : SUB_3TYPE_enlarge(sht, flt, dbl, F)
    1963           0 : SUB_3TYPE(sht, dbl, dbl, F)
    1964           0 : SUB_3TYPE(int, bte, int, I)
    1965           0 : SUB_3TYPE_enlarge(int, bte, lng, I)
    1966             : #ifdef HAVE_HGE
    1967           0 : SUB_3TYPE_enlarge(int, bte, hge, I)
    1968             : #endif
    1969           0 : SUB_3TYPE_enlarge(int, bte, flt, F)
    1970           0 : SUB_3TYPE_enlarge(int, bte, dbl, F)
    1971           0 : SUB_3TYPE(int, sht, int, I)
    1972           0 : SUB_3TYPE_enlarge(int, sht, lng, I)
    1973             : #ifdef HAVE_HGE
    1974           0 : SUB_3TYPE_enlarge(int, sht, hge, I)
    1975             : #endif
    1976           0 : SUB_3TYPE_enlarge(int, sht, flt, F)
    1977           0 : SUB_3TYPE_enlarge(int, sht, dbl, F)
    1978    13640066 : SUB_3TYPE(int, int, int, I)
    1979           0 : SUB_3TYPE_enlarge(int, int, lng, I)
    1980             : #ifdef HAVE_HGE
    1981           0 : SUB_3TYPE_enlarge(int, int, hge, I)
    1982             : #endif
    1983           0 : SUB_3TYPE_enlarge(int, int, flt, F)
    1984           0 : SUB_3TYPE_enlarge(int, int, dbl, F)
    1985           0 : SUB_3TYPE(int, lng, lng, I)
    1986             : #ifdef HAVE_HGE
    1987           0 : SUB_3TYPE_enlarge(int, lng, hge, I)
    1988             : #endif
    1989           0 : SUB_3TYPE_enlarge(int, lng, flt, F)
    1990           0 : SUB_3TYPE_enlarge(int, lng, dbl, F)
    1991             : #ifdef HAVE_HGE
    1992           0 : SUB_3TYPE(int, hge, hge, I)
    1993           0 : SUB_3TYPE_enlarge(int, hge, flt, F)
    1994           0 : SUB_3TYPE_enlarge(int, hge, dbl, F)
    1995             : #endif
    1996           0 : SUB_3TYPE(int, flt, flt, F)
    1997           0 : SUB_3TYPE_enlarge(int, flt, dbl, F)
    1998           0 : SUB_3TYPE(int, dbl, dbl, F)
    1999           0 : SUB_3TYPE(lng, bte, lng, I)
    2000             : #ifdef HAVE_HGE
    2001           0 : SUB_3TYPE_enlarge(lng, bte, hge, I)
    2002             : #endif
    2003           0 : SUB_3TYPE_enlarge(lng, bte, flt, F)
    2004           0 : SUB_3TYPE_enlarge(lng, bte, dbl, F)
    2005           0 : SUB_3TYPE(lng, sht, lng, I)
    2006             : #ifdef HAVE_HGE
    2007           0 : SUB_3TYPE_enlarge(lng, sht, hge, I)
    2008             : #endif
    2009           0 : SUB_3TYPE_enlarge(lng, sht, flt, F)
    2010           0 : SUB_3TYPE_enlarge(lng, sht, dbl, F)
    2011       67720 : SUB_3TYPE(lng, int, lng, I)
    2012             : #ifdef HAVE_HGE
    2013           0 : SUB_3TYPE_enlarge(lng, int, hge, I)
    2014             : #endif
    2015           0 : SUB_3TYPE_enlarge(lng, int, flt, F)
    2016           0 : SUB_3TYPE_enlarge(lng, int, dbl, F)
    2017     1439744 : SUB_3TYPE(lng, lng, lng, I)
    2018             : #ifdef HAVE_HGE
    2019           0 : SUB_3TYPE_enlarge(lng, lng, hge, I)
    2020             : #endif
    2021           0 : SUB_3TYPE_enlarge(lng, lng, flt, F)
    2022           0 : SUB_3TYPE_enlarge(lng, lng, dbl, F)
    2023             : #ifdef HAVE_HGE
    2024           0 : SUB_3TYPE(lng, hge, hge, I)
    2025           0 : SUB_3TYPE_enlarge(lng, hge, flt, F)
    2026           0 : SUB_3TYPE_enlarge(lng, hge, dbl, F)
    2027             : #endif
    2028           0 : SUB_3TYPE(lng, flt, flt, F)
    2029           0 : SUB_3TYPE_enlarge(lng, flt, dbl, F)
    2030           0 : SUB_3TYPE(lng, dbl, dbl, F)
    2031             : #ifdef HAVE_HGE
    2032           0 : SUB_3TYPE(hge, bte, hge, I)
    2033           0 : SUB_3TYPE_enlarge(hge, bte, flt, F)
    2034           0 : SUB_3TYPE_enlarge(hge, bte, dbl, F)
    2035           0 : SUB_3TYPE(hge, sht, hge, I)
    2036           0 : SUB_3TYPE_enlarge(hge, sht, flt, F)
    2037           0 : SUB_3TYPE_enlarge(hge, sht, dbl, F)
    2038           0 : SUB_3TYPE(hge, int, hge, I)
    2039           0 : SUB_3TYPE_enlarge(hge, int, flt, F)
    2040           0 : SUB_3TYPE_enlarge(hge, int, dbl, F)
    2041           0 : SUB_3TYPE(hge, lng, hge, I)
    2042           0 : SUB_3TYPE_enlarge(hge, lng, flt, F)
    2043           0 : SUB_3TYPE_enlarge(hge, lng, dbl, F)
    2044    26063740 : SUB_3TYPE(hge, hge, hge, I)
    2045           0 : SUB_3TYPE_enlarge(hge, hge, flt, F)
    2046           0 : SUB_3TYPE_enlarge(hge, hge, dbl, F)
    2047           0 : SUB_3TYPE(hge, flt, flt, F)
    2048           0 : SUB_3TYPE_enlarge(hge, flt, dbl, F)
    2049           0 : SUB_3TYPE(hge, dbl, dbl, F)
    2050             : #endif
    2051           0 : SUB_3TYPE(flt, bte, flt, F)
    2052           0 : SUB_3TYPE_enlarge(flt, bte, dbl, F)
    2053           0 : SUB_3TYPE(flt, sht, flt, F)
    2054           0 : SUB_3TYPE_enlarge(flt, sht, dbl, F)
    2055           0 : SUB_3TYPE(flt, int, flt, F)
    2056           0 : SUB_3TYPE_enlarge(flt, int, dbl, F)
    2057           0 : SUB_3TYPE(flt, lng, flt, F)
    2058           0 : SUB_3TYPE_enlarge(flt, lng, dbl, F)
    2059             : #ifdef HAVE_HGE
    2060           0 : SUB_3TYPE(flt, hge, flt, F)
    2061           0 : SUB_3TYPE_enlarge(flt, hge, dbl, F)
    2062             : #endif
    2063          66 : SUB_3TYPE(flt, flt, flt, F)
    2064           0 : SUB_3TYPE_enlarge(flt, flt, dbl, F)
    2065           0 : SUB_3TYPE(flt, dbl, dbl, F)
    2066           0 : SUB_3TYPE(dbl, bte, dbl, F)
    2067           0 : SUB_3TYPE(dbl, sht, dbl, F)
    2068           0 : SUB_3TYPE(dbl, int, dbl, F)
    2069           0 : SUB_3TYPE(dbl, lng, dbl, F)
    2070             : #ifdef HAVE_HGE
    2071           0 : SUB_3TYPE(dbl, hge, dbl, F)
    2072             : #endif
    2073           0 : SUB_3TYPE(dbl, flt, dbl, F)
    2074     6003085 : SUB_3TYPE(dbl, dbl, dbl, F)
    2075             : 
    2076             : static BUN
    2077       68288 : sub_typeswitchloop(const void *lft, int tp1, bool incr1,
    2078             :                    const void *rgt, int tp2, bool incr2,
    2079             :                    void *restrict dst, int tp,
    2080             :                    struct canditer *restrict ci1, struct canditer *restrict ci2,
    2081             :                    oid candoff1, oid candoff2, const char *func)
    2082             : {
    2083       68288 :         BUN nils;
    2084             : 
    2085       68288 :         tp1 = ATOMbasetype(tp1);
    2086       68288 :         tp2 = ATOMbasetype(tp2);
    2087       68288 :         tp = ATOMbasetype(tp);
    2088       68288 :         switch (tp1) {
    2089         436 :         case TYPE_bte:
    2090         436 :                 switch (tp2) {
    2091         436 :                 case TYPE_bte:
    2092         436 :                         switch (tp) {
    2093         436 :                         case TYPE_bte:
    2094         436 :                                 nils = sub_bte_bte_bte(lft, incr1, rgt, incr2,
    2095             :                                                        dst, GDK_bte_max,
    2096             :                                                        ci1, ci2, candoff1, candoff2);
    2097         436 :                                 break;
    2098           0 :                         case TYPE_sht:
    2099           0 :                                 nils = sub_bte_bte_sht(lft, incr1, rgt, incr2,
    2100             :                                                        dst, GDK_sht_max,
    2101             :                                                        ci1, ci2, candoff1, candoff2);
    2102           0 :                                 break;
    2103           0 :                         case TYPE_int:
    2104           0 :                                 nils = sub_bte_bte_int(lft, incr1, rgt, incr2,
    2105             :                                                        dst, GDK_int_max,
    2106             :                                                        ci1, ci2, candoff1, candoff2);
    2107           0 :                                 break;
    2108           0 :                         case TYPE_lng:
    2109           0 :                                 nils = sub_bte_bte_lng(lft, incr1, rgt, incr2,
    2110             :                                                        dst, GDK_lng_max,
    2111             :                                                        ci1, ci2, candoff1, candoff2);
    2112           0 :                                 break;
    2113             : #ifdef HAVE_HGE
    2114           0 :                         case TYPE_hge:
    2115           0 :                                 nils = sub_bte_bte_hge(lft, incr1, rgt, incr2,
    2116             :                                                        dst, GDK_hge_max,
    2117             :                                                        ci1, ci2, candoff1, candoff2);
    2118           0 :                                 break;
    2119             : #endif
    2120           0 :                         case TYPE_flt:
    2121           0 :                                 nils = sub_bte_bte_flt(lft, incr1, rgt, incr2,
    2122             :                                                        dst, GDK_flt_max,
    2123             :                                                        ci1, ci2, candoff1, candoff2);
    2124           0 :                                 break;
    2125           0 :                         case TYPE_dbl:
    2126           0 :                                 nils = sub_bte_bte_dbl(lft, incr1, rgt, incr2,
    2127             :                                                        dst, GDK_dbl_max,
    2128             :                                                        ci1, ci2, candoff1, candoff2);
    2129           0 :                                 break;
    2130           0 :                         default:
    2131           0 :                                 goto unsupported;
    2132             :                         }
    2133             :                         break;
    2134           0 :                 case TYPE_sht:
    2135           0 :                         switch (tp) {
    2136           0 :                         case TYPE_sht:
    2137           0 :                                 nils = sub_bte_sht_sht(lft, incr1, rgt, incr2,
    2138             :                                                        dst, GDK_sht_max,
    2139             :                                                        ci1, ci2, candoff1, candoff2);
    2140           0 :                                 break;
    2141           0 :                         case TYPE_int:
    2142           0 :                                 nils = sub_bte_sht_int(lft, incr1, rgt, incr2,
    2143             :                                                        dst, GDK_int_max,
    2144             :                                                        ci1, ci2, candoff1, candoff2);
    2145           0 :                                 break;
    2146           0 :                         case TYPE_lng:
    2147           0 :                                 nils = sub_bte_sht_lng(lft, incr1, rgt, incr2,
    2148             :                                                        dst, GDK_lng_max,
    2149             :                                                        ci1, ci2, candoff1, candoff2);
    2150           0 :                                 break;
    2151             : #ifdef HAVE_HGE
    2152           0 :                         case TYPE_hge:
    2153           0 :                                 nils = sub_bte_sht_hge(lft, incr1, rgt, incr2,
    2154             :                                                        dst, GDK_hge_max,
    2155             :                                                        ci1, ci2, candoff1, candoff2);
    2156           0 :                                 break;
    2157             : #endif
    2158           0 :                         case TYPE_flt:
    2159           0 :                                 nils = sub_bte_sht_flt(lft, incr1, rgt, incr2,
    2160             :                                                        dst, GDK_flt_max,
    2161             :                                                        ci1, ci2, candoff1, candoff2);
    2162           0 :                                 break;
    2163           0 :                         case TYPE_dbl:
    2164           0 :                                 nils = sub_bte_sht_dbl(lft, incr1, rgt, incr2,
    2165             :                                                        dst, GDK_dbl_max,
    2166             :                                                        ci1, ci2, candoff1, candoff2);
    2167           0 :                                 break;
    2168           0 :                         default:
    2169           0 :                                 goto unsupported;
    2170             :                         }
    2171             :                         break;
    2172           0 :                 case TYPE_int:
    2173           0 :                         switch (tp) {
    2174           0 :                         case TYPE_int:
    2175           0 :                                 nils = sub_bte_int_int(lft, incr1, rgt, incr2,
    2176             :                                                        dst, GDK_int_max,
    2177             :                                                        ci1, ci2, candoff1, candoff2);
    2178           0 :                                 break;
    2179           0 :                         case TYPE_lng:
    2180           0 :                                 nils = sub_bte_int_lng(lft, incr1, rgt, incr2,
    2181             :                                                        dst, GDK_lng_max,
    2182             :                                                        ci1, ci2, candoff1, candoff2);
    2183           0 :                                 break;
    2184             : #ifdef HAVE_HGE
    2185           0 :                         case TYPE_hge:
    2186           0 :                                 nils = sub_bte_int_hge(lft, incr1, rgt, incr2,
    2187             :                                                        dst, GDK_hge_max,
    2188             :                                                        ci1, ci2, candoff1, candoff2);
    2189           0 :                                 break;
    2190             : #endif
    2191           0 :                         case TYPE_flt:
    2192           0 :                                 nils = sub_bte_int_flt(lft, incr1, rgt, incr2,
    2193             :                                                        dst, GDK_flt_max,
    2194             :                                                        ci1, ci2, candoff1, candoff2);
    2195           0 :                                 break;
    2196           0 :                         case TYPE_dbl:
    2197           0 :                                 nils = sub_bte_int_dbl(lft, incr1, rgt, incr2,
    2198             :                                                        dst, GDK_dbl_max,
    2199             :                                                        ci1, ci2, candoff1, candoff2);
    2200           0 :                                 break;
    2201           0 :                         default:
    2202           0 :                                 goto unsupported;
    2203             :                         }
    2204             :                         break;
    2205           0 :                 case TYPE_lng:
    2206           0 :                         switch (tp) {
    2207           0 :                         case TYPE_lng:
    2208           0 :                                 nils = sub_bte_lng_lng(lft, incr1, rgt, incr2,
    2209             :                                                        dst, GDK_lng_max,
    2210             :                                                        ci1, ci2, candoff1, candoff2);
    2211           0 :                                 break;
    2212             : #ifdef HAVE_HGE
    2213           0 :                         case TYPE_hge:
    2214           0 :                                 nils = sub_bte_lng_hge(lft, incr1, rgt, incr2,
    2215             :                                                        dst, GDK_hge_max,
    2216             :                                                        ci1, ci2, candoff1, candoff2);
    2217           0 :                                 break;
    2218             : #endif
    2219           0 :                         case TYPE_flt:
    2220           0 :                                 nils = sub_bte_lng_flt(lft, incr1, rgt, incr2,
    2221             :                                                        dst, GDK_flt_max,
    2222             :                                                        ci1, ci2, candoff1, candoff2);
    2223           0 :                                 break;
    2224           0 :                         case TYPE_dbl:
    2225           0 :                                 nils = sub_bte_lng_dbl(lft, incr1, rgt, incr2,
    2226             :                                                        dst, GDK_dbl_max,
    2227             :                                                        ci1, ci2, candoff1, candoff2);
    2228           0 :                                 break;
    2229           0 :                         default:
    2230           0 :                                 goto unsupported;
    2231             :                         }
    2232             :                         break;
    2233             : #ifdef HAVE_HGE
    2234           0 :                 case TYPE_hge:
    2235           0 :                         switch (tp) {
    2236           0 :                         case TYPE_hge:
    2237           0 :                                 nils = sub_bte_hge_hge(lft, incr1, rgt, incr2,
    2238             :                                                        dst, GDK_hge_max,
    2239             :                                                        ci1, ci2, candoff1, candoff2);
    2240           0 :                                 break;
    2241           0 :                         case TYPE_flt:
    2242           0 :                                 nils = sub_bte_hge_flt(lft, incr1, rgt, incr2,
    2243             :                                                        dst, GDK_flt_max,
    2244             :                                                        ci1, ci2, candoff1, candoff2);
    2245           0 :                                 break;
    2246           0 :                         case TYPE_dbl:
    2247           0 :                                 nils = sub_bte_hge_dbl(lft, incr1, rgt, incr2,
    2248             :                                                        dst, GDK_dbl_max,
    2249             :                                                        ci1, ci2, candoff1, candoff2);
    2250           0 :                                 break;
    2251           0 :                         default:
    2252           0 :                                 goto unsupported;
    2253             :                         }
    2254             :                         break;
    2255             : #endif
    2256           0 :                 case TYPE_flt:
    2257           0 :                         switch (tp) {
    2258           0 :                         case TYPE_flt:
    2259           0 :                                 nils = sub_bte_flt_flt(lft, incr1, rgt, incr2,
    2260             :                                                        dst, GDK_flt_max,
    2261             :                                                        ci1, ci2, candoff1, candoff2);
    2262           0 :                                 break;
    2263           0 :                         case TYPE_dbl:
    2264           0 :                                 nils = sub_bte_flt_dbl(lft, incr1, rgt, incr2,
    2265             :                                                        dst, GDK_dbl_max,
    2266             :                                                        ci1, ci2, candoff1, candoff2);
    2267           0 :                                 break;
    2268           0 :                         default:
    2269           0 :                                 goto unsupported;
    2270             :                         }
    2271             :                         break;
    2272           0 :                 case TYPE_dbl:
    2273           0 :                         switch (tp) {
    2274           0 :                         case TYPE_dbl:
    2275           0 :                                 nils = sub_bte_dbl_dbl(lft, incr1, rgt, incr2,
    2276             :                                                        dst, GDK_dbl_max,
    2277             :                                                        ci1, ci2, candoff1, candoff2);
    2278           0 :                                 break;
    2279           0 :                         default:
    2280           0 :                                 goto unsupported;
    2281             :                         }
    2282           0 :                         break;
    2283           0 :                 default:
    2284           0 :                         goto unsupported;
    2285             :                 }
    2286             :                 break;
    2287         120 :         case TYPE_sht:
    2288         120 :                 switch (tp2) {
    2289           0 :                 case TYPE_bte:
    2290           0 :                         switch (tp) {
    2291           0 :                         case TYPE_sht:
    2292           0 :                                 nils = sub_sht_bte_sht(lft, incr1, rgt, incr2,
    2293             :                                                        dst, GDK_sht_max,
    2294             :                                                        ci1, ci2, candoff1, candoff2);
    2295           0 :                                 break;
    2296           0 :                         case TYPE_int:
    2297           0 :                                 nils = sub_sht_bte_int(lft, incr1, rgt, incr2,
    2298             :                                                        dst, GDK_int_max,
    2299             :                                                        ci1, ci2, candoff1, candoff2);
    2300           0 :                                 break;
    2301           0 :                         case TYPE_lng:
    2302           0 :                                 nils = sub_sht_bte_lng(lft, incr1, rgt, incr2,
    2303             :                                                        dst, GDK_lng_max,
    2304             :                                                        ci1, ci2, candoff1, candoff2);
    2305           0 :                                 break;
    2306             : #ifdef HAVE_HGE
    2307           0 :                         case TYPE_hge:
    2308           0 :                                 nils = sub_sht_bte_hge(lft, incr1, rgt, incr2,
    2309             :                                                        dst, GDK_hge_max,
    2310             :                                                        ci1, ci2, candoff1, candoff2);
    2311           0 :                                 break;
    2312             : #endif
    2313           0 :                         case TYPE_flt:
    2314           0 :                                 nils = sub_sht_bte_flt(lft, incr1, rgt, incr2,
    2315             :                                                        dst, GDK_flt_max,
    2316             :                                                        ci1, ci2, candoff1, candoff2);
    2317           0 :                                 break;
    2318           0 :                         case TYPE_dbl:
    2319           0 :                                 nils = sub_sht_bte_dbl(lft, incr1, rgt, incr2,
    2320             :                                                        dst, GDK_dbl_max,
    2321             :                                                        ci1, ci2, candoff1, candoff2);
    2322           0 :                                 break;
    2323           0 :                         default:
    2324           0 :                                 goto unsupported;
    2325             :                         }
    2326             :                         break;
    2327         120 :                 case TYPE_sht:
    2328         120 :                         switch (tp) {
    2329         120 :                         case TYPE_sht:
    2330         120 :                                 nils = sub_sht_sht_sht(lft, incr1, rgt, incr2,
    2331             :                                                        dst, GDK_sht_max,
    2332             :                                                        ci1, ci2, candoff1, candoff2);
    2333         120 :                                 break;
    2334           0 :                         case TYPE_int:
    2335           0 :                                 nils = sub_sht_sht_int(lft, incr1, rgt, incr2,
    2336             :                                                        dst, GDK_int_max,
    2337             :                                                        ci1, ci2, candoff1, candoff2);
    2338           0 :                                 break;
    2339           0 :                         case TYPE_lng:
    2340           0 :                                 nils = sub_sht_sht_lng(lft, incr1, rgt, incr2,
    2341             :                                                        dst, GDK_lng_max,
    2342             :                                                        ci1, ci2, candoff1, candoff2);
    2343           0 :                                 break;
    2344             : #ifdef HAVE_HGE
    2345           0 :                         case TYPE_hge:
    2346           0 :                                 nils = sub_sht_sht_hge(lft, incr1, rgt, incr2,
    2347             :                                                        dst, GDK_hge_max,
    2348             :                                                        ci1, ci2, candoff1, candoff2);
    2349           0 :                                 break;
    2350             : #endif
    2351           0 :                         case TYPE_flt:
    2352           0 :                                 nils = sub_sht_sht_flt(lft, incr1, rgt, incr2,
    2353             :                                                        dst, GDK_flt_max,
    2354             :                                                        ci1, ci2, candoff1, candoff2);
    2355           0 :                                 break;
    2356           0 :                         case TYPE_dbl:
    2357           0 :                                 nils = sub_sht_sht_dbl(lft, incr1, rgt, incr2,
    2358             :                                                        dst, GDK_dbl_max,
    2359             :                                                        ci1, ci2, candoff1, candoff2);
    2360           0 :                                 break;
    2361           0 :                         default:
    2362           0 :                                 goto unsupported;
    2363             :                         }
    2364             :                         break;
    2365           0 :                 case TYPE_int:
    2366           0 :                         switch (tp) {
    2367           0 :                         case TYPE_int:
    2368           0 :                                 nils = sub_sht_int_int(lft, incr1, rgt, incr2,
    2369             :                                                        dst, GDK_int_max,
    2370             :                                                        ci1, ci2, candoff1, candoff2);
    2371           0 :                                 break;
    2372           0 :                         case TYPE_lng:
    2373           0 :                                 nils = sub_sht_int_lng(lft, incr1, rgt, incr2,
    2374             :                                                        dst, GDK_lng_max,
    2375             :                                                        ci1, ci2, candoff1, candoff2);
    2376           0 :                                 break;
    2377             : #ifdef HAVE_HGE
    2378           0 :                         case TYPE_hge:
    2379           0 :                                 nils = sub_sht_int_hge(lft, incr1, rgt, incr2,
    2380             :                                                        dst, GDK_hge_max,
    2381             :                                                        ci1, ci2, candoff1, candoff2);
    2382           0 :                                 break;
    2383             : #endif
    2384           0 :                         case TYPE_flt:
    2385           0 :                                 nils = sub_sht_int_flt(lft, incr1, rgt, incr2,
    2386             :                                                        dst, GDK_flt_max,
    2387             :                                                        ci1, ci2, candoff1, candoff2);
    2388           0 :                                 break;
    2389           0 :                         case TYPE_dbl:
    2390           0 :                                 nils = sub_sht_int_dbl(lft, incr1, rgt, incr2,
    2391             :                                                        dst, GDK_dbl_max,
    2392             :                                                        ci1, ci2, candoff1, candoff2);
    2393           0 :                                 break;
    2394           0 :                         default:
    2395           0 :                                 goto unsupported;
    2396             :                         }
    2397             :                         break;
    2398           0 :                 case TYPE_lng:
    2399           0 :                         switch (tp) {
    2400           0 :                         case TYPE_lng:
    2401           0 :                                 nils = sub_sht_lng_lng(lft, incr1, rgt, incr2,
    2402             :                                                        dst, GDK_lng_max,
    2403             :                                                        ci1, ci2, candoff1, candoff2);
    2404           0 :                                 break;
    2405             : #ifdef HAVE_HGE
    2406           0 :                         case TYPE_hge:
    2407           0 :                                 nils = sub_sht_lng_hge(lft, incr1, rgt, incr2,
    2408             :                                                        dst, GDK_hge_max,
    2409             :                                                        ci1, ci2, candoff1, candoff2);
    2410           0 :                                 break;
    2411             : #endif
    2412           0 :                         case TYPE_flt:
    2413           0 :                                 nils = sub_sht_lng_flt(lft, incr1, rgt, incr2,
    2414             :                                                        dst, GDK_flt_max,
    2415             :                                                        ci1, ci2, candoff1, candoff2);
    2416           0 :                                 break;
    2417           0 :                         case TYPE_dbl:
    2418           0 :                                 nils = sub_sht_lng_dbl(lft, incr1, rgt, incr2,
    2419             :                                                        dst, GDK_dbl_max,
    2420             :                                                        ci1, ci2, candoff1, candoff2);
    2421           0 :                                 break;
    2422           0 :                         default:
    2423           0 :                                 goto unsupported;
    2424             :                         }
    2425             :                         break;
    2426             : #ifdef HAVE_HGE
    2427           0 :                 case TYPE_hge:
    2428           0 :                         switch (tp) {
    2429           0 :                         case TYPE_hge:
    2430           0 :                                 nils = sub_sht_hge_hge(lft, incr1, rgt, incr2,
    2431             :                                                        dst, GDK_hge_max,
    2432             :                                                        ci1, ci2, candoff1, candoff2);
    2433           0 :                                 break;
    2434           0 :                         case TYPE_flt:
    2435           0 :                                 nils = sub_sht_hge_flt(lft, incr1, rgt, incr2,
    2436             :                                                        dst, GDK_flt_max,
    2437             :                                                        ci1, ci2, candoff1, candoff2);
    2438           0 :                                 break;
    2439           0 :                         case TYPE_dbl:
    2440           0 :                                 nils = sub_sht_hge_dbl(lft, incr1, rgt, incr2,
    2441             :                                                        dst, GDK_dbl_max,
    2442             :                                                        ci1, ci2, candoff1, candoff2);
    2443           0 :                                 break;
    2444           0 :                         default:
    2445           0 :                                 goto unsupported;
    2446             :                         }
    2447             :                         break;
    2448             : #endif
    2449           0 :                 case TYPE_flt:
    2450           0 :                         switch (tp) {
    2451           0 :                         case TYPE_flt:
    2452           0 :                                 nils = sub_sht_flt_flt(lft, incr1, rgt, incr2,
    2453             :                                                        dst, GDK_flt_max,
    2454             :                                                        ci1, ci2, candoff1, candoff2);
    2455           0 :                                 break;
    2456           0 :                         case TYPE_dbl:
    2457           0 :                                 nils = sub_sht_flt_dbl(lft, incr1, rgt, incr2,
    2458             :                                                        dst, GDK_dbl_max,
    2459             :                                                        ci1, ci2, candoff1, candoff2);
    2460           0 :                                 break;
    2461           0 :                         default:
    2462           0 :                                 goto unsupported;
    2463             :                         }
    2464             :                         break;
    2465           0 :                 case TYPE_dbl:
    2466           0 :                         switch (tp) {
    2467           0 :                         case TYPE_dbl:
    2468           0 :                                 nils = sub_sht_dbl_dbl(lft, incr1, rgt, incr2,
    2469             :                                                        dst, GDK_dbl_max,
    2470             :                                                        ci1, ci2, candoff1, candoff2);
    2471           0 :                                 break;
    2472           0 :                         default:
    2473           0 :                                 goto unsupported;
    2474             :                         }
    2475           0 :                         break;
    2476           0 :                 default:
    2477           0 :                         goto unsupported;
    2478             :                 }
    2479             :                 break;
    2480       17436 :         case TYPE_int:
    2481       17436 :                 switch (tp2) {
    2482           0 :                 case TYPE_bte:
    2483           0 :                         switch (tp) {
    2484           0 :                         case TYPE_int:
    2485           0 :                                 nils = sub_int_bte_int(lft, incr1, rgt, incr2,
    2486             :                                                        dst, GDK_int_max,
    2487             :                                                        ci1, ci2, candoff1, candoff2);
    2488           0 :                                 break;
    2489           0 :                         case TYPE_lng:
    2490           0 :                                 nils = sub_int_bte_lng(lft, incr1, rgt, incr2,
    2491             :                                                        dst, GDK_lng_max,
    2492             :                                                        ci1, ci2, candoff1, candoff2);
    2493           0 :                                 break;
    2494             : #ifdef HAVE_HGE
    2495           0 :                         case TYPE_hge:
    2496           0 :                                 nils = sub_int_bte_hge(lft, incr1, rgt, incr2,
    2497             :                                                        dst, GDK_hge_max,
    2498             :                                                        ci1, ci2, candoff1, candoff2);
    2499           0 :                                 break;
    2500             : #endif
    2501           0 :                         case TYPE_flt:
    2502           0 :                                 nils = sub_int_bte_flt(lft, incr1, rgt, incr2,
    2503             :                                                        dst, GDK_flt_max,
    2504             :                                                        ci1, ci2, candoff1, candoff2);
    2505           0 :                                 break;
    2506           0 :                         case TYPE_dbl:
    2507           0 :                                 nils = sub_int_bte_dbl(lft, incr1, rgt, incr2,
    2508             :                                                        dst, GDK_dbl_max,
    2509             :                                                        ci1, ci2, candoff1, candoff2);
    2510           0 :                                 break;
    2511           0 :                         default:
    2512           0 :                                 goto unsupported;
    2513             :                         }
    2514             :                         break;
    2515           0 :                 case TYPE_sht:
    2516           0 :                         switch (tp) {
    2517           0 :                         case TYPE_int:
    2518           0 :                                 nils = sub_int_sht_int(lft, incr1, rgt, incr2,
    2519             :                                                        dst, GDK_int_max,
    2520             :                                                        ci1, ci2, candoff1, candoff2);
    2521           0 :                                 break;
    2522           0 :                         case TYPE_lng:
    2523           0 :                                 nils = sub_int_sht_lng(lft, incr1, rgt, incr2,
    2524             :                                                        dst, GDK_lng_max,
    2525             :                                                        ci1, ci2, candoff1, candoff2);
    2526           0 :                                 break;
    2527             : #ifdef HAVE_HGE
    2528           0 :                         case TYPE_hge:
    2529           0 :                                 nils = sub_int_sht_hge(lft, incr1, rgt, incr2,
    2530             :                                                        dst, GDK_hge_max,
    2531             :                                                        ci1, ci2, candoff1, candoff2);
    2532           0 :                                 break;
    2533             : #endif
    2534           0 :                         case TYPE_flt:
    2535           0 :                                 nils = sub_int_sht_flt(lft, incr1, rgt, incr2,
    2536             :                                                        dst, GDK_flt_max,
    2537             :                                                        ci1, ci2, candoff1, candoff2);
    2538           0 :                                 break;
    2539           0 :                         case TYPE_dbl:
    2540           0 :                                 nils = sub_int_sht_dbl(lft, incr1, rgt, incr2,
    2541             :                                                        dst, GDK_dbl_max,
    2542             :                                                        ci1, ci2, candoff1, candoff2);
    2543           0 :                                 break;
    2544           0 :                         default:
    2545           0 :                                 goto unsupported;
    2546             :                         }
    2547             :                         break;
    2548       17436 :                 case TYPE_int:
    2549       17436 :                         switch (tp) {
    2550       17436 :                         case TYPE_int:
    2551       17436 :                                 nils = sub_int_int_int(lft, incr1, rgt, incr2,
    2552             :                                                        dst, GDK_int_max,
    2553             :                                                        ci1, ci2, candoff1, candoff2);
    2554       17436 :                                 break;
    2555           0 :                         case TYPE_lng:
    2556           0 :                                 nils = sub_int_int_lng(lft, incr1, rgt, incr2,
    2557             :                                                        dst, GDK_lng_max,
    2558             :                                                        ci1, ci2, candoff1, candoff2);
    2559           0 :                                 break;
    2560             : #ifdef HAVE_HGE
    2561           0 :                         case TYPE_hge:
    2562           0 :                                 nils = sub_int_int_hge(lft, incr1, rgt, incr2,
    2563             :                                                        dst, GDK_hge_max,
    2564             :                                                        ci1, ci2, candoff1, candoff2);
    2565           0 :                                 break;
    2566             : #endif
    2567           0 :                         case TYPE_flt:
    2568           0 :                                 nils = sub_int_int_flt(lft, incr1, rgt, incr2,
    2569             :                                                        dst, GDK_flt_max,
    2570             :                                                        ci1, ci2, candoff1, candoff2);
    2571           0 :                                 break;
    2572           0 :                         case TYPE_dbl:
    2573           0 :                                 nils = sub_int_int_dbl(lft, incr1, rgt, incr2,
    2574             :                                                        dst, GDK_dbl_max,
    2575             :                                                        ci1, ci2, candoff1, candoff2);
    2576           0 :                                 break;
    2577           0 :                         default:
    2578           0 :                                 goto unsupported;
    2579             :                         }
    2580             :                         break;
    2581           0 :                 case TYPE_lng:
    2582           0 :                         switch (tp) {
    2583           0 :                         case TYPE_lng:
    2584           0 :                                 nils = sub_int_lng_lng(lft, incr1, rgt, incr2,
    2585             :                                                        dst, GDK_lng_max,
    2586             :                                                        ci1, ci2, candoff1, candoff2);
    2587           0 :                                 break;
    2588             : #ifdef HAVE_HGE
    2589           0 :                         case TYPE_hge:
    2590           0 :                                 nils = sub_int_lng_hge(lft, incr1, rgt, incr2,
    2591             :                                                        dst, GDK_hge_max,
    2592             :                                                        ci1, ci2, candoff1, candoff2);
    2593           0 :                                 break;
    2594             : #endif
    2595           0 :                         case TYPE_flt:
    2596           0 :                                 nils = sub_int_lng_flt(lft, incr1, rgt, incr2,
    2597             :                                                        dst, GDK_flt_max,
    2598             :                                                        ci1, ci2, candoff1, candoff2);
    2599           0 :                                 break;
    2600           0 :                         case TYPE_dbl:
    2601           0 :                                 nils = sub_int_lng_dbl(lft, incr1, rgt, incr2,
    2602             :                                                        dst, GDK_dbl_max,
    2603             :                                                        ci1, ci2, candoff1, candoff2);
    2604           0 :                                 break;
    2605           0 :                         default:
    2606           0 :                                 goto unsupported;
    2607             :                         }
    2608             :                         break;
    2609             : #ifdef HAVE_HGE
    2610           0 :                 case TYPE_hge:
    2611           0 :                         switch (tp) {
    2612           0 :                         case TYPE_hge:
    2613           0 :                                 nils = sub_int_hge_hge(lft, incr1, rgt, incr2,
    2614             :                                                        dst, GDK_hge_max,
    2615             :                                                        ci1, ci2, candoff1, candoff2);
    2616           0 :                                 break;
    2617           0 :                         case TYPE_flt:
    2618           0 :                                 nils = sub_int_hge_flt(lft, incr1, rgt, incr2,
    2619             :                                                        dst, GDK_flt_max,
    2620             :                                                        ci1, ci2, candoff1, candoff2);
    2621           0 :                                 break;
    2622           0 :                         case TYPE_dbl:
    2623           0 :                                 nils = sub_int_hge_dbl(lft, incr1, rgt, incr2,
    2624             :                                                        dst, GDK_dbl_max,
    2625             :                                                        ci1, ci2, candoff1, candoff2);
    2626           0 :                                 break;
    2627           0 :                         default:
    2628           0 :                                 goto unsupported;
    2629             :                         }
    2630             :                         break;
    2631             : #endif
    2632           0 :                 case TYPE_flt:
    2633           0 :                         switch (tp) {
    2634           0 :                         case TYPE_flt:
    2635           0 :                                 nils = sub_int_flt_flt(lft, incr1, rgt, incr2,
    2636             :                                                        dst, GDK_flt_max,
    2637             :                                                        ci1, ci2, candoff1, candoff2);
    2638           0 :                                 break;
    2639           0 :                         case TYPE_dbl:
    2640           0 :                                 nils = sub_int_flt_dbl(lft, incr1, rgt, incr2,
    2641             :                                                        dst, GDK_dbl_max,
    2642             :                                                        ci1, ci2, candoff1, candoff2);
    2643           0 :                                 break;
    2644           0 :                         default:
    2645           0 :                                 goto unsupported;
    2646             :                         }
    2647             :                         break;
    2648           0 :                 case TYPE_dbl:
    2649           0 :                         switch (tp) {
    2650           0 :                         case TYPE_dbl:
    2651           0 :                                 nils = sub_int_dbl_dbl(lft, incr1, rgt, incr2,
    2652             :                                                        dst, GDK_dbl_max,
    2653             :                                                        ci1, ci2, candoff1, candoff2);
    2654           0 :                                 break;
    2655           0 :                         default:
    2656           0 :                                 goto unsupported;
    2657             :                         }
    2658           0 :                         break;
    2659           0 :                 default:
    2660           0 :                         goto unsupported;
    2661             :                 }
    2662             :                 break;
    2663       46788 :         case TYPE_lng:
    2664       46788 :                 switch (tp2) {
    2665           0 :                 case TYPE_bte:
    2666           0 :                         switch (tp) {
    2667           0 :                         case TYPE_lng:
    2668           0 :                                 nils = sub_lng_bte_lng(lft, incr1, rgt, incr2,
    2669             :                                                        dst, GDK_lng_max,
    2670             :                                                        ci1, ci2, candoff1, candoff2);
    2671           0 :                                 break;
    2672             : #ifdef HAVE_HGE
    2673           0 :                         case TYPE_hge:
    2674           0 :                                 nils = sub_lng_bte_hge(lft, incr1, rgt, incr2,
    2675             :                                                        dst, GDK_hge_max,
    2676             :                                                        ci1, ci2, candoff1, candoff2);
    2677           0 :                                 break;
    2678             : #endif
    2679           0 :                         case TYPE_flt:
    2680           0 :                                 nils = sub_lng_bte_flt(lft, incr1, rgt, incr2,
    2681             :                                                        dst, GDK_flt_max,
    2682             :                                                        ci1, ci2, candoff1, candoff2);
    2683           0 :                                 break;
    2684           0 :                         case TYPE_dbl:
    2685           0 :                                 nils = sub_lng_bte_dbl(lft, incr1, rgt, incr2,
    2686             :                                                        dst, GDK_dbl_max,
    2687             :                                                        ci1, ci2, candoff1, candoff2);
    2688           0 :                                 break;
    2689           0 :                         default:
    2690           0 :                                 goto unsupported;
    2691             :                         }
    2692             :                         break;
    2693           0 :                 case TYPE_sht:
    2694           0 :                         switch (tp) {
    2695           0 :                         case TYPE_lng:
    2696           0 :                                 nils = sub_lng_sht_lng(lft, incr1, rgt, incr2,
    2697             :                                                        dst, GDK_lng_max,
    2698             :                                                        ci1, ci2, candoff1, candoff2);
    2699           0 :                                 break;
    2700             : #ifdef HAVE_HGE
    2701           0 :                         case TYPE_hge:
    2702           0 :                                 nils = sub_lng_sht_hge(lft, incr1, rgt, incr2,
    2703             :                                                        dst, GDK_hge_max,
    2704             :                                                        ci1, ci2, candoff1, candoff2);
    2705           0 :                                 break;
    2706             : #endif
    2707           0 :                         case TYPE_flt:
    2708           0 :                                 nils = sub_lng_sht_flt(lft, incr1, rgt, incr2,
    2709             :                                                        dst, GDK_flt_max,
    2710             :                                                        ci1, ci2, candoff1, candoff2);
    2711           0 :                                 break;
    2712           0 :                         case TYPE_dbl:
    2713           0 :                                 nils = sub_lng_sht_dbl(lft, incr1, rgt, incr2,
    2714             :                                                        dst, GDK_dbl_max,
    2715             :                                                        ci1, ci2, candoff1, candoff2);
    2716           0 :                                 break;
    2717           0 :                         default:
    2718           0 :                                 goto unsupported;
    2719             :                         }
    2720             :                         break;
    2721       16931 :                 case TYPE_int:
    2722       16931 :                         switch (tp) {
    2723       16931 :                         case TYPE_lng:
    2724       16931 :                                 nils = sub_lng_int_lng(lft, incr1, rgt, incr2,
    2725             :                                                        dst, GDK_lng_max,
    2726             :                                                        ci1, ci2, candoff1, candoff2);
    2727       16931 :                                 break;
    2728             : #ifdef HAVE_HGE
    2729           0 :                         case TYPE_hge:
    2730           0 :                                 nils = sub_lng_int_hge(lft, incr1, rgt, incr2,
    2731             :                                                        dst, GDK_hge_max,
    2732             :                                                        ci1, ci2, candoff1, candoff2);
    2733           0 :                                 break;
    2734             : #endif
    2735           0 :                         case TYPE_flt:
    2736           0 :                                 nils = sub_lng_int_flt(lft, incr1, rgt, incr2,
    2737             :                                                        dst, GDK_flt_max,
    2738             :                                                        ci1, ci2, candoff1, candoff2);
    2739           0 :                                 break;
    2740           0 :                         case TYPE_dbl:
    2741           0 :                                 nils = sub_lng_int_dbl(lft, incr1, rgt, incr2,
    2742             :                                                        dst, GDK_dbl_max,
    2743             :                                                        ci1, ci2, candoff1, candoff2);
    2744           0 :                                 break;
    2745           0 :                         default:
    2746           0 :                                 goto unsupported;
    2747             :                         }
    2748             :                         break;
    2749       29857 :                 case TYPE_lng:
    2750       29857 :                         switch (tp) {
    2751       29857 :                         case TYPE_lng:
    2752       29857 :                                 nils = sub_lng_lng_lng(lft, incr1, rgt, incr2,
    2753             :                                                        dst, GDK_lng_max,
    2754             :                                                        ci1, ci2, candoff1, candoff2);
    2755       29857 :                                 break;
    2756             : #ifdef HAVE_HGE
    2757           0 :                         case TYPE_hge:
    2758           0 :                                 nils = sub_lng_lng_hge(lft, incr1, rgt, incr2,
    2759             :                                                        dst, GDK_hge_max,
    2760             :                                                        ci1, ci2, candoff1, candoff2);
    2761           0 :                                 break;
    2762             : #endif
    2763           0 :                         case TYPE_flt:
    2764           0 :                                 nils = sub_lng_lng_flt(lft, incr1, rgt, incr2,
    2765             :                                                        dst, GDK_flt_max,
    2766             :                                                        ci1, ci2, candoff1, candoff2);
    2767           0 :                                 break;
    2768           0 :                         case TYPE_dbl:
    2769           0 :                                 nils = sub_lng_lng_dbl(lft, incr1, rgt, incr2,
    2770             :                                                        dst, GDK_dbl_max,
    2771             :                                                        ci1, ci2, candoff1, candoff2);
    2772           0 :                                 break;
    2773           0 :                         default:
    2774           0 :                                 goto unsupported;
    2775             :                         }
    2776             :                         break;
    2777             : #ifdef HAVE_HGE
    2778           0 :                 case TYPE_hge:
    2779           0 :                         switch (tp) {
    2780           0 :                         case TYPE_hge:
    2781           0 :                                 nils = sub_lng_hge_hge(lft, incr1, rgt, incr2,
    2782             :                                                        dst, GDK_hge_max,
    2783             :                                                        ci1, ci2, candoff1, candoff2);
    2784           0 :                                 break;
    2785           0 :                         case TYPE_flt:
    2786           0 :                                 nils = sub_lng_hge_flt(lft, incr1, rgt, incr2,
    2787             :                                                        dst, GDK_flt_max,
    2788             :                                                        ci1, ci2, candoff1, candoff2);
    2789           0 :                                 break;
    2790           0 :                         case TYPE_dbl:
    2791           0 :                                 nils = sub_lng_hge_dbl(lft, incr1, rgt, incr2,
    2792             :                                                        dst, GDK_dbl_max,
    2793             :                                                        ci1, ci2, candoff1, candoff2);
    2794           0 :                                 break;
    2795           0 :                         default:
    2796           0 :                                 goto unsupported;
    2797             :                         }
    2798             :                         break;
    2799             : #endif
    2800           0 :                 case TYPE_flt:
    2801           0 :                         switch (tp) {
    2802           0 :                         case TYPE_flt:
    2803           0 :                                 nils = sub_lng_flt_flt(lft, incr1, rgt, incr2,
    2804             :                                                        dst, GDK_flt_max,
    2805             :                                                        ci1, ci2, candoff1, candoff2);
    2806           0 :                                 break;
    2807           0 :                         case TYPE_dbl:
    2808           0 :                                 nils = sub_lng_flt_dbl(lft, incr1, rgt, incr2,
    2809             :                                                        dst, GDK_dbl_max,
    2810             :                                                        ci1, ci2, candoff1, candoff2);
    2811           0 :                                 break;
    2812           0 :                         default:
    2813           0 :                                 goto unsupported;
    2814             :                         }
    2815             :                         break;
    2816           0 :                 case TYPE_dbl:
    2817           0 :                         switch (tp) {
    2818           0 :                         case TYPE_dbl:
    2819           0 :                                 nils = sub_lng_dbl_dbl(lft, incr1, rgt, incr2,
    2820             :                                                        dst, GDK_dbl_max,
    2821             :                                                        ci1, ci2, candoff1, candoff2);
    2822           0 :                                 break;
    2823           0 :                         default:
    2824           0 :                                 goto unsupported;
    2825             :                         }
    2826           0 :                         break;
    2827           0 :                 default:
    2828           0 :                         goto unsupported;
    2829             :                 }
    2830             :                 break;
    2831             : #ifdef HAVE_HGE
    2832        3295 :         case TYPE_hge:
    2833        3295 :                 switch (tp2) {
    2834           0 :                 case TYPE_bte:
    2835           0 :                         switch (tp) {
    2836           0 :                         case TYPE_hge:
    2837           0 :                                 nils = sub_hge_bte_hge(lft, incr1, rgt, incr2,
    2838             :                                                        dst, GDK_hge_max,
    2839             :                                                        ci1, ci2, candoff1, candoff2);
    2840           0 :                                 break;
    2841           0 :                         case TYPE_flt:
    2842           0 :                                 nils = sub_hge_bte_flt(lft, incr1, rgt, incr2,
    2843             :                                                        dst, GDK_flt_max,
    2844             :                                                        ci1, ci2, candoff1, candoff2);
    2845           0 :                                 break;
    2846           0 :                         case TYPE_dbl:
    2847           0 :                                 nils = sub_hge_bte_dbl(lft, incr1, rgt, incr2,
    2848             :                                                        dst, GDK_dbl_max,
    2849             :                                                        ci1, ci2, candoff1, candoff2);
    2850           0 :                                 break;
    2851           0 :                         default:
    2852           0 :                                 goto unsupported;
    2853             :                         }
    2854             :                         break;
    2855           0 :                 case TYPE_sht:
    2856           0 :                         switch (tp) {
    2857           0 :                         case TYPE_hge:
    2858           0 :                                 nils = sub_hge_sht_hge(lft, incr1, rgt, incr2,
    2859             :                                                        dst, GDK_hge_max,
    2860             :                                                        ci1, ci2, candoff1, candoff2);
    2861           0 :                                 break;
    2862           0 :                         case TYPE_flt:
    2863           0 :                                 nils = sub_hge_sht_flt(lft, incr1, rgt, incr2,
    2864             :                                                        dst, GDK_flt_max,
    2865             :                                                        ci1, ci2, candoff1, candoff2);
    2866           0 :                                 break;
    2867           0 :                         case TYPE_dbl:
    2868           0 :                                 nils = sub_hge_sht_dbl(lft, incr1, rgt, incr2,
    2869             :                                                        dst, GDK_dbl_max,
    2870             :                                                        ci1, ci2, candoff1, candoff2);
    2871           0 :                                 break;
    2872           0 :                         default:
    2873           0 :                                 goto unsupported;
    2874             :                         }
    2875             :                         break;
    2876           0 :                 case TYPE_int:
    2877           0 :                         switch (tp) {
    2878           0 :                         case TYPE_hge:
    2879           0 :                                 nils = sub_hge_int_hge(lft, incr1, rgt, incr2,
    2880             :                                                        dst, GDK_hge_max,
    2881             :                                                        ci1, ci2, candoff1, candoff2);
    2882           0 :                                 break;
    2883           0 :                         case TYPE_flt:
    2884           0 :                                 nils = sub_hge_int_flt(lft, incr1, rgt, incr2,
    2885             :                                                        dst, GDK_flt_max,
    2886             :                                                        ci1, ci2, candoff1, candoff2);
    2887           0 :                                 break;
    2888           0 :                         case TYPE_dbl:
    2889           0 :                                 nils = sub_hge_int_dbl(lft, incr1, rgt, incr2,
    2890             :                                                        dst, GDK_dbl_max,
    2891             :                                                        ci1, ci2, candoff1, candoff2);
    2892           0 :                                 break;
    2893           0 :                         default:
    2894           0 :                                 goto unsupported;
    2895             :                         }
    2896             :                         break;
    2897           0 :                 case TYPE_lng:
    2898           0 :                         switch (tp) {
    2899           0 :                         case TYPE_hge:
    2900           0 :                                 nils = sub_hge_lng_hge(lft, incr1, rgt, incr2,
    2901             :                                                        dst, GDK_hge_max,
    2902             :                                                        ci1, ci2, candoff1, candoff2);
    2903           0 :                                 break;
    2904           0 :                         case TYPE_flt:
    2905           0 :                                 nils = sub_hge_lng_flt(lft, incr1, rgt, incr2,
    2906             :                                                        dst, GDK_flt_max,
    2907             :                                                        ci1, ci2, candoff1, candoff2);
    2908           0 :                                 break;
    2909           0 :                         case TYPE_dbl:
    2910           0 :                                 nils = sub_hge_lng_dbl(lft, incr1, rgt, incr2,
    2911             :                                                        dst, GDK_dbl_max,
    2912             :                                                        ci1, ci2, candoff1, candoff2);
    2913           0 :                                 break;
    2914           0 :                         default:
    2915           0 :                                 goto unsupported;
    2916             :                         }
    2917             :                         break;
    2918        3295 :                 case TYPE_hge:
    2919        3295 :                         switch (tp) {
    2920        3295 :                         case TYPE_hge:
    2921        3295 :                                 nils = sub_hge_hge_hge(lft, incr1, rgt, incr2,
    2922             :                                                        dst, GDK_hge_max,
    2923             :                                                        ci1, ci2, candoff1, candoff2);
    2924        3295 :                                 break;
    2925           0 :                         case TYPE_flt:
    2926           0 :                                 nils = sub_hge_hge_flt(lft, incr1, rgt, incr2,
    2927             :                                                        dst, GDK_flt_max,
    2928             :                                                        ci1, ci2, candoff1, candoff2);
    2929           0 :                                 break;
    2930           0 :                         case TYPE_dbl:
    2931           0 :                                 nils = sub_hge_hge_dbl(lft, incr1, rgt, incr2,
    2932             :                                                        dst, GDK_dbl_max,
    2933             :                                                        ci1, ci2, candoff1, candoff2);
    2934           0 :                                 break;
    2935           0 :                         default:
    2936           0 :                                 goto unsupported;
    2937             :                         }
    2938             :                         break;
    2939           0 :                 case TYPE_flt:
    2940           0 :                         switch (tp) {
    2941           0 :                         case TYPE_flt:
    2942           0 :                                 nils = sub_hge_flt_flt(lft, incr1, rgt, incr2,
    2943             :                                                        dst, GDK_flt_max,
    2944             :                                                        ci1, ci2, candoff1, candoff2);
    2945           0 :                                 break;
    2946           0 :                         case TYPE_dbl:
    2947           0 :                                 nils = sub_hge_flt_dbl(lft, incr1, rgt, incr2,
    2948             :                                                        dst, GDK_dbl_max,
    2949             :                                                        ci1, ci2, candoff1, candoff2);
    2950           0 :                                 break;
    2951           0 :                         default:
    2952           0 :                                 goto unsupported;
    2953             :                         }
    2954             :                         break;
    2955           0 :                 case TYPE_dbl:
    2956           0 :                         switch (tp) {
    2957           0 :                         case TYPE_dbl:
    2958           0 :                                 nils = sub_hge_dbl_dbl(lft, incr1, rgt, incr2,
    2959             :                                                        dst, GDK_dbl_max,
    2960             :                                                        ci1, ci2, candoff1, candoff2);
    2961           0 :                                 break;
    2962           0 :                         default:
    2963           0 :                                 goto unsupported;
    2964             :                         }
    2965           0 :                         break;
    2966           0 :                 default:
    2967           0 :                         goto unsupported;
    2968             :                 }
    2969             :                 break;
    2970             : #endif
    2971          15 :         case TYPE_flt:
    2972          15 :                 switch (tp2) {
    2973           0 :                 case TYPE_bte:
    2974           0 :                         switch (tp) {
    2975           0 :                         case TYPE_flt:
    2976           0 :                                 nils = sub_flt_bte_flt(lft, incr1, rgt, incr2,
    2977             :                                                        dst, GDK_flt_max,
    2978             :                                                        ci1, ci2, candoff1, candoff2);
    2979           0 :                                 break;
    2980           0 :                         case TYPE_dbl:
    2981           0 :                                 nils = sub_flt_bte_dbl(lft, incr1, rgt, incr2,
    2982             :                                                        dst, GDK_dbl_max,
    2983             :                                                        ci1, ci2, candoff1, candoff2);
    2984           0 :                                 break;
    2985           0 :                         default:
    2986           0 :                                 goto unsupported;
    2987             :                         }
    2988             :                         break;
    2989           0 :                 case TYPE_sht:
    2990           0 :                         switch (tp) {
    2991           0 :                         case TYPE_flt:
    2992           0 :                                 nils = sub_flt_sht_flt(lft, incr1, rgt, incr2,
    2993             :                                                        dst, GDK_flt_max,
    2994             :                                                        ci1, ci2, candoff1, candoff2);
    2995           0 :                                 break;
    2996           0 :                         case TYPE_dbl:
    2997           0 :                                 nils = sub_flt_sht_dbl(lft, incr1, rgt, incr2,
    2998             :                                                        dst, GDK_dbl_max,
    2999             :                                                        ci1, ci2, candoff1, candoff2);
    3000           0 :                                 break;
    3001           0 :                         default:
    3002           0 :                                 goto unsupported;
    3003             :                         }
    3004             :                         break;
    3005           0 :                 case TYPE_int:
    3006           0 :                         switch (tp) {
    3007           0 :                         case TYPE_flt:
    3008           0 :                                 nils = sub_flt_int_flt(lft, incr1, rgt, incr2,
    3009             :                                                        dst, GDK_flt_max,
    3010             :                                                        ci1, ci2, candoff1, candoff2);
    3011           0 :                                 break;
    3012           0 :                         case TYPE_dbl:
    3013           0 :                                 nils = sub_flt_int_dbl(lft, incr1, rgt, incr2,
    3014             :                                                        dst, GDK_dbl_max,
    3015             :                                                        ci1, ci2, candoff1, candoff2);
    3016           0 :                                 break;
    3017           0 :                         default:
    3018           0 :                                 goto unsupported;
    3019             :                         }
    3020             :                         break;
    3021           0 :                 case TYPE_lng:
    3022           0 :                         switch (tp) {
    3023           0 :                         case TYPE_flt:
    3024           0 :                                 nils = sub_flt_lng_flt(lft, incr1, rgt, incr2,
    3025             :                                                        dst, GDK_flt_max,
    3026             :                                                        ci1, ci2, candoff1, candoff2);
    3027           0 :                                 break;
    3028           0 :                         case TYPE_dbl:
    3029           0 :                                 nils = sub_flt_lng_dbl(lft, incr1, rgt, incr2,
    3030             :                                                        dst, GDK_dbl_max,
    3031             :                                                        ci1, ci2, candoff1, candoff2);
    3032           0 :                                 break;
    3033           0 :                         default:
    3034           0 :                                 goto unsupported;
    3035             :                         }
    3036             :                         break;
    3037             : #ifdef HAVE_HGE
    3038           0 :                 case TYPE_hge:
    3039           0 :                         switch (tp) {
    3040           0 :                         case TYPE_flt:
    3041           0 :                                 nils = sub_flt_hge_flt(lft, incr1, rgt, incr2,
    3042             :                                                        dst, GDK_flt_max,
    3043             :                                                        ci1, ci2, candoff1, candoff2);
    3044           0 :                                 break;
    3045           0 :                         case TYPE_dbl:
    3046           0 :                                 nils = sub_flt_hge_dbl(lft, incr1, rgt, incr2,
    3047             :                                                        dst, GDK_dbl_max,
    3048             :                                                        ci1, ci2, candoff1, candoff2);
    3049           0 :                                 break;
    3050           0 :                         default:
    3051           0 :                                 goto unsupported;
    3052             :                         }
    3053             :                         break;
    3054             : #endif
    3055          15 :                 case TYPE_flt:
    3056          15 :                         switch (tp) {
    3057          15 :                         case TYPE_flt:
    3058          15 :                                 nils = sub_flt_flt_flt(lft, incr1, rgt, incr2,
    3059             :                                                        dst, GDK_flt_max,
    3060             :                                                        ci1, ci2, candoff1, candoff2);
    3061          15 :                                 break;
    3062           0 :                         case TYPE_dbl:
    3063           0 :                                 nils = sub_flt_flt_dbl(lft, incr1, rgt, incr2,
    3064             :                                                        dst, GDK_dbl_max,
    3065             :                                                        ci1, ci2, candoff1, candoff2);
    3066           0 :                                 break;
    3067           0 :                         default:
    3068           0 :                                 goto unsupported;
    3069             :                         }
    3070             :                         break;
    3071           0 :                 case TYPE_dbl:
    3072           0 :                         switch (tp) {
    3073           0 :                         case TYPE_dbl:
    3074           0 :                                 nils = sub_flt_dbl_dbl(lft, incr1, rgt, incr2,
    3075             :                                                        dst, GDK_dbl_max,
    3076             :                                                        ci1, ci2, candoff1, candoff2);
    3077           0 :                                 break;
    3078           0 :                         default:
    3079           0 :                                 goto unsupported;
    3080             :                         }
    3081           0 :                         break;
    3082           0 :                 default:
    3083           0 :                         goto unsupported;
    3084             :                 }
    3085             :                 break;
    3086         198 :         case TYPE_dbl:
    3087         198 :                 switch (tp2) {
    3088           0 :                 case TYPE_bte:
    3089           0 :                         switch (tp) {
    3090           0 :                         case TYPE_dbl:
    3091           0 :                                 nils = sub_dbl_bte_dbl(lft, incr1, rgt, incr2,
    3092             :                                                        dst, GDK_dbl_max,
    3093             :                                                        ci1, ci2, candoff1, candoff2);
    3094           0 :                                 break;
    3095           0 :                         default:
    3096           0 :                                 goto unsupported;
    3097             :                         }
    3098           0 :                         break;
    3099           0 :                 case TYPE_sht:
    3100           0 :                         switch (tp) {
    3101           0 :                         case TYPE_dbl:
    3102           0 :                                 nils = sub_dbl_sht_dbl(lft, incr1, rgt, incr2,
    3103             :                                                        dst, GDK_dbl_max,
    3104             :                                                        ci1, ci2, candoff1, candoff2);
    3105           0 :                                 break;
    3106           0 :                         default:
    3107           0 :                                 goto unsupported;
    3108             :                         }
    3109           0 :                         break;
    3110           0 :                 case TYPE_int:
    3111           0 :                         switch (tp) {
    3112           0 :                         case TYPE_dbl:
    3113           0 :                                 nils = sub_dbl_int_dbl(lft, incr1, rgt, incr2,
    3114             :                                                        dst, GDK_dbl_max,
    3115             :                                                        ci1, ci2, candoff1, candoff2);
    3116           0 :                                 break;
    3117           0 :                         default:
    3118           0 :                                 goto unsupported;
    3119             :                         }
    3120           0 :                         break;
    3121           0 :                 case TYPE_lng:
    3122           0 :                         switch (tp) {
    3123           0 :                         case TYPE_dbl:
    3124           0 :                                 nils = sub_dbl_lng_dbl(lft, incr1, rgt, incr2,
    3125             :                                                        dst, GDK_dbl_max,
    3126             :                                                        ci1, ci2, candoff1, candoff2);
    3127           0 :                                 break;
    3128           0 :                         default:
    3129           0 :                                 goto unsupported;
    3130             :                         }
    3131           0 :                         break;
    3132             : #ifdef HAVE_HGE
    3133           0 :                 case TYPE_hge:
    3134           0 :                         switch (tp) {
    3135           0 :                         case TYPE_dbl:
    3136           0 :                                 nils = sub_dbl_hge_dbl(lft, incr1, rgt, incr2,
    3137             :                                                        dst, GDK_dbl_max,
    3138             :                                                        ci1, ci2, candoff1, candoff2);
    3139           0 :                                 break;
    3140           0 :                         default:
    3141           0 :                                 goto unsupported;
    3142             :                         }
    3143           0 :                         break;
    3144             : #endif
    3145           0 :                 case TYPE_flt:
    3146           0 :                         switch (tp) {
    3147           0 :                         case TYPE_dbl:
    3148           0 :                                 nils = sub_dbl_flt_dbl(lft, incr1, rgt, incr2,
    3149             :                                                        dst, GDK_dbl_max,
    3150             :                                                        ci1, ci2, candoff1, candoff2);
    3151           0 :                                 break;
    3152           0 :                         default:
    3153           0 :                                 goto unsupported;
    3154             :                         }
    3155           0 :                         break;
    3156         198 :                 case TYPE_dbl:
    3157         198 :                         switch (tp) {
    3158         198 :                         case TYPE_dbl:
    3159         198 :                                 nils = sub_dbl_dbl_dbl(lft, incr1, rgt, incr2,
    3160             :                                                        dst, GDK_dbl_max,
    3161             :                                                        ci1, ci2, candoff1, candoff2);
    3162         198 :                                 break;
    3163           0 :                         default:
    3164           0 :                                 goto unsupported;
    3165             :                         }
    3166         198 :                         break;
    3167           0 :                 default:
    3168           0 :                         goto unsupported;
    3169             :                 }
    3170             :                 break;
    3171           0 :         default:
    3172           0 :                 goto unsupported;
    3173             :         }
    3174             : 
    3175             :         return nils;
    3176             : 
    3177           0 :   unsupported:
    3178           0 :         GDKerror("%s: type combination (sub(%s,%s)->%s) not supported.\n",
    3179             :                  func, ATOMname(tp1), ATOMname(tp2), ATOMname(tp));
    3180           0 :         return BUN_NONE;
    3181             : }
    3182             : 
    3183             : BAT *
    3184       13232 : BATcalcsub(BAT *b1, BAT *b2, BAT *s1, BAT *s2, int tp)
    3185             : {
    3186       13232 :         lng t0 = 0;
    3187       13232 :         BAT *bn;
    3188       13232 :         BUN nils;
    3189       13232 :         struct canditer ci1, ci2;
    3190             : 
    3191       13232 :         TRC_DEBUG_IF(ALGO) t0 = GDKusec();
    3192             : 
    3193       13232 :         BATcheck(b1, NULL);
    3194       13232 :         BATcheck(b2, NULL);
    3195             : 
    3196       13232 :         canditer_init(&ci1, b1, s1);
    3197       13231 :         canditer_init(&ci2, b2, s2);
    3198       13232 :         if (ci1.ncand != ci2.ncand || ci1.hseq != ci2.hseq) {
    3199           0 :                 GDKerror("inputs not the same size.\n");
    3200           0 :                 return NULL;
    3201             :         }
    3202             : 
    3203       13232 :         bn = COLnew(ci1.hseq, tp, ci1.ncand, TRANSIENT);
    3204       13232 :         if (bn == NULL)
    3205             :                 return NULL;
    3206       13232 :         if (ci1.ncand == 0)
    3207             :                 return bn;
    3208             : 
    3209       11242 :         BATiter b1i = bat_iterator(b1);
    3210       11242 :         BATiter b2i = bat_iterator(b2);
    3211       22484 :         nils = sub_typeswitchloop(b1i.base, b1i.type, true,
    3212       11242 :                                   b2i.base, b2i.type, true,
    3213       11242 :                                   Tloc(bn, 0), tp,
    3214             :                                   &ci1, &ci2,
    3215             :                                   b1->hseqbase, b2->hseqbase, __func__);
    3216       11242 :         bat_iterator_end(&b1i);
    3217       11242 :         bat_iterator_end(&b2i);
    3218             : 
    3219       11242 :         if (nils == BUN_NONE) {
    3220           0 :                 BBPunfix(bn->batCacheid);
    3221           0 :                 return NULL;
    3222             :         }
    3223             : 
    3224       11242 :         BATsetcount(bn, ci1.ncand);
    3225             : 
    3226       11242 :         bn->tsorted = ci1.ncand <= 1 || nils == ci1.ncand;
    3227       11242 :         bn->trevsorted = ci1.ncand <= 1 || nils == ci1.ncand;
    3228       11242 :         bn->tkey = ci1.ncand <= 1;
    3229       11242 :         bn->tnil = nils != 0;
    3230       11242 :         bn->tnonil = nils == 0;
    3231             : 
    3232       11242 :         TRC_DEBUG(ALGO, "b1=" ALGOBATFMT ",b2=" ALGOBATFMT
    3233             :                   ",s1=" ALGOOPTBATFMT ",s2=" ALGOOPTBATFMT
    3234             :                   " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
    3235             :                   ALGOBATPAR(b1), ALGOBATPAR(b2),
    3236             :                   ALGOOPTBATPAR(s1), ALGOOPTBATPAR(s2),
    3237             :                   ALGOOPTBATPAR(bn), GDKusec() - t0);
    3238             : 
    3239             :         return bn;
    3240             : }
    3241             : 
    3242             : BAT *
    3243       14332 : BATcalcsubcst(BAT *b, const ValRecord *v, BAT *s, int tp)
    3244             : {
    3245       14332 :         lng t0 = 0;
    3246       14332 :         BAT *bn;
    3247       14332 :         BUN nils;
    3248       14332 :         struct canditer ci;
    3249             : 
    3250       14332 :         TRC_DEBUG_IF(ALGO) t0 = GDKusec();
    3251             : 
    3252       14332 :         BATcheck(b, NULL);
    3253             : 
    3254       14332 :         canditer_init(&ci, b, s);
    3255             : 
    3256       14331 :         bn = COLnew(ci.hseq, tp, ci.ncand, TRANSIENT);
    3257       14331 :         if (bn == NULL)
    3258             :                 return NULL;
    3259       14331 :         if (ci.ncand == 0)
    3260             :                 return bn;
    3261             : 
    3262       12879 :         BATiter bi = bat_iterator(b);
    3263       25757 :         nils = sub_typeswitchloop(bi.base, bi.type, true,
    3264       12878 :                                   VALptr(v), v->vtype, false,
    3265       12878 :                                   Tloc(bn, 0), tp,
    3266             :                                   &ci,
    3267       12878 :                                   &(struct canditer){.tpe=cand_dense, .ncand=ci.ncand},
    3268             :                                   b->hseqbase, 0, __func__);
    3269             : 
    3270       12879 :         if (nils == BUN_NONE) {
    3271           0 :                 bat_iterator_end(&bi);
    3272           0 :                 BBPunfix(bn->batCacheid);
    3273           0 :                 return NULL;
    3274             :         }
    3275             : 
    3276       12879 :         BATsetcount(bn, ci.ncand);
    3277             : 
    3278             :         /* if the input is sorted, and no overflow occurred, the result
    3279             :          * is also sorted */
    3280        4361 :         bn->tsorted = (bi.sorted && nils == 0) ||
    3281       12978 :                 ci.ncand <= 1 || nils == ci.ncand;
    3282        1244 :         bn->trevsorted = (bi.revsorted && nils == 0) ||
    3283       12888 :                 ci.ncand <= 1 || nils == ci.ncand;
    3284       12879 :         bn->tkey = ci.ncand <= 1;
    3285       12879 :         bn->tnil = nils != 0;
    3286       12879 :         bn->tnonil = nils == 0;
    3287       12879 :         bat_iterator_end(&bi);
    3288             : 
    3289       12879 :         TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
    3290             :                   " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
    3291             :                   ALGOBATPAR(b), ALGOOPTBATPAR(s),
    3292             :                   ALGOOPTBATPAR(bn), GDKusec() - t0);
    3293             : 
    3294             :         return bn;
    3295             : }
    3296             : 
    3297             : BAT *
    3298          48 : BATcalccstsub(const ValRecord *v, BAT *b, BAT *s, int tp)
    3299             : {
    3300          48 :         lng t0 = 0;
    3301          48 :         BAT *bn;
    3302          48 :         BUN nils;
    3303          48 :         struct canditer ci;
    3304             : 
    3305          48 :         TRC_DEBUG_IF(ALGO) t0 = GDKusec();
    3306             : 
    3307          48 :         BATcheck(b, NULL);
    3308             : 
    3309          48 :         canditer_init(&ci, b, s);
    3310             : 
    3311          48 :         bn = COLnew(ci.hseq, tp, ci.ncand, TRANSIENT);
    3312          48 :         if (bn == NULL)
    3313             :                 return NULL;
    3314          48 :         if (ci.ncand == 0)
    3315             :                 return bn;
    3316             : 
    3317          40 :         BATiter bi = bat_iterator(b);
    3318          80 :         nils = sub_typeswitchloop(VALptr(v), v->vtype, false,
    3319          40 :                                   bi.base, bi.type, true,
    3320          40 :                                   Tloc(bn, 0), tp,
    3321          40 :                                   &(struct canditer){.tpe=cand_dense, .ncand=ci.ncand},
    3322             :                                   &ci,
    3323             :                                   0, b->hseqbase, __func__);
    3324             : 
    3325          40 :         if (nils == BUN_NONE) {
    3326           0 :                 bat_iterator_end(&bi);
    3327           0 :                 BBPunfix(bn->batCacheid);
    3328           0 :                 return NULL;
    3329             :         }
    3330             : 
    3331          40 :         BATsetcount(bn, ci.ncand);
    3332             : 
    3333             :         /* if the input is sorted, and no overflow occurred, the result
    3334             :          * is sorted in the opposite direction (except that NILs mess
    3335             :          * things up */
    3336          35 :         bn->tsorted = (nils == 0 && bi.revsorted) ||
    3337          56 :                 ci.ncand <= 1 || nils == ci.ncand;
    3338          35 :         bn->trevsorted = (nils == 0 && bi.sorted) ||
    3339          42 :                 ci.ncand <= 1 || nils == ci.ncand;
    3340          40 :         bn->tkey = ci.ncand <= 1;
    3341          40 :         bn->tnil = nils != 0;
    3342          40 :         bn->tnonil = nils == 0;
    3343          40 :         bat_iterator_end(&bi);
    3344             : 
    3345          40 :         TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
    3346             :                   " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
    3347             :                   ALGOBATPAR(b), ALGOOPTBATPAR(s),
    3348             :                   ALGOOPTBATPAR(bn), GDKusec() - t0);
    3349             : 
    3350             :         return bn;
    3351             : }
    3352             : 
    3353             : gdk_return
    3354       44127 : VARcalcsub(ValPtr ret, const ValRecord *lft, const ValRecord *rgt)
    3355             : {
    3356       44126 :         if (sub_typeswitchloop(VALptr(lft), lft->vtype, false,
    3357       44127 :                                VALptr(rgt), rgt->vtype, false,
    3358             :                                VALget(ret), ret->vtype,
    3359       44127 :                                &(struct canditer){.tpe=cand_dense, .ncand=1},
    3360       44127 :                                &(struct canditer){.tpe=cand_dense, .ncand=1},
    3361             :                                0, 0, __func__) == BUN_NONE)
    3362           2 :                 return GDK_FAIL;
    3363       44124 :         return GDK_SUCCEED;
    3364             : }
    3365             : 
    3366             : BAT *
    3367           0 : BATcalcdecr(BAT *b, BAT *s)
    3368             : {
    3369           0 :         return BATcalcincrdecr(b, s, sub_typeswitchloop,
    3370             :                                __func__);
    3371             : }
    3372             : 
    3373             : gdk_return
    3374           0 : VARcalcdecr(ValPtr ret, const ValRecord *v)
    3375             : {
    3376           0 :         if (sub_typeswitchloop(VALptr(v), v->vtype, false,
    3377           0 :                                &(bte){1}, TYPE_bte, false,
    3378             :                                VALget(ret), ret->vtype,
    3379           0 :                                &(struct canditer){.tpe=cand_dense, .ncand=1},
    3380           0 :                                &(struct canditer){.tpe=cand_dense, .ncand=1},
    3381             :                                0, 0, __func__) == BUN_NONE)
    3382           0 :                 return GDK_FAIL;
    3383           0 :         return GDK_SUCCEED;
    3384             : }

Generated by: LCOV version 1.14