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 / 32)
10 #include "avx512f-mask-type.h"
11
12 void
avx512f_test(void)13 avx512f_test (void)
14 {
15 int i, sign;
16 union128 res1, res2, res3, res4, src1, src2, src3;
17 volatile __mmask8 mask = 5;
18 float val[2] = { 35.5f, 0.0f };
19 float *volatile p = &val[0];
20 float res_ref[SIZE];
21 float zero[SIZE];
22
23 for (i = 0; i < SIZE; i++)
24 {
25 src1.a[i] = 1.5f + i;
26 src2.a[i] = 7.5f + i;
27 src3.a[i] = 4.5f + i;
28 zero[i] = 0.0f;
29 }
30
31 res1.x = _mm_mask_load_ss (src1.x, mask, p);
32 res2.x = _mm_maskz_load_ss (mask, p);
33
34 __builtin_memcpy (res_ref, zero, sizeof (zero));
35 res_ref[0] = val[0];
36 if (check_union128 (res1, res_ref))
37 abort ();
38
39 if (check_union128 (res2, res_ref))
40 abort ();
41
42 res3.x = _mm_mask_move_ss (src1.x, mask, src2.x, src3.x);
43 res4.x = _mm_maskz_move_ss (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_union128 (res3, res_ref))
48 abort ();
49
50 if (check_union128 (res4, res_ref))
51 abort ();
52
53 _mm_mask_store_ss (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_ss (src1.x, mask, p);
60 res2.x = _mm_maskz_load_ss (mask, p);
61
62 __builtin_memcpy (res_ref, zero, sizeof (zero));
63 res_ref[0] = src1.a[0];
64 if (check_union128 (res1, res_ref))
65 abort ();
66
67 res_ref[0] = zero[0];
68 if (check_union128 (res2, res_ref))
69 abort ();
70
71 res3.x = _mm_mask_move_ss (src1.x, mask, src2.x, src3.x);
72 res4.x = _mm_maskz_move_ss (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_union128 (res3, res_ref))
77 abort ();
78
79 res_ref[0] = zero[0];
80 if (check_union128 (res4, res_ref))
81 abort ();
82
83 val[1] = 42.0f;
84 _mm_mask_store_ss (p + 1, mask, src1.x);
85 if (val[1] != 42.0f)
86 abort ();
87 }
88