aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--contrib/intarray/_int.h5
-rw-r--r--contrib/intarray/_intbig_gist.c39
-rw-r--r--contrib/ltree/_ltree_gist.c42
-rw-r--r--contrib/ltree/ltree.h8
-rw-r--r--contrib/pg_trgm/trgm.h5
-rw-r--r--contrib/pg_trgm/trgm_gist.c39
-rw-r--r--contrib/tsearch2/gistidx.c40
-rw-r--r--contrib/tsearch2/gistidx.h4
8 files changed, 100 insertions, 82 deletions
diff --git a/contrib/intarray/_int.h b/contrib/intarray/_int.h
index 2231bdb095b..f89f2768822 100644
--- a/contrib/intarray/_int.h
+++ b/contrib/intarray/_int.h
@@ -68,11 +68,6 @@ typedef char *BITVECP;
a;\
}
-#define LOOPBIT(a) \
- for(i=0;i<SIGLENBIT;i++) {\
- a;\
- }
-
/* beware of multiple evaluation of arguments to these macros! */
#define GETBYTE(x,i) ( *( (BITVECP)(x) + (int)( (i) / BITBYTE ) ) )
#define GETBITBYTE(x,i) ( (*((char*)(x)) >> (i)) & 0x01 )
diff --git a/contrib/intarray/_intbig_gist.c b/contrib/intarray/_intbig_gist.c
index 237281aec5b..c49a2aab534 100644
--- a/contrib/intarray/_intbig_gist.c
+++ b/contrib/intarray/_intbig_gist.c
@@ -20,16 +20,25 @@ Datum g_intbig_picksplit(PG_FUNCTION_ARGS);
Datum g_intbig_union(PG_FUNCTION_ARGS);
Datum g_intbig_same(PG_FUNCTION_ARGS);
-#define SUMBIT(val) ( \
- GETBITBYTE((val),0) + \
- GETBITBYTE((val),1) + \
- GETBITBYTE((val),2) + \
- GETBITBYTE((val),3) + \
- GETBITBYTE((val),4) + \
- GETBITBYTE((val),5) + \
- GETBITBYTE((val),6) + \
- GETBITBYTE((val),7) \
-)
+/* Number of one-bits in an unsigned byte */
+static const uint8 number_of_ones[256] = {
+ 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
+};
PG_FUNCTION_INFO_V1(_intbig_in);
Datum _intbig_in(PG_FUNCTION_ARGS);
@@ -194,8 +203,7 @@ sizebitvec(BITVECP sign)
i;
LOOPBYTE(
- size += SUMBIT(sign);
- sign = (BITVECP) (((char *) sign) + 1);
+ size += number_of_ones[(unsigned char) sign[i]];
);
return size;
}
@@ -204,11 +212,12 @@ static int
hemdistsign(BITVECP a, BITVECP b)
{
int i,
+ diff,
dist = 0;
- LOOPBIT(
- if (GETBIT(a, i) != GETBIT(b, i))
- dist++;
+ LOOPBYTE(
+ diff = (unsigned char) (a[i] ^ b[i]);
+ dist += number_of_ones[diff];
);
return dist;
}
diff --git a/contrib/ltree/_ltree_gist.c b/contrib/ltree/_ltree_gist.c
index c2b9af9770b..f014b62a212 100644
--- a/contrib/ltree/_ltree_gist.c
+++ b/contrib/ltree/_ltree_gist.c
@@ -31,18 +31,30 @@ Datum _ltree_consistent(PG_FUNCTION_ARGS);
#define GETENTRY(vec,pos) ((ltree_gist *) DatumGetPointer((vec)->vector[(pos)].key))
#define NEXTVAL(x) ( (ltree*)( (char*)(x) + INTALIGN( VARSIZE(x) ) ) )
-#define SUMBIT(val) ( \
- GETBITBYTE(val,0) + \
- GETBITBYTE(val,1) + \
- GETBITBYTE(val,2) + \
- GETBITBYTE(val,3) + \
- GETBITBYTE(val,4) + \
- GETBITBYTE(val,5) + \
- GETBITBYTE(val,6) + \
- GETBITBYTE(val,7) \
-)
+
+/* Number of one-bits in an unsigned byte */
+static const uint8 number_of_ones[256] = {
+ 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
+};
+
#define WISH_F(a,b,c) (double)( -(double)(((a)-(b))*((a)-(b))*((a)-(b)))*(c) )
+
static void
hashing(BITVECP sign, ltree * t)
{
@@ -204,8 +216,7 @@ sizebitvec(BITVECP sign)
i;
ALOOPBYTE(
- size += SUMBIT(*(char *) sign);
- sign = (BITVECP) (((char *) sign) + 1);
+ size += number_of_ones[(unsigned char) sign[i]];
);
return size;
}
@@ -214,11 +225,12 @@ static int
hemdistsign(BITVECP a, BITVECP b)
{
int i,
+ diff,
dist = 0;
- ALOOPBIT(
- if (GETBIT(a, i) != GETBIT(b, i))
- dist++;
+ ALOOPBYTE(
+ diff = (unsigned char) (a[i] ^ b[i]);
+ dist += number_of_ones[diff];
);
return dist;
}
diff --git a/contrib/ltree/ltree.h b/contrib/ltree/ltree.h
index 0400db8b774..8f9ba4074ff 100644
--- a/contrib/ltree/ltree.h
+++ b/contrib/ltree/ltree.h
@@ -177,10 +177,6 @@ typedef unsigned char *BITVECP;
for(i=0;i<SIGLEN;i++) {\
a;\
}
-#define LOOPBIT(a) \
- for(i=0;i<SIGLENBIT;i++) {\
- a;\
- }
#define GETBYTE(x,i) ( *( (BITVECP)(x) + (int)( (i) / BITBYTE ) ) )
#define GETBITBYTE(x,i) ( ((unsigned char)(x)) >> i & 0x01 )
@@ -238,10 +234,6 @@ typedef unsigned char ABITVEC[ASIGLEN];
for(i=0;i<ASIGLEN;i++) {\
a;\
}
-#define ALOOPBIT(a) \
- for(i=0;i<ASIGLENBIT;i++) {\
- a;\
- }
#define AHASHVAL(val) (((unsigned int)(val)) % ASIGLENBIT)
#define AHASH(sign, val) SETBIT((sign), AHASHVAL(val))
diff --git a/contrib/pg_trgm/trgm.h b/contrib/pg_trgm/trgm.h
index 73c4cb6aa6f..641ffd52a13 100644
--- a/contrib/pg_trgm/trgm.h
+++ b/contrib/pg_trgm/trgm.h
@@ -55,11 +55,6 @@ typedef char *BITVECP;
a;\
}
-#define LOOPBIT(a) \
- for(i=0;i<SIGLENBIT;i++) {\
- a;\
- }
-
#define GETBYTE(x,i) ( *( (BITVECP)(x) + (int)( (i) / BITBYTE ) ) )
#define GETBITBYTE(x,i) ( ((char)(x)) >> i & 0x01 )
#define CLRBIT(x,i) GETBYTE(x,i) &= ~( 0x01 << ( (i) % BITBYTE ) )
diff --git a/contrib/pg_trgm/trgm_gist.c b/contrib/pg_trgm/trgm_gist.c
index 33ed6d5e1f0..f8f61e108a6 100644
--- a/contrib/pg_trgm/trgm_gist.c
+++ b/contrib/pg_trgm/trgm_gist.c
@@ -39,16 +39,25 @@ Datum gtrgm_picksplit(PG_FUNCTION_ARGS);
#define GETENTRY(vec,pos) ((TRGM *) DatumGetPointer((vec)->vector[(pos)].key))
-#define SUMBIT(val) ( \
- GETBITBYTE(val,0) + \
- GETBITBYTE(val,1) + \
- GETBITBYTE(val,2) + \
- GETBITBYTE(val,3) + \
- GETBITBYTE(val,4) + \
- GETBITBYTE(val,5) + \
- GETBITBYTE(val,6) + \
- GETBITBYTE(val,7) \
-)
+/* Number of one-bits in an unsigned byte */
+static const uint8 number_of_ones[256] = {
+ 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
+};
Datum
@@ -301,8 +310,7 @@ sizebitvec(BITVECP sign)
i;
LOOPBYTE(
- size += SUMBIT(*(char *) sign);
- sign = (BITVECP) (((char *) sign) + 1);
+ size += number_of_ones[(unsigned char) sign[i]];
);
return size;
}
@@ -311,11 +319,12 @@ static int
hemdistsign(BITVECP a, BITVECP b)
{
int i,
+ diff,
dist = 0;
- LOOPBIT(
- if (GETBIT(a, i) != GETBIT(b, i))
- dist++;
+ LOOPBYTE(
+ diff = (unsigned char) (a[i] ^ b[i]);
+ dist += number_of_ones[diff];
);
return dist;
}
diff --git a/contrib/tsearch2/gistidx.c b/contrib/tsearch2/gistidx.c
index c0d15de6913..3f5a6bffaaf 100644
--- a/contrib/tsearch2/gistidx.c
+++ b/contrib/tsearch2/gistidx.c
@@ -43,16 +43,26 @@ PG_FUNCTION_INFO_V1(gtsvector_picksplit);
Datum gtsvector_picksplit(PG_FUNCTION_ARGS);
#define GETENTRY(vec,pos) ((GISTTYPE *) DatumGetPointer((vec)->vector[(pos)].key))
-#define SUMBIT(val) ( \
- GETBITBYTE(val,0) + \
- GETBITBYTE(val,1) + \
- GETBITBYTE(val,2) + \
- GETBITBYTE(val,3) + \
- GETBITBYTE(val,4) + \
- GETBITBYTE(val,5) + \
- GETBITBYTE(val,6) + \
- GETBITBYTE(val,7) \
-)
+
+/* Number of one-bits in an unsigned byte */
+static const uint8 number_of_ones[256] = {
+ 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7,
+ 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
+};
static int4 sizebitvec(BITVECP sign);
@@ -436,8 +446,7 @@ sizebitvec(BITVECP sign)
i;
LOOPBYTE(
- size += SUMBIT(*(char *) sign);
- sign = (BITVECP) (((char *) sign) + 1);
+ size += number_of_ones[(unsigned char) sign[i]];
);
return size;
}
@@ -446,11 +455,12 @@ static int
hemdistsign(BITVECP a, BITVECP b)
{
int i,
+ diff,
dist = 0;
- LOOPBIT(
- if (GETBIT(a, i) != GETBIT(b, i))
- dist++;
+ LOOPBYTE(
+ diff = (unsigned char) (a[i] ^ b[i]);
+ dist += number_of_ones[diff];
);
return dist;
}
diff --git a/contrib/tsearch2/gistidx.h b/contrib/tsearch2/gistidx.h
index 7e243534fbe..dd9b99cf05c 100644
--- a/contrib/tsearch2/gistidx.h
+++ b/contrib/tsearch2/gistidx.h
@@ -22,10 +22,6 @@ typedef char *BITVECP;
for(i=0;i<SIGLEN;i++) {\
a;\
}
-#define LOOPBIT(a) \
- for(i=0;i<SIGLENBIT;i++) {\
- a;\
- }
#define GETBYTE(x,i) ( *( (BITVECP)(x) + (int)( (i) / BITBYTE ) ) )
#define GETBITBYTE(x,i) ( ((char)(x)) >> (i) & 0x01 )