@@ -2997,40 +2997,28 @@ mod tests {
29972997 }
29982998 }
29992999
3000- #[ simd_test( enable = "sse" ) ]
3001- fn test_mm_cvtss_si32 ( ) {
3000+ fn test_mm_cvtss_si32_impl ( f : fn ( __m128 ) -> i32 ) {
30023001 let inputs = & [ 42.0f32 , -3.1 , 4.0e10 , 4.0e-20 , NAN , 2147483500.1 ] ;
30033002 let result = & [ 42i32 , -3 , i32:: MIN , 0 , i32:: MIN , 2147483520 ] ;
30043003 for i in 0 ..inputs. len ( ) {
3005- let x = _mm_setr_ps ( inputs[ i] , 1.0 , 3.0 , 4.0 ) ;
3004+ let x = unsafe { _mm_setr_ps ( inputs[ i] , 1.0 , 3.0 , 4.0 ) } ;
30063005 let e = result[ i] ;
3007- let r = _mm_cvtss_si32 ( x) ;
3008- assert_eq ! (
3009- e, r,
3010- "TestCase #{} _mm_cvtss_si32({:?}) = {}, expected: {}" ,
3011- i, x, r, e
3012- ) ;
3006+ let r = f ( x) ;
3007+ assert_eq ! ( e, r, "TestCase #{} f({:?}) = {}, expected: {}" , i, x, r, e) ;
30133008 }
30143009 }
30153010
30163011 #[ simd_test( enable = "sse" ) ]
3017- fn test_mm_cvt_ss2si ( ) {
3018- let inputs = & [ 42.0f32 , -3.1 , 4.0e10 , 4.0e-20 , NAN , 2147483500.1 ] ;
3019- let result = & [ 42i32 , -3 , i32:: MIN , 0 , i32:: MIN , 2147483520 ] ;
3020- for i in 0 ..inputs. len ( ) {
3021- let x = _mm_setr_ps ( inputs[ i] , 1.0 , 3.0 , 4.0 ) ;
3022- let e = result[ i] ;
3023- let r = _mm_cvt_ss2si ( x) ;
3024- assert_eq ! (
3025- e, r,
3026- "TestCase #{} _mm_cvt_ss2si({:?}) = {}, expected: {}" ,
3027- i, x, r, e
3028- ) ;
3029- }
3012+ fn test_mm_cvtss_si32 ( ) {
3013+ test_mm_cvtss_si32_impl ( _mm_cvtss_si32) ;
30303014 }
30313015
30323016 #[ simd_test( enable = "sse" ) ]
3033- fn test_mm_cvttss_si32 ( ) {
3017+ fn test_mm_cvt_ss2si ( ) {
3018+ test_mm_cvtss_si32_impl ( _mm_cvt_ss2si) ;
3019+ }
3020+
3021+ fn test_cvttss_si32_impl ( f : fn ( __m128 ) -> i32 ) {
30343022 let inputs = & [
30353023 ( 42.0f32 , 42i32 ) ,
30363024 ( -31.4 , -31 ) ,
@@ -3044,81 +3032,48 @@ mod tests {
30443032 ( 2147483500.1 , 2147483520 ) ,
30453033 ] ;
30463034 for ( i, & ( xi, e) ) in inputs. iter ( ) . enumerate ( ) {
3047- let x = _mm_setr_ps ( xi, 1.0 , 3.0 , 4.0 ) ;
3048- let r = _mm_cvttss_si32 ( x) ;
3049- assert_eq ! (
3050- e, r,
3051- "TestCase #{} _mm_cvttss_si32({:?}) = {}, expected: {}" ,
3052- i, x, r, e
3053- ) ;
3035+ let x = unsafe { _mm_setr_ps ( xi, 1.0 , 3.0 , 4.0 ) } ;
3036+ let r = f ( x) ;
3037+ assert_eq ! ( e, r, "TestCase #{} f({:?}) = {}, expected: {}" , i, x, r, e) ;
30543038 }
30553039 }
30563040
30573041 #[ simd_test( enable = "sse" ) ]
3058- fn test_mm_cvtt_ss2si ( ) {
3059- let inputs = & [
3060- ( 42.0f32 , 42i32 ) ,
3061- ( -31.4 , -31 ) ,
3062- ( -33.5 , -33 ) ,
3063- ( -34.5 , -34 ) ,
3064- ( 10.999 , 10 ) ,
3065- ( -5.99 , -5 ) ,
3066- ( 4.0e10 , i32:: MIN ) ,
3067- ( 4.0e-10 , 0 ) ,
3068- ( NAN , i32:: MIN ) ,
3069- ( 2147483500.1 , 2147483520 ) ,
3070- ] ;
3071- for ( i, & ( xi, e) ) in inputs. iter ( ) . enumerate ( ) {
3072- let x = _mm_setr_ps ( xi, 1.0 , 3.0 , 4.0 ) ;
3073- let r = _mm_cvtt_ss2si ( x) ;
3074- assert_eq ! (
3075- e, r,
3076- "TestCase #{} _mm_cvtt_ss2si({:?}) = {}, expected: {}" ,
3077- i, x, r, e
3078- ) ;
3079- }
3042+ fn test_mm_cvttss_si32 ( ) {
3043+ test_cvttss_si32_impl ( _mm_cvttss_si32) ;
30803044 }
30813045
30823046 #[ simd_test( enable = "sse" ) ]
3083- const fn test_mm_cvtsi32_ss ( ) {
3084- let a = _mm_setr_ps ( 5.0 , 6.0 , 7.0 , 8.0 ) ;
3047+ fn test_mm_cvtt_ss2si ( ) {
3048+ test_cvttss_si32_impl ( _mm_cvtt_ss2si)
3049+ }
30853050
3086- let r = _mm_cvtsi32_ss ( a , 4555 ) ;
3087- let e = _mm_setr_ps ( 4555.0 , 6.0 , 7.0 , 8.0 ) ;
3088- assert_eq_m128 ( e , r ) ;
3051+ fn test_mm_cvtsi32_ss_impl ( f : fn ( __m128 , i32 ) -> __m128 ) {
3052+ unsafe {
3053+ let a = _mm_setr_ps ( 5.0 , 6.0 , 7.0 , 8.0 ) ;
30893054
3090- let r = _mm_cvtsi32_ss ( a, 322223333 ) ;
3091- let e = _mm_setr_ps ( 322223333.0 , 6.0 , 7.0 , 8.0 ) ;
3092- assert_eq_m128 ( e, r) ;
3055+ let r = f ( a, 4555 ) ;
3056+ assert_eq_m128 ( _mm_setr_ps ( 4555.0 , 6.0 , 7.0 , 8.0 ) , r) ;
30933057
3094- let r = _mm_cvtsi32_ss ( a, -432 ) ;
3095- let e = _mm_setr_ps ( -432.0 , 6.0 , 7.0 , 8.0 ) ;
3096- assert_eq_m128 ( e, r) ;
3058+ let r = f ( a, 322223333 ) ;
3059+ assert_eq_m128 ( _mm_setr_ps ( 322223333.0 , 6.0 , 7.0 , 8.0 ) , r) ;
30973060
3098- let r = _mm_cvtsi32_ss ( a, -322223333 ) ;
3099- let e = _mm_setr_ps ( -322223333.0 , 6.0 , 7.0 , 8.0 ) ;
3100- assert_eq_m128 ( e, r) ;
3061+ let r = f ( a, -432 ) ;
3062+ assert_eq_m128 ( _mm_setr_ps ( -432.0 , 6.0 , 7.0 , 8.0 ) , r) ;
3063+
3064+ let r = f ( a, -322223333 ) ;
3065+ assert_eq_m128 ( _mm_setr_ps ( -322223333.0 , 6.0 , 7.0 , 8.0 ) , r) ;
3066+ }
31013067 }
31023068
31033069 #[ simd_test( enable = "sse" ) ]
3104- fn test_mm_cvt_si2ss ( ) {
3105- let a = _mm_setr_ps ( 5.0 , 6.0 , 7.0 , 8.0 ) ;
3106-
3107- let r = _mm_cvt_si2ss ( a, 4555 ) ;
3108- let e = _mm_setr_ps ( 4555.0 , 6.0 , 7.0 , 8.0 ) ;
3109- assert_eq_m128 ( e, r) ;
3110-
3111- let r = _mm_cvt_si2ss ( a, 322223333 ) ;
3112- let e = _mm_setr_ps ( 322223333.0 , 6.0 , 7.0 , 8.0 ) ;
3113- assert_eq_m128 ( e, r) ;
3114-
3115- let r = _mm_cvt_si2ss ( a, -432 ) ;
3116- let e = _mm_setr_ps ( -432.0 , 6.0 , 7.0 , 8.0 ) ;
3117- assert_eq_m128 ( e, r) ;
3070+ fn test_mm_cvtsi32_ss ( ) {
3071+ test_mm_cvtsi32_ss_impl ( _mm_cvtsi32_ss) ;
3072+ }
31183073
3119- let r = _mm_cvt_si2ss ( a , - 322223333 ) ;
3120- let e = _mm_setr_ps ( - 322223333.0 , 6.0 , 7.0 , 8.0 ) ;
3121- assert_eq_m128 ( e , r ) ;
3074+ # [ simd_test ( enable = "sse" ) ]
3075+ fn test_mm_cvt_si2ss ( ) {
3076+ test_mm_cvtsi32_ss_impl ( _mm_cvt_si2ss ) ;
31223077 }
31233078
31243079 #[ simd_test( enable = "sse" ) ]
@@ -3133,27 +3088,25 @@ mod tests {
31333088 assert_eq_m128 ( r, _mm_setr_ps ( 4.25 , 0.0 , 0.0 , 0.0 ) ) ;
31343089 }
31353090
3091+ fn test_mm_set1_ps_impl ( f : fn ( f32 ) -> __m128 ) {
3092+ unsafe {
3093+ let r = f ( black_box ( 4.25 ) ) ;
3094+ assert_eq ! ( get_m128( r, 0 ) , 4.25 ) ;
3095+ assert_eq ! ( get_m128( r, 1 ) , 4.25 ) ;
3096+ assert_eq ! ( get_m128( r, 2 ) , 4.25 ) ;
3097+ assert_eq ! ( get_m128( r, 3 ) , 4.25 ) ;
3098+ }
3099+ }
3100+
31363101 #[ simd_test( enable = "sse" ) ]
3137- const fn test_mm_set1_ps ( ) {
3138- let r1 = _mm_set1_ps ( black_box ( 4.25 ) ) ;
3139- let r2 = _mm_set_ps1 ( black_box ( 4.25 ) ) ;
3140- assert_eq ! ( get_m128( r1, 0 ) , 4.25 ) ;
3141- assert_eq ! ( get_m128( r1, 1 ) , 4.25 ) ;
3142- assert_eq ! ( get_m128( r1, 2 ) , 4.25 ) ;
3143- assert_eq ! ( get_m128( r1, 3 ) , 4.25 ) ;
3144- assert_eq ! ( get_m128( r2, 0 ) , 4.25 ) ;
3145- assert_eq ! ( get_m128( r2, 1 ) , 4.25 ) ;
3146- assert_eq ! ( get_m128( r2, 2 ) , 4.25 ) ;
3147- assert_eq ! ( get_m128( r2, 3 ) , 4.25 ) ;
3102+ fn test_mm_set1_ps ( ) {
3103+ test_mm_set1_ps_impl ( _mm_set1_ps) ;
3104+ test_mm_set1_ps_impl ( _mm_set_ps1) ;
31483105 }
31493106
31503107 #[ simd_test( enable = "sse" ) ]
3151- const fn test_mm_set_ps1 ( ) {
3152- let r = _mm_set_ps1 ( black_box ( 4.25 ) ) ;
3153- assert_eq ! ( get_m128( r, 0 ) , 4.25 ) ;
3154- assert_eq ! ( get_m128( r, 1 ) , 4.25 ) ;
3155- assert_eq ! ( get_m128( r, 2 ) , 4.25 ) ;
3156- assert_eq ! ( get_m128( r, 3 ) , 4.25 ) ;
3108+ fn test_mm_set_ps1 ( ) {
3109+ test_mm_set1_ps_impl ( _mm_set_ps1) ;
31573110 }
31583111
31593112 #[ simd_test( enable = "sse" ) ]
@@ -3242,11 +3195,20 @@ mod tests {
32423195 assert_eq_m128 ( r, _mm_setr_ps ( 42.0 , 0.0 , 0.0 , 0.0 ) ) ;
32433196 }
32443197
3245- #[ simd_test( enable = "sse" ) ]
3246- const fn test_mm_load1_ps ( ) {
3198+ fn test_mm_load1_ps_impl ( f : unsafe fn ( * const f32 ) -> __m128 ) {
32473199 let a = 42.0f32 ;
3248- let r = unsafe { _mm_load1_ps ( ptr:: addr_of!( a) ) } ;
3249- assert_eq_m128 ( r, _mm_setr_ps ( 42.0 , 42.0 , 42.0 , 42.0 ) ) ;
3200+ let r = unsafe { f ( ptr:: addr_of!( a) ) } ;
3201+ unsafe { assert_eq_m128 ( r, _mm_setr_ps ( 42.0 , 42.0 , 42.0 , 42.0 ) ) } ;
3202+ }
3203+
3204+ #[ simd_test( enable = "sse" ) ]
3205+ fn test_mm_load1_ps ( ) {
3206+ test_mm_load1_ps_impl ( _mm_load1_ps) ;
3207+ }
3208+
3209+ #[ simd_test( enable = "sse" ) ]
3210+ fn test_mm_load_ps1 ( ) {
3211+ test_mm_load1_ps_impl ( _mm_load_ps1) ;
32503212 }
32513213
32523214 #[ simd_test( enable = "sse" ) ]
@@ -3298,34 +3260,24 @@ mod tests {
32983260 assert_eq ! ( vals[ 2 ] , 0.0 ) ;
32993261 }
33003262
3301- #[ simd_test( enable = "sse" ) ]
3302- const fn test_mm_store1_ps ( ) {
3263+ fn test_mm_store1_ps_impl ( f : unsafe fn ( * mut f32 , __m128 ) ) {
33033264 let mut vals = Memory { data : [ 0.0f32 ; 4 ] } ;
3304- let a = _mm_setr_ps ( 1.0 , 2.0 , 3.0 , 4.0 ) ;
3305-
3306- // guaranteed to be aligned to 16 bytes
3265+ let a = unsafe { _mm_setr_ps ( 1.0 , 2.0 , 3.0 , 4.0 ) } ;
33073266 let p = vals. data . as_mut_ptr ( ) ;
3308-
33093267 unsafe {
3310- _mm_store1_ps ( p, * black_box ( & a) ) ;
3268+ f ( p, * black_box ( & a) ) ;
33113269 }
3312-
33133270 assert_eq ! ( vals. data, [ 1.0 , 1.0 , 1.0 , 1.0 ] ) ;
33143271 }
33153272
33163273 #[ simd_test( enable = "sse" ) ]
3317- const fn test_mm_store_ps ( ) {
3318- let mut vals = Memory { data : [ 0.0f32 ; 4 ] } ;
3319- let a = _mm_setr_ps ( 1.0 , 2.0 , 3.0 , 4.0 ) ;
3320-
3321- // guaranteed to be aligned to 16 bytes
3322- let p = vals. data . as_mut_ptr ( ) ;
3323-
3324- unsafe {
3325- _mm_store_ps ( p, * black_box ( & a) ) ;
3326- }
3274+ fn test_mm_store1_ps ( ) {
3275+ test_mm_store1_ps_impl ( _mm_store1_ps) ;
3276+ }
33273277
3328- assert_eq ! ( vals. data, [ 1.0 , 2.0 , 3.0 , 4.0 ] ) ;
3278+ #[ simd_test( enable = "sse" ) ]
3279+ fn test_mm_store_ps1 ( ) {
3280+ test_mm_store1_ps_impl ( _mm_store_ps1) ;
33293281 }
33303282
33313283 #[ simd_test( enable = "sse" ) ]
@@ -3364,6 +3316,24 @@ mod tests {
33643316 assert_eq ! ( vals. data, [ 0.0 , 1.0 , 2.0 , 3.0 , 4.0 , 0.0 , 0.0 , 0.0 ] ) ;
33653317 }
33663318
3319+ #[ simd_test( enable = "sse" ) ]
3320+ fn test_mm_undefined_ps ( ) {
3321+ // _mm_undefined_ps returns a vector with indeterminate elements,
3322+ // so we can only verify it doesn't crash.
3323+ let _r = _mm_undefined_ps ( ) ;
3324+ }
3325+
3326+ #[ simd_test( enable = "sse" ) ]
3327+ fn test_mm_prefetch ( ) {
3328+ // Prefetch only affects cache behavior, not program correctness,
3329+ // so we can only verify it doesn't crash for each hint strategy.
3330+ let data = 42.0f32 ;
3331+ _mm_prefetch :: < _MM_HINT_T0 > ( ptr:: addr_of!( data) as * const i8 ) ;
3332+ _mm_prefetch :: < _MM_HINT_T1 > ( ptr:: addr_of!( data) as * const i8 ) ;
3333+ _mm_prefetch :: < _MM_HINT_T2 > ( ptr:: addr_of!( data) as * const i8 ) ;
3334+ _mm_prefetch :: < _MM_HINT_NTA > ( ptr:: addr_of!( data) as * const i8 ) ;
3335+ }
3336+
33673337 #[ simd_test( enable = "sse" ) ]
33683338 const fn test_mm_move_ss ( ) {
33693339 let a = _mm_setr_ps ( 1.0 , 2.0 , 3.0 , 4.0 ) ;
0 commit comments