Skip to content

Commit b397dac

Browse files
committed
Refactor alias tests using meta function pattern and add missing tests for _mm_undefined_ps, _mm_prefetch, _mm_load_ps1, _mm_store_ps1
1 parent de85b1c commit b397dac

2 files changed

Lines changed: 94 additions & 129 deletions

File tree

crates/core_arch/src/x86/sse.rs

Lines changed: 93 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -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);

crates/stdarch-verify/tests/x86-intel.rs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -209,12 +209,9 @@ fn verify_all_signatures() {
209209
"_rdseed16_step",
210210
"_rdseed32_step",
211211
"_rdseed64_step",
212-
// Prefetch
213-
"_mm_prefetch",
214212
// CMPXCHG
215213
"cmpxchg16b",
216-
// Undefined
217-
"_mm_undefined_ps",
214+
// Undefined,
218215
"_mm_undefined_pd",
219216
"_mm_undefined_si128",
220217
"_mm_undefined_ph",
@@ -250,8 +247,6 @@ fn verify_all_signatures() {
250247
"_mm_cvtt_ss2si",
251248
"_mm_cvt_si2ss",
252249
"_mm_set_ps1",
253-
"_mm_load_ps1",
254-
"_mm_store_ps1",
255250
"_mm_bslli_si128",
256251
"_mm_bsrli_si128",
257252
"_bextr2_u32",

0 commit comments

Comments
 (0)