2 /* { dg-options "-mavx2 -O2" } */
3 /* { dg-require-effective-target avx2 } */
5 #include "avx2-check.h"
6 #include "ssse3-vals.h"
9 signed_saturate_to_word (int x
)
14 if (x
< (int) 0xffff8000)
21 compute_pmaddubsw256 (short *i1
, short *i2
, short *r
)
23 unsigned char *ub1
= (unsigned char *) i1
;
24 char *sb2
= (char *) i2
;
25 short *sout
= (short *) r
;
29 for (i
= 0; i
< 16; i
++)
31 t0
= ((int) ub1
[2 * i
] * (int) sb2
[2 * i
] +
32 (int) ub1
[2 * i
+ 1] * (int) sb2
[2 * i
+ 1]);
33 sout
[i
] = signed_saturate_to_word (t0
);
40 union256i_w s1
, s2
, res
;
45 for (i
= 0; i
< 256; i
+= 16)
47 s1
.x
= _mm256_loadu_si256 ((__m256i
*) & vals
[i
]);
48 s2
.x
= _mm256_loadu_si256 ((__m256i
*) & vals
[i
+ 8]);
50 res
.x
= _mm256_maddubs_epi16 (s1
.x
, s2
.x
);
52 compute_pmaddubsw256 (s1
.a
, s2
.a
, res_ref
);
54 fail
+= check_union256i_w (res
, res_ref
);