#![cfg_attr(not(feature = "std"), no_std)]
#![doc = include_str!("../README.md")]
#![warn(missing_docs, missing_debug_implementations)]
#![cfg_attr(branches_nightly, feature(core_intrinsics))]
#![cfg_attr(branches_nightly, allow(internal_features))]
#[cfg(branches_stable)]
#[inline(always)]
#[cold]
const fn cold_and_empty() {}
#[cold]
pub extern "C" fn abort() -> ! {
#[cfg(branches_stable)]
{
#[cfg(not(feature = "std"))]
unreachable!();
#[cfg(feature = "std")]
std::process::abort();
}
#[cfg(branches_nightly)]
core::intrinsics::abort()
}
#[inline(always)]
pub unsafe fn assume(b: bool) {
#[cfg(branches_stable)]
{
#[cfg(rustc_ge_1_81_0)]
{
core::hint::assert_unchecked(b)
}
#[cfg(not(rustc_ge_1_81_0))]
{
if !b {
core::hint::unreachable_unchecked()
}
}
}
#[cfg(branches_nightly)]
core::intrinsics::assume(b)
}
#[inline(always)]
pub fn likely(b: bool) -> bool {
#[cfg(branches_stable)]
{
if !b {
cold_and_empty();
}
b
}
#[cfg(branches_nightly)]
core::intrinsics::likely(b)
}
#[cold]
#[inline(always)]
pub const fn mark_unlikely() {}
#[inline(always)]
pub fn unlikely(b: bool) -> bool {
#[cfg(branches_stable)]
{
if b {
cold_and_empty();
}
b
}
#[cfg(branches_nightly)]
core::intrinsics::unlikely(b)
}
#[inline(always)]
#[cfg(feature = "prefetch")]
pub fn prefetch_read_data<T, const LOCALITY: i32>(addr: *const T) {
#[cfg(branches_stable)]
{
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
unsafe {
match LOCALITY {
0 => core::arch::asm!(
"prefetcht0 [{}]",
in(reg) addr,
options(nostack, readonly, preserves_flags)
), 1 => core::arch::asm!(
"prefetcht1 [{}]",
in(reg) addr,
options(nostack, readonly, preserves_flags)
), 2 => core::arch::asm!(
"prefetcht2 [{}]",
in(reg) addr,
options(nostack, readonly, preserves_flags)
), _ => core::arch::asm!(
"prefetchnta [{}]",
in(reg) addr,
options(nostack, readonly, preserves_flags)
), }
}
#[cfg(any(target_arch = "arm", target_arch = "aarch64"))]
unsafe {
match LOCALITY {
0 => core::arch::asm!(
"prfm pldl1keep, [{}]",
in(reg) addr,
options(nostack, readonly, preserves_flags)
), 1 => core::arch::asm!(
"prfm pldl2keep, [{}]",
in(reg) addr,
options(nostack, readonly, preserves_flags)
), _ => core::arch::asm!(
"prfm pldl3keep, [{}]",
in(reg) addr,
options(nostack, readonly, preserves_flags)
), }
}
#[cfg(target_arch = "riscv64")]
unsafe {
core::arch::asm!(
"prefetch [{}]",
in(reg) addr,
options(nostack, readonly, preserves_flags)
);
}
}
#[cfg(branches_nightly)]
core::intrinsics::prefetch_read_data::<_, LOCALITY>(addr)
}
#[inline(always)]
#[cfg(feature = "prefetch")]
pub fn prefetch_write_data<T, const LOCALITY: i32>(addr: *const T) {
#[cfg(branches_stable)]
{
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
unsafe {
core::arch::asm!(
"prefetchw [{}]",
in(reg) addr,
options(nostack, readonly, preserves_flags)
) }
#[cfg(any(target_arch = "arm", target_arch = "aarch64"))]
unsafe {
core::arch::asm!(
"prfm pstl1keep, [{}]",
in(reg) addr,
options(nostack, readonly, preserves_flags)
); }
#[cfg(target_arch = "riscv64")]
unsafe {
core::arch::asm!(
"prefetchw [{}]",
in(reg) addr,
options(nostack, readonly, preserves_flags)
);
}
}
#[cfg(branches_nightly)]
core::intrinsics::prefetch_write_data::<_, LOCALITY>(addr)
}