about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJubilee Young <workingjubilee@gmail.com>2021-11-12 16:42:48 -0800
committerJubilee <46493976+workingjubilee@users.noreply.github.com>2021-11-12 16:56:14 -0800
commit1ce1c645cf27c4acdefe6ec8a11d1f0491954a99 (patch)
treef61828afb6553ade15d7942fa05e846e40b45a49
parent6ddf7ad8e19dfc3c73501bc4dbe066e46ced0f36 (diff)
downloadrust-1ce1c645cf27c4acdefe6ec8a11d1f0491954a99.tar.gz
rust-1ce1c645cf27c4acdefe6ec8a11d1f0491954a99.zip
Rewrite Arm transmutes, reading std::arch closer
-rw-r--r--crates/core_simd/src/vendor.rs6
-rw-r--r--crates/core_simd/src/vendor/arm.rs91
2 files changed, 59 insertions, 38 deletions
diff --git a/crates/core_simd/src/vendor.rs b/crates/core_simd/src/vendor.rs
index 5f6a480f081..e8ce7176b4f 100644
--- a/crates/core_simd/src/vendor.rs
+++ b/crates/core_simd/src/vendor.rs
@@ -15,16 +15,14 @@ macro_rules! from_transmute {
     };
 }
 
+/// Conversions to x86's SIMD types.
 #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
 mod x86;
 
 #[cfg(any(target_arch = "wasm32"))]
 mod wasm32;
 
-#[cfg(any(
-    target_arch = "aarch64",
-    all(target_arch = "arm", target_feature = "v7")
-))]
+#[cfg(any(target_arch = "aarch64", target_arch = "arm",))]
 mod arm;
 
 #[cfg(any(target_arch = "powerpc", target_arch = "powerpc64"))]
diff --git a/crates/core_simd/src/vendor/arm.rs b/crates/core_simd/src/vendor/arm.rs
index 720c84cdd88..ff3b69ccf95 100644
--- a/crates/core_simd/src/vendor/arm.rs
+++ b/crates/core_simd/src/vendor/arm.rs
@@ -1,53 +1,76 @@
+#![allow(unused)]
 use crate::simd::*;
 
-#[cfg(all(target_arch = "arm", target_feature = "v7"))]
+#[cfg(target_arch = "arm")]
 use core::arch::arm::*;
 
 #[cfg(target_arch = "aarch64")]
 use core::arch::aarch64::*;
 
-from_transmute! { unsafe f32x2 => float32x2_t }
-from_transmute! { unsafe f32x4 => float32x4_t }
-
-from_transmute! { unsafe u8x8 => uint8x8_t }
-from_transmute! { unsafe u8x16 => uint8x16_t }
-from_transmute! { unsafe i8x8 => int8x8_t }
-from_transmute! { unsafe i8x16 => int8x16_t }
-from_transmute! { unsafe u8x8 => poly8x8_t }
-from_transmute! { unsafe u8x16 => poly8x16_t }
-
-from_transmute! { unsafe u16x4 => uint16x4_t }
-from_transmute! { unsafe u16x8 => uint16x8_t }
-from_transmute! { unsafe i16x4 => int16x4_t }
-from_transmute! { unsafe i16x8 => int16x8_t }
-from_transmute! { unsafe u16x4 => poly16x4_t }
-from_transmute! { unsafe u16x8 => poly16x8_t }
-
-from_transmute! { unsafe u32x2 => uint32x2_t }
-from_transmute! { unsafe u32x4 => uint32x4_t }
-from_transmute! { unsafe i32x2 => int32x2_t }
-from_transmute! { unsafe i32x4 => int32x4_t }
-
-from_transmute! { unsafe Simd<u64, 1> => uint64x1_t }
-from_transmute! { unsafe u64x2 => uint64x2_t }
-from_transmute! { unsafe Simd<i64, 1> => int64x1_t }
-from_transmute! { unsafe i64x2 => int64x2_t }
-from_transmute! { unsafe Simd<u64, 1> => poly64x1_t }
-from_transmute! { unsafe u64x2 => poly64x2_t }
-
-#[cfg(all(target_arch = "arm", target_feature = "v7"))]
-mod arm {
+#[cfg(any(
+    target_arch = "aarch64",
+    all(target_arch = "arm", target_feature = "v7"),
+))]
+mod neon {
+    use super::*;
+
+    from_transmute! { unsafe f32x2 => float32x2_t }
+    from_transmute! { unsafe f32x4 => float32x4_t }
+
+    from_transmute! { unsafe u8x8 => uint8x8_t }
+    from_transmute! { unsafe u8x16 => uint8x16_t }
+    from_transmute! { unsafe i8x8 => int8x8_t }
+    from_transmute! { unsafe i8x16 => int8x16_t }
+    from_transmute! { unsafe u8x8 => poly8x8_t }
+    from_transmute! { unsafe u8x16 => poly8x16_t }
+
+    from_transmute! { unsafe u16x4 => uint16x4_t }
+    from_transmute! { unsafe u16x8 => uint16x8_t }
+    from_transmute! { unsafe i16x4 => int16x4_t }
+    from_transmute! { unsafe i16x8 => int16x8_t }
+    from_transmute! { unsafe u16x4 => poly16x4_t }
+    from_transmute! { unsafe u16x8 => poly16x8_t }
+
+    from_transmute! { unsafe u32x2 => uint32x2_t }
+    from_transmute! { unsafe u32x4 => uint32x4_t }
+    from_transmute! { unsafe i32x2 => int32x2_t }
+    from_transmute! { unsafe i32x4 => int32x4_t }
+
+    from_transmute! { unsafe Simd<u64, 1> => uint64x1_t }
+    from_transmute! { unsafe u64x2 => uint64x2_t }
+    from_transmute! { unsafe Simd<i64, 1> => int64x1_t }
+    from_transmute! { unsafe i64x2 => int64x2_t }
+    from_transmute! { unsafe Simd<u64, 1> => poly64x1_t }
+    from_transmute! { unsafe u64x2 => poly64x2_t }
+}
+
+#[cfg(any(
+    all(target_feature = "v5te", not(target_feature = "mclass")),
+    all(target_feature = "mclass", target_feature = "dsp"),
+))]
+mod dsp {
     use super::*;
-    from_transmute! { unsafe Simd<u8, 4> => uint8x4_t }
-    from_transmute! { unsafe Simd<i8, 4> => int8x4_t }
 
     from_transmute! { unsafe Simd<u16, 2> => uint16x2_t }
     from_transmute! { unsafe Simd<i16, 2> => int16x2_t }
 }
 
+#[cfg(any(
+    all(target_feature = "v6", not(target_feature = "mclass")),
+    all(target_feature = "mclass", target_feature = "dsp"),
+))]
+mod simd32 {
+    use super::*;
+
+    from_transmute! { unsafe Simd<u8, 4> => uint8x4_t }
+    from_transmute! { unsafe Simd<i8, 4> => int8x4_t }
+}
+
 #[cfg(target_arch = "aarch64")]
 mod aarch64 {
+    use super::neon::*;
     use super::*;
+
     from_transmute! { unsafe Simd<f64, 1> => float64x1_t }
     from_transmute! { unsafe f64x2 => float64x2_t }
 }