From 1c378c3a9d8d570a41edef8261559b152fa4a6c4 Mon Sep 17 00:00:00 2001 From: Jeff Muizelaar Date: Tue, 8 Sep 2020 09:39:56 -0400 Subject: [PATCH] Add vld1q_dup_f32 (#897) --- crates/core_arch/src/arm/neon/mod.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/crates/core_arch/src/arm/neon/mod.rs b/crates/core_arch/src/arm/neon/mod.rs index cb397d8178..03dce6dd1b 100644 --- a/crates/core_arch/src/arm/neon/mod.rs +++ b/crates/core_arch/src/arm/neon/mod.rs @@ -1779,6 +1779,18 @@ pub unsafe fn vld1q_f32(addr: *const f32) -> float32x4_t { vld1q_v4f32(addr as *const u8, 4) } +/// Load one single-element structure and Replicate to all lanes (of one register). +#[inline] +#[target_feature(enable = "neon")] +#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))] +#[cfg_attr(all(test, target_arch = "arm"), assert_instr("vld1.32"))] +#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(ld1r))] +pub unsafe fn vld1q_dup_f32(addr: *const f32) -> float32x4_t { + use crate::core_arch::simd::f32x4; + let v = *addr; + transmute(f32x4::new(v, v, v, v)) +} + #[cfg(test)] mod tests { use super::*; @@ -1814,6 +1826,14 @@ mod tests { assert_eq!(r, e); } + #[simd_test(enable = "neon")] + unsafe fn test_vld1q_dup_f32() { + let e = f32x4::new(1., 1., 1., 1.); + let f = [1., 2., 3., 4.]; + let r: f32x4 = transmute(vld1q_dup_f32(f.as_ptr())); + assert_eq!(r, e); + } + #[simd_test(enable = "neon")] unsafe fn test_vget_lane_u8() { let v = i8x8::new(1, 2, 3, 4, 5, 6, 7, 8);