@@ -2588,6 +2588,42 @@ pub unsafe fn _mm_storeu_pd(mem_addr: *mut f64, a: __m128d) {
2588
2588
mem_addr. cast :: < __m128d > ( ) . write_unaligned ( a) ;
2589
2589
}
2590
2590
2591
+ /// Store 16-bit integer from the first element of a into memory.
2592
+ ///
2593
+ /// `mem_addr` does not need to be aligned on any particular boundary.
2594
+ ///
2595
+ /// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_storeu_si16)
2596
+ #[ inline]
2597
+ #[ target_feature( enable = "sse2" ) ]
2598
+ #[ unstable( feature = "simd_x86_updates" , issue = "126936" ) ]
2599
+ pub unsafe fn _mm_storeu_si16 ( mem_addr : * mut u8 , a : __m128i ) {
2600
+ ptr:: write_unaligned ( mem_addr as * mut i16 , simd_extract ( a. as_i16x8 ( ) , 0 ) )
2601
+ }
2602
+
2603
+ /// Store 32-bit integer from the first element of a into memory.
2604
+ ///
2605
+ /// `mem_addr` does not need to be aligned on any particular boundary.
2606
+ ///
2607
+ /// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_storeu_si32)
2608
+ #[ inline]
2609
+ #[ target_feature( enable = "sse2" ) ]
2610
+ #[ unstable( feature = "simd_x86_updates" , issue = "126936" ) ]
2611
+ pub unsafe fn _mm_storeu_si32 ( mem_addr : * mut u8 , a : __m128i ) {
2612
+ ptr:: write_unaligned ( mem_addr as * mut i32 , simd_extract ( a. as_i32x4 ( ) , 0 ) )
2613
+ }
2614
+
2615
+ /// Store 64-bit integer from the first element of a into memory.
2616
+ ///
2617
+ /// `mem_addr` does not need to be aligned on any particular boundary.
2618
+ ///
2619
+ /// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_storeu_si64)
2620
+ #[ inline]
2621
+ #[ target_feature( enable = "sse2" ) ]
2622
+ #[ unstable( feature = "simd_x86_updates" , issue = "126936" ) ]
2623
+ pub unsafe fn _mm_storeu_si64 ( mem_addr : * mut u8 , a : __m128i ) {
2624
+ ptr:: write_unaligned ( mem_addr as * mut i64 , simd_extract ( a. as_i64x2 ( ) , 0 ) )
2625
+ }
2626
+
2591
2627
/// Stores the lower double-precision (64-bit) floating-point element from `a`
2592
2628
/// into 2 contiguous elements in memory. `mem_addr` must be aligned on a
2593
2629
/// 16-byte boundary or a general-protection exception may be generated.
@@ -2713,11 +2749,49 @@ pub unsafe fn _mm_loadu_pd(mem_addr: *const f64) -> __m128d {
2713
2749
dst
2714
2750
}
2715
2751
2716
- /// Loads unaligned 64 -bits of integer data from memory into new vector.
2752
+ /// Loads unaligned 16 -bits of integer data from memory into new vector.
2717
2753
///
2718
2754
/// `mem_addr` does not need to be aligned on any particular boundary.
2719
2755
///
2720
- /// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadu_si64)
2756
+ /// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadu_si16)
2757
+ #[ inline]
2758
+ #[ target_feature( enable = "sse2" ) ]
2759
+ #[ unstable( feature = "simd_x86_updates" , issue = "126936" ) ]
2760
+ pub unsafe fn _mm_loadu_si16 ( mem_addr : * const u8 ) -> __m128i {
2761
+ transmute ( i16x8:: new (
2762
+ ptr:: read_unaligned ( mem_addr as * const i16 ) ,
2763
+ 0 ,
2764
+ 0 ,
2765
+ 0 ,
2766
+ 0 ,
2767
+ 0 ,
2768
+ 0 ,
2769
+ 0 ,
2770
+ ) )
2771
+ }
2772
+
2773
+ /// Loads unaligned 32-bits of integer data from memory into new vector.
2774
+ ///
2775
+ /// `mem_addr` does not need to be aligned on any particular boundary.
2776
+ ///
2777
+ /// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadu_si32)
2778
+ #[ inline]
2779
+ #[ target_feature( enable = "sse2" ) ]
2780
+ #[ unstable( feature = "simd_x86_updates" , issue = "126936" ) ]
2781
+ pub unsafe fn _mm_loadu_si32 ( mem_addr : * const u8 ) -> __m128i {
2782
+ transmute ( i32x4:: new (
2783
+ ptr:: read_unaligned ( mem_addr as * const i32 ) ,
2784
+ 0 ,
2785
+ 0 ,
2786
+ 0 ,
2787
+ ) )
2788
+ }
2789
+
2790
+ /// Loads unaligned 16-bits of integer data from memory into new vector.
2791
+ ///
2792
+ /// `mem_addr` does not need to be aligned on any particular boundary.
2793
+ ///
2794
+ /// [Intel's documentation](https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_loadu_si16)
2721
2795
#[ inline]
2722
2796
#[ target_feature( enable = "sse2" ) ]
2723
2797
#[ stable( feature = "simd_x86_mm_loadu_si64" , since = "1.46.0" ) ]
@@ -4699,6 +4773,33 @@ mod tests {
4699
4773
assert_eq ! ( vals[ ofs + 1 ] , 2.0 ) ;
4700
4774
}
4701
4775
4776
+ #[ simd_test( enable = "sse2" ) ]
4777
+ unsafe fn test_mm_storeu_si16 ( ) {
4778
+ let a = _mm_setr_epi16 ( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ) ;
4779
+ let mut r = _mm_setr_epi16 ( 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 ) ;
4780
+ _mm_storeu_si16 ( ptr:: addr_of_mut!( r) . cast ( ) , a) ;
4781
+ let e = _mm_setr_epi16 ( 1 , 10 , 11 , 12 , 13 , 14 , 15 , 16 ) ;
4782
+ assert_eq_m128i ( r, e) ;
4783
+ }
4784
+
4785
+ #[ simd_test( enable = "sse2" ) ]
4786
+ unsafe fn test_mm_storeu_si32 ( ) {
4787
+ let a = _mm_setr_epi32 ( 1 , 2 , 3 , 4 ) ;
4788
+ let mut r = _mm_setr_epi32 ( 5 , 6 , 7 , 8 ) ;
4789
+ _mm_storeu_si32 ( ptr:: addr_of_mut!( r) . cast ( ) , a) ;
4790
+ let e = _mm_setr_epi32 ( 1 , 6 , 7 , 8 ) ;
4791
+ assert_eq_m128i ( r, e) ;
4792
+ }
4793
+
4794
+ #[ simd_test( enable = "sse2" ) ]
4795
+ unsafe fn test_mm_storeu_si64 ( ) {
4796
+ let a = _mm_setr_epi64x ( 1 , 2 ) ;
4797
+ let mut r = _mm_setr_epi64x ( 3 , 4 ) ;
4798
+ _mm_storeu_si64 ( ptr:: addr_of_mut!( r) . cast ( ) , a) ;
4799
+ let e = _mm_setr_epi64x ( 1 , 4 ) ;
4800
+ assert_eq_m128i ( r, e) ;
4801
+ }
4802
+
4702
4803
#[ simd_test( enable = "sse2" ) ]
4703
4804
unsafe fn test_mm_store1_pd ( ) {
4704
4805
let mut mem = Memory { data : [ 0.0f64 ; 4 ] } ;
@@ -4783,6 +4884,20 @@ mod tests {
4783
4884
assert_eq_m128d ( r, e) ;
4784
4885
}
4785
4886
4887
+ #[ simd_test( enable = "sse2" ) ]
4888
+ unsafe fn test_mm_loadu_si16 ( ) {
4889
+ let a = _mm_setr_epi16 ( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ) ;
4890
+ let r = _mm_loadu_si16 ( ptr:: addr_of!( a) as * const _ ) ;
4891
+ assert_eq_m128i ( r, _mm_setr_epi16 ( 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ) ) ;
4892
+ }
4893
+
4894
+ #[ simd_test( enable = "sse2" ) ]
4895
+ unsafe fn test_mm_loadu_si32 ( ) {
4896
+ let a = _mm_setr_epi32 ( 1 , 2 , 3 , 4 ) ;
4897
+ let r = _mm_loadu_si32 ( ptr:: addr_of!( a) as * const _ ) ;
4898
+ assert_eq_m128i ( r, _mm_setr_epi32 ( 1 , 0 , 0 , 0 ) ) ;
4899
+ }
4900
+
4786
4901
#[ simd_test( enable = "sse2" ) ]
4787
4902
unsafe fn test_mm_loadu_si64 ( ) {
4788
4903
let a = _mm_setr_epi64x ( 5 , 6 ) ;
0 commit comments