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