ab_riscv_interpreter/rv64/b/zbc/
zbc_helpers.rs1#[cfg(any(miri, not(all(target_arch = "riscv64", target_feature = "zbc"))))]
5#[inline(always)]
6#[doc(hidden)]
7pub fn clmul_internal(a: u64, b: u64) -> u128 {
8 cfg_select! {
9 all(
12 not(miri), target_arch = "aarch64", target_feature = "neon", target_feature = "aes"
13 ) => {{
14 use core::arch::aarch64::vmull_p64;
15
16 unsafe { vmull_p64(a, b) }
18 }}
19 all(target_arch = "x86_64", target_feature = "pclmulqdq") => {{
20 use core::arch::x86_64::{__m128i, _mm_clmulepi64_si128, _mm_cvtsi64_si128};
21 use core::mem::transmute;
22
23 unsafe {
26 transmute::<__m128i, u128>(_mm_clmulepi64_si128(
27 _mm_cvtsi64_si128(a.cast_signed()),
28 _mm_cvtsi64_si128(b.cast_signed()),
29 0,
30 ))
31 }
32 }}
33 _ => {{
34 let mut result = 0u128;
36 let a = a as u128;
37 let mut b = b;
38 for i in 0..u64::BITS {
39 let bit = (b & 1) as u128;
40 result ^= a.wrapping_shl(i) & (0u128.wrapping_sub(bit));
41 b >>= 1;
42 }
43 result
44 }}
45 }
46}
47
48#[doc(hidden)]
50pub const PLACEHOLDER: () = ();