use super::CuneiformArgs;
use lazy_static::*;
use std::collections::HashMap;
#[cfg(target_arch = "x86")]
const COHERENCE_LINE_SIZE: u8 = (1 << 6);
#[cfg(target_arch = "x86_64")]
const COHERENCE_LINE_SIZE: u8 = (1 << 7);
#[cfg(target_arch = "mips")]
const COHERENCE_LINE_SIZE: u8 = (1 << 5);
#[cfg(target_arch = "mips64")]
const COHERENCE_LINE_SIZE: u8 = (1 << 5);
#[cfg(target_arch = "powerpc")]
const COHERENCE_LINE_SIZE: u8 = (1 << 5);
#[cfg(target_arch = "powerpc64")]
const COHERENCE_LINE_SIZE: u8 = (1 << 6);
#[cfg(target_arch = "riscv")]
const COHERENCE_LINE_SIZE: u8 = (1 << 6);
#[cfg(target_arch = "s390x")]
const COHERENCE_LINE_SIZE: u8 = (1 << 8);
#[cfg(target_arch = "sparc")]
const COHERENCE_LINE_SIZE: u8 = (1 << 5);
#[cfg(target_arch = "sparc64")]
const COHERENCE_LINE_SIZE: u8 = (1 << 6);
#[cfg(target_arch = "thumbv6")]
const COHERENCE_LINE_SIZE: u8 = (1 << 5);
#[cfg(target_arch = "thumbv7")]
const COHERENCE_LINE_SIZE: u8 = (1 << 5);
#[cfg(target_arch = "wasm32")]
const COHERENCE_LINE_SIZE: u8 = FALLBACK_COHERENCE_LINE_SIZE;
#[cfg(target_arch = "arm")]
const COHERENCE_LINE_SIZE: u8 = (1 << 5);
#[cfg(target_arch = "nvptx")]
const COHERENCE_LINE_SIZE: u8 = (1 << 7);
#[cfg(target_arch = "nvptx64")]
const COHERENCE_LINE_SIZE: u8 = (1 << 7);
#[cfg(target_arch = "aarch64")]
const COHERENCE_LINE_SIZE: u8 = (1 << 6);
pub(crate) const FALLBACK_COHERENCE_LINE_SIZE: u8 = (1 << 6);
#[inline]
pub fn slabs() -> &'static HashMap<&'static str, u8> {
lazy_static! {
static ref SLABS: HashMap<&'static str, u8> = [
("powerpc_mpc8xx", 1 << 4),
("powerpc64bridge", 1 << 7),
("powerpc_e500mc", 1 << 6),
("power_7", 1 << 7),
("power_8", 1 << 7),
("power_9", 1 << 7),
("exynos_big", 1 << 7),
("exynos_LITTLE", 1 << 6),
("krait", 1 << 6),
("neoverse_n1", 1 << 6),
].iter().copied().collect();
}
&*SLABS
}
pub(crate) fn fetch(args: CuneiformArgs) -> u8 {
if args.force != 0 && args.force % 2 == 0 {
return args.force as u8;
} else {
if args.force != !0 {
panic!("Forced value is not acceptable.");
}
}
if args.hermetic {
super::detection::hermetic_detection(args) as u8
} else {
slab_fetch(args)
}
}
pub(crate) fn slab_fetch(args: CuneiformArgs) -> u8 {
slabs()
.get(args.slab.as_str())
.map_or(COHERENCE_LINE_SIZE, |e| *e)
}
pub(crate) fn fallbackless_slab_fetch() -> u8 {
COHERENCE_LINE_SIZE
}