PR inline-asm/84742
[official-gcc.git] / gcc / testsuite / gcc.target / i386 / avx512f-inline-asm.c
blob2557eab644be105e8f97515ce8e71897148f314d
1 /* { dg-do run } */
2 /* { dg-options "-mavx512f -O2" } */
3 /* { dg-require-effective-target avx512f } */
5 #include "avx512f-check.h"
7 static void
8 init_vpadd_mask (int* dst, int *src1, int *src2, int seed)
10 int i;
12 for (i = 0; i < 16; i++)
14 dst[i] = -1;
15 src1[i] = seed * 2 * i + 1;
16 src2[i] = seed * 2 * i;
20 static inline void
21 calc_vpadd_mask_zeroed (int *dst, __mmask16 m, int *src1, int *src2)
23 int i;
25 for (i = 0; i < 16; i++)
27 if (m & (1 << i))
28 dst[i] = src1[i] + src2[i];
29 else
30 dst[i] = 0;
34 void static
35 avx512f_test (void)
37 /* Checking mask arithmetic instruction */
39 __mmask16 msk_dst, msk_src1, msk_src2, msk_dst_ref;
41 msk_src1 = 0x0FFB;
42 msk_src2 = 0x0F0F;
44 asm ("kandw\t%2, %1, %0"
45 : "=k" (msk_dst)
46 : "k" (msk_src1), "k" (msk_src2));
48 msk_dst_ref = _mm512_kand (msk_src1, msk_src2);
49 if (msk_dst != msk_dst_ref)
50 abort ();
53 /* Checking zero-masked vector instruction */
54 union512i_d dst, src1, src2;
55 int dst_ref[16];
57 init_vpadd_mask (dst.a, src1.a, src2.a, 1);
58 init_vpadd_mask (dst_ref, src1.a, src2.a, 1);
60 asm ("vpaddd\t%2, %1, %0 %{%3%}%{z%}"
61 : "=x" (dst.x)
62 : "x" (src1.x), "x" (src2.x), "Yk" (msk_dst));
64 calc_vpadd_mask_zeroed (dst_ref, msk_dst, src1.a, src2.a);
66 if (check_union512i_d (dst, dst_ref))
67 abort ();