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