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
//! ARM 内部函数。
//!
//! NEON 的引用为 [ARM 的 NEON 内部函数参考][arm_ref]。
//! [ARM 的 NEON Intrinsics 在线数据库][arm_dat] 也很有用。
//!
//! [arm_ref]: http://infocenter.arm.com/help/topic/com.arm.doc.ihi0073a/IHI0073A_arm_neon_intrinsics_ref.pdf
//! [arm_dat]: https://developer.arm.com/technologies/neon/intrinsics
mod armclang;
pub use self::armclang::*;
mod v6;
pub use self::v6::*;
// 支持的 arches: 6、7-M。请参见 ACLE 的 10.1 部分 (例如 SSAT)
#[cfg(any(target_feature = "v6", doc))]
mod sat;
#[cfg(any(target_feature = "v6", doc))]
pub use self::sat::*;
// 支持的 arches: 5TE,7E-M。参见 ACLE 的 10.1 部分 (例如
// QADD) 即使从 ACLE 2.0 开始不赞成使用 DSP,我们也包括 A 配置文件 (请参见 5.4.7 部分)。在这里,我们通过在 '+v5te' 而非 '+dsp' 上进行选通来解决 LLVM 的 + dsp 和 ACLE 的 __ARM_FEATURE_DSP 之间的差异
//
//
//
#[cfg(any(
// >= v5TE,但不包括 v7-M
all(target_feature = "v5te", not(target_feature = "mclass")),
// v7E-M
all(target_feature = "mclass", target_feature = "dsp"),
doc,
))]
pub mod dsp;
#[cfg(any(
// >= v5TE,但不包括 v7-M
all(target_feature = "v5te", not(target_feature = "mclass")),
// v7E-M
all(target_feature = "mclass", target_feature = "dsp"),
doc,
))]
pub use self::dsp::*;
// ACLE 的 5.4.9 部分说,在 ACLE 2.0 中已不赞成 A 配置文件,但在 M 和 R 配置文件中完全支持。
// 即使不推荐使用,我们也会在 A 个人资料中公开这些内容
#[cfg(any(
// v7-A, v7-R
all(target_feature = "v6", not(target_feature = "mclass")),
// v7E-M
all(target_feature = "mclass", target_feature = "dsp"),
doc,
))]
mod simd32;
#[cfg(any(
// v7-A, v7-R
all(target_feature = "v6", not(target_feature = "mclass")),
// v7E-M
all(target_feature = "mclass", target_feature = "dsp"),
doc,
))]
pub use self::simd32::*;
#[cfg(any(target_feature = "v7", doc))]
mod v7;
#[cfg(any(target_feature = "v7", doc))]
pub use self::v7::*;
mod ex;
pub use self::ex::*;
pub use crate::core_arch::arm_shared::*;
#[cfg(test)]
use stdarch_test::assert_instr;
#[cfg(any(target_feature = "v7", doc))]
pub(crate) mod neon;
#[cfg(any(target_feature = "v7", doc))]
pub use neon::*;
/// 生成陷阱指令 `UDF`
#[cfg(target_arch = "arm")]
#[cfg_attr(test, assert_instr(udf))]
#[inline]
pub unsafe fn udf() -> ! {
crate::intrinsics::abort()
}
/// 生成 DBG 指令。
///
/// 这为调试和相关系统提供了提示。
/// 参数必须是 0 到 15 (含) 之间的常量整数。
/// 有关此指令的效果 (如果有) 和参数的含义,请参见实现文档。
/// 这仅在为 AArch32 编译时可用。
// ACLE 的 10.1 部分说,支持的 arches 是: 7、7-M` 在 ARMv7 中添加了 DBG 提示指令。
// 它在 ARMv6 基础架构中未定义,在 ARMv6K 和 ARMv6T2 中作为 NOP 指令执行。`-ARM 架构引用手册 ARMv7-A 和 ARMv7-R 版 (ARM DDI 0406C.c) 部分 D12.4.1 "ARM 指令集支持" 和 D12.4.2 "Thumb 指令集支持"
//
//
//
#[cfg(any(target_feature = "v7", doc))]
#[inline(always)]
#[rustc_legacy_const_generics(0)]
pub unsafe fn __dbg<const IMM4: i32>() {
static_assert_uimm_bits!(IMM4, 4);
dbg(IMM4);
}
extern "unadjusted" {
#[link_name = "llvm.arm.dbg"]
fn dbg(_: i32);
}