#[inline(always)]
pub(super) fn arch_cpu_relax() {
    // Zihintpause 的 `pause`:自旋等待提示(省功耗/让出流水线资源)。其编码在不支持该扩展的
    // 实现上退化为无害的弱 fence,故用 `.option arch` 显式允许,使 imac 基线也能汇编。
    unsafe {
        core::arch::asm!(".option push", ".option arch, +zihintpause", "pause", ".option pop");
    }
}

// rmb/wmb/mb 直接发精确的 `fence` 指令;inline asm 默认含 memory clobber,兼作编译器屏障
// (等价 Linux 的 `RISCV_FENCE`),故无需再叠加 compiler_fence。

#[inline(always)]
pub(super) fn arch_smp_rmb() {
    unsafe { core::arch::asm!("fence r, r") };
}

#[inline(always)]
pub(super) fn arch_smp_wmb() {
    unsafe { core::arch::asm!("fence w, w") };
}

#[inline(always)]
pub(super) fn arch_smp_mb() {
    unsafe { core::arch::asm!("fence rw, rw") };
}

// MMIO 屏障：用带 I/O 位的 fence 显式约束设备访问顺序，不依赖物理区 PMA 是否强序
// (等价 Linux riscv `mmio.h` 的 `__io_bw`/`__io_ar`)。

#[inline(always)]
pub(super) fn arch_io_wmb() {
    // 前驱=普通写(w)，后继=输出/IO 写(o)：把此前的内存写排到该 MMIO 写之前。
    unsafe { core::arch::asm!("fence w, o") };
}

#[inline(always)]
pub(super) fn arch_io_rmb() {
    // 前驱=输入/IO 读(i)，后继=输入读(ir)：把该 MMIO 读排到后续读/IO 之前。
    unsafe { core::arch::asm!("fence i, ir") };
}

#[inline(always)]
pub(super) fn arch_isb() {
    unsafe { core::arch::asm!("fence.i") };
}
