1 /* { dg-do run } */
2 /* { dg-options "-O2 -mavx512f" } */
3 /* { dg-require-effective-target avx512f } */
4 
5 #include "avx512f-check.h"
6 
7 #include "avx512f-helper.h"
8 
9 #define SIZE (128 / 64)
10 #include "avx512f-mask-type.h"
11 
12 void
avx512f_test(void)13 avx512f_test (void)
14 {
15   int i, sign;
16   union128d res1, res2, res3, res4, src1, src2, src3;
17   volatile __mmask8 mask = 5;
18   double val[2] = { 35.5, 0.0 };
19   double *volatile p = &val[0];
20   double res_ref[SIZE];
21   double zero[SIZE];
22 
23   for (i = 0; i < SIZE; i++)
24     {
25       src1.a[i] = 1.5 + i;
26       src2.a[i] = 7.5 + i;
27       src3.a[i] = 4.5 + i;
28       zero[i] = 0.0;
29     }
30 
31   res1.x = _mm_mask_load_sd (src1.x, mask, p);
32   res2.x = _mm_maskz_load_sd (mask, p);
33 
34   __builtin_memcpy (res_ref, zero, sizeof (zero));
35   res_ref[0] = val[0];
36   if (check_union128d (res1, res_ref))
37     abort ();
38 
39   if (check_union128d (res2, res_ref))
40     abort ();
41 
42   res3.x = _mm_mask_move_sd (src1.x, mask, src2.x, src3.x);
43   res4.x = _mm_maskz_move_sd (mask, src2.x, src3.x);
44 
45   __builtin_memcpy (res_ref, src2.a, sizeof (src2.a));
46   res_ref[0] = src3.a[0];
47   if (check_union128d (res3, res_ref))
48     abort ();
49 
50   if (check_union128d (res4, res_ref))
51     abort ();
52 
53   _mm_mask_store_sd (p + 1, mask, src1.x);
54   if (val[1] != src1.a[0])
55     abort ();
56 
57   mask ^= 1;
58 
59   res1.x = _mm_mask_load_sd (src1.x, mask, p);
60   res2.x = _mm_maskz_load_sd (mask, p);
61 
62   __builtin_memcpy (res_ref, zero, sizeof (zero));
63   res_ref[0] = src1.a[0];
64   if (check_union128d (res1, res_ref))
65     abort ();
66 
67   res_ref[0] = zero[0];
68   if (check_union128d (res2, res_ref))
69     abort ();
70 
71   res3.x = _mm_mask_move_sd (src1.x, mask, src2.x, src3.x);
72   res4.x = _mm_maskz_move_sd (mask, src2.x, src3.x);
73 
74   __builtin_memcpy (res_ref, src2.a, sizeof (src2.a));
75   res_ref[0] = src1.a[0];
76   if (check_union128d (res3, res_ref))
77     abort ();
78 
79   res_ref[0] = zero[0];
80   if (check_union128d (res4, res_ref))
81     abort ();
82 
83   val[1] = 42.0;
84   _mm_mask_store_sd (p + 1, mask, src1.x);
85   if (val[1] != 42.0)
86     abort ();
87 }
88