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