LCOV - code coverage report
Current view: top level - gdk - gdk_calc_mod.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 125 801 15.6 %
Date: 2024-04-25 20:03:45 Functions: 12 124 9.7 %

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

Generated by: LCOV version 1.14