diff options
author | Paul Masurel <paul.masurel@gmail.com> | 2017-08-28 23:18:56 +0900 |
---|---|---|
committer | Paul Masurel <paul.masurel@gmail.com> | 2017-08-28 23:18:56 +0900 |
commit | 3ec13a87193e3cc506a33e65404abe6699b8abdc (patch) | |
tree | 63e9502c3cc7140d5fbce3b36d4d71c3b31856cf /src/common/bitpacker.rs | |
parent | f8593c76d590a7d3818453d6e2eebfaddc368de6 (diff) |
Readded fix for non-simd
Diffstat (limited to 'src/common/bitpacker.rs')
-rw-r--r-- | src/common/bitpacker.rs | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/src/common/bitpacker.rs b/src/common/bitpacker.rs index 4238901..54d5ccc 100644 --- a/src/common/bitpacker.rs +++ b/src/common/bitpacker.rs @@ -123,13 +123,31 @@ where let addr_in_bits = idx * num_bits; let addr = addr_in_bits >> 3; let bit_shift = addr_in_bits & 7; - debug_assert!( - addr + 8 <= data.len(), - "The fast field field should have been padded with 7 bytes." - ); - let val_unshifted_unmasked: u64 = unsafe { *(data[addr..].as_ptr() as *const u64) }; - let val_shifted = (val_unshifted_unmasked >> bit_shift) as u64; - (val_shifted & mask) + if cfg!(feature = "simdcompression") { + // for simdcompression, + // the bitpacker is only used for fastfields, + // and we expect them to be always padded. + debug_assert!( + addr + 8 <= data.len(), + "The fast field field should have been padded with 7 bytes." + ); + let val_unshifted_unmasked: u64 = unsafe { *(data[addr..].as_ptr() as *const u64) }; + let val_shifted = (val_unshifted_unmasked >> bit_shift) as u64; + (val_shifted & mask) + } else { + let val_unshifted_unmasked: u64; + if addr + 8 <= data.len() { + val_unshifted_unmasked = unsafe { *(data[addr..].as_ptr() as *const u64) }; + } else { + let mut buffer = [0u8; 8]; + for i in addr..data.len() { + buffer[i - addr] += data[i]; + } + val_unshifted_unmasked = unsafe { *(buffer[..].as_ptr() as *const u64) }; + } + let val_shifted = (val_unshifted_unmasked >> bit_shift) as u64; + (val_shifted & mask) + } } pub fn get_range(&self, start: u32, output: &mut [u64]) { |