7 return SELFTEST_CPU_FLAG_AARCH64;
86 typedef void(many_args_func)(int, int, int, int, int, int, int, int, int, int, int);
88 #define DEF_MANY_ARGS_FUNC(NAME) \
89 void selftest_##NAME(int, int, int, int, int, int, int, int, int, int, int)
90 #define DEF_MANY_ARGS_GETTER(FLAG, NAME) DEF_GETTER(FLAG, NAME, many_args_func, NULL)
92 DEF_MANY_ARGS_FUNC(clobber_stack_args_aarch64);
93 DEF_MANY_ARGS_FUNC(clobber_stack_aarch64);
94 DEF_MANY_ARGS_FUNC(check_clobber_upper_x0_aarch64);
95 DEF_MANY_ARGS_FUNC(check_clobber_upper_x1_aarch64);
96 DEF_MANY_ARGS_FUNC(check_clobber_upper_x2_aarch64);
97 DEF_MANY_ARGS_FUNC(check_clobber_upper_x3_aarch64);
98 DEF_MANY_ARGS_FUNC(check_clobber_upper_x4_aarch64);
99 DEF_MANY_ARGS_FUNC(check_clobber_upper_x5_aarch64);
100 DEF_MANY_ARGS_FUNC(check_clobber_upper_x6_aarch64);
101 DEF_MANY_ARGS_FUNC(check_clobber_upper_x7_aarch64);
102 DEF_MANY_ARGS_FUNC(check_clobber_upper_stack0_aarch64);
103 DEF_MANY_ARGS_FUNC(check_clobber_upper_stack1_aarch64);
104 DEF_MANY_ARGS_FUNC(check_clobber_upper_stack2_aarch64);
107 typedef void(max_int_args_func)(int, int, int, int, int, int, int, int, int, int, int,
113 #define DEF_MAX_INT_ARGS_FUNC(NAME) \
114 void selftest_##NAME(int, int, int, int, int, int, int, int, int, int, int, int, \
116 #define DEF_MAX_INT_ARGS_GETTER(FLAG, NAME) \
117 DEF_GETTER(FLAG, NAME, max_int_args_func, NULL)
118 #define DEF_MAX_INT64_ARGS_FUNC(NAME) \
119 void selftest_##NAME(int64_t, int64_t, int64_t, int64_t, int64_t, int64_t, int64_t, \
120 int64_t, int64_t, int64_t, int64_t, int64_t, int64_t, int64_t, \
122 #define DEF_MAX_INT64_ARGS_GETTER(FLAG, NAME) \
123 DEF_GETTER(FLAG, NAME, max_int64_args_func, NULL)
125 DEF_MAX_INT_ARGS_FUNC(check_max_int_args_aarch64);
126 DEF_MAX_INT64_ARGS_FUNC(check_max_int64_args_aarch64);
134 case 0:
return selftest_clobber_x0;
135 case 1:
return selftest_clobber_x1;
136 case 2:
return selftest_clobber_x2;
137 case 3:
return selftest_clobber_x3;
138 case 4:
return selftest_clobber_x4;
139 case 5:
return selftest_clobber_x5;
140 case 6:
return selftest_clobber_x6;
141 case 7:
return selftest_clobber_x7;
142 case 8:
return selftest_clobber_x8;
143 case 9:
return selftest_clobber_x9;
144 case 10:
return selftest_clobber_x10;
145 case 11:
return selftest_clobber_x11;
146 case 12:
return selftest_clobber_x12;
147 case 13:
return selftest_clobber_x13;
148 case 14:
return selftest_clobber_x14;
149 case 15:
return selftest_clobber_x15;
150 case 16:
return selftest_clobber_x16;
151 case 17:
return selftest_clobber_x17;
153 case 19:
return selftest_clobber_x19;
154 case 20:
return selftest_clobber_x20;
155 case 21:
return selftest_clobber_x21;
156 case 22:
return selftest_clobber_x22;
157 case 23:
return selftest_clobber_x23;
158 case 24:
return selftest_clobber_x24;
159 case 25:
return selftest_clobber_x25;
160 case 26:
return selftest_clobber_x26;
161 case 27:
return selftest_clobber_x27;
162 case 28:
return selftest_clobber_x28;
163 case 29:
return selftest_clobber_x29;
164 default:
return NULL;
174 case 0:
return selftest_clobber_d0;
175 case 1:
return selftest_clobber_d1;
176 case 2:
return selftest_clobber_d2;
177 case 3:
return selftest_clobber_d3;
178 case 4:
return selftest_clobber_d4;
179 case 5:
return selftest_clobber_d5;
180 case 6:
return selftest_clobber_d6;
181 case 7:
return selftest_clobber_d7;
182 case 8:
return selftest_clobber_d8;
183 case 9:
return selftest_clobber_d9;
184 case 10:
return selftest_clobber_d10;
185 case 11:
return selftest_clobber_d11;
186 case 12:
return selftest_clobber_d12;
187 case 13:
return selftest_clobber_d13;
188 case 14:
return selftest_clobber_d14;
189 case 15:
return selftest_clobber_d15;
190 case 16:
return selftest_clobber_d16;
191 case 17:
return selftest_clobber_d17;
192 case 18:
return selftest_clobber_d18;
193 case 19:
return selftest_clobber_d19;
194 case 20:
return selftest_clobber_d20;
195 case 21:
return selftest_clobber_d21;
196 case 22:
return selftest_clobber_d22;
197 case 23:
return selftest_clobber_d23;
198 case 24:
return selftest_clobber_d24;
199 case 25:
return selftest_clobber_d25;
200 case 26:
return selftest_clobber_d26;
201 case 27:
return selftest_clobber_d27;
202 case 28:
return selftest_clobber_d28;
203 case 29:
return selftest_clobber_d29;
204 case 30:
return selftest_clobber_d30;
205 case 31:
return selftest_clobber_d31;
206 default:
return NULL;
210 static noop_func *get_clobber_v_upper(
int reg)
216 case 8:
return selftest_clobber_v8_upper;
217 case 9:
return selftest_clobber_v9_upper;
218 case 10:
return selftest_clobber_v10_upper;
219 case 11:
return selftest_clobber_v11_upper;
220 case 12:
return selftest_clobber_v12_upper;
221 case 13:
return selftest_clobber_v13_upper;
222 case 14:
return selftest_clobber_v14_upper;
223 case 15:
return selftest_clobber_v15_upper;
224 default:
return NULL;
228 static many_args_func *get_check_clobber_upper(
int arg)
234 case 0:
return selftest_check_clobber_upper_x0_aarch64;
235 case 1:
return selftest_check_clobber_upper_x1_aarch64;
236 case 2:
return selftest_check_clobber_upper_x2_aarch64;
237 case 3:
return selftest_check_clobber_upper_x3_aarch64;
238 case 4:
return selftest_check_clobber_upper_x4_aarch64;
239 case 5:
return selftest_check_clobber_upper_x5_aarch64;
240 case 6:
return selftest_check_clobber_upper_x6_aarch64;
241 case 7:
return selftest_check_clobber_upper_x7_aarch64;
242 case 8:
return selftest_check_clobber_upper_stack0_aarch64;
243 case 9:
return selftest_check_clobber_upper_stack1_aarch64;
244 case 10:
return selftest_check_clobber_upper_stack2_aarch64;
245 default:
return NULL;
250 DEF_MANY_ARGS_GETTER(SELFTEST_CPU_FLAG_AARCH64, clobber_stack_args_aarch64)
251 DEF_MANY_ARGS_GETTER(SELFTEST_CPU_FLAG_AARCH64, clobber_stack_aarch64)
253 DEF_MAX_INT_ARGS_GETTER(SELFTEST_CPU_FLAG_AARCH64, check_max_int_args_aarch64)
254 DEF_MAX_INT64_ARGS_GETTER(SELFTEST_CPU_FLAG_AARCH64, check_max_int64_args_aarch64)
256 static void check_clobber_x(
int from,
int to)
260 for (
int reg =
from; reg <
to; reg++) {
273 static void check_clobber_d(
int from,
int to)
277 for (
int reg =
from; reg <
to; reg++) {
290 static void check_clobber_v_upper(
int from,
int to)
294 for (
int reg =
from; reg <
to; reg++) {
295 noop_func *clobber = get_clobber_v_upper(reg);
307 static void check_clobber_arg_upper(
void)
309 checkasm_declare(
void,
int,
int,
int,
int,
int,
int,
int,
int,
int,
int,
int);
312 many_args_func *check_clobber = get_check_clobber_upper(
arg);
317 checkasm_call_new(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
324 static void selftest_test_many_args(many_args_func fun,
const char *
name)
326 checkasm_declare(
void,
int,
int,
int,
int,
int,
int,
int,
int,
int,
int,
int);
332 checkasm_call_new(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
338 static void selftest_test_max_int_args(max_int_args_func fun,
const char *
name)
340 checkasm_declare(
void,
int,
int,
int,
int,
int,
int,
int,
int,
int,
int,
int,
int,
345 checkasm_call_new(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
351 static void selftest_test_max_int64_args(max_int64_args_func fun,
const char *
name)
359 checkasm_call_new(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);
367 check_clobber_x(0, 18);
369 check_clobber_d(0, 8);
370 check_clobber_d(16, 32);
371 check_clobber_v_upper(8, 16);
372 selftest_test_many_args(get_clobber_stack_args_aarch64(),
"clobber_stack_args");
374 selftest_test_max_int_args(get_check_max_int_args_aarch64(),
"check_max_int_args");
375 selftest_test_max_int64_args(get_check_max_int64_args_aarch64(),
376 "check_max_int64_args");
377 check_clobber_arg_upper();
382 selftest_test_many_args(get_clobber_stack_aarch64(),
"clobber_stack");
383 check_clobber_x(19, 30);
384 check_clobber_d(8, 16);