@@ -619,6 +619,22 @@ pub unsafe fn vld1q_p16(ptr: *const p16) -> poly16x8_t {
619
619
read_unaligned ( ptr. cast ( ) )
620
620
}
621
621
622
+ /// Load multiple single-element structures to one, two, three, or four registers.
623
+ #[ inline]
624
+ #[ target_feature( enable = "neon,aes" ) ]
625
+ #[ cfg_attr( test, assert_instr( ldr) ) ]
626
+ pub unsafe fn vld1_p64 ( ptr : * const p64 ) -> poly64x1_t {
627
+ read_unaligned ( ptr. cast ( ) )
628
+ }
629
+
630
+ /// Load multiple single-element structures to one, two, three, or four registers.
631
+ #[ inline]
632
+ #[ target_feature( enable = "neon,aes" ) ]
633
+ #[ cfg_attr( test, assert_instr( ldr) ) ]
634
+ pub unsafe fn vld1q_p64 ( ptr : * const p64 ) -> poly64x2_t {
635
+ read_unaligned ( ptr. cast ( ) )
636
+ }
637
+
622
638
/// Load multiple single-element structures to one, two, three, or four registers.
623
639
#[ inline]
624
640
#[ target_feature( enable = "neon" ) ]
@@ -651,6 +667,43 @@ pub unsafe fn vld1q_f64(ptr: *const f64) -> float64x2_t {
651
667
read_unaligned ( ptr. cast ( ) )
652
668
}
653
669
670
+ /// Load multiple single-element structures to one, two, three, or four registers
671
+ #[ inline]
672
+ #[ target_feature( enable = "neon" ) ]
673
+ #[ cfg_attr( test, assert_instr( ldr) ) ]
674
+ pub unsafe fn vld1_dup_f64 ( ptr : * const f64 ) -> float64x1_t {
675
+ vld1_f64 ( ptr)
676
+ }
677
+
678
+ /// Load multiple single-element structures to one, two, three, or four registers
679
+ #[ inline]
680
+ #[ target_feature( enable = "neon" ) ]
681
+ #[ cfg_attr( test, assert_instr( ldr) ) ]
682
+ pub unsafe fn vld1q_dup_f64 ( ptr : * const f64 ) -> float64x2_t {
683
+ let x = vld1q_lane_f64 :: < 0 > ( ptr, transmute ( f64x2:: splat ( 0. ) ) ) ;
684
+ simd_shuffle2 ! ( x, x, [ 0 , 0 ] )
685
+ }
686
+
687
+ /// Load one single-element structure to one lane of one register.
688
+ #[ inline]
689
+ #[ target_feature( enable = "neon" ) ]
690
+ #[ rustc_legacy_const_generics( 2 ) ]
691
+ #[ cfg_attr( test, assert_instr( ldr, LANE = 0 ) ) ]
692
+ pub unsafe fn vld1_lane_f64 < const LANE : i32 > ( ptr : * const f64 , src : float64x1_t ) -> float64x1_t {
693
+ static_assert ! ( LANE : i32 where LANE == 0 ) ;
694
+ simd_insert ( src, LANE as u32 , * ptr)
695
+ }
696
+
697
+ /// Load one single-element structure to one lane of one register.
698
+ #[ inline]
699
+ #[ target_feature( enable = "neon" ) ]
700
+ #[ rustc_legacy_const_generics( 2 ) ]
701
+ #[ cfg_attr( test, assert_instr( ldr, LANE = 1 ) ) ]
702
+ pub unsafe fn vld1q_lane_f64 < const LANE : i32 > ( ptr : * const f64 , src : float64x2_t ) -> float64x2_t {
703
+ static_assert_imm1 ! ( LANE ) ;
704
+ simd_insert ( src, LANE as u32 , * ptr)
705
+ }
706
+
654
707
/// Store multiple single-element structures from one, two, three, or four registers.
655
708
#[ inline]
656
709
#[ target_feature( enable = "neon" ) ]
@@ -4700,6 +4753,56 @@ mod tests {
4700
4753
assert_eq ! ( r, e) ;
4701
4754
}
4702
4755
4756
+ #[ simd_test( enable = "neon" ) ]
4757
+ unsafe fn test_vld1_f64 ( ) {
4758
+ let a: [ f64 ; 2 ] = [ 0. , 1. ] ;
4759
+ let e = f64x1:: new ( 1. ) ;
4760
+ let r: f64x1 = transmute ( vld1_f64 ( a[ 1 ..] . as_ptr ( ) ) ) ;
4761
+ assert_eq ! ( r, e)
4762
+ }
4763
+
4764
+ #[ simd_test( enable = "neon" ) ]
4765
+ unsafe fn test_vld1q_f64 ( ) {
4766
+ let a: [ f64 ; 3 ] = [ 0. , 1. , 2. ] ;
4767
+ let e = f64x2:: new ( 1. , 2. ) ;
4768
+ let r: f64x2 = transmute ( vld1q_f64 ( a[ 1 ..] . as_ptr ( ) ) ) ;
4769
+ assert_eq ! ( r, e)
4770
+ }
4771
+
4772
+ #[ simd_test( enable = "neon" ) ]
4773
+ unsafe fn test_vld1_dup_f64 ( ) {
4774
+ let a: [ f64 ; 2 ] = [ 1. , 42. ] ;
4775
+ let e = f64x1:: new ( 42. ) ;
4776
+ let r: f64x1 = transmute ( vld1_dup_f64 ( a[ 1 ..] . as_ptr ( ) ) ) ;
4777
+ assert_eq ! ( r, e)
4778
+ }
4779
+
4780
+ #[ simd_test( enable = "neon" ) ]
4781
+ unsafe fn test_vld1q_dup_f64 ( ) {
4782
+ let elem: f64 = 42. ;
4783
+ let e = f64x2:: new ( 42. , 42. ) ;
4784
+ let r: f64x2 = transmute ( vld1q_dup_f64 ( & elem) ) ;
4785
+ assert_eq ! ( r, e)
4786
+ }
4787
+
4788
+ #[ simd_test( enable = "neon" ) ]
4789
+ unsafe fn test_vld1_lane_f64 ( ) {
4790
+ let a = f64x1:: new ( 0. ) ;
4791
+ let elem: f64 = 42. ;
4792
+ let e = f64x1:: new ( 42. ) ;
4793
+ let r: f64x1 = transmute ( vld1_lane_f64 :: < 0 > ( & elem, transmute ( a) ) ) ;
4794
+ assert_eq ! ( r, e)
4795
+ }
4796
+
4797
+ #[ simd_test( enable = "neon" ) ]
4798
+ unsafe fn test_vld1q_lane_f64 ( ) {
4799
+ let a = f64x2:: new ( 0. , 1. ) ;
4800
+ let elem: f64 = 42. ;
4801
+ let e = f64x2:: new ( 0. , 42. ) ;
4802
+ let r: f64x2 = transmute ( vld1q_lane_f64 :: < 1 > ( & elem, transmute ( a) ) ) ;
4803
+ assert_eq ! ( r, e)
4804
+ }
4805
+
4703
4806
#[ simd_test( enable = "neon" ) ]
4704
4807
unsafe fn test_vst1_p64 ( ) {
4705
4808
let mut vals = [ 0_u64 ; 2 ] ;
0 commit comments