Commit db1667ed authored by Vadim Pisarevsky's avatar Vadim Pisarevsky

fixed the hamming distance function not to use 64-bit pop count. This should fix…

fixed the hamming distance function not to use 64-bit pop count. This should fix compile errors on Windows
parent d3568b7e
...@@ -48,22 +48,32 @@ ...@@ -48,22 +48,32 @@
#ifdef _WIN32 #ifdef _WIN32
# include <intrin.h> # include <intrin.h>
# define popcnt __popcnt # define popcnt __popcnt
# define popcntll __popcnt64
# pragma warning( disable : 4267 ) # pragma warning( disable : 4267 )
#else #else
# define popcntll __builtin_popcountll
# define popcnt __builtin_popcount # define popcnt __builtin_popcount
#endif #endif
/* LUT */ /* LUT */
const int lookup[] = const int lookup[] =
{ 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, 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4,
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, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
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, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5,
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, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 }; 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
};
namespace cv namespace cv
{ {
...@@ -72,35 +82,17 @@ namespace line_descriptor ...@@ -72,35 +82,17 @@ namespace line_descriptor
/*matching function */ /*matching function */
inline int match( UINT8*P, UINT8*Q, int codelb ) inline int match( UINT8*P, UINT8*Q, int codelb )
{ {
switch ( codelb ) int i, output = 0;
for( i = 0; i <= codelb - 16; i += 16 )
{ {
case 4: // 32 bit output += popcnt( *(UINT32*) (P+i) ^ *(UINT32*) (Q+i) ) +
return popcnt( *(UINT32*) P ^ *(UINT32*) Q ); popcnt( *(UINT32*) (P+i+4) ^ *(UINT32*) (Q+i+4) ) +
break; popcnt( *(UINT32*) (P+i+8) ^ *(UINT32*) (Q+i+8) ) +
case 8: // 64 bit popcnt( *(UINT32*) (P+i+12) ^ *(UINT32*) (Q+i+12) );
return (int) popcntll( ( (UINT64*) P )[0] ^ ( (UINT64*) Q )[0] ); }
break; for( ; i < codelb; i++ )
case 16: // 128 bit
return (int) ( popcntll( ( (UINT64*) P )[0] ^ ( (UINT64*) Q )[0] ) + popcntll( ( (UINT64*) P )[1] ^ ( (UINT64*) Q )[1] ) );
break;
case 32: // 256 bit
return (int) ( popcntll( ( (UINT64*) P )[0] ^ ( (UINT64*) Q )[0] ) + popcntll( ( (UINT64*) P )[1] ^ ( (UINT64*) Q )[1] )
+ popcntll( ( (UINT64*) P )[2] ^ ( (UINT64*) Q )[2] ) + popcntll( ( (UINT64*) P )[3] ^ ( (UINT64*) Q )[3] ) );
break;
case 64: // 512 bit
return (int) ( popcntll( ( (UINT64*) P )[0] ^ ( (UINT64*) Q )[0] ) + popcntll( ( (UINT64*) P )[1] ^ ( (UINT64*) Q )[1] )
+ popcntll( ( (UINT64*) P )[2] ^ ( (UINT64*) Q )[2] ) + popcntll( ( (UINT64*) P )[3] ^ ( (UINT64*) Q )[3] )
+ popcntll( ( (UINT64*) P )[4] ^ ( (UINT64*) Q )[4] ) + popcntll( ( (UINT64*) P )[5] ^ ( (UINT64*) Q )[5] )
+ popcntll( ( (UINT64*) P )[6] ^ ( (UINT64*) Q )[6] ) + popcntll( ( (UINT64*) P )[7] ^ ( (UINT64*) Q )[7] ) );
break;
default:
int output = 0;
for ( int i = 0; i < codelb; i++ )
output += lookup[P[i] ^ Q[i]]; output += lookup[P[i] ^ Q[i]];
return output; return output;
break;
}
} }
/* splitting function (b <= 64) */ /* splitting function (b <= 64) */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment