| //! ARMv8 intrinsics. |
| //! |
| //! The reference is [ARMv8-A Reference Manual][armv8]. |
| //! |
| //! [armv8]: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc. |
| //! ddi0487a.k_10775/index.html |
| |
| #[cfg(test)] |
| use stdarch_test::assert_instr; |
| |
| /// Reverse the order of the bytes. |
| #[inline] |
| #[cfg_attr(test, assert_instr(rev))] |
| pub unsafe fn _rev_u64(x: u64) -> u64 { |
| x.swap_bytes() as u64 |
| } |
| |
| /// Count Leading Zeros. |
| #[inline] |
| #[cfg_attr(test, assert_instr(clz))] |
| pub unsafe fn _clz_u64(x: u64) -> u64 { |
| x.leading_zeros() as u64 |
| } |
| |
| /// Reverse the bit order. |
| #[inline] |
| #[cfg_attr(test, assert_instr(rbit))] |
| pub unsafe fn _rbit_u64(x: u64) -> u64 { |
| crate::intrinsics::bitreverse(x) |
| } |
| |
| /// Counts the leading most significant bits set. |
| /// |
| /// When all bits of the operand are set it returns the size of the operand in |
| /// bits. |
| #[inline] |
| #[cfg_attr(test, assert_instr(cls))] |
| pub unsafe fn _cls_u32(x: u32) -> u32 { |
| u32::leading_zeros((((((x as i32) >> 31) as u32) ^ x) << 1) | 1) as u32 |
| } |
| |
| /// Counts the leading most significant bits set. |
| /// |
| /// When all bits of the operand are set it returns the size of the operand in |
| /// bits. |
| #[inline] |
| #[cfg_attr(test, assert_instr(cls))] |
| pub unsafe fn _cls_u64(x: u64) -> u64 { |
| u64::leading_zeros((((((x as i64) >> 63) as u64) ^ x) << 1) | 1) as u64 |
| } |
| |
| #[cfg(test)] |
| mod tests { |
| use crate::core_arch::aarch64::v8; |
| |
| #[test] |
| fn _rev_u64() { |
| unsafe { |
| assert_eq!( |
| v8::_rev_u64(0b0000_0000_1111_1111_0000_0000_1111_1111_u64), |
| 0b1111_1111_0000_0000_1111_1111_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_u64 |
| ); |
| } |
| } |
| |
| #[test] |
| fn _clz_u64() { |
| unsafe { |
| assert_eq!(v8::_clz_u64(0b0000_1010u64), 60u64); |
| } |
| } |
| |
| #[test] |
| fn _rbit_u64() { |
| unsafe { |
| assert_eq!( |
| v8::_rbit_u64(0b0000_0000_1111_1101_0000_0000_1111_1111_u64), |
| 0b1111_1111_0000_0000_1011_1111_0000_0000_0000_0000_0000_0000_0000_0000_0000_0000_u64 |
| ); |
| } |
| } |
| |
| #[test] |
| fn _cls_u32() { |
| unsafe { |
| assert_eq!( |
| v8::_cls_u32(0b1111_1111_1111_1111_0000_0000_1111_1111_u32), |
| 15_u32 |
| ); |
| } |
| } |
| |
| #[test] |
| fn _cls_u64() { |
| unsafe { |
| assert_eq!( |
| v8::_cls_u64( |
| 0b1111_1111_1111_1111_0000_0000_1111_1111_0000_0000_0000_0000_0000_0000_0000_0000_u64 |
| ), |
| 15_u64 |
| ); |
| } |
| } |
| } |