Merge from trunk
[official-gcc.git] / gcc / testsuite / gcc.target / x86_64 / abi / avx512f / test_passing_unions.c
blob370d15b6273b101ac60fef23244e97fd56f77d7b
1 #include "avx512f-check.h"
2 #include "args.h"
4 struct IntegerRegisters iregs;
5 struct FloatRegisters fregs;
6 unsigned int num_iregs, num_fregs;
8 union un1
10 __m512 x;
11 float f;
14 union un2
16 __m512 x;
17 double d;
20 union un3
22 __m512 x;
23 __m128 v;
26 union un4
28 __m512 x;
29 long double ld;
32 union un5
34 __m512 x;
35 int i;
38 union un6
40 __m512 x;
41 __m256 v;
45 void
46 check_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)
55 /* Check register contents. */
56 check_m512_arguments;
59 void
60 check_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)
69 /* Check register contents. */
70 check_m512_arguments;
73 void
74 check_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)
83 /* Check register contents. */
84 check_m512_arguments;
87 void
88 check_union_passing4(union un4 u ATTRIBUTE_UNUSED)
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);
96 void
97 check_union_passing5(union un5 u ATTRIBUTE_UNUSED)
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);
105 void
106 check_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)
115 /* Check register contents. */
116 check_m512_arguments;
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)
126 static void
127 avx512f_test (void)
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;
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};
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]);
148 clear_struct_registers;
149 for (i = 0; i < 8; i++)
151 u2[i].x = u1[i].x;
152 (&fregs.zmm0)[i]._m512[0] = u2[i].x;
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]);
158 clear_struct_registers;
159 for (i = 0; i < 8; i++)
161 u3[i].x = u1[i].x;
162 (&fregs.zmm0)[i]._m512[0] = u3[i].x;
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]);
168 check_union_passing4(u4);
169 check_union_passing5(u5);
171 clear_struct_registers;
172 for (i = 0; i < 8; i++)
174 u6[i].x = u1[i].x;
175 (&fregs.zmm0)[i]._m512[0] = u6[i].x;
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]);