Changeset: f54c73447111 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=f54c73447111
Modified Files:
        monetdb5/modules/mal/mat.c
Branch: int128
Log Message:

added int128 / "hge" support in monetdb5/modules/mal/mat.c


diffs (223 lines):

diff --git a/monetdb5/modules/mal/mat.c b/monetdb5/modules/mal/mat.c
--- a/monetdb5/modules/mal/mat.c
+++ b/monetdb5/modules/mal/mat.c
@@ -686,6 +686,39 @@ MATproject_lng( BAT *map, BAT **bats, in
        return res;
 }
 
+#ifdef HAVE_HGE
+static BAT *
+MATproject_hge( BAT *map, BAT **bats, int len, int ttpe )
+{
+       BAT *res;
+       int i;
+       BUN j, cnt = BATcount(map);
+       hge *resT, **batsT;
+       bte *mapT;
+
+       res = BATnew(TYPE_void, ttpe, cnt);
+       batsT = (hge**)GDKmalloc(sizeof(hge*) * len);
+       if (res == NULL || batsT == NULL) {
+               if (res)
+                       BBPreclaim(res);
+               if (batsT)
+                       GDKfree(batsT);
+               return NULL;
+       }
+       BATseqbase(res, map->hseqbase);
+       resT = (hge*)Tloc(res, 0);
+       mapT = (bte*)Tloc(map, 0);
+       for (i=0; i<len; i++)
+               batsT[i] = (hge*)Tloc(bats[i], 0);
+       for (j=0; j<cnt; j++)
+               resT[j] = *batsT[mapT[j]]++;
+       BATsetcount(res, j);
+       res->hrevsorted = j <= 1;
+       GDKfree(batsT);
+       return res;
+}
+#endif
+
 /*
  *  Mitosis-pieces are usually slices (views) of a base table/BAT.
  *  For variable-size atoms, this means that the vheap's of all pieces are
@@ -734,6 +767,11 @@ MATproject_var( BAT *map, BAT **bats, in
                case sizeof(lng):
                        res = MATproject_lng(map, bats, len, TYPE_lng);
                        break;
+#ifdef HAVE_HGE
+               case sizeof(hge):
+                       res = MATproject_hge(map, bats, len, TYPE_hge);
+                       break;
+#endif
                default:
                        /* can (should) not happen */
                        assert(0);
@@ -781,6 +819,10 @@ MATproject_( BAT *map, BAT **bats, int l
                res = MATproject_int(map, bats, len, bats[0]->ttype);
        } else if (ATOMsize(bats[0]->ttype) == sizeof(lng)) {
                res = MATproject_lng(map, bats, len, bats[0]->ttype);
+#ifdef HAVE_HGE
+       } else if (ATOMsize(bats[0]->ttype) == sizeof(hge)) {
+               res = MATproject_hge(map, bats, len, bats[0]->ttype);
+#endif
        } else {
                res = MATproject_any(map, bats, len);
        }
@@ -1383,6 +1425,145 @@ MATsort_lng( BAT **map, BAT **bats, int 
        GDKfree(batsT);
        return res;
 }
