Changeset: 142f34298bbd for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=142f34298bbd
Modified Files:
        monetdb5/modules/mal/mosaic_prefix.c
Branch: mosaic
Log Message:

Fix the int-type prefixes


diffs (truncated from 586 to 300 lines):

diff --git a/monetdb5/modules/mal/mosaic_prefix.c 
b/monetdb5/modules/mal/mosaic_prefix.c
--- a/monetdb5/modules/mal/mosaic_prefix.c
+++ b/monetdb5/modules/mal/mosaic_prefix.c
@@ -85,7 +85,8 @@ MOSadvance_prefix(Client cntxt, MOStask 
                  bte mask = *dst++;
                  bte val = *dst++;
                        bits = val & (~mask);
-                       bytes = (MOSgetCnt(task->blk) * bits)/8 + 
((MOSgetCnt(task->blk) %8) != 0);
+                       // be aware that we use longs as bit vectors
+                       bytes = sizeof(unsigned long) * ((MOSgetCnt(task->blk) 
* bits)/64 + ((MOSgetCnt(task->blk) %64) != 0));
                        task->blk = (MosaicBlk) (((char*) dst)  + 
wordaligned(bytes,sht)); 
                        //mnstr_printf(cntxt->fdout,"advance mask width %d 
bytes %d %d \n",bits,bytes,(int)wordaligned(bytes,int));
                }
@@ -95,7 +96,7 @@ MOSadvance_prefix(Client cntxt, MOStask 
                  sht mask = *dst++;
                  sht val = *dst++;
                        bits = val & (~mask);
-                       bytes = (MOSgetCnt(task->blk) * bits)/8 + 
((MOSgetCnt(task->blk) %8) != 0);
+                       bytes = sizeof(unsigned long) * ((MOSgetCnt(task->blk) 
* bits)/64 + ((MOSgetCnt(task->blk) %64) != 0));
                        task->blk = (MosaicBlk) (((char*) dst)  + 
wordaligned(bytes,sht)); 
                        //mnstr_printf(cntxt->fdout,"advance mask width %d 
bytes %d %d \n",bits,bytes,(int)wordaligned(bytes,int));
                }
@@ -105,7 +106,7 @@ MOSadvance_prefix(Client cntxt, MOStask 
                  int mask = *dst++;
                  int val = *dst++;
                        bits = val & (~mask);
-                       bytes = (MOSgetCnt(task->blk) * bits)/8 + 
((MOSgetCnt(task->blk) %8) != 0);
+                       bytes = sizeof(unsigned long) * ((MOSgetCnt(task->blk) 
* bits)/64 + ((MOSgetCnt(task->blk) %64) != 0));
                        task->blk = (MosaicBlk) (((char*) dst)  + 
wordaligned(bytes, int)); 
                        //mnstr_printf(cntxt->fdout,"advance mask width %d 
bytes %d %d \n",bits,bytes,(int)wordaligned(bytes,int));
                }
@@ -115,8 +116,8 @@ MOSadvance_prefix(Client cntxt, MOStask 
                  lng mask = *dst++;
                  lng val = *dst++;
                        bits = val & (~mask);
-                       bytes = (MOSgetCnt(task->blk) * bits)/8 + 
((MOSgetCnt(task->blk) %8) != 0);
-                       task->blk = (MosaicBlk) (((char*) dst)  + 
wordaligned(bytes, int)); 
+                       bytes = sizeof(unsigned long) * ((MOSgetCnt(task->blk) 
* bits)/64 + ((MOSgetCnt(task->blk) %64) != 0));
+                       task->blk = (MosaicBlk) (((char*) dst)  + 
wordaligned(bytes, lng)); 
                        //mnstr_printf(cntxt->fdout,"advance mask width %d 
bytes %d %d \n",bits,bytes,(int)wordaligned(bytes,int));
                }
        }
@@ -247,15 +248,16 @@ MOSestimate_prefix(Client cntxt, MOStask
        return factor;
 }
 
