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);
}