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.
This commit is contained in:
Chocobo1 2022-02-09 18:30:05 +08:00
parent cf96e6c642
commit 4cb075b168
No known key found for this signature in database
GPG Key ID: 210D9C873253A68C

View File

@ -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];
}
}