LCOV - code coverage report
Current view: top level - gdk - gdk_calc_mod.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 133 803 16.6 %
Date: 2024-04-26 00:35:57 Functions: 13 124 10.5 %

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

Generated by: LCOV version 1.14