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