diff --git a/compiler-rt/src/alu.cairo b/compiler-rt/src/alu.cairo index 662c0d6..1c9e570 100644 --- a/compiler-rt/src/alu.cairo +++ b/compiler-rt/src/alu.cairo @@ -2,5 +2,6 @@ pub mod and; pub mod or; pub mod xor; pub mod shl; +pub mod lshr; mod test_case; diff --git a/compiler-rt/src/alu/lshr.cairo b/compiler-rt/src/alu/lshr.cairo new file mode 100644 index 0000000..e39b381 --- /dev/null +++ b/compiler-rt/src/alu/lshr.cairo @@ -0,0 +1,44 @@ +pub mod lshr_i1; +pub mod lshr_i8; +pub mod lshr_i16; +pub mod lshr_i32; +pub mod lshr_i64; +pub mod lshr_i128; + +use crate::utils::assert_fits_in_type; +use core::num::traits::{BitSize, Bounded}; + +// Perform logical shift right operation. +// +// This is a generic implementation for every data type. Its specialized versions +// are defined and tested in lshr/lshr_.cairo files. +fn lshr< + T, + // The trait bounds are chosen so that: + // - BitSize: we can determine the length of the data type in bits, + // - Bounded: we can determine min and max value of the type, + // - TryInto, Into - we can convert the type from/to u128, + // - Destruct: the type can be dropped as the result of the downcasting check. + // Overall these trait bounds allow any unsigned integer to be used as the concrete type. + impl TBitSize: BitSize, + impl TBounded: Bounded, + impl TTryInto: TryInto, + impl TInto: Into, + impl TDestruct: Destruct +>( + n: u128, shift: u128 +) -> u128 { + // Make sure the value passed as u128 arguments can fit in the concrete type. + assert_fits_in_type::(n); + assert_fits_in_type::(shift); + + // Cairo does not have << or >> operators so we must implement the shift manually. + let mut result = n; + // Right logical shift by 1 bit is effectively division by 2, so just divide `shift` times + for _ in 0..shift { + result /= 2; + }; + + // Make sure the result is limited only to the bit width of the concrete type. + result & Bounded::::MAX.into() +} diff --git a/compiler-rt/src/alu/lshr/lshr_i1.cairo b/compiler-rt/src/alu/lshr/lshr_i1.cairo new file mode 100644 index 0000000..7ab0a3a --- /dev/null +++ b/compiler-rt/src/alu/lshr/lshr_i1.cairo @@ -0,0 +1,38 @@ +use crate::alu::lshr::lshr; + +pub fn __llvm_lshr_i1_i1(n: u128, shift: u128) -> u128 { + if n > 1 { + panic!("n = {:?} does not fit in i1", n) + } + + if shift > 1 { + panic!("shift = {:?} does not fit in i1", shift) + } + + // There is no dedicated 1-bit type so after making sure that lhs and rhs + // fit in 1 bit, promote them to u8, do the job and return the LSB. + lshr::(n, shift) & 0x1 +} + +#[cfg(test)] +mod tests { + use super::__llvm_lshr_i1_i1; + use crate::alu::test_case::TestCase; + #[cairofmt::skip] + pub const test_cases: [TestCase; 4] = [ + // All possible 1-bit cases + TestCase { lhs: 0, rhs: 0, expected: 0 }, + TestCase { lhs: 0, rhs: 1, expected: 0 }, + TestCase { lhs: 1, rhs: 0, expected: 1 }, + TestCase { lhs: 1, rhs: 1, expected: 0 }, + ]; + + #[test] + fn test_i1() { + for case in test_cases + .span() { + assert_eq!(__llvm_lshr_i1_i1(*case.lhs, *case.rhs), *case.expected); + } + } +} + diff --git a/compiler-rt/src/alu/lshr/lshr_i128.cairo b/compiler-rt/src/alu/lshr/lshr_i128.cairo new file mode 100644 index 0000000..b4878ba --- /dev/null +++ b/compiler-rt/src/alu/lshr/lshr_i128.cairo @@ -0,0 +1,396 @@ +use crate::alu::lshr::lshr; + +pub fn __llvm_lshr_i128_i128(n: u128, shift: u128) -> u128 { + lshr::(n, shift) +} + +#[cfg(test)] +mod tests { + use super::__llvm_lshr_i128_i128; + use crate::alu::test_case::TestCase; + // Tests are split to multiple chunks due to gas limit being exceeded + // if they are in a one giant array + #[cairofmt::skip] + pub const test_cases_shifts_ones_1: [TestCase; 86] = [ + // All possible shifts on all 1s from 0 throughout the whole input value length + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 0, expected: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 1, expected: 0b01111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 2, expected: 0b00111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 3, expected: 0b00011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 4, expected: 0b00001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 5, expected: 0b00000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 6, expected: 0b00000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 7, expected: 0b00000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 8, expected: 0b00000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 9, expected: 0b00000000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 10, expected: 0b00000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 11, expected: 0b00000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 12, expected: 0b00000000000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 13, expected: 0b00000000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 14, expected: 0b00000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 15, expected: 0b00000000000000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 16, expected: 0b00000000000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 17, expected: 0b00000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 18, expected: 0b00000000000000000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 19, expected: 0b00000000000000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 20, expected: 0b00000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 21, expected: 0b00000000000000000000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 22, expected: 0b00000000000000000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 23, expected: 0b00000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 24, expected: 0b00000000000000000000000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 25, expected: 0b00000000000000000000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 26, expected: 0b00000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 27, expected: 0b00000000000000000000000000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 28, expected: 0b00000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 29, expected: 0b00000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 30, expected: 0b00000000000000000000000000000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 31, expected: 0b00000000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 32, expected: 0b00000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 33, expected: 0b00000000000000000000000000000000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 34, expected: 0b00000000000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 35, expected: 0b00000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 36, expected: 0b00000000000000000000000000000000000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 37, expected: 0b00000000000000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 38, expected: 0b00000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 39, expected: 0b00000000000000000000000000000000000000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 40, expected: 0b00000000000000000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 41, expected: 0b00000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 42, expected: 0b00000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 43, expected: 0b00000000000000000000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 44, expected: 0b00000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 45, expected: 0b00000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 46, expected: 0b00000000000000000000000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 47, expected: 0b00000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 48, expected: 0b00000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 49, expected: 0b00000000000000000000000000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 50, expected: 0b00000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 51, expected: 0b00000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 52, expected: 0b00000000000000000000000000000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 53, expected: 0b00000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 54, expected: 0b00000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 55, expected: 0b00000000000000000000000000000000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 56, expected: 0b00000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 57, expected: 0b00000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 58, expected: 0b00000000000000000000000000000000000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 59, expected: 0b00000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 60, expected: 0b00000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 61, expected: 0b00000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 62, expected: 0b00000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 63, expected: 0b00000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 64, expected: 0b00000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 65, expected: 0b00000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 66, expected: 0b00000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 67, expected: 0b00000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 68, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 69, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 70, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 71, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 72, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 73, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 74, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 75, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 76, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 77, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 78, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 79, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 80, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 81, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 82, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 83, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 84, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 85, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111111111111111 }, + ]; + #[cairofmt::skip] + pub const test_cases_shifts_ones_2: [TestCase; 35] = [ + // All possible shifts on all 1s from 0 throughout the whole input value length - continue + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 86, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 87, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 88, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 89, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 90, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 91, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 92, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 93, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 94, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 95, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 96, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 97, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 98, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 99, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 100, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 101, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 102, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 103, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 104, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 105, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 106, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 107, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 108, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 109, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 110, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 111, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 112, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 113, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 114, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 115, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 116, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 117, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 118, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 119, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 120, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111 }, + ]; + #[cairofmt::skip] + pub const test_cases_shifts_ones_3: [TestCase; 9] = [ + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 121, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 122, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 123, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 124, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 125, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 126, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 127, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 }, + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 128, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + + // Shifts by more bits than the input value contains - overflow should cause loss of the excessive bits + TestCase { lhs: 0b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111, rhs: 129, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + ]; + #[cairofmt::skip] + pub const test_cases_shifts_zeros_1: [TestCase; 86] = [ + // The same set of operations but on a zero bit pattern + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 0, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 1, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 2, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 3, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 4, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 5, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 6, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 7, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 8, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 9, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 10, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 11, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 12, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 13, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 14, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 15, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 16, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 17, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 18, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 19, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 20, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 21, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 22, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 23, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 24, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 25, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 26, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 27, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 28, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 29, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 30, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 31, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 32, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 33, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 34, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 35, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 36, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 37, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 38, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 39, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 40, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 41, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 42, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 43, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 44, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 45, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 46, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 47, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 48, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 49, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 50, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 51, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 52, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 53, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 54, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 55, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 56, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 57, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 58, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 59, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 60, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 61, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 62, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 63, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 64, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 65, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 66, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 67, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 68, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 69, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 70, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 71, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 72, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 73, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 74, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 75, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 76, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 77, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 78, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 79, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 80, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 81, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 82, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 83, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 84, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 85, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + ]; + #[cairofmt::skip] + pub const test_cases_shifts_zeros_2: [TestCase; 35] = [ + // The same set of operations but on a zero bit pattern - continue + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 86, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 87, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 88, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 89, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 90, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 91, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 92, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 93, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 94, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 95, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 96, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 97, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 98, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 99, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 100, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 101, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 102, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 103, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 104, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 105, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 106, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 107, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 108, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 109, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 110, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 111, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 112, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 113, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 114, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 115, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 116, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 117, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 118, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 119, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, rhs: 120, expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }, + ]; + pub const test_cases_shifts_zeros_3: [ + TestCase + ; 9] = [ + // The same set of operations but on a zero bit pattern - continue + TestCase { + lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, + rhs: 121, + expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + }, + TestCase { + lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, + rhs: 122, + expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + }, + TestCase { + lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, + rhs: 123, + expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + }, + TestCase { + lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, + rhs: 124, + expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + }, + TestCase { + lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, + rhs: 125, + expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + }, + TestCase { + lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, + rhs: 126, + expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + }, + TestCase { + lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, + rhs: 127, + expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + }, + TestCase { + lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, + rhs: 128, + expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + }, + TestCase { + lhs: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, + rhs: 129, + expected: 0b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 + }, + ]; + #[cairofmt::skip] + pub const test_cases_shift_mixed: [TestCase; 1] = [ + // Shift of a mixed 0/1 bit pattern + TestCase { lhs: 0b10101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010, rhs: 64, expected: 0b1010101010101010101010101010101010101010101010101010101010101010 }, + ]; + + #[test] + fn test_i128_shifts_ones_1() { + for case in test_cases_shifts_ones_1 + .span() { + assert_eq!(__llvm_lshr_i128_i128(*case.lhs, *case.rhs), *case.expected); + } + } + + #[test] + fn test_i128_shifts_ones_2() { + for case in test_cases_shifts_ones_2 + .span() { + assert_eq!(__llvm_lshr_i128_i128(*case.lhs, *case.rhs), *case.expected); + } + } + + #[test] + fn test_i128_shifts_ones_3() { + for case in test_cases_shifts_ones_3 + .span() { + assert_eq!(__llvm_lshr_i128_i128(*case.lhs, *case.rhs), *case.expected); + } + } + + #[test] + fn test_i128_shifts_zeros_1() { + for case in test_cases_shifts_zeros_1 + .span() { + assert_eq!(__llvm_lshr_i128_i128(*case.lhs, *case.rhs), *case.expected); + } + } + + #[test] + fn test_i128_shifts_zeros_2() { + for case in test_cases_shifts_zeros_2 + .span() { + assert_eq!(__llvm_lshr_i128_i128(*case.lhs, *case.rhs), *case.expected); + } + } + + #[test] + fn test_i128_shifts_zeros_3() { + for case in test_cases_shifts_zeros_3 + .span() { + assert_eq!(__llvm_lshr_i128_i128(*case.lhs, *case.rhs), *case.expected); + } + } + + #[test] + fn test_i128_shift_mixed() { + for case in test_cases_shift_mixed + .span() { + assert_eq!(__llvm_lshr_i128_i128(*case.lhs, *case.rhs), *case.expected); + } + } +} diff --git a/compiler-rt/src/alu/lshr/lshr_i16.cairo b/compiler-rt/src/alu/lshr/lshr_i16.cairo new file mode 100644 index 0000000..80fdc4d --- /dev/null +++ b/compiler-rt/src/alu/lshr/lshr_i16.cairo @@ -0,0 +1,71 @@ +use crate::alu::lshr::lshr; + +pub fn __llvm_lshr_i16_i16(n: u128, shift: u128) -> u128 { + lshr::(n, shift) +} + +#[cfg(test)] +mod tests { + use super::__llvm_lshr_i16_i16; + use crate::alu::test_case::TestCase; + #[cairofmt::skip] + pub const test_cases: [TestCase; 41] = [ + // All possible shifts on all 1s from 0 throughout the whole input value length + TestCase { lhs: 0b1111111111111111, rhs: 0, expected: 0b1111111111111111 }, + TestCase { lhs: 0b1111111111111111, rhs: 1, expected: 0b0111111111111111 }, + TestCase { lhs: 0b1111111111111111, rhs: 2, expected: 0b0011111111111111 }, + TestCase { lhs: 0b1111111111111111, rhs: 3, expected: 0b0001111111111111 }, + TestCase { lhs: 0b1111111111111111, rhs: 4, expected: 0b0000111111111111 }, + TestCase { lhs: 0b1111111111111111, rhs: 5, expected: 0b0000011111111111 }, + TestCase { lhs: 0b1111111111111111, rhs: 6, expected: 0b0000001111111111 }, + TestCase { lhs: 0b1111111111111111, rhs: 7, expected: 0b0000000111111111 }, + TestCase { lhs: 0b1111111111111111, rhs: 8, expected: 0b0000000011111111 }, + TestCase { lhs: 0b1111111111111111, rhs: 9, expected: 0b0000000001111111 }, + TestCase { lhs: 0b1111111111111111, rhs: 10, expected: 0b0000000000111111 }, + TestCase { lhs: 0b1111111111111111, rhs: 11, expected: 0b0000000000011111 }, + TestCase { lhs: 0b1111111111111111, rhs: 12, expected: 0b0000000000001111 }, + TestCase { lhs: 0b1111111111111111, rhs: 13, expected: 0b0000000000000111 }, + TestCase { lhs: 0b1111111111111111, rhs: 14, expected: 0b0000000000000011 }, + TestCase { lhs: 0b1111111111111111, rhs: 15, expected: 0b0000000000000001 }, + TestCase { lhs: 0b1111111111111111, rhs: 16, expected: 0b0000000000000000 }, + + // Shifts by more bits than the input value contains - overflow should cause loss of the excessive bits + TestCase { lhs: 0b1111111111111111, rhs: 17, expected: 0b0000000000000000 }, + TestCase { lhs: 0b1111111111111111, rhs: 90, expected: 0b0000000000000000 }, + TestCase { lhs: 0b1111111111111111, rhs: 123, expected: 0b0000000000000000 }, + + // The same set of operations but on a zero bit pattern + TestCase { lhs: 0b0000000000000000, rhs: 0, expected: 0b0000000000000000 }, + TestCase { lhs: 0b0000000000000000, rhs: 1, expected: 0b0000000000000000 }, + TestCase { lhs: 0b0000000000000000, rhs: 2, expected: 0b0000000000000000 }, + TestCase { lhs: 0b0000000000000000, rhs: 3, expected: 0b0000000000000000 }, + TestCase { lhs: 0b0000000000000000, rhs: 4, expected: 0b0000000000000000 }, + TestCase { lhs: 0b0000000000000000, rhs: 5, expected: 0b0000000000000000 }, + TestCase { lhs: 0b0000000000000000, rhs: 6, expected: 0b0000000000000000 }, + TestCase { lhs: 0b0000000000000000, rhs: 7, expected: 0b0000000000000000 }, + TestCase { lhs: 0b0000000000000000, rhs: 8, expected: 0b0000000000000000 }, + TestCase { lhs: 0b0000000000000000, rhs: 9, expected: 0b0000000000000000 }, + TestCase { lhs: 0b0000000000000000, rhs: 10, expected: 0b0000000000000000 }, + TestCase { lhs: 0b0000000000000000, rhs: 11, expected: 0b0000000000000000 }, + TestCase { lhs: 0b0000000000000000, rhs: 12, expected: 0b0000000000000000 }, + TestCase { lhs: 0b0000000000000000, rhs: 13, expected: 0b0000000000000000 }, + TestCase { lhs: 0b0000000000000000, rhs: 14, expected: 0b0000000000000000 }, + TestCase { lhs: 0b0000000000000000, rhs: 15, expected: 0b0000000000000000 }, + TestCase { lhs: 0b0000000000000000, rhs: 16, expected: 0b0000000000000000 }, + TestCase { lhs: 0b0000000000000000, rhs: 17, expected: 0b0000000000000000 }, + TestCase { lhs: 0b0000000000000000, rhs: 90, expected: 0b0000000000000000 }, + TestCase { lhs: 0b0000000000000000, rhs: 123, expected: 0b0000000000000000 }, + + // Shift of a mixed 0/1 bit pattern + TestCase { lhs: 0b1010101010101010, rhs: 8, expected: 0b10101010 }, + ]; + + + #[test] + fn test_i16() { + for case in test_cases + .span() { + assert_eq!(__llvm_lshr_i16_i16(*case.lhs, *case.rhs), *case.expected); + } + } +} diff --git a/compiler-rt/src/alu/lshr/lshr_i32.cairo b/compiler-rt/src/alu/lshr/lshr_i32.cairo new file mode 100644 index 0000000..9b6e762 --- /dev/null +++ b/compiler-rt/src/alu/lshr/lshr_i32.cairo @@ -0,0 +1,103 @@ +use crate::alu::lshr::lshr; + +pub fn __llvm_lshr_i32_i32(n: u128, shift: u128) -> u128 { + lshr::(n, shift) +} + +#[cfg(test)] +mod tests { + use super::__llvm_lshr_i32_i32; + use crate::alu::test_case::TestCase; + #[cairofmt::skip] + pub const test_cases: [TestCase; 73] = [ + // All possible shifts on all 1s from 0 throughout the whole input value length + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 0, expected: 0b11111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 1, expected: 0b01111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 2, expected: 0b00111111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 3, expected: 0b00011111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 4, expected: 0b00001111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 5, expected: 0b00000111111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 6, expected: 0b00000011111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 7, expected: 0b00000001111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 8, expected: 0b00000000111111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 9, expected: 0b00000000011111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 10, expected: 0b00000000001111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 11, expected: 0b00000000000111111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 12, expected: 0b00000000000011111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 13, expected: 0b00000000000001111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 14, expected: 0b00000000000000111111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 15, expected: 0b00000000000000011111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 16, expected: 0b00000000000000001111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 17, expected: 0b00000000000000000111111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 18, expected: 0b00000000000000000011111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 19, expected: 0b00000000000000000001111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 20, expected: 0b00000000000000000000111111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 21, expected: 0b00000000000000000000011111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 22, expected: 0b00000000000000000000001111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 23, expected: 0b00000000000000000000000111111111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 24, expected: 0b00000000000000000000000011111111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 25, expected: 0b00000000000000000000000001111111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 26, expected: 0b00000000000000000000000000111111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 27, expected: 0b00000000000000000000000000011111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 28, expected: 0b00000000000000000000000000001111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 29, expected: 0b00000000000000000000000000000111 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 30, expected: 0b00000000000000000000000000000011 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 31, expected: 0b00000000000000000000000000000001 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 32, expected: 0b00000000000000000000000000000000 }, + + // Shifts by more bits than the input value contains - overflow should cause loss of the excessive bits + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 33, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 90, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b11111111111111111111111111111111, rhs: 123, expected: 0b00000000000000000000000000000000 }, + + // The same set of operations but on a zero bit pattern + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 0, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 1, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 2, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 3, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 4, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 5, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 6, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 7, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 8, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 9, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 10, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 11, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 12, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 13, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 14, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 15, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 16, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 17, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 18, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 19, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 20, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 21, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 22, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 23, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 24, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 25, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 26, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 27, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 28, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 29, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 30, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 31, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 32, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 33, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 90, expected: 0b00000000000000000000000000000000 }, + TestCase { lhs: 0b00000000000000000000000000000000, rhs: 123, expected: 0b00000000000000000000000000000000 }, + + // Shift of a mixed 0/1 bit pattern + TestCase { lhs: 0b10101010101010101010101010101010, rhs: 16, expected: 0b1010101010101010 }, + ]; + + #[test] + fn test_i32() { + for case in test_cases + .span() { + assert_eq!(__llvm_lshr_i32_i32(*case.lhs, *case.rhs), *case.expected); + } + } +} + diff --git a/compiler-rt/src/alu/lshr/lshr_i64.cairo b/compiler-rt/src/alu/lshr/lshr_i64.cairo new file mode 100644 index 0000000..9fcc1e6 --- /dev/null +++ b/compiler-rt/src/alu/lshr/lshr_i64.cairo @@ -0,0 +1,166 @@ +use crate::alu::lshr::lshr; + +pub fn __llvm_lshr_i64_i64(n: u128, shift: u128) -> u128 { + lshr::(n, shift) +} + +#[cfg(test)] +mod tests { + use super::__llvm_lshr_i64_i64; + use crate::alu::test_case::TestCase; + #[cairofmt::skip] + pub const test_cases: [TestCase; 137] = [ + // All possible shifts on all 1s from 0 throughout the whole input value length + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 0, expected: 0b1111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 1, expected: 0b0111111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 2, expected: 0b0011111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 3, expected: 0b0001111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 4, expected: 0b0000111111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 5, expected: 0b0000011111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 6, expected: 0b0000001111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 7, expected: 0b0000000111111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 8, expected: 0b0000000011111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 9, expected: 0b0000000001111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 10, expected: 0b0000000000111111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 11, expected: 0b0000000000011111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 12, expected: 0b0000000000001111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 13, expected: 0b0000000000000111111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 14, expected: 0b0000000000000011111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 15, expected: 0b0000000000000001111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 16, expected: 0b0000000000000000111111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 17, expected: 0b0000000000000000011111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 18, expected: 0b0000000000000000001111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 19, expected: 0b0000000000000000000111111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 20, expected: 0b0000000000000000000011111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 21, expected: 0b0000000000000000000001111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 22, expected: 0b0000000000000000000000111111111111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 23, expected: 0b0000000000000000000000011111111111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 24, expected: 0b0000000000000000000000001111111111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 25, expected: 0b0000000000000000000000000111111111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 26, expected: 0b0000000000000000000000000011111111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 27, expected: 0b0000000000000000000000000001111111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 28, expected: 0b0000000000000000000000000000111111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 29, expected: 0b0000000000000000000000000000011111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 30, expected: 0b0000000000000000000000000000001111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 31, expected: 0b0000000000000000000000000000000111111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 32, expected: 0b0000000000000000000000000000000011111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 33, expected: 0b0000000000000000000000000000000001111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 34, expected: 0b0000000000000000000000000000000000111111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 35, expected: 0b0000000000000000000000000000000000011111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 36, expected: 0b0000000000000000000000000000000000001111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 37, expected: 0b0000000000000000000000000000000000000111111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 38, expected: 0b0000000000000000000000000000000000000011111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 39, expected: 0b0000000000000000000000000000000000000001111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 40, expected: 0b0000000000000000000000000000000000000000111111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 41, expected: 0b0000000000000000000000000000000000000000011111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 42, expected: 0b0000000000000000000000000000000000000000001111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 43, expected: 0b0000000000000000000000000000000000000000000111111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 44, expected: 0b0000000000000000000000000000000000000000000011111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 45, expected: 0b0000000000000000000000000000000000000000000001111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 46, expected: 0b0000000000000000000000000000000000000000000000111111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 47, expected: 0b0000000000000000000000000000000000000000000000011111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 48, expected: 0b0000000000000000000000000000000000000000000000001111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 49, expected: 0b0000000000000000000000000000000000000000000000000111111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 50, expected: 0b0000000000000000000000000000000000000000000000000011111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 51, expected: 0b0000000000000000000000000000000000000000000000000001111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 52, expected: 0b0000000000000000000000000000000000000000000000000000111111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 53, expected: 0b0000000000000000000000000000000000000000000000000000011111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 54, expected: 0b0000000000000000000000000000000000000000000000000000001111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 55, expected: 0b0000000000000000000000000000000000000000000000000000000111111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 56, expected: 0b0000000000000000000000000000000000000000000000000000000011111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 57, expected: 0b0000000000000000000000000000000000000000000000000000000001111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 58, expected: 0b0000000000000000000000000000000000000000000000000000000000111111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 59, expected: 0b0000000000000000000000000000000000000000000000000000000000011111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 60, expected: 0b0000000000000000000000000000000000000000000000000000000000001111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 61, expected: 0b0000000000000000000000000000000000000000000000000000000000000111 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 62, expected: 0b0000000000000000000000000000000000000000000000000000000000000011 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 63, expected: 0b0000000000000000000000000000000000000000000000000000000000000001 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 64, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + + // Shifts by more bits than the input value contains - overflow should cause loss of the excessive bits + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 65, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 90, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b1111111111111111111111111111111111111111111111111111111111111111, rhs: 123, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + + // The same set of operations but on a zero bit pattern + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 0, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 1, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 2, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 3, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 4, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 5, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 6, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 7, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 8, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 9, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 10, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 11, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 12, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 13, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 14, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 15, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 16, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 17, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 18, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 19, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 20, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 21, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 22, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 23, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 24, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 25, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 26, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 27, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 28, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 29, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 30, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 31, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 32, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 33, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 34, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 35, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 36, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 37, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 38, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 39, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 40, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 41, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 42, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 43, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 44, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 45, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 46, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 47, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 48, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 49, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 50, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 51, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 52, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 53, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 54, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 55, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 56, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 57, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 58, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 59, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 60, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 61, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 62, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 63, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 64, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 65, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 90, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + TestCase { lhs: 0b0000000000000000000000000000000000000000000000000000000000000000, rhs: 123, expected: 0b0000000000000000000000000000000000000000000000000000000000000000 }, + + // Shift of a mixed 0/1 bit pattern + TestCase { lhs: 0b1010101010101010101010101010101010101010101010101010101010101010, rhs: 32, expected: 0b10101010101010101010101010101010 }, + ]; + + #[test] + fn test_i64() { + for case in test_cases + .span() { + assert_eq!(__llvm_lshr_i64_i64(*case.lhs, *case.rhs), *case.expected); + } + } +} diff --git a/compiler-rt/src/alu/lshr/lshr_i8.cairo b/compiler-rt/src/alu/lshr/lshr_i8.cairo new file mode 100644 index 0000000..1a32f79 --- /dev/null +++ b/compiler-rt/src/alu/lshr/lshr_i8.cairo @@ -0,0 +1,55 @@ +use crate::alu::lshr::lshr; + +pub fn __llvm_lshr_i8_i8(n: u128, shift: u128) -> u128 { + lshr::(n, shift) +} + +#[cfg(test)] +mod tests { + use super::__llvm_lshr_i8_i8; + use crate::alu::test_case::TestCase; + #[cairofmt::skip] + pub const test_cases: [TestCase; 25] = [ + // All possible shifts on all 1s from 0 throughout the whole input value length + TestCase { lhs: 0b11111111, rhs: 0, expected: 0b11111111 }, + TestCase { lhs: 0b11111111, rhs: 1, expected: 0b01111111 }, + TestCase { lhs: 0b11111111, rhs: 2, expected: 0b00111111 }, + TestCase { lhs: 0b11111111, rhs: 3, expected: 0b00011111 }, + TestCase { lhs: 0b11111111, rhs: 4, expected: 0b00001111 }, + TestCase { lhs: 0b11111111, rhs: 5, expected: 0b00000111 }, + TestCase { lhs: 0b11111111, rhs: 6, expected: 0b00000011 }, + TestCase { lhs: 0b11111111, rhs: 7, expected: 0b00000001 }, + TestCase { lhs: 0b11111111, rhs: 8, expected: 0b00000000 }, + + // Shifts by more bits than the input value contains - overflow should cause loss of the excessive bits + TestCase { lhs: 0b11111111, rhs: 9, expected: 0b00000000 }, + TestCase { lhs: 0b11111111, rhs: 90, expected: 0b00000000 }, + TestCase { lhs: 0b11111111, rhs: 123, expected: 0b00000000 }, + + // The same set of operations but on a zero bit pattern + TestCase { lhs: 0b00000000, rhs: 0, expected: 0b00000000 }, + TestCase { lhs: 0b00000000, rhs: 1, expected: 0b00000000 }, + TestCase { lhs: 0b00000000, rhs: 2, expected: 0b00000000 }, + TestCase { lhs: 0b00000000, rhs: 3, expected: 0b00000000 }, + TestCase { lhs: 0b00000000, rhs: 4, expected: 0b00000000 }, + TestCase { lhs: 0b00000000, rhs: 5, expected: 0b00000000 }, + TestCase { lhs: 0b00000000, rhs: 6, expected: 0b00000000 }, + TestCase { lhs: 0b00000000, rhs: 7, expected: 0b00000000 }, + TestCase { lhs: 0b00000000, rhs: 8, expected: 0b00000000 }, + TestCase { lhs: 0b00000000, rhs: 9, expected: 0b00000000 }, + TestCase { lhs: 0b00000000, rhs: 90, expected: 0b00000000 }, + TestCase { lhs: 0b00000000, rhs: 123, expected: 0b00000000 }, + + // Shift of a mixed 0/1 bit pattern + TestCase { lhs: 0b10101010, rhs: 4, expected: 0b1010 }, + ]; + + #[test] + fn test_i8() { + for case in test_cases + .span() { + assert_eq!(__llvm_lshr_i8_i8(*case.lhs, *case.rhs), *case.expected); + } + } +} +