summaryrefslogtreecommitdiffstats
path: root/src/common/bitpacker.rs
diff options
context:
space:
mode:
authorPaul Masurel <paul.masurel@gmail.com>2017-08-28 23:18:56 +0900
committerPaul Masurel <paul.masurel@gmail.com>2017-08-28 23:18:56 +0900
commit3ec13a87193e3cc506a33e65404abe6699b8abdc (patch)
tree63e9502c3cc7140d5fbce3b36d4d71c3b31856cf /src/common/bitpacker.rs
parentf8593c76d590a7d3818453d6e2eebfaddc368de6 (diff)
Readded fix for non-simd
Diffstat (limited to 'src/common/bitpacker.rs')
-rw-r--r--src/common/bitpacker.rs32
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]) {