1 /* { dg-do run { target avx512fp16 } } */
2 /* { dg-options "-O2 -mavx512fp16" } */
3 
4 #include <string.h>
5 
6 static void do_test (void);
7 
8 #define DO_TEST do_test
9 #define AVX512FP16
10 #include "avx512-check.h"
11 
12 __m128h
13 __attribute__ ((noinline, noclone))
foo1(_Float16 x)14 foo1 (_Float16 x)
15 {
16   return __extension__ (__m128h)(__v8hf) { x, 0.0f, 0.0f, 0.0f,
17                                            1.0f, 0.0f, 0.0f, 0.0f };
18 }
19 
20 __m128h
21 __attribute__ ((noinline, noclone))
foo2(_Float16 x,_Float16 y)22 foo2 (_Float16 x, _Float16 y)
23 {
24   return __extension__ (__m128h)(__v8hf) { x, 0.0f, 0.0f, y,
25                                            3.0f, 0.0f, 0.0f, 0.0f };
26 }
27 
28 __m256h
29 __attribute__ ((noinline, noclone))
foo3(_Float16 x)30 foo3 (_Float16 x)
31 {
32   return __extension__ (__m256h)(__v16hf) { x, 0.0f, 0.0f, 0.0f,
33                                             0.0f, 0.0f, 0.0f, 0.0f,
34                                             1.0f, 0.0f, 0.0f, 0.0f,
35                                             0.0f, 0.0f, 0.0f, 0.0f };
36 }
37 
38 __m256h
39 __attribute__ ((noinline, noclone))
foo4(_Float16 x,_Float16 y)40 foo4 (_Float16 x, _Float16 y)
41 {
42   return __extension__ (__m256h)(__v16hf) { x, 0.0f, 0.0f, 0.0f,
43                                             0.0f, 0.0f, 0.0f, y,
44                                             3.0f, 0.0f, 0.0f, 0.0f,
45                                             0.0f, 0.0f, 0.0f, 0.0f };
46 }
47 
48 __m512h
49 __attribute__ ((noinline, noclone))
foo5(_Float16 x)50 foo5 (_Float16 x)
51 {
52   return __extension__ (__m512h)(__v32hf) { x, 0.0f, 0.0f, 0.0f,
53                                             0.0f, 0.0f, 0.0f, 0.0f,
54                                             0.0f, 0.0f, 0.0f, 0.0f,
55                                             0.0f, 0.0f, 0.0f, 0.0f,
56                                             1.0f, 0.0f, 0.0f, 0.0f,
57                                             0.0f, 0.0f, 0.0f, 0.0f,
58                                             0.0f, 0.0f, 0.0f, 0.0f,
59                                             0.0f, 0.0f, 0.0f, 0.0f };
60 }
61 
62 __m512h
63 __attribute__ ((noinline, noclone))
foo6(_Float16 x,_Float16 y)64 foo6 (_Float16 x, _Float16 y)
65 {
66   return __extension__ (__m512h)(__v32hf) { x, 0.0f, 0.0f, 0.0f,
67                                             0.0f, 0.0f, 0.0f, 0.0f,
68                                             0.0f, 0.0f, 0.0f, 0.0f,
69                                             0.0f, 0.0f, 0.0f, y,
70                                             3.0f, 0.0f, 0.0f, 0.0f,
71                                             0.0f, 0.0f, 0.0f, 0.0f,
72                                             0.0f, 0.0f, 0.0f, 0.0f,
73                                             0.0f, 0.0f, 0.0f, 0.0f };
74 }
75 
76 static void
do_test(void)77 do_test (void)
78 {
79   _Float16 x = 25.3;
80   _Float16 y = -35.7;
81   union128h u128 = { x, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f };
82   union256h u256 = { x, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
83 		     1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
84   union512h u512 = { x, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
85 		     0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
86 		     1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
87 		     0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
88   __m128h v128;
89   __m256h v256;
90   __m512h v512;
91   union128h a128;
92   union256h a256;
93   union512h a512;
94 
95   memset (&v128, -1, sizeof (v128));
96   v128 = foo1 (x);
97   a128.x = v128;
98   if (check_union128h (a128, u128.a))
99     abort ();
100   memset (&v128, -1, sizeof (v128));
101   u128.a[3] = y;
102   u128.a[4] = 3.0f;
103   v128 = foo2 (x, y);
104   a128.x = v128;
105   if (check_union128h (a128, u128.a))
106     abort ();
107 
108   memset (&v256, -1, sizeof (v256));
109   v256 = foo3 (x);
110   a256.x = v256;
111   if (check_union256h (a256, u256.a))
112     abort ();
113   memset (&v256, -1, sizeof (v256));
114   u256.a[7] = y;
115   u256.a[8] = 3.0f;
116   v256 = foo4 (x, y);
117   a256.x = v256;
118   if (check_union256h (a256, u256.a))
119     abort ();
120 
121   memset (&v512, -1, sizeof (v512));
122   v512 = foo5 (x);
123   a512.x = v512;
124   if (check_union512h (a512, u512.a))
125     abort ();
126   memset (&v512, -1, sizeof (v512));
127   u512.a[15] = y;
128   u512.a[16] = 3.0f;
129   v512 = foo6 (x, y);
130   a512.x = v512;
131   if (check_union512h (a512, u512.a))
132     abort ();
133 }
134