diff --git a/libbz2-rs-sys/src/blocksort.rs b/libbz2-rs-sys/src/blocksort.rs index 450e4a01a..67a672c6c 100644 --- a/libbz2-rs-sys/src/blocksort.rs +++ b/libbz2-rs-sys/src/blocksort.rs @@ -390,209 +390,57 @@ fn mainGtU( nblock: u32, budget: &mut i32, ) -> bool { - let mut k: i32; - let mut c1: u8; - let mut c2: u8; - let mut s1: u16; - let mut s2: u16; - debug_assert_ne!(i1, i2, "mainGtU"); - c1 = block[i1 as usize]; - c2 = block[i2 as usize]; - if c1 != c2 { - return c1 > c2; - } - i1 = i1.wrapping_add(1); - i2 = i2.wrapping_add(1); - c1 = block[i1 as usize]; - c2 = block[i2 as usize]; - if c1 != c2 { - return c1 > c2; - } - i1 = i1.wrapping_add(1); - i2 = i2.wrapping_add(1); - c1 = block[i1 as usize]; - c2 = block[i2 as usize]; - if c1 != c2 { - return c1 > c2; - } - i1 = i1.wrapping_add(1); - i2 = i2.wrapping_add(1); - c1 = block[i1 as usize]; - c2 = block[i2 as usize]; - if c1 != c2 { - return c1 > c2; - } - i1 = i1.wrapping_add(1); - i2 = i2.wrapping_add(1); - c1 = block[i1 as usize]; - c2 = block[i2 as usize]; - if c1 != c2 { - return c1 > c2; - } - i1 = i1.wrapping_add(1); - i2 = i2.wrapping_add(1); - c1 = block[i1 as usize]; - c2 = block[i2 as usize]; - if c1 != c2 { - return c1 > c2; - } - i1 = i1.wrapping_add(1); - i2 = i2.wrapping_add(1); - c1 = block[i1 as usize]; - c2 = block[i2 as usize]; - if c1 != c2 { - return c1 > c2; - } - i1 = i1.wrapping_add(1); - i2 = i2.wrapping_add(1); - c1 = block[i1 as usize]; - c2 = block[i2 as usize]; - if c1 != c2 { - return c1 > c2; - } - i1 = i1.wrapping_add(1); - i2 = i2.wrapping_add(1); - c1 = block[i1 as usize]; - c2 = block[i2 as usize]; - if c1 != c2 { - return c1 > c2; - } - i1 = i1.wrapping_add(1); - i2 = i2.wrapping_add(1); - c1 = block[i1 as usize]; - c2 = block[i2 as usize]; - if c1 != c2 { - return c1 > c2; - } - i1 = i1.wrapping_add(1); - i2 = i2.wrapping_add(1); - c1 = block[i1 as usize]; - c2 = block[i2 as usize]; - if c1 != c2 { - return c1 > c2; - } - i1 = i1.wrapping_add(1); - i2 = i2.wrapping_add(1); - c1 = block[i1 as usize]; - c2 = block[i2 as usize]; - if c1 != c2 { - return c1 > c2; - } - i1 = i1.wrapping_add(1); - i2 = i2.wrapping_add(1); - k = nblock.wrapping_add(8 as c_int as c_uint) as i32; - loop { - c1 = block[i1 as usize]; - c2 = block[i2 as usize]; - if c1 != c2 { - return c1 > c2; - } - s1 = quadrant[i1 as usize]; - s2 = quadrant[i2 as usize]; - if s1 != s2 { - return s1 > s2; - } - i1 = i1.wrapping_add(1); - i2 = i2.wrapping_add(1); - c1 = block[i1 as usize]; - c2 = block[i2 as usize]; - if c1 != c2 { - return c1 > c2; - } - s1 = quadrant[i1 as usize]; - s2 = quadrant[i2 as usize]; - if s1 != s2 { - return s1 > s2; - } - i1 = i1.wrapping_add(1); - i2 = i2.wrapping_add(1); - c1 = block[i1 as usize]; - c2 = block[i2 as usize]; - if c1 != c2 { - return c1 > c2; - } - s1 = quadrant[i1 as usize]; - s2 = quadrant[i2 as usize]; - if s1 != s2 { - return s1 > s2; - } - i1 = i1.wrapping_add(1); - i2 = i2.wrapping_add(1); - c1 = block[i1 as usize]; - c2 = block[i2 as usize]; - if c1 != c2 { - return c1 > c2; - } - s1 = quadrant[i1 as usize]; - s2 = quadrant[i2 as usize]; - if s1 != s2 { - return s1 > s2; - } - i1 = i1.wrapping_add(1); - i2 = i2.wrapping_add(1); - c1 = block[i1 as usize]; - c2 = block[i2 as usize]; - if c1 != c2 { - return c1 > c2; - } - s1 = quadrant[i1 as usize]; - s2 = quadrant[i2 as usize]; - if s1 != s2 { - return s1 > s2; - } - i1 = i1.wrapping_add(1); - i2 = i2.wrapping_add(1); - c1 = block[i1 as usize]; - c2 = block[i2 as usize]; - if c1 != c2 { - return c1 > c2; - } - s1 = quadrant[i1 as usize]; - s2 = quadrant[i2 as usize]; - if s1 != s2 { - return s1 > s2; - } - i1 = i1.wrapping_add(1); - i2 = i2.wrapping_add(1); - c1 = block[i1 as usize]; - c2 = block[i2 as usize]; - if c1 != c2 { - return c1 > c2; - } - s1 = quadrant[i1 as usize]; - s2 = quadrant[i2 as usize]; - if s1 != s2 { - return s1 > s2; - } - i1 = i1.wrapping_add(1); - i2 = i2.wrapping_add(1); - c1 = block[i1 as usize]; - c2 = block[i2 as usize]; + let chunk1 = &block[i1 as usize..][..12]; + let chunk2 = &block[i2 as usize..][..12]; + + for (c1, c2) in chunk1.chunks_exact(4).zip(chunk2.chunks_exact(4)) { + let c1 = u32::from_be_bytes(c1[..4].try_into().unwrap()); + let c2 = u32::from_be_bytes(c2[..4].try_into().unwrap()); + if c1 != c2 { return c1 > c2; } - s1 = quadrant[i1 as usize]; - s2 = quadrant[i2 as usize]; - if s1 != s2 { - return s1 > s2; + } + + i1 += 12; + i2 += 12; + + for _ in 0..nblock.div_ceil(8) { + let b1 = &block[i1 as usize..][..8]; + let b2 = &block[i2 as usize..][..8]; + + let q1 = &quadrant[i1 as usize..][..8]; + let q2 = &quadrant[i2 as usize..][..8]; + + if b1 != b2 || q1 != q2 { + for (((c1, c2), s1), s2) in b1.iter().zip(b2).zip(q1).zip(q2) { + if c1 != c2 { + return c1 > c2; + } + if s1 != s2 { + return s1 > s2; + } + } } - i1 = i1.wrapping_add(1); - i2 = i2.wrapping_add(1); + + i1 += 8; + i2 += 8; + if i1 >= nblock { i1 = i1.wrapping_sub(nblock); } if i2 >= nblock { i2 = i2.wrapping_sub(nblock); } - k -= 8 as c_int; + *budget -= 1; - if k < 0 as c_int { - break false; - } } + + false } + static INCS: [i32; 14] = [ 1 as c_int, 4 as c_int,