| /* { dg-do run } */ |
| /* { dg-options "-O2 -mavxvnni" } */ |
| /* { dg-require-effective-target avxvnni } */ |
| |
| #ifndef CHECK |
| #define CHECK "avx-check.h" |
| #endif |
| |
| #ifndef TEST |
| #define TEST avx_test |
| #endif |
| |
| #include CHECK |
| |
| static void |
| CALC (int *r, int *dst, short *s1, short *s2, int size) |
| { |
| short tempres[16]; |
| for (int i = 0; i < size; i++) { |
| tempres[i] = ((int)(s1[i]) * (int)(s2[i])); |
| } |
| for (int i = 0; i < size / 2; i++) { |
| long long test = (long long)dst[i] + tempres[i*2] + tempres[i*2 + 1]; |
| r[i] = test; |
| } |
| } |
| |
| void |
| TEST (void) |
| { |
| int i; |
| union256i_d res_256; |
| union256i_w src1_256, src2_256; |
| int res_ref_256[8]; |
| |
| if (!__builtin_cpu_supports ("avxvnni")) |
| return; |
| |
| for (i = 0; i < 16; i++) |
| { |
| src1_256.a[i] = 1 + i; |
| src2_256.a[i] = 2 + 2*i + i * i; |
| } |
| |
| for (i = 0; i < 8; i++) |
| res_256.a[i] = 0x7fffffff; |
| |
| CALC (res_ref_256, res_256.a, src1_256.a, src2_256.a, 16); |
| res_256.x = _mm256_dpwssd_avx_epi32 (res_256.x, src1_256.x, src2_256.x); |
| if (check_union256i_d (res_256, res_ref_256)) |
| abort (); |
| |
| union128i_d res_128; |
| union128i_w src1_128, src2_128; |
| int res_ref_128[4]; |
| |
| for (i = 0; i < 8; i++) |
| { |
| src1_128.a[i] = 1 + i; |
| src2_128.a[i] = 2 + 2*i + i * i; |
| } |
| |
| for (i = 0; i < 4; i++) |
| res_128.a[i] = 0x7fffffff; |
| |
| CALC (res_ref_128, res_128.a, src1_128.a, src2_128.a, 8); |
| res_128.x = _mm_dpwssd_avx_epi32 (res_128.x, src1_128.x, src2_128.x); |
| if (check_union128i_d (res_128, res_ref_128)) |
| abort (); |
| } |