Changeset: beefaaac220f for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=beefaaac220f
Modified Files:
        gdk/gdk_aggr.c
        gdk/gdk_calc_private.h
Branch: int128
Log Message:

added int128 / "hge" support in gdk/gdk_aggr.c & gdk/gdk_calc_private.h


diffs (truncated from 438 to 300 lines):

diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -374,6 +374,31 @@ dosum(const void *values, int nonil, oid
                }
                break;
        }
+#ifdef HAVE_HGE
+       case TYPE_hge: {
+               hge *sums = (hge *) results;
+               switch (ATOMstorage(tp1)) {
+               case TYPE_bte:
+                       AGGR_SUM(bte, hge);
+                       break;
+               case TYPE_sht:
+                       AGGR_SUM(sht, hge);
+                       break;
+               case TYPE_int:
+                       AGGR_SUM(int, hge);
+                       break;
+               case TYPE_lng:
+                       AGGR_SUM(lng, lng);
+                       break;
+               case TYPE_hge:
+                       AGGR_SUM(hge, hge);
+                       break;
+               default:
+                       goto unsupported;
+               }
+               break;
+       }
+#endif
        case TYPE_flt: {
                flt *sums = (flt *) results;
                switch (ATOMstorage(tp1)) {
@@ -532,6 +557,11 @@ BATsum(void *res, int tp, BAT *b, BAT *s
        case TYPE_lng:
                * (lng *) res = nil_if_empty ? lng_nil : 0;
                break;
+#ifdef HAVE_HGE
+       case TYPE_hge:
+               * (hge *) res = nil_if_empty ? hge_nil : 0;
+               break;
+#endif
        case TYPE_flt:
        case TYPE_dbl:
                switch (ATOMstorage(b->ttype)) {
@@ -539,6 +569,9 @@ BATsum(void *res, int tp, BAT *b, BAT *s
                case TYPE_sht:
                case TYPE_int:
                case TYPE_lng:
+#ifdef HAVE_HGE
+               case TYPE_hge:
+#endif
                {
                        /* special case for summing integer types into
                         * a floating point: We calculate the average
@@ -659,6 +692,52 @@ BATsum(void *res, int tp, BAT *b, BAT *s
                }                                                       \
        } while (0)
 
+#ifdef HAVE_HGE
+#define AGGR_PROD_HGE(TYPE)                                            \
+       do {                                                            \
+               const TYPE *vals = (const TYPE *) values;               \
+               assert(gidincr == 0 || gidincr == 1);                   \
+               gid = 0;        /* doesn't change if gidincr == 0 */    \
+               for (;;) {                                              \
+                       if (cand) {                                     \
+                               if (cand == candend)                    \
+                                       break;                          \
+                               i = *cand++ - seqb;                     \
+                               if (i >= end)                           \
+                                       break;                          \
+                       } else {                                        \
+                               i = start++;                            \
+                               if (i == end)                           \
+                                       break;                          \
+                       }                                               \
+                       if (gids == NULL || gidincr == 0 ||             \
+                           (gids[i] >= min && gids[i] <= max)) {       \
+                               if (gidincr) {                          \
+                                       if (gids)                       \
+                                               gid = gids[i] - min;    \
+                                       else                            \
+                                               gid = (oid) i;          \
+                               }                                       \
+                               if (nil_if_empty &&                     \
+                                   !(seen[gid >> 5] & (1 << (gid & 0x1F)))) { \
+                                       seen[gid >> 5] |= 1 << (gid & 0x1F); \
+                                       prods[gid] = 1;                 \
+                               }                                       \
+                               if (vals[i] == TYPE##_nil) {            \
+                                       if (!skip_nils) {               \
+                                               prods[gid] = hge_nil;   \
+                                               nils++;                 \
+                                       }                               \
+                               } else if (prods[gid] != hge_nil) {     \
+                                       HGEMUL_CHECK(TYPE, vals[i],     \
+                                                    hge, prods[gid],   \
+                                                    prods[gid],        \
+                                                    goto overflow);    \
+                               }                                       \
+                       }                                               \
+               }                                                       \
+       } while (0)
+#else
 #define AGGR_PROD_LNG(TYPE)                                            \
        do {                                                            \
                const TYPE *vals = (const TYPE *) values;               \
@@ -703,6 +782,7 @@ BATsum(void *res, int tp, BAT *b, BAT *s
                        }                                               \
                }                                                       \
        } while (0)
+#endif
 
 #define AGGR_PROD_FLOAT(TYPE1, TYPE2)                                  \
        do {                                                            \
@@ -815,6 +895,51 @@ doprod(const void *values, oid seqb, BUN
                }
                break;
        }
+#ifdef HAVE_HGE
+       case TYPE_lng: {
+               lng *prods = (lng *) results;
+               switch (ATOMstorage(tp1)) {
+               case TYPE_bte:
+                       AGGR_PROD(bte, lng, hge);
+                       break;
+               case TYPE_sht:
+                       AGGR_PROD(sht, lng, hge);
+                       break;
+               case TYPE_int:
+                       AGGR_PROD(int, lng, hge);
+                       break;
+               case TYPE_lng:
+                       AGGR_PROD(lng, lng, hge);
+                       break;
+               default:
+                       goto unsupported;
+               }
+               break;
+       }
+       case TYPE_hge: {
+               hge *prods = (hge *) results;
+               switch (ATOMstorage(tp1)) {
+               case TYPE_bte:
+                       AGGR_PROD_HGE(bte);
+                       break;
+               case TYPE_sht:
+                       AGGR_PROD_HGE(sht);
+                       break;
+               case TYPE_int:
+                       AGGR_PROD_HGE(int);
+                       break;
+               case TYPE_lng:
+                       AGGR_PROD_HGE(lng);
+                       break;
+               case TYPE_hge:
+                       AGGR_PROD_HGE(hge);
+                       break;
+               default:
+                       goto unsupported;
+               }
+               break;
+       }
+#else
        case TYPE_lng: {
                lng *prods = (lng *) results;
                switch (ATOMstorage(tp1)) {
@@ -835,6 +960,7 @@ doprod(const void *values, oid seqb, BUN
                }
                break;
        }
+#endif
        case TYPE_flt: {
                flt *prods = (flt *) results;
                switch (ATOMstorage(tp1)) {
@@ -850,6 +976,11 @@ doprod(const void *values, oid seqb, BUN
                case TYPE_lng:
                        AGGR_PROD_FLOAT(lng, flt);
                        break;
+#ifdef HAVE_HGE
+               case TYPE_hge:
+                       AGGR_PROD_FLOAT(hge, flt);
+                       break;
+#endif
                case TYPE_flt:
                        AGGR_PROD_FLOAT(flt, flt);
                        break;
@@ -873,6 +1004,11 @@ doprod(const void *values, oid seqb, BUN
                case TYPE_lng:
                        AGGR_PROD_FLOAT(lng, dbl);
                        break;
+#ifdef HAVE_HGE
+               case TYPE_hge:
+                       AGGR_PROD_FLOAT(hge, dbl);
+                       break;
+#endif
                case TYPE_flt:
                        AGGR_PROD_FLOAT(flt, dbl);
                        break;
@@ -1017,6 +1153,11 @@ BATprod(void *res, int tp, BAT *b, BAT *
        case TYPE_lng:
                * (lng *) res = nil_if_empty ? lng_nil : (lng) 1;
                break;
+#ifdef HAVE_HGE
+       case TYPE_hge:
+               * (hge *) res = nil_if_empty ? hge_nil : (hge) 1;
+               break;
+#endif
        case TYPE_flt:
                * (flt *) res = nil_if_empty ? flt_nil : (flt) 1;
                break;
@@ -1261,6 +1402,9 @@ BATgroupavg(BAT **bnp, BAT **cntsp, BAT 
        case TYPE_sht:
        case TYPE_int:
        case TYPE_lng:
+#ifdef HAVE_HGE
+       case TYPE_hge:
+#endif
                rems = GDKzalloc(ngrp * sizeof(BUN));
                if (rems == NULL)
                        goto alloc_fail;
@@ -1302,6 +1446,11 @@ BATgroupavg(BAT **bnp, BAT **cntsp, BAT 
        case TYPE_lng:
                AGGR_AVG(lng);
                break;
+#ifdef HAVE_HGE
+       case TYPE_hge:
+               AGGR_AVG(hge);
+               break;
+#endif
        case TYPE_flt:
                AGGR_AVG_FLOAT(flt);
                break;
@@ -1353,12 +1502,12 @@ BATgroupavg(BAT **bnp, BAT **cntsp, BAT 
        return GDK_FAIL;
 }
 
-#define AVERAGE_TYPE(TYPE)                                             \
+#define AVERAGE_TYPE_LNG_HGE(TYPE,lng_hge)                             \
        do {                                                            \
                TYPE x, a;                                              \
                                                                        \
                /* first try to calculate the sum of all values into a */ \
-               /* lng */                                               \
+               /* lng_hge */                                           \
                for (;;) {                                              \
                        if (cand) {                                     \
                                if (cand == candend)                    \
@@ -1375,8 +1524,8 @@ BATgroupavg(BAT **bnp, BAT **cntsp, BAT 
                        if (x == TYPE##_nil)                            \
                                continue;                               \
                        ADD_WITH_CHECK(TYPE, x,                         \
-                                      lng, sum,                        \
-                                      lng, sum,                        \
+                                      lng_hge, sum,                    \
+                                      lng_hge, sum,                    \
                                       goto overflow##TYPE);            \
                        /* don't count value until after overflow check */ \
                        n++;                                            \
@@ -1386,17 +1535,17 @@ BATgroupavg(BAT **bnp, BAT **cntsp, BAT 
                if (0) {                                                \
                  overflow##TYPE:                                       \
                        /* we get here if sum(x[0],...,x[i]) doesn't */ \
-                       /* fit in a lng but sum(x[0],...,x[i-1]) did */ \
+                       /* fit in a lng_hge but sum(x[0],...,x[i-1]) did */ \
                        /* the variable sum contains that sum */        \
                        /* the rest of the calculation is done */       \
                        /* according to the loop invariant described */ \
                        /* in the below loop */                         \
                        if (sum >= 0) {                                 \
-                               a = (TYPE) (sum / (lng) n); /* this fits */ \
+                               a = (TYPE) (sum / (lng_hge) n); /* this fits */ 
\
                                r = (BUN) (sum % (SBUN) n);             \
                        } else {                                        \
                                sum = -sum;                             \
-                               a = - (TYPE) (sum / (lng) n); /* this fits */ \
+                               a = - (TYPE) (sum / (lng_hge) n); /* this fits 
*/ \
                                r = (BUN) (sum % (SBUN) n);             \
                                if (r) {                                \
                                        a--;                            \
@@ -1427,6 +1576,12 @@ BATgroupavg(BAT **bnp, BAT **cntsp, BAT 
                }                                                       \
        } while (0)
 
+#ifdef HAVE_HGE
+#define AVERAGE_TYPE(TYPE) AVERAGE_TYPE_LNG_HGE(TYPE,hge)
+#else
+#define AVERAGE_TYPE(TYPE) AVERAGE_TYPE_LNG_HGE(TYPE,lng)
+#endif
+
 #define AVERAGE_FLOATTYPE(TYPE)                                        \
        do {                                                    \
                double a = 0;                                   \
@@ -1455,7 +1610,11 @@ int
 BATcalcavg(BAT *b, BAT *s, dbl *avg, BUN *vals)
 {
        BUN n = 0, r = 0, i = 0;
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to