@@ -1680,6 +1680,30 @@ extern "C" {
1680
1680
fn cmpss ( a : f32x4 , b : f32x4 , imm8 : i8 ) -> f32x4 ;
1681
1681
}
1682
1682
1683
+ /// Stores `a` into the memory at `mem_addr` using a non-temporal memory hint.
1684
+ ///
1685
+ /// `mem_addr` must be aligned on a 16-byte boundary or a general-protection
1686
+ /// exception _may_ be generated.
1687
+ #[ inline( always) ]
1688
+ #[ target_feature = "+sse" ]
1689
+ #[ cfg_attr( test, assert_instr( movntps) ) ]
1690
+ pub unsafe fn _mm_stream_ps ( mem_addr : * mut f32 , a : f32x4 ) {
1691
+ :: core:: intrinsics:: nontemporal_store ( mem:: transmute ( mem_addr) , a) ;
1692
+ }
1693
+
1694
+ /// Store 64-bits of integer data from a into memory using a non-temporal
1695
+ /// memory hint.
1696
+ #[ inline( always) ]
1697
+ #[ target_feature = "+sse" ]
1698
+ // generates movnti on i686 and x86_64 but just a mov on i586
1699
+ #[ cfg_attr( all( test,
1700
+ any( target_arch = "x86_64" ,
1701
+ all( target_arch = "x86" , target_feature = "sse2" ) ) ) ,
1702
+ assert_instr( movnti) ) ]
1703
+ pub unsafe fn _mm_stream_pi ( mem_addr : * mut i64 , a : i64 ) {
1704
+ :: core:: intrinsics:: nontemporal_store ( mem_addr, a) ;
1705
+ }
1706
+
1683
1707
#[ cfg( test) ]
1684
1708
mod tests {
1685
1709
use v128:: * ;
@@ -3261,4 +3285,28 @@ mod tests {
3261
3285
assert_eq ! ( c, f32x4:: new( 3.0 , 7.0 , 11.0 , 15.0 ) ) ;
3262
3286
assert_eq ! ( d, f32x4:: new( 4.0 , 8.0 , 12.0 , 16.0 ) ) ;
3263
3287
}
3288
+
3289
+ #[ repr( align( 16 ) ) ]
3290
+ struct Memory {
3291
+ pub data : [ f32 ; 4 ] ,
3292
+ }
3293
+
3294
+ #[ simd_test = "sse" ]
3295
+ unsafe fn _mm_stream_ps ( ) {
3296
+ let a = f32x4:: splat ( 7.0 ) ;
3297
+ let mut mem = Memory { data : [ -1.0 ; 4 ] } ;
3298
+
3299
+ sse:: _mm_stream_ps ( & mut mem. data [ 0 ] as * mut f32 , a) ;
3300
+ for i in 0 ..4 {
3301
+ assert_eq ! ( mem. data[ i] , a. extract( i as u32 ) ) ;
3302
+ }
3303
+ }
3304
+
3305
+ #[ simd_test = "sse" ]
3306
+ unsafe fn _mm_stream_pi ( ) {
3307
+ let a: i64 = 7 ;
3308
+ let mut mem = :: std:: boxed:: Box :: < i64 > :: new ( -1 ) ;
3309
+ sse:: _mm_stream_pi ( & mut * mem as * mut i64 , a) ;
3310
+ assert_eq ! ( a, * mem) ;
3311
+ }
3264
3312
}
0 commit comments