1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
//! ARM C 语言扩展 (ACLE)
//!
//! # 开发人员注意事项
//!
//! 以下是代表不同 ARM 体系结构的内置目标的列表; 该列表包括他们拥有的 `target_feature`。
//!
//!
//! - `armv4t-unknown-linux-gnueabi` - **ARMv4** - `+v4t`
//! - `armv5te-unknown-linux-gnueabi` - **ARMv5TE** - `+v4t +v5te`
//! - `arm-unknown-linux-gnueabi` - **ARMv6** - `+v4t +v5te +v6`
//! - `thumbv6m-none-eabi` - **ARMv6-M** - `+v4t +v5te +v6 +thumb-mode +mclass`
//! - `armv7-unknown-linux-gnueabihf` - **ARMv7-A** - `+v4t +v5te +v6 +v6k +v6t2 +v7 +dsp +thumb2 +aclass`
//! - `armv7r-none-eabi` - **ARMv7-R** - `+v4t +v5te +v6 +v6k +v6t2 +v7 +dsp +thumb2 +rclass`
//! - `thumbv7m-none-eabi` - **ARMv7-M** - `+v4t +v5te +v6 +v6k +v6t2 +v7 +thumb2 +thumb-mode +mclass`
//! - `thumbv7em-none-eabi` - **ARMv7E-M** - `+v4t +v5te +v6 +v6k +v6t2 +v7 +dsp +thumb2 +thumb-mode +mclass`
//! - `thumbv8m.main-none-eabi` - **ARMv8-M** - `+v4t +v5te +v6 +v6k +v6t2 +v7 +thumb2 +thumb-mode +mclass`
//! - `armv8r-none-eabi` - **ARMv8-R** - `+v4t +v5te +v6 +v6k +v6t2 +v7 +v8 +thumb2 +rclass`
//! - `aarch64-unknown-linux-gnu` - **ARMv8-A (AArch64)** - `+fp +neon`
//!
//! ACLE 的第 10.1 节说:
//!
//! - "In the sequence of Arm architectures { v5, v5TE, v6, v6T2, v7 } each architecture includes its predecessor instruction set."
//!
//! - "In the sequence of Thumb-only architectures { v6-M, v7-M, v7E-M } each architecture includes its predecessor instruction set."
//!
//! 根据该信息以及查看 LLVM 特性的工作方式 (使用自定义目标),我们可以识别属于其他特性的子集:
//!
//! 图例: `a < b` 读为 "`a` 是 `b` 的子集"; 这意味着如果启用了 `b`,那么还将启用 `a`。
//!
//! - `v4t < v5te < v6 < v6k < v6t2 < v7 < v8`
//! - `v6 < v8m < v6t2`
//! - `v7 < v8m.main`
//!
//! *NOTE*: ACLE 的第 5.4.7 节说:
//!
//! - "__ARM_FEATURE_DSP is defined to 1 if the DSP (v5E) instructions are supported and the intrinsics defined in Saturating intrinsics are available."
//!
//! 这与 LLVM 使用 '+dsp' 特性的方式不匹配。这个特性不是为 v5te 目标设置的,所以我们必须解决这个差异。
//!
//! # References
//!
//! - [ACLE Q2 2018](https://developer.arm.com/docs/101028/latest)
//!
//!
//!
//!
//!
//!
// 仅适用于 'neon' 子模块
#![allow(non_camel_case_types)]
// 通过专用指令 (如 DMB) 支持 8、7 和 6-M。通过 CP15 指令支持所有其他 arches。
// 参见 ACLE 的第 10.1 节
mod barrier;
pub use self::barrier::*;
mod hints;
pub use self::hints::*;
mod registers;
pub use self::registers::*;
#[cfg(any(target_arch = "aarch64", target_feature = "v7", doc))]
mod crc;
#[cfg(any(target_arch = "aarch64", target_feature = "v7", doc))]
pub use crc::*;
#[cfg(any(target_arch = "aarch64", target_feature = "v7", doc))]
mod crypto;
#[cfg(any(target_arch = "aarch64", target_feature = "v7", doc))]
pub use self::crypto::*;
#[cfg(any(target_arch = "aarch64", target_feature = "v7", doc))]
pub(crate) mod neon;
#[cfg(any(target_arch = "aarch64", target_feature = "v7", doc))]
pub use self::neon::*;
#[cfg(test)]
#[cfg(any(target_arch = "aarch64", target_feature = "v7", doc))]
pub(crate) mod test_support;
mod sealed {
pub trait Dmb {
unsafe fn __dmb(&self);
}
pub trait Dsb {
unsafe fn __dsb(&self);
}
pub trait Isb {
unsafe fn __isb(&self);
}
pub trait Rsr {
unsafe fn __rsr(&self) -> u32;
}
pub trait Rsr64 {
unsafe fn __rsr64(&self) -> u64;
}
pub trait Rsrp {
unsafe fn __rsrp(&self) -> *const u8;
}
pub trait Wsr {
unsafe fn __wsr(&self, value: u32);
}
pub trait Wsr64 {
unsafe fn __wsr64(&self, value: u64);
}
pub trait Wsrp {
unsafe fn __wsrp(&self, value: *const u8);
}
}