summaryrefslogtreecommitdiffstats
path: root/vendor/cpufeatures/src
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-19 09:26:03 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-19 09:26:03 +0000
commit9918693037dce8aa4bb6f08741b6812923486c18 (patch)
tree21d2b40bec7e6a7ea664acee056eb3d08e15a1cf /vendor/cpufeatures/src
parentReleasing progress-linux version 1.75.0+dfsg1-5~progress7.99u1. (diff)
downloadrustc-9918693037dce8aa4bb6f08741b6812923486c18.tar.xz
rustc-9918693037dce8aa4bb6f08741b6812923486c18.zip
Merging upstream version 1.76.0+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/cpufeatures/src')
-rw-r--r--vendor/cpufeatures/src/aarch64.rs2
-rw-r--r--vendor/cpufeatures/src/lib.rs40
-rw-r--r--vendor/cpufeatures/src/loongarch64.rs106
-rw-r--r--vendor/cpufeatures/src/x86.rs2
4 files changed, 147 insertions, 3 deletions
diff --git a/vendor/cpufeatures/src/aarch64.rs b/vendor/cpufeatures/src/aarch64.rs
index 2c9a044b0..2305d8982 100644
--- a/vendor/cpufeatures/src/aarch64.rs
+++ b/vendor/cpufeatures/src/aarch64.rs
@@ -69,6 +69,7 @@ __expand_check_macro! {
("aes", AES), // Enable AES support.
("sha2", SHA2), // Enable SHA1 and SHA256 support.
("sha3", SHA3), // Enable SHA512 and SHA3 support.
+ ("sm4", SM4), // Enable SM3 and SM4 support.
}
/// Linux hardware capabilities mapped to target features.
@@ -85,6 +86,7 @@ pub mod hwcaps {
pub const AES: c_ulong = libc::HWCAP_AES | libc::HWCAP_PMULL;
pub const SHA2: c_ulong = libc::HWCAP_SHA2;
pub const SHA3: c_ulong = libc::HWCAP_SHA3 | libc::HWCAP_SHA512;
+ pub const SM4: c_ulong = libc::HWCAP_SM3 | libc::HWCAP_SM4;
}
// Apple OS (macOS, iOS, watchOS, and tvOS) `check!` macro.
diff --git a/vendor/cpufeatures/src/lib.rs b/vendor/cpufeatures/src/lib.rs
index dfd1feab7..ba9aa25d0 100644
--- a/vendor/cpufeatures/src/lib.rs
+++ b/vendor/cpufeatures/src/lib.rs
@@ -18,6 +18,30 @@
//! - `sha2`*
//! - `sha3`*
//!
+//! Linux only
+//!
+//! - `sm4`*
+//!
+//! ## `loongarch64`
+//!
+//! Linux only (LoongArch64 does not support OS-independent feature detection)
+//!
+//! Target features:
+//!
+//! - `lam`*
+//! - `ual`*
+//! - `fpu`*
+//! - `lsx`*
+//! - `lasx`*
+//! - `crc32`*
+//! - `complex`*
+//! - `crypto`*
+//! - `lvz`*
+//! - `lbt.x86`*
+//! - `lbt.arm`*
+//! - `lbt.mips`*
+//! - `ptw`*
+//!
//! ## `x86`/`x86_64`
//!
//! OS independent and `no_std`-friendly
@@ -103,19 +127,29 @@
)]
#[cfg(not(miri))]
-#[cfg(all(target_arch = "aarch64"))]
+#[cfg(target_arch = "aarch64")]
#[doc(hidden)]
pub mod aarch64;
#[cfg(not(miri))]
+#[cfg(target_arch = "loongarch64")]
+#[doc(hidden)]
+pub mod loongarch64;
+
+#[cfg(not(miri))]
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
mod x86;
#[cfg(miri)]
mod miri;
-#[cfg(not(any(target_arch = "aarch64", target_arch = "x86", target_arch = "x86_64")))]
-compile_error!("This crate works only on `aarch64`, `x86`, and `x86-64` targets.");
+#[cfg(not(any(
+ target_arch = "aarch64",
+ target_arch = "loongarch64",
+ target_arch = "x86",
+ target_arch = "x86_64"
+)))]
+compile_error!("This crate works only on `aarch64`, `loongarch64`, `x86`, and `x86-64` targets.");
/// Create module with CPU feature detection code.
#[macro_export]
diff --git a/vendor/cpufeatures/src/loongarch64.rs b/vendor/cpufeatures/src/loongarch64.rs
new file mode 100644
index 000000000..51398d74e
--- /dev/null
+++ b/vendor/cpufeatures/src/loongarch64.rs
@@ -0,0 +1,106 @@
+//! LoongArch64 CPU feature detection support.
+//!
+//! This implementation relies on OS-specific APIs for feature detection.
+
+// Evaluate the given `$body` expression any of the supplied target features
+// are not enabled. Otherwise returns true.
+#[macro_export]
+#[doc(hidden)]
+macro_rules! __unless_target_features {
+ ($($tf:tt),+ => $body:expr ) => {
+ {
+ #[cfg(not(all($(target_feature=$tf,)*)))]
+ $body
+
+ #[cfg(all($(target_feature=$tf,)*))]
+ true
+ }
+ };
+}
+
+// Linux runtime detection of target CPU features using `getauxval`.
+#[cfg(target_os = "linux")]
+#[macro_export]
+#[doc(hidden)]
+macro_rules! __detect_target_features {
+ ($($tf:tt),+) => {{
+ let hwcaps = $crate::loongarch64::getauxval_hwcap();
+ $($crate::check!(hwcaps, $tf) & )+ true
+ }};
+}
+
+/// Linux helper function for calling `getauxval` to get `AT_HWCAP`.
+#[cfg(target_os = "linux")]
+pub fn getauxval_hwcap() -> u64 {
+ unsafe { libc::getauxval(libc::AT_HWCAP) }
+}
+
+// Linux `expand_check_macro`
+#[cfg(target_os = "linux")]
+macro_rules! __expand_check_macro {
+ ($(($name:tt, $hwcap:ident)),* $(,)?) => {
+ #[macro_export]
+ #[doc(hidden)]
+ macro_rules! check {
+ $(
+ ($hwcaps:expr, $name) => {
+ (($hwcaps & $crate::loongarch64::hwcaps::$hwcap) != 0)
+ };
+ )*
+ }
+ };
+}
+
+// Linux `expand_check_macro`
+#[cfg(target_os = "linux")]
+__expand_check_macro! {
+ ("cpucfg", CPUCFG), // Enable CPUCFG support.
+ ("lam", LAM), // Enable LAM support.
+ ("ual", UAL), // Enable UAL support.
+ ("fpu", FPU), // Enable FPU support.
+ ("lsx", LSX), // Enable LSX support.
+ ("lasx", LASX), // Enable LASX support.
+ ("crc32", CRC32), // Enable CRC32 support.
+ ("complex", COMPLEX), // Enable COMPLEX support.
+ ("crypto", CRYPTO), // Enable CRYPTO support.
+ ("lvz", LVZ), // Enable LVZ support.
+ ("lbt.x86", LBT_X86), // Enable LBT_X86 support.
+ ("lbt.arm", LBT_ARM), // Enable LBT_ARM support.
+ ("lbt.mips", LBT_MIPS), // Enable LBT_MIPS support.
+ ("ptw", PTW), // Enable PTW support.
+}
+
+/// Linux hardware capabilities mapped to target features.
+///
+/// Note that LLVM target features are coarser grained than what Linux supports
+/// and imply more capabilities under each feature. This module attempts to
+/// provide that mapping accordingly.
+#[cfg(target_os = "linux")]
+pub mod hwcaps {
+ use libc::c_ulong;
+
+ pub const CPUCFG: c_ulong = libc::HWCAP_CPUCFG;
+ pub const LAM: c_ulong = libc::HWCAP_LAM;
+ pub const UAL: c_ulong = libc::HWCAP_UAL;
+ pub const FPU: c_ulong = libc::HWCAP_FPU;
+ pub const LSX: c_ulong = libc::HWCAP_LSX;
+ pub const LASX: c_ulong = libc::HWCAP_LASX;
+ pub const CRC32: c_ulong = libc::HWCAP_CRC32;
+ pub const COMPLEX: c_ulong = libc::HWCAP_COMPLEX;
+ pub const CRYPTO: c_ulong = libc::HWCAP_CRYPTO;
+ pub const LVZ: c_ulong = libc::HWCAP_LVZ;
+ pub const LBT_X86: c_ulong = libc::HWCAP_LBT_X86;
+ pub const LBT_ARM: c_ulong = libc::HWCAP_LBT_ARM;
+ pub const LBT_MIPS: c_ulong = libc::HWCAP_LBT_MIPS;
+ pub const PTW: c_ulong = libc::HWCAP_PTW;
+}
+
+// On other targets, runtime CPU feature detection is unavailable
+#[cfg(not(target_os = "linux"))]
+#[macro_export]
+#[doc(hidden)]
+macro_rules! __detect_target_features {
+ ($($tf:tt),+) => {
+ false
+ };
+}
diff --git a/vendor/cpufeatures/src/x86.rs b/vendor/cpufeatures/src/x86.rs
index 2199f2779..958eff3ee 100644
--- a/vendor/cpufeatures/src/x86.rs
+++ b/vendor/cpufeatures/src/x86.rs
@@ -142,4 +142,6 @@ __expand_check_macro! {
("sha", "xmm", 1, ebx, 29),
("avx512bw", "zmm", 1, ebx, 30),
("avx512vl", "zmm", 1, ebx, 31),
+ ("avx512vbmi", "zmm", 1, ecx, 1),
+ ("avx512vbmi2", "zmm", 1, ecx, 6),
}