Skip to content

Commit 27819eb

Browse files
tests
1 parent 2199b7f commit 27819eb

File tree

4 files changed

+158
-148
lines changed

4 files changed

+158
-148
lines changed

testable-simd-models/src/core_arch/x86/tests/avx.rs

Lines changed: 80 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,12 @@ use super::upstream;
33
use crate::abstractions::bitvec::BitVec;
44
use crate::helpers::test::HasRandom;
55

6+
macro_rules! assert_feq {
7+
($lhs:expr, $rhs:expr) => {
8+
assert!(($lhs.is_nan() && $rhs.is_nan()) || $lhs == $rhs)
9+
};
10+
}
11+
612
/// Derives tests for a given intrinsics. Test that a given intrinsics and its model compute the same thing over random values (1000 by default).
713
macro_rules! mk {
814
($([$N:literal])?$name:ident$({$(<$($c:literal),*>),*})?($($x:ident : $ty:ident),*)) => {
@@ -48,6 +54,19 @@ fn _mm256_movemask_ps() {
4854
}
4955
}
5056

57+
#[test]
58+
fn _mm256_movemask_pd() {
59+
let n = 1000;
60+
61+
for _ in 0..n {
62+
let a: BitVec<256> = BitVec::random();
63+
assert_eq!(
64+
super::super::models::avx::_mm256_movemask_pd(a.into()),
65+
unsafe { upstream::_mm256_movemask_pd(a.into()) }
66+
);
67+
}
68+
}
69+
5170
#[test]
5271
fn _mm256_testz_si256() {
5372
let n = 1000;
@@ -62,6 +81,59 @@ fn _mm256_testz_si256() {
6281
}
6382
}
6483

84+
#[test]
85+
fn _mm256_testc_si256() {
86+
let n = 1000;
87+
88+
for _ in 0..n {
89+
let a: BitVec<256> = BitVec::random();
90+
let b: BitVec<256> = BitVec::random();
91+
assert_eq!(
92+
super::super::models::avx::_mm256_testc_si256(a.into(), b.into()),
93+
unsafe { upstream::_mm256_testc_si256(a.into(), b.into()) }
94+
);
95+
}
96+
}
97+
98+
#[test]
99+
fn _mm256_cvtsd_f64() {
100+
let n = 1000;
101+
102+
for _ in 0..n {
103+
let a: BitVec<256> = BitVec::random();
104+
assert_feq!(
105+
super::super::models::avx::_mm256_cvtsd_f64(a.into()),
106+
unsafe { upstream::_mm256_cvtsd_f64(a.into()) }
107+
);
108+
}
109+
}
110+
111+
#[test]
112+
fn _mm256_cvtsi256_si32() {
113+
let n = 1000;
114+
115+
for _ in 0..n {
116+
let a: BitVec<256> = BitVec::random();
117+
assert_eq!(
118+
super::super::models::avx::_mm256_cvtsi256_si32(a.into()),
119+
unsafe { upstream::_mm256_cvtsi256_si32(a.into()) }
120+
);
121+
}
122+
}
123+
124+
#[test]
125+
fn _mm256_cvtss_f32() {
126+
let n = 1000;
127+
128+
for _ in 0..n {
129+
let a: BitVec<256> = BitVec::random();
130+
assert_feq!(
131+
super::super::models::avx::_mm256_cvtss_f32(a.into()),
132+
unsafe { upstream::_mm256_cvtss_f32(a.into()) }
133+
);
134+
}
135+
}
136+
65137
mk!(_mm256_setzero_ps());
66138
mk!(_mm256_setzero_si256());
67139
mk!(_mm256_set_epi8(
@@ -130,6 +202,14 @@ mk!(_mm256_set_epi64x(a: i64, b: i64, c: i64, d: i64));
130202
mk!(_mm256_set1_epi8(a: i8));
131203
mk!(_mm256_set1_epi16(a: i16));
132204
mk!(_mm256_set1_epi32(a: i32));
205+
mk!(_mm256_set1_epi64x(a: i64));
206+
mk!(_mm256_set_pd(a: f64, b: f64, c: f64, d: f64));
207+
mk!(_mm256_set_ps(a: f32, b: f32, c: f32, d: f32, e: f32, f: f32, g: f32, h: f32));
208+
mk!(_mm256_setr_pd(a: f64, b: f64, c: f64, d: f64));
209+
mk!(_mm256_setr_ps(a: f32, b: f32, c: f32, d: f32, e: f32, f: f32, g: f32, h: f32));
210+
mk!(_mm256_setr_epi64x(a: i64, b: i64, c: i64, d: i64));
211+
mk!(_mm256_set1_pd(a: f64));
212+
mk!(_mm256_set1_ps(a: f32));
133213

134214
mk!(_mm256_and_pd(a: __m256d, b: __m256d));
135215
mk!(_mm256_and_ps(a: __m256, b: __m256));
@@ -138,44 +218,20 @@ mk!(_mm256_or_ps(a: __m256, b: __m256));
138218
mk!(_mm256_andnot_pd(a: __m256d, b: __m256d));
139219
mk!(_mm256_andnot_ps(a: __m256, b: __m256));
140220
mk!(_mm256_blendv_pd(a: __m256d, b: __m256d, c: __m256d));
141-
mk!(_mm256_blendv_ps(a: __m256, b: __m256, c: __m256));
142221
mk!(_mm256_xor_pd(a: __m256d, b: __m256d));
143222
mk!(_mm256_xor_ps(a: __m256, b: __m256));
144223
mk!(_mm256_cvtepi32_pd(a: __m128i));
145224
mk!(_mm256_cvtepi32_ps(a: __m256i));
146225
mk!(_mm256_cvtpd_ps(a: __m256d));
147226
mk!(_mm256_cvtps_pd(a: __m128));
148-
mk!(_mm256_cvtsd_f64(a: __m256d));
149-
mk!(_mm256_cvtsi256_si32(a: __m256i));
150-
mk!(_mm256_broadcast_ss(f: &f32));
151-
mk!(_mm256_broadcast_ps(a: &__m128));
152-
mk!(_mm256_broadcast_pd(a: &__m128d));
153227
mk!(_mm256_movehdup_ps(a: __m256));
154228
mk!(_mm256_moveldup_ps(a: __m256));
155229
mk!(_mm256_movedup_pd(a: __m256d));
156230
mk!(_mm256_unpackhi_pd(a: __m256d, b: __m256d));
157231
mk!(_mm256_unpackhi_ps(a: __m256, b: __m256));
158232
mk!(_mm256_unpacklo_pd(a: __m256d, b: __m256d));
159233
mk!(_mm256_unpacklo_ps(a: __m256, b: __m256));
160-
mk!(_mm256_testz_si256(a: __m256i, b: __m256i));
161-
mk!(_mm256_testc_si256(a: __m256i, b: __m256i));
162-
mk!(_mm256_movemask_pd(a: __m256d));
163-
mk!(_mm256_movemask_ps(a: __m256));
164234
mk!(_mm256_setzero_pd());
165-
mk!(_mm256_setzero_ps());
166-
mk!(_mm256_setzero_si256());
167-
mk!(_mm256_set_pd(a: f64, b: f64, c: f64, d: f64));
168-
mk!(_mm256_set_ps(a: f32, b: f32, c: f32, d: f32, e: f32, f: f32, g: f32, h: f32));
169-
mk!(_mm256_set_epi64x(a: i64, b: i64, c: i64, d: i64));
170-
mk!(_mm256_setr_pd(a: f64, b: f64, c: f64, d: f64));
171-
mk!(_mm256_setr_ps(a: f32, b: f32, c: f32, d: f32, e: f32, f: f32, g: f32, h: f32));
172-
mk!(_mm256_setr_epi64x(a: i64, b: i64, c: i64, d: i64));
173-
mk!(_mm256_set1_pd(a: f64));
174-
mk!(_mm256_set1_ps(a: f32));
175-
mk!(_mm256_set1_epi8(a: i8));
176-
mk!(_mm256_set1_epi16(a: i16));
177-
mk!(_mm256_set1_epi32(a: i32));
178-
mk!(_mm256_set1_epi64x(a: i64));
179235
mk!(_mm256_castpd_ps(a: __m256d));
180236
mk!(_mm256_castps_pd(a: __m256));
181237
mk!(_mm256_castps_si256(a: __m256));
@@ -200,4 +256,3 @@ mk!(_mm256_set_m128i(hi: __m128i, lo: __m128i));
200256
mk!(_mm256_setr_m128(lo: __m128, hi: __m128));
201257
mk!(_mm256_setr_m128d(lo: __m128d, hi: __m128d));
202258
mk!(_mm256_setr_m128i(lo: __m128i, hi: __m128i));
203-
mk!(_mm256_cvtss_f32(a: __m256));

testable-simd-models/src/core_arch/x86/tests/avx2.rs

Lines changed: 2 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1+
use super::types::*;
12
use super::upstream;
23
use crate::abstractions::bitvec::BitVec;
34
use crate::helpers::test::HasRandom;
4-
use super::types::*;
55

66
/// Derives tests for a given intrinsics. Test that a given intrinsics and its model compute the same thing over random values (1000 by default).
77
macro_rules! mk {
@@ -81,7 +81,6 @@ mk!(_mm256_cvtepu8_epi64(a: BitVec));
8181
mk!(_mm256_extracti128_si256{<0>,<1>}(a: BitVec));
8282
mk!(_mm256_hadd_epi16(a: BitVec, b: BitVec));
8383
mk!(_mm256_hadd_epi32(a: BitVec, b: BitVec));
84-
mk!(_mm256_hadds_epi16(a: BitVec, b: BitVec));
8584
mk!(_mm256_hsub_epi16(a: BitVec, b: BitVec));
8685
mk!(_mm256_hsub_epi32(a: BitVec, b: BitVec));
8786
mk!(_mm256_hsubs_epi16(a: BitVec, b: BitVec));
@@ -183,6 +182,7 @@ mk!(_mm256_unpacklo_epi32(a: BitVec, b: BitVec));
183182
mk!(_mm256_unpackhi_epi64(a: BitVec, b: BitVec));
184183
mk!(_mm256_unpacklo_epi64(a: BitVec, b: BitVec));
185184
mk!(_mm256_xor_si256(a: BitVec, b: BitVec));
185+
186186
#[test]
187187
fn _mm256_extract_epi8() {
188188
let n = 100;
@@ -531,127 +531,11 @@ fn _mm256_extract_epi16() {
531531
}
532532
}
533533

534-
mk!(_mm256_abs_epi32(a: __m256i));
535-
mk!(_mm256_abs_epi16(a: __m256i));
536-
mk!(_mm256_abs_epi8(a: __m256i));
537-
mk!(_mm256_add_epi64(a: __m256i, b: __m256i));
538-
mk!(_mm256_add_epi32(a: __m256i, b: __m256i));
539-
mk!(_mm256_add_epi16(a: __m256i, b: __m256i));
540-
mk!(_mm256_add_epi8(a: __m256i, b: __m256i));
541-
mk!(_mm256_adds_epi8(a: __m256i, b: __m256i));
542-
mk!(_mm256_adds_epi16(a: __m256i, b: __m256i));
543-
mk!(_mm256_adds_epu8(a: __m256i, b: __m256i));
544-
mk!(_mm256_adds_epu16(a: __m256i, b: __m256i));
545534
mk!(_mm256_and_si256(a: __m256i, b: __m256i));
546535
mk!(_mm256_andnot_si256(a: __m256i, b: __m256i));
547536
mk!(_mm256_avg_epu16(a: __m256i, b: __m256i));
548537
mk!(_mm256_avg_epu8(a: __m256i, b: __m256i));
549-
mk!(_mm256_blendv_epi8(a: __m256i, b: __m256i, mask: __m256i));
550-
mk!(_mm_broadcastb_epi8(a: __m128i));
551-
mk!(_mm256_broadcastb_epi8(a: __m128i));
552-
mk!(_mm_broadcastd_epi32(a: __m128i));
553-
mk!(_mm256_broadcastd_epi32(a: __m128i));
554-
mk!(_mm_broadcastq_epi64(a: __m128i));
555-
mk!(_mm256_broadcastq_epi64(a: __m128i));
556538
mk!(_mm_broadcastsd_pd(a: __m128d));
557539
mk!(_mm256_broadcastsd_pd(a: __m128d));
558-
mk!(_mm_broadcastsi128_si256(a: __m128i));
559-
mk!(_mm256_broadcastsi128_si256(a: __m128i));
560540
mk!(_mm_broadcastss_ps(a: __m128));
561541
mk!(_mm256_broadcastss_ps(a: __m128));
562-
mk!(_mm_broadcastw_epi16(a: __m128i));
563-
mk!(_mm256_broadcastw_epi16(a: __m128i));
564-
mk!(_mm256_cmpeq_epi64(a: __m256i, b: __m256i));
565-
mk!(_mm256_cmpeq_epi32(a: __m256i, b: __m256i));
566-
mk!(_mm256_cmpeq_epi16(a: __m256i, b: __m256i));
567-
mk!(_mm256_cmpeq_epi8(a: __m256i, b: __m256i));
568-
mk!(_mm256_cmpgt_epi64(a: __m256i, b: __m256i));
569-
mk!(_mm256_cmpgt_epi32(a: __m256i, b: __m256i));
570-
mk!(_mm256_cmpgt_epi16(a: __m256i, b: __m256i));
571-
mk!(_mm256_cmpgt_epi8(a: __m256i, b: __m256i));
572-
mk!(_mm256_cvtepi16_epi32(a: __m128i));
573-
mk!(_mm256_cvtepi16_epi64(a: __m128i));
574-
mk!(_mm256_cvtepi32_epi64(a: __m128i));
575-
mk!(_mm256_cvtepi8_epi16(a: __m128i));
576-
mk!(_mm256_cvtepi8_epi32(a: __m128i));
577-
mk!(_mm256_cvtepi8_epi64(a: __m128i));
578-
mk!(_mm256_cvtepu16_epi32(a: __m128i));
579-
mk!(_mm256_cvtepu16_epi64(a: __m128i));
580-
mk!(_mm256_cvtepu32_epi64(a: __m128i));
581-
mk!(_mm256_cvtepu8_epi16(a: __m128i));
582-
mk!(_mm256_cvtepu8_epi32(a: __m128i));
583-
mk!(_mm256_cvtepu8_epi64(a: __m128i));
584-
mk!(_mm256_hadd_epi16(a: __m256i, b: __m256i));
585-
mk!(_mm256_hadd_epi32(a: __m256i, b: __m256i));
586-
mk!(_mm256_hadds_epi16(a: __m256i, b: __m256i));
587-
mk!(_mm256_hsub_epi16(a: __m256i, b: __m256i));
588-
mk!(_mm256_hsub_epi32(a: __m256i, b: __m256i));
589-
mk!(_mm256_hsubs_epi16(a: __m256i, b: __m256i));
590-
mk!(_mm256_madd_epi16(a: __m256i, b: __m256i));
591-
mk!(_mm256_maddubs_epi16(a: __m256i, b: __m256i));
592-
mk!(_mm256_max_epi16(a: __m256i, b: __m256i));
593-
mk!(_mm256_max_epi32(a: __m256i, b: __m256i));
594-
mk!(_mm256_max_epi8(a: __m256i, b: __m256i));
595-
mk!(_mm256_max_epu16(a: __m256i, b: __m256i));
596-
mk!(_mm256_max_epu32(a: __m256i, b: __m256i));
597-
mk!(_mm256_max_epu8(a: __m256i, b: __m256i));
598-
mk!(_mm256_min_epi16(a: __m256i, b: __m256i));
599-
mk!(_mm256_min_epi32(a: __m256i, b: __m256i));
600-
mk!(_mm256_min_epi8(a: __m256i, b: __m256i));
601-
mk!(_mm256_min_epu16(a: __m256i, b: __m256i));
602-
mk!(_mm256_min_epu32(a: __m256i, b: __m256i));
603-
mk!(_mm256_min_epu8(a: __m256i, b: __m256i));
604-
mk!(_mm256_movemask_epi8(a: __m256i));
605-
mk!(_mm256_mul_epi32(a: __m256i, b: __m256i));
606-
mk!(_mm256_mul_epu32(a: __m256i, b: __m256i));
607-
mk!(_mm256_mulhi_epi16(a: __m256i, b: __m256i));
608-
mk!(_mm256_mulhi_epu16(a: __m256i, b: __m256i));
609-
mk!(_mm256_mullo_epi16(a: __m256i, b: __m256i));
610-
mk!(_mm256_mullo_epi32(a: __m256i, b: __m256i));
611-
mk!(_mm256_mulhrs_epi16(a: __m256i, b: __m256i));
612-
mk!(_mm256_or_si256(a: __m256i, b: __m256i));
613-
mk!(_mm256_packs_epi16(a: __m256i, b: __m256i));
614-
mk!(_mm256_packs_epi32(a: __m256i, b: __m256i));
615-
mk!(_mm256_packus_epi16(a: __m256i, b: __m256i));
616-
mk!(_mm256_packus_epi32(a: __m256i, b: __m256i));
617-
mk!(_mm256_permutevar8x32_epi32(a: __m256i, b: __m256i));
618-
mk!(_mm256_sad_epu8(a: __m256i, b: __m256i));
619-
mk!(_mm256_shuffle_epi8(a: __m256i, b: __m256i));
620-
mk!(_mm256_sign_epi16(a: __m256i, b: __m256i));
621-
mk!(_mm256_sign_epi32(a: __m256i, b: __m256i));
622-
mk!(_mm256_sign_epi8(a: __m256i, b: __m256i));
623-
mk!(_mm256_sll_epi16(a: __m256i, count: __m128i));
624-
mk!(_mm256_sll_epi32(a: __m256i, count: __m128i));
625-
mk!(_mm256_sll_epi64(a: __m256i, count: __m128i));
626-
mk!(_mm_sllv_epi32(a: __m128i, count: __m128i));
627-
mk!(_mm256_sllv_epi32(a: __m256i, count: __m256i));
628-
mk!(_mm_sllv_epi64(a: __m128i, count: __m128i));
629-
mk!(_mm256_sllv_epi64(a: __m256i, count: __m256i));
630-
mk!(_mm256_sra_epi16(a: __m256i, count: __m128i));
631-
mk!(_mm256_sra_epi32(a: __m256i, count: __m128i));
632-
mk!(_mm_srav_epi32(a: __m128i, count: __m128i));
633-
mk!(_mm256_srav_epi32(a: __m256i, count: __m256i));
634-
mk!(_mm256_srl_epi16(a: __m256i, count: __m128i));
635-
mk!(_mm256_srl_epi32(a: __m256i, count: __m128i));
636-
mk!(_mm256_srl_epi64(a: __m256i, count: __m128i));
637-
mk!(_mm_srlv_epi32(a: __m128i, count: __m128i));
638-
mk!(_mm256_srlv_epi32(a: __m256i, count: __m256i));
639-
mk!(_mm_srlv_epi64(a: __m128i, count: __m128i));
640-
mk!(_mm256_srlv_epi64(a: __m256i, count: __m256i));
641-
mk!(_mm256_sub_epi16(a: __m256i, b: __m256i));
642-
mk!(_mm256_sub_epi32(a: __m256i, b: __m256i));
643-
mk!(_mm256_sub_epi64(a: __m256i, b: __m256i));
644-
mk!(_mm256_sub_epi8(a: __m256i, b: __m256i));
645-
mk!(_mm256_subs_epi16(a: __m256i, b: __m256i));
646-
mk!(_mm256_subs_epi8(a: __m256i, b: __m256i));
647-
mk!(_mm256_subs_epu16(a: __m256i, b: __m256i));
648-
mk!(_mm256_subs_epu8(a: __m256i, b: __m256i));
649-
mk!(_mm256_unpackhi_epi8(a: __m256i, b: __m256i));
650-
mk!(_mm256_unpacklo_epi8(a: __m256i, b: __m256i));
651-
mk!(_mm256_unpackhi_epi16(a: __m256i, b: __m256i));
652-
mk!(_mm256_unpacklo_epi16(a: __m256i, b: __m256i));
653-
mk!(_mm256_unpackhi_epi32(a: __m256i, b: __m256i));
654-
mk!(_mm256_unpacklo_epi32(a: __m256i, b: __m256i));
655-
mk!(_mm256_unpackhi_epi64(a: __m256i, b: __m256i));
656-
mk!(_mm256_unpacklo_epi64(a: __m256i, b: __m256i));
657-
mk!(_mm256_xor_si256(a: __m256i, b: __m256i));

0 commit comments

Comments
 (0)