Eliminate branch in per-bit Owen scrambling functions.

This commit is contained in:
Nathan Vegdahl 2022-07-21 12:28:47 -07:00
parent f5a0210cdf
commit 570878d052

View File

@ -5,7 +5,7 @@ pub fn owen2(n: u32, seed: u32) -> u32 {
let mut result = n; let mut result = n;
for i in 0..32 { for i in 0..32 {
let mask = if i < 31 { (!0) << (i + 1) } else { 0 }; let mask = (!0 << 1) << i;
result ^= hash_u32(n & mask, seed) & (1 << i); result ^= hash_u32(n & mask, seed) & (1 << i);
} }
@ -25,7 +25,7 @@ pub fn owen2(n: u32, seed: u32) -> u32 {
/// The implementation below is a full proper base-4 Owen scramble, /// The implementation below is a full proper base-4 Owen scramble,
/// requiring only a 24-byte lookup table. /// requiring only a 24-byte lookup table.
pub fn owen4(n: u32, seed: u32) -> u32 { pub fn owen4(n: u32, seed: u32) -> u32 {
const PERM_TABLE: [u8; 24] = [ const PERMUTATION_TABLE: [u8; 24] = [
0 | (1 << 2) | (2 << 4) | (3 << 6), // [0, 1, 2, 3], 0 | (1 << 2) | (2 << 4) | (3 << 6), // [0, 1, 2, 3],
0 | (1 << 2) | (3 << 4) | (2 << 6), // [0, 1, 3, 2], 0 | (1 << 2) | (3 << 4) | (2 << 6), // [0, 1, 3, 2],
0 | (2 << 2) | (1 << 4) | (3 << 6), // [0, 2, 1, 3], 0 | (2 << 2) | (1 << 4) | (3 << 6), // [0, 2, 1, 3],
@ -55,10 +55,11 @@ pub fn owen4(n: u32, seed: u32) -> u32 {
let mut result = 0; let mut result = 0;
for i in 0..16 { for i in 0..16 {
let mask = if i < 15 { (!0) << ((i + 1) * 2) } else { 0 }; let mask = (!0 << 2) << (i * 2);
let perm_entry = PERM_TABLE[(hash_u32(n & mask, seed) % 24) as usize]; let perm_entry = PERMUTATION_TABLE[(hash_u32(n & mask, seed) % 24) as usize];
let perm_cell_i = ((n >> (i * 2)) & 0b11) as usize; let perm_cell_idx = ((n >> (i * 2)) & 0b11) as usize;
result |= (((perm_entry >> (perm_cell_i * 2)) & 0b11) as u32) << (i * 2);
result |= (((perm_entry >> (perm_cell_idx * 2)) & 0b11) as u32) << (i * 2);
} }
result result