-#define compress(Bits) \
-{      cell = (i * rbits)/Bits;\
-       lshift= Bits -((i * rbits) % Bits) ;\
+#define compress(Vector,Bits) \
+{ int cell, lshift, rshift;\
+       cell = (i * rbits)/64;\
+       lshift= 64 -((i * rbits) % 64) ;\
        if ( lshift > rbits){\
-               base[cell]= base[cell] | (m << (lshift-rbits));\
+               Vector[cell]= Vector[cell] | (((unsigned long)m) << 
(lshift-rbits));\
        }else{ \
-               rshift= Bits -  ((i+1) * rbits) % Bits;\
-               base[cell]= base[cell] | (m >> (rbits-lshift));\
-               base[cell+1]= 0 | (m  << rshift);\
+               rshift= 64 -  ((i+1) * rbits) % 64;\
+               Vector[cell]= Vector[cell] | (((unsigned long)m) >> 
(rbits-lshift));\
+               Vector[cell+1]= 0 | (((unsigned long)m)  << rshift);\
        }\
 }
 
@@ -275,13 +277,11 @@ MOScompress_prefix(Client cntxt, MOStask
        if( task->elm >=2 )
        switch(size){
        case 1:
-               {       bte *v = (bte*) task->src, *w= v+1, val = *v, val2 = 
*w, mask;
+               {       bte *v = (bte*) task->src, *w= v+1, val = *v, val2 = 
*w, mask,m;
                        bte *dst = (bte*)  (((char*) blk) + MosaicBlkSize);
                        BUN limit = task->elm > MOSlimit()? MOSlimit(): 
task->elm;
-                       unsigned int *base;
-                       unsigned int cell, bits, rbits, lshift, rshift;
-                       unsigned int m;
-
+                       unsigned long *base;
+                       int bits, rbits; 
                        // search first non-identical value
                        for(i = 0;i < limit;i++, w++)
                        if( *v != *w ){
@@ -295,7 +295,7 @@ MOScompress_prefix(Client cntxt, MOStask
                        *dst = *v & mask;
                        *dst = *dst | rbits; // bits outside mask
                        dst++;
-                       base  = (unsigned int*) dst; // start of bit vector
+                       base  = (unsigned long*) dst; // start of bit vector
                        *base = 0;
                        
                        val = *v & mask;        //reference value
@@ -303,8 +303,8 @@ MOScompress_prefix(Client cntxt, MOStask
                        for(w = v, i = 0; i < limit; w++, i++){
                                if ( val  != (*w & mask) )
                                        break;
-                               m = (unsigned int)( *w & (~mask)); // residu
-                               compress(32);
+                               m = (unsigned long)( *w & (~mask)); // residu
+                               compress(base,32);
                        }
                        MOSincCnt(blk,i);
                        task->src += i;
@@ -312,12 +312,11 @@ MOScompress_prefix(Client cntxt, MOStask
                }
                break;
        case 2:
-               {       sht *v = (sht*) task->src, *w= v+1, val = *v, val2 = 
*w, mask;
+               {       sht *v = (sht*) task->src, *w= v+1, val = *v, val2 = 
*w, mask,m;
                        sht *dst = (sht*)  (((char*) blk) + MosaicBlkSize);
                        BUN limit = task->elm > MOSlimit()? MOSlimit(): 
task->elm;
-                       unsigned int *base;
-                       unsigned int cell, bits, rbits, lshift, rshift;
-                       unsigned int m;
+                       unsigned long *base;
+                       int bits, rbits;
 
                        // search first non-identical value
                        for(i = 0;i < limit;i++, w++)
@@ -332,7 +331,7 @@ MOScompress_prefix(Client cntxt, MOStask
                        *dst = *v & mask;
                        *dst = *dst | rbits; // bits outside mask
                        dst++;
-                       base  = (unsigned int*) dst; // start of bit vector
+                       base  = (unsigned long*) dst; // start of bit vector
                        *base = 0;
                        
                        val = *v & mask;        //reference value
@@ -341,7 +340,7 @@ MOScompress_prefix(Client cntxt, MOStask
                                if ( val  != (*w & mask) )
                                        break;
                                m = (unsigned int)( *w & (~mask)); // residu
-                               compress(32);
+                               compress(base,32);
                        }
                        MOSincCnt(blk,i);
                        task->src += i * 2;
@@ -349,11 +348,11 @@ MOScompress_prefix(Client cntxt, MOStask
                }
                break;
        case 4:
-               {       unsigned int *v = (unsigned int*) task->src, *w= v+1, 
val = *v, val2 = *w, mask, m;
+               {       unsigned int *v = (unsigned int*) task->src, *w= v+1, 
val = *v, val2 = *w, mask,m;
                        unsigned int *dst = (unsigned int*)  (((char*) blk) + 
MosaicBlkSize);
                        BUN limit = task->elm > MOSlimit()? MOSlimit(): 
task->elm;
-                       unsigned int *base;
-                       unsigned int cell, bits, rbits, lshift, rshift;
+                       unsigned long *base;
+                       int bits, rbits,lshift,rshift, cell;
 
                        // search first non-identical value
                        for(i = 0;i < limit;i++, w++)
@@ -368,7 +367,7 @@ MOScompress_prefix(Client cntxt, MOStask
                        *dst = *v & mask;
                        *dst = *dst | rbits; // bits outside mask
                        dst++;
-                       base  = (unsigned int*) dst; // start of bit vector
+                       base  = (unsigned long*) dst; // start of bit vector
                        *base = 0;
                        
                        val = *v & mask;        //reference value
@@ -379,15 +378,15 @@ MOScompress_prefix(Client cntxt, MOStask
                                        break;
                                m = *w & (~mask); // residu
                                //mnstr_printf(cntxt->fdout,"compress %d residu 
%d %o\n",*w,m,m);
-                               cell = (i * rbits)/32;
-                               lshift= 32 -((i * rbits) % 32) ;
+                               cell = (i * rbits)/64;
+                               lshift= 64 -((i * rbits) % 64) ;
                                if ( lshift > rbits){
-                                       base[cell]= base[cell] | (m << 
(lshift-rbits));
+                                       base[cell]= base[cell] | (((long)m) << 
(lshift-rbits));
                                        //mnstr_printf(cntxt->fdout,"[%d] shift 
%d rbits %d cell %o\n",cell, lshift, rbits, base[cell]);
                                }else{ 
-                                       rshift= 32 -  ((i+1) * rbits) % 32;
-                                       base[cell]= base[cell] | (m >> 
(rbits-lshift));
-                                       base[cell+1]= 0 | (m  << rshift);
+                                       rshift= 64 -  ((i+1) * rbits) % 64;
+                                       base[cell]= base[cell] | (((long)m) >> 
(rbits-lshift));
+                                       base[cell+1]= 0 | (((long)m)  << 
rshift);
                                        //mnstr_printf(cntxt->fdout,"[%d] shift 
%d %d cell %o %o val %o %o\n", cell, lshift, rshift,
                                                //base[cell],base[cell+1], (m 
>> (rbits-lshift)),  (m <<rshift));
                                }
@@ -402,7 +401,7 @@ MOScompress_prefix(Client cntxt, MOStask
                        lng *dst = (lng*)  (((char*) blk) + MosaicBlkSize);
                        BUN limit = task->elm > MOSlimit()? MOSlimit(): 
task->elm;
                        unsigned long *base;
-                       unsigned long cell, bits, rbits, lshift, rshift;
+                       int bits, rbits; 
 
                        // search first non-identical value
                        for(i = 0;i < limit;i++, w++)
@@ -427,7 +426,7 @@ MOScompress_prefix(Client cntxt, MOStask
                                if ( val  != (*w & mask) )
                                        break;
                                m = *w & (~mask); // residu
-                               compress(64);
+                               compress(base,64);
                        }
                        MOSincCnt(blk,i);
                        task->src += i * 8 ;
@@ -439,16 +438,16 @@ MOScompress_prefix(Client cntxt, MOStask
 #endif
 }
 
-#define decompress(Bits)\
-{      cell = (i * rbits)/Bits;\
-       lshift= Bits -((i * rbits) % Bits) ;\
-       if ( lshift >rbits){\
-               m1 = (base[cell]>> (lshift-rbits)) & m;\
+#define decompress(Vector,Bits)\
+{      int cell = (i * rbits)/Bits, lshift,rshift;\
+       lshift= 64 -((i * rbits) % 64) ;\
+       if ( lshift > (int)rbits){\
+               m1 = (Vector[cell]>> (lshift-rbits)) & ((unsigned long) m);\
                v = val  | m1;\
          }else{ \
-               rshift= Bits -  ((i+1) * rbits) % Bits;\
-               m1 =(base[cell] & (m >> (rbits-lshift)));\
-               m2 = base[cell+1] >>rshift;\
+               rshift= 64 -  ((i+1) * rbits) % 64;\
+               m1 =(Vector[cell] & (((unsigned long)m) >> (rbits-lshift)));\
+               m2 = Vector[cell+1] >>rshift;\
                v= val | (m1 <<(rbits-lshift)) | m2;\
          }\
 }
@@ -470,16 +469,16 @@ MOSdecompress_prefix(Client cntxt, MOSta
                        bte mask = *dst++, val  =  *dst++, v;
                        bte m,m1,m2;
                        BUN lim= MOSgetCnt(blk);
-                       unsigned int *base;
-                       unsigned int cell, rbits, lshift, rshift;
+                       unsigned long *base;
+                       int rbits;
 
                        m = ~mask;
                        rbits = val & m;
                        val = val & mask;
-                       base = (unsigned int*) dst;
+                       base = (unsigned long*) dst;
                        //mnstr_printf(cntxt->fdout,"decompress rbits %d mask 
%o val %d\n",rbits,m,val);
                        for(i = 0; i < lim; i++){
-                               decompress(32);
+                               decompress(base,32);
                                ((int*)task->src)[i] = v;
                        }
                        task->src += i;
@@ -490,16 +489,16 @@ MOSdecompress_prefix(Client cntxt, MOSta
                        sht mask = *dst++, val  =  *dst++, v;
                        sht m,m1,m2;
                        BUN lim= MOSgetCnt(blk);
-                       unsigned int *base;
-                       unsigned int cell, rbits, lshift, rshift;
+                       unsigned long *base;
+                       int rbits;
 
                        m = ~mask;
                        rbits = val & m;
                        val = val & mask;
-                       base = (unsigned int*) dst;
+                       base = (unsigned long*) dst;
                        //mnstr_printf(cntxt->fdout,"decompress rbits %d mask 
%o val %d\n",rbits,m,val);
                        for(i = 0; i < lim; i++){
-                               decompress(32);
+                               decompress(base,32);
                                ((int*)task->src)[i] = v;
                        }
                        task->src += i * 2;
@@ -508,26 +507,26 @@ MOSdecompress_prefix(Client cntxt, MOSta
        case 4:
                {       unsigned int *dst =  (unsigned int*)  (((char*) blk) + 
MosaicBlkSize);
                        unsigned int mask = *dst++, val  =  *dst++, v;
-                       unsigned int m,m1,m2;
+                       unsigned int m1,m2;
                        BUN lim= MOSgetCnt(blk);
-                       unsigned int *base;
-                       unsigned int cell, rbits, lshift, rshift;
+                       unsigned long *base,m;
+                       int rbits, cell, lshift, rshift;
 
                        m = ~mask;
                        rbits = val & m;
                        val = val & mask;
-                       base = (unsigned int*) dst;
+                       base = (unsigned long*) dst;
                        //mnstr_printf(cntxt->fdout,"decompress rbits %d mask 
%o val %d\n",rbits,m,val);
                        for(i = 0; i < lim; i++){
-                               cell = (i * rbits)/32;
-                               lshift= 32 -((i * rbits) % 32) ;
+                               cell = (i * rbits)/64;
+                               lshift= 64 -((i * rbits) % 64) ;
                                if ( lshift >rbits){
-                                       m1 = (base[cell]>> (lshift-rbits)) & m;
+                                       m1 = (base[cell]>> (lshift-rbits)) & 
((long)m);
                                        //mnstr_printf(cntxt->fdout,"[%d]cell 
%o lshift %d m %d\n", cell,  base[cell],lshift,m1);
                                        v = val  | m1;
                                  }else{ 
-                                       rshift= 32 -  ((i+1) * rbits) % 32;
-                                       m1 =(base[cell] & (m >> 
(rbits-lshift)));
+                                       rshift= 64 -  ((i+1) * rbits) % 64;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to