+
+#ifdef HAVE_HGE
+static int
+MATsortloop_hge_rev( hge *val_res, bte *map_res, hge *val_i1, bte *map_i1, BUN 
cnt_i1, hge *val_i2, bte map_i2, BUN cnt_i2 ) {
+
+       hge *end_i1 = val_i1 + cnt_i1;
+       hge *end_i2 = val_i2 + cnt_i2;
+
+       if (map_i1 == NULL) {
+               /* map_i1 = 0 */
+               while ( val_i1 < end_i1 && val_i2 < end_i2) {
+                       if (*val_i1 >= *val_i2) {
+                               *val_res++ = *val_i1++;
+                               *map_res++ = 0;
+                       } else if (*val_i1 < *val_i2) {
+                               *val_res++ = *val_i2++;
+                               *map_res++ = map_i2;
+                       }
+               }
+               while ( val_i1 < end_i1 ) {
+                       *val_res++ = *val_i1++;
+                       *map_res++ = 0;
+               }
+       } else {
+               while ( val_i1 < end_i1 && val_i2 < end_i2) {
+                       if (*val_i1 >= *val_i2) {
+                               *val_res++ = *val_i1++;
+                               *map_res++ = *map_i1++;
+                       } else if (*val_i1 < *val_i2) {
+                               *val_res++ = *val_i2++;
+                               *map_res++ = map_i2;
+                       }
+               }
+               while ( val_i1 < end_i1 ) {
+                       *val_res++ = *val_i1++;
+                       *map_res++ = *map_i1++;
+               }
+       }
+       while ( val_i2 < end_i2 ) {
+               *val_res++ = *val_i2++;
+               *map_res++ = map_i2;
+       }
+       return 0;
+}
+
+static int
+MATsortloop_hge_( hge *val_res, bte *map_res, hge *val_i1, bte *map_i1, BUN 
cnt_i1, hge *val_i2, bte map_i2, BUN cnt_i2 ) {
+
+       hge *end_i1 = val_i1 + cnt_i1;
+       hge *end_i2 = val_i2 + cnt_i2;
+
+       if (map_i1 == NULL) {
+               /* map_i1 = 0 */
+               while ( val_i1 < end_i1 && val_i2 < end_i2) {
+                       if (*val_i1 <= *val_i2) {
+                               *val_res++ = *val_i1++;
+                               *map_res++ = 0;
+                       } else if (*val_i1 > *val_i2) {
+                               *val_res++ = *val_i2++;
+                               *map_res++ = map_i2;
+                       }
+               }
+               while ( val_i1 < end_i1 ) {
+                       *val_res++ = *val_i1++;
+                       *map_res++ = 0;
+               }
+       } else {
+               while ( val_i1 < end_i1 && val_i2 < end_i2) {
+                       if (*val_i1 <= *val_i2) {
+                               *val_res++ = *val_i1++;
+                               *map_res++ = *map_i1++;
+                       } else if (*val_i1 > *val_i2) {
+                               *val_res++ = *val_i2++;
+                               *map_res++ = map_i2;
+                       }
+               }
+               while ( val_i1 < end_i1 ) {
+                       *val_res++ = *val_i1++;
+                       *map_res++ = *map_i1++;
+               }
+       }
+       while ( val_i2 < end_i2 ) {
+               *val_res++ = *val_i2++;
+               *map_res++ = map_i2;
+       }
+       return 0;
+}
+
+/* multi-bat sort primitives */
+static BAT *
+MATsort_hge( BAT **map, BAT **bats, int len, BUN cnt, int rev )
+{
+       BAT *res;
+       int i;
+       hge *resT, **batsT, *in;
+       bte *mapT;
+       BUN len1, len2;
+       bte *map_in = NULL;
+
+       res = BATnew(TYPE_void, bats[0]->ttype, cnt);
+       *map = BATnew(TYPE_void, TYPE_bte, cnt);
+       BATseqbase(res, 0);
+       BATseqbase(*map, 0);
+       resT = (hge*)Tloc(res, 0);
+       mapT = (bte*)Tloc(*map, 0);
+       batsT = (hge**)GDKmalloc(sizeof(hge*) * len);
+       for (i=0; i<len; i++)
+               batsT[i] = (hge*)Tloc(bats[i], 0);
+       /* merge */
+       in = batsT[0];
+       len1 = BATcount(bats[0]);
+       map_in = NULL;
+       /* TODO: change into a tree version */
+       for (i=1; i<len; i++) {
+               len2 = BATcount(bats[i]);
+               if (rev) {
+                       MATsortloop_hge_rev( resT+cnt-len1-len2,
+                                       mapT+cnt-len1-len2,
+                                       in, map_in, len1,
+                                       batsT[i], i, len2);
+               } else {
+                       MATsortloop_hge_( resT+cnt-len1-len2,
+                                       mapT+cnt-len1-len2,
+                                       in, map_in, len1,
+                                       batsT[i], i, len2);
+               }
+               in = resT+cnt-len1-len2;
+               map_in = mapT+cnt-len1-len2;
+               len1 += len2;
+       }
+       BATsetcount(res, len1);
+       BATsetcount(*map, len1);
+       res->hrevsorted = len1 <= 1;
+       (*map)->hrevsorted = len1 <= 1;
+       GDKfree(batsT);
+       return res;
+}
+#endif
+
 static BAT *
 MATsort_int( BAT **map, BAT **bats, int len, BUN cnt, int rev )
 {
@@ -1560,6 +1741,10 @@ MATsort(Client cntxt, MalBlkPtr mb, MalS
                res = MATsort_int(&map, bats, len, pcnt, rev);
        } else if (ATOMsize(bats[0]->ttype) == sizeof(lng)) {
                res = MATsort_lng(&map, bats, len, pcnt, rev);
+#ifdef HAVE_HGE
+       } else if (ATOMsize(bats[0]->ttype) == sizeof(hge)) {
+               res = MATsort_hge(&map, bats, len, pcnt, rev);
+#endif
        } else {
                res = MATsort_any(&map, bats, len, pcnt, rev);
        }
_______________________________________________
checkin-list mailing list
[email protected]
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to