Skip to content

Commit 938b6dd

Browse files
committed
Add std_detect::detect::features() -> impl Iterator<Item=(&'static str, bool)> API
1 parent 9fad964 commit 938b6dd

File tree

11 files changed

+314
-558
lines changed

11 files changed

+314
-558
lines changed
Lines changed: 22 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -1,106 +1,36 @@
11
//! Aarch64 run-time features.
22
3-
/// Checks if `aarch64` feature is enabled.
4-
#[macro_export]
5-
#[unstable(feature = "stdsimd", issue = "27731")]
6-
#[allow_internal_unstable(stdsimd_internal,stdsimd)]
7-
macro_rules! is_aarch64_feature_detected {
8-
("neon") => {
9-
// FIXME: this should be removed once we rename Aarch64 neon to asimd
10-
cfg!(target_feature = "neon") ||
11-
$crate::detect::check_for($crate::detect::Feature::asimd)
12-
};
13-
("asimd") => {
14-
cfg!(target_feature = "neon") ||
15-
$crate::detect::check_for($crate::detect::Feature::asimd)
16-
};
17-
("pmull") => {
18-
cfg!(target_feature = "pmull") ||
19-
$crate::detect::check_for($crate::detect::Feature::pmull)
20-
};
21-
("fp") => {
22-
cfg!(target_feature = "fp") ||
23-
$crate::detect::check_for($crate::detect::Feature::fp)
24-
};
25-
("fp16") => {
26-
cfg!(target_feature = "fp16") ||
27-
$crate::detect::check_for($crate::detect::Feature::fp16)
28-
};
29-
("sve") => {
30-
cfg!(target_feature = "sve") ||
31-
$crate::detect::check_for($crate::detect::Feature::sve)
32-
};
33-
("crc") => {
34-
cfg!(target_feature = "crc") ||
35-
$crate::detect::check_for($crate::detect::Feature::crc)
36-
};
37-
("crypto") => {
38-
cfg!(target_feature = "crypto") ||
39-
$crate::detect::check_for($crate::detect::Feature::crypto)
40-
};
41-
("lse") => {
42-
cfg!(target_feature = "lse") ||
43-
$crate::detect::check_for($crate::detect::Feature::lse)
44-
};
45-
("rdm") => {
46-
cfg!(target_feature = "rdm") ||
47-
$crate::detect::check_for($crate::detect::Feature::rdm)
48-
};
49-
("rcpc") => {
50-
cfg!(target_feature = "rcpc") ||
51-
$crate::detect::check_for($crate::detect::Feature::rcpc)
52-
};
53-
("dotprod") => {
54-
cfg!(target_feature = "dotprod") ||
55-
$crate::detect::check_for($crate::detect::Feature::dotprod)
56-
};
57-
("ras") => {
58-
compile_error!("\"ras\" feature cannot be detected at run-time")
59-
};
60-
("v8.1a") => {
61-
compile_error!("\"v8.1a\" feature cannot be detected at run-time")
62-
};
63-
("v8.2a") => {
64-
compile_error!("\"v8.2a\" feature cannot be detected at run-time")
65-
};
66-
("v8.3a") => {
67-
compile_error!("\"v8.3a\" feature cannot be detected at run-time")
68-
};
69-
($t:tt,) => {
70-
is_aarch64_feature_detected!($t);
71-
};
72-
($t:tt) => { compile_error!(concat!("unknown aarch64 target feature: ", $t)) };
73-
}
74-
75-
/// ARM Aarch64 CPU Feature enum. Each variant denotes a position in a bitset
76-
/// for a particular feature.
77-
///
78-
/// PLEASE: do not use this, it is an implementation detail subject to change.
79-
#[doc(hidden)]
80-
#[allow(non_camel_case_types)]
81-
#[repr(u8)]
82-
#[unstable(feature = "stdsimd_internal", issue = "0")]
83-
pub enum Feature {
3+
features! {
4+
@TARGET: aarch64;
5+
@MACRO_NAME: is_aarch64_feature_detected;
6+
@MACRO_ATTRS:
7+
/// Checks if `aarch64` feature is enabled.
8+
#[unstable(feature = "stdsimd", issue = "27731")]
9+
@BIND_FEATURE_NAME: "asimd"; "neon";
10+
@NO_RUNTIME_DETECTION: "ras";
11+
@NO_RUNTIME_DETECTION: "v8.1a";
12+
@NO_RUNTIME_DETECTION: "v8.2a";
13+
@NO_RUNTIME_DETECTION: "v8.3a";
14+
@FEATURE: asimd: "neon";
8415
/// ARM Advanced SIMD (ASIMD)
85-
asimd,
16+
@FEATURE: pmull: "pmull";
8617
/// Polynomial Multiply
87-
pmull,
18+
@FEATURE: fp: "fp";
8819
/// Floating point support
89-
fp,
20+
@FEATURE: fp16: "fp16";
9021
/// Half-float support.
91-
fp16,
22+
@FEATURE: sve: "sve";
9223
/// Scalable Vector Extension (SVE)
93-
sve,
24+
@FEATURE: crc: "crc";
9425
/// CRC32 (Cyclic Redundancy Check)
95-
crc,
26+
@FEATURE: crypto: "crypto";
9627
/// Crypto: AES + PMULL + SHA1 + SHA2
97-
crypto,
28+
@FEATURE: lse: "lse";
9829
/// Atomics (Large System Extension)
99-
lse,
30+
@FEATURE: rdm: "rdm";
10031
/// Rounding Double Multiply (ASIMDRDM)
101-
rdm,
32+
@FEATURE: rcpc: "rcpc";
10233
/// Release consistent Processor consistent (RcPc)
103-
rcpc,
34+
@FEATURE: dotprod: "dotprod";
10435
/// Vector Dot-Product (ASIMDDP)
105-
dotprod,
10636
}
Lines changed: 12 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,17 @@
11
//! Run-time feature detection on ARM Aarch32.
22
3-
/// Checks if `arm` feature is enabled.
4-
#[macro_export]
5-
#[unstable(feature = "stdsimd", issue = "27731")]
6-
#[allow_internal_unstable(stdsimd_internal,stdsimd)]
7-
macro_rules! is_arm_feature_detected {
8-
("neon") => {
9-
cfg!(target_feature = "neon") ||
10-
$crate::detect::check_for($crate::detect::Feature::neon)
11-
};
12-
("pmull") => {
13-
cfg!(target_feature = "pmull") ||
14-
$crate::detect::check_for($crate::detect::Feature::pmull)
15-
};
16-
("v7") => { compile_error!("\"v7\" feature cannot be detected at run-time") };
17-
("vfp2") => { compile_error!("\"vfp2\" feature cannot be detected at run-time") };
18-
("vfp3") => { compile_error!("\"vfp3\" feature cannot be detected at run-time") };
19-
("vfp4") => { compile_error!("\"vfp4\" feature cannot be detected at run-time") };
20-
($t:tt,) => {
21-
is_arm_feature_detected!($t);
22-
};
23-
($t:tt) => { compile_error!(concat!("unknown arm target feature: ", $t)) };
24-
}
25-
26-
/// ARM CPU Feature enum. Each variant denotes a position in a bitset for a
27-
/// particular feature.
28-
///
29-
/// PLEASE: do not use this, it is an implementation detail subject to change.
30-
#[doc(hidden)]
31-
#[allow(non_camel_case_types)]
32-
#[repr(u8)]
33-
#[unstable(feature = "stdsimd_internal", issue = "0")]
34-
pub enum Feature {
3+
features! {
4+
@TARGET: arm;
5+
@MACRO_NAME: is_arm_feature_detected;
6+
@MACRO_ATTRS:
7+
/// Checks if `arm` feature is enabled.
8+
#[unstable(feature = "stdsimd", issue = "27731")]
9+
@NO_RUNTIME_DETECTION: "v7";
10+
@NO_RUNTIME_DETECTION: "vfp2";
11+
@NO_RUNTIME_DETECTION: "vfp3";
12+
@NO_RUNTIME_DETECTION: "vfp4";
13+
@FEATURE: neon: "neon";
3514
/// ARM Advanced SIMD (NEON) - Aarch32
36-
neon,
15+
@FEATURE: pmull: "pmull";
3716
/// Polynomial Multiply
38-
pmull,
3917
}
Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,11 @@
11
//! Run-time feature detection on MIPS.
22
3-
/// Checks if `mips` feature is enabled.
4-
#[macro_export]
5-
#[unstable(feature = "stdsimd", issue = "27731")]
6-
#[allow_internal_unstable(stdsimd_internal,stdsimd)]
7-
macro_rules! is_mips_feature_detected {
8-
("msa") => {
9-
cfg!(target_feature = "msa") ||
10-
$crate::detect::check_for($crate::detect::Feature::msa)
11-
};
12-
($t:tt,) => {
13-
is_mips_feature_detected!($t);
14-
};
15-
($t:tt) => { compile_error!(concat!("unknown mips target feature: ", $t)) };
16-
}
17-
18-
/// MIPS CPU Feature enum. Each variant denotes a position in a bitset for a
19-
/// particular feature.
20-
///
21-
/// PLEASE: do not use this, it is an implementation detail subject to change.
22-
#[doc(hidden)]
23-
#[allow(non_camel_case_types)]
24-
#[repr(u8)]
25-
#[unstable(feature = "stdsimd_internal", issue = "0")]
26-
pub enum Feature {
3+
features! {
4+
@TARGET: mips;
5+
@MACRO_NAME: is_mips_feature_detected;
6+
@MACRO_ATTRS:
7+
/// Checks if `mips` feature is enabled.
8+
#[unstable(feature = "stdsimd", issue = "27731")]
9+
@FEATURE: msa: "msa";
2710
/// MIPS SIMD Architecture (MSA)
28-
msa,
2911
}
Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,11 @@
11
//! Run-time feature detection on MIPS64.
22
3-
/// Checks if `mips64` feature is enabled.
4-
#[macro_export]
5-
#[unstable(feature = "stdsimd", issue = "27731")]
6-
#[allow_internal_unstable(stdsimd_internal,stdsimd)]
7-
macro_rules! is_mips64_feature_detected {
8-
("msa") => {
9-
cfg!(target_feature = "msa") ||
10-
$crate::detect::check_for($crate::detect::Feature::msa)
11-
};
12-
($t:tt,) => {
13-
is_mips64_feature_detected!($t);
14-
};
15-
($t:tt) => { compile_error!(concat!("unknown mips64 target feature: ", $t)) };
16-
}
17-
18-
/// MIPS64 CPU Feature enum. Each variant denotes a position in a bitset
19-
/// for a particular feature.
20-
///
21-
/// PLEASE: do not use this, it is an implementation detail subject to change.
22-
#[doc(hidden)]
23-
#[allow(non_camel_case_types)]
24-
#[repr(u8)]
25-
#[unstable(feature = "stdsimd_internal", issue = "0")]
26-
pub enum Feature {
3+
features! {
4+
@TARGET: mips64;
5+
@MACRO_NAME: is_mips64_feature_detected;
6+
@MACRO_ATTRS:
7+
/// Checks if `mips64` feature is enabled.
8+
#[unstable(feature = "stdsimd", issue = "27731")]
9+
@FEATURE: msa: "msa";
2710
/// MIPS SIMD Architecture (MSA)
28-
msa,
2911
}
Lines changed: 9 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,15 @@
11
//! Run-time feature detection on PowerPC.
22
3-
/// Checks if `powerpc` feature is enabled.
4-
#[macro_export]
5-
#[unstable(feature = "stdsimd", issue = "27731")]
6-
#[allow_internal_unstable(stdsimd_internal,stdsimd)]
7-
macro_rules! is_powerpc_feature_detected {
8-
("altivec") => {
9-
cfg!(target_feature = "altivec") ||
10-
$crate::detect::check_for($crate::detect::Feature::altivec)
11-
};
12-
("vsx") => {
13-
cfg!(target_feature = "vsx") ||
14-
$crate::detect::check_for($crate::detect::Feature::vsx)
15-
};
16-
("power8") => {
17-
cfg!(target_feature = "power8") ||
18-
$crate::detect::check_for($crate::detect::Feature::power8)
19-
};
20-
($t:tt,) => {
21-
is_powerpc_feature_detected!($t);
22-
};
23-
($t:tt) => { compile_error!(concat!("unknown powerpc target feature: ", $t)) };
24-
}
25-
26-
27-
/// PowerPC CPU Feature enum. Each variant denotes a position in a bitset
28-
/// for a particular feature.
29-
///
30-
/// PLEASE: do not use this, it is an implementation detail subject to change.
31-
#[doc(hidden)]
32-
#[allow(non_camel_case_types)]
33-
#[repr(u8)]
34-
#[unstable(feature = "stdsimd_internal", issue = "0")]
35-
pub enum Feature {
3+
features! {
4+
@TARGET: powerpc;
5+
@MACRO_NAME: is_powerpc_feature_detected;
6+
@MACRO_ATTRS:
7+
/// Checks if `powerpc` feature is enabled.
8+
#[unstable(feature = "stdsimd", issue = "27731")]
9+
@FEATURE: altivec: "altivec";
3610
/// Altivec
37-
altivec,
11+
@FEATURE: vsx: "vsx";
3812
/// VSX
39-
vsx,
13+
@FEATURE: power8: "power8";
4014
/// Power8
41-
power8,
4215
}
Lines changed: 9 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,15 @@
11
//! Run-time feature detection on PowerPC64.
22
3-
/// Checks if `powerpc64` feature is enabled.
4-
#[macro_export]
5-
#[unstable(feature = "stdsimd", issue = "27731")]
6-
#[allow_internal_unstable(stdsimd_internal,stdsimd)]
7-
macro_rules! is_powerpc64_feature_detected {
8-
("altivec") => {
9-
cfg!(target_feature = "altivec") ||
10-
$crate::detect::check_for($crate::detect::Feature::altivec)
11-
};
12-
("vsx") => {
13-
cfg!(target_feature = "vsx") ||
14-
$crate::detect::check_for($crate::detect::Feature::vsx)
15-
};
16-
("power8") => {
17-
cfg!(target_feature = "power8") ||
18-
$crate::detect::check_for($crate::detect::Feature::power8)
19-
};
20-
($t:tt,) => {
21-
is_powerpc64_feature_detected!($t);
22-
};
23-
($t:tt) => { compile_error!(concat!("unknown powerpc64 target feature: ", $t)) };
24-
}
25-
26-
27-
/// PowerPC64 CPU Feature enum. Each variant denotes a position in a bitset
28-
/// for a particular feature.
29-
///
30-
/// PLEASE: do not use this, it is an implementation detail subject to change.
31-
#[doc(hidden)]
32-
#[allow(non_camel_case_types)]
33-
#[repr(u8)]
34-
#[unstable(feature = "stdsimd_internal", issue = "0")]
35-
pub enum Feature {
3+
features! {
4+
@TARGET: powerpc64;
5+
@MACRO_NAME: is_powerpc64_feature_detected;
6+
@MACRO_ATTRS:
7+
/// Checks if `powerpc` feature is enabled.
8+
#[unstable(feature = "stdsimd", issue = "27731")]
9+
@FEATURE: altivec: "altivec";
3610
/// Altivec
37-
altivec,
11+
@FEATURE: vsx: "vsx";
3812
/// VSX
39-
vsx,
13+
@FEATURE: power8: "power8";
4014
/// Power8
41-
power8,
4215
}

0 commit comments

Comments
 (0)