1#include "avx512f-check.h"
2#include "args.h"
3
4struct IntegerRegisters iregs;
5struct FloatRegisters fregs;
6unsigned int num_iregs, num_fregs;
7
8union un1
9{
10  __m512 x;
11  float f;
12};
13
14union un2
15{
16  __m512 x;
17  double d;
18};
19
20union un3
21{
22  __m512 x;
23  __m128 v;
24};
25
26union un4
27{
28  __m512 x;
29  long double ld;
30};
31
32union un5
33{
34  __m512 x;
35  int i;
36};
37
38union un6
39{
40  __m512 x;
41  __m256 v;
42};
43
44
45void
46check_union_passing1(union un1 u1 ATTRIBUTE_UNUSED,
47		     union un1 u2 ATTRIBUTE_UNUSED,
48		     union un1 u3 ATTRIBUTE_UNUSED,
49		     union un1 u4 ATTRIBUTE_UNUSED,
50		     union un1 u5 ATTRIBUTE_UNUSED,
51		     union un1 u6 ATTRIBUTE_UNUSED,
52		     union un1 u7 ATTRIBUTE_UNUSED,
53		     union un1 u8 ATTRIBUTE_UNUSED)
54{
55  /* Check register contents.  */
56  check_m512_arguments;
57}
58
59void
60check_union_passing2(union un2 u1 ATTRIBUTE_UNUSED,
61		     union un2 u2 ATTRIBUTE_UNUSED,
62		     union un2 u3 ATTRIBUTE_UNUSED,
63		     union un2 u4 ATTRIBUTE_UNUSED,
64		     union un2 u5 ATTRIBUTE_UNUSED,
65		     union un2 u6 ATTRIBUTE_UNUSED,
66		     union un2 u7 ATTRIBUTE_UNUSED,
67		     union un2 u8 ATTRIBUTE_UNUSED)
68{
69  /* Check register contents.  */
70  check_m512_arguments;
71}
72
73void
74check_union_passing3(union un3 u1 ATTRIBUTE_UNUSED,
75		     union un3 u2 ATTRIBUTE_UNUSED,
76		     union un3 u3 ATTRIBUTE_UNUSED,
77		     union un3 u4 ATTRIBUTE_UNUSED,
78		     union un3 u5 ATTRIBUTE_UNUSED,
79		     union un3 u6 ATTRIBUTE_UNUSED,
80		     union un3 u7 ATTRIBUTE_UNUSED,
81		     union un3 u8 ATTRIBUTE_UNUSED)
82{
83  /* Check register contents.  */
84  check_m512_arguments;
85}
86
87void
88check_union_passing4(union un4 u ATTRIBUTE_UNUSED)
89{
90   /* Check the passing on the stack by comparing the address of the
91      stack elements to the expected place on the stack.  */
92  assert ((unsigned long)&u.x == rsp+8);
93  assert ((unsigned long)&u.ld == rsp+8);
94}
95
96void
97check_union_passing5(union un5 u ATTRIBUTE_UNUSED)
98{
99   /* Check the passing on the stack by comparing the address of the
100      stack elements to the expected place on the stack.  */
101  assert ((unsigned long)&u.x == rsp+8);
102  assert ((unsigned long)&u.i == rsp+8);
103}
104
105void
106check_union_passing6(union un6 u1 ATTRIBUTE_UNUSED,
107		     union un6 u2 ATTRIBUTE_UNUSED,
108		     union un6 u3 ATTRIBUTE_UNUSED,
109		     union un6 u4 ATTRIBUTE_UNUSED,
110		     union un6 u5 ATTRIBUTE_UNUSED,
111		     union un6 u6 ATTRIBUTE_UNUSED,
112		     union un6 u7 ATTRIBUTE_UNUSED,
113		     union un6 u8 ATTRIBUTE_UNUSED)
114{
115  /* Check register contents.  */
116  check_m512_arguments;
117}
118
119#define check_union_passing1 WRAP_CALL(check_union_passing1)
120#define check_union_passing2 WRAP_CALL(check_union_passing2)
121#define check_union_passing3 WRAP_CALL(check_union_passing3)
122#define check_union_passing4 WRAP_CALL(check_union_passing4)
123#define check_union_passing5 WRAP_CALL(check_union_passing5)
124#define check_union_passing6 WRAP_CALL(check_union_passing6)
125
126static void
127avx512f_test (void)
128{
129  union un1 u1[8];
130  union un2 u2[8];
131  union un3 u3[8];
132  union un4 u4;
133  union un5 u5;
134  union un6 u6[8];
135  int i;
136
137  for (i = 0; i < 8; i++)
138    u1[i].x = (__m512){32+i, 0, i, 0, -i, 0, i - 12, i + 8,
139		       32+i, 0, i, 0, -i, 0, i - 12, i + 8};
140
141  clear_struct_registers;
142  for (i = 0; i < 8; i++)
143    (&fregs.zmm0)[i]._m512[0] = u1[i].x;
144  num_fregs = 8;
145  check_union_passing1(u1[0], u1[1], u1[2], u1[3],
146		       u1[4], u1[5], u1[6], u1[7]);
147
148  clear_struct_registers;
149  for (i = 0; i < 8; i++)
150    {
151      u2[i].x = u1[i].x;
152      (&fregs.zmm0)[i]._m512[0] = u2[i].x;
153    }
154  num_fregs = 8;
155  check_union_passing2(u2[0], u2[1], u2[2], u2[3],
156		       u2[4], u2[5], u2[6], u2[7]);
157
158  clear_struct_registers;
159  for (i = 0; i < 8; i++)
160    {
161      u3[i].x = u1[i].x;
162      (&fregs.zmm0)[i]._m512[0] = u3[i].x;
163    }
164  num_fregs = 8;
165  check_union_passing3(u3[0], u3[1], u3[2], u3[3],
166		       u3[4], u3[5], u3[6], u3[7]);
167
168  check_union_passing4(u4);
169  check_union_passing5(u5);
170
171  clear_struct_registers;
172  for (i = 0; i < 8; i++)
173    {
174      u6[i].x = u1[i].x;
175      (&fregs.zmm0)[i]._m512[0] = u6[i].x;
176    }
177  num_fregs = 8;
178  check_union_passing6(u6[0], u6[1], u6[2], u6[3],
179		       u6[4], u6[5], u6[6], u6[7]);
180}
181