|
|
|
@ -153,26 +153,31 @@ uint ReplicateBitTo9(uint value) { |
|
|
|
return value * 511; |
|
|
|
} |
|
|
|
|
|
|
|
const uint mod6_table = 0 |
|
|
|
| ((6 % 1) << (2 * 1)) | ((6 % 2) << (2 * 2)) |
|
|
|
| ((6 % 3) << (2 * 3)) | ((6 % 4) << (2 * 4)) |
|
|
|
| ((6 % 5) << (2 * 5)) | ((6 % 6) << (2 * 6)); |
|
|
|
const uint mod8_table = 0 |
|
|
|
| ((8 % 1) << (2 * 1)) | ((8 % 2) << (2 * 2)) |
|
|
|
| ((8 % 3) << (2 * 3)) | ((8 % 4) << (2 * 4)) |
|
|
|
| ((8 % 5) << (2 * 5)) | ((8 % 6) << (2 * 6)) |
|
|
|
| ((8 % 7) << (2 * 7)) | ((8 % 8) << (2 * 8)); |
|
|
|
// Assumes num_bits < to_bit, num_bits and to_bit != 0 |
|
|
|
uint ReplicateBits(uint value, uint num_bits, uint to_bit) { |
|
|
|
uint ReplicateBits(uint value, uint num_bits, uint to_bit, uint table) { |
|
|
|
const uint repl = value & ((1 << num_bits) - 1); |
|
|
|
const uint shift = (table >> (num_bits * 2)) & 3; |
|
|
|
uint v = repl; |
|
|
|
v |= v << (num_bits << 0); // [ xxxx xxxr ] |
|
|
|
v |= v << (num_bits << 1); // [ xxxx xxrr ] |
|
|
|
v |= v << (num_bits << 2); // [ xxxx rrrr ] |
|
|
|
v |= v << (num_bits << 3); // [ rrrr rrrr ] |
|
|
|
const uint shift = (to_bit % num_bits); |
|
|
|
v <<= shift; |
|
|
|
v |= repl >> (num_bits - shift); |
|
|
|
v |= v << (num_bits << 0); // [ xxxx xxrr ] |
|
|
|
v |= v << (num_bits << 1); // [ xxxx rrrr ] |
|
|
|
v |= v << (num_bits << 2); // [ rrrr rrrr ] |
|
|
|
v = (v << shift) | repl >> (num_bits - shift); |
|
|
|
return v & ((1 << to_bit) - 1); |
|
|
|
} |
|
|
|
|
|
|
|
uint FastReplicateTo8(uint value, uint num_bits) { |
|
|
|
return ReplicateBits(value, num_bits, 8); |
|
|
|
return ReplicateBits(value, num_bits, 8, mod8_table); |
|
|
|
} |
|
|
|
|
|
|
|
uint FastReplicateTo6(uint value, uint num_bits) { |
|
|
|
return ReplicateBits(value, num_bits, 6); |
|
|
|
return ReplicateBits(value, num_bits, 6, mod6_table); |
|
|
|
} |
|
|
|
|
|
|
|
uint Hash52(uint p) { |
|
|
|
|