Browse Source

Use "table look-up" method for reversing byte

This method takes constant time and is less prone to (CPU) pipeline stalling due to less
computation. Also it is slightly faster than the previous method.
adaptive-webui-19844
Chocobo1 3 years ago
parent
commit
4cb075b168
No known key found for this signature in database
GPG Key ID: 210D9C873253A68C
  1. 14
      src/base/bittorrent/ltqbitarray.cpp

14
src/base/bittorrent/ltqbitarray.cpp

@ -37,8 +37,18 @@ namespace @@ -37,8 +37,18 @@ namespace
{
unsigned char reverseByte(const unsigned char byte)
{
// https://graphics.stanford.edu/~seander/bithacks.html#ReverseByteWith64Bits
return (((byte * 0x80200802ULL) & 0x0884422110ULL) * 0x0101010101ULL) >> 32;
// https://graphics.stanford.edu/~seander/bithacks.html#BitReverseTable
static const unsigned char table[] =
{
#define R2(n) n, (n + (2 * 64)), (n + 64), (n + (3 * 64))
#define R4(n) R2(n), R2(n + (2 * 16)), R2(n + 16), R2(n + (3 * 16))
#define R6(n) R4(n), R4(n + (2 * 4)), R4(n + 4), R4(n + (3 * 4))
R6(0), R6(2), R6(1), R6(3)
#undef R6
#undef R4
#undef R2
};
return table[byte];
}
}

Loading…
Cancel
Save