Flutter Engine
The Flutter Engine
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
ffi_test_functions_generated.cc
Go to the documentation of this file.
1// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
2// for details. All rights reserved. Use of this source code is governed by a
3// BSD-style license that can be found in the LICENSE file.
4//
5// This file has been automatically generated. Please do not edit it manually.
6// Generated by tests/ffi/generator/structs_by_value_tests_generator.dart.
7
8#include <stdarg.h>
9#include <stddef.h>
10#include <stdint.h>
11#include <stdlib.h>
12#include <sys/types.h>
13
14#include <cmath>
15#include <iostream>
16#include <limits>
17
18#if defined(_WIN32)
19#define DART_EXPORT extern "C" __declspec(dllexport)
20#else
21#define DART_EXPORT \
22 extern "C" __attribute__((visibility("default"))) __attribute((used))
23#endif
24
25namespace dart {
26
27#define CHECK(X) \
28 if (!(X)) { \
29 fprintf(stderr, "%s\n", "Check failed: " #X); \
30 return 1; \
31 }
32
33#define CHECK_EQ(X, Y) CHECK((X) == (Y))
34
35// Works for positive, negative and zero.
36#define CHECK_APPROX(EXPECTED, ACTUAL) \
37 CHECK(((EXPECTED * 0.99) <= (ACTUAL) && (EXPECTED * 1.01) >= (ACTUAL)) || \
38 ((EXPECTED * 0.99) >= (ACTUAL) && (EXPECTED * 1.01) <= (ACTUAL)))
39
41 bool a0;
42};
43
45 int8_t a0;
46};
47
49 uint8_t a0;
50 uint8_t a1;
51 uint8_t a2;
52};
53
55 int16_t a0;
56 int8_t a1;
57};
58
60 int16_t a0;
61 int16_t a1;
62};
63
65 float a0;
66};
67
69 uint8_t a0;
70 uint8_t a1;
71 uint8_t a2;
72 uint8_t a3;
73 uint8_t a4;
74 uint8_t a5;
75 uint8_t a6;
76};
77
79 int32_t a0;
80 int16_t a1;
81 int8_t a2;
82};
83
85 int16_t a0;
86 int16_t a1;
87 int32_t a2;
88};
89
91 float a0;
92 float a1;
93};
94
96 double a0;
97};
98
100 float a0;
101 int16_t a1;
102 int16_t a2;
103};
104
106 uint8_t a0;
107 uint8_t a1;
108 uint8_t a2;
109 uint8_t a3;
110 uint8_t a4;
111 uint8_t a5;
112 uint8_t a6;
113 uint8_t a7;
114 uint8_t a8;
115};
116
118 int64_t a0;
119 int8_t a1;
120};
121
123 bool a0;
124 bool a1;
125 bool a2;
126 bool a3;
127 bool a4;
128 bool a5;
129 bool a6;
130 bool a7;
131 bool a8;
132 bool a9;
133};
134
136 float a0;
137 float a1;
138 float a2;
139};
140
142 int32_t a0;
143 int32_t a1;
144 int32_t a2;
145};
146
148 float a0;
149 float a1;
150 float a2;
151 float a3;
152};
153
155 double a0;
156 int64_t a1;
157};
158
160 float a0;
161 float a1;
162 float a2;
163 int32_t a3;
164};
165
167 int64_t a0;
168 int64_t a1;
169 int8_t a2;
170};
171
173 uint8_t a0;
174 uint8_t a1;
175 uint8_t a2;
176 uint8_t a3;
177 uint8_t a4;
178 uint8_t a5;
179 uint8_t a6;
180 uint8_t a7;
181 uint8_t a8;
182 uint8_t a9;
183 uint8_t a10;
184 uint8_t a11;
185 uint8_t a12;
186 uint8_t a13;
187 uint8_t a14;
188 uint8_t a15;
189 uint8_t a16;
190 uint8_t a17;
191 uint8_t a18;
192};
193
195 int32_t a0;
196 int32_t a1;
197 int32_t a2;
198 int32_t a3;
199 int32_t a4;
200};
201
203 float a0;
204 float a1;
205 float a2;
206 float a3;
207 float a4;
208};
209
211 double a0;
212 double a1;
213 double a2;
214 double a3;
215};
216
218 double a0;
219 double a1;
220 double a2;
221 double a3;
222 double a4;
223};
224
226 uint64_t a0;
227 uint64_t a1;
228 uint64_t a2;
229 uint64_t a3;
230 uint64_t a4;
231 uint64_t a5;
232 uint64_t a6;
233 uint64_t a7;
234 uint64_t a8;
235 uint64_t a9;
236 uint64_t a10;
237 uint64_t a11;
238 uint64_t a12;
239 uint64_t a13;
240 uint64_t a14;
241 uint64_t a15;
242 uint64_t a16;
243 uint64_t a17;
244 uint64_t a18;
245 uint64_t a19;
246 uint64_t a20;
247 uint64_t a21;
248 uint64_t a22;
249 uint64_t a23;
250 uint64_t a24;
251 uint64_t a25;
252 uint64_t a26;
253 uint64_t a27;
254 uint64_t a28;
255 uint64_t a29;
256 uint64_t a30;
257 uint64_t a31;
258 uint64_t a32;
259 uint64_t a33;
260 uint64_t a34;
261 uint64_t a35;
262 uint64_t a36;
263 uint64_t a37;
264 uint64_t a38;
265 uint64_t a39;
266 uint64_t a40;
267 uint64_t a41;
268 uint64_t a42;
269 uint64_t a43;
270 uint64_t a44;
271 uint64_t a45;
272 uint64_t a46;
273 uint64_t a47;
274 uint64_t a48;
275 uint64_t a49;
276 uint64_t a50;
277 uint64_t a51;
278 uint64_t a52;
279 uint64_t a53;
280 uint64_t a54;
281 uint64_t a55;
282 uint64_t a56;
283 uint64_t a57;
284 uint64_t a58;
285 uint64_t a59;
286 uint64_t a60;
287 uint64_t a61;
288 uint64_t a62;
289 uint64_t a63;
290 uint64_t a64;
291 uint64_t a65;
292 uint64_t a66;
293 uint64_t a67;
294 uint64_t a68;
295 uint64_t a69;
296 uint64_t a70;
297 uint64_t a71;
298 uint64_t a72;
299 uint64_t a73;
300 uint64_t a74;
301 uint64_t a75;
302 uint64_t a76;
303 uint64_t a77;
304 uint64_t a78;
305 uint64_t a79;
306 uint64_t a80;
307 uint64_t a81;
308 uint64_t a82;
309 uint64_t a83;
310 uint64_t a84;
311 uint64_t a85;
312 uint64_t a86;
313 uint64_t a87;
314 uint64_t a88;
315 uint64_t a89;
316 uint64_t a90;
317 uint64_t a91;
318 uint64_t a92;
319 uint64_t a93;
320 uint64_t a94;
321 uint64_t a95;
322 uint64_t a96;
323 uint64_t a97;
324 uint64_t a98;
325 uint64_t a99;
326 uint64_t a100;
327 uint64_t a101;
328 uint64_t a102;
329 uint64_t a103;
330 uint64_t a104;
331 uint64_t a105;
332 uint64_t a106;
333 uint64_t a107;
334 uint64_t a108;
335 uint64_t a109;
336 uint64_t a110;
337 uint64_t a111;
338 uint64_t a112;
339 uint64_t a113;
340 uint64_t a114;
341 uint64_t a115;
342 uint64_t a116;
343 uint64_t a117;
344 uint64_t a118;
345 uint64_t a119;
346 uint64_t a120;
347 uint64_t a121;
348 uint64_t a122;
349 uint64_t a123;
350 uint64_t a124;
351 uint64_t a125;
352 uint64_t a126;
353 uint64_t a127;
354};
355
357 int8_t a0;
358 int16_t a1;
359 int8_t a2;
360};
361
363 int8_t a0;
364 int32_t a1;
365 int8_t a2;
366};
367
369 int8_t a0;
370 int64_t a1;
371 int8_t a2;
372};
373
377};
378
382};
383
386 float a1;
387};
388
392};
393
397};
398
402};
403
407};
408
412};
413
417};
418
420 uint16_t a0;
422 uint16_t a2;
424 uint16_t a4;
426 uint16_t a6;
427};
428
432 float a2;
433 double a3;
434};
435
437 uint64_t a0;
440 double a3;
441};
442
444 uint8_t a0[8];
445};
446
448 bool a0[10];
449};
450
453 uint8_t a1;
454};
455
457 uint8_t a0[100];
458};
459
461 uint32_t a0;
462 uint32_t a1;
463 uint8_t a2[4000];
464};
465
469 float a2;
470};
471
475 double a2;
476};
477
481 int16_t a2[2];
482};
483
485 uint8_t a0[2][2][2];
486};
487
489 uint8_t a0[2][2][2][2][2];
490};
491
493 uint8_t a0[2][2][2][2][2][2];
494};
495
498};
499
500#pragma pack(push, 1)
502 int8_t a0;
503 int16_t a1;
504};
505#pragma pack(pop)
506
507#pragma pack(push, 1)
509 int8_t a0;
510 int16_t a1;
511};
512#pragma pack(pop)
513
514#pragma pack(push, 1)
516 float a0;
517 uint8_t a1;
518};
519#pragma pack(pop)
520
522 uint8_t a0;
524};
525
528};
529
530#pragma pack(push, 1)
532 uint8_t a0;
533 uint32_t a1;
534 uint8_t a2;
535 uint8_t a3;
536 uint8_t a4;
537};
538#pragma pack(pop)
539
540#pragma pack(push, 1)
542 uint8_t a0;
543 double a1;
544};
545#pragma pack(pop)
546
549};
550
552 uint32_t a0;
553 float a1;
554};
555
557 double a0;
559};
560
564};
565
567 float a0[4];
569};
570
575};
576
578 wchar_t a0[10];
579};
580
581// Used for testing structs and unions by value.
582// Smallest struct with data.
583// 10 struct arguments will exhaust available registers.
593 Struct1ByteInt a9) {
594 std::cout << "PassStruct1ByteIntx10"
595 << "((" << static_cast<int>(a0.a0) << "), ("
596 << static_cast<int>(a1.a0) << "), (" << static_cast<int>(a2.a0)
597 << "), (" << static_cast<int>(a3.a0) << "), ("
598 << static_cast<int>(a4.a0) << "), (" << static_cast<int>(a5.a0)
599 << "), (" << static_cast<int>(a6.a0) << "), ("
600 << static_cast<int>(a7.a0) << "), (" << static_cast<int>(a8.a0)
601 << "), (" << static_cast<int>(a9.a0) << "))"
602 << "\n";
603
604 int64_t result = 0;
605
606 result += a0.a0;
607 result += a1.a0;
608 result += a2.a0;
609 result += a3.a0;
610 result += a4.a0;
611 result += a5.a0;
612 result += a6.a0;
613 result += a7.a0;
614 result += a8.a0;
615 result += a9.a0;
616
617 std::cout << "result = " << result << "\n";
618
619 return result;
620}
621
622// Used for testing structs and unions by value.
623// Not a multiple of word size, not a power of two.
624// 10 struct arguments will exhaust available registers.
625DART_EXPORT int64_t
636 std::cout << "PassStruct3BytesHomogeneousUint8x10"
637 << "((" << static_cast<int>(a0.a0) << ", "
638 << static_cast<int>(a0.a1) << ", " << static_cast<int>(a0.a2)
639 << "), (" << static_cast<int>(a1.a0) << ", "
640 << static_cast<int>(a1.a1) << ", " << static_cast<int>(a1.a2)
641 << "), (" << static_cast<int>(a2.a0) << ", "
642 << static_cast<int>(a2.a1) << ", " << static_cast<int>(a2.a2)
643 << "), (" << static_cast<int>(a3.a0) << ", "
644 << static_cast<int>(a3.a1) << ", " << static_cast<int>(a3.a2)
645 << "), (" << static_cast<int>(a4.a0) << ", "
646 << static_cast<int>(a4.a1) << ", " << static_cast<int>(a4.a2)
647 << "), (" << static_cast<int>(a5.a0) << ", "
648 << static_cast<int>(a5.a1) << ", " << static_cast<int>(a5.a2)
649 << "), (" << static_cast<int>(a6.a0) << ", "
650 << static_cast<int>(a6.a1) << ", " << static_cast<int>(a6.a2)
651 << "), (" << static_cast<int>(a7.a0) << ", "
652 << static_cast<int>(a7.a1) << ", " << static_cast<int>(a7.a2)
653 << "), (" << static_cast<int>(a8.a0) << ", "
654 << static_cast<int>(a8.a1) << ", " << static_cast<int>(a8.a2)
655 << "), (" << static_cast<int>(a9.a0) << ", "
656 << static_cast<int>(a9.a1) << ", " << static_cast<int>(a9.a2)
657 << "))"
658 << "\n";
659
660 int64_t result = 0;
661
662 result += a0.a0;
663 result += a0.a1;
664 result += a0.a2;
665 result += a1.a0;
666 result += a1.a1;
667 result += a1.a2;
668 result += a2.a0;
669 result += a2.a1;
670 result += a2.a2;
671 result += a3.a0;
672 result += a3.a1;
673 result += a3.a2;
674 result += a4.a0;
675 result += a4.a1;
676 result += a4.a2;
677 result += a5.a0;
678 result += a5.a1;
679 result += a5.a2;
680 result += a6.a0;
681 result += a6.a1;
682 result += a6.a2;
683 result += a7.a0;
684 result += a7.a1;
685 result += a7.a2;
686 result += a8.a0;
687 result += a8.a1;
688 result += a8.a2;
689 result += a9.a0;
690 result += a9.a1;
691 result += a9.a2;
692
693 std::cout << "result = " << result << "\n";
694
695 return result;
696}
697
698// Used for testing structs and unions by value.
699// Not a multiple of word size, not a power of two.
700// With alignment rules taken into account size is 4 bytes.
701// 10 struct arguments will exhaust available registers.
702DART_EXPORT int64_t
713 std::cout << "PassStruct3BytesInt2ByteAlignedx10"
714 << "((" << a0.a0 << ", " << static_cast<int>(a0.a1) << "), ("
715 << a1.a0 << ", " << static_cast<int>(a1.a1) << "), (" << a2.a0
716 << ", " << static_cast<int>(a2.a1) << "), (" << a3.a0 << ", "
717 << static_cast<int>(a3.a1) << "), (" << a4.a0 << ", "
718 << static_cast<int>(a4.a1) << "), (" << a5.a0 << ", "
719 << static_cast<int>(a5.a1) << "), (" << a6.a0 << ", "
720 << static_cast<int>(a6.a1) << "), (" << a7.a0 << ", "
721 << static_cast<int>(a7.a1) << "), (" << a8.a0 << ", "
722 << static_cast<int>(a8.a1) << "), (" << a9.a0 << ", "
723 << static_cast<int>(a9.a1) << "))"
724 << "\n";
725
726 int64_t result = 0;
727
728 result += a0.a0;
729 result += a0.a1;
730 result += a1.a0;
731 result += a1.a1;
732 result += a2.a0;
733 result += a2.a1;
734 result += a3.a0;
735 result += a3.a1;
736 result += a4.a0;
737 result += a4.a1;
738 result += a5.a0;
739 result += a5.a1;
740 result += a6.a0;
741 result += a6.a1;
742 result += a7.a0;
743 result += a7.a1;
744 result += a8.a0;
745 result += a8.a1;
746 result += a9.a0;
747 result += a9.a1;
748
749 std::cout << "result = " << result << "\n";
750
751 return result;
752}
753
754// Used for testing structs and unions by value.
755// Exactly word size on 32-bit architectures.
756// 10 struct arguments will exhaust available registers.
757DART_EXPORT int64_t
768 std::cout << "PassStruct4BytesHomogeneousInt16x10"
769 << "((" << a0.a0 << ", " << a0.a1 << "), (" << a1.a0 << ", "
770 << a1.a1 << "), (" << a2.a0 << ", " << a2.a1 << "), (" << a3.a0
771 << ", " << a3.a1 << "), (" << a4.a0 << ", " << a4.a1 << "), ("
772 << a5.a0 << ", " << a5.a1 << "), (" << a6.a0 << ", " << a6.a1
773 << "), (" << a7.a0 << ", " << a7.a1 << "), (" << a8.a0 << ", "
774 << a8.a1 << "), (" << a9.a0 << ", " << a9.a1 << "))"
775 << "\n";
776
777 int64_t result = 0;
778
779 result += a0.a0;
780 result += a0.a1;
781 result += a1.a0;
782 result += a1.a1;
783 result += a2.a0;
784 result += a2.a1;
785 result += a3.a0;
786 result += a3.a1;
787 result += a4.a0;
788 result += a4.a1;
789 result += a5.a0;
790 result += a5.a1;
791 result += a6.a0;
792 result += a6.a1;
793 result += a7.a0;
794 result += a7.a1;
795 result += a8.a0;
796 result += a8.a1;
797 result += a9.a0;
798 result += a9.a1;
799
800 std::cout << "result = " << result << "\n";
801
802 return result;
803}
804
805// Used for testing structs and unions by value.
806// Sub word size on 64 bit architectures.
807// 10 struct arguments will exhaust available registers.
808DART_EXPORT int64_t
819 std::cout
820 << "PassStruct7BytesHomogeneousUint8x10"
821 << "((" << static_cast<int>(a0.a0) << ", " << static_cast<int>(a0.a1)
822 << ", " << static_cast<int>(a0.a2) << ", " << static_cast<int>(a0.a3)
823 << ", " << static_cast<int>(a0.a4) << ", " << static_cast<int>(a0.a5)
824 << ", " << static_cast<int>(a0.a6) << "), (" << static_cast<int>(a1.a0)
825 << ", " << static_cast<int>(a1.a1) << ", " << static_cast<int>(a1.a2)
826 << ", " << static_cast<int>(a1.a3) << ", " << static_cast<int>(a1.a4)
827 << ", " << static_cast<int>(a1.a5) << ", " << static_cast<int>(a1.a6)
828 << "), (" << static_cast<int>(a2.a0) << ", " << static_cast<int>(a2.a1)
829 << ", " << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3)
830 << ", " << static_cast<int>(a2.a4) << ", " << static_cast<int>(a2.a5)
831 << ", " << static_cast<int>(a2.a6) << "), (" << static_cast<int>(a3.a0)
832 << ", " << static_cast<int>(a3.a1) << ", " << static_cast<int>(a3.a2)
833 << ", " << static_cast<int>(a3.a3) << ", " << static_cast<int>(a3.a4)
834 << ", " << static_cast<int>(a3.a5) << ", " << static_cast<int>(a3.a6)
835 << "), (" << static_cast<int>(a4.a0) << ", " << static_cast<int>(a4.a1)
836 << ", " << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3)
837 << ", " << static_cast<int>(a4.a4) << ", " << static_cast<int>(a4.a5)
838 << ", " << static_cast<int>(a4.a6) << "), (" << static_cast<int>(a5.a0)
839 << ", " << static_cast<int>(a5.a1) << ", " << static_cast<int>(a5.a2)
840 << ", " << static_cast<int>(a5.a3) << ", " << static_cast<int>(a5.a4)
841 << ", " << static_cast<int>(a5.a5) << ", " << static_cast<int>(a5.a6)
842 << "), (" << static_cast<int>(a6.a0) << ", " << static_cast<int>(a6.a1)
843 << ", " << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3)
844 << ", " << static_cast<int>(a6.a4) << ", " << static_cast<int>(a6.a5)
845 << ", " << static_cast<int>(a6.a6) << "), (" << static_cast<int>(a7.a0)
846 << ", " << static_cast<int>(a7.a1) << ", " << static_cast<int>(a7.a2)
847 << ", " << static_cast<int>(a7.a3) << ", " << static_cast<int>(a7.a4)
848 << ", " << static_cast<int>(a7.a5) << ", " << static_cast<int>(a7.a6)
849 << "), (" << static_cast<int>(a8.a0) << ", " << static_cast<int>(a8.a1)
850 << ", " << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3)
851 << ", " << static_cast<int>(a8.a4) << ", " << static_cast<int>(a8.a5)
852 << ", " << static_cast<int>(a8.a6) << "), (" << static_cast<int>(a9.a0)
853 << ", " << static_cast<int>(a9.a1) << ", " << static_cast<int>(a9.a2)
854 << ", " << static_cast<int>(a9.a3) << ", " << static_cast<int>(a9.a4)
855 << ", " << static_cast<int>(a9.a5) << ", " << static_cast<int>(a9.a6)
856 << "))"
857 << "\n";
858
859 int64_t result = 0;
860
861 result += a0.a0;
862 result += a0.a1;
863 result += a0.a2;
864 result += a0.a3;
865 result += a0.a4;
866 result += a0.a5;
867 result += a0.a6;
868 result += a1.a0;
869 result += a1.a1;
870 result += a1.a2;
871 result += a1.a3;
872 result += a1.a4;
873 result += a1.a5;
874 result += a1.a6;
875 result += a2.a0;
876 result += a2.a1;
877 result += a2.a2;
878 result += a2.a3;
879 result += a2.a4;
880 result += a2.a5;
881 result += a2.a6;
882 result += a3.a0;
883 result += a3.a1;
884 result += a3.a2;
885 result += a3.a3;
886 result += a3.a4;
887 result += a3.a5;
888 result += a3.a6;
889 result += a4.a0;
890 result += a4.a1;
891 result += a4.a2;
892 result += a4.a3;
893 result += a4.a4;
894 result += a4.a5;
895 result += a4.a6;
896 result += a5.a0;
897 result += a5.a1;
898 result += a5.a2;
899 result += a5.a3;
900 result += a5.a4;
901 result += a5.a5;
902 result += a5.a6;
903 result += a6.a0;
904 result += a6.a1;
905 result += a6.a2;
906 result += a6.a3;
907 result += a6.a4;
908 result += a6.a5;
909 result += a6.a6;
910 result += a7.a0;
911 result += a7.a1;
912 result += a7.a2;
913 result += a7.a3;
914 result += a7.a4;
915 result += a7.a5;
916 result += a7.a6;
917 result += a8.a0;
918 result += a8.a1;
919 result += a8.a2;
920 result += a8.a3;
921 result += a8.a4;
922 result += a8.a5;
923 result += a8.a6;
924 result += a9.a0;
925 result += a9.a1;
926 result += a9.a2;
927 result += a9.a3;
928 result += a9.a4;
929 result += a9.a5;
930 result += a9.a6;
931
932 std::cout << "result = " << result << "\n";
933
934 return result;
935}
936
937// Used for testing structs and unions by value.
938// Sub word size on 64 bit architectures.
939// With alignment rules taken into account size is 8 bytes.
940// 10 struct arguments will exhaust available registers.
941DART_EXPORT int64_t
952 std::cout << "PassStruct7BytesInt4ByteAlignedx10"
953 << "((" << a0.a0 << ", " << a0.a1 << ", " << static_cast<int>(a0.a2)
954 << "), (" << a1.a0 << ", " << a1.a1 << ", "
955 << static_cast<int>(a1.a2) << "), (" << a2.a0 << ", " << a2.a1
956 << ", " << static_cast<int>(a2.a2) << "), (" << a3.a0 << ", "
957 << a3.a1 << ", " << static_cast<int>(a3.a2) << "), (" << a4.a0
958 << ", " << a4.a1 << ", " << static_cast<int>(a4.a2) << "), ("
959 << a5.a0 << ", " << a5.a1 << ", " << static_cast<int>(a5.a2)
960 << "), (" << a6.a0 << ", " << a6.a1 << ", "
961 << static_cast<int>(a6.a2) << "), (" << a7.a0 << ", " << a7.a1
962 << ", " << static_cast<int>(a7.a2) << "), (" << a8.a0 << ", "
963 << a8.a1 << ", " << static_cast<int>(a8.a2) << "), (" << a9.a0
964 << ", " << a9.a1 << ", " << static_cast<int>(a9.a2) << "))"
965 << "\n";
966
967 int64_t result = 0;
968
969 result += a0.a0;
970 result += a0.a1;
971 result += a0.a2;
972 result += a1.a0;
973 result += a1.a1;
974 result += a1.a2;
975 result += a2.a0;
976 result += a2.a1;
977 result += a2.a2;
978 result += a3.a0;
979 result += a3.a1;
980 result += a3.a2;
981 result += a4.a0;
982 result += a4.a1;
983 result += a4.a2;
984 result += a5.a0;
985 result += a5.a1;
986 result += a5.a2;
987 result += a6.a0;
988 result += a6.a1;
989 result += a6.a2;
990 result += a7.a0;
991 result += a7.a1;
992 result += a7.a2;
993 result += a8.a0;
994 result += a8.a1;
995 result += a8.a2;
996 result += a9.a0;
997 result += a9.a1;
998 result += a9.a2;
999
1000 std::cout << "result = " << result << "\n";
1001
1002 return result;
1003}
1004
1005// Used for testing structs and unions by value.
1006// Exactly word size struct on 64bit architectures.
1007// 10 struct arguments will exhaust available registers.
1009 Struct8BytesInt a1,
1010 Struct8BytesInt a2,
1011 Struct8BytesInt a3,
1012 Struct8BytesInt a4,
1013 Struct8BytesInt a5,
1014 Struct8BytesInt a6,
1015 Struct8BytesInt a7,
1016 Struct8BytesInt a8,
1017 Struct8BytesInt a9) {
1018 std::cout << "PassStruct8BytesIntx10"
1019 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << "), ("
1020 << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << "), (" << a2.a0
1021 << ", " << a2.a1 << ", " << a2.a2 << "), (" << a3.a0 << ", "
1022 << a3.a1 << ", " << a3.a2 << "), (" << a4.a0 << ", " << a4.a1
1023 << ", " << a4.a2 << "), (" << a5.a0 << ", " << a5.a1 << ", "
1024 << a5.a2 << "), (" << a6.a0 << ", " << a6.a1 << ", " << a6.a2
1025 << "), (" << a7.a0 << ", " << a7.a1 << ", " << a7.a2 << "), ("
1026 << a8.a0 << ", " << a8.a1 << ", " << a8.a2 << "), (" << a9.a0
1027 << ", " << a9.a1 << ", " << a9.a2 << "))"
1028 << "\n";
1029
1030 int64_t result = 0;
1031
1032 result += a0.a0;
1033 result += a0.a1;
1034 result += a0.a2;
1035 result += a1.a0;
1036 result += a1.a1;
1037 result += a1.a2;
1038 result += a2.a0;
1039 result += a2.a1;
1040 result += a2.a2;
1041 result += a3.a0;
1042 result += a3.a1;
1043 result += a3.a2;
1044 result += a4.a0;
1045 result += a4.a1;
1046 result += a4.a2;
1047 result += a5.a0;
1048 result += a5.a1;
1049 result += a5.a2;
1050 result += a6.a0;
1051 result += a6.a1;
1052 result += a6.a2;
1053 result += a7.a0;
1054 result += a7.a1;
1055 result += a7.a2;
1056 result += a8.a0;
1057 result += a8.a1;
1058 result += a8.a2;
1059 result += a9.a0;
1060 result += a9.a1;
1061 result += a9.a2;
1062
1063 std::cout << "result = " << result << "\n";
1064
1065 return result;
1066}
1067
1068// Used for testing structs and unions by value.
1069// Arguments passed in FP registers as long as they fit.
1070// 10 struct arguments will exhaust available registers.
1082 std::cout << "PassStruct8BytesHomogeneousFloatx10"
1083 << "((" << a0.a0 << ", " << a0.a1 << "), (" << a1.a0 << ", "
1084 << a1.a1 << "), (" << a2.a0 << ", " << a2.a1 << "), (" << a3.a0
1085 << ", " << a3.a1 << "), (" << a4.a0 << ", " << a4.a1 << "), ("
1086 << a5.a0 << ", " << a5.a1 << "), (" << a6.a0 << ", " << a6.a1
1087 << "), (" << a7.a0 << ", " << a7.a1 << "), (" << a8.a0 << ", "
1088 << a8.a1 << "), (" << a9.a0 << ", " << a9.a1 << "))"
1089 << "\n";
1090
1091 float result = 0;
1092
1093 result += a0.a0;
1094 result += a0.a1;
1095 result += a1.a0;
1096 result += a1.a1;
1097 result += a2.a0;
1098 result += a2.a1;
1099 result += a3.a0;
1100 result += a3.a1;
1101 result += a4.a0;
1102 result += a4.a1;
1103 result += a5.a0;
1104 result += a5.a1;
1105 result += a6.a0;
1106 result += a6.a1;
1107 result += a7.a0;
1108 result += a7.a1;
1109 result += a8.a0;
1110 result += a8.a1;
1111 result += a9.a0;
1112 result += a9.a1;
1113
1114 std::cout << "result = " << result << "\n";
1115
1116 return result;
1117}
1118
1119// Used for testing structs and unions by value.
1120// On x64, arguments go in int registers because it is not only float.
1121// 10 struct arguments will exhaust available registers.
1131 Struct8BytesMixed a9) {
1132 std::cout << "PassStruct8BytesMixedx10"
1133 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << "), ("
1134 << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << "), (" << a2.a0
1135 << ", " << a2.a1 << ", " << a2.a2 << "), (" << a3.a0 << ", "
1136 << a3.a1 << ", " << a3.a2 << "), (" << a4.a0 << ", " << a4.a1
1137 << ", " << a4.a2 << "), (" << a5.a0 << ", " << a5.a1 << ", "
1138 << a5.a2 << "), (" << a6.a0 << ", " << a6.a1 << ", " << a6.a2
1139 << "), (" << a7.a0 << ", " << a7.a1 << ", " << a7.a2 << "), ("
1140 << a8.a0 << ", " << a8.a1 << ", " << a8.a2 << "), (" << a9.a0
1141 << ", " << a9.a1 << ", " << a9.a2 << "))"
1142 << "\n";
1143
1144 float result = 0;
1145
1146 result += a0.a0;
1147 result += a0.a1;
1148 result += a0.a2;
1149 result += a1.a0;
1150 result += a1.a1;
1151 result += a1.a2;
1152 result += a2.a0;
1153 result += a2.a1;
1154 result += a2.a2;
1155 result += a3.a0;
1156 result += a3.a1;
1157 result += a3.a2;
1158 result += a4.a0;
1159 result += a4.a1;
1160 result += a4.a2;
1161 result += a5.a0;
1162 result += a5.a1;
1163 result += a5.a2;
1164 result += a6.a0;
1165 result += a6.a1;
1166 result += a6.a2;
1167 result += a7.a0;
1168 result += a7.a1;
1169 result += a7.a2;
1170 result += a8.a0;
1171 result += a8.a1;
1172 result += a8.a2;
1173 result += a9.a0;
1174 result += a9.a1;
1175 result += a9.a2;
1176
1177 std::cout << "result = " << result << "\n";
1178
1179 return result;
1180}
1181
1182// Used for testing structs and unions by value.
1183// Argument is a single byte over a multiple of word size.
1184// 10 struct arguments will exhaust available registers.
1185// Struct only has 1-byte aligned fields to test struct alignment itself.
1186// Tests upper bytes in the integer registers that are partly filled.
1187// Tests stack alignment of non word size stack arguments.
1188DART_EXPORT int64_t
1199 std::cout
1200 << "PassStruct9BytesHomogeneousUint8x10"
1201 << "((" << static_cast<int>(a0.a0) << ", " << static_cast<int>(a0.a1)
1202 << ", " << static_cast<int>(a0.a2) << ", " << static_cast<int>(a0.a3)
1203 << ", " << static_cast<int>(a0.a4) << ", " << static_cast<int>(a0.a5)
1204 << ", " << static_cast<int>(a0.a6) << ", " << static_cast<int>(a0.a7)
1205 << ", " << static_cast<int>(a0.a8) << "), (" << static_cast<int>(a1.a0)
1206 << ", " << static_cast<int>(a1.a1) << ", " << static_cast<int>(a1.a2)
1207 << ", " << static_cast<int>(a1.a3) << ", " << static_cast<int>(a1.a4)
1208 << ", " << static_cast<int>(a1.a5) << ", " << static_cast<int>(a1.a6)
1209 << ", " << static_cast<int>(a1.a7) << ", " << static_cast<int>(a1.a8)
1210 << "), (" << static_cast<int>(a2.a0) << ", " << static_cast<int>(a2.a1)
1211 << ", " << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3)
1212 << ", " << static_cast<int>(a2.a4) << ", " << static_cast<int>(a2.a5)
1213 << ", " << static_cast<int>(a2.a6) << ", " << static_cast<int>(a2.a7)
1214 << ", " << static_cast<int>(a2.a8) << "), (" << static_cast<int>(a3.a0)
1215 << ", " << static_cast<int>(a3.a1) << ", " << static_cast<int>(a3.a2)
1216 << ", " << static_cast<int>(a3.a3) << ", " << static_cast<int>(a3.a4)
1217 << ", " << static_cast<int>(a3.a5) << ", " << static_cast<int>(a3.a6)
1218 << ", " << static_cast<int>(a3.a7) << ", " << static_cast<int>(a3.a8)
1219 << "), (" << static_cast<int>(a4.a0) << ", " << static_cast<int>(a4.a1)
1220 << ", " << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3)
1221 << ", " << static_cast<int>(a4.a4) << ", " << static_cast<int>(a4.a5)
1222 << ", " << static_cast<int>(a4.a6) << ", " << static_cast<int>(a4.a7)
1223 << ", " << static_cast<int>(a4.a8) << "), (" << static_cast<int>(a5.a0)
1224 << ", " << static_cast<int>(a5.a1) << ", " << static_cast<int>(a5.a2)
1225 << ", " << static_cast<int>(a5.a3) << ", " << static_cast<int>(a5.a4)
1226 << ", " << static_cast<int>(a5.a5) << ", " << static_cast<int>(a5.a6)
1227 << ", " << static_cast<int>(a5.a7) << ", " << static_cast<int>(a5.a8)
1228 << "), (" << static_cast<int>(a6.a0) << ", " << static_cast<int>(a6.a1)
1229 << ", " << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3)
1230 << ", " << static_cast<int>(a6.a4) << ", " << static_cast<int>(a6.a5)
1231 << ", " << static_cast<int>(a6.a6) << ", " << static_cast<int>(a6.a7)
1232 << ", " << static_cast<int>(a6.a8) << "), (" << static_cast<int>(a7.a0)
1233 << ", " << static_cast<int>(a7.a1) << ", " << static_cast<int>(a7.a2)
1234 << ", " << static_cast<int>(a7.a3) << ", " << static_cast<int>(a7.a4)
1235 << ", " << static_cast<int>(a7.a5) << ", " << static_cast<int>(a7.a6)
1236 << ", " << static_cast<int>(a7.a7) << ", " << static_cast<int>(a7.a8)
1237 << "), (" << static_cast<int>(a8.a0) << ", " << static_cast<int>(a8.a1)
1238 << ", " << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3)
1239 << ", " << static_cast<int>(a8.a4) << ", " << static_cast<int>(a8.a5)
1240 << ", " << static_cast<int>(a8.a6) << ", " << static_cast<int>(a8.a7)
1241 << ", " << static_cast<int>(a8.a8) << "), (" << static_cast<int>(a9.a0)
1242 << ", " << static_cast<int>(a9.a1) << ", " << static_cast<int>(a9.a2)
1243 << ", " << static_cast<int>(a9.a3) << ", " << static_cast<int>(a9.a4)
1244 << ", " << static_cast<int>(a9.a5) << ", " << static_cast<int>(a9.a6)
1245 << ", " << static_cast<int>(a9.a7) << ", " << static_cast<int>(a9.a8)
1246 << "))"
1247 << "\n";
1248
1249 int64_t result = 0;
1250
1251 result += a0.a0;
1252 result += a0.a1;
1253 result += a0.a2;
1254 result += a0.a3;
1255 result += a0.a4;
1256 result += a0.a5;
1257 result += a0.a6;
1258 result += a0.a7;
1259 result += a0.a8;
1260 result += a1.a0;
1261 result += a1.a1;
1262 result += a1.a2;
1263 result += a1.a3;
1264 result += a1.a4;
1265 result += a1.a5;
1266 result += a1.a6;
1267 result += a1.a7;
1268 result += a1.a8;
1269 result += a2.a0;
1270 result += a2.a1;
1271 result += a2.a2;
1272 result += a2.a3;
1273 result += a2.a4;
1274 result += a2.a5;
1275 result += a2.a6;
1276 result += a2.a7;
1277 result += a2.a8;
1278 result += a3.a0;
1279 result += a3.a1;
1280 result += a3.a2;
1281 result += a3.a3;
1282 result += a3.a4;
1283 result += a3.a5;
1284 result += a3.a6;
1285 result += a3.a7;
1286 result += a3.a8;
1287 result += a4.a0;
1288 result += a4.a1;
1289 result += a4.a2;
1290 result += a4.a3;
1291 result += a4.a4;
1292 result += a4.a5;
1293 result += a4.a6;
1294 result += a4.a7;
1295 result += a4.a8;
1296 result += a5.a0;
1297 result += a5.a1;
1298 result += a5.a2;
1299 result += a5.a3;
1300 result += a5.a4;
1301 result += a5.a5;
1302 result += a5.a6;
1303 result += a5.a7;
1304 result += a5.a8;
1305 result += a6.a0;
1306 result += a6.a1;
1307 result += a6.a2;
1308 result += a6.a3;
1309 result += a6.a4;
1310 result += a6.a5;
1311 result += a6.a6;
1312 result += a6.a7;
1313 result += a6.a8;
1314 result += a7.a0;
1315 result += a7.a1;
1316 result += a7.a2;
1317 result += a7.a3;
1318 result += a7.a4;
1319 result += a7.a5;
1320 result += a7.a6;
1321 result += a7.a7;
1322 result += a7.a8;
1323 result += a8.a0;
1324 result += a8.a1;
1325 result += a8.a2;
1326 result += a8.a3;
1327 result += a8.a4;
1328 result += a8.a5;
1329 result += a8.a6;
1330 result += a8.a7;
1331 result += a8.a8;
1332 result += a9.a0;
1333 result += a9.a1;
1334 result += a9.a2;
1335 result += a9.a3;
1336 result += a9.a4;
1337 result += a9.a5;
1338 result += a9.a6;
1339 result += a9.a7;
1340 result += a9.a8;
1341
1342 std::cout << "result = " << result << "\n";
1343
1344 return result;
1345}
1346
1347// Used for testing structs and unions by value.
1348// Argument is a single byte over a multiple of word size.
1349// With alignment rules taken into account size is 12 or 16 bytes.
1350// 10 struct arguments will exhaust available registers.
1351//
1352DART_EXPORT int64_t
1363 std::cout << "PassStruct9BytesInt4Or8ByteAlignedx10"
1364 << "((" << a0.a0 << ", " << static_cast<int>(a0.a1) << "), ("
1365 << a1.a0 << ", " << static_cast<int>(a1.a1) << "), (" << a2.a0
1366 << ", " << static_cast<int>(a2.a1) << "), (" << a3.a0 << ", "
1367 << static_cast<int>(a3.a1) << "), (" << a4.a0 << ", "
1368 << static_cast<int>(a4.a1) << "), (" << a5.a0 << ", "
1369 << static_cast<int>(a5.a1) << "), (" << a6.a0 << ", "
1370 << static_cast<int>(a6.a1) << "), (" << a7.a0 << ", "
1371 << static_cast<int>(a7.a1) << "), (" << a8.a0 << ", "
1372 << static_cast<int>(a8.a1) << "), (" << a9.a0 << ", "
1373 << static_cast<int>(a9.a1) << "))"
1374 << "\n";
1375
1376 int64_t result = 0;
1377
1378 result += a0.a0;
1379 result += a0.a1;
1380 result += a1.a0;
1381 result += a1.a1;
1382 result += a2.a0;
1383 result += a2.a1;
1384 result += a3.a0;
1385 result += a3.a1;
1386 result += a4.a0;
1387 result += a4.a1;
1388 result += a5.a0;
1389 result += a5.a1;
1390 result += a6.a0;
1391 result += a6.a1;
1392 result += a7.a0;
1393 result += a7.a1;
1394 result += a8.a0;
1395 result += a8.a1;
1396 result += a9.a0;
1397 result += a9.a1;
1398
1399 std::cout << "result = " << result << "\n";
1400
1401 return result;
1402}
1403
1404// Used for testing structs and unions by value.
1405// Arguments in FPU registers on arm hardfp and arm64.
1406// Struct arguments will exhaust available registers, and leave some empty.
1407// The last argument is to test whether arguments are backfilled.
1415 std::cout << "PassStruct12BytesHomogeneousFloatx6"
1416 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << "), ("
1417 << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << "), (" << a2.a0
1418 << ", " << a2.a1 << ", " << a2.a2 << "), (" << a3.a0 << ", "
1419 << a3.a1 << ", " << a3.a2 << "), (" << a4.a0 << ", " << a4.a1
1420 << ", " << a4.a2 << "), (" << a5.a0 << ", " << a5.a1 << ", "
1421 << a5.a2 << "))"
1422 << "\n";
1423
1424 float result = 0;
1425
1426 result += a0.a0;
1427 result += a0.a1;
1428 result += a0.a2;
1429 result += a1.a0;
1430 result += a1.a1;
1431 result += a1.a2;
1432 result += a2.a0;
1433 result += a2.a1;
1434 result += a2.a2;
1435 result += a3.a0;
1436 result += a3.a1;
1437 result += a3.a2;
1438 result += a4.a0;
1439 result += a4.a1;
1440 result += a4.a2;
1441 result += a5.a0;
1442 result += a5.a1;
1443 result += a5.a2;
1444
1445 std::cout << "result = " << result << "\n";
1446
1447 return result;
1448}
1449
1450// Used for testing structs and unions by value.
1451// On Linux x64 argument is transferred on stack because it is over 16 bytes.
1452// Arguments in FPU registers on arm hardfp and arm64.
1453// 5 struct arguments will exhaust available registers.
1460 std::cout << "PassStruct16BytesHomogeneousFloatx5"
1461 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
1462 << "), (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", "
1463 << a1.a3 << "), (" << a2.a0 << ", " << a2.a1 << ", " << a2.a2
1464 << ", " << a2.a3 << "), (" << a3.a0 << ", " << a3.a1 << ", "
1465 << a3.a2 << ", " << a3.a3 << "), (" << a4.a0 << ", " << a4.a1
1466 << ", " << a4.a2 << ", " << a4.a3 << "))"
1467 << "\n";
1468
1469 float result = 0;
1470
1471 result += a0.a0;
1472 result += a0.a1;
1473 result += a0.a2;
1474 result += a0.a3;
1475 result += a1.a0;
1476 result += a1.a1;
1477 result += a1.a2;
1478 result += a1.a3;
1479 result += a2.a0;
1480 result += a2.a1;
1481 result += a2.a2;
1482 result += a2.a3;
1483 result += a3.a0;
1484 result += a3.a1;
1485 result += a3.a2;
1486 result += a3.a3;
1487 result += a4.a0;
1488 result += a4.a1;
1489 result += a4.a2;
1490 result += a4.a3;
1491
1492 std::cout << "result = " << result << "\n";
1493
1494 return result;
1495}
1496
1497// Used for testing structs and unions by value.
1498// On x64, arguments are split over FP and int registers.
1499// On x64, it will exhaust the integer registers with the 6th argument.
1500// The rest goes on the stack.
1501// On arm, arguments are 8 byte aligned.
1511 Struct16BytesMixed a9) {
1512 std::cout << "PassStruct16BytesMixedx10"
1513 << "((" << a0.a0 << ", " << a0.a1 << "), (" << a1.a0 << ", "
1514 << a1.a1 << "), (" << a2.a0 << ", " << a2.a1 << "), (" << a3.a0
1515 << ", " << a3.a1 << "), (" << a4.a0 << ", " << a4.a1 << "), ("
1516 << a5.a0 << ", " << a5.a1 << "), (" << a6.a0 << ", " << a6.a1
1517 << "), (" << a7.a0 << ", " << a7.a1 << "), (" << a8.a0 << ", "
1518 << a8.a1 << "), (" << a9.a0 << ", " << a9.a1 << "))"
1519 << "\n";
1520
1521 double result = 0;
1522
1523 result += a0.a0;
1524 result += a0.a1;
1525 result += a1.a0;
1526 result += a1.a1;
1527 result += a2.a0;
1528 result += a2.a1;
1529 result += a3.a0;
1530 result += a3.a1;
1531 result += a4.a0;
1532 result += a4.a1;
1533 result += a5.a0;
1534 result += a5.a1;
1535 result += a6.a0;
1536 result += a6.a1;
1537 result += a7.a0;
1538 result += a7.a1;
1539 result += a8.a0;
1540 result += a8.a1;
1541 result += a9.a0;
1542 result += a9.a1;
1543
1544 std::cout << "result = " << result << "\n";
1545
1546 return result;
1547}
1548
1549// Used for testing structs and unions by value.
1550// On x64, arguments are split over FP and int registers.
1551// On x64, it will exhaust the integer registers with the 6th argument.
1552// The rest goes on the stack.
1553// On arm, arguments are 4 byte aligned.
1564 std::cout << "PassStruct16BytesMixed2x10"
1565 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
1566 << "), (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", "
1567 << a1.a3 << "), (" << a2.a0 << ", " << a2.a1 << ", " << a2.a2
1568 << ", " << a2.a3 << "), (" << a3.a0 << ", " << a3.a1 << ", "
1569 << a3.a2 << ", " << a3.a3 << "), (" << a4.a0 << ", " << a4.a1
1570 << ", " << a4.a2 << ", " << a4.a3 << "), (" << a5.a0 << ", "
1571 << a5.a1 << ", " << a5.a2 << ", " << a5.a3 << "), (" << a6.a0
1572 << ", " << a6.a1 << ", " << a6.a2 << ", " << a6.a3 << "), ("
1573 << a7.a0 << ", " << a7.a1 << ", " << a7.a2 << ", " << a7.a3
1574 << "), (" << a8.a0 << ", " << a8.a1 << ", " << a8.a2 << ", "
1575 << a8.a3 << "), (" << a9.a0 << ", " << a9.a1 << ", " << a9.a2
1576 << ", " << a9.a3 << "))"
1577 << "\n";
1578
1579 float result = 0;
1580
1581 result += a0.a0;
1582 result += a0.a1;
1583 result += a0.a2;
1584 result += a0.a3;
1585 result += a1.a0;
1586 result += a1.a1;
1587 result += a1.a2;
1588 result += a1.a3;
1589 result += a2.a0;
1590 result += a2.a1;
1591 result += a2.a2;
1592 result += a2.a3;
1593 result += a3.a0;
1594 result += a3.a1;
1595 result += a3.a2;
1596 result += a3.a3;
1597 result += a4.a0;
1598 result += a4.a1;
1599 result += a4.a2;
1600 result += a4.a3;
1601 result += a5.a0;
1602 result += a5.a1;
1603 result += a5.a2;
1604 result += a5.a3;
1605 result += a6.a0;
1606 result += a6.a1;
1607 result += a6.a2;
1608 result += a6.a3;
1609 result += a7.a0;
1610 result += a7.a1;
1611 result += a7.a2;
1612 result += a7.a3;
1613 result += a8.a0;
1614 result += a8.a1;
1615 result += a8.a2;
1616 result += a8.a3;
1617 result += a9.a0;
1618 result += a9.a1;
1619 result += a9.a2;
1620 result += a9.a3;
1621
1622 std::cout << "result = " << result << "\n";
1623
1624 return result;
1625}
1626
1627// Used for testing structs and unions by value.
1628// Arguments are passed as pointer to copy on arm64.
1629// Tests that the memory allocated for copies are rounded up to word size.
1639 Struct17BytesInt a9) {
1640 std::cout << "PassStruct17BytesIntx10"
1641 << "((" << a0.a0 << ", " << a0.a1 << ", " << static_cast<int>(a0.a2)
1642 << "), (" << a1.a0 << ", " << a1.a1 << ", "
1643 << static_cast<int>(a1.a2) << "), (" << a2.a0 << ", " << a2.a1
1644 << ", " << static_cast<int>(a2.a2) << "), (" << a3.a0 << ", "
1645 << a3.a1 << ", " << static_cast<int>(a3.a2) << "), (" << a4.a0
1646 << ", " << a4.a1 << ", " << static_cast<int>(a4.a2) << "), ("
1647 << a5.a0 << ", " << a5.a1 << ", " << static_cast<int>(a5.a2)
1648 << "), (" << a6.a0 << ", " << a6.a1 << ", "
1649 << static_cast<int>(a6.a2) << "), (" << a7.a0 << ", " << a7.a1
1650 << ", " << static_cast<int>(a7.a2) << "), (" << a8.a0 << ", "
1651 << a8.a1 << ", " << static_cast<int>(a8.a2) << "), (" << a9.a0
1652 << ", " << a9.a1 << ", " << static_cast<int>(a9.a2) << "))"
1653 << "\n";
1654
1655 int64_t result = 0;
1656
1657 result += a0.a0;
1658 result += a0.a1;
1659 result += a0.a2;
1660 result += a1.a0;
1661 result += a1.a1;
1662 result += a1.a2;
1663 result += a2.a0;
1664 result += a2.a1;
1665 result += a2.a2;
1666 result += a3.a0;
1667 result += a3.a1;
1668 result += a3.a2;
1669 result += a4.a0;
1670 result += a4.a1;
1671 result += a4.a2;
1672 result += a5.a0;
1673 result += a5.a1;
1674 result += a5.a2;
1675 result += a6.a0;
1676 result += a6.a1;
1677 result += a6.a2;
1678 result += a7.a0;
1679 result += a7.a1;
1680 result += a7.a2;
1681 result += a8.a0;
1682 result += a8.a1;
1683 result += a8.a2;
1684 result += a9.a0;
1685 result += a9.a1;
1686 result += a9.a2;
1687
1688 std::cout << "result = " << result << "\n";
1689
1690 return result;
1691}
1692
1693// Used for testing structs and unions by value.
1694// The minimum alignment of this struct is only 1 byte based on its fields.
1695// Test that the memory backing these structs is extended to the right size.
1696//
1697DART_EXPORT int64_t
1708 std::cout
1709 << "PassStruct19BytesHomogeneousUint8x10"
1710 << "((" << static_cast<int>(a0.a0) << ", " << static_cast<int>(a0.a1)
1711 << ", " << static_cast<int>(a0.a2) << ", " << static_cast<int>(a0.a3)
1712 << ", " << static_cast<int>(a0.a4) << ", " << static_cast<int>(a0.a5)
1713 << ", " << static_cast<int>(a0.a6) << ", " << static_cast<int>(a0.a7)
1714 << ", " << static_cast<int>(a0.a8) << ", " << static_cast<int>(a0.a9)
1715 << ", " << static_cast<int>(a0.a10) << ", " << static_cast<int>(a0.a11)
1716 << ", " << static_cast<int>(a0.a12) << ", " << static_cast<int>(a0.a13)
1717 << ", " << static_cast<int>(a0.a14) << ", " << static_cast<int>(a0.a15)
1718 << ", " << static_cast<int>(a0.a16) << ", " << static_cast<int>(a0.a17)
1719 << ", " << static_cast<int>(a0.a18) << "), (" << static_cast<int>(a1.a0)
1720 << ", " << static_cast<int>(a1.a1) << ", " << static_cast<int>(a1.a2)
1721 << ", " << static_cast<int>(a1.a3) << ", " << static_cast<int>(a1.a4)
1722 << ", " << static_cast<int>(a1.a5) << ", " << static_cast<int>(a1.a6)
1723 << ", " << static_cast<int>(a1.a7) << ", " << static_cast<int>(a1.a8)
1724 << ", " << static_cast<int>(a1.a9) << ", " << static_cast<int>(a1.a10)
1725 << ", " << static_cast<int>(a1.a11) << ", " << static_cast<int>(a1.a12)
1726 << ", " << static_cast<int>(a1.a13) << ", " << static_cast<int>(a1.a14)
1727 << ", " << static_cast<int>(a1.a15) << ", " << static_cast<int>(a1.a16)
1728 << ", " << static_cast<int>(a1.a17) << ", " << static_cast<int>(a1.a18)
1729 << "), (" << static_cast<int>(a2.a0) << ", " << static_cast<int>(a2.a1)
1730 << ", " << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3)
1731 << ", " << static_cast<int>(a2.a4) << ", " << static_cast<int>(a2.a5)
1732 << ", " << static_cast<int>(a2.a6) << ", " << static_cast<int>(a2.a7)
1733 << ", " << static_cast<int>(a2.a8) << ", " << static_cast<int>(a2.a9)
1734 << ", " << static_cast<int>(a2.a10) << ", " << static_cast<int>(a2.a11)
1735 << ", " << static_cast<int>(a2.a12) << ", " << static_cast<int>(a2.a13)
1736 << ", " << static_cast<int>(a2.a14) << ", " << static_cast<int>(a2.a15)
1737 << ", " << static_cast<int>(a2.a16) << ", " << static_cast<int>(a2.a17)
1738 << ", " << static_cast<int>(a2.a18) << "), (" << static_cast<int>(a3.a0)
1739 << ", " << static_cast<int>(a3.a1) << ", " << static_cast<int>(a3.a2)
1740 << ", " << static_cast<int>(a3.a3) << ", " << static_cast<int>(a3.a4)
1741 << ", " << static_cast<int>(a3.a5) << ", " << static_cast<int>(a3.a6)
1742 << ", " << static_cast<int>(a3.a7) << ", " << static_cast<int>(a3.a8)
1743 << ", " << static_cast<int>(a3.a9) << ", " << static_cast<int>(a3.a10)
1744 << ", " << static_cast<int>(a3.a11) << ", " << static_cast<int>(a3.a12)
1745 << ", " << static_cast<int>(a3.a13) << ", " << static_cast<int>(a3.a14)
1746 << ", " << static_cast<int>(a3.a15) << ", " << static_cast<int>(a3.a16)
1747 << ", " << static_cast<int>(a3.a17) << ", " << static_cast<int>(a3.a18)
1748 << "), (" << static_cast<int>(a4.a0) << ", " << static_cast<int>(a4.a1)
1749 << ", " << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3)
1750 << ", " << static_cast<int>(a4.a4) << ", " << static_cast<int>(a4.a5)
1751 << ", " << static_cast<int>(a4.a6) << ", " << static_cast<int>(a4.a7)
1752 << ", " << static_cast<int>(a4.a8) << ", " << static_cast<int>(a4.a9)
1753 << ", " << static_cast<int>(a4.a10) << ", " << static_cast<int>(a4.a11)
1754 << ", " << static_cast<int>(a4.a12) << ", " << static_cast<int>(a4.a13)
1755 << ", " << static_cast<int>(a4.a14) << ", " << static_cast<int>(a4.a15)
1756 << ", " << static_cast<int>(a4.a16) << ", " << static_cast<int>(a4.a17)
1757 << ", " << static_cast<int>(a4.a18) << "), (" << static_cast<int>(a5.a0)
1758 << ", " << static_cast<int>(a5.a1) << ", " << static_cast<int>(a5.a2)
1759 << ", " << static_cast<int>(a5.a3) << ", " << static_cast<int>(a5.a4)
1760 << ", " << static_cast<int>(a5.a5) << ", " << static_cast<int>(a5.a6)
1761 << ", " << static_cast<int>(a5.a7) << ", " << static_cast<int>(a5.a8)
1762 << ", " << static_cast<int>(a5.a9) << ", " << static_cast<int>(a5.a10)
1763 << ", " << static_cast<int>(a5.a11) << ", " << static_cast<int>(a5.a12)
1764 << ", " << static_cast<int>(a5.a13) << ", " << static_cast<int>(a5.a14)
1765 << ", " << static_cast<int>(a5.a15) << ", " << static_cast<int>(a5.a16)
1766 << ", " << static_cast<int>(a5.a17) << ", " << static_cast<int>(a5.a18)
1767 << "), (" << static_cast<int>(a6.a0) << ", " << static_cast<int>(a6.a1)
1768 << ", " << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3)
1769 << ", " << static_cast<int>(a6.a4) << ", " << static_cast<int>(a6.a5)
1770 << ", " << static_cast<int>(a6.a6) << ", " << static_cast<int>(a6.a7)
1771 << ", " << static_cast<int>(a6.a8) << ", " << static_cast<int>(a6.a9)
1772 << ", " << static_cast<int>(a6.a10) << ", " << static_cast<int>(a6.a11)
1773 << ", " << static_cast<int>(a6.a12) << ", " << static_cast<int>(a6.a13)
1774 << ", " << static_cast<int>(a6.a14) << ", " << static_cast<int>(a6.a15)
1775 << ", " << static_cast<int>(a6.a16) << ", " << static_cast<int>(a6.a17)
1776 << ", " << static_cast<int>(a6.a18) << "), (" << static_cast<int>(a7.a0)
1777 << ", " << static_cast<int>(a7.a1) << ", " << static_cast<int>(a7.a2)
1778 << ", " << static_cast<int>(a7.a3) << ", " << static_cast<int>(a7.a4)
1779 << ", " << static_cast<int>(a7.a5) << ", " << static_cast<int>(a7.a6)
1780 << ", " << static_cast<int>(a7.a7) << ", " << static_cast<int>(a7.a8)
1781 << ", " << static_cast<int>(a7.a9) << ", " << static_cast<int>(a7.a10)
1782 << ", " << static_cast<int>(a7.a11) << ", " << static_cast<int>(a7.a12)
1783 << ", " << static_cast<int>(a7.a13) << ", " << static_cast<int>(a7.a14)
1784 << ", " << static_cast<int>(a7.a15) << ", " << static_cast<int>(a7.a16)
1785 << ", " << static_cast<int>(a7.a17) << ", " << static_cast<int>(a7.a18)
1786 << "), (" << static_cast<int>(a8.a0) << ", " << static_cast<int>(a8.a1)
1787 << ", " << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3)
1788 << ", " << static_cast<int>(a8.a4) << ", " << static_cast<int>(a8.a5)
1789 << ", " << static_cast<int>(a8.a6) << ", " << static_cast<int>(a8.a7)
1790 << ", " << static_cast<int>(a8.a8) << ", " << static_cast<int>(a8.a9)
1791 << ", " << static_cast<int>(a8.a10) << ", " << static_cast<int>(a8.a11)
1792 << ", " << static_cast<int>(a8.a12) << ", " << static_cast<int>(a8.a13)
1793 << ", " << static_cast<int>(a8.a14) << ", " << static_cast<int>(a8.a15)
1794 << ", " << static_cast<int>(a8.a16) << ", " << static_cast<int>(a8.a17)
1795 << ", " << static_cast<int>(a8.a18) << "), (" << static_cast<int>(a9.a0)
1796 << ", " << static_cast<int>(a9.a1) << ", " << static_cast<int>(a9.a2)
1797 << ", " << static_cast<int>(a9.a3) << ", " << static_cast<int>(a9.a4)
1798 << ", " << static_cast<int>(a9.a5) << ", " << static_cast<int>(a9.a6)
1799 << ", " << static_cast<int>(a9.a7) << ", " << static_cast<int>(a9.a8)
1800 << ", " << static_cast<int>(a9.a9) << ", " << static_cast<int>(a9.a10)
1801 << ", " << static_cast<int>(a9.a11) << ", " << static_cast<int>(a9.a12)
1802 << ", " << static_cast<int>(a9.a13) << ", " << static_cast<int>(a9.a14)
1803 << ", " << static_cast<int>(a9.a15) << ", " << static_cast<int>(a9.a16)
1804 << ", " << static_cast<int>(a9.a17) << ", " << static_cast<int>(a9.a18)
1805 << "))"
1806 << "\n";
1807
1808 int64_t result = 0;
1809
1810 result += a0.a0;
1811 result += a0.a1;
1812 result += a0.a2;
1813 result += a0.a3;
1814 result += a0.a4;
1815 result += a0.a5;
1816 result += a0.a6;
1817 result += a0.a7;
1818 result += a0.a8;
1819 result += a0.a9;
1820 result += a0.a10;
1821 result += a0.a11;
1822 result += a0.a12;
1823 result += a0.a13;
1824 result += a0.a14;
1825 result += a0.a15;
1826 result += a0.a16;
1827 result += a0.a17;
1828 result += a0.a18;
1829 result += a1.a0;
1830 result += a1.a1;
1831 result += a1.a2;
1832 result += a1.a3;
1833 result += a1.a4;
1834 result += a1.a5;
1835 result += a1.a6;
1836 result += a1.a7;
1837 result += a1.a8;
1838 result += a1.a9;
1839 result += a1.a10;
1840 result += a1.a11;
1841 result += a1.a12;
1842 result += a1.a13;
1843 result += a1.a14;
1844 result += a1.a15;
1845 result += a1.a16;
1846 result += a1.a17;
1847 result += a1.a18;
1848 result += a2.a0;
1849 result += a2.a1;
1850 result += a2.a2;
1851 result += a2.a3;
1852 result += a2.a4;
1853 result += a2.a5;
1854 result += a2.a6;
1855 result += a2.a7;
1856 result += a2.a8;
1857 result += a2.a9;
1858 result += a2.a10;
1859 result += a2.a11;
1860 result += a2.a12;
1861 result += a2.a13;
1862 result += a2.a14;
1863 result += a2.a15;
1864 result += a2.a16;
1865 result += a2.a17;
1866 result += a2.a18;
1867 result += a3.a0;
1868 result += a3.a1;
1869 result += a3.a2;
1870 result += a3.a3;
1871 result += a3.a4;
1872 result += a3.a5;
1873 result += a3.a6;
1874 result += a3.a7;
1875 result += a3.a8;
1876 result += a3.a9;
1877 result += a3.a10;
1878 result += a3.a11;
1879 result += a3.a12;
1880 result += a3.a13;
1881 result += a3.a14;
1882 result += a3.a15;
1883 result += a3.a16;
1884 result += a3.a17;
1885 result += a3.a18;
1886 result += a4.a0;
1887 result += a4.a1;
1888 result += a4.a2;
1889 result += a4.a3;
1890 result += a4.a4;
1891 result += a4.a5;
1892 result += a4.a6;
1893 result += a4.a7;
1894 result += a4.a8;
1895 result += a4.a9;
1896 result += a4.a10;
1897 result += a4.a11;
1898 result += a4.a12;
1899 result += a4.a13;
1900 result += a4.a14;
1901 result += a4.a15;
1902 result += a4.a16;
1903 result += a4.a17;
1904 result += a4.a18;
1905 result += a5.a0;
1906 result += a5.a1;
1907 result += a5.a2;
1908 result += a5.a3;
1909 result += a5.a4;
1910 result += a5.a5;
1911 result += a5.a6;
1912 result += a5.a7;
1913 result += a5.a8;
1914 result += a5.a9;
1915 result += a5.a10;
1916 result += a5.a11;
1917 result += a5.a12;
1918 result += a5.a13;
1919 result += a5.a14;
1920 result += a5.a15;
1921 result += a5.a16;
1922 result += a5.a17;
1923 result += a5.a18;
1924 result += a6.a0;
1925 result += a6.a1;
1926 result += a6.a2;
1927 result += a6.a3;
1928 result += a6.a4;
1929 result += a6.a5;
1930 result += a6.a6;
1931 result += a6.a7;
1932 result += a6.a8;
1933 result += a6.a9;
1934 result += a6.a10;
1935 result += a6.a11;
1936 result += a6.a12;
1937 result += a6.a13;
1938 result += a6.a14;
1939 result += a6.a15;
1940 result += a6.a16;
1941 result += a6.a17;
1942 result += a6.a18;
1943 result += a7.a0;
1944 result += a7.a1;
1945 result += a7.a2;
1946 result += a7.a3;
1947 result += a7.a4;
1948 result += a7.a5;
1949 result += a7.a6;
1950 result += a7.a7;
1951 result += a7.a8;
1952 result += a7.a9;
1953 result += a7.a10;
1954 result += a7.a11;
1955 result += a7.a12;
1956 result += a7.a13;
1957 result += a7.a14;
1958 result += a7.a15;
1959 result += a7.a16;
1960 result += a7.a17;
1961 result += a7.a18;
1962 result += a8.a0;
1963 result += a8.a1;
1964 result += a8.a2;
1965 result += a8.a3;
1966 result += a8.a4;
1967 result += a8.a5;
1968 result += a8.a6;
1969 result += a8.a7;
1970 result += a8.a8;
1971 result += a8.a9;
1972 result += a8.a10;
1973 result += a8.a11;
1974 result += a8.a12;
1975 result += a8.a13;
1976 result += a8.a14;
1977 result += a8.a15;
1978 result += a8.a16;
1979 result += a8.a17;
1980 result += a8.a18;
1981 result += a9.a0;
1982 result += a9.a1;
1983 result += a9.a2;
1984 result += a9.a3;
1985 result += a9.a4;
1986 result += a9.a5;
1987 result += a9.a6;
1988 result += a9.a7;
1989 result += a9.a8;
1990 result += a9.a9;
1991 result += a9.a10;
1992 result += a9.a11;
1993 result += a9.a12;
1994 result += a9.a13;
1995 result += a9.a14;
1996 result += a9.a15;
1997 result += a9.a16;
1998 result += a9.a17;
1999 result += a9.a18;
2000
2001 std::cout << "result = " << result << "\n";
2002
2003 return result;
2004}
2005
2006// Used for testing structs and unions by value.
2007// Argument too big to go into integer registers on arm64.
2008// The arguments are passed as pointers to copies.
2009// The amount of arguments exhausts the number of integer registers, such that
2010// pointers to copies are also passed on the stack.
2011DART_EXPORT int32_t
2022 std::cout << "PassStruct20BytesHomogeneousInt32x10"
2023 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
2024 << ", " << a0.a4 << "), (" << a1.a0 << ", " << a1.a1 << ", "
2025 << a1.a2 << ", " << a1.a3 << ", " << a1.a4 << "), (" << a2.a0
2026 << ", " << a2.a1 << ", " << a2.a2 << ", " << a2.a3 << ", " << a2.a4
2027 << "), (" << a3.a0 << ", " << a3.a1 << ", " << a3.a2 << ", "
2028 << a3.a3 << ", " << a3.a4 << "), (" << a4.a0 << ", " << a4.a1
2029 << ", " << a4.a2 << ", " << a4.a3 << ", " << a4.a4 << "), ("
2030 << a5.a0 << ", " << a5.a1 << ", " << a5.a2 << ", " << a5.a3 << ", "
2031 << a5.a4 << "), (" << a6.a0 << ", " << a6.a1 << ", " << a6.a2
2032 << ", " << a6.a3 << ", " << a6.a4 << "), (" << a7.a0 << ", "
2033 << a7.a1 << ", " << a7.a2 << ", " << a7.a3 << ", " << a7.a4
2034 << "), (" << a8.a0 << ", " << a8.a1 << ", " << a8.a2 << ", "
2035 << a8.a3 << ", " << a8.a4 << "), (" << a9.a0 << ", " << a9.a1
2036 << ", " << a9.a2 << ", " << a9.a3 << ", " << a9.a4 << "))"
2037 << "\n";
2038
2039 int32_t result = 0;
2040
2041 result += a0.a0;
2042 result += a0.a1;
2043 result += a0.a2;
2044 result += a0.a3;
2045 result += a0.a4;
2046 result += a1.a0;
2047 result += a1.a1;
2048 result += a1.a2;
2049 result += a1.a3;
2050 result += a1.a4;
2051 result += a2.a0;
2052 result += a2.a1;
2053 result += a2.a2;
2054 result += a2.a3;
2055 result += a2.a4;
2056 result += a3.a0;
2057 result += a3.a1;
2058 result += a3.a2;
2059 result += a3.a3;
2060 result += a3.a4;
2061 result += a4.a0;
2062 result += a4.a1;
2063 result += a4.a2;
2064 result += a4.a3;
2065 result += a4.a4;
2066 result += a5.a0;
2067 result += a5.a1;
2068 result += a5.a2;
2069 result += a5.a3;
2070 result += a5.a4;
2071 result += a6.a0;
2072 result += a6.a1;
2073 result += a6.a2;
2074 result += a6.a3;
2075 result += a6.a4;
2076 result += a7.a0;
2077 result += a7.a1;
2078 result += a7.a2;
2079 result += a7.a3;
2080 result += a7.a4;
2081 result += a8.a0;
2082 result += a8.a1;
2083 result += a8.a2;
2084 result += a8.a3;
2085 result += a8.a4;
2086 result += a9.a0;
2087 result += a9.a1;
2088 result += a9.a2;
2089 result += a9.a3;
2090 result += a9.a4;
2091
2092 std::cout << "result = " << result << "\n";
2093
2094 return result;
2095}
2096
2097// Used for testing structs and unions by value.
2098// Argument too big to go into FPU registers in hardfp and arm64.
2101 std::cout << "PassStruct20BytesHomogeneousFloat"
2102 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
2103 << ", " << a0.a4 << "))"
2104 << "\n";
2105
2106 float result = 0;
2107
2108 result += a0.a0;
2109 result += a0.a1;
2110 result += a0.a2;
2111 result += a0.a3;
2112 result += a0.a4;
2113
2114 std::cout << "result = " << result << "\n";
2115
2116 return result;
2117}
2118
2119// Used for testing structs and unions by value.
2120// Arguments in FPU registers on arm64.
2121// 5 struct arguments will exhaust available registers.
2128 std::cout << "PassStruct32BytesHomogeneousDoublex5"
2129 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
2130 << "), (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", "
2131 << a1.a3 << "), (" << a2.a0 << ", " << a2.a1 << ", " << a2.a2
2132 << ", " << a2.a3 << "), (" << a3.a0 << ", " << a3.a1 << ", "
2133 << a3.a2 << ", " << a3.a3 << "), (" << a4.a0 << ", " << a4.a1
2134 << ", " << a4.a2 << ", " << a4.a3 << "))"
2135 << "\n";
2136
2137 double result = 0;
2138
2139 result += a0.a0;
2140 result += a0.a1;
2141 result += a0.a2;
2142 result += a0.a3;
2143 result += a1.a0;
2144 result += a1.a1;
2145 result += a1.a2;
2146 result += a1.a3;
2147 result += a2.a0;
2148 result += a2.a1;
2149 result += a2.a2;
2150 result += a2.a3;
2151 result += a3.a0;
2152 result += a3.a1;
2153 result += a3.a2;
2154 result += a3.a3;
2155 result += a4.a0;
2156 result += a4.a1;
2157 result += a4.a2;
2158 result += a4.a3;
2159
2160 std::cout << "result = " << result << "\n";
2161
2162 return result;
2163}
2164
2165// Used for testing structs and unions by value.
2166// Argument too big to go into FPU registers in arm64.
2169 std::cout << "PassStruct40BytesHomogeneousDouble"
2170 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
2171 << ", " << a0.a4 << "))"
2172 << "\n";
2173
2174 double result = 0;
2175
2176 result += a0.a0;
2177 result += a0.a1;
2178 result += a0.a2;
2179 result += a0.a3;
2180 result += a0.a4;
2181
2182 std::cout << "result = " << result << "\n";
2183
2184 return result;
2185}
2186
2187// Used for testing structs and unions by value.
2188// Test 1kb struct.
2189DART_EXPORT uint64_t
2191 std::cout << "PassStruct1024BytesHomogeneousUint64"
2192 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
2193 << ", " << a0.a4 << ", " << a0.a5 << ", " << a0.a6 << ", " << a0.a7
2194 << ", " << a0.a8 << ", " << a0.a9 << ", " << a0.a10 << ", "
2195 << a0.a11 << ", " << a0.a12 << ", " << a0.a13 << ", " << a0.a14
2196 << ", " << a0.a15 << ", " << a0.a16 << ", " << a0.a17 << ", "
2197 << a0.a18 << ", " << a0.a19 << ", " << a0.a20 << ", " << a0.a21
2198 << ", " << a0.a22 << ", " << a0.a23 << ", " << a0.a24 << ", "
2199 << a0.a25 << ", " << a0.a26 << ", " << a0.a27 << ", " << a0.a28
2200 << ", " << a0.a29 << ", " << a0.a30 << ", " << a0.a31 << ", "
2201 << a0.a32 << ", " << a0.a33 << ", " << a0.a34 << ", " << a0.a35
2202 << ", " << a0.a36 << ", " << a0.a37 << ", " << a0.a38 << ", "
2203 << a0.a39 << ", " << a0.a40 << ", " << a0.a41 << ", " << a0.a42
2204 << ", " << a0.a43 << ", " << a0.a44 << ", " << a0.a45 << ", "
2205 << a0.a46 << ", " << a0.a47 << ", " << a0.a48 << ", " << a0.a49
2206 << ", " << a0.a50 << ", " << a0.a51 << ", " << a0.a52 << ", "
2207 << a0.a53 << ", " << a0.a54 << ", " << a0.a55 << ", " << a0.a56
2208 << ", " << a0.a57 << ", " << a0.a58 << ", " << a0.a59 << ", "
2209 << a0.a60 << ", " << a0.a61 << ", " << a0.a62 << ", " << a0.a63
2210 << ", " << a0.a64 << ", " << a0.a65 << ", " << a0.a66 << ", "
2211 << a0.a67 << ", " << a0.a68 << ", " << a0.a69 << ", " << a0.a70
2212 << ", " << a0.a71 << ", " << a0.a72 << ", " << a0.a73 << ", "
2213 << a0.a74 << ", " << a0.a75 << ", " << a0.a76 << ", " << a0.a77
2214 << ", " << a0.a78 << ", " << a0.a79 << ", " << a0.a80 << ", "
2215 << a0.a81 << ", " << a0.a82 << ", " << a0.a83 << ", " << a0.a84
2216 << ", " << a0.a85 << ", " << a0.a86 << ", " << a0.a87 << ", "
2217 << a0.a88 << ", " << a0.a89 << ", " << a0.a90 << ", " << a0.a91
2218 << ", " << a0.a92 << ", " << a0.a93 << ", " << a0.a94 << ", "
2219 << a0.a95 << ", " << a0.a96 << ", " << a0.a97 << ", " << a0.a98
2220 << ", " << a0.a99 << ", " << a0.a100 << ", " << a0.a101 << ", "
2221 << a0.a102 << ", " << a0.a103 << ", " << a0.a104 << ", " << a0.a105
2222 << ", " << a0.a106 << ", " << a0.a107 << ", " << a0.a108 << ", "
2223 << a0.a109 << ", " << a0.a110 << ", " << a0.a111 << ", " << a0.a112
2224 << ", " << a0.a113 << ", " << a0.a114 << ", " << a0.a115 << ", "
2225 << a0.a116 << ", " << a0.a117 << ", " << a0.a118 << ", " << a0.a119
2226 << ", " << a0.a120 << ", " << a0.a121 << ", " << a0.a122 << ", "
2227 << a0.a123 << ", " << a0.a124 << ", " << a0.a125 << ", " << a0.a126
2228 << ", " << a0.a127 << "))"
2229 << "\n";
2230
2231 uint64_t result = 0;
2232
2233 result += a0.a0;
2234 result += a0.a1;
2235 result += a0.a2;
2236 result += a0.a3;
2237 result += a0.a4;
2238 result += a0.a5;
2239 result += a0.a6;
2240 result += a0.a7;
2241 result += a0.a8;
2242 result += a0.a9;
2243 result += a0.a10;
2244 result += a0.a11;
2245 result += a0.a12;
2246 result += a0.a13;
2247 result += a0.a14;
2248 result += a0.a15;
2249 result += a0.a16;
2250 result += a0.a17;
2251 result += a0.a18;
2252 result += a0.a19;
2253 result += a0.a20;
2254 result += a0.a21;
2255 result += a0.a22;
2256 result += a0.a23;
2257 result += a0.a24;
2258 result += a0.a25;
2259 result += a0.a26;
2260 result += a0.a27;
2261 result += a0.a28;
2262 result += a0.a29;
2263 result += a0.a30;
2264 result += a0.a31;
2265 result += a0.a32;
2266 result += a0.a33;
2267 result += a0.a34;
2268 result += a0.a35;
2269 result += a0.a36;
2270 result += a0.a37;
2271 result += a0.a38;
2272 result += a0.a39;
2273 result += a0.a40;
2274 result += a0.a41;
2275 result += a0.a42;
2276 result += a0.a43;
2277 result += a0.a44;
2278 result += a0.a45;
2279 result += a0.a46;
2280 result += a0.a47;
2281 result += a0.a48;
2282 result += a0.a49;
2283 result += a0.a50;
2284 result += a0.a51;
2285 result += a0.a52;
2286 result += a0.a53;
2287 result += a0.a54;
2288 result += a0.a55;
2289 result += a0.a56;
2290 result += a0.a57;
2291 result += a0.a58;
2292 result += a0.a59;
2293 result += a0.a60;
2294 result += a0.a61;
2295 result += a0.a62;
2296 result += a0.a63;
2297 result += a0.a64;
2298 result += a0.a65;
2299 result += a0.a66;
2300 result += a0.a67;
2301 result += a0.a68;
2302 result += a0.a69;
2303 result += a0.a70;
2304 result += a0.a71;
2305 result += a0.a72;
2306 result += a0.a73;
2307 result += a0.a74;
2308 result += a0.a75;
2309 result += a0.a76;
2310 result += a0.a77;
2311 result += a0.a78;
2312 result += a0.a79;
2313 result += a0.a80;
2314 result += a0.a81;
2315 result += a0.a82;
2316 result += a0.a83;
2317 result += a0.a84;
2318 result += a0.a85;
2319 result += a0.a86;
2320 result += a0.a87;
2321 result += a0.a88;
2322 result += a0.a89;
2323 result += a0.a90;
2324 result += a0.a91;
2325 result += a0.a92;
2326 result += a0.a93;
2327 result += a0.a94;
2328 result += a0.a95;
2329 result += a0.a96;
2330 result += a0.a97;
2331 result += a0.a98;
2332 result += a0.a99;
2333 result += a0.a100;
2334 result += a0.a101;
2335 result += a0.a102;
2336 result += a0.a103;
2337 result += a0.a104;
2338 result += a0.a105;
2339 result += a0.a106;
2340 result += a0.a107;
2341 result += a0.a108;
2342 result += a0.a109;
2343 result += a0.a110;
2344 result += a0.a111;
2345 result += a0.a112;
2346 result += a0.a113;
2347 result += a0.a114;
2348 result += a0.a115;
2349 result += a0.a116;
2350 result += a0.a117;
2351 result += a0.a118;
2352 result += a0.a119;
2353 result += a0.a120;
2354 result += a0.a121;
2355 result += a0.a122;
2356 result += a0.a123;
2357 result += a0.a124;
2358 result += a0.a125;
2359 result += a0.a126;
2360 result += a0.a127;
2361
2362 std::cout << "result = " << result << "\n";
2363
2364 return result;
2365}
2366
2367// Used for testing structs and unions by value.
2368// Tests the alignment of structs in FPU registers and backfilling.
2370 float a0,
2372 float a2,
2374 float a4,
2376 float a6,
2378 float a8) {
2379 std::cout << "PassFloatStruct16BytesHomogeneousFloatFloatStruct1"
2380 << "(" << a0 << ", (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2
2381 << ", " << a1.a3 << "), " << a2 << ", (" << a3.a0 << ", " << a3.a1
2382 << ", " << a3.a2 << ", " << a3.a3 << "), " << a4 << ", (" << a5.a0
2383 << ", " << a5.a1 << ", " << a5.a2 << ", " << a5.a3 << "), " << a6
2384 << ", (" << a7.a0 << ", " << a7.a1 << ", " << a7.a2 << ", " << a7.a3
2385 << "), " << a8 << ")"
2386 << "\n";
2387
2388 float result = 0;
2389
2390 result += a0;
2391 result += a1.a0;
2392 result += a1.a1;
2393 result += a1.a2;
2394 result += a1.a3;
2395 result += a2;
2396 result += a3.a0;
2397 result += a3.a1;
2398 result += a3.a2;
2399 result += a3.a3;
2400 result += a4;
2401 result += a5.a0;
2402 result += a5.a1;
2403 result += a5.a2;
2404 result += a5.a3;
2405 result += a6;
2406 result += a7.a0;
2407 result += a7.a1;
2408 result += a7.a2;
2409 result += a7.a3;
2410 result += a8;
2411
2412 std::cout << "result = " << result << "\n";
2413
2414 return result;
2415}
2416
2417// Used for testing structs and unions by value.
2418// Tests the alignment of structs in FPU registers and backfilling.
2420 float a0,
2422 float a2,
2424 float a4,
2426 float a6,
2428 float a8) {
2429 std::cout << "PassFloatStruct32BytesHomogeneousDoubleFloatStruct"
2430 << "(" << a0 << ", (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2
2431 << ", " << a1.a3 << "), " << a2 << ", (" << a3.a0 << ", " << a3.a1
2432 << ", " << a3.a2 << ", " << a3.a3 << "), " << a4 << ", (" << a5.a0
2433 << ", " << a5.a1 << ", " << a5.a2 << ", " << a5.a3 << "), " << a6
2434 << ", (" << a7.a0 << ", " << a7.a1 << ", " << a7.a2 << ", " << a7.a3
2435 << "), " << a8 << ")"
2436 << "\n";
2437
2438 double result = 0;
2439
2440 result += a0;
2441 result += a1.a0;
2442 result += a1.a1;
2443 result += a1.a2;
2444 result += a1.a3;
2445 result += a2;
2446 result += a3.a0;
2447 result += a3.a1;
2448 result += a3.a2;
2449 result += a3.a3;
2450 result += a4;
2451 result += a5.a0;
2452 result += a5.a1;
2453 result += a5.a2;
2454 result += a5.a3;
2455 result += a6;
2456 result += a7.a0;
2457 result += a7.a1;
2458 result += a7.a2;
2459 result += a7.a3;
2460 result += a8;
2461
2462 std::cout << "result = " << result << "\n";
2463
2464 return result;
2465}
2466
2467// Used for testing structs and unions by value.
2468// Tests the alignment of structs in integers registers and on the stack.
2469// Arm32 aligns this struct at 8.
2470// Also, arm32 allocates the second struct partially in registers, partially
2471// on stack.
2472// Test backfilling of integer registers.
2474 int8_t a0,
2476 int8_t a2,
2478 int8_t a4,
2480 int8_t a6,
2482 int8_t a8) {
2483 std::cout << "PassInt8Struct16BytesMixedInt8Struct16BytesMixedIn"
2484 << "(" << static_cast<int>(a0) << ", (" << a1.a0 << ", " << a1.a1
2485 << "), " << static_cast<int>(a2) << ", (" << a3.a0 << ", " << a3.a1
2486 << "), " << static_cast<int>(a4) << ", (" << a5.a0 << ", " << a5.a1
2487 << "), " << static_cast<int>(a6) << ", (" << a7.a0 << ", " << a7.a1
2488 << "), " << static_cast<int>(a8) << ")"
2489 << "\n";
2490
2491 double result = 0;
2492
2493 result += a0;
2494 result += a1.a0;
2495 result += a1.a1;
2496 result += a2;
2497 result += a3.a0;
2498 result += a3.a1;
2499 result += a4;
2500 result += a5.a0;
2501 result += a5.a1;
2502 result += a6;
2503 result += a7.a0;
2504 result += a7.a1;
2505 result += a8;
2506
2507 std::cout << "result = " << result << "\n";
2508
2509 return result;
2510}
2511
2512// Used for testing structs and unions by value.
2513// On Linux x64, it will exhaust xmm registers first, after 6 doubles and 2
2514// structs. The rest of the structs will go on the stack.
2515// The int will be backfilled into the int register.
2517 double a1,
2518 double a2,
2519 double a3,
2520 double a4,
2521 double a5,
2526 int32_t a10) {
2527 std::cout << "PassDoublex6Struct16BytesMixedx4Int32"
2528 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
2529 << ", " << a5 << ", (" << a6.a0 << ", " << a6.a1 << "), (" << a7.a0
2530 << ", " << a7.a1 << "), (" << a8.a0 << ", " << a8.a1 << "), ("
2531 << a9.a0 << ", " << a9.a1 << "), " << a10 << ")"
2532 << "\n";
2533
2534 double result = 0;
2535
2536 result += a0;
2537 result += a1;
2538 result += a2;
2539 result += a3;
2540 result += a4;
2541 result += a5;
2542 result += a6.a0;
2543 result += a6.a1;
2544 result += a7.a0;
2545 result += a7.a1;
2546 result += a8.a0;
2547 result += a8.a1;
2548 result += a9.a0;
2549 result += a9.a1;
2550 result += a10;
2551
2552 std::cout << "result = " << result << "\n";
2553
2554 return result;
2555}
2556
2557// Used for testing structs and unions by value.
2558// On Linux x64, it will exhaust int registers first.
2559// The rest of the structs will go on the stack.
2560// The double will be backfilled into the xmm register.
2562 int32_t a1,
2563 int32_t a2,
2564 int32_t a3,
2569 double a8) {
2570 std::cout << "PassInt32x4Struct16BytesMixedx4Double"
2571 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", ("
2572 << a4.a0 << ", " << a4.a1 << "), (" << a5.a0 << ", " << a5.a1
2573 << "), (" << a6.a0 << ", " << a6.a1 << "), (" << a7.a0 << ", "
2574 << a7.a1 << "), " << a8 << ")"
2575 << "\n";
2576
2577 double result = 0;
2578
2579 result += a0;
2580 result += a1;
2581 result += a2;
2582 result += a3;
2583 result += a4.a0;
2584 result += a4.a1;
2585 result += a5.a0;
2586 result += a5.a1;
2587 result += a6.a0;
2588 result += a6.a1;
2589 result += a7.a0;
2590 result += a7.a1;
2591 result += a8;
2592
2593 std::cout << "result = " << result << "\n";
2594
2595 return result;
2596}
2597
2598// Used for testing structs and unions by value.
2599// On various architectures, first struct is allocated on stack.
2600// Check that the other two arguments are allocated on registers.
2605 std::cout << "PassStruct40BytesHomogeneousDoubleStruct4BytesHomo"
2606 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
2607 << ", " << a0.a4 << "), (" << a1.a0 << ", " << a1.a1 << "), ("
2608 << a2.a0 << ", " << a2.a1 << "))"
2609 << "\n";
2610
2611 double result = 0;
2612
2613 result += a0.a0;
2614 result += a0.a1;
2615 result += a0.a2;
2616 result += a0.a3;
2617 result += a0.a4;
2618 result += a1.a0;
2619 result += a1.a1;
2620 result += a2.a0;
2621 result += a2.a1;
2622
2623 std::cout << "result = " << result << "\n";
2624
2625 return result;
2626}
2627
2628// Used for testing structs and unions by value.
2629// Test alignment and padding of 16 byte int within struct.
2631 int32_t a0,
2632 int32_t a1,
2633 int32_t a2,
2634 int32_t a3,
2635 int32_t a4,
2636 int32_t a5,
2637 int32_t a6,
2638 int32_t a7,
2639 double a8,
2640 double a9,
2641 double a10,
2642 double a11,
2643 double a12,
2644 double a13,
2645 double a14,
2646 double a15,
2647 int64_t a16,
2648 int8_t a17,
2649 Struct1ByteInt a18,
2650 int64_t a19,
2651 int8_t a20,
2653 int64_t a22,
2654 int8_t a23,
2655 Struct8BytesInt a24,
2656 int64_t a25,
2657 int8_t a26,
2659 int64_t a28,
2660 int8_t a29,
2662 int64_t a31,
2663 int8_t a32,
2665 int64_t a34,
2666 int8_t a35,
2668 int64_t a37,
2669 int8_t a38,
2671 std::cout << "PassInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int"
2672 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
2673 << ", " << a5 << ", " << a6 << ", " << a7 << ", " << a8 << ", "
2674 << a9 << ", " << a10 << ", " << a11 << ", " << a12 << ", " << a13
2675 << ", " << a14 << ", " << a15 << ", " << a16 << ", "
2676 << static_cast<int>(a17) << ", (" << static_cast<int>(a18.a0)
2677 << "), " << a19 << ", " << static_cast<int>(a20) << ", (" << a21.a0
2678 << ", " << a21.a1 << "), " << a22 << ", " << static_cast<int>(a23)
2679 << ", (" << a24.a0 << ", " << a24.a1 << ", " << a24.a2 << "), "
2680 << a25 << ", " << static_cast<int>(a26) << ", (" << a27.a0 << ", "
2681 << a27.a1 << "), " << a28 << ", " << static_cast<int>(a29) << ", ("
2682 << a30.a0 << ", " << a30.a1 << ", " << a30.a2 << "), " << a31
2683 << ", " << static_cast<int>(a32) << ", ("
2684 << static_cast<int>(a33.a0) << ", " << a33.a1 << ", "
2685 << static_cast<int>(a33.a2) << "), " << a34 << ", "
2686 << static_cast<int>(a35) << ", (" << static_cast<int>(a36.a0)
2687 << ", " << a36.a1 << ", " << static_cast<int>(a36.a2) << "), "
2688 << a37 << ", " << static_cast<int>(a38) << ", ("
2689 << static_cast<int>(a39.a0) << ", " << a39.a1 << ", "
2690 << static_cast<int>(a39.a2) << "))"
2691 << "\n";
2692
2693 double result = 0;
2694
2695 result += a0;
2696 result += a1;
2697 result += a2;
2698 result += a3;
2699 result += a4;
2700 result += a5;
2701 result += a6;
2702 result += a7;
2703 result += a8;
2704 result += a9;
2705 result += a10;
2706 result += a11;
2707 result += a12;
2708 result += a13;
2709 result += a14;
2710 result += a15;
2711 result += a16;
2712 result += a17;
2713 result += a18.a0;
2714 result += a19;
2715 result += a20;
2716 result += a21.a0;
2717 result += a21.a1;
2718 result += a22;
2719 result += a23;
2720 result += a24.a0;
2721 result += a24.a1;
2722 result += a24.a2;
2723 result += a25;
2724 result += a26;
2725 result += a27.a0;
2726 result += a27.a1;
2727 result += a28;
2728 result += a29;
2729 result += a30.a0;
2730 result += a30.a1;
2731 result += a30.a2;
2732 result += a31;
2733 result += a32;
2734 result += a33.a0;
2735 result += a33.a1;
2736 result += a33.a2;
2737 result += a34;
2738 result += a35;
2739 result += a36.a0;
2740 result += a36.a1;
2741 result += a36.a2;
2742 result += a37;
2743 result += a38;
2744 result += a39.a0;
2745 result += a39.a1;
2746 result += a39.a2;
2747
2748 std::cout << "result = " << result << "\n";
2749
2750 return result;
2751}
2752
2753// Used for testing structs and unions by value.
2754// Test alignment and padding of 16 byte int within struct.
2756 std::cout << "PassStructAlignmentInt16"
2757 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
2758 << static_cast<int>(a0.a2) << "))"
2759 << "\n";
2760
2761 int64_t result = 0;
2762
2763 result += a0.a0;
2764 result += a0.a1;
2765 result += a0.a2;
2766
2767 std::cout << "result = " << result << "\n";
2768
2769 return result;
2770}
2771
2772// Used for testing structs and unions by value.
2773// Test alignment and padding of 32 byte int within struct.
2775 std::cout << "PassStructAlignmentInt32"
2776 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
2777 << static_cast<int>(a0.a2) << "))"
2778 << "\n";
2779
2780 int64_t result = 0;
2781
2782 result += a0.a0;
2783 result += a0.a1;
2784 result += a0.a2;
2785
2786 std::cout << "result = " << result << "\n";
2787
2788 return result;
2789}
2790
2791// Used for testing structs and unions by value.
2792// Test alignment and padding of 64 byte int within struct.
2794 std::cout << "PassStructAlignmentInt64"
2795 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
2796 << static_cast<int>(a0.a2) << "))"
2797 << "\n";
2798
2799 int64_t result = 0;
2800
2801 result += a0.a0;
2802 result += a0.a1;
2803 result += a0.a2;
2804
2805 std::cout << "result = " << result << "\n";
2806
2807 return result;
2808}
2809
2810// Used for testing structs and unions by value.
2811// Simple nested struct. No alignment gaps on any architectures.
2812// 10 arguments exhaust registers on all platforms.
2823 std::cout << "PassStruct8BytesNestedIntx10"
2824 << "(((" << a0.a0.a0 << ", " << a0.a0.a1 << "), (" << a0.a1.a0
2825 << ", " << a0.a1.a1 << ")), ((" << a1.a0.a0 << ", " << a1.a0.a1
2826 << "), (" << a1.a1.a0 << ", " << a1.a1.a1 << ")), ((" << a2.a0.a0
2827 << ", " << a2.a0.a1 << "), (" << a2.a1.a0 << ", " << a2.a1.a1
2828 << ")), ((" << a3.a0.a0 << ", " << a3.a0.a1 << "), (" << a3.a1.a0
2829 << ", " << a3.a1.a1 << ")), ((" << a4.a0.a0 << ", " << a4.a0.a1
2830 << "), (" << a4.a1.a0 << ", " << a4.a1.a1 << ")), ((" << a5.a0.a0
2831 << ", " << a5.a0.a1 << "), (" << a5.a1.a0 << ", " << a5.a1.a1
2832 << ")), ((" << a6.a0.a0 << ", " << a6.a0.a1 << "), (" << a6.a1.a0
2833 << ", " << a6.a1.a1 << ")), ((" << a7.a0.a0 << ", " << a7.a0.a1
2834 << "), (" << a7.a1.a0 << ", " << a7.a1.a1 << ")), ((" << a8.a0.a0
2835 << ", " << a8.a0.a1 << "), (" << a8.a1.a0 << ", " << a8.a1.a1
2836 << ")), ((" << a9.a0.a0 << ", " << a9.a0.a1 << "), (" << a9.a1.a0
2837 << ", " << a9.a1.a1 << ")))"
2838 << "\n";
2839
2840 int64_t result = 0;
2841
2842 result += a0.a0.a0;
2843 result += a0.a0.a1;
2844 result += a0.a1.a0;
2845 result += a0.a1.a1;
2846 result += a1.a0.a0;
2847 result += a1.a0.a1;
2848 result += a1.a1.a0;
2849 result += a1.a1.a1;
2850 result += a2.a0.a0;
2851 result += a2.a0.a1;
2852 result += a2.a1.a0;
2853 result += a2.a1.a1;
2854 result += a3.a0.a0;
2855 result += a3.a0.a1;
2856 result += a3.a1.a0;
2857 result += a3.a1.a1;
2858 result += a4.a0.a0;
2859 result += a4.a0.a1;
2860 result += a4.a1.a0;
2861 result += a4.a1.a1;
2862 result += a5.a0.a0;
2863 result += a5.a0.a1;
2864 result += a5.a1.a0;
2865 result += a5.a1.a1;
2866 result += a6.a0.a0;
2867 result += a6.a0.a1;
2868 result += a6.a1.a0;
2869 result += a6.a1.a1;
2870 result += a7.a0.a0;
2871 result += a7.a0.a1;
2872 result += a7.a1.a0;
2873 result += a7.a1.a1;
2874 result += a8.a0.a0;
2875 result += a8.a0.a1;
2876 result += a8.a1.a0;
2877 result += a8.a1.a1;
2878 result += a9.a0.a0;
2879 result += a9.a0.a1;
2880 result += a9.a1.a0;
2881 result += a9.a1.a1;
2882
2883 std::cout << "result = " << result << "\n";
2884
2885 return result;
2886}
2887
2888// Used for testing structs and unions by value.
2889// Simple nested struct. No alignment gaps on any architectures.
2890// 10 arguments exhaust fpu registers on all platforms.
2901 std::cout << "PassStruct8BytesNestedFloatx10"
2902 << "(((" << a0.a0.a0 << "), (" << a0.a1.a0 << ")), ((" << a1.a0.a0
2903 << "), (" << a1.a1.a0 << ")), ((" << a2.a0.a0 << "), (" << a2.a1.a0
2904 << ")), ((" << a3.a0.a0 << "), (" << a3.a1.a0 << ")), (("
2905 << a4.a0.a0 << "), (" << a4.a1.a0 << ")), ((" << a5.a0.a0 << "), ("
2906 << a5.a1.a0 << ")), ((" << a6.a0.a0 << "), (" << a6.a1.a0
2907 << ")), ((" << a7.a0.a0 << "), (" << a7.a1.a0 << ")), (("
2908 << a8.a0.a0 << "), (" << a8.a1.a0 << ")), ((" << a9.a0.a0 << "), ("
2909 << a9.a1.a0 << ")))"
2910 << "\n";
2911
2912 float result = 0;
2913
2914 result += a0.a0.a0;
2915 result += a0.a1.a0;
2916 result += a1.a0.a0;
2917 result += a1.a1.a0;
2918 result += a2.a0.a0;
2919 result += a2.a1.a0;
2920 result += a3.a0.a0;
2921 result += a3.a1.a0;
2922 result += a4.a0.a0;
2923 result += a4.a1.a0;
2924 result += a5.a0.a0;
2925 result += a5.a1.a0;
2926 result += a6.a0.a0;
2927 result += a6.a1.a0;
2928 result += a7.a0.a0;
2929 result += a7.a1.a0;
2930 result += a8.a0.a0;
2931 result += a8.a1.a0;
2932 result += a9.a0.a0;
2933 result += a9.a1.a0;
2934
2935 std::cout << "result = " << result << "\n";
2936
2937 return result;
2938}
2939
2940// Used for testing structs and unions by value.
2941// Simple nested struct. No alignment gaps on any architectures.
2942// 10 arguments exhaust fpu registers on all platforms.
2943// The nesting is irregular, testing homogenous float rules on arm and arm64,
2944// and the fpu register usage on x64.
2955 std::cout << "PassStruct8BytesNestedFloat2x10"
2956 << "(((" << a0.a0.a0 << "), " << a0.a1 << "), ((" << a1.a0.a0
2957 << "), " << a1.a1 << "), ((" << a2.a0.a0 << "), " << a2.a1
2958 << "), ((" << a3.a0.a0 << "), " << a3.a1 << "), ((" << a4.a0.a0
2959 << "), " << a4.a1 << "), ((" << a5.a0.a0 << "), " << a5.a1
2960 << "), ((" << a6.a0.a0 << "), " << a6.a1 << "), ((" << a7.a0.a0
2961 << "), " << a7.a1 << "), ((" << a8.a0.a0 << "), " << a8.a1
2962 << "), ((" << a9.a0.a0 << "), " << a9.a1 << "))"
2963 << "\n";
2964
2965 float result = 0;
2966
2967 result += a0.a0.a0;
2968 result += a0.a1;
2969 result += a1.a0.a0;
2970 result += a1.a1;
2971 result += a2.a0.a0;
2972 result += a2.a1;
2973 result += a3.a0.a0;
2974 result += a3.a1;
2975 result += a4.a0.a0;
2976 result += a4.a1;
2977 result += a5.a0.a0;
2978 result += a5.a1;
2979 result += a6.a0.a0;
2980 result += a6.a1;
2981 result += a7.a0.a0;
2982 result += a7.a1;
2983 result += a8.a0.a0;
2984 result += a8.a1;
2985 result += a9.a0.a0;
2986 result += a9.a1;
2987
2988 std::cout << "result = " << result << "\n";
2989
2990 return result;
2991}
2992
2993// Used for testing structs and unions by value.
2994// Simple nested struct. No alignment gaps on any architectures.
2995// 10 arguments exhaust all registers on all platforms.
3006 std::cout << "PassStruct8BytesNestedMixedx10"
3007 << "(((" << a0.a0.a0 << ", " << a0.a0.a1 << "), (" << a0.a1.a0
3008 << ")), ((" << a1.a0.a0 << ", " << a1.a0.a1 << "), (" << a1.a1.a0
3009 << ")), ((" << a2.a0.a0 << ", " << a2.a0.a1 << "), (" << a2.a1.a0
3010 << ")), ((" << a3.a0.a0 << ", " << a3.a0.a1 << "), (" << a3.a1.a0
3011 << ")), ((" << a4.a0.a0 << ", " << a4.a0.a1 << "), (" << a4.a1.a0
3012 << ")), ((" << a5.a0.a0 << ", " << a5.a0.a1 << "), (" << a5.a1.a0
3013 << ")), ((" << a6.a0.a0 << ", " << a6.a0.a1 << "), (" << a6.a1.a0
3014 << ")), ((" << a7.a0.a0 << ", " << a7.a0.a1 << "), (" << a7.a1.a0
3015 << ")), ((" << a8.a0.a0 << ", " << a8.a0.a1 << "), (" << a8.a1.a0
3016 << ")), ((" << a9.a0.a0 << ", " << a9.a0.a1 << "), (" << a9.a1.a0
3017 << ")))"
3018 << "\n";
3019
3020 double result = 0;
3021
3022 result += a0.a0.a0;
3023 result += a0.a0.a1;
3024 result += a0.a1.a0;
3025 result += a1.a0.a0;
3026 result += a1.a0.a1;
3027 result += a1.a1.a0;
3028 result += a2.a0.a0;
3029 result += a2.a0.a1;
3030 result += a2.a1.a0;
3031 result += a3.a0.a0;
3032 result += a3.a0.a1;
3033 result += a3.a1.a0;
3034 result += a4.a0.a0;
3035 result += a4.a0.a1;
3036 result += a4.a1.a0;
3037 result += a5.a0.a0;
3038 result += a5.a0.a1;
3039 result += a5.a1.a0;
3040 result += a6.a0.a0;
3041 result += a6.a0.a1;
3042 result += a6.a1.a0;
3043 result += a7.a0.a0;
3044 result += a7.a0.a1;
3045 result += a7.a1.a0;
3046 result += a8.a0.a0;
3047 result += a8.a0.a1;
3048 result += a8.a1.a0;
3049 result += a9.a0.a0;
3050 result += a9.a0.a1;
3051 result += a9.a1.a0;
3052
3053 std::cout << "result = " << result << "\n";
3054
3055 return result;
3056}
3057
3058// Used for testing structs and unions by value.
3059// Deeper nested struct to test recursive member access.
3062 std::cout << "PassStruct16BytesNestedIntx2"
3063 << "((((" << a0.a0.a0.a0 << ", " << a0.a0.a0.a1 << "), ("
3064 << a0.a0.a1.a0 << ", " << a0.a0.a1.a1 << ")), ((" << a0.a1.a0.a0
3065 << ", " << a0.a1.a0.a1 << "), (" << a0.a1.a1.a0 << ", "
3066 << a0.a1.a1.a1 << "))), (((" << a1.a0.a0.a0 << ", " << a1.a0.a0.a1
3067 << "), (" << a1.a0.a1.a0 << ", " << a1.a0.a1.a1 << ")), (("
3068 << a1.a1.a0.a0 << ", " << a1.a1.a0.a1 << "), (" << a1.a1.a1.a0
3069 << ", " << a1.a1.a1.a1 << "))))"
3070 << "\n";
3071
3072 int64_t result = 0;
3073
3074 result += a0.a0.a0.a0;
3075 result += a0.a0.a0.a1;
3076 result += a0.a0.a1.a0;
3077 result += a0.a0.a1.a1;
3078 result += a0.a1.a0.a0;
3079 result += a0.a1.a0.a1;
3080 result += a0.a1.a1.a0;
3081 result += a0.a1.a1.a1;
3082 result += a1.a0.a0.a0;
3083 result += a1.a0.a0.a1;
3084 result += a1.a0.a1.a0;
3085 result += a1.a0.a1.a1;
3086 result += a1.a1.a0.a0;
3087 result += a1.a1.a0.a1;
3088 result += a1.a1.a1.a0;
3089 result += a1.a1.a1.a1;
3090
3091 std::cout << "result = " << result << "\n";
3092
3093 return result;
3094}
3095
3096// Used for testing structs and unions by value.
3097// Even deeper nested struct to test recursive member access.
3100 std::cout << "PassStruct32BytesNestedIntx2"
3101 << "(((((" << a0.a0.a0.a0.a0 << ", " << a0.a0.a0.a0.a1 << "), ("
3102 << a0.a0.a0.a1.a0 << ", " << a0.a0.a0.a1.a1 << ")), (("
3103 << a0.a0.a1.a0.a0 << ", " << a0.a0.a1.a0.a1 << "), ("
3104 << a0.a0.a1.a1.a0 << ", " << a0.a0.a1.a1.a1 << "))), ((("
3105 << a0.a1.a0.a0.a0 << ", " << a0.a1.a0.a0.a1 << "), ("
3106 << a0.a1.a0.a1.a0 << ", " << a0.a1.a0.a1.a1 << ")), (("
3107 << a0.a1.a1.a0.a0 << ", " << a0.a1.a1.a0.a1 << "), ("
3108 << a0.a1.a1.a1.a0 << ", " << a0.a1.a1.a1.a1 << ")))), (((("
3109 << a1.a0.a0.a0.a0 << ", " << a1.a0.a0.a0.a1 << "), ("
3110 << a1.a0.a0.a1.a0 << ", " << a1.a0.a0.a1.a1 << ")), (("
3111 << a1.a0.a1.a0.a0 << ", " << a1.a0.a1.a0.a1 << "), ("
3112 << a1.a0.a1.a1.a0 << ", " << a1.a0.a1.a1.a1 << "))), ((("
3113 << a1.a1.a0.a0.a0 << ", " << a1.a1.a0.a0.a1 << "), ("
3114 << a1.a1.a0.a1.a0 << ", " << a1.a1.a0.a1.a1 << ")), (("
3115 << a1.a1.a1.a0.a0 << ", " << a1.a1.a1.a0.a1 << "), ("
3116 << a1.a1.a1.a1.a0 << ", " << a1.a1.a1.a1.a1 << ")))))"
3117 << "\n";
3118
3119 int64_t result = 0;
3120
3121 result += a0.a0.a0.a0.a0;
3122 result += a0.a0.a0.a0.a1;
3123 result += a0.a0.a0.a1.a0;
3124 result += a0.a0.a0.a1.a1;
3125 result += a0.a0.a1.a0.a0;
3126 result += a0.a0.a1.a0.a1;
3127 result += a0.a0.a1.a1.a0;
3128 result += a0.a0.a1.a1.a1;
3129 result += a0.a1.a0.a0.a0;
3130 result += a0.a1.a0.a0.a1;
3131 result += a0.a1.a0.a1.a0;
3132 result += a0.a1.a0.a1.a1;
3133 result += a0.a1.a1.a0.a0;
3134 result += a0.a1.a1.a0.a1;
3135 result += a0.a1.a1.a1.a0;
3136 result += a0.a1.a1.a1.a1;
3137 result += a1.a0.a0.a0.a0;
3138 result += a1.a0.a0.a0.a1;
3139 result += a1.a0.a0.a1.a0;
3140 result += a1.a0.a0.a1.a1;
3141 result += a1.a0.a1.a0.a0;
3142 result += a1.a0.a1.a0.a1;
3143 result += a1.a0.a1.a1.a0;
3144 result += a1.a0.a1.a1.a1;
3145 result += a1.a1.a0.a0.a0;
3146 result += a1.a1.a0.a0.a1;
3147 result += a1.a1.a0.a1.a0;
3148 result += a1.a1.a0.a1.a1;
3149 result += a1.a1.a1.a0.a0;
3150 result += a1.a1.a1.a0.a1;
3151 result += a1.a1.a1.a1.a0;
3152 result += a1.a1.a1.a1.a1;
3153
3154 std::cout << "result = " << result << "\n";
3155
3156 return result;
3157}
3158
3159// Used for testing structs and unions by value.
3160// Test alignment and padding of nested struct with 16 byte int.
3163 std::cout << "PassStructNestedIntStructAlignmentInt16"
3164 << "(((" << static_cast<int>(a0.a0.a0) << ", " << a0.a0.a1 << ", "
3165 << static_cast<int>(a0.a0.a2) << "), ("
3166 << static_cast<int>(a0.a1.a0) << ", " << a0.a1.a1 << ", "
3167 << static_cast<int>(a0.a1.a2) << ")))"
3168 << "\n";
3169
3170 int64_t result = 0;
3171
3172 result += a0.a0.a0;
3173 result += a0.a0.a1;
3174 result += a0.a0.a2;
3175 result += a0.a1.a0;
3176 result += a0.a1.a1;
3177 result += a0.a1.a2;
3178
3179 std::cout << "result = " << result << "\n";
3180
3181 return result;
3182}
3183
3184// Used for testing structs and unions by value.
3185// Test alignment and padding of nested struct with 32 byte int.
3188 std::cout << "PassStructNestedIntStructAlignmentInt32"
3189 << "(((" << static_cast<int>(a0.a0.a0) << ", " << a0.a0.a1 << ", "
3190 << static_cast<int>(a0.a0.a2) << "), ("
3191 << static_cast<int>(a0.a1.a0) << ", " << a0.a1.a1 << ", "
3192 << static_cast<int>(a0.a1.a2) << ")))"
3193 << "\n";
3194
3195 int64_t result = 0;
3196
3197 result += a0.a0.a0;
3198 result += a0.a0.a1;
3199 result += a0.a0.a2;
3200 result += a0.a1.a0;
3201 result += a0.a1.a1;
3202 result += a0.a1.a2;
3203
3204 std::cout << "result = " << result << "\n";
3205
3206 return result;
3207}
3208
3209// Used for testing structs and unions by value.
3210// Test alignment and padding of nested struct with 64 byte int.
3213 std::cout << "PassStructNestedIntStructAlignmentInt64"
3214 << "(((" << static_cast<int>(a0.a0.a0) << ", " << a0.a0.a1 << ", "
3215 << static_cast<int>(a0.a0.a2) << "), ("
3216 << static_cast<int>(a0.a1.a0) << ", " << a0.a1.a1 << ", "
3217 << static_cast<int>(a0.a1.a2) << ")))"
3218 << "\n";
3219
3220 int64_t result = 0;
3221
3222 result += a0.a0.a0;
3223 result += a0.a0.a1;
3224 result += a0.a0.a2;
3225 result += a0.a1.a0;
3226 result += a0.a1.a1;
3227 result += a0.a1.a2;
3228
3229 std::cout << "result = " << result << "\n";
3230
3231 return result;
3232}
3233
3234// Used for testing structs and unions by value.
3235// Return big irregular struct as smoke test.
3241 std::cout
3242 << "PassStructNestedIrregularEvenBiggerx4"
3243 << "((" << a0.a0 << ", ((" << a0.a1.a0.a0 << ", ((" << a0.a1.a0.a1.a0.a0
3244 << ", " << a0.a1.a0.a1.a0.a1 << "), (" << a0.a1.a0.a1.a1.a0 << ")), "
3245 << a0.a1.a0.a2 << ", ((" << a0.a1.a0.a3.a0.a0 << "), " << a0.a1.a0.a3.a1
3246 << "), " << a0.a1.a0.a4 << ", ((" << a0.a1.a0.a5.a0.a0 << "), ("
3247 << a0.a1.a0.a5.a1.a0 << ")), " << a0.a1.a0.a6 << "), ((" << a0.a1.a1.a0.a0
3248 << ", " << a0.a1.a1.a0.a1 << "), (" << a0.a1.a1.a1.a0 << ")), "
3249 << a0.a1.a2 << ", " << a0.a1.a3 << "), ((" << a0.a2.a0.a0 << ", (("
3250 << a0.a2.a0.a1.a0.a0 << ", " << a0.a2.a0.a1.a0.a1 << "), ("
3251 << a0.a2.a0.a1.a1.a0 << ")), " << a0.a2.a0.a2 << ", (("
3252 << a0.a2.a0.a3.a0.a0 << "), " << a0.a2.a0.a3.a1 << "), " << a0.a2.a0.a4
3253 << ", ((" << a0.a2.a0.a5.a0.a0 << "), (" << a0.a2.a0.a5.a1.a0 << ")), "
3254 << a0.a2.a0.a6 << "), ((" << a0.a2.a1.a0.a0 << ", " << a0.a2.a1.a0.a1
3255 << "), (" << a0.a2.a1.a1.a0 << ")), " << a0.a2.a2 << ", " << a0.a2.a3
3256 << "), " << a0.a3 << "), (" << a1.a0 << ", ((" << a1.a1.a0.a0 << ", (("
3257 << a1.a1.a0.a1.a0.a0 << ", " << a1.a1.a0.a1.a0.a1 << "), ("
3258 << a1.a1.a0.a1.a1.a0 << ")), " << a1.a1.a0.a2 << ", (("
3259 << a1.a1.a0.a3.a0.a0 << "), " << a1.a1.a0.a3.a1 << "), " << a1.a1.a0.a4
3260 << ", ((" << a1.a1.a0.a5.a0.a0 << "), (" << a1.a1.a0.a5.a1.a0 << ")), "
3261 << a1.a1.a0.a6 << "), ((" << a1.a1.a1.a0.a0 << ", " << a1.a1.a1.a0.a1
3262 << "), (" << a1.a1.a1.a1.a0 << ")), " << a1.a1.a2 << ", " << a1.a1.a3
3263 << "), ((" << a1.a2.a0.a0 << ", ((" << a1.a2.a0.a1.a0.a0 << ", "
3264 << a1.a2.a0.a1.a0.a1 << "), (" << a1.a2.a0.a1.a1.a0 << ")), "
3265 << a1.a2.a0.a2 << ", ((" << a1.a2.a0.a3.a0.a0 << "), " << a1.a2.a0.a3.a1
3266 << "), " << a1.a2.a0.a4 << ", ((" << a1.a2.a0.a5.a0.a0 << "), ("
3267 << a1.a2.a0.a5.a1.a0 << ")), " << a1.a2.a0.a6 << "), ((" << a1.a2.a1.a0.a0
3268 << ", " << a1.a2.a1.a0.a1 << "), (" << a1.a2.a1.a1.a0 << ")), "
3269 << a1.a2.a2 << ", " << a1.a2.a3 << "), " << a1.a3 << "), (" << a2.a0
3270 << ", ((" << a2.a1.a0.a0 << ", ((" << a2.a1.a0.a1.a0.a0 << ", "
3271 << a2.a1.a0.a1.a0.a1 << "), (" << a2.a1.a0.a1.a1.a0 << ")), "
3272 << a2.a1.a0.a2 << ", ((" << a2.a1.a0.a3.a0.a0 << "), " << a2.a1.a0.a3.a1
3273 << "), " << a2.a1.a0.a4 << ", ((" << a2.a1.a0.a5.a0.a0 << "), ("
3274 << a2.a1.a0.a5.a1.a0 << ")), " << a2.a1.a0.a6 << "), ((" << a2.a1.a1.a0.a0
3275 << ", " << a2.a1.a1.a0.a1 << "), (" << a2.a1.a1.a1.a0 << ")), "
3276 << a2.a1.a2 << ", " << a2.a1.a3 << "), ((" << a2.a2.a0.a0 << ", (("
3277 << a2.a2.a0.a1.a0.a0 << ", " << a2.a2.a0.a1.a0.a1 << "), ("
3278 << a2.a2.a0.a1.a1.a0 << ")), " << a2.a2.a0.a2 << ", (("
3279 << a2.a2.a0.a3.a0.a0 << "), " << a2.a2.a0.a3.a1 << "), " << a2.a2.a0.a4
3280 << ", ((" << a2.a2.a0.a5.a0.a0 << "), (" << a2.a2.a0.a5.a1.a0 << ")), "
3281 << a2.a2.a0.a6 << "), ((" << a2.a2.a1.a0.a0 << ", " << a2.a2.a1.a0.a1
3282 << "), (" << a2.a2.a1.a1.a0 << ")), " << a2.a2.a2 << ", " << a2.a2.a3
3283 << "), " << a2.a3 << "), (" << a3.a0 << ", ((" << a3.a1.a0.a0 << ", (("
3284 << a3.a1.a0.a1.a0.a0 << ", " << a3.a1.a0.a1.a0.a1 << "), ("
3285 << a3.a1.a0.a1.a1.a0 << ")), " << a3.a1.a0.a2 << ", (("
3286 << a3.a1.a0.a3.a0.a0 << "), " << a3.a1.a0.a3.a1 << "), " << a3.a1.a0.a4
3287 << ", ((" << a3.a1.a0.a5.a0.a0 << "), (" << a3.a1.a0.a5.a1.a0 << ")), "
3288 << a3.a1.a0.a6 << "), ((" << a3.a1.a1.a0.a0 << ", " << a3.a1.a1.a0.a1
3289 << "), (" << a3.a1.a1.a1.a0 << ")), " << a3.a1.a2 << ", " << a3.a1.a3
3290 << "), ((" << a3.a2.a0.a0 << ", ((" << a3.a2.a0.a1.a0.a0 << ", "
3291 << a3.a2.a0.a1.a0.a1 << "), (" << a3.a2.a0.a1.a1.a0 << ")), "
3292 << a3.a2.a0.a2 << ", ((" << a3.a2.a0.a3.a0.a0 << "), " << a3.a2.a0.a3.a1
3293 << "), " << a3.a2.a0.a4 << ", ((" << a3.a2.a0.a5.a0.a0 << "), ("
3294 << a3.a2.a0.a5.a1.a0 << ")), " << a3.a2.a0.a6 << "), ((" << a3.a2.a1.a0.a0
3295 << ", " << a3.a2.a1.a0.a1 << "), (" << a3.a2.a1.a1.a0 << ")), "
3296 << a3.a2.a2 << ", " << a3.a2.a3 << "), " << a3.a3 << "))"
3297 << "\n";
3298
3299 double result = 0;
3300
3301 result += a0.a0;
3302 result += a0.a1.a0.a0;
3303 result += a0.a1.a0.a1.a0.a0;
3304 result += a0.a1.a0.a1.a0.a1;
3305 result += a0.a1.a0.a1.a1.a0;
3306 result += a0.a1.a0.a2;
3307 result += a0.a1.a0.a3.a0.a0;
3308 result += a0.a1.a0.a3.a1;
3309 result += a0.a1.a0.a4;
3310 result += a0.a1.a0.a5.a0.a0;
3311 result += a0.a1.a0.a5.a1.a0;
3312 result += a0.a1.a0.a6;
3313 result += a0.a1.a1.a0.a0;
3314 result += a0.a1.a1.a0.a1;
3315 result += a0.a1.a1.a1.a0;
3316 result += a0.a1.a2;
3317 result += a0.a1.a3;
3318 result += a0.a2.a0.a0;
3319 result += a0.a2.a0.a1.a0.a0;
3320 result += a0.a2.a0.a1.a0.a1;
3321 result += a0.a2.a0.a1.a1.a0;
3322 result += a0.a2.a0.a2;
3323 result += a0.a2.a0.a3.a0.a0;
3324 result += a0.a2.a0.a3.a1;
3325 result += a0.a2.a0.a4;
3326 result += a0.a2.a0.a5.a0.a0;
3327 result += a0.a2.a0.a5.a1.a0;
3328 result += a0.a2.a0.a6;
3329 result += a0.a2.a1.a0.a0;
3330 result += a0.a2.a1.a0.a1;
3331 result += a0.a2.a1.a1.a0;
3332 result += a0.a2.a2;
3333 result += a0.a2.a3;
3334 result += a0.a3;
3335 result += a1.a0;
3336 result += a1.a1.a0.a0;
3337 result += a1.a1.a0.a1.a0.a0;
3338 result += a1.a1.a0.a1.a0.a1;
3339 result += a1.a1.a0.a1.a1.a0;
3340 result += a1.a1.a0.a2;
3341 result += a1.a1.a0.a3.a0.a0;
3342 result += a1.a1.a0.a3.a1;
3343 result += a1.a1.a0.a4;
3344 result += a1.a1.a0.a5.a0.a0;
3345 result += a1.a1.a0.a5.a1.a0;
3346 result += a1.a1.a0.a6;
3347 result += a1.a1.a1.a0.a0;
3348 result += a1.a1.a1.a0.a1;
3349 result += a1.a1.a1.a1.a0;
3350 result += a1.a1.a2;
3351 result += a1.a1.a3;
3352 result += a1.a2.a0.a0;
3353 result += a1.a2.a0.a1.a0.a0;
3354 result += a1.a2.a0.a1.a0.a1;
3355 result += a1.a2.a0.a1.a1.a0;
3356 result += a1.a2.a0.a2;
3357 result += a1.a2.a0.a3.a0.a0;
3358 result += a1.a2.a0.a3.a1;
3359 result += a1.a2.a0.a4;
3360 result += a1.a2.a0.a5.a0.a0;
3361 result += a1.a2.a0.a5.a1.a0;
3362 result += a1.a2.a0.a6;
3363 result += a1.a2.a1.a0.a0;
3364 result += a1.a2.a1.a0.a1;
3365 result += a1.a2.a1.a1.a0;
3366 result += a1.a2.a2;
3367 result += a1.a2.a3;
3368 result += a1.a3;
3369 result += a2.a0;
3370 result += a2.a1.a0.a0;
3371 result += a2.a1.a0.a1.a0.a0;
3372 result += a2.a1.a0.a1.a0.a1;
3373 result += a2.a1.a0.a1.a1.a0;
3374 result += a2.a1.a0.a2;
3375 result += a2.a1.a0.a3.a0.a0;
3376 result += a2.a1.a0.a3.a1;
3377 result += a2.a1.a0.a4;
3378 result += a2.a1.a0.a5.a0.a0;
3379 result += a2.a1.a0.a5.a1.a0;
3380 result += a2.a1.a0.a6;
3381 result += a2.a1.a1.a0.a0;
3382 result += a2.a1.a1.a0.a1;
3383 result += a2.a1.a1.a1.a0;
3384 result += a2.a1.a2;
3385 result += a2.a1.a3;
3386 result += a2.a2.a0.a0;
3387 result += a2.a2.a0.a1.a0.a0;
3388 result += a2.a2.a0.a1.a0.a1;
3389 result += a2.a2.a0.a1.a1.a0;
3390 result += a2.a2.a0.a2;
3391 result += a2.a2.a0.a3.a0.a0;
3392 result += a2.a2.a0.a3.a1;
3393 result += a2.a2.a0.a4;
3394 result += a2.a2.a0.a5.a0.a0;
3395 result += a2.a2.a0.a5.a1.a0;
3396 result += a2.a2.a0.a6;
3397 result += a2.a2.a1.a0.a0;
3398 result += a2.a2.a1.a0.a1;
3399 result += a2.a2.a1.a1.a0;
3400 result += a2.a2.a2;
3401 result += a2.a2.a3;
3402 result += a2.a3;
3403 result += a3.a0;
3404 result += a3.a1.a0.a0;
3405 result += a3.a1.a0.a1.a0.a0;
3406 result += a3.a1.a0.a1.a0.a1;
3407 result += a3.a1.a0.a1.a1.a0;
3408 result += a3.a1.a0.a2;
3409 result += a3.a1.a0.a3.a0.a0;
3410 result += a3.a1.a0.a3.a1;
3411 result += a3.a1.a0.a4;
3412 result += a3.a1.a0.a5.a0.a0;
3413 result += a3.a1.a0.a5.a1.a0;
3414 result += a3.a1.a0.a6;
3415 result += a3.a1.a1.a0.a0;
3416 result += a3.a1.a1.a0.a1;
3417 result += a3.a1.a1.a1.a0;
3418 result += a3.a1.a2;
3419 result += a3.a1.a3;
3420 result += a3.a2.a0.a0;
3421 result += a3.a2.a0.a1.a0.a0;
3422 result += a3.a2.a0.a1.a0.a1;
3423 result += a3.a2.a0.a1.a1.a0;
3424 result += a3.a2.a0.a2;
3425 result += a3.a2.a0.a3.a0.a0;
3426 result += a3.a2.a0.a3.a1;
3427 result += a3.a2.a0.a4;
3428 result += a3.a2.a0.a5.a0.a0;
3429 result += a3.a2.a0.a5.a1.a0;
3430 result += a3.a2.a0.a6;
3431 result += a3.a2.a1.a0.a0;
3432 result += a3.a2.a1.a0.a1;
3433 result += a3.a2.a1.a1.a0;
3434 result += a3.a2.a2;
3435 result += a3.a2.a3;
3436 result += a3.a3;
3437
3438 std::cout << "result = " << result << "\n";
3439
3440 return result;
3441}
3442
3443// Used for testing structs and unions by value.
3444// Simple struct with inline array.
3445DART_EXPORT int32_t
3450 std::cout << "PassStruct8BytesInlineArrayIntx4"
3451 << "(([" << static_cast<int>(a0.a0[0]) << ", "
3452 << static_cast<int>(a0.a0[1]) << ", " << static_cast<int>(a0.a0[2])
3453 << ", " << static_cast<int>(a0.a0[3]) << ", "
3454 << static_cast<int>(a0.a0[4]) << ", " << static_cast<int>(a0.a0[5])
3455 << ", " << static_cast<int>(a0.a0[6]) << ", "
3456 << static_cast<int>(a0.a0[7]) << "]), (["
3457 << static_cast<int>(a1.a0[0]) << ", " << static_cast<int>(a1.a0[1])
3458 << ", " << static_cast<int>(a1.a0[2]) << ", "
3459 << static_cast<int>(a1.a0[3]) << ", " << static_cast<int>(a1.a0[4])
3460 << ", " << static_cast<int>(a1.a0[5]) << ", "
3461 << static_cast<int>(a1.a0[6]) << ", " << static_cast<int>(a1.a0[7])
3462 << "]), ([" << static_cast<int>(a2.a0[0]) << ", "
3463 << static_cast<int>(a2.a0[1]) << ", " << static_cast<int>(a2.a0[2])
3464 << ", " << static_cast<int>(a2.a0[3]) << ", "
3465 << static_cast<int>(a2.a0[4]) << ", " << static_cast<int>(a2.a0[5])
3466 << ", " << static_cast<int>(a2.a0[6]) << ", "
3467 << static_cast<int>(a2.a0[7]) << "]), (["
3468 << static_cast<int>(a3.a0[0]) << ", " << static_cast<int>(a3.a0[1])
3469 << ", " << static_cast<int>(a3.a0[2]) << ", "
3470 << static_cast<int>(a3.a0[3]) << ", " << static_cast<int>(a3.a0[4])
3471 << ", " << static_cast<int>(a3.a0[5]) << ", "
3472 << static_cast<int>(a3.a0[6]) << ", " << static_cast<int>(a3.a0[7])
3473 << "]))"
3474 << "\n";
3475
3476 int32_t result = 0;
3477
3478 result += a0.a0[0];
3479 result += a0.a0[1];
3480 result += a0.a0[2];
3481 result += a0.a0[3];
3482 result += a0.a0[4];
3483 result += a0.a0[5];
3484 result += a0.a0[6];
3485 result += a0.a0[7];
3486 result += a1.a0[0];
3487 result += a1.a0[1];
3488 result += a1.a0[2];
3489 result += a1.a0[3];
3490 result += a1.a0[4];
3491 result += a1.a0[5];
3492 result += a1.a0[6];
3493 result += a1.a0[7];
3494 result += a2.a0[0];
3495 result += a2.a0[1];
3496 result += a2.a0[2];
3497 result += a2.a0[3];
3498 result += a2.a0[4];
3499 result += a2.a0[5];
3500 result += a2.a0[6];
3501 result += a2.a0[7];
3502 result += a3.a0[0];
3503 result += a3.a0[1];
3504 result += a3.a0[2];
3505 result += a3.a0[3];
3506 result += a3.a0[4];
3507 result += a3.a0[5];
3508 result += a3.a0[6];
3509 result += a3.a0[7];
3510
3511 std::cout << "result = " << result << "\n";
3512
3513 return result;
3514}
3515
3516// Used for testing structs and unions by value.
3517// Irregular struct with inline array.
3518DART_EXPORT int32_t
3523 std::cout << "PassStructInlineArrayIrregularx4"
3524 << "(([(" << a0.a0[0].a0 << ", " << static_cast<int>(a0.a0[0].a1)
3525 << "), (" << a0.a0[1].a0 << ", " << static_cast<int>(a0.a0[1].a1)
3526 << ")], " << static_cast<int>(a0.a1) << "), ([(" << a1.a0[0].a0
3527 << ", " << static_cast<int>(a1.a0[0].a1) << "), (" << a1.a0[1].a0
3528 << ", " << static_cast<int>(a1.a0[1].a1) << ")], "
3529 << static_cast<int>(a1.a1) << "), ([(" << a2.a0[0].a0 << ", "
3530 << static_cast<int>(a2.a0[0].a1) << "), (" << a2.a0[1].a0 << ", "
3531 << static_cast<int>(a2.a0[1].a1) << ")], "
3532 << static_cast<int>(a2.a1) << "), ([(" << a3.a0[0].a0 << ", "
3533 << static_cast<int>(a3.a0[0].a1) << "), (" << a3.a0[1].a0 << ", "
3534 << static_cast<int>(a3.a0[1].a1) << ")], "
3535 << static_cast<int>(a3.a1) << "))"
3536 << "\n";
3537
3538 int32_t result = 0;
3539
3540 result += a0.a0[0].a0;
3541 result += a0.a0[0].a1;
3542 result += a0.a0[1].a0;
3543 result += a0.a0[1].a1;
3544 result += a0.a1;
3545 result += a1.a0[0].a0;
3546 result += a1.a0[0].a1;
3547 result += a1.a0[1].a0;
3548 result += a1.a0[1].a1;
3549 result += a1.a1;
3550 result += a2.a0[0].a0;
3551 result += a2.a0[0].a1;
3552 result += a2.a0[1].a0;
3553 result += a2.a0[1].a1;
3554 result += a2.a1;
3555 result += a3.a0[0].a0;
3556 result += a3.a0[0].a1;
3557 result += a3.a0[1].a0;
3558 result += a3.a0[1].a1;
3559 result += a3.a1;
3560
3561 std::cout << "result = " << result << "\n";
3562
3563 return result;
3564}
3565
3566// Used for testing structs and unions by value.
3567// Regular larger struct with inline array.
3568DART_EXPORT int32_t
3570 std::cout
3571 << "PassStructInlineArray100Bytes"
3572 << "(([" << static_cast<int>(a0.a0[0]) << ", "
3573 << static_cast<int>(a0.a0[1]) << ", " << static_cast<int>(a0.a0[2])
3574 << ", " << static_cast<int>(a0.a0[3]) << ", "
3575 << static_cast<int>(a0.a0[4]) << ", " << static_cast<int>(a0.a0[5])
3576 << ", " << static_cast<int>(a0.a0[6]) << ", "
3577 << static_cast<int>(a0.a0[7]) << ", " << static_cast<int>(a0.a0[8])
3578 << ", " << static_cast<int>(a0.a0[9]) << ", "
3579 << static_cast<int>(a0.a0[10]) << ", " << static_cast<int>(a0.a0[11])
3580 << ", " << static_cast<int>(a0.a0[12]) << ", "
3581 << static_cast<int>(a0.a0[13]) << ", " << static_cast<int>(a0.a0[14])
3582 << ", " << static_cast<int>(a0.a0[15]) << ", "
3583 << static_cast<int>(a0.a0[16]) << ", " << static_cast<int>(a0.a0[17])
3584 << ", " << static_cast<int>(a0.a0[18]) << ", "
3585 << static_cast<int>(a0.a0[19]) << ", " << static_cast<int>(a0.a0[20])
3586 << ", " << static_cast<int>(a0.a0[21]) << ", "
3587 << static_cast<int>(a0.a0[22]) << ", " << static_cast<int>(a0.a0[23])
3588 << ", " << static_cast<int>(a0.a0[24]) << ", "
3589 << static_cast<int>(a0.a0[25]) << ", " << static_cast<int>(a0.a0[26])
3590 << ", " << static_cast<int>(a0.a0[27]) << ", "
3591 << static_cast<int>(a0.a0[28]) << ", " << static_cast<int>(a0.a0[29])
3592 << ", " << static_cast<int>(a0.a0[30]) << ", "
3593 << static_cast<int>(a0.a0[31]) << ", " << static_cast<int>(a0.a0[32])
3594 << ", " << static_cast<int>(a0.a0[33]) << ", "
3595 << static_cast<int>(a0.a0[34]) << ", " << static_cast<int>(a0.a0[35])
3596 << ", " << static_cast<int>(a0.a0[36]) << ", "
3597 << static_cast<int>(a0.a0[37]) << ", " << static_cast<int>(a0.a0[38])
3598 << ", " << static_cast<int>(a0.a0[39]) << ", "
3599 << static_cast<int>(a0.a0[40]) << ", " << static_cast<int>(a0.a0[41])
3600 << ", " << static_cast<int>(a0.a0[42]) << ", "
3601 << static_cast<int>(a0.a0[43]) << ", " << static_cast<int>(a0.a0[44])
3602 << ", " << static_cast<int>(a0.a0[45]) << ", "
3603 << static_cast<int>(a0.a0[46]) << ", " << static_cast<int>(a0.a0[47])
3604 << ", " << static_cast<int>(a0.a0[48]) << ", "
3605 << static_cast<int>(a0.a0[49]) << ", " << static_cast<int>(a0.a0[50])
3606 << ", " << static_cast<int>(a0.a0[51]) << ", "
3607 << static_cast<int>(a0.a0[52]) << ", " << static_cast<int>(a0.a0[53])
3608 << ", " << static_cast<int>(a0.a0[54]) << ", "
3609 << static_cast<int>(a0.a0[55]) << ", " << static_cast<int>(a0.a0[56])
3610 << ", " << static_cast<int>(a0.a0[57]) << ", "
3611 << static_cast<int>(a0.a0[58]) << ", " << static_cast<int>(a0.a0[59])
3612 << ", " << static_cast<int>(a0.a0[60]) << ", "
3613 << static_cast<int>(a0.a0[61]) << ", " << static_cast<int>(a0.a0[62])
3614 << ", " << static_cast<int>(a0.a0[63]) << ", "
3615 << static_cast<int>(a0.a0[64]) << ", " << static_cast<int>(a0.a0[65])
3616 << ", " << static_cast<int>(a0.a0[66]) << ", "
3617 << static_cast<int>(a0.a0[67]) << ", " << static_cast<int>(a0.a0[68])
3618 << ", " << static_cast<int>(a0.a0[69]) << ", "
3619 << static_cast<int>(a0.a0[70]) << ", " << static_cast<int>(a0.a0[71])
3620 << ", " << static_cast<int>(a0.a0[72]) << ", "
3621 << static_cast<int>(a0.a0[73]) << ", " << static_cast<int>(a0.a0[74])
3622 << ", " << static_cast<int>(a0.a0[75]) << ", "
3623 << static_cast<int>(a0.a0[76]) << ", " << static_cast<int>(a0.a0[77])
3624 << ", " << static_cast<int>(a0.a0[78]) << ", "
3625 << static_cast<int>(a0.a0[79]) << ", " << static_cast<int>(a0.a0[80])
3626 << ", " << static_cast<int>(a0.a0[81]) << ", "
3627 << static_cast<int>(a0.a0[82]) << ", " << static_cast<int>(a0.a0[83])
3628 << ", " << static_cast<int>(a0.a0[84]) << ", "
3629 << static_cast<int>(a0.a0[85]) << ", " << static_cast<int>(a0.a0[86])
3630 << ", " << static_cast<int>(a0.a0[87]) << ", "
3631 << static_cast<int>(a0.a0[88]) << ", " << static_cast<int>(a0.a0[89])
3632 << ", " << static_cast<int>(a0.a0[90]) << ", "
3633 << static_cast<int>(a0.a0[91]) << ", " << static_cast<int>(a0.a0[92])
3634 << ", " << static_cast<int>(a0.a0[93]) << ", "
3635 << static_cast<int>(a0.a0[94]) << ", " << static_cast<int>(a0.a0[95])
3636 << ", " << static_cast<int>(a0.a0[96]) << ", "
3637 << static_cast<int>(a0.a0[97]) << ", " << static_cast<int>(a0.a0[98])
3638 << ", " << static_cast<int>(a0.a0[99]) << "]))"
3639 << "\n";
3640
3641 int32_t result = 0;
3642
3643 result += a0.a0[0];
3644 result += a0.a0[1];
3645 result += a0.a0[2];
3646 result += a0.a0[3];
3647 result += a0.a0[4];
3648 result += a0.a0[5];
3649 result += a0.a0[6];
3650 result += a0.a0[7];
3651 result += a0.a0[8];
3652 result += a0.a0[9];
3653 result += a0.a0[10];
3654 result += a0.a0[11];
3655 result += a0.a0[12];
3656 result += a0.a0[13];
3657 result += a0.a0[14];
3658 result += a0.a0[15];
3659 result += a0.a0[16];
3660 result += a0.a0[17];
3661 result += a0.a0[18];
3662 result += a0.a0[19];
3663 result += a0.a0[20];
3664 result += a0.a0[21];
3665 result += a0.a0[22];
3666 result += a0.a0[23];
3667 result += a0.a0[24];
3668 result += a0.a0[25];
3669 result += a0.a0[26];
3670 result += a0.a0[27];
3671 result += a0.a0[28];
3672 result += a0.a0[29];
3673 result += a0.a0[30];
3674 result += a0.a0[31];
3675 result += a0.a0[32];
3676 result += a0.a0[33];
3677 result += a0.a0[34];
3678 result += a0.a0[35];
3679 result += a0.a0[36];
3680 result += a0.a0[37];
3681 result += a0.a0[38];
3682 result += a0.a0[39];
3683 result += a0.a0[40];
3684 result += a0.a0[41];
3685 result += a0.a0[42];
3686 result += a0.a0[43];
3687 result += a0.a0[44];
3688 result += a0.a0[45];
3689 result += a0.a0[46];
3690 result += a0.a0[47];
3691 result += a0.a0[48];
3692 result += a0.a0[49];
3693 result += a0.a0[50];
3694 result += a0.a0[51];
3695 result += a0.a0[52];
3696 result += a0.a0[53];
3697 result += a0.a0[54];
3698 result += a0.a0[55];
3699 result += a0.a0[56];
3700 result += a0.a0[57];
3701 result += a0.a0[58];
3702 result += a0.a0[59];
3703 result += a0.a0[60];
3704 result += a0.a0[61];
3705 result += a0.a0[62];
3706 result += a0.a0[63];
3707 result += a0.a0[64];
3708 result += a0.a0[65];
3709 result += a0.a0[66];
3710 result += a0.a0[67];
3711 result += a0.a0[68];
3712 result += a0.a0[69];
3713 result += a0.a0[70];
3714 result += a0.a0[71];
3715 result += a0.a0[72];
3716 result += a0.a0[73];
3717 result += a0.a0[74];
3718 result += a0.a0[75];
3719 result += a0.a0[76];
3720 result += a0.a0[77];
3721 result += a0.a0[78];
3722 result += a0.a0[79];
3723 result += a0.a0[80];
3724 result += a0.a0[81];
3725 result += a0.a0[82];
3726 result += a0.a0[83];
3727 result += a0.a0[84];
3728 result += a0.a0[85];
3729 result += a0.a0[86];
3730 result += a0.a0[87];
3731 result += a0.a0[88];
3732 result += a0.a0[89];
3733 result += a0.a0[90];
3734 result += a0.a0[91];
3735 result += a0.a0[92];
3736 result += a0.a0[93];
3737 result += a0.a0[94];
3738 result += a0.a0[95];
3739 result += a0.a0[96];
3740 result += a0.a0[97];
3741 result += a0.a0[98];
3742 result += a0.a0[99];
3743
3744 std::cout << "result = " << result << "\n";
3745
3746 return result;
3747}
3748
3749// Used for testing structs and unions by value.
3750// Arguments in FPU registers on arm hardfp and arm64.
3751// 5 struct arguments will exhaust available registers.
3758 std::cout << "PassStructStruct16BytesHomogeneousFloat2x5"
3759 << "(((" << a0.a0.a0 << "), [(" << a0.a1[0].a0 << "), ("
3760 << a0.a1[1].a0 << ")], " << a0.a2 << "), ((" << a1.a0.a0 << "), [("
3761 << a1.a1[0].a0 << "), (" << a1.a1[1].a0 << ")], " << a1.a2
3762 << "), ((" << a2.a0.a0 << "), [(" << a2.a1[0].a0 << "), ("
3763 << a2.a1[1].a0 << ")], " << a2.a2 << "), ((" << a3.a0.a0 << "), [("
3764 << a3.a1[0].a0 << "), (" << a3.a1[1].a0 << ")], " << a3.a2
3765 << "), ((" << a4.a0.a0 << "), [(" << a4.a1[0].a0 << "), ("
3766 << a4.a1[1].a0 << ")], " << a4.a2 << "))"
3767 << "\n";
3768
3769 float result = 0;
3770
3771 result += a0.a0.a0;
3772 result += a0.a1[0].a0;
3773 result += a0.a1[1].a0;
3774 result += a0.a2;
3775 result += a1.a0.a0;
3776 result += a1.a1[0].a0;
3777 result += a1.a1[1].a0;
3778 result += a1.a2;
3779 result += a2.a0.a0;
3780 result += a2.a1[0].a0;
3781 result += a2.a1[1].a0;
3782 result += a2.a2;
3783 result += a3.a0.a0;
3784 result += a3.a1[0].a0;
3785 result += a3.a1[1].a0;
3786 result += a3.a2;
3787 result += a4.a0.a0;
3788 result += a4.a1[0].a0;
3789 result += a4.a1[1].a0;
3790 result += a4.a2;
3791
3792 std::cout << "result = " << result << "\n";
3793
3794 return result;
3795}
3796
3797// Used for testing structs and unions by value.
3798// Arguments in FPU registers on arm64.
3799// 5 struct arguments will exhaust available registers.
3806 std::cout << "PassStructStruct32BytesHomogeneousDouble2x5"
3807 << "(((" << a0.a0.a0 << "), [(" << a0.a1[0].a0 << "), ("
3808 << a0.a1[1].a0 << ")], " << a0.a2 << "), ((" << a1.a0.a0 << "), [("
3809 << a1.a1[0].a0 << "), (" << a1.a1[1].a0 << ")], " << a1.a2
3810 << "), ((" << a2.a0.a0 << "), [(" << a2.a1[0].a0 << "), ("
3811 << a2.a1[1].a0 << ")], " << a2.a2 << "), ((" << a3.a0.a0 << "), [("
3812 << a3.a1[0].a0 << "), (" << a3.a1[1].a0 << ")], " << a3.a2
3813 << "), ((" << a4.a0.a0 << "), [(" << a4.a1[0].a0 << "), ("
3814 << a4.a1[1].a0 << ")], " << a4.a2 << "))"
3815 << "\n";
3816
3817 double result = 0;
3818
3819 result += a0.a0.a0;
3820 result += a0.a1[0].a0;
3821 result += a0.a1[1].a0;
3822 result += a0.a2;
3823 result += a1.a0.a0;
3824 result += a1.a1[0].a0;
3825 result += a1.a1[1].a0;
3826 result += a1.a2;
3827 result += a2.a0.a0;
3828 result += a2.a1[0].a0;
3829 result += a2.a1[1].a0;
3830 result += a2.a2;
3831 result += a3.a0.a0;
3832 result += a3.a1[0].a0;
3833 result += a3.a1[1].a0;
3834 result += a3.a2;
3835 result += a4.a0.a0;
3836 result += a4.a1[0].a0;
3837 result += a4.a1[1].a0;
3838 result += a4.a2;
3839
3840 std::cout << "result = " << result << "\n";
3841
3842 return result;
3843}
3844
3845// Used for testing structs and unions by value.
3846// On x64, arguments are split over FP and int registers.
3847// On x64, it will exhaust the integer registers with the 6th argument.
3848// The rest goes on the stack.
3849// On arm, arguments are 4 byte aligned.
3861 std::cout << "PassStructStruct16BytesMixed3x10"
3862 << "(((" << a0.a0.a0 << "), [(" << a0.a1[0].a0 << ", "
3863 << a0.a1[0].a1 << ", " << a0.a1[0].a2 << ")], [" << a0.a2[0] << ", "
3864 << a0.a2[1] << "]), ((" << a1.a0.a0 << "), [(" << a1.a1[0].a0
3865 << ", " << a1.a1[0].a1 << ", " << a1.a1[0].a2 << ")], [" << a1.a2[0]
3866 << ", " << a1.a2[1] << "]), ((" << a2.a0.a0 << "), [("
3867 << a2.a1[0].a0 << ", " << a2.a1[0].a1 << ", " << a2.a1[0].a2
3868 << ")], [" << a2.a2[0] << ", " << a2.a2[1] << "]), ((" << a3.a0.a0
3869 << "), [(" << a3.a1[0].a0 << ", " << a3.a1[0].a1 << ", "
3870 << a3.a1[0].a2 << ")], [" << a3.a2[0] << ", " << a3.a2[1]
3871 << "]), ((" << a4.a0.a0 << "), [(" << a4.a1[0].a0 << ", "
3872 << a4.a1[0].a1 << ", " << a4.a1[0].a2 << ")], [" << a4.a2[0] << ", "
3873 << a4.a2[1] << "]), ((" << a5.a0.a0 << "), [(" << a5.a1[0].a0
3874 << ", " << a5.a1[0].a1 << ", " << a5.a1[0].a2 << ")], [" << a5.a2[0]
3875 << ", " << a5.a2[1] << "]), ((" << a6.a0.a0 << "), [("
3876 << a6.a1[0].a0 << ", " << a6.a1[0].a1 << ", " << a6.a1[0].a2
3877 << ")], [" << a6.a2[0] << ", " << a6.a2[1] << "]), ((" << a7.a0.a0
3878 << "), [(" << a7.a1[0].a0 << ", " << a7.a1[0].a1 << ", "
3879 << a7.a1[0].a2 << ")], [" << a7.a2[0] << ", " << a7.a2[1]
3880 << "]), ((" << a8.a0.a0 << "), [(" << a8.a1[0].a0 << ", "
3881 << a8.a1[0].a1 << ", " << a8.a1[0].a2 << ")], [" << a8.a2[0] << ", "
3882 << a8.a2[1] << "]), ((" << a9.a0.a0 << "), [(" << a9.a1[0].a0
3883 << ", " << a9.a1[0].a1 << ", " << a9.a1[0].a2 << ")], [" << a9.a2[0]
3884 << ", " << a9.a2[1] << "]))"
3885 << "\n";
3886
3887 float result = 0;
3888
3889 result += a0.a0.a0;
3890 result += a0.a1[0].a0;
3891 result += a0.a1[0].a1;
3892 result += a0.a1[0].a2;
3893 result += a0.a2[0];
3894 result += a0.a2[1];
3895 result += a1.a0.a0;
3896 result += a1.a1[0].a0;
3897 result += a1.a1[0].a1;
3898 result += a1.a1[0].a2;
3899 result += a1.a2[0];
3900 result += a1.a2[1];
3901 result += a2.a0.a0;
3902 result += a2.a1[0].a0;
3903 result += a2.a1[0].a1;
3904 result += a2.a1[0].a2;
3905 result += a2.a2[0];
3906 result += a2.a2[1];
3907 result += a3.a0.a0;
3908 result += a3.a1[0].a0;
3909 result += a3.a1[0].a1;
3910 result += a3.a1[0].a2;
3911 result += a3.a2[0];
3912 result += a3.a2[1];
3913 result += a4.a0.a0;
3914 result += a4.a1[0].a0;
3915 result += a4.a1[0].a1;
3916 result += a4.a1[0].a2;
3917 result += a4.a2[0];
3918 result += a4.a2[1];
3919 result += a5.a0.a0;
3920 result += a5.a1[0].a0;
3921 result += a5.a1[0].a1;
3922 result += a5.a1[0].a2;
3923 result += a5.a2[0];
3924 result += a5.a2[1];
3925 result += a6.a0.a0;
3926 result += a6.a1[0].a0;
3927 result += a6.a1[0].a1;
3928 result += a6.a1[0].a2;
3929 result += a6.a2[0];
3930 result += a6.a2[1];
3931 result += a7.a0.a0;
3932 result += a7.a1[0].a0;
3933 result += a7.a1[0].a1;
3934 result += a7.a1[0].a2;
3935 result += a7.a2[0];
3936 result += a7.a2[1];
3937 result += a8.a0.a0;
3938 result += a8.a1[0].a0;
3939 result += a8.a1[0].a1;
3940 result += a8.a1[0].a2;
3941 result += a8.a2[0];
3942 result += a8.a2[1];
3943 result += a9.a0.a0;
3944 result += a9.a1[0].a0;
3945 result += a9.a1[0].a1;
3946 result += a9.a1[0].a2;
3947 result += a9.a2[0];
3948 result += a9.a2[1];
3949
3950 std::cout << "result = " << result << "\n";
3951
3952 return result;
3953}
3954
3955// Used for testing structs and unions by value.
3956// Test multi dimensional inline array struct as argument.
3958 uint8_t a0,
3960 uint8_t a2,
3962 uint8_t a4,
3964 uint8_t a6) {
3965 std::cout << "PassUint8Struct32BytesInlineArrayMultiDimensionalI"
3966 << "(" << static_cast<int>(a0) << ", ([[[[["
3967 << static_cast<int>(a1.a0[0][0][0][0][0]) << ", "
3968 << static_cast<int>(a1.a0[0][0][0][0][1]) << "], ["
3969 << static_cast<int>(a1.a0[0][0][0][1][0]) << ", "
3970 << static_cast<int>(a1.a0[0][0][0][1][1]) << "]], [["
3971 << static_cast<int>(a1.a0[0][0][1][0][0]) << ", "
3972 << static_cast<int>(a1.a0[0][0][1][0][1]) << "], ["
3973 << static_cast<int>(a1.a0[0][0][1][1][0]) << ", "
3974 << static_cast<int>(a1.a0[0][0][1][1][1]) << "]]], [[["
3975 << static_cast<int>(a1.a0[0][1][0][0][0]) << ", "
3976 << static_cast<int>(a1.a0[0][1][0][0][1]) << "], ["
3977 << static_cast<int>(a1.a0[0][1][0][1][0]) << ", "
3978 << static_cast<int>(a1.a0[0][1][0][1][1]) << "]], [["
3979 << static_cast<int>(a1.a0[0][1][1][0][0]) << ", "
3980 << static_cast<int>(a1.a0[0][1][1][0][1]) << "], ["
3981 << static_cast<int>(a1.a0[0][1][1][1][0]) << ", "
3982 << static_cast<int>(a1.a0[0][1][1][1][1]) << "]]]], [[[["
3983 << static_cast<int>(a1.a0[1][0][0][0][0]) << ", "
3984 << static_cast<int>(a1.a0[1][0][0][0][1]) << "], ["
3985 << static_cast<int>(a1.a0[1][0][0][1][0]) << ", "
3986 << static_cast<int>(a1.a0[1][0][0][1][1]) << "]], [["
3987 << static_cast<int>(a1.a0[1][0][1][0][0]) << ", "
3988 << static_cast<int>(a1.a0[1][0][1][0][1]) << "], ["
3989 << static_cast<int>(a1.a0[1][0][1][1][0]) << ", "
3990 << static_cast<int>(a1.a0[1][0][1][1][1]) << "]]], [[["
3991 << static_cast<int>(a1.a0[1][1][0][0][0]) << ", "
3992 << static_cast<int>(a1.a0[1][1][0][0][1]) << "], ["
3993 << static_cast<int>(a1.a0[1][1][0][1][0]) << ", "
3994 << static_cast<int>(a1.a0[1][1][0][1][1]) << "]], [["
3995 << static_cast<int>(a1.a0[1][1][1][0][0]) << ", "
3996 << static_cast<int>(a1.a0[1][1][1][0][1]) << "], ["
3997 << static_cast<int>(a1.a0[1][1][1][1][0]) << ", "
3998 << static_cast<int>(a1.a0[1][1][1][1][1]) << "]]]]]), "
3999 << static_cast<int>(a2) << ", ([[["
4000 << static_cast<int>(a3.a0[0][0][0]) << ", "
4001 << static_cast<int>(a3.a0[0][0][1]) << "], ["
4002 << static_cast<int>(a3.a0[0][1][0]) << ", "
4003 << static_cast<int>(a3.a0[0][1][1]) << "]], [["
4004 << static_cast<int>(a3.a0[1][0][0]) << ", "
4005 << static_cast<int>(a3.a0[1][0][1]) << "], ["
4006 << static_cast<int>(a3.a0[1][1][0]) << ", "
4007 << static_cast<int>(a3.a0[1][1][1]) << "]]]), "
4008 << static_cast<int>(a4) << ", ([[["
4009 << static_cast<int>(a5.a0[0][0][0]) << ", "
4010 << static_cast<int>(a5.a0[0][0][1]) << "], ["
4011 << static_cast<int>(a5.a0[0][1][0]) << ", "
4012 << static_cast<int>(a5.a0[0][1][1]) << "]], [["
4013 << static_cast<int>(a5.a0[1][0][0]) << ", "
4014 << static_cast<int>(a5.a0[1][0][1]) << "], ["
4015 << static_cast<int>(a5.a0[1][1][0]) << ", "
4016 << static_cast<int>(a5.a0[1][1][1]) << "]]]), "
4017 << static_cast<int>(a6) << ")"
4018 << "\n";
4019
4020 uint32_t result = 0;
4021
4022 result += a0;
4023 result += a1.a0[0][0][0][0][0];
4024 result += a1.a0[0][0][0][0][1];
4025 result += a1.a0[0][0][0][1][0];
4026 result += a1.a0[0][0][0][1][1];
4027 result += a1.a0[0][0][1][0][0];
4028 result += a1.a0[0][0][1][0][1];
4029 result += a1.a0[0][0][1][1][0];
4030 result += a1.a0[0][0][1][1][1];
4031 result += a1.a0[0][1][0][0][0];
4032 result += a1.a0[0][1][0][0][1];
4033 result += a1.a0[0][1][0][1][0];
4034 result += a1.a0[0][1][0][1][1];
4035 result += a1.a0[0][1][1][0][0];
4036 result += a1.a0[0][1][1][0][1];
4037 result += a1.a0[0][1][1][1][0];
4038 result += a1.a0[0][1][1][1][1];
4039 result += a1.a0[1][0][0][0][0];
4040 result += a1.a0[1][0][0][0][1];
4041 result += a1.a0[1][0][0][1][0];
4042 result += a1.a0[1][0][0][1][1];
4043 result += a1.a0[1][0][1][0][0];
4044 result += a1.a0[1][0][1][0][1];
4045 result += a1.a0[1][0][1][1][0];
4046 result += a1.a0[1][0][1][1][1];
4047 result += a1.a0[1][1][0][0][0];
4048 result += a1.a0[1][1][0][0][1];
4049 result += a1.a0[1][1][0][1][0];
4050 result += a1.a0[1][1][0][1][1];
4051 result += a1.a0[1][1][1][0][0];
4052 result += a1.a0[1][1][1][0][1];
4053 result += a1.a0[1][1][1][1][0];
4054 result += a1.a0[1][1][1][1][1];
4055 result += a2;
4056 result += a3.a0[0][0][0];
4057 result += a3.a0[0][0][1];
4058 result += a3.a0[0][1][0];
4059 result += a3.a0[0][1][1];
4060 result += a3.a0[1][0][0];
4061 result += a3.a0[1][0][1];
4062 result += a3.a0[1][1][0];
4063 result += a3.a0[1][1][1];
4064 result += a4;
4065 result += a5.a0[0][0][0];
4066 result += a5.a0[0][0][1];
4067 result += a5.a0[0][1][0];
4068 result += a5.a0[0][1][1];
4069 result += a5.a0[1][0][0];
4070 result += a5.a0[1][0][1];
4071 result += a5.a0[1][1][0];
4072 result += a5.a0[1][1][1];
4073 result += a6;
4074
4075 std::cout << "result = " << result << "\n";
4076
4077 return result;
4078}
4079
4080// Used for testing structs and unions by value.
4081// Test struct in multi dimensional inline array.
4083 uint8_t a0,
4085 uint8_t a2) {
4086 std::cout << "PassUint8Struct4BytesInlineArrayMultiDimensionalIn"
4087 << "(" << static_cast<int>(a0) << ", ([[("
4088 << static_cast<int>(a1.a0[0][0].a0) << "), ("
4089 << static_cast<int>(a1.a0[0][1].a0) << ")], [("
4090 << static_cast<int>(a1.a0[1][0].a0) << "), ("
4091 << static_cast<int>(a1.a0[1][1].a0) << ")]]), "
4092 << static_cast<int>(a2) << ")"
4093 << "\n";
4094
4095 uint32_t result = 0;
4096
4097 result += a0;
4098 result += a1.a0[0][0].a0;
4099 result += a1.a0[0][1].a0;
4100 result += a1.a0[1][0].a0;
4101 result += a1.a0[1][1].a0;
4102 result += a2;
4103
4104 std::cout << "result = " << result << "\n";
4105
4106 return result;
4107}
4108
4109// Used for testing structs and unions by value.
4110// Small struct with mis-aligned member.
4121 std::cout << "PassStruct3BytesPackedIntx10"
4122 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << "), ("
4123 << static_cast<int>(a1.a0) << ", " << a1.a1 << "), ("
4124 << static_cast<int>(a2.a0) << ", " << a2.a1 << "), ("
4125 << static_cast<int>(a3.a0) << ", " << a3.a1 << "), ("
4126 << static_cast<int>(a4.a0) << ", " << a4.a1 << "), ("
4127 << static_cast<int>(a5.a0) << ", " << a5.a1 << "), ("
4128 << static_cast<int>(a6.a0) << ", " << a6.a1 << "), ("
4129 << static_cast<int>(a7.a0) << ", " << a7.a1 << "), ("
4130 << static_cast<int>(a8.a0) << ", " << a8.a1 << "), ("
4131 << static_cast<int>(a9.a0) << ", " << a9.a1 << "))"
4132 << "\n";
4133
4134 int64_t result = 0;
4135
4136 result += a0.a0;
4137 result += a0.a1;
4138 result += a1.a0;
4139 result += a1.a1;
4140 result += a2.a0;
4141 result += a2.a1;
4142 result += a3.a0;
4143 result += a3.a1;
4144 result += a4.a0;
4145 result += a4.a1;
4146 result += a5.a0;
4147 result += a5.a1;
4148 result += a6.a0;
4149 result += a6.a1;
4150 result += a7.a0;
4151 result += a7.a1;
4152 result += a8.a0;
4153 result += a8.a1;
4154 result += a9.a0;
4155 result += a9.a1;
4156
4157 std::cout << "result = " << result << "\n";
4158
4159 return result;
4160}
4161
4162// Used for testing structs and unions by value.
4163// Struct with mis-aligned member.
4174 std::cout << "PassStruct8BytesPackedIntx10"
4175 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
4176 << static_cast<int>(a0.a2) << ", " << static_cast<int>(a0.a3)
4177 << ", " << static_cast<int>(a0.a4) << "), ("
4178 << static_cast<int>(a1.a0) << ", " << a1.a1 << ", "
4179 << static_cast<int>(a1.a2) << ", " << static_cast<int>(a1.a3)
4180 << ", " << static_cast<int>(a1.a4) << "), ("
4181 << static_cast<int>(a2.a0) << ", " << a2.a1 << ", "
4182 << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3)
4183 << ", " << static_cast<int>(a2.a4) << "), ("
4184 << static_cast<int>(a3.a0) << ", " << a3.a1 << ", "
4185 << static_cast<int>(a3.a2) << ", " << static_cast<int>(a3.a3)
4186 << ", " << static_cast<int>(a3.a4) << "), ("
4187 << static_cast<int>(a4.a0) << ", " << a4.a1 << ", "
4188 << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3)
4189 << ", " << static_cast<int>(a4.a4) << "), ("
4190 << static_cast<int>(a5.a0) << ", " << a5.a1 << ", "
4191 << static_cast<int>(a5.a2) << ", " << static_cast<int>(a5.a3)
4192 << ", " << static_cast<int>(a5.a4) << "), ("
4193 << static_cast<int>(a6.a0) << ", " << a6.a1 << ", "
4194 << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3)
4195 << ", " << static_cast<int>(a6.a4) << "), ("
4196 << static_cast<int>(a7.a0) << ", " << a7.a1 << ", "
4197 << static_cast<int>(a7.a2) << ", " << static_cast<int>(a7.a3)
4198 << ", " << static_cast<int>(a7.a4) << "), ("
4199 << static_cast<int>(a8.a0) << ", " << a8.a1 << ", "
4200 << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3)
4201 << ", " << static_cast<int>(a8.a4) << "), ("
4202 << static_cast<int>(a9.a0) << ", " << a9.a1 << ", "
4203 << static_cast<int>(a9.a2) << ", " << static_cast<int>(a9.a3)
4204 << ", " << static_cast<int>(a9.a4) << "))"
4205 << "\n";
4206
4207 int64_t result = 0;
4208
4209 result += a0.a0;
4210 result += a0.a1;
4211 result += a0.a2;
4212 result += a0.a3;
4213 result += a0.a4;
4214 result += a1.a0;
4215 result += a1.a1;
4216 result += a1.a2;
4217 result += a1.a3;
4218 result += a1.a4;
4219 result += a2.a0;
4220 result += a2.a1;
4221 result += a2.a2;
4222 result += a2.a3;
4223 result += a2.a4;
4224 result += a3.a0;
4225 result += a3.a1;
4226 result += a3.a2;
4227 result += a3.a3;
4228 result += a3.a4;
4229 result += a4.a0;
4230 result += a4.a1;
4231 result += a4.a2;
4232 result += a4.a3;
4233 result += a4.a4;
4234 result += a5.a0;
4235 result += a5.a1;
4236 result += a5.a2;
4237 result += a5.a3;
4238 result += a5.a4;
4239 result += a6.a0;
4240 result += a6.a1;
4241 result += a6.a2;
4242 result += a6.a3;
4243 result += a6.a4;
4244 result += a7.a0;
4245 result += a7.a1;
4246 result += a7.a2;
4247 result += a7.a3;
4248 result += a7.a4;
4249 result += a8.a0;
4250 result += a8.a1;
4251 result += a8.a2;
4252 result += a8.a3;
4253 result += a8.a4;
4254 result += a9.a0;
4255 result += a9.a1;
4256 result += a9.a2;
4257 result += a9.a3;
4258 result += a9.a4;
4259
4260 std::cout << "result = " << result << "\n";
4261
4262 return result;
4263}
4264
4265// Used for testing structs and unions by value.
4266// Struct with mis-aligned member.
4267// Tests backfilling of CPU and FPU registers.
4279 double a10,
4280 int32_t a11,
4281 int32_t a12) {
4282 std::cout << "PassStruct9BytesPackedMixedx10DoubleInt32x2"
4283 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << "), ("
4284 << static_cast<int>(a1.a0) << ", " << a1.a1 << "), ("
4285 << static_cast<int>(a2.a0) << ", " << a2.a1 << "), ("
4286 << static_cast<int>(a3.a0) << ", " << a3.a1 << "), ("
4287 << static_cast<int>(a4.a0) << ", " << a4.a1 << "), ("
4288 << static_cast<int>(a5.a0) << ", " << a5.a1 << "), ("
4289 << static_cast<int>(a6.a0) << ", " << a6.a1 << "), ("
4290 << static_cast<int>(a7.a0) << ", " << a7.a1 << "), ("
4291 << static_cast<int>(a8.a0) << ", " << a8.a1 << "), ("
4292 << static_cast<int>(a9.a0) << ", " << a9.a1 << "), " << a10 << ", "
4293 << a11 << ", " << a12 << ")"
4294 << "\n";
4295
4296 double result = 0;
4297
4298 result += a0.a0;
4299 result += a0.a1;
4300 result += a1.a0;
4301 result += a1.a1;
4302 result += a2.a0;
4303 result += a2.a1;
4304 result += a3.a0;
4305 result += a3.a1;
4306 result += a4.a0;
4307 result += a4.a1;
4308 result += a5.a0;
4309 result += a5.a1;
4310 result += a6.a0;
4311 result += a6.a1;
4312 result += a7.a0;
4313 result += a7.a1;
4314 result += a8.a0;
4315 result += a8.a1;
4316 result += a9.a0;
4317 result += a9.a1;
4318 result += a10;
4319 result += a11;
4320 result += a12;
4321
4322 std::cout << "result = " << result << "\n";
4323
4324 return result;
4325}
4326
4327// Used for testing structs and unions by value.
4328// This packed struct happens to have only aligned members.
4330 std::cout << "PassStruct5BytesPackedMixed"
4331 << "((" << a0.a0 << ", " << static_cast<int>(a0.a1) << "))"
4332 << "\n";
4333
4334 double result = 0;
4335
4336 result += a0.a0;
4337 result += a0.a1;
4338
4339 std::cout << "result = " << result << "\n";
4340
4341 return result;
4342}
4343
4344// Used for testing structs and unions by value.
4345// Check alignment of packed struct in non-packed struct.
4348 std::cout << "PassStructNestedAlignmentStruct5BytesPackedMixed"
4349 << "((" << static_cast<int>(a0.a0) << ", (" << a0.a1.a0 << ", "
4350 << static_cast<int>(a0.a1.a1) << ")))"
4351 << "\n";
4352
4353 double result = 0;
4354
4355 result += a0.a0;
4356 result += a0.a1.a0;
4357 result += a0.a1.a1;
4358
4359 std::cout << "result = " << result << "\n";
4360
4361 return result;
4362}
4363
4364// Used for testing structs and unions by value.
4365// Check alignment of packed struct array in non-packed struct.
4368 std::cout << "PassStruct6BytesInlineArrayInt"
4369 << "(([(" << static_cast<int>(a0.a0[0].a0) << ", " << a0.a0[0].a1
4370 << "), (" << static_cast<int>(a0.a0[1].a0) << ", " << a0.a0[1].a1
4371 << ")]))"
4372 << "\n";
4373
4374 double result = 0;
4375
4376 result += a0.a0[0].a0;
4377 result += a0.a0[0].a1;
4378 result += a0.a0[1].a0;
4379 result += a0.a0[1].a1;
4380
4381 std::cout << "result = " << result << "\n";
4382
4383 return result;
4384}
4385
4386// Used for testing structs and unions by value.
4387// Check alignment of packed struct array in non-packed struct.
4390 std::cout << "PassStruct15BytesInlineArrayMixed"
4391 << "(([(" << a0.a0[0].a0 << ", " << static_cast<int>(a0.a0[0].a1)
4392 << "), (" << a0.a0[1].a0 << ", " << static_cast<int>(a0.a0[1].a1)
4393 << "), (" << a0.a0[2].a0 << ", " << static_cast<int>(a0.a0[2].a1)
4394 << ")]))"
4395 << "\n";
4396
4397 double result = 0;
4398
4399 result += a0.a0[0].a0;
4400 result += a0.a0[0].a1;
4401 result += a0.a0[1].a0;
4402 result += a0.a0[1].a1;
4403 result += a0.a0[2].a0;
4404 result += a0.a0[2].a1;
4405
4406 std::cout << "result = " << result << "\n";
4407
4408 return result;
4409}
4410
4411// Used for testing structs and unions by value.
4412// Check placement of mixed integer/float union.
4422 Union4BytesMixed a9) {
4423 std::cout << "PassUnion4BytesMixedx10"
4424 << "((" << a0.a0 << "), (" << a1.a0 << "), (" << a2.a0 << "), ("
4425 << a3.a0 << "), (" << a4.a0 << "), (" << a5.a0 << "), (" << a6.a0
4426 << "), (" << a7.a0 << "), (" << a8.a0 << "), (" << a9.a0 << "))"
4427 << "\n";
4428
4429 double result = 0;
4430
4431 result += a0.a0;
4432 result += a1.a0;
4433 result += a2.a0;
4434 result += a3.a0;
4435 result += a4.a0;
4436 result += a5.a0;
4437 result += a6.a0;
4438 result += a7.a0;
4439 result += a8.a0;
4440 result += a9.a0;
4441
4442 std::cout << "result = " << result << "\n";
4443
4444 return result;
4445}
4446
4447// Used for testing structs and unions by value.
4448// Check placement of mixed floats union.
4459 std::cout << "PassUnion8BytesNestedFloatx10"
4460 << "((" << a0.a0 << "), (" << a1.a0 << "), (" << a2.a0 << "), ("
4461 << a3.a0 << "), (" << a4.a0 << "), (" << a5.a0 << "), (" << a6.a0
4462 << "), (" << a7.a0 << "), (" << a8.a0 << "), (" << a9.a0 << "))"
4463 << "\n";
4464
4465 double result = 0;
4466
4467 result += a0.a0;
4468 result += a1.a0;
4469 result += a2.a0;
4470 result += a3.a0;
4471 result += a4.a0;
4472 result += a5.a0;
4473 result += a6.a0;
4474 result += a7.a0;
4475 result += a8.a0;
4476 result += a9.a0;
4477
4478 std::cout << "result = " << result << "\n";
4479
4480 return result;
4481}
4482
4483// Used for testing structs and unions by value.
4484// Mixed-size union argument.
4495 std::cout << "PassUnion9BytesNestedIntx10"
4496 << "(((" << a0.a0.a0 << ", " << a0.a0.a1 << ", " << a0.a0.a2
4497 << ")), ((" << a1.a0.a0 << ", " << a1.a0.a1 << ", " << a1.a0.a2
4498 << ")), ((" << a2.a0.a0 << ", " << a2.a0.a1 << ", " << a2.a0.a2
4499 << ")), ((" << a3.a0.a0 << ", " << a3.a0.a1 << ", " << a3.a0.a2
4500 << ")), ((" << a4.a0.a0 << ", " << a4.a0.a1 << ", " << a4.a0.a2
4501 << ")), ((" << a5.a0.a0 << ", " << a5.a0.a1 << ", " << a5.a0.a2
4502 << ")), ((" << a6.a0.a0 << ", " << a6.a0.a1 << ", " << a6.a0.a2
4503 << ")), ((" << a7.a0.a0 << ", " << a7.a0.a1 << ", " << a7.a0.a2
4504 << ")), ((" << a8.a0.a0 << ", " << a8.a0.a1 << ", " << a8.a0.a2
4505 << ")), ((" << a9.a0.a0 << ", " << a9.a0.a1 << ", " << a9.a0.a2
4506 << ")))"
4507 << "\n";
4508
4509 double result = 0;
4510
4511 result += a0.a0.a0;
4512 result += a0.a0.a1;
4513 result += a0.a0.a2;
4514 result += a1.a0.a0;
4515 result += a1.a0.a1;
4516 result += a1.a0.a2;
4517 result += a2.a0.a0;
4518 result += a2.a0.a1;
4519 result += a2.a0.a2;
4520 result += a3.a0.a0;
4521 result += a3.a0.a1;
4522 result += a3.a0.a2;
4523 result += a4.a0.a0;
4524 result += a4.a0.a1;
4525 result += a4.a0.a2;
4526 result += a5.a0.a0;
4527 result += a5.a0.a1;
4528 result += a5.a0.a2;
4529 result += a6.a0.a0;
4530 result += a6.a0.a1;
4531 result += a6.a0.a2;
4532 result += a7.a0.a0;
4533 result += a7.a0.a1;
4534 result += a7.a0.a2;
4535 result += a8.a0.a0;
4536 result += a8.a0.a1;
4537 result += a8.a0.a2;
4538 result += a9.a0.a0;
4539 result += a9.a0.a1;
4540 result += a9.a0.a2;
4541
4542 std::cout << "result = " << result << "\n";
4543
4544 return result;
4545}
4546
4547// Used for testing structs and unions by value.
4548// Union with homogenous floats.
4560 std::cout << "PassUnion16BytesNestedInlineArrayFloatx10"
4561 << "(([" << a0.a0[0] << ", " << a0.a0[1] << ", " << a0.a0[2] << ", "
4562 << a0.a0[3] << "]), ([" << a1.a0[0] << ", " << a1.a0[1] << ", "
4563 << a1.a0[2] << ", " << a1.a0[3] << "]), ([" << a2.a0[0] << ", "
4564 << a2.a0[1] << ", " << a2.a0[2] << ", " << a2.a0[3] << "]), (["
4565 << a3.a0[0] << ", " << a3.a0[1] << ", " << a3.a0[2] << ", "
4566 << a3.a0[3] << "]), ([" << a4.a0[0] << ", " << a4.a0[1] << ", "
4567 << a4.a0[2] << ", " << a4.a0[3] << "]), ([" << a5.a0[0] << ", "
4568 << a5.a0[1] << ", " << a5.a0[2] << ", " << a5.a0[3] << "]), (["
4569 << a6.a0[0] << ", " << a6.a0[1] << ", " << a6.a0[2] << ", "
4570 << a6.a0[3] << "]), ([" << a7.a0[0] << ", " << a7.a0[1] << ", "
4571 << a7.a0[2] << ", " << a7.a0[3] << "]), ([" << a8.a0[0] << ", "
4572 << a8.a0[1] << ", " << a8.a0[2] << ", " << a8.a0[3] << "]), (["
4573 << a9.a0[0] << ", " << a9.a0[1] << ", " << a9.a0[2] << ", "
4574 << a9.a0[3] << "]))"
4575 << "\n";
4576
4577 double result = 0;
4578
4579 result += a0.a0[0];
4580 result += a0.a0[1];
4581 result += a0.a0[2];
4582 result += a0.a0[3];
4583 result += a1.a0[0];
4584 result += a1.a0[1];
4585 result += a1.a0[2];
4586 result += a1.a0[3];
4587 result += a2.a0[0];
4588 result += a2.a0[1];
4589 result += a2.a0[2];
4590 result += a2.a0[3];
4591 result += a3.a0[0];
4592 result += a3.a0[1];
4593 result += a3.a0[2];
4594 result += a3.a0[3];
4595 result += a4.a0[0];
4596 result += a4.a0[1];
4597 result += a4.a0[2];
4598 result += a4.a0[3];
4599 result += a5.a0[0];
4600 result += a5.a0[1];
4601 result += a5.a0[2];
4602 result += a5.a0[3];
4603 result += a6.a0[0];
4604 result += a6.a0[1];
4605 result += a6.a0[2];
4606 result += a6.a0[3];
4607 result += a7.a0[0];
4608 result += a7.a0[1];
4609 result += a7.a0[2];
4610 result += a7.a0[3];
4611 result += a8.a0[0];
4612 result += a8.a0[1];
4613 result += a8.a0[2];
4614 result += a8.a0[3];
4615 result += a9.a0[0];
4616 result += a9.a0[1];
4617 result += a9.a0[2];
4618 result += a9.a0[3];
4619
4620 std::cout << "result = " << result << "\n";
4621
4622 return result;
4623}
4624
4625// Used for testing structs and unions by value.
4626// Union with homogenous floats.
4637 std::cout << "PassUnion16BytesNestedFloatx10"
4638 << "(((" << a0.a0.a0 << ", " << a0.a0.a1 << ")), ((" << a1.a0.a0
4639 << ", " << a1.a0.a1 << ")), ((" << a2.a0.a0 << ", " << a2.a0.a1
4640 << ")), ((" << a3.a0.a0 << ", " << a3.a0.a1 << ")), ((" << a4.a0.a0
4641 << ", " << a4.a0.a1 << ")), ((" << a5.a0.a0 << ", " << a5.a0.a1
4642 << ")), ((" << a6.a0.a0 << ", " << a6.a0.a1 << ")), ((" << a7.a0.a0
4643 << ", " << a7.a0.a1 << ")), ((" << a8.a0.a0 << ", " << a8.a0.a1
4644 << ")), ((" << a9.a0.a0 << ", " << a9.a0.a1 << ")))"
4645 << "\n";
4646
4647 double result = 0;
4648
4649 result += a0.a0.a0;
4650 result += a0.a0.a1;
4651 result += a1.a0.a0;
4652 result += a1.a0.a1;
4653 result += a2.a0.a0;
4654 result += a2.a0.a1;
4655 result += a3.a0.a0;
4656 result += a3.a0.a1;
4657 result += a4.a0.a0;
4658 result += a4.a0.a1;
4659 result += a5.a0.a0;
4660 result += a5.a0.a1;
4661 result += a6.a0.a0;
4662 result += a6.a0.a1;
4663 result += a7.a0.a0;
4664 result += a7.a0.a1;
4665 result += a8.a0.a0;
4666 result += a8.a0.a1;
4667 result += a9.a0.a0;
4668 result += a9.a0.a1;
4669
4670 std::cout << "result = " << result << "\n";
4671
4672 return result;
4673}
4674
4675// Used for testing structs and unions by value.
4676// Passing bools and a struct with bools.
4677// Exhausts the registers to test bools and the bool struct alignment on the
4678// stack.
4680 uint8_t a0,
4681 bool a1,
4682 bool a2,
4683 bool a3,
4684 bool a4,
4685 bool a5,
4686 bool a6,
4687 bool a7,
4688 bool a8,
4689 bool a9,
4691 bool a11) {
4692 std::cout << "PassUint8Boolx9Struct10BytesHomogeneousBoolBool"
4693 << "(" << static_cast<int>(a0) << ", " << a1 << ", " << a2 << ", "
4694 << a3 << ", " << a4 << ", " << a5 << ", " << a6 << ", " << a7
4695 << ", " << a8 << ", " << a9 << ", (" << a10.a0 << ", " << a10.a1
4696 << ", " << a10.a2 << ", " << a10.a3 << ", " << a10.a4 << ", "
4697 << a10.a5 << ", " << a10.a6 << ", " << a10.a7 << ", " << a10.a8
4698 << ", " << a10.a9 << "), " << a11 << ")"
4699 << "\n";
4700
4701 int32_t result = 0;
4702
4703 result += a0;
4704 result += a1 ? 1 : 0;
4705 result += a2 ? 1 : 0;
4706 result += a3 ? 1 : 0;
4707 result += a4 ? 1 : 0;
4708 result += a5 ? 1 : 0;
4709 result += a6 ? 1 : 0;
4710 result += a7 ? 1 : 0;
4711 result += a8 ? 1 : 0;
4712 result += a9 ? 1 : 0;
4713 result += a10.a0 ? 1 : 0;
4714 result += a10.a1 ? 1 : 0;
4715 result += a10.a2 ? 1 : 0;
4716 result += a10.a3 ? 1 : 0;
4717 result += a10.a4 ? 1 : 0;
4718 result += a10.a5 ? 1 : 0;
4719 result += a10.a6 ? 1 : 0;
4720 result += a10.a7 ? 1 : 0;
4721 result += a10.a8 ? 1 : 0;
4722 result += a10.a9 ? 1 : 0;
4723 result += a11 ? 1 : 0;
4724
4725 std::cout << "result = " << result << "\n";
4726
4727 return result;
4728}
4729
4730// Used for testing structs and unions by value.
4731// Passing bools and a struct with bools.
4732// Exhausts the registers to test bools and the bool struct alignment on the
4733// stack.
4735 uint8_t a0,
4736 bool a1,
4737 bool a2,
4738 bool a3,
4739 bool a4,
4740 bool a5,
4741 bool a6,
4742 bool a7,
4743 bool a8,
4744 bool a9,
4746 bool a11) {
4747 std::cout << "PassUint8Boolx9Struct10BytesInlineArrayBoolBool"
4748 << "(" << static_cast<int>(a0) << ", " << a1 << ", " << a2 << ", "
4749 << a3 << ", " << a4 << ", " << a5 << ", " << a6 << ", " << a7
4750 << ", " << a8 << ", " << a9 << ", ([" << a10.a0[0] << ", "
4751 << a10.a0[1] << ", " << a10.a0[2] << ", " << a10.a0[3] << ", "
4752 << a10.a0[4] << ", " << a10.a0[5] << ", " << a10.a0[6] << ", "
4753 << a10.a0[7] << ", " << a10.a0[8] << ", " << a10.a0[9] << "]), "
4754 << a11 << ")"
4755 << "\n";
4756
4757 int32_t result = 0;
4758
4759 result += a0;
4760 result += a1 ? 1 : 0;
4761 result += a2 ? 1 : 0;
4762 result += a3 ? 1 : 0;
4763 result += a4 ? 1 : 0;
4764 result += a5 ? 1 : 0;
4765 result += a6 ? 1 : 0;
4766 result += a7 ? 1 : 0;
4767 result += a8 ? 1 : 0;
4768 result += a9 ? 1 : 0;
4769 result += a10.a0[0] ? 1 : 0;
4770 result += a10.a0[1] ? 1 : 0;
4771 result += a10.a0[2] ? 1 : 0;
4772 result += a10.a0[3] ? 1 : 0;
4773 result += a10.a0[4] ? 1 : 0;
4774 result += a10.a0[5] ? 1 : 0;
4775 result += a10.a0[6] ? 1 : 0;
4776 result += a10.a0[7] ? 1 : 0;
4777 result += a10.a0[8] ? 1 : 0;
4778 result += a10.a0[9] ? 1 : 0;
4779 result += a11 ? 1 : 0;
4780
4781 std::cout << "result = " << result << "\n";
4782
4783 return result;
4784}
4785
4786// Used for testing structs and unions by value.
4787// Returning a bool.
4789 std::cout << "PassUint8Struct1ByteBool"
4790 << "(" << static_cast<int>(a0) << ", (" << a1.a0 << "))"
4791 << "\n";
4792
4793 uint64_t result = 0;
4794
4795 result += a0;
4796 result += a1.a0 ? 1 : 0;
4797
4798 std::cout << "result = " << result << "\n";
4799
4800 return result % 2 != 0;
4801}
4802
4803// Used for testing structs and unions by value.
4804// Returning a wchar.
4806 wchar_t a0,
4808 uintptr_t a2,
4809 uintptr_t a3,
4810 /* NOLINT(runtime/int) */ long a4,
4811 /* NOLINT(runtime/int) */ unsigned long a5) {
4812 std::cout << "PassWCharStructInlineArrayIntUintPtrx2LongUnsigned"
4813 << "(" << a0 << ", ([" << a1.a0[0] << ", " << a1.a0[1] << ", "
4814 << a1.a0[2] << ", " << a1.a0[3] << ", " << a1.a0[4] << ", "
4815 << a1.a0[5] << ", " << a1.a0[6] << ", " << a1.a0[7] << ", "
4816 << a1.a0[8] << ", " << a1.a0[9] << "]), " << a2 << ", " << a3
4817 << ", " << a4 << ", " << a5 << ")"
4818 << "\n";
4819
4820 wchar_t result = 0;
4821
4822 result += a0;
4823 result += a1.a0[0];
4824 result += a1.a0[1];
4825 result += a1.a0[2];
4826 result += a1.a0[3];
4827 result += a1.a0[4];
4828 result += a1.a0[5];
4829 result += a1.a0[6];
4830 result += a1.a0[7];
4831 result += a1.a0[8];
4832 result += a1.a0[9];
4833 result += a2;
4834 result += a3;
4835 result += a4;
4836 result += a5;
4837
4838 std::cout << "result = " << result << "\n";
4839
4840 return result;
4841}
4842
4843// Used for testing structs and unions by value.
4844// Struct stradles last argument register
4845DART_EXPORT int64_t
4847 int64_t a1,
4848 int64_t a2,
4849 int64_t a3,
4850 int64_t a4,
4851 int64_t a5,
4852 int64_t a6,
4854 std::cout << "PassInt64x7Struct12BytesHomogeneousInt32"
4855 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
4856 << ", " << a5 << ", " << a6 << ", (" << a7.a0 << ", " << a7.a1
4857 << ", " << a7.a2 << "))"
4858 << "\n";
4859
4860 int64_t result = 0;
4861
4862 result += a0;
4863 result += a1;
4864 result += a2;
4865 result += a3;
4866 result += a4;
4867 result += a5;
4868 result += a6;
4869 result += a7.a0;
4870 result += a7.a1;
4871 result += a7.a2;
4872
4873 std::cout << "result = " << result << "\n";
4874
4875 return result;
4876}
4877
4878// Used for testing structs and unions by value.
4879// Smallest struct with data.
4881 std::cout << "ReturnStruct1ByteInt"
4882 << "(" << static_cast<int>(a0) << ")"
4883 << "\n";
4884
4886
4887 result.a0 = a0;
4888
4889 std::cout << "result = "
4890 << "(" << static_cast<int>(result.a0) << ")"
4891 << "\n";
4892
4893 return result;
4894}
4895
4896// Used for testing structs and unions by value.
4897// Smaller than word size return value on all architectures.
4898DART_EXPORT Struct3BytesHomogeneousUint8
4899ReturnStruct3BytesHomogeneousUint8(uint8_t a0, uint8_t a1, uint8_t a2) {
4900 std::cout << "ReturnStruct3BytesHomogeneousUint8"
4901 << "(" << static_cast<int>(a0) << ", " << static_cast<int>(a1)
4902 << ", " << static_cast<int>(a2) << ")"
4903 << "\n";
4904
4906
4907 result.a0 = a0;
4908 result.a1 = a1;
4909 result.a2 = a2;
4910
4911 std::cout << "result = "
4912 << "(" << static_cast<int>(result.a0) << ", "
4913 << static_cast<int>(result.a1) << ", "
4914 << static_cast<int>(result.a2) << ")"
4915 << "\n";
4916
4917 return result;
4918}
4919
4920// Used for testing structs and unions by value.
4921// Smaller than word size return value on all architectures.
4922// With alignment rules taken into account size is 4 bytes.
4923DART_EXPORT Struct3BytesInt2ByteAligned
4925 std::cout << "ReturnStruct3BytesInt2ByteAligned"
4926 << "(" << a0 << ", " << static_cast<int>(a1) << ")"
4927 << "\n";
4928
4930
4931 result.a0 = a0;
4932 result.a1 = a1;
4933
4934 std::cout << "result = "
4935 << "(" << result.a0 << ", " << static_cast<int>(result.a1) << ")"
4936 << "\n";
4937
4938 return result;
4939}
4940
4941// Used for testing structs and unions by value.
4942// Word size return value on 32 bit architectures..
4943DART_EXPORT Struct4BytesHomogeneousInt16
4944ReturnStruct4BytesHomogeneousInt16(int16_t a0, int16_t a1) {
4945 std::cout << "ReturnStruct4BytesHomogeneousInt16"
4946 << "(" << a0 << ", " << a1 << ")"
4947 << "\n";
4948
4950
4951 result.a0 = a0;
4952 result.a1 = a1;
4953
4954 std::cout << "result = "
4955 << "(" << result.a0 << ", " << result.a1 << ")"
4956 << "\n";
4957
4958 return result;
4959}
4960
4961// Used for testing structs and unions by value.
4962// Non-wordsize return value.
4963DART_EXPORT Struct7BytesHomogeneousUint8
4965 uint8_t a1,
4966 uint8_t a2,
4967 uint8_t a3,
4968 uint8_t a4,
4969 uint8_t a5,
4970 uint8_t a6) {
4971 std::cout << "ReturnStruct7BytesHomogeneousUint8"
4972 << "(" << static_cast<int>(a0) << ", " << static_cast<int>(a1)
4973 << ", " << static_cast<int>(a2) << ", " << static_cast<int>(a3)
4974 << ", " << static_cast<int>(a4) << ", " << static_cast<int>(a5)
4975 << ", " << static_cast<int>(a6) << ")"
4976 << "\n";
4977
4979
4980 result.a0 = a0;
4981 result.a1 = a1;
4982 result.a2 = a2;
4983 result.a3 = a3;
4984 result.a4 = a4;
4985 result.a5 = a5;
4986 result.a6 = a6;
4987
4988 std::cout << "result = "
4989 << "(" << static_cast<int>(result.a0) << ", "
4990 << static_cast<int>(result.a1) << ", "
4991 << static_cast<int>(result.a2) << ", "
4992 << static_cast<int>(result.a3) << ", "
4993 << static_cast<int>(result.a4) << ", "
4994 << static_cast<int>(result.a5) << ", "
4995 << static_cast<int>(result.a6) << ")"
4996 << "\n";
4997
4998 return result;
4999}
5000
5001// Used for testing structs and unions by value.
5002// Non-wordsize return value.
5003// With alignment rules taken into account size is 8 bytes.
5004DART_EXPORT Struct7BytesInt4ByteAligned
5005ReturnStruct7BytesInt4ByteAligned(int32_t a0, int16_t a1, int8_t a2) {
5006 std::cout << "ReturnStruct7BytesInt4ByteAligned"
5007 << "(" << a0 << ", " << a1 << ", " << static_cast<int>(a2) << ")"
5008 << "\n";
5009
5011
5012 result.a0 = a0;
5013 result.a1 = a1;
5014 result.a2 = a2;
5015
5016 std::cout << "result = "
5017 << "(" << result.a0 << ", " << result.a1 << ", "
5018 << static_cast<int>(result.a2) << ")"
5019 << "\n";
5020
5021 return result;
5022}
5023
5024// Used for testing structs and unions by value.
5025// Return value in integer registers on many architectures.
5027 int16_t a1,
5028 int32_t a2) {
5029 std::cout << "ReturnStruct8BytesInt"
5030 << "(" << a0 << ", " << a1 << ", " << a2 << ")"
5031 << "\n";
5032
5034
5035 result.a0 = a0;
5036 result.a1 = a1;
5037 result.a2 = a2;
5038
5039 std::cout << "result = "
5040 << "(" << result.a0 << ", " << result.a1 << ", " << result.a2 << ")"
5041 << "\n";
5042
5043 return result;
5044}
5045
5046// Used for testing structs and unions by value.
5047// Return value in FP registers on many architectures.
5048DART_EXPORT Struct8BytesHomogeneousFloat
5050 std::cout << "ReturnStruct8BytesHomogeneousFloat"
5051 << "(" << a0 << ", " << a1 << ")"
5052 << "\n";
5053
5055
5056 result.a0 = a0;
5057 result.a1 = a1;
5058
5059 std::cout << "result = "
5060 << "(" << result.a0 << ", " << result.a1 << ")"
5061 << "\n";
5062
5063 return result;
5064}
5065
5066// Used for testing structs and unions by value.
5067// Return value split over FP and integer register in x64.
5069 int16_t a1,
5070 int16_t a2) {
5071 std::cout << "ReturnStruct8BytesMixed"
5072 << "(" << a0 << ", " << a1 << ", " << a2 << ")"
5073 << "\n";
5074
5076
5077 result.a0 = a0;
5078 result.a1 = a1;
5079 result.a2 = a2;
5080
5081 std::cout << "result = "
5082 << "(" << result.a0 << ", " << result.a1 << ", " << result.a2 << ")"
5083 << "\n";
5084
5085 return result;
5086}
5087
5088// Used for testing structs and unions by value.
5089// The minimum alignment of this struct is only 1 byte based on its fields.
5090// Test that the memory backing these structs is the right size and that
5091// dart:ffi trampolines do not write outside this size.
5092DART_EXPORT Struct9BytesHomogeneousUint8
5094 uint8_t a1,
5095 uint8_t a2,
5096 uint8_t a3,
5097 uint8_t a4,
5098 uint8_t a5,
5099 uint8_t a6,
5100 uint8_t a7,
5101 uint8_t a8) {
5102 std::cout << "ReturnStruct9BytesHomogeneousUint8"
5103 << "(" << static_cast<int>(a0) << ", " << static_cast<int>(a1)
5104 << ", " << static_cast<int>(a2) << ", " << static_cast<int>(a3)
5105 << ", " << static_cast<int>(a4) << ", " << static_cast<int>(a5)
5106 << ", " << static_cast<int>(a6) << ", " << static_cast<int>(a7)
5107 << ", " << static_cast<int>(a8) << ")"
5108 << "\n";
5109
5111
5112 result.a0 = a0;
5113 result.a1 = a1;
5114 result.a2 = a2;
5115 result.a3 = a3;
5116 result.a4 = a4;
5117 result.a5 = a5;
5118 result.a6 = a6;
5119 result.a7 = a7;
5120 result.a8 = a8;
5121
5122 std::cout << "result = "
5123 << "(" << static_cast<int>(result.a0) << ", "
5124 << static_cast<int>(result.a1) << ", "
5125 << static_cast<int>(result.a2) << ", "
5126 << static_cast<int>(result.a3) << ", "
5127 << static_cast<int>(result.a4) << ", "
5128 << static_cast<int>(result.a5) << ", "
5129 << static_cast<int>(result.a6) << ", "
5130 << static_cast<int>(result.a7) << ", "
5131 << static_cast<int>(result.a8) << ")"
5132 << "\n";
5133
5134 return result;
5135}
5136
5137// Used for testing structs and unions by value.
5138// Return value in two integer registers on x64.
5139// With alignment rules taken into account size is 12 or 16 bytes.
5140DART_EXPORT Struct9BytesInt4Or8ByteAligned
5142 std::cout << "ReturnStruct9BytesInt4Or8ByteAligned"
5143 << "(" << a0 << ", " << static_cast<int>(a1) << ")"
5144 << "\n";
5145
5147
5148 result.a0 = a0;
5149 result.a1 = a1;
5150
5151 std::cout << "result = "
5152 << "(" << result.a0 << ", " << static_cast<int>(result.a1) << ")"
5153 << "\n";
5154
5155 return result;
5156}
5157
5158// Used for testing structs and unions by value.
5159// Return value in FPU registers, but does not use all registers on arm hardfp
5160// and arm64.
5161DART_EXPORT Struct12BytesHomogeneousFloat
5162ReturnStruct12BytesHomogeneousFloat(float a0, float a1, float a2) {
5163 std::cout << "ReturnStruct12BytesHomogeneousFloat"
5164 << "(" << a0 << ", " << a1 << ", " << a2 << ")"
5165 << "\n";
5166
5168
5169 result.a0 = a0;
5170 result.a1 = a1;
5171 result.a2 = a2;
5172
5173 std::cout << "result = "
5174 << "(" << result.a0 << ", " << result.a1 << ", " << result.a2 << ")"
5175 << "\n";
5176
5177 return result;
5178}
5179
5180// Used for testing structs and unions by value.
5181// Return value in FPU registers on arm hardfp and arm64.
5182DART_EXPORT Struct16BytesHomogeneousFloat
5183ReturnStruct16BytesHomogeneousFloat(float a0, float a1, float a2, float a3) {
5184 std::cout << "ReturnStruct16BytesHomogeneousFloat"
5185 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ")"
5186 << "\n";
5187
5189
5190 result.a0 = a0;
5191 result.a1 = a1;
5192 result.a2 = a2;
5193 result.a3 = a3;
5194
5195 std::cout << "result = "
5196 << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
5197 << ", " << result.a3 << ")"
5198 << "\n";
5199
5200 return result;
5201}
5202
5203// Used for testing structs and unions by value.
5204// Return value split over FP and integer register in x64.
5206 std::cout << "ReturnStruct16BytesMixed"
5207 << "(" << a0 << ", " << a1 << ")"
5208 << "\n";
5209
5211
5212 result.a0 = a0;
5213 result.a1 = a1;
5214
5215 std::cout << "result = "
5216 << "(" << result.a0 << ", " << result.a1 << ")"
5217 << "\n";
5218
5219 return result;
5220}
5221
5222// Used for testing structs and unions by value.
5223// Return value split over FP and integer register in x64.
5224// The integer register contains half float half int.
5226 float a1,
5227 float a2,
5228 int32_t a3) {
5229 std::cout << "ReturnStruct16BytesMixed2"
5230 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ")"
5231 << "\n";
5232
5234
5235 result.a0 = a0;
5236 result.a1 = a1;
5237 result.a2 = a2;
5238 result.a3 = a3;
5239
5240 std::cout << "result = "
5241 << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
5242 << ", " << result.a3 << ")"
5243 << "\n";
5244
5245 return result;
5246}
5247
5248// Used for testing structs and unions by value.
5249// Return value returned in preallocated space passed by pointer on most ABIs.
5250// Is non word size on purpose, to test that structs are rounded up to word size
5251// on all ABIs.
5253 int64_t a1,
5254 int8_t a2) {
5255 std::cout << "ReturnStruct17BytesInt"
5256 << "(" << a0 << ", " << a1 << ", " << static_cast<int>(a2) << ")"
5257 << "\n";
5258
5260
5261 result.a0 = a0;
5262 result.a1 = a1;
5263 result.a2 = a2;
5264
5265 std::cout << "result = "
5266 << "(" << result.a0 << ", " << result.a1 << ", "
5267 << static_cast<int>(result.a2) << ")"
5268 << "\n";
5269
5270 return result;
5271}
5272
5273// Used for testing structs and unions by value.
5274// The minimum alignment of this struct is only 1 byte based on its fields.
5275// Test that the memory backing these structs is the right size and that
5276// dart:ffi trampolines do not write outside this size.
5277DART_EXPORT Struct19BytesHomogeneousUint8
5279 uint8_t a1,
5280 uint8_t a2,
5281 uint8_t a3,
5282 uint8_t a4,
5283 uint8_t a5,
5284 uint8_t a6,
5285 uint8_t a7,
5286 uint8_t a8,
5287 uint8_t a9,
5288 uint8_t a10,
5289 uint8_t a11,
5290 uint8_t a12,
5291 uint8_t a13,
5292 uint8_t a14,
5293 uint8_t a15,
5294 uint8_t a16,
5295 uint8_t a17,
5296 uint8_t a18) {
5297 std::cout << "ReturnStruct19BytesHomogeneousUint8"
5298 << "(" << static_cast<int>(a0) << ", " << static_cast<int>(a1)
5299 << ", " << static_cast<int>(a2) << ", " << static_cast<int>(a3)
5300 << ", " << static_cast<int>(a4) << ", " << static_cast<int>(a5)
5301 << ", " << static_cast<int>(a6) << ", " << static_cast<int>(a7)
5302 << ", " << static_cast<int>(a8) << ", " << static_cast<int>(a9)
5303 << ", " << static_cast<int>(a10) << ", " << static_cast<int>(a11)
5304 << ", " << static_cast<int>(a12) << ", " << static_cast<int>(a13)
5305 << ", " << static_cast<int>(a14) << ", " << static_cast<int>(a15)
5306 << ", " << static_cast<int>(a16) << ", " << static_cast<int>(a17)
5307 << ", " << static_cast<int>(a18) << ")"
5308 << "\n";
5309
5311
5312 result.a0 = a0;
5313 result.a1 = a1;
5314 result.a2 = a2;
5315 result.a3 = a3;
5316 result.a4 = a4;
5317 result.a5 = a5;
5318 result.a6 = a6;
5319 result.a7 = a7;
5320 result.a8 = a8;
5321 result.a9 = a9;
5322 result.a10 = a10;
5323 result.a11 = a11;
5324 result.a12 = a12;
5325 result.a13 = a13;
5326 result.a14 = a14;
5327 result.a15 = a15;
5328 result.a16 = a16;
5329 result.a17 = a17;
5330 result.a18 = a18;
5331
5332 std::cout << "result = "
5333 << "(" << static_cast<int>(result.a0) << ", "
5334 << static_cast<int>(result.a1) << ", "
5335 << static_cast<int>(result.a2) << ", "
5336 << static_cast<int>(result.a3) << ", "
5337 << static_cast<int>(result.a4) << ", "
5338 << static_cast<int>(result.a5) << ", "
5339 << static_cast<int>(result.a6) << ", "
5340 << static_cast<int>(result.a7) << ", "
5341 << static_cast<int>(result.a8) << ", "
5342 << static_cast<int>(result.a9) << ", "
5343 << static_cast<int>(result.a10) << ", "
5344 << static_cast<int>(result.a11) << ", "
5345 << static_cast<int>(result.a12) << ", "
5346 << static_cast<int>(result.a13) << ", "
5347 << static_cast<int>(result.a14) << ", "
5348 << static_cast<int>(result.a15) << ", "
5349 << static_cast<int>(result.a16) << ", "
5350 << static_cast<int>(result.a17) << ", "
5351 << static_cast<int>(result.a18) << ")"
5352 << "\n";
5353
5354 return result;
5355}
5356
5357// Used for testing structs and unions by value.
5358// Return value too big to go in cpu registers on arm64.
5359DART_EXPORT Struct20BytesHomogeneousInt32
5361 int32_t a1,
5362 int32_t a2,
5363 int32_t a3,
5364 int32_t a4) {
5365 std::cout << "ReturnStruct20BytesHomogeneousInt32"
5366 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
5367 << ")"
5368 << "\n";
5369
5371
5372 result.a0 = a0;
5373 result.a1 = a1;
5374 result.a2 = a2;
5375 result.a3 = a3;
5376 result.a4 = a4;
5377
5378 std::cout << "result = "
5379 << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
5380 << ", " << result.a3 << ", " << result.a4 << ")"
5381 << "\n";
5382
5383 return result;
5384}
5385
5386// Used for testing structs and unions by value.
5387// Return value too big to go in FPU registers on x64, arm hardfp and arm64.
5388DART_EXPORT Struct20BytesHomogeneousFloat
5390 float a1,
5391 float a2,
5392 float a3,
5393 float a4) {
5394 std::cout << "ReturnStruct20BytesHomogeneousFloat"
5395 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
5396 << ")"
5397 << "\n";
5398
5400
5401 result.a0 = a0;
5402 result.a1 = a1;
5403 result.a2 = a2;
5404 result.a3 = a3;
5405 result.a4 = a4;
5406
5407 std::cout << "result = "
5408 << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
5409 << ", " << result.a3 << ", " << result.a4 << ")"
5410 << "\n";
5411
5412 return result;
5413}
5414
5415// Used for testing structs and unions by value.
5416// Return value in FPU registers on arm64.
5417DART_EXPORT Struct32BytesHomogeneousDouble
5419 double a1,
5420 double a2,
5421 double a3) {
5422 std::cout << "ReturnStruct32BytesHomogeneousDouble"
5423 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ")"
5424 << "\n";
5425
5427
5428 result.a0 = a0;
5429 result.a1 = a1;
5430 result.a2 = a2;
5431 result.a3 = a3;
5432
5433 std::cout << "result = "
5434 << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
5435 << ", " << result.a3 << ")"
5436 << "\n";
5437
5438 return result;
5439}
5440
5441// Used for testing structs and unions by value.
5442// Return value too big to go in FPU registers on arm64.
5443DART_EXPORT Struct40BytesHomogeneousDouble
5445 double a1,
5446 double a2,
5447 double a3,
5448 double a4) {
5449 std::cout << "ReturnStruct40BytesHomogeneousDouble"
5450 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
5451 << ")"
5452 << "\n";
5453
5455
5456 result.a0 = a0;
5457 result.a1 = a1;
5458 result.a2 = a2;
5459 result.a3 = a3;
5460 result.a4 = a4;
5461
5462 std::cout << "result = "
5463 << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
5464 << ", " << result.a3 << ", " << result.a4 << ")"
5465 << "\n";
5466
5467 return result;
5468}
5469
5470// Used for testing structs and unions by value.
5471// Test 1kb struct.
5472DART_EXPORT Struct1024BytesHomogeneousUint64
5474 uint64_t a1,
5475 uint64_t a2,
5476 uint64_t a3,
5477 uint64_t a4,
5478 uint64_t a5,
5479 uint64_t a6,
5480 uint64_t a7,
5481 uint64_t a8,
5482 uint64_t a9,
5483 uint64_t a10,
5484 uint64_t a11,
5485 uint64_t a12,
5486 uint64_t a13,
5487 uint64_t a14,
5488 uint64_t a15,
5489 uint64_t a16,
5490 uint64_t a17,
5491 uint64_t a18,
5492 uint64_t a19,
5493 uint64_t a20,
5494 uint64_t a21,
5495 uint64_t a22,
5496 uint64_t a23,
5497 uint64_t a24,
5498 uint64_t a25,
5499 uint64_t a26,
5500 uint64_t a27,
5501 uint64_t a28,
5502 uint64_t a29,
5503 uint64_t a30,
5504 uint64_t a31,
5505 uint64_t a32,
5506 uint64_t a33,
5507 uint64_t a34,
5508 uint64_t a35,
5509 uint64_t a36,
5510 uint64_t a37,
5511 uint64_t a38,
5512 uint64_t a39,
5513 uint64_t a40,
5514 uint64_t a41,
5515 uint64_t a42,
5516 uint64_t a43,
5517 uint64_t a44,
5518 uint64_t a45,
5519 uint64_t a46,
5520 uint64_t a47,
5521 uint64_t a48,
5522 uint64_t a49,
5523 uint64_t a50,
5524 uint64_t a51,
5525 uint64_t a52,
5526 uint64_t a53,
5527 uint64_t a54,
5528 uint64_t a55,
5529 uint64_t a56,
5530 uint64_t a57,
5531 uint64_t a58,
5532 uint64_t a59,
5533 uint64_t a60,
5534 uint64_t a61,
5535 uint64_t a62,
5536 uint64_t a63,
5537 uint64_t a64,
5538 uint64_t a65,
5539 uint64_t a66,
5540 uint64_t a67,
5541 uint64_t a68,
5542 uint64_t a69,
5543 uint64_t a70,
5544 uint64_t a71,
5545 uint64_t a72,
5546 uint64_t a73,
5547 uint64_t a74,
5548 uint64_t a75,
5549 uint64_t a76,
5550 uint64_t a77,
5551 uint64_t a78,
5552 uint64_t a79,
5553 uint64_t a80,
5554 uint64_t a81,
5555 uint64_t a82,
5556 uint64_t a83,
5557 uint64_t a84,
5558 uint64_t a85,
5559 uint64_t a86,
5560 uint64_t a87,
5561 uint64_t a88,
5562 uint64_t a89,
5563 uint64_t a90,
5564 uint64_t a91,
5565 uint64_t a92,
5566 uint64_t a93,
5567 uint64_t a94,
5568 uint64_t a95,
5569 uint64_t a96,
5570 uint64_t a97,
5571 uint64_t a98,
5572 uint64_t a99,
5573 uint64_t a100,
5574 uint64_t a101,
5575 uint64_t a102,
5576 uint64_t a103,
5577 uint64_t a104,
5578 uint64_t a105,
5579 uint64_t a106,
5580 uint64_t a107,
5581 uint64_t a108,
5582 uint64_t a109,
5583 uint64_t a110,
5584 uint64_t a111,
5585 uint64_t a112,
5586 uint64_t a113,
5587 uint64_t a114,
5588 uint64_t a115,
5589 uint64_t a116,
5590 uint64_t a117,
5591 uint64_t a118,
5592 uint64_t a119,
5593 uint64_t a120,
5594 uint64_t a121,
5595 uint64_t a122,
5596 uint64_t a123,
5597 uint64_t a124,
5598 uint64_t a125,
5599 uint64_t a126,
5600 uint64_t a127) {
5601 std::cout << "ReturnStruct1024BytesHomogeneousUint64"
5602 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
5603 << ", " << a5 << ", " << a6 << ", " << a7 << ", " << a8 << ", "
5604 << a9 << ", " << a10 << ", " << a11 << ", " << a12 << ", " << a13
5605 << ", " << a14 << ", " << a15 << ", " << a16 << ", " << a17 << ", "
5606 << a18 << ", " << a19 << ", " << a20 << ", " << a21 << ", " << a22
5607 << ", " << a23 << ", " << a24 << ", " << a25 << ", " << a26 << ", "
5608 << a27 << ", " << a28 << ", " << a29 << ", " << a30 << ", " << a31
5609 << ", " << a32 << ", " << a33 << ", " << a34 << ", " << a35 << ", "
5610 << a36 << ", " << a37 << ", " << a38 << ", " << a39 << ", " << a40
5611 << ", " << a41 << ", " << a42 << ", " << a43 << ", " << a44 << ", "
5612 << a45 << ", " << a46 << ", " << a47 << ", " << a48 << ", " << a49
5613 << ", " << a50 << ", " << a51 << ", " << a52 << ", " << a53 << ", "
5614 << a54 << ", " << a55 << ", " << a56 << ", " << a57 << ", " << a58
5615 << ", " << a59 << ", " << a60 << ", " << a61 << ", " << a62 << ", "
5616 << a63 << ", " << a64 << ", " << a65 << ", " << a66 << ", " << a67
5617 << ", " << a68 << ", " << a69 << ", " << a70 << ", " << a71 << ", "
5618 << a72 << ", " << a73 << ", " << a74 << ", " << a75 << ", " << a76
5619 << ", " << a77 << ", " << a78 << ", " << a79 << ", " << a80 << ", "
5620 << a81 << ", " << a82 << ", " << a83 << ", " << a84 << ", " << a85
5621 << ", " << a86 << ", " << a87 << ", " << a88 << ", " << a89 << ", "
5622 << a90 << ", " << a91 << ", " << a92 << ", " << a93 << ", " << a94
5623 << ", " << a95 << ", " << a96 << ", " << a97 << ", " << a98 << ", "
5624 << a99 << ", " << a100 << ", " << a101 << ", " << a102 << ", "
5625 << a103 << ", " << a104 << ", " << a105 << ", " << a106 << ", "
5626 << a107 << ", " << a108 << ", " << a109 << ", " << a110 << ", "
5627 << a111 << ", " << a112 << ", " << a113 << ", " << a114 << ", "
5628 << a115 << ", " << a116 << ", " << a117 << ", " << a118 << ", "
5629 << a119 << ", " << a120 << ", " << a121 << ", " << a122 << ", "
5630 << a123 << ", " << a124 << ", " << a125 << ", " << a126 << ", "
5631 << a127 << ")"
5632 << "\n";
5633
5635
5636 result.a0 = a0;
5637 result.a1 = a1;
5638 result.a2 = a2;
5639 result.a3 = a3;
5640 result.a4 = a4;
5641 result.a5 = a5;
5642 result.a6 = a6;
5643 result.a7 = a7;
5644 result.a8 = a8;
5645 result.a9 = a9;
5646 result.a10 = a10;
5647 result.a11 = a11;
5648 result.a12 = a12;
5649 result.a13 = a13;
5650 result.a14 = a14;
5651 result.a15 = a15;
5652 result.a16 = a16;
5653 result.a17 = a17;
5654 result.a18 = a18;
5655 result.a19 = a19;
5656 result.a20 = a20;
5657 result.a21 = a21;
5658 result.a22 = a22;
5659 result.a23 = a23;
5660 result.a24 = a24;
5661 result.a25 = a25;
5662 result.a26 = a26;
5663 result.a27 = a27;
5664 result.a28 = a28;
5665 result.a29 = a29;
5666 result.a30 = a30;
5667 result.a31 = a31;
5668 result.a32 = a32;
5669 result.a33 = a33;
5670 result.a34 = a34;
5671 result.a35 = a35;
5672 result.a36 = a36;
5673 result.a37 = a37;
5674 result.a38 = a38;
5675 result.a39 = a39;
5676 result.a40 = a40;
5677 result.a41 = a41;
5678 result.a42 = a42;
5679 result.a43 = a43;
5680 result.a44 = a44;
5681 result.a45 = a45;
5682 result.a46 = a46;
5683 result.a47 = a47;
5684 result.a48 = a48;
5685 result.a49 = a49;
5686 result.a50 = a50;
5687 result.a51 = a51;
5688 result.a52 = a52;
5689 result.a53 = a53;
5690 result.a54 = a54;
5691 result.a55 = a55;
5692 result.a56 = a56;
5693 result.a57 = a57;
5694 result.a58 = a58;
5695 result.a59 = a59;
5696 result.a60 = a60;
5697 result.a61 = a61;
5698 result.a62 = a62;
5699 result.a63 = a63;
5700 result.a64 = a64;
5701 result.a65 = a65;
5702 result.a66 = a66;
5703 result.a67 = a67;
5704 result.a68 = a68;
5705 result.a69 = a69;
5706 result.a70 = a70;
5707 result.a71 = a71;
5708 result.a72 = a72;
5709 result.a73 = a73;
5710 result.a74 = a74;
5711 result.a75 = a75;
5712 result.a76 = a76;
5713 result.a77 = a77;
5714 result.a78 = a78;
5715 result.a79 = a79;
5716 result.a80 = a80;
5717 result.a81 = a81;
5718 result.a82 = a82;
5719 result.a83 = a83;
5720 result.a84 = a84;
5721 result.a85 = a85;
5722 result.a86 = a86;
5723 result.a87 = a87;
5724 result.a88 = a88;
5725 result.a89 = a89;
5726 result.a90 = a90;
5727 result.a91 = a91;
5728 result.a92 = a92;
5729 result.a93 = a93;
5730 result.a94 = a94;
5731 result.a95 = a95;
5732 result.a96 = a96;
5733 result.a97 = a97;
5734 result.a98 = a98;
5735 result.a99 = a99;
5736 result.a100 = a100;
5737 result.a101 = a101;
5738 result.a102 = a102;
5739 result.a103 = a103;
5740 result.a104 = a104;
5741 result.a105 = a105;
5742 result.a106 = a106;
5743 result.a107 = a107;
5744 result.a108 = a108;
5745 result.a109 = a109;
5746 result.a110 = a110;
5747 result.a111 = a111;
5748 result.a112 = a112;
5749 result.a113 = a113;
5750 result.a114 = a114;
5751 result.a115 = a115;
5752 result.a116 = a116;
5753 result.a117 = a117;
5754 result.a118 = a118;
5755 result.a119 = a119;
5756 result.a120 = a120;
5757 result.a121 = a121;
5758 result.a122 = a122;
5759 result.a123 = a123;
5760 result.a124 = a124;
5761 result.a125 = a125;
5762 result.a126 = a126;
5763 result.a127 = a127;
5764
5765 std::cout << "result = "
5766 << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
5767 << ", " << result.a3 << ", " << result.a4 << ", " << result.a5
5768 << ", " << result.a6 << ", " << result.a7 << ", " << result.a8
5769 << ", " << result.a9 << ", " << result.a10 << ", " << result.a11
5770 << ", " << result.a12 << ", " << result.a13 << ", " << result.a14
5771 << ", " << result.a15 << ", " << result.a16 << ", " << result.a17
5772 << ", " << result.a18 << ", " << result.a19 << ", " << result.a20
5773 << ", " << result.a21 << ", " << result.a22 << ", " << result.a23
5774 << ", " << result.a24 << ", " << result.a25 << ", " << result.a26
5775 << ", " << result.a27 << ", " << result.a28 << ", " << result.a29
5776 << ", " << result.a30 << ", " << result.a31 << ", " << result.a32
5777 << ", " << result.a33 << ", " << result.a34 << ", " << result.a35
5778 << ", " << result.a36 << ", " << result.a37 << ", " << result.a38
5779 << ", " << result.a39 << ", " << result.a40 << ", " << result.a41
5780 << ", " << result.a42 << ", " << result.a43 << ", " << result.a44
5781 << ", " << result.a45 << ", " << result.a46 << ", " << result.a47
5782 << ", " << result.a48 << ", " << result.a49 << ", " << result.a50
5783 << ", " << result.a51 << ", " << result.a52 << ", " << result.a53
5784 << ", " << result.a54 << ", " << result.a55 << ", " << result.a56
5785 << ", " << result.a57 << ", " << result.a58 << ", " << result.a59
5786 << ", " << result.a60 << ", " << result.a61 << ", " << result.a62
5787 << ", " << result.a63 << ", " << result.a64 << ", " << result.a65
5788 << ", " << result.a66 << ", " << result.a67 << ", " << result.a68
5789 << ", " << result.a69 << ", " << result.a70 << ", " << result.a71
5790 << ", " << result.a72 << ", " << result.a73 << ", " << result.a74
5791 << ", " << result.a75 << ", " << result.a76 << ", " << result.a77
5792 << ", " << result.a78 << ", " << result.a79 << ", " << result.a80
5793 << ", " << result.a81 << ", " << result.a82 << ", " << result.a83
5794 << ", " << result.a84 << ", " << result.a85 << ", " << result.a86
5795 << ", " << result.a87 << ", " << result.a88 << ", " << result.a89
5796 << ", " << result.a90 << ", " << result.a91 << ", " << result.a92
5797 << ", " << result.a93 << ", " << result.a94 << ", " << result.a95
5798 << ", " << result.a96 << ", " << result.a97 << ", " << result.a98
5799 << ", " << result.a99 << ", " << result.a100 << ", " << result.a101
5800 << ", " << result.a102 << ", " << result.a103 << ", " << result.a104
5801 << ", " << result.a105 << ", " << result.a106 << ", " << result.a107
5802 << ", " << result.a108 << ", " << result.a109 << ", " << result.a110
5803 << ", " << result.a111 << ", " << result.a112 << ", " << result.a113
5804 << ", " << result.a114 << ", " << result.a115 << ", " << result.a116
5805 << ", " << result.a117 << ", " << result.a118 << ", " << result.a119
5806 << ", " << result.a120 << ", " << result.a121 << ", " << result.a122
5807 << ", " << result.a123 << ", " << result.a124 << ", " << result.a125
5808 << ", " << result.a126 << ", " << result.a127 << ")"
5809 << "\n";
5810
5811 return result;
5812}
5813
5814// Used for testing structs and unions by value.
5815// Small struct with mis-aligned member.
5817 int16_t a1) {
5818 std::cout << "ReturnStruct3BytesPackedInt"
5819 << "(" << static_cast<int>(a0) << ", " << a1 << ")"
5820 << "\n";
5821
5823
5824 result.a0 = a0;
5825 result.a1 = a1;
5826
5827 std::cout << "result = "
5828 << "(" << static_cast<int>(result.a0) << ", " << result.a1 << ")"
5829 << "\n";
5830
5831 return result;
5832}
5833
5834// Used for testing structs and unions by value.
5835// Struct with mis-aligned member.
5837 uint32_t a1,
5838 uint8_t a2,
5839 uint8_t a3,
5840 uint8_t a4) {
5841 std::cout << "ReturnStruct8BytesPackedInt"
5842 << "(" << static_cast<int>(a0) << ", " << a1 << ", "
5843 << static_cast<int>(a2) << ", " << static_cast<int>(a3) << ", "
5844 << static_cast<int>(a4) << ")"
5845 << "\n";
5846
5848
5849 result.a0 = a0;
5850 result.a1 = a1;
5851 result.a2 = a2;
5852 result.a3 = a3;
5853 result.a4 = a4;
5854
5855 std::cout << "result = "
5856 << "(" << static_cast<int>(result.a0) << ", " << result.a1 << ", "
5857 << static_cast<int>(result.a2) << ", "
5858 << static_cast<int>(result.a3) << ", "
5859 << static_cast<int>(result.a4) << ")"
5860 << "\n";
5861
5862 return result;
5863}
5864
5865// Used for testing structs and unions by value.
5866// Struct with mis-aligned member.
5867// Tests backfilling of CPU and FPU registers.
5869 double a1) {
5870 std::cout << "ReturnStruct9BytesPackedMixed"
5871 << "(" << static_cast<int>(a0) << ", " << a1 << ")"
5872 << "\n";
5873
5875
5876 result.a0 = a0;
5877 result.a1 = a1;
5878
5879 std::cout << "result = "
5880 << "(" << static_cast<int>(result.a0) << ", " << result.a1 << ")"
5881 << "\n";
5882
5883 return result;
5884}
5885
5886// Used for testing structs and unions by value.
5887// Returning a mixed integer/float union.
5889 std::cout << "ReturnUnion4BytesMixed"
5890 << "(" << a0 << ")"
5891 << "\n";
5892
5894
5895 result.a0 = a0;
5896
5897 std::cout << "result = "
5898 << "(" << result.a0 << ")"
5899 << "\n";
5900
5901 return result;
5902}
5903
5904// Used for testing structs and unions by value.
5905// Returning a floating point only union.
5907 std::cout << "ReturnUnion8BytesNestedFloat"
5908 << "(" << a0 << ")"
5909 << "\n";
5910
5912
5913 result.a0 = a0;
5914
5915 std::cout << "result = "
5916 << "(" << result.a0 << ")"
5917 << "\n";
5918
5919 return result;
5920}
5921
5922// Used for testing structs and unions by value.
5923// Returning a mixed-size union.
5924DART_EXPORT Union9BytesNestedInt
5926 std::cout << "ReturnUnion9BytesNestedInt"
5927 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << "))"
5928 << "\n";
5929
5931
5932 result.a0.a0 = a0.a0;
5933 result.a0.a1 = a0.a1;
5934 result.a0.a2 = a0.a2;
5935
5936 std::cout << "result = "
5937 << "((" << result.a0.a0 << ", " << result.a0.a1 << ", "
5938 << result.a0.a2 << "))"
5939 << "\n";
5940
5941 return result;
5942}
5943
5944// Used for testing structs and unions by value.
5945// Returning union with homogenous floats.
5946DART_EXPORT Union16BytesNestedFloat
5948 std::cout << "ReturnUnion16BytesNestedFloat"
5949 << "((" << a0.a0 << ", " << a0.a1 << "))"
5950 << "\n";
5951
5953
5954 result.a0.a0 = a0.a0;
5955 result.a0.a1 = a0.a1;
5956
5957 std::cout << "result = "
5958 << "((" << result.a0.a0 << ", " << result.a0.a1 << "))"
5959 << "\n";
5960
5961 return result;
5962}
5963
5964// Used for testing structs and unions by value.
5965// Test that a struct passed in as argument can be returned.
5966// Especially for ffi callbacks.
5967// Struct is passed in int registers in most ABIs.
5968DART_EXPORT Struct1ByteInt
5970 std::cout << "ReturnStructArgumentStruct1ByteInt"
5971 << "((" << static_cast<int>(a0.a0) << "))"
5972 << "\n";
5973
5975
5976 std::cout << "result = "
5977 << "(" << static_cast<int>(result.a0) << ")"
5978 << "\n";
5979
5980 return result;
5981}
5982
5983// Used for testing structs and unions by value.
5984// Test that a struct passed in as argument can be returned.
5985// Especially for ffi callbacks.
5986// Struct is passed on stack on all ABIs.
5987DART_EXPORT Struct1ByteInt
5989 int32_t a1,
5990 int32_t a2,
5991 int32_t a3,
5992 int32_t a4,
5993 int32_t a5,
5994 int32_t a6,
5995 int32_t a7,
5996 Struct1ByteInt a8) {
5997 std::cout << "ReturnStructArgumentInt32x8Struct1ByteInt"
5998 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
5999 << ", " << a5 << ", " << a6 << ", " << a7 << ", ("
6000 << static_cast<int>(a8.a0) << "))"
6001 << "\n";
6002
6004
6005 std::cout << "result = "
6006 << "(" << static_cast<int>(result.a0) << ")"
6007 << "\n";
6008
6009 return result;
6010}
6011
6012// Used for testing structs and unions by value.
6013// Test that a struct passed in as argument can be returned.
6014// Especially for ffi callbacks.
6015// Struct is passed in float registers in most ABIs.
6016DART_EXPORT Struct8BytesHomogeneousFloat
6019 std::cout << "ReturnStructArgumentStruct8BytesHomogeneousFloat"
6020 << "((" << a0.a0 << ", " << a0.a1 << "))"
6021 << "\n";
6022
6024
6025 std::cout << "result = "
6026 << "(" << result.a0 << ", " << result.a1 << ")"
6027 << "\n";
6028
6029 return result;
6030}
6031
6032// Used for testing structs and unions by value.
6033// On arm64, both argument and return value are passed in by pointer.
6034DART_EXPORT Struct20BytesHomogeneousInt32
6037 std::cout << "ReturnStructArgumentStruct20BytesHomogeneousInt32"
6038 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
6039 << ", " << a0.a4 << "))"
6040 << "\n";
6041
6043
6044 std::cout << "result = "
6045 << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
6046 << ", " << result.a3 << ", " << result.a4 << ")"
6047 << "\n";
6048
6049 return result;
6050}
6051
6052// Used for testing structs and unions by value.
6053// On arm64, both argument and return value are passed in by pointer.
6054// Ints exhaust registers, so that pointer is passed on stack.
6055DART_EXPORT Struct20BytesHomogeneousInt32
6057 int32_t a0,
6058 int32_t a1,
6059 int32_t a2,
6060 int32_t a3,
6061 int32_t a4,
6062 int32_t a5,
6063 int32_t a6,
6064 int32_t a7,
6066 std::cout << "ReturnStructArgumentInt32x8Struct20BytesHomogeneou"
6067 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
6068 << ", " << a5 << ", " << a6 << ", " << a7 << ", (" << a8.a0 << ", "
6069 << a8.a1 << ", " << a8.a2 << ", " << a8.a3 << ", " << a8.a4 << "))"
6070 << "\n";
6071
6073
6074 std::cout << "result = "
6075 << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
6076 << ", " << result.a3 << ", " << result.a4 << ")"
6077 << "\n";
6078
6079 return result;
6080}
6081
6082// Used for testing structs and unions by value.
6083// Test returning struct with inline array.
6084DART_EXPORT Struct8BytesInlineArrayInt
6086 std::cout << "ReturnStructArgumentStruct8BytesInlineArrayInt"
6087 << "(([" << static_cast<int>(a0.a0[0]) << ", "
6088 << static_cast<int>(a0.a0[1]) << ", " << static_cast<int>(a0.a0[2])
6089 << ", " << static_cast<int>(a0.a0[3]) << ", "
6090 << static_cast<int>(a0.a0[4]) << ", " << static_cast<int>(a0.a0[5])
6091 << ", " << static_cast<int>(a0.a0[6]) << ", "
6092 << static_cast<int>(a0.a0[7]) << "]))"
6093 << "\n";
6094
6096
6097 std::cout << "result = "
6098 << "([" << static_cast<int>(result.a0[0]) << ", "
6099 << static_cast<int>(result.a0[1]) << ", "
6100 << static_cast<int>(result.a0[2]) << ", "
6101 << static_cast<int>(result.a0[3]) << ", "
6102 << static_cast<int>(result.a0[4]) << ", "
6103 << static_cast<int>(result.a0[5]) << ", "
6104 << static_cast<int>(result.a0[6]) << ", "
6105 << static_cast<int>(result.a0[7]) << "])"
6106 << "\n";
6107
6108 return result;
6109}
6110
6111// Used for testing structs and unions by value.
6112// Return value in FPU registers on arm hardfp and arm64.
6113DART_EXPORT StructStruct16BytesHomogeneousFloat2
6116 std::cout << "ReturnStructArgumentStructStruct16BytesHomogeneous"
6117 << "(((" << a0.a0.a0 << "), [(" << a0.a1[0].a0 << "), ("
6118 << a0.a1[1].a0 << ")], " << a0.a2 << "))"
6119 << "\n";
6120
6122
6123 std::cout << "result = "
6124 << "((" << result.a0.a0 << "), [(" << result.a1[0].a0 << "), ("
6125 << result.a1[1].a0 << ")], " << result.a2 << ")"
6126 << "\n";
6127
6128 return result;
6129}
6130
6131// Used for testing structs and unions by value.
6132// Return value in FPU registers on arm64.
6133DART_EXPORT StructStruct32BytesHomogeneousDouble2
6136 std::cout << "ReturnStructArgumentStructStruct32BytesHomogeneous"
6137 << "(((" << a0.a0.a0 << "), [(" << a0.a1[0].a0 << "), ("
6138 << a0.a1[1].a0 << ")], " << a0.a2 << "))"
6139 << "\n";
6140
6142
6143 std::cout << "result = "
6144 << "((" << result.a0.a0 << "), [(" << result.a1[0].a0 << "), ("
6145 << result.a1[1].a0 << ")], " << result.a2 << ")"
6146 << "\n";
6147
6148 return result;
6149}
6150
6151// Used for testing structs and unions by value.
6152// On x64 Linux, return value is split over FP and int registers.
6153DART_EXPORT StructStruct16BytesMixed3
6155 std::cout << "ReturnStructArgumentStructStruct16BytesMixed3"
6156 << "(((" << a0.a0.a0 << "), [(" << a0.a1[0].a0 << ", "
6157 << a0.a1[0].a1 << ", " << a0.a1[0].a2 << ")], [" << a0.a2[0] << ", "
6158 << a0.a2[1] << "]))"
6159 << "\n";
6160
6162
6163 std::cout << "result = "
6164 << "((" << result.a0.a0 << "), [(" << result.a1[0].a0 << ", "
6165 << result.a1[0].a1 << ", " << result.a1[0].a2 << ")], ["
6166 << result.a2[0] << ", " << result.a2[1] << "])"
6167 << "\n";
6168
6169 return result;
6170}
6171
6172// Used for testing structs and unions by value.
6173// Test alignment and padding of 16 byte int within struct.
6175 int16_t a1,
6176 int8_t a2) {
6177 std::cout << "ReturnStructAlignmentInt16"
6178 << "(" << static_cast<int>(a0) << ", " << a1 << ", "
6179 << static_cast<int>(a2) << ")"
6180 << "\n";
6181
6183
6184 result.a0 = a0;
6185 result.a1 = a1;
6186 result.a2 = a2;
6187
6188 std::cout << "result = "
6189 << "(" << static_cast<int>(result.a0) << ", " << result.a1 << ", "
6190 << static_cast<int>(result.a2) << ")"
6191 << "\n";
6192
6193 return result;
6194}
6195
6196// Used for testing structs and unions by value.
6197// Test alignment and padding of 32 byte int within struct.
6199 int32_t a1,
6200 int8_t a2) {
6201 std::cout << "ReturnStructAlignmentInt32"
6202 << "(" << static_cast<int>(a0) << ", " << a1 << ", "
6203 << static_cast<int>(a2) << ")"
6204 << "\n";
6205
6207
6208 result.a0 = a0;
6209 result.a1 = a1;
6210 result.a2 = a2;
6211
6212 std::cout << "result = "
6213 << "(" << static_cast<int>(result.a0) << ", " << result.a1 << ", "
6214 << static_cast<int>(result.a2) << ")"
6215 << "\n";
6216
6217 return result;
6218}
6219
6220// Used for testing structs and unions by value.
6221// Test alignment and padding of 64 byte int within struct.
6223 int64_t a1,
6224 int8_t a2) {
6225 std::cout << "ReturnStructAlignmentInt64"
6226 << "(" << static_cast<int>(a0) << ", " << a1 << ", "
6227 << static_cast<int>(a2) << ")"
6228 << "\n";
6229
6231
6232 result.a0 = a0;
6233 result.a1 = a1;
6234 result.a2 = a2;
6235
6236 std::cout << "result = "
6237 << "(" << static_cast<int>(result.a0) << ", " << result.a1 << ", "
6238 << static_cast<int>(result.a2) << ")"
6239 << "\n";
6240
6241 return result;
6242}
6243
6244// Used for testing structs and unions by value.
6245// Simple nested struct.
6246DART_EXPORT Struct8BytesNestedInt
6249 std::cout << "ReturnStruct8BytesNestedInt"
6250 << "((" << a0.a0 << ", " << a0.a1 << "), (" << a1.a0 << ", "
6251 << a1.a1 << "))"
6252 << "\n";
6253
6255
6256 result.a0.a0 = a0.a0;
6257 result.a0.a1 = a0.a1;
6258 result.a1.a0 = a1.a0;
6259 result.a1.a1 = a1.a1;
6260
6261 std::cout << "result = "
6262 << "((" << result.a0.a0 << ", " << result.a0.a1 << "), ("
6263 << result.a1.a0 << ", " << result.a1.a1 << "))"
6264 << "\n";
6265
6266 return result;
6267}
6268
6269// Used for testing structs and unions by value.
6270// Simple nested struct with floats.
6271DART_EXPORT Struct8BytesNestedFloat
6273 std::cout << "ReturnStruct8BytesNestedFloat"
6274 << "((" << a0.a0 << "), (" << a1.a0 << "))"
6275 << "\n";
6276
6278
6279 result.a0.a0 = a0.a0;
6280 result.a1.a0 = a1.a0;
6281
6282 std::cout << "result = "
6283 << "((" << result.a0.a0 << "), (" << result.a1.a0 << "))"
6284 << "\n";
6285
6286 return result;
6287}
6288
6289// Used for testing structs and unions by value.
6290// The nesting is irregular, testing homogenous float rules on arm and arm64,
6291// and the fpu register usage on x64.
6292DART_EXPORT Struct8BytesNestedFloat2
6294 std::cout << "ReturnStruct8BytesNestedFloat2"
6295 << "((" << a0.a0 << "), " << a1 << ")"
6296 << "\n";
6297
6299
6300 result.a0.a0 = a0.a0;
6301 result.a1 = a1;
6302
6303 std::cout << "result = "
6304 << "((" << result.a0.a0 << "), " << result.a1 << ")"
6305 << "\n";
6306
6307 return result;
6308}
6309
6310// Used for testing structs and unions by value.
6311// Simple nested struct with mixed members.
6312DART_EXPORT Struct8BytesNestedMixed
6314 Struct4BytesFloat a1) {
6315 std::cout << "ReturnStruct8BytesNestedMixed"
6316 << "((" << a0.a0 << ", " << a0.a1 << "), (" << a1.a0 << "))"
6317 << "\n";
6318
6320
6321 result.a0.a0 = a0.a0;
6322 result.a0.a1 = a0.a1;
6323 result.a1.a0 = a1.a0;
6324
6325 std::cout << "result = "
6326 << "((" << result.a0.a0 << ", " << result.a0.a1 << "), ("
6327 << result.a1.a0 << "))"
6328 << "\n";
6329
6330 return result;
6331}
6332
6333// Used for testing structs and unions by value.
6334// Deeper nested struct to test recursive member access.
6335DART_EXPORT Struct16BytesNestedInt
6338 std::cout << "ReturnStruct16BytesNestedInt"
6339 << "(((" << a0.a0.a0 << ", " << a0.a0.a1 << "), (" << a0.a1.a0
6340 << ", " << a0.a1.a1 << ")), ((" << a1.a0.a0 << ", " << a1.a0.a1
6341 << "), (" << a1.a1.a0 << ", " << a1.a1.a1 << ")))"
6342 << "\n";
6343
6345
6346 result.a0.a0.a0 = a0.a0.a0;
6347 result.a0.a0.a1 = a0.a0.a1;
6348 result.a0.a1.a0 = a0.a1.a0;
6349 result.a0.a1.a1 = a0.a1.a1;
6350 result.a1.a0.a0 = a1.a0.a0;
6351 result.a1.a0.a1 = a1.a0.a1;
6352 result.a1.a1.a0 = a1.a1.a0;
6353 result.a1.a1.a1 = a1.a1.a1;
6354
6355 std::cout << "result = "
6356 << "(((" << result.a0.a0.a0 << ", " << result.a0.a0.a1 << "), ("
6357 << result.a0.a1.a0 << ", " << result.a0.a1.a1 << ")), (("
6358 << result.a1.a0.a0 << ", " << result.a1.a0.a1 << "), ("
6359 << result.a1.a1.a0 << ", " << result.a1.a1.a1 << ")))"
6360 << "\n";
6361
6362 return result;
6363}
6364
6365// Used for testing structs and unions by value.
6366// Even deeper nested struct to test recursive member access.
6367DART_EXPORT Struct32BytesNestedInt
6370 std::cout << "ReturnStruct32BytesNestedInt"
6371 << "((((" << a0.a0.a0.a0 << ", " << a0.a0.a0.a1 << "), ("
6372 << a0.a0.a1.a0 << ", " << a0.a0.a1.a1 << ")), ((" << a0.a1.a0.a0
6373 << ", " << a0.a1.a0.a1 << "), (" << a0.a1.a1.a0 << ", "
6374 << a0.a1.a1.a1 << "))), (((" << a1.a0.a0.a0 << ", " << a1.a0.a0.a1
6375 << "), (" << a1.a0.a1.a0 << ", " << a1.a0.a1.a1 << ")), (("
6376 << a1.a1.a0.a0 << ", " << a1.a1.a0.a1 << "), (" << a1.a1.a1.a0
6377 << ", " << a1.a1.a1.a1 << "))))"
6378 << "\n";
6379
6381
6382 result.a0.a0.a0.a0 = a0.a0.a0.a0;
6383 result.a0.a0.a0.a1 = a0.a0.a0.a1;
6384 result.a0.a0.a1.a0 = a0.a0.a1.a0;
6385 result.a0.a0.a1.a1 = a0.a0.a1.a1;
6386 result.a0.a1.a0.a0 = a0.a1.a0.a0;
6387 result.a0.a1.a0.a1 = a0.a1.a0.a1;
6388 result.a0.a1.a1.a0 = a0.a1.a1.a0;
6389 result.a0.a1.a1.a1 = a0.a1.a1.a1;
6390 result.a1.a0.a0.a0 = a1.a0.a0.a0;
6391 result.a1.a0.a0.a1 = a1.a0.a0.a1;
6392 result.a1.a0.a1.a0 = a1.a0.a1.a0;
6393 result.a1.a0.a1.a1 = a1.a0.a1.a1;
6394 result.a1.a1.a0.a0 = a1.a1.a0.a0;
6395 result.a1.a1.a0.a1 = a1.a1.a0.a1;
6396 result.a1.a1.a1.a0 = a1.a1.a1.a0;
6397 result.a1.a1.a1.a1 = a1.a1.a1.a1;
6398
6399 std::cout << "result = "
6400 << "((((" << result.a0.a0.a0.a0 << ", " << result.a0.a0.a0.a1
6401 << "), (" << result.a0.a0.a1.a0 << ", " << result.a0.a0.a1.a1
6402 << ")), ((" << result.a0.a1.a0.a0 << ", " << result.a0.a1.a0.a1
6403 << "), (" << result.a0.a1.a1.a0 << ", " << result.a0.a1.a1.a1
6404 << "))), (((" << result.a1.a0.a0.a0 << ", " << result.a1.a0.a0.a1
6405 << "), (" << result.a1.a0.a1.a0 << ", " << result.a1.a0.a1.a1
6406 << ")), ((" << result.a1.a1.a0.a0 << ", " << result.a1.a1.a0.a1
6407 << "), (" << result.a1.a1.a1.a0 << ", " << result.a1.a1.a1.a1
6408 << "))))"
6409 << "\n";
6410
6411 return result;
6412}
6413
6414// Used for testing structs and unions by value.
6415// Test alignment and padding of nested struct with 16 byte int.
6416DART_EXPORT StructNestedIntStructAlignmentInt16
6419 std::cout << "ReturnStructNestedIntStructAlignmentInt16"
6420 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
6421 << static_cast<int>(a0.a2) << "), (" << static_cast<int>(a1.a0)
6422 << ", " << a1.a1 << ", " << static_cast<int>(a1.a2) << "))"
6423 << "\n";
6424
6426
6427 result.a0.a0 = a0.a0;
6428 result.a0.a1 = a0.a1;
6429 result.a0.a2 = a0.a2;
6430 result.a1.a0 = a1.a0;
6431 result.a1.a1 = a1.a1;
6432 result.a1.a2 = a1.a2;
6433
6434 std::cout << "result = "
6435 << "((" << static_cast<int>(result.a0.a0) << ", " << result.a0.a1
6436 << ", " << static_cast<int>(result.a0.a2) << "), ("
6437 << static_cast<int>(result.a1.a0) << ", " << result.a1.a1 << ", "
6438 << static_cast<int>(result.a1.a2) << "))"
6439 << "\n";
6440
6441 return result;
6442}
6443
6444// Used for testing structs and unions by value.
6445// Test alignment and padding of nested struct with 32 byte int.
6446DART_EXPORT StructNestedIntStructAlignmentInt32
6449 std::cout << "ReturnStructNestedIntStructAlignmentInt32"
6450 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
6451 << static_cast<int>(a0.a2) << "), (" << static_cast<int>(a1.a0)
6452 << ", " << a1.a1 << ", " << static_cast<int>(a1.a2) << "))"
6453 << "\n";
6454
6456
6457 result.a0.a0 = a0.a0;
6458 result.a0.a1 = a0.a1;
6459 result.a0.a2 = a0.a2;
6460 result.a1.a0 = a1.a0;
6461 result.a1.a1 = a1.a1;
6462 result.a1.a2 = a1.a2;
6463
6464 std::cout << "result = "
6465 << "((" << static_cast<int>(result.a0.a0) << ", " << result.a0.a1
6466 << ", " << static_cast<int>(result.a0.a2) << "), ("
6467 << static_cast<int>(result.a1.a0) << ", " << result.a1.a1 << ", "
6468 << static_cast<int>(result.a1.a2) << "))"
6469 << "\n";
6470
6471 return result;
6472}
6473
6474// Used for testing structs and unions by value.
6475// Test alignment and padding of nested struct with 64 byte int.
6476DART_EXPORT StructNestedIntStructAlignmentInt64
6479 std::cout << "ReturnStructNestedIntStructAlignmentInt64"
6480 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
6481 << static_cast<int>(a0.a2) << "), (" << static_cast<int>(a1.a0)
6482 << ", " << a1.a1 << ", " << static_cast<int>(a1.a2) << "))"
6483 << "\n";
6484
6486
6487 result.a0.a0 = a0.a0;
6488 result.a0.a1 = a0.a1;
6489 result.a0.a2 = a0.a2;
6490 result.a1.a0 = a1.a0;
6491 result.a1.a1 = a1.a1;
6492 result.a1.a2 = a1.a2;
6493
6494 std::cout << "result = "
6495 << "((" << static_cast<int>(result.a0.a0) << ", " << result.a0.a1
6496 << ", " << static_cast<int>(result.a0.a2) << "), ("
6497 << static_cast<int>(result.a1.a0) << ", " << result.a1.a1 << ", "
6498 << static_cast<int>(result.a1.a2) << "))"
6499 << "\n";
6500
6501 return result;
6502}
6503
6504// Used for testing structs and unions by value.
6505// Return big irregular struct as smoke test.
6506DART_EXPORT StructNestedIrregularEvenBigger
6510 double a3) {
6511 std::cout << "ReturnStructNestedIrregularEvenBigger"
6512 << "(" << a0 << ", ((" << a1.a0.a0 << ", ((" << a1.a0.a1.a0.a0
6513 << ", " << a1.a0.a1.a0.a1 << "), (" << a1.a0.a1.a1.a0 << ")), "
6514 << a1.a0.a2 << ", ((" << a1.a0.a3.a0.a0 << "), " << a1.a0.a3.a1
6515 << "), " << a1.a0.a4 << ", ((" << a1.a0.a5.a0.a0 << "), ("
6516 << a1.a0.a5.a1.a0 << ")), " << a1.a0.a6 << "), ((" << a1.a1.a0.a0
6517 << ", " << a1.a1.a0.a1 << "), (" << a1.a1.a1.a0 << ")), " << a1.a2
6518 << ", " << a1.a3 << "), ((" << a2.a0.a0 << ", ((" << a2.a0.a1.a0.a0
6519 << ", " << a2.a0.a1.a0.a1 << "), (" << a2.a0.a1.a1.a0 << ")), "
6520 << a2.a0.a2 << ", ((" << a2.a0.a3.a0.a0 << "), " << a2.a0.a3.a1
6521 << "), " << a2.a0.a4 << ", ((" << a2.a0.a5.a0.a0 << "), ("
6522 << a2.a0.a5.a1.a0 << ")), " << a2.a0.a6 << "), ((" << a2.a1.a0.a0
6523 << ", " << a2.a1.a0.a1 << "), (" << a2.a1.a1.a0 << ")), " << a2.a2
6524 << ", " << a2.a3 << "), " << a3 << ")"
6525 << "\n";
6526
6528
6529 result.a0 = a0;
6530 result.a1.a0.a0 = a1.a0.a0;
6531 result.a1.a0.a1.a0.a0 = a1.a0.a1.a0.a0;
6532 result.a1.a0.a1.a0.a1 = a1.a0.a1.a0.a1;
6533 result.a1.a0.a1.a1.a0 = a1.a0.a1.a1.a0;
6534 result.a1.a0.a2 = a1.a0.a2;
6535 result.a1.a0.a3.a0.a0 = a1.a0.a3.a0.a0;
6536 result.a1.a0.a3.a1 = a1.a0.a3.a1;
6537 result.a1.a0.a4 = a1.a0.a4;
6538 result.a1.a0.a5.a0.a0 = a1.a0.a5.a0.a0;
6539 result.a1.a0.a5.a1.a0 = a1.a0.a5.a1.a0;
6540 result.a1.a0.a6 = a1.a0.a6;
6541 result.a1.a1.a0.a0 = a1.a1.a0.a0;
6542 result.a1.a1.a0.a1 = a1.a1.a0.a1;
6543 result.a1.a1.a1.a0 = a1.a1.a1.a0;
6544 result.a1.a2 = a1.a2;
6545 result.a1.a3 = a1.a3;
6546 result.a2.a0.a0 = a2.a0.a0;
6547 result.a2.a0.a1.a0.a0 = a2.a0.a1.a0.a0;
6548 result.a2.a0.a1.a0.a1 = a2.a0.a1.a0.a1;
6549 result.a2.a0.a1.a1.a0 = a2.a0.a1.a1.a0;
6550 result.a2.a0.a2 = a2.a0.a2;
6551 result.a2.a0.a3.a0.a0 = a2.a0.a3.a0.a0;
6552 result.a2.a0.a3.a1 = a2.a0.a3.a1;
6553 result.a2.a0.a4 = a2.a0.a4;
6554 result.a2.a0.a5.a0.a0 = a2.a0.a5.a0.a0;
6555 result.a2.a0.a5.a1.a0 = a2.a0.a5.a1.a0;
6556 result.a2.a0.a6 = a2.a0.a6;
6557 result.a2.a1.a0.a0 = a2.a1.a0.a0;
6558 result.a2.a1.a0.a1 = a2.a1.a0.a1;
6559 result.a2.a1.a1.a0 = a2.a1.a1.a0;
6560 result.a2.a2 = a2.a2;
6561 result.a2.a3 = a2.a3;
6562 result.a3 = a3;
6563
6564 std::cout << "result = "
6565 << "(" << result.a0 << ", ((" << result.a1.a0.a0 << ", (("
6566 << result.a1.a0.a1.a0.a0 << ", " << result.a1.a0.a1.a0.a1 << "), ("
6567 << result.a1.a0.a1.a1.a0 << ")), " << result.a1.a0.a2 << ", (("
6568 << result.a1.a0.a3.a0.a0 << "), " << result.a1.a0.a3.a1 << "), "
6569 << result.a1.a0.a4 << ", ((" << result.a1.a0.a5.a0.a0 << "), ("
6570 << result.a1.a0.a5.a1.a0 << ")), " << result.a1.a0.a6 << "), (("
6571 << result.a1.a1.a0.a0 << ", " << result.a1.a1.a0.a1 << "), ("
6572 << result.a1.a1.a1.a0 << ")), " << result.a1.a2 << ", "
6573 << result.a1.a3 << "), ((" << result.a2.a0.a0 << ", (("
6574 << result.a2.a0.a1.a0.a0 << ", " << result.a2.a0.a1.a0.a1 << "), ("
6575 << result.a2.a0.a1.a1.a0 << ")), " << result.a2.a0.a2 << ", (("
6576 << result.a2.a0.a3.a0.a0 << "), " << result.a2.a0.a3.a1 << "), "
6577 << result.a2.a0.a4 << ", ((" << result.a2.a0.a5.a0.a0 << "), ("
6578 << result.a2.a0.a5.a1.a0 << ")), " << result.a2.a0.a6 << "), (("
6579 << result.a2.a1.a0.a0 << ", " << result.a2.a1.a0.a1 << "), ("
6580 << result.a2.a1.a1.a0 << ")), " << result.a2.a2 << ", "
6581 << result.a2.a3 << "), " << result.a3 << ")"
6582 << "\n";
6583
6584 return result;
6585}
6586
6587// Used for testing structs and unions by value.
6588// Smallest struct with data.
6589// 10 struct arguments will exhaust available registers.
6591 // NOLINTNEXTLINE(whitespace/parens)
6592 int64_t (*f)(Struct1ByteInt a0,
6593 Struct1ByteInt a1,
6594 Struct1ByteInt a2,
6595 Struct1ByteInt a3,
6596 Struct1ByteInt a4,
6597 Struct1ByteInt a5,
6598 Struct1ByteInt a6,
6599 Struct1ByteInt a7,
6600 Struct1ByteInt a8,
6601 Struct1ByteInt a9)) {
6602 Struct1ByteInt a0 = {};
6603 Struct1ByteInt a1 = {};
6604 Struct1ByteInt a2 = {};
6605 Struct1ByteInt a3 = {};
6606 Struct1ByteInt a4 = {};
6607 Struct1ByteInt a5 = {};
6608 Struct1ByteInt a6 = {};
6609 Struct1ByteInt a7 = {};
6610 Struct1ByteInt a8 = {};
6611 Struct1ByteInt a9 = {};
6612
6613 a0.a0 = -1;
6614 a1.a0 = 2;
6615 a2.a0 = -3;
6616 a3.a0 = 4;
6617 a4.a0 = -5;
6618 a5.a0 = 6;
6619 a6.a0 = -7;
6620 a7.a0 = 8;
6621 a8.a0 = -9;
6622 a9.a0 = 10;
6623
6624 std::cout << "Calling TestPassStruct1ByteIntx10("
6625 << "((" << static_cast<int>(a0.a0) << "), ("
6626 << static_cast<int>(a1.a0) << "), (" << static_cast<int>(a2.a0)
6627 << "), (" << static_cast<int>(a3.a0) << "), ("
6628 << static_cast<int>(a4.a0) << "), (" << static_cast<int>(a5.a0)
6629 << "), (" << static_cast<int>(a6.a0) << "), ("
6630 << static_cast<int>(a7.a0) << "), (" << static_cast<int>(a8.a0)
6631 << "), (" << static_cast<int>(a9.a0) << "))"
6632 << ")\n";
6633
6634 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6635
6636 std::cout << "result = " << result << "\n";
6637
6638 CHECK_EQ(5, result);
6639
6640 // Pass argument that will make the Dart callback throw.
6641 a0.a0 = 42;
6642
6643 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6644
6645 CHECK_EQ(0, result);
6646
6647 // Pass argument that will make the Dart callback return null.
6648 a0.a0 = 84;
6649
6650 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6651
6652 CHECK_EQ(0, result);
6653
6654 return 0;
6655}
6656
6657// Used for testing structs and unions by value.
6658// Not a multiple of word size, not a power of two.
6659// 10 struct arguments will exhaust available registers.
6661 // NOLINTNEXTLINE(whitespace/parens)
6662 int64_t (*f)(Struct3BytesHomogeneousUint8 a0,
6682
6683 a0.a0 = 1;
6684 a0.a1 = 2;
6685 a0.a2 = 3;
6686 a1.a0 = 4;
6687 a1.a1 = 5;
6688 a1.a2 = 6;
6689 a2.a0 = 7;
6690 a2.a1 = 8;
6691 a2.a2 = 9;
6692 a3.a0 = 10;
6693 a3.a1 = 11;
6694 a3.a2 = 12;
6695 a4.a0 = 13;
6696 a4.a1 = 14;
6697 a4.a2 = 15;
6698 a5.a0 = 16;
6699 a5.a1 = 17;
6700 a5.a2 = 18;
6701 a6.a0 = 19;
6702 a6.a1 = 20;
6703 a6.a2 = 21;
6704 a7.a0 = 22;
6705 a7.a1 = 23;
6706 a7.a2 = 24;
6707 a8.a0 = 25;
6708 a8.a1 = 26;
6709 a8.a2 = 27;
6710 a9.a0 = 28;
6711 a9.a1 = 29;
6712 a9.a2 = 30;
6713
6714 std::cout << "Calling TestPassStruct3BytesHomogeneousUint8x10("
6715 << "((" << static_cast<int>(a0.a0) << ", "
6716 << static_cast<int>(a0.a1) << ", " << static_cast<int>(a0.a2)
6717 << "), (" << static_cast<int>(a1.a0) << ", "
6718 << static_cast<int>(a1.a1) << ", " << static_cast<int>(a1.a2)
6719 << "), (" << static_cast<int>(a2.a0) << ", "
6720 << static_cast<int>(a2.a1) << ", " << static_cast<int>(a2.a2)
6721 << "), (" << static_cast<int>(a3.a0) << ", "
6722 << static_cast<int>(a3.a1) << ", " << static_cast<int>(a3.a2)
6723 << "), (" << static_cast<int>(a4.a0) << ", "
6724 << static_cast<int>(a4.a1) << ", " << static_cast<int>(a4.a2)
6725 << "), (" << static_cast<int>(a5.a0) << ", "
6726 << static_cast<int>(a5.a1) << ", " << static_cast<int>(a5.a2)
6727 << "), (" << static_cast<int>(a6.a0) << ", "
6728 << static_cast<int>(a6.a1) << ", " << static_cast<int>(a6.a2)
6729 << "), (" << static_cast<int>(a7.a0) << ", "
6730 << static_cast<int>(a7.a1) << ", " << static_cast<int>(a7.a2)
6731 << "), (" << static_cast<int>(a8.a0) << ", "
6732 << static_cast<int>(a8.a1) << ", " << static_cast<int>(a8.a2)
6733 << "), (" << static_cast<int>(a9.a0) << ", "
6734 << static_cast<int>(a9.a1) << ", " << static_cast<int>(a9.a2)
6735 << "))"
6736 << ")\n";
6737
6738 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6739
6740 std::cout << "result = " << result << "\n";
6741
6742 CHECK_EQ(465, result);
6743
6744 // Pass argument that will make the Dart callback throw.
6745 a0.a0 = 42;
6746
6747 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6748
6749 CHECK_EQ(0, result);
6750
6751 // Pass argument that will make the Dart callback return null.
6752 a0.a0 = 84;
6753
6754 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6755
6756 CHECK_EQ(0, result);
6757
6758 return 0;
6759}
6760
6761// Used for testing structs and unions by value.
6762// Not a multiple of word size, not a power of two.
6763// With alignment rules taken into account size is 4 bytes.
6764// 10 struct arguments will exhaust available registers.
6766 // NOLINTNEXTLINE(whitespace/parens)
6767 int64_t (*f)(Struct3BytesInt2ByteAligned a0,
6787
6788 a0.a0 = -1;
6789 a0.a1 = 2;
6790 a1.a0 = -3;
6791 a1.a1 = 4;
6792 a2.a0 = -5;
6793 a2.a1 = 6;
6794 a3.a0 = -7;
6795 a3.a1 = 8;
6796 a4.a0 = -9;
6797 a4.a1 = 10;
6798 a5.a0 = -11;
6799 a5.a1 = 12;
6800 a6.a0 = -13;
6801 a6.a1 = 14;
6802 a7.a0 = -15;
6803 a7.a1 = 16;
6804 a8.a0 = -17;
6805 a8.a1 = 18;
6806 a9.a0 = -19;
6807 a9.a1 = 20;
6808
6809 std::cout << "Calling TestPassStruct3BytesInt2ByteAlignedx10("
6810 << "((" << a0.a0 << ", " << static_cast<int>(a0.a1) << "), ("
6811 << a1.a0 << ", " << static_cast<int>(a1.a1) << "), (" << a2.a0
6812 << ", " << static_cast<int>(a2.a1) << "), (" << a3.a0 << ", "
6813 << static_cast<int>(a3.a1) << "), (" << a4.a0 << ", "
6814 << static_cast<int>(a4.a1) << "), (" << a5.a0 << ", "
6815 << static_cast<int>(a5.a1) << "), (" << a6.a0 << ", "
6816 << static_cast<int>(a6.a1) << "), (" << a7.a0 << ", "
6817 << static_cast<int>(a7.a1) << "), (" << a8.a0 << ", "
6818 << static_cast<int>(a8.a1) << "), (" << a9.a0 << ", "
6819 << static_cast<int>(a9.a1) << "))"
6820 << ")\n";
6821
6822 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6823
6824 std::cout << "result = " << result << "\n";
6825
6826 CHECK_EQ(10, result);
6827
6828 // Pass argument that will make the Dart callback throw.
6829 a0.a0 = 42;
6830
6831 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6832
6833 CHECK_EQ(0, result);
6834
6835 // Pass argument that will make the Dart callback return null.
6836 a0.a0 = 84;
6837
6838 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6839
6840 CHECK_EQ(0, result);
6841
6842 return 0;
6843}
6844
6845// Used for testing structs and unions by value.
6846// Exactly word size on 32-bit architectures.
6847// 10 struct arguments will exhaust available registers.
6849 // NOLINTNEXTLINE(whitespace/parens)
6850 int64_t (*f)(Struct4BytesHomogeneousInt16 a0,
6870
6871 a0.a0 = -1;
6872 a0.a1 = 2;
6873 a1.a0 = -3;
6874 a1.a1 = 4;
6875 a2.a0 = -5;
6876 a2.a1 = 6;
6877 a3.a0 = -7;
6878 a3.a1 = 8;
6879 a4.a0 = -9;
6880 a4.a1 = 10;
6881 a5.a0 = -11;
6882 a5.a1 = 12;
6883 a6.a0 = -13;
6884 a6.a1 = 14;
6885 a7.a0 = -15;
6886 a7.a1 = 16;
6887 a8.a0 = -17;
6888 a8.a1 = 18;
6889 a9.a0 = -19;
6890 a9.a1 = 20;
6891
6892 std::cout << "Calling TestPassStruct4BytesHomogeneousInt16x10("
6893 << "((" << a0.a0 << ", " << a0.a1 << "), (" << a1.a0 << ", "
6894 << a1.a1 << "), (" << a2.a0 << ", " << a2.a1 << "), (" << a3.a0
6895 << ", " << a3.a1 << "), (" << a4.a0 << ", " << a4.a1 << "), ("
6896 << a5.a0 << ", " << a5.a1 << "), (" << a6.a0 << ", " << a6.a1
6897 << "), (" << a7.a0 << ", " << a7.a1 << "), (" << a8.a0 << ", "
6898 << a8.a1 << "), (" << a9.a0 << ", " << a9.a1 << "))"
6899 << ")\n";
6900
6901 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6902
6903 std::cout << "result = " << result << "\n";
6904
6905 CHECK_EQ(10, result);
6906
6907 // Pass argument that will make the Dart callback throw.
6908 a0.a0 = 42;
6909
6910 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6911
6912 CHECK_EQ(0, result);
6913
6914 // Pass argument that will make the Dart callback return null.
6915 a0.a0 = 84;
6916
6917 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6918
6919 CHECK_EQ(0, result);
6920
6921 return 0;
6922}
6923
6924// Used for testing structs and unions by value.
6925// Sub word size on 64 bit architectures.
6926// 10 struct arguments will exhaust available registers.
6928 // NOLINTNEXTLINE(whitespace/parens)
6929 int64_t (*f)(Struct7BytesHomogeneousUint8 a0,
6949
6950 a0.a0 = 1;
6951 a0.a1 = 2;
6952 a0.a2 = 3;
6953 a0.a3 = 4;
6954 a0.a4 = 5;
6955 a0.a5 = 6;
6956 a0.a6 = 7;
6957 a1.a0 = 8;
6958 a1.a1 = 9;
6959 a1.a2 = 10;
6960 a1.a3 = 11;
6961 a1.a4 = 12;
6962 a1.a5 = 13;
6963 a1.a6 = 14;
6964 a2.a0 = 15;
6965 a2.a1 = 16;
6966 a2.a2 = 17;
6967 a2.a3 = 18;
6968 a2.a4 = 19;
6969 a2.a5 = 20;
6970 a2.a6 = 21;
6971 a3.a0 = 22;
6972 a3.a1 = 23;
6973 a3.a2 = 24;
6974 a3.a3 = 25;
6975 a3.a4 = 26;
6976 a3.a5 = 27;
6977 a3.a6 = 28;
6978 a4.a0 = 29;
6979 a4.a1 = 30;
6980 a4.a2 = 31;
6981 a4.a3 = 32;
6982 a4.a4 = 33;
6983 a4.a5 = 34;
6984 a4.a6 = 35;
6985 a5.a0 = 36;
6986 a5.a1 = 37;
6987 a5.a2 = 38;
6988 a5.a3 = 39;
6989 a5.a4 = 40;
6990 a5.a5 = 41;
6991 a5.a6 = 42;
6992 a6.a0 = 43;
6993 a6.a1 = 44;
6994 a6.a2 = 45;
6995 a6.a3 = 46;
6996 a6.a4 = 47;
6997 a6.a5 = 48;
6998 a6.a6 = 49;
6999 a7.a0 = 50;
7000 a7.a1 = 51;
7001 a7.a2 = 52;
7002 a7.a3 = 53;
7003 a7.a4 = 54;
7004 a7.a5 = 55;
7005 a7.a6 = 56;
7006 a8.a0 = 57;
7007 a8.a1 = 58;
7008 a8.a2 = 59;
7009 a8.a3 = 60;
7010 a8.a4 = 61;
7011 a8.a5 = 62;
7012 a8.a6 = 63;
7013 a9.a0 = 64;
7014 a9.a1 = 65;
7015 a9.a2 = 66;
7016 a9.a3 = 67;
7017 a9.a4 = 68;
7018 a9.a5 = 69;
7019 a9.a6 = 70;
7020
7021 std::cout
7022 << "Calling TestPassStruct7BytesHomogeneousUint8x10("
7023 << "((" << static_cast<int>(a0.a0) << ", " << static_cast<int>(a0.a1)
7024 << ", " << static_cast<int>(a0.a2) << ", " << static_cast<int>(a0.a3)
7025 << ", " << static_cast<int>(a0.a4) << ", " << static_cast<int>(a0.a5)
7026 << ", " << static_cast<int>(a0.a6) << "), (" << static_cast<int>(a1.a0)
7027 << ", " << static_cast<int>(a1.a1) << ", " << static_cast<int>(a1.a2)
7028 << ", " << static_cast<int>(a1.a3) << ", " << static_cast<int>(a1.a4)
7029 << ", " << static_cast<int>(a1.a5) << ", " << static_cast<int>(a1.a6)
7030 << "), (" << static_cast<int>(a2.a0) << ", " << static_cast<int>(a2.a1)
7031 << ", " << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3)
7032 << ", " << static_cast<int>(a2.a4) << ", " << static_cast<int>(a2.a5)
7033 << ", " << static_cast<int>(a2.a6) << "), (" << static_cast<int>(a3.a0)
7034 << ", " << static_cast<int>(a3.a1) << ", " << static_cast<int>(a3.a2)
7035 << ", " << static_cast<int>(a3.a3) << ", " << static_cast<int>(a3.a4)
7036 << ", " << static_cast<int>(a3.a5) << ", " << static_cast<int>(a3.a6)
7037 << "), (" << static_cast<int>(a4.a0) << ", " << static_cast<int>(a4.a1)
7038 << ", " << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3)
7039 << ", " << static_cast<int>(a4.a4) << ", " << static_cast<int>(a4.a5)
7040 << ", " << static_cast<int>(a4.a6) << "), (" << static_cast<int>(a5.a0)
7041 << ", " << static_cast<int>(a5.a1) << ", " << static_cast<int>(a5.a2)
7042 << ", " << static_cast<int>(a5.a3) << ", " << static_cast<int>(a5.a4)
7043 << ", " << static_cast<int>(a5.a5) << ", " << static_cast<int>(a5.a6)
7044 << "), (" << static_cast<int>(a6.a0) << ", " << static_cast<int>(a6.a1)
7045 << ", " << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3)
7046 << ", " << static_cast<int>(a6.a4) << ", " << static_cast<int>(a6.a5)
7047 << ", " << static_cast<int>(a6.a6) << "), (" << static_cast<int>(a7.a0)
7048 << ", " << static_cast<int>(a7.a1) << ", " << static_cast<int>(a7.a2)
7049 << ", " << static_cast<int>(a7.a3) << ", " << static_cast<int>(a7.a4)
7050 << ", " << static_cast<int>(a7.a5) << ", " << static_cast<int>(a7.a6)
7051 << "), (" << static_cast<int>(a8.a0) << ", " << static_cast<int>(a8.a1)
7052 << ", " << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3)
7053 << ", " << static_cast<int>(a8.a4) << ", " << static_cast<int>(a8.a5)
7054 << ", " << static_cast<int>(a8.a6) << "), (" << static_cast<int>(a9.a0)
7055 << ", " << static_cast<int>(a9.a1) << ", " << static_cast<int>(a9.a2)
7056 << ", " << static_cast<int>(a9.a3) << ", " << static_cast<int>(a9.a4)
7057 << ", " << static_cast<int>(a9.a5) << ", " << static_cast<int>(a9.a6)
7058 << "))"
7059 << ")\n";
7060
7061 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7062
7063 std::cout << "result = " << result << "\n";
7064
7065 CHECK_EQ(2485, result);
7066
7067 // Pass argument that will make the Dart callback throw.
7068 a0.a0 = 42;
7069
7070 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7071
7072 CHECK_EQ(0, result);
7073
7074 // Pass argument that will make the Dart callback return null.
7075 a0.a0 = 84;
7076
7077 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7078
7079 CHECK_EQ(0, result);
7080
7081 return 0;
7082}
7083
7084// Used for testing structs and unions by value.
7085// Sub word size on 64 bit architectures.
7086// With alignment rules taken into account size is 8 bytes.
7087// 10 struct arguments will exhaust available registers.
7089 // NOLINTNEXTLINE(whitespace/parens)
7090 int64_t (*f)(Struct7BytesInt4ByteAligned a0,
7110
7111 a0.a0 = -1;
7112 a0.a1 = 2;
7113 a0.a2 = -3;
7114 a1.a0 = 4;
7115 a1.a1 = -5;
7116 a1.a2 = 6;
7117 a2.a0 = -7;
7118 a2.a1 = 8;
7119 a2.a2 = -9;
7120 a3.a0 = 10;
7121 a3.a1 = -11;
7122 a3.a2 = 12;
7123 a4.a0 = -13;
7124 a4.a1 = 14;
7125 a4.a2 = -15;
7126 a5.a0 = 16;
7127 a5.a1 = -17;
7128 a5.a2 = 18;
7129 a6.a0 = -19;
7130 a6.a1 = 20;
7131 a6.a2 = -21;
7132 a7.a0 = 22;
7133 a7.a1 = -23;
7134 a7.a2 = 24;
7135 a8.a0 = -25;
7136 a8.a1 = 26;
7137 a8.a2 = -27;
7138 a9.a0 = 28;
7139 a9.a1 = -29;
7140 a9.a2 = 30;
7141
7142 std::cout << "Calling TestPassStruct7BytesInt4ByteAlignedx10("
7143 << "((" << a0.a0 << ", " << a0.a1 << ", " << static_cast<int>(a0.a2)
7144 << "), (" << a1.a0 << ", " << a1.a1 << ", "
7145 << static_cast<int>(a1.a2) << "), (" << a2.a0 << ", " << a2.a1
7146 << ", " << static_cast<int>(a2.a2) << "), (" << a3.a0 << ", "
7147 << a3.a1 << ", " << static_cast<int>(a3.a2) << "), (" << a4.a0
7148 << ", " << a4.a1 << ", " << static_cast<int>(a4.a2) << "), ("
7149 << a5.a0 << ", " << a5.a1 << ", " << static_cast<int>(a5.a2)
7150 << "), (" << a6.a0 << ", " << a6.a1 << ", "
7151 << static_cast<int>(a6.a2) << "), (" << a7.a0 << ", " << a7.a1
7152 << ", " << static_cast<int>(a7.a2) << "), (" << a8.a0 << ", "
7153 << a8.a1 << ", " << static_cast<int>(a8.a2) << "), (" << a9.a0
7154 << ", " << a9.a1 << ", " << static_cast<int>(a9.a2) << "))"
7155 << ")\n";
7156
7157 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7158
7159 std::cout << "result = " << result << "\n";
7160
7161 CHECK_EQ(15, result);
7162
7163 // Pass argument that will make the Dart callback throw.
7164 a0.a0 = 42;
7165
7166 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7167
7168 CHECK_EQ(0, result);
7169
7170 // Pass argument that will make the Dart callback return null.
7171 a0.a0 = 84;
7172
7173 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7174
7175 CHECK_EQ(0, result);
7176
7177 return 0;
7178}
7179
7180// Used for testing structs and unions by value.
7181// Exactly word size struct on 64bit architectures.
7182// 10 struct arguments will exhaust available registers.
7184 // NOLINTNEXTLINE(whitespace/parens)
7185 int64_t (*f)(Struct8BytesInt a0,
7186 Struct8BytesInt a1,
7187 Struct8BytesInt a2,
7188 Struct8BytesInt a3,
7189 Struct8BytesInt a4,
7190 Struct8BytesInt a5,
7191 Struct8BytesInt a6,
7192 Struct8BytesInt a7,
7193 Struct8BytesInt a8,
7194 Struct8BytesInt a9)) {
7195 Struct8BytesInt a0 = {};
7196 Struct8BytesInt a1 = {};
7197 Struct8BytesInt a2 = {};
7198 Struct8BytesInt a3 = {};
7199 Struct8BytesInt a4 = {};
7200 Struct8BytesInt a5 = {};
7201 Struct8BytesInt a6 = {};
7202 Struct8BytesInt a7 = {};
7203 Struct8BytesInt a8 = {};
7204 Struct8BytesInt a9 = {};
7205
7206 a0.a0 = -1;
7207 a0.a1 = 2;
7208 a0.a2 = -3;
7209 a1.a0 = 4;
7210 a1.a1 = -5;
7211 a1.a2 = 6;
7212 a2.a0 = -7;
7213 a2.a1 = 8;
7214 a2.a2 = -9;
7215 a3.a0 = 10;
7216 a3.a1 = -11;
7217 a3.a2 = 12;
7218 a4.a0 = -13;
7219 a4.a1 = 14;
7220 a4.a2 = -15;
7221 a5.a0 = 16;
7222 a5.a1 = -17;
7223 a5.a2 = 18;
7224 a6.a0 = -19;
7225 a6.a1 = 20;
7226 a6.a2 = -21;
7227 a7.a0 = 22;
7228 a7.a1 = -23;
7229 a7.a2 = 24;
7230 a8.a0 = -25;
7231 a8.a1 = 26;
7232 a8.a2 = -27;
7233 a9.a0 = 28;
7234 a9.a1 = -29;
7235 a9.a2 = 30;
7236
7237 std::cout << "Calling TestPassStruct8BytesIntx10("
7238 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << "), ("
7239 << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << "), (" << a2.a0
7240 << ", " << a2.a1 << ", " << a2.a2 << "), (" << a3.a0 << ", "
7241 << a3.a1 << ", " << a3.a2 << "), (" << a4.a0 << ", " << a4.a1
7242 << ", " << a4.a2 << "), (" << a5.a0 << ", " << a5.a1 << ", "
7243 << a5.a2 << "), (" << a6.a0 << ", " << a6.a1 << ", " << a6.a2
7244 << "), (" << a7.a0 << ", " << a7.a1 << ", " << a7.a2 << "), ("
7245 << a8.a0 << ", " << a8.a1 << ", " << a8.a2 << "), (" << a9.a0
7246 << ", " << a9.a1 << ", " << a9.a2 << "))"
7247 << ")\n";
7248
7249 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7250
7251 std::cout << "result = " << result << "\n";
7252
7253 CHECK_EQ(15, result);
7254
7255 // Pass argument that will make the Dart callback throw.
7256 a0.a0 = 42;
7257
7258 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7259
7260 CHECK_EQ(0, result);
7261
7262 // Pass argument that will make the Dart callback return null.
7263 a0.a0 = 84;
7264
7265 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7266
7267 CHECK_EQ(0, result);
7268
7269 return 0;
7270}
7271
7272// Used for testing structs and unions by value.
7273// Arguments passed in FP registers as long as they fit.
7274// 10 struct arguments will exhaust available registers.
7276 // NOLINTNEXTLINE(whitespace/parens)
7277 float (*f)(Struct8BytesHomogeneousFloat a0,
7297
7298 a0.a0 = -1.0;
7299 a0.a1 = 2.0;
7300 a1.a0 = -3.0;
7301 a1.a1 = 4.0;
7302 a2.a0 = -5.0;
7303 a2.a1 = 6.0;
7304 a3.a0 = -7.0;
7305 a3.a1 = 8.0;
7306 a4.a0 = -9.0;
7307 a4.a1 = 10.0;
7308 a5.a0 = -11.0;
7309 a5.a1 = 12.0;
7310 a6.a0 = -13.0;
7311 a6.a1 = 14.0;
7312 a7.a0 = -15.0;
7313 a7.a1 = 16.0;
7314 a8.a0 = -17.0;
7315 a8.a1 = 18.0;
7316 a9.a0 = -19.0;
7317 a9.a1 = 20.0;
7318
7319 std::cout << "Calling TestPassStruct8BytesHomogeneousFloatx10("
7320 << "((" << a0.a0 << ", " << a0.a1 << "), (" << a1.a0 << ", "
7321 << a1.a1 << "), (" << a2.a0 << ", " << a2.a1 << "), (" << a3.a0
7322 << ", " << a3.a1 << "), (" << a4.a0 << ", " << a4.a1 << "), ("
7323 << a5.a0 << ", " << a5.a1 << "), (" << a6.a0 << ", " << a6.a1
7324 << "), (" << a7.a0 << ", " << a7.a1 << "), (" << a8.a0 << ", "
7325 << a8.a1 << "), (" << a9.a0 << ", " << a9.a1 << "))"
7326 << ")\n";
7327
7328 float result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7329
7330 std::cout << "result = " << result << "\n";
7331
7332 CHECK_APPROX(10.0, result);
7333
7334 // Pass argument that will make the Dart callback throw.
7335 a0.a0 = 42;
7336
7337 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7338
7339 CHECK_APPROX(0.0, result);
7340
7341 // Pass argument that will make the Dart callback return null.
7342 a0.a0 = 84;
7343
7344 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7345
7346 CHECK_APPROX(0.0, result);
7347
7348 return 0;
7349}
7350
7351// Used for testing structs and unions by value.
7352// On x64, arguments go in int registers because it is not only float.
7353// 10 struct arguments will exhaust available registers.
7355 // NOLINTNEXTLINE(whitespace/parens)
7356 float (*f)(Struct8BytesMixed a0,
7365 Struct8BytesMixed a9)) {
7366 Struct8BytesMixed a0 = {};
7367 Struct8BytesMixed a1 = {};
7368 Struct8BytesMixed a2 = {};
7369 Struct8BytesMixed a3 = {};
7370 Struct8BytesMixed a4 = {};
7371 Struct8BytesMixed a5 = {};
7372 Struct8BytesMixed a6 = {};
7373 Struct8BytesMixed a7 = {};
7374 Struct8BytesMixed a8 = {};
7375 Struct8BytesMixed a9 = {};
7376
7377 a0.a0 = -1.0;
7378 a0.a1 = 2;
7379 a0.a2 = -3;
7380 a1.a0 = 4.0;
7381 a1.a1 = -5;
7382 a1.a2 = 6;
7383 a2.a0 = -7.0;
7384 a2.a1 = 8;
7385 a2.a2 = -9;
7386 a3.a0 = 10.0;
7387 a3.a1 = -11;
7388 a3.a2 = 12;
7389 a4.a0 = -13.0;
7390 a4.a1 = 14;
7391 a4.a2 = -15;
7392 a5.a0 = 16.0;
7393 a5.a1 = -17;
7394 a5.a2 = 18;
7395 a6.a0 = -19.0;
7396 a6.a1 = 20;
7397 a6.a2 = -21;
7398 a7.a0 = 22.0;
7399 a7.a1 = -23;
7400 a7.a2 = 24;
7401 a8.a0 = -25.0;
7402 a8.a1 = 26;
7403 a8.a2 = -27;
7404 a9.a0 = 28.0;
7405 a9.a1 = -29;
7406 a9.a2 = 30;
7407
7408 std::cout << "Calling TestPassStruct8BytesMixedx10("
7409 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << "), ("
7410 << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << "), (" << a2.a0
7411 << ", " << a2.a1 << ", " << a2.a2 << "), (" << a3.a0 << ", "
7412 << a3.a1 << ", " << a3.a2 << "), (" << a4.a0 << ", " << a4.a1
7413 << ", " << a4.a2 << "), (" << a5.a0 << ", " << a5.a1 << ", "
7414 << a5.a2 << "), (" << a6.a0 << ", " << a6.a1 << ", " << a6.a2
7415 << "), (" << a7.a0 << ", " << a7.a1 << ", " << a7.a2 << "), ("
7416 << a8.a0 << ", " << a8.a1 << ", " << a8.a2 << "), (" << a9.a0
7417 << ", " << a9.a1 << ", " << a9.a2 << "))"
7418 << ")\n";
7419
7420 float result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7421
7422 std::cout << "result = " << result << "\n";
7423
7424 CHECK_APPROX(15.0, result);
7425
7426 // Pass argument that will make the Dart callback throw.
7427 a0.a0 = 42;
7428
7429 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7430
7431 CHECK_APPROX(0.0, result);
7432
7433 // Pass argument that will make the Dart callback return null.
7434 a0.a0 = 84;
7435
7436 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7437
7438 CHECK_APPROX(0.0, result);
7439
7440 return 0;
7441}
7442
7443// Used for testing structs and unions by value.
7444// Argument is a single byte over a multiple of word size.
7445// 10 struct arguments will exhaust available registers.
7446// Struct only has 1-byte aligned fields to test struct alignment itself.
7447// Tests upper bytes in the integer registers that are partly filled.
7448// Tests stack alignment of non word size stack arguments.
7450 // NOLINTNEXTLINE(whitespace/parens)
7451 int64_t (*f)(Struct9BytesHomogeneousUint8 a0,
7471
7472 a0.a0 = 1;
7473 a0.a1 = 2;
7474 a0.a2 = 3;
7475 a0.a3 = 4;
7476 a0.a4 = 5;
7477 a0.a5 = 6;
7478 a0.a6 = 7;
7479 a0.a7 = 8;
7480 a0.a8 = 9;
7481 a1.a0 = 10;
7482 a1.a1 = 11;
7483 a1.a2 = 12;
7484 a1.a3 = 13;
7485 a1.a4 = 14;
7486 a1.a5 = 15;
7487 a1.a6 = 16;
7488 a1.a7 = 17;
7489 a1.a8 = 18;
7490 a2.a0 = 19;
7491 a2.a1 = 20;
7492 a2.a2 = 21;
7493 a2.a3 = 22;
7494 a2.a4 = 23;
7495 a2.a5 = 24;
7496 a2.a6 = 25;
7497 a2.a7 = 26;
7498 a2.a8 = 27;
7499 a3.a0 = 28;
7500 a3.a1 = 29;
7501 a3.a2 = 30;
7502 a3.a3 = 31;
7503 a3.a4 = 32;
7504 a3.a5 = 33;
7505 a3.a6 = 34;
7506 a3.a7 = 35;
7507 a3.a8 = 36;
7508 a4.a0 = 37;
7509 a4.a1 = 38;
7510 a4.a2 = 39;
7511 a4.a3 = 40;
7512 a4.a4 = 41;
7513 a4.a5 = 42;
7514 a4.a6 = 43;
7515 a4.a7 = 44;
7516 a4.a8 = 45;
7517 a5.a0 = 46;
7518 a5.a1 = 47;
7519 a5.a2 = 48;
7520 a5.a3 = 49;
7521 a5.a4 = 50;
7522 a5.a5 = 51;
7523 a5.a6 = 52;
7524 a5.a7 = 53;
7525 a5.a8 = 54;
7526 a6.a0 = 55;
7527 a6.a1 = 56;
7528 a6.a2 = 57;
7529 a6.a3 = 58;
7530 a6.a4 = 59;
7531 a6.a5 = 60;
7532 a6.a6 = 61;
7533 a6.a7 = 62;
7534 a6.a8 = 63;
7535 a7.a0 = 64;
7536 a7.a1 = 65;
7537 a7.a2 = 66;
7538 a7.a3 = 67;
7539 a7.a4 = 68;
7540 a7.a5 = 69;
7541 a7.a6 = 70;
7542 a7.a7 = 71;
7543 a7.a8 = 72;
7544 a8.a0 = 73;
7545 a8.a1 = 74;
7546 a8.a2 = 75;
7547 a8.a3 = 76;
7548 a8.a4 = 77;
7549 a8.a5 = 78;
7550 a8.a6 = 79;
7551 a8.a7 = 80;
7552 a8.a8 = 81;
7553 a9.a0 = 82;
7554 a9.a1 = 83;
7555 a9.a2 = 84;
7556 a9.a3 = 85;
7557 a9.a4 = 86;
7558 a9.a5 = 87;
7559 a9.a6 = 88;
7560 a9.a7 = 89;
7561 a9.a8 = 90;
7562
7563 std::cout
7564 << "Calling TestPassStruct9BytesHomogeneousUint8x10("
7565 << "((" << static_cast<int>(a0.a0) << ", " << static_cast<int>(a0.a1)
7566 << ", " << static_cast<int>(a0.a2) << ", " << static_cast<int>(a0.a3)
7567 << ", " << static_cast<int>(a0.a4) << ", " << static_cast<int>(a0.a5)
7568 << ", " << static_cast<int>(a0.a6) << ", " << static_cast<int>(a0.a7)
7569 << ", " << static_cast<int>(a0.a8) << "), (" << static_cast<int>(a1.a0)
7570 << ", " << static_cast<int>(a1.a1) << ", " << static_cast<int>(a1.a2)
7571 << ", " << static_cast<int>(a1.a3) << ", " << static_cast<int>(a1.a4)
7572 << ", " << static_cast<int>(a1.a5) << ", " << static_cast<int>(a1.a6)
7573 << ", " << static_cast<int>(a1.a7) << ", " << static_cast<int>(a1.a8)
7574 << "), (" << static_cast<int>(a2.a0) << ", " << static_cast<int>(a2.a1)
7575 << ", " << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3)
7576 << ", " << static_cast<int>(a2.a4) << ", " << static_cast<int>(a2.a5)
7577 << ", " << static_cast<int>(a2.a6) << ", " << static_cast<int>(a2.a7)
7578 << ", " << static_cast<int>(a2.a8) << "), (" << static_cast<int>(a3.a0)
7579 << ", " << static_cast<int>(a3.a1) << ", " << static_cast<int>(a3.a2)
7580 << ", " << static_cast<int>(a3.a3) << ", " << static_cast<int>(a3.a4)
7581 << ", " << static_cast<int>(a3.a5) << ", " << static_cast<int>(a3.a6)
7582 << ", " << static_cast<int>(a3.a7) << ", " << static_cast<int>(a3.a8)
7583 << "), (" << static_cast<int>(a4.a0) << ", " << static_cast<int>(a4.a1)
7584 << ", " << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3)
7585 << ", " << static_cast<int>(a4.a4) << ", " << static_cast<int>(a4.a5)
7586 << ", " << static_cast<int>(a4.a6) << ", " << static_cast<int>(a4.a7)
7587 << ", " << static_cast<int>(a4.a8) << "), (" << static_cast<int>(a5.a0)
7588 << ", " << static_cast<int>(a5.a1) << ", " << static_cast<int>(a5.a2)
7589 << ", " << static_cast<int>(a5.a3) << ", " << static_cast<int>(a5.a4)
7590 << ", " << static_cast<int>(a5.a5) << ", " << static_cast<int>(a5.a6)
7591 << ", " << static_cast<int>(a5.a7) << ", " << static_cast<int>(a5.a8)
7592 << "), (" << static_cast<int>(a6.a0) << ", " << static_cast<int>(a6.a1)
7593 << ", " << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3)
7594 << ", " << static_cast<int>(a6.a4) << ", " << static_cast<int>(a6.a5)
7595 << ", " << static_cast<int>(a6.a6) << ", " << static_cast<int>(a6.a7)
7596 << ", " << static_cast<int>(a6.a8) << "), (" << static_cast<int>(a7.a0)
7597 << ", " << static_cast<int>(a7.a1) << ", " << static_cast<int>(a7.a2)
7598 << ", " << static_cast<int>(a7.a3) << ", " << static_cast<int>(a7.a4)
7599 << ", " << static_cast<int>(a7.a5) << ", " << static_cast<int>(a7.a6)
7600 << ", " << static_cast<int>(a7.a7) << ", " << static_cast<int>(a7.a8)
7601 << "), (" << static_cast<int>(a8.a0) << ", " << static_cast<int>(a8.a1)
7602 << ", " << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3)
7603 << ", " << static_cast<int>(a8.a4) << ", " << static_cast<int>(a8.a5)
7604 << ", " << static_cast<int>(a8.a6) << ", " << static_cast<int>(a8.a7)
7605 << ", " << static_cast<int>(a8.a8) << "), (" << static_cast<int>(a9.a0)
7606 << ", " << static_cast<int>(a9.a1) << ", " << static_cast<int>(a9.a2)
7607 << ", " << static_cast<int>(a9.a3) << ", " << static_cast<int>(a9.a4)
7608 << ", " << static_cast<int>(a9.a5) << ", " << static_cast<int>(a9.a6)
7609 << ", " << static_cast<int>(a9.a7) << ", " << static_cast<int>(a9.a8)
7610 << "))"
7611 << ")\n";
7612
7613 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7614
7615 std::cout << "result = " << result << "\n";
7616
7617 CHECK_EQ(4095, result);
7618
7619 // Pass argument that will make the Dart callback throw.
7620 a0.a0 = 42;
7621
7622 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7623
7624 CHECK_EQ(0, result);
7625
7626 // Pass argument that will make the Dart callback return null.
7627 a0.a0 = 84;
7628
7629 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7630
7631 CHECK_EQ(0, result);
7632
7633 return 0;
7634}
7635
7636// Used for testing structs and unions by value.
7637// Argument is a single byte over a multiple of word size.
7638// With alignment rules taken into account size is 12 or 16 bytes.
7639// 10 struct arguments will exhaust available registers.
7640//
7642 // NOLINTNEXTLINE(whitespace/parens)
7643 int64_t (*f)(Struct9BytesInt4Or8ByteAligned a0,
7663
7664 a0.a0 = -1;
7665 a0.a1 = 2;
7666 a1.a0 = -3;
7667 a1.a1 = 4;
7668 a2.a0 = -5;
7669 a2.a1 = 6;
7670 a3.a0 = -7;
7671 a3.a1 = 8;
7672 a4.a0 = -9;
7673 a4.a1 = 10;
7674 a5.a0 = -11;
7675 a5.a1 = 12;
7676 a6.a0 = -13;
7677 a6.a1 = 14;
7678 a7.a0 = -15;
7679 a7.a1 = 16;
7680 a8.a0 = -17;
7681 a8.a1 = 18;
7682 a9.a0 = -19;
7683 a9.a1 = 20;
7684
7685 std::cout << "Calling TestPassStruct9BytesInt4Or8ByteAlignedx10("
7686 << "((" << a0.a0 << ", " << static_cast<int>(a0.a1) << "), ("
7687 << a1.a0 << ", " << static_cast<int>(a1.a1) << "), (" << a2.a0
7688 << ", " << static_cast<int>(a2.a1) << "), (" << a3.a0 << ", "
7689 << static_cast<int>(a3.a1) << "), (" << a4.a0 << ", "
7690 << static_cast<int>(a4.a1) << "), (" << a5.a0 << ", "
7691 << static_cast<int>(a5.a1) << "), (" << a6.a0 << ", "
7692 << static_cast<int>(a6.a1) << "), (" << a7.a0 << ", "
7693 << static_cast<int>(a7.a1) << "), (" << a8.a0 << ", "
7694 << static_cast<int>(a8.a1) << "), (" << a9.a0 << ", "
7695 << static_cast<int>(a9.a1) << "))"
7696 << ")\n";
7697
7698 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7699
7700 std::cout << "result = " << result << "\n";
7701
7702 CHECK_EQ(10, result);
7703
7704 // Pass argument that will make the Dart callback throw.
7705 a0.a0 = 42;
7706
7707 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7708
7709 CHECK_EQ(0, result);
7710
7711 // Pass argument that will make the Dart callback return null.
7712 a0.a0 = 84;
7713
7714 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7715
7716 CHECK_EQ(0, result);
7717
7718 return 0;
7719}
7720
7721// Used for testing structs and unions by value.
7722// Arguments in FPU registers on arm hardfp and arm64.
7723// Struct arguments will exhaust available registers, and leave some empty.
7724// The last argument is to test whether arguments are backfilled.
7726 // NOLINTNEXTLINE(whitespace/parens)
7727 float (*f)(Struct12BytesHomogeneousFloat a0,
7739
7740 a0.a0 = -1.0;
7741 a0.a1 = 2.0;
7742 a0.a2 = -3.0;
7743 a1.a0 = 4.0;
7744 a1.a1 = -5.0;
7745 a1.a2 = 6.0;
7746 a2.a0 = -7.0;
7747 a2.a1 = 8.0;
7748 a2.a2 = -9.0;
7749 a3.a0 = 10.0;
7750 a3.a1 = -11.0;
7751 a3.a2 = 12.0;
7752 a4.a0 = -13.0;
7753 a4.a1 = 14.0;
7754 a4.a2 = -15.0;
7755 a5.a0 = 16.0;
7756 a5.a1 = -17.0;
7757 a5.a2 = 18.0;
7758
7759 std::cout << "Calling TestPassStruct12BytesHomogeneousFloatx6("
7760 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << "), ("
7761 << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << "), (" << a2.a0
7762 << ", " << a2.a1 << ", " << a2.a2 << "), (" << a3.a0 << ", "
7763 << a3.a1 << ", " << a3.a2 << "), (" << a4.a0 << ", " << a4.a1
7764 << ", " << a4.a2 << "), (" << a5.a0 << ", " << a5.a1 << ", "
7765 << a5.a2 << "))"
7766 << ")\n";
7767
7768 float result = f(a0, a1, a2, a3, a4, a5);
7769
7770 std::cout << "result = " << result << "\n";
7771
7772 CHECK_APPROX(9.0, result);
7773
7774 // Pass argument that will make the Dart callback throw.
7775 a0.a0 = 42;
7776
7777 result = f(a0, a1, a2, a3, a4, a5);
7778
7779 CHECK_APPROX(0.0, result);
7780
7781 // Pass argument that will make the Dart callback return null.
7782 a0.a0 = 84;
7783
7784 result = f(a0, a1, a2, a3, a4, a5);
7785
7786 CHECK_APPROX(0.0, result);
7787
7788 return 0;
7789}
7790
7791// Used for testing structs and unions by value.
7792// On Linux x64 argument is transferred on stack because it is over 16 bytes.
7793// Arguments in FPU registers on arm hardfp and arm64.
7794// 5 struct arguments will exhaust available registers.
7796 // NOLINTNEXTLINE(whitespace/parens)
7797 float (*f)(Struct16BytesHomogeneousFloat a0,
7807
7808 a0.a0 = -1.0;
7809 a0.a1 = 2.0;
7810 a0.a2 = -3.0;
7811 a0.a3 = 4.0;
7812 a1.a0 = -5.0;
7813 a1.a1 = 6.0;
7814 a1.a2 = -7.0;
7815 a1.a3 = 8.0;
7816 a2.a0 = -9.0;
7817 a2.a1 = 10.0;
7818 a2.a2 = -11.0;
7819 a2.a3 = 12.0;
7820 a3.a0 = -13.0;
7821 a3.a1 = 14.0;
7822 a3.a2 = -15.0;
7823 a3.a3 = 16.0;
7824 a4.a0 = -17.0;
7825 a4.a1 = 18.0;
7826 a4.a2 = -19.0;
7827 a4.a3 = 20.0;
7828
7829 std::cout << "Calling TestPassStruct16BytesHomogeneousFloatx5("
7830 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
7831 << "), (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", "
7832 << a1.a3 << "), (" << a2.a0 << ", " << a2.a1 << ", " << a2.a2
7833 << ", " << a2.a3 << "), (" << a3.a0 << ", " << a3.a1 << ", "
7834 << a3.a2 << ", " << a3.a3 << "), (" << a4.a0 << ", " << a4.a1
7835 << ", " << a4.a2 << ", " << a4.a3 << "))"
7836 << ")\n";
7837
7838 float result = f(a0, a1, a2, a3, a4);
7839
7840 std::cout << "result = " << result << "\n";
7841
7842 CHECK_APPROX(10.0, result);
7843
7844 // Pass argument that will make the Dart callback throw.
7845 a0.a0 = 42;
7846
7847 result = f(a0, a1, a2, a3, a4);
7848
7849 CHECK_APPROX(0.0, result);
7850
7851 // Pass argument that will make the Dart callback return null.
7852 a0.a0 = 84;
7853
7854 result = f(a0, a1, a2, a3, a4);
7855
7856 CHECK_APPROX(0.0, result);
7857
7858 return 0;
7859}
7860
7861// Used for testing structs and unions by value.
7862// On x64, arguments are split over FP and int registers.
7863// On x64, it will exhaust the integer registers with the 6th argument.
7864// The rest goes on the stack.
7865// On arm, arguments are 8 byte aligned.
7867 // NOLINTNEXTLINE(whitespace/parens)
7868 double (*f)(Struct16BytesMixed a0,
7877 Struct16BytesMixed a9)) {
7878 Struct16BytesMixed a0 = {};
7879 Struct16BytesMixed a1 = {};
7880 Struct16BytesMixed a2 = {};
7881 Struct16BytesMixed a3 = {};
7882 Struct16BytesMixed a4 = {};
7883 Struct16BytesMixed a5 = {};
7884 Struct16BytesMixed a6 = {};
7885 Struct16BytesMixed a7 = {};
7886 Struct16BytesMixed a8 = {};
7887 Struct16BytesMixed a9 = {};
7888
7889 a0.a0 = -1.0;
7890 a0.a1 = 2;
7891 a1.a0 = -3.0;
7892 a1.a1 = 4;
7893 a2.a0 = -5.0;
7894 a2.a1 = 6;
7895 a3.a0 = -7.0;
7896 a3.a1 = 8;
7897 a4.a0 = -9.0;
7898 a4.a1 = 10;
7899 a5.a0 = -11.0;
7900 a5.a1 = 12;
7901 a6.a0 = -13.0;
7902 a6.a1 = 14;
7903 a7.a0 = -15.0;
7904 a7.a1 = 16;
7905 a8.a0 = -17.0;
7906 a8.a1 = 18;
7907 a9.a0 = -19.0;
7908 a9.a1 = 20;
7909
7910 std::cout << "Calling TestPassStruct16BytesMixedx10("
7911 << "((" << a0.a0 << ", " << a0.a1 << "), (" << a1.a0 << ", "
7912 << a1.a1 << "), (" << a2.a0 << ", " << a2.a1 << "), (" << a3.a0
7913 << ", " << a3.a1 << "), (" << a4.a0 << ", " << a4.a1 << "), ("
7914 << a5.a0 << ", " << a5.a1 << "), (" << a6.a0 << ", " << a6.a1
7915 << "), (" << a7.a0 << ", " << a7.a1 << "), (" << a8.a0 << ", "
7916 << a8.a1 << "), (" << a9.a0 << ", " << a9.a1 << "))"
7917 << ")\n";
7918
7919 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7920
7921 std::cout << "result = " << result << "\n";
7922
7923 CHECK_APPROX(10.0, result);
7924
7925 // Pass argument that will make the Dart callback throw.
7926 a0.a0 = 42;
7927
7928 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7929
7930 CHECK_APPROX(0.0, result);
7931
7932 // Pass argument that will make the Dart callback return null.
7933 a0.a0 = 84;
7934
7935 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7936
7937 CHECK_APPROX(0.0, result);
7938
7939 return 0;
7940}
7941
7942// Used for testing structs and unions by value.
7943// On x64, arguments are split over FP and int registers.
7944// On x64, it will exhaust the integer registers with the 6th argument.
7945// The rest goes on the stack.
7946// On arm, arguments are 4 byte aligned.
7948 // NOLINTNEXTLINE(whitespace/parens)
7949 float (*f)(Struct16BytesMixed2 a0,
7958 Struct16BytesMixed2 a9)) {
7959 Struct16BytesMixed2 a0 = {};
7960 Struct16BytesMixed2 a1 = {};
7961 Struct16BytesMixed2 a2 = {};
7962 Struct16BytesMixed2 a3 = {};
7963 Struct16BytesMixed2 a4 = {};
7964 Struct16BytesMixed2 a5 = {};
7965 Struct16BytesMixed2 a6 = {};
7966 Struct16BytesMixed2 a7 = {};
7967 Struct16BytesMixed2 a8 = {};
7968 Struct16BytesMixed2 a9 = {};
7969
7970 a0.a0 = -1.0;
7971 a0.a1 = 2.0;
7972 a0.a2 = -3.0;
7973 a0.a3 = 4;
7974 a1.a0 = -5.0;
7975 a1.a1 = 6.0;
7976 a1.a2 = -7.0;
7977 a1.a3 = 8;
7978 a2.a0 = -9.0;
7979 a2.a1 = 10.0;
7980 a2.a2 = -11.0;
7981 a2.a3 = 12;
7982 a3.a0 = -13.0;
7983 a3.a1 = 14.0;
7984 a3.a2 = -15.0;
7985 a3.a3 = 16;
7986 a4.a0 = -17.0;
7987 a4.a1 = 18.0;
7988 a4.a2 = -19.0;
7989 a4.a3 = 20;
7990 a5.a0 = -21.0;
7991 a5.a1 = 22.0;
7992 a5.a2 = -23.0;
7993 a5.a3 = 24;
7994 a6.a0 = -25.0;
7995 a6.a1 = 26.0;
7996 a6.a2 = -27.0;
7997 a6.a3 = 28;
7998 a7.a0 = -29.0;
7999 a7.a1 = 30.0;
8000 a7.a2 = -31.0;
8001 a7.a3 = 32;
8002 a8.a0 = -33.0;
8003 a8.a1 = 34.0;
8004 a8.a2 = -35.0;
8005 a8.a3 = 36;
8006 a9.a0 = -37.0;
8007 a9.a1 = 38.0;
8008 a9.a2 = -39.0;
8009 a9.a3 = 40;
8010
8011 std::cout << "Calling TestPassStruct16BytesMixed2x10("
8012 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
8013 << "), (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", "
8014 << a1.a3 << "), (" << a2.a0 << ", " << a2.a1 << ", " << a2.a2
8015 << ", " << a2.a3 << "), (" << a3.a0 << ", " << a3.a1 << ", "
8016 << a3.a2 << ", " << a3.a3 << "), (" << a4.a0 << ", " << a4.a1
8017 << ", " << a4.a2 << ", " << a4.a3 << "), (" << a5.a0 << ", "
8018 << a5.a1 << ", " << a5.a2 << ", " << a5.a3 << "), (" << a6.a0
8019 << ", " << a6.a1 << ", " << a6.a2 << ", " << a6.a3 << "), ("
8020 << a7.a0 << ", " << a7.a1 << ", " << a7.a2 << ", " << a7.a3
8021 << "), (" << a8.a0 << ", " << a8.a1 << ", " << a8.a2 << ", "
8022 << a8.a3 << "), (" << a9.a0 << ", " << a9.a1 << ", " << a9.a2
8023 << ", " << a9.a3 << "))"
8024 << ")\n";
8025
8026 float result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
8027
8028 std::cout << "result = " << result << "\n";
8029
8030 CHECK_APPROX(20.0, result);
8031
8032 // Pass argument that will make the Dart callback throw.
8033 a0.a0 = 42;
8034
8035 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
8036
8037 CHECK_APPROX(0.0, result);
8038
8039 // Pass argument that will make the Dart callback return null.
8040 a0.a0 = 84;
8041
8042 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
8043
8044 CHECK_APPROX(0.0, result);
8045
8046 return 0;
8047}
8048
8049// Used for testing structs and unions by value.
8050// Arguments are passed as pointer to copy on arm64.
8051// Tests that the memory allocated for copies are rounded up to word size.
8053 // NOLINTNEXTLINE(whitespace/parens)
8054 int64_t (*f)(Struct17BytesInt a0,
8063 Struct17BytesInt a9)) {
8064 Struct17BytesInt a0 = {};
8065 Struct17BytesInt a1 = {};
8066 Struct17BytesInt a2 = {};
8067 Struct17BytesInt a3 = {};
8068 Struct17BytesInt a4 = {};
8069 Struct17BytesInt a5 = {};
8070 Struct17BytesInt a6 = {};
8071 Struct17BytesInt a7 = {};
8072 Struct17BytesInt a8 = {};
8073 Struct17BytesInt a9 = {};
8074
8075 a0.a0 = -1;
8076 a0.a1 = 2;
8077 a0.a2 = -3;
8078 a1.a0 = 4;
8079 a1.a1 = -5;
8080 a1.a2 = 6;
8081 a2.a0 = -7;
8082 a2.a1 = 8;
8083 a2.a2 = -9;
8084 a3.a0 = 10;
8085 a3.a1 = -11;
8086 a3.a2 = 12;
8087 a4.a0 = -13;
8088 a4.a1 = 14;
8089 a4.a2 = -15;
8090 a5.a0 = 16;
8091 a5.a1 = -17;
8092 a5.a2 = 18;
8093 a6.a0 = -19;
8094 a6.a1 = 20;
8095 a6.a2 = -21;
8096 a7.a0 = 22;
8097 a7.a1 = -23;
8098 a7.a2 = 24;
8099 a8.a0 = -25;
8100 a8.a1 = 26;
8101 a8.a2 = -27;
8102 a9.a0 = 28;
8103 a9.a1 = -29;
8104 a9.a2 = 30;
8105
8106 std::cout << "Calling TestPassStruct17BytesIntx10("
8107 << "((" << a0.a0 << ", " << a0.a1 << ", " << static_cast<int>(a0.a2)
8108 << "), (" << a1.a0 << ", " << a1.a1 << ", "
8109 << static_cast<int>(a1.a2) << "), (" << a2.a0 << ", " << a2.a1
8110 << ", " << static_cast<int>(a2.a2) << "), (" << a3.a0 << ", "
8111 << a3.a1 << ", " << static_cast<int>(a3.a2) << "), (" << a4.a0
8112 << ", " << a4.a1 << ", " << static_cast<int>(a4.a2) << "), ("
8113 << a5.a0 << ", " << a5.a1 << ", " << static_cast<int>(a5.a2)
8114 << "), (" << a6.a0 << ", " << a6.a1 << ", "
8115 << static_cast<int>(a6.a2) << "), (" << a7.a0 << ", " << a7.a1
8116 << ", " << static_cast<int>(a7.a2) << "), (" << a8.a0 << ", "
8117 << a8.a1 << ", " << static_cast<int>(a8.a2) << "), (" << a9.a0
8118 << ", " << a9.a1 << ", " << static_cast<int>(a9.a2) << "))"
8119 << ")\n";
8120
8121 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
8122
8123 std::cout << "result = " << result << "\n";
8124
8125 CHECK_EQ(15, result);
8126
8127 // Pass argument that will make the Dart callback throw.
8128 a0.a0 = 42;
8129
8130 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
8131
8132 CHECK_EQ(0, result);
8133
8134 // Pass argument that will make the Dart callback return null.
8135 a0.a0 = 84;
8136
8137 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
8138
8139 CHECK_EQ(0, result);
8140
8141 return 0;
8142}
8143
8144// Used for testing structs and unions by value.
8145// The minimum alignment of this struct is only 1 byte based on its fields.
8146// Test that the memory backing these structs is extended to the right size.
8147//
8149 // NOLINTNEXTLINE(whitespace/parens)
8150 int64_t (*f)(Struct19BytesHomogeneousUint8 a0,
8170
8171 a0.a0 = 1;
8172 a0.a1 = 2;
8173 a0.a2 = 3;
8174 a0.a3 = 4;
8175 a0.a4 = 5;
8176 a0.a5 = 6;
8177 a0.a6 = 7;
8178 a0.a7 = 8;
8179 a0.a8 = 9;
8180 a0.a9 = 10;
8181 a0.a10 = 11;
8182 a0.a11 = 12;
8183 a0.a12 = 13;
8184 a0.a13 = 14;
8185 a0.a14 = 15;
8186 a0.a15 = 16;
8187 a0.a16 = 17;
8188 a0.a17 = 18;
8189 a0.a18 = 19;
8190 a1.a0 = 20;
8191 a1.a1 = 21;
8192 a1.a2 = 22;
8193 a1.a3 = 23;
8194 a1.a4 = 24;
8195 a1.a5 = 25;
8196 a1.a6 = 26;
8197 a1.a7 = 27;
8198 a1.a8 = 28;
8199 a1.a9 = 29;
8200 a1.a10 = 30;
8201 a1.a11 = 31;
8202 a1.a12 = 32;
8203 a1.a13 = 33;
8204 a1.a14 = 34;
8205 a1.a15 = 35;
8206 a1.a16 = 36;
8207 a1.a17 = 37;
8208 a1.a18 = 38;
8209 a2.a0 = 39;
8210 a2.a1 = 40;
8211 a2.a2 = 41;
8212 a2.a3 = 42;
8213 a2.a4 = 43;
8214 a2.a5 = 44;
8215 a2.a6 = 45;
8216 a2.a7 = 46;
8217 a2.a8 = 47;
8218 a2.a9 = 48;
8219 a2.a10 = 49;
8220 a2.a11 = 50;
8221 a2.a12 = 51;
8222 a2.a13 = 52;
8223 a2.a14 = 53;
8224 a2.a15 = 54;
8225 a2.a16 = 55;
8226 a2.a17 = 56;
8227 a2.a18 = 57;
8228 a3.a0 = 58;
8229 a3.a1 = 59;
8230 a3.a2 = 60;
8231 a3.a3 = 61;
8232 a3.a4 = 62;
8233 a3.a5 = 63;
8234 a3.a6 = 64;
8235 a3.a7 = 65;
8236 a3.a8 = 66;
8237 a3.a9 = 67;
8238 a3.a10 = 68;
8239 a3.a11 = 69;
8240 a3.a12 = 70;
8241 a3.a13 = 71;
8242 a3.a14 = 72;
8243 a3.a15 = 73;
8244 a3.a16 = 74;
8245 a3.a17 = 75;
8246 a3.a18 = 76;
8247 a4.a0 = 77;
8248 a4.a1 = 78;
8249 a4.a2 = 79;
8250 a4.a3 = 80;
8251 a4.a4 = 81;
8252 a4.a5 = 82;
8253 a4.a6 = 83;
8254 a4.a7 = 84;
8255 a4.a8 = 85;
8256 a4.a9 = 86;
8257 a4.a10 = 87;
8258 a4.a11 = 88;
8259 a4.a12 = 89;
8260 a4.a13 = 90;
8261 a4.a14 = 91;
8262 a4.a15 = 92;
8263 a4.a16 = 93;
8264 a4.a17 = 94;
8265 a4.a18 = 95;
8266 a5.a0 = 96;
8267 a5.a1 = 97;
8268 a5.a2 = 98;
8269 a5.a3 = 99;
8270 a5.a4 = 100;
8271 a5.a5 = 101;
8272 a5.a6 = 102;
8273 a5.a7 = 103;
8274 a5.a8 = 104;
8275 a5.a9 = 105;
8276 a5.a10 = 106;
8277 a5.a11 = 107;
8278 a5.a12 = 108;
8279 a5.a13 = 109;
8280 a5.a14 = 110;
8281 a5.a15 = 111;
8282 a5.a16 = 112;
8283 a5.a17 = 113;
8284 a5.a18 = 114;
8285 a6.a0 = 115;
8286 a6.a1 = 116;
8287 a6.a2 = 117;
8288 a6.a3 = 118;
8289 a6.a4 = 119;
8290 a6.a5 = 120;
8291 a6.a6 = 121;
8292 a6.a7 = 122;
8293 a6.a8 = 123;
8294 a6.a9 = 124;
8295 a6.a10 = 125;
8296 a6.a11 = 126;
8297 a6.a12 = 127;
8298 a6.a13 = 128;
8299 a6.a14 = 129;
8300 a6.a15 = 130;
8301 a6.a16 = 131;
8302 a6.a17 = 132;
8303 a6.a18 = 133;
8304 a7.a0 = 134;
8305 a7.a1 = 135;
8306 a7.a2 = 136;
8307 a7.a3 = 137;
8308 a7.a4 = 138;
8309 a7.a5 = 139;
8310 a7.a6 = 140;
8311 a7.a7 = 141;
8312 a7.a8 = 142;
8313 a7.a9 = 143;
8314 a7.a10 = 144;
8315 a7.a11 = 145;
8316 a7.a12 = 146;
8317 a7.a13 = 147;
8318 a7.a14 = 148;
8319 a7.a15 = 149;
8320 a7.a16 = 150;
8321 a7.a17 = 151;
8322 a7.a18 = 152;
8323 a8.a0 = 153;
8324 a8.a1 = 154;
8325 a8.a2 = 155;
8326 a8.a3 = 156;
8327 a8.a4 = 157;
8328 a8.a5 = 158;
8329 a8.a6 = 159;
8330 a8.a7 = 160;
8331 a8.a8 = 161;
8332 a8.a9 = 162;
8333 a8.a10 = 163;
8334 a8.a11 = 164;
8335 a8.a12 = 165;
8336 a8.a13 = 166;
8337 a8.a14 = 167;
8338 a8.a15 = 168;
8339 a8.a16 = 169;
8340 a8.a17 = 170;
8341 a8.a18 = 171;
8342 a9.a0 = 172;
8343 a9.a1 = 173;
8344 a9.a2 = 174;
8345 a9.a3 = 175;
8346 a9.a4 = 176;
8347 a9.a5 = 177;
8348 a9.a6 = 178;
8349 a9.a7 = 179;
8350 a9.a8 = 180;
8351 a9.a9 = 181;
8352 a9.a10 = 182;
8353 a9.a11 = 183;
8354 a9.a12 = 184;
8355 a9.a13 = 185;
8356 a9.a14 = 186;
8357 a9.a15 = 187;
8358 a9.a16 = 188;
8359 a9.a17 = 189;
8360 a9.a18 = 190;
8361
8362 std::cout
8363 << "Calling TestPassStruct19BytesHomogeneousUint8x10("
8364 << "((" << static_cast<int>(a0.a0) << ", " << static_cast<int>(a0.a1)
8365 << ", " << static_cast<int>(a0.a2) << ", " << static_cast<int>(a0.a3)
8366 << ", " << static_cast<int>(a0.a4) << ", " << static_cast<int>(a0.a5)
8367 << ", " << static_cast<int>(a0.a6) << ", " << static_cast<int>(a0.a7)
8368 << ", " << static_cast<int>(a0.a8) << ", " << static_cast<int>(a0.a9)
8369 << ", " << static_cast<int>(a0.a10) << ", " << static_cast<int>(a0.a11)
8370 << ", " << static_cast<int>(a0.a12) << ", " << static_cast<int>(a0.a13)
8371 << ", " << static_cast<int>(a0.a14) << ", " << static_cast<int>(a0.a15)
8372 << ", " << static_cast<int>(a0.a16) << ", " << static_cast<int>(a0.a17)
8373 << ", " << static_cast<int>(a0.a18) << "), (" << static_cast<int>(a1.a0)
8374 << ", " << static_cast<int>(a1.a1) << ", " << static_cast<int>(a1.a2)
8375 << ", " << static_cast<int>(a1.a3) << ", " << static_cast<int>(a1.a4)
8376 << ", " << static_cast<int>(a1.a5) << ", " << static_cast<int>(a1.a6)
8377 << ", " << static_cast<int>(a1.a7) << ", " << static_cast<int>(a1.a8)
8378 << ", " << static_cast<int>(a1.a9) << ", " << static_cast<int>(a1.a10)
8379 << ", " << static_cast<int>(a1.a11) << ", " << static_cast<int>(a1.a12)
8380 << ", " << static_cast<int>(a1.a13) << ", " << static_cast<int>(a1.a14)
8381 << ", " << static_cast<int>(a1.a15) << ", " << static_cast<int>(a1.a16)
8382 << ", " << static_cast<int>(a1.a17) << ", " << static_cast<int>(a1.a18)
8383 << "), (" << static_cast<int>(a2.a0) << ", " << static_cast<int>(a2.a1)
8384 << ", " << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3)
8385 << ", " << static_cast<int>(a2.a4) << ", " << static_cast<int>(a2.a5)
8386 << ", " << static_cast<int>(a2.a6) << ", " << static_cast<int>(a2.a7)
8387 << ", " << static_cast<int>(a2.a8) << ", " << static_cast<int>(a2.a9)
8388 << ", " << static_cast<int>(a2.a10) << ", " << static_cast<int>(a2.a11)
8389 << ", " << static_cast<int>(a2.a12) << ", " << static_cast<int>(a2.a13)
8390 << ", " << static_cast<int>(a2.a14) << ", " << static_cast<int>(a2.a15)
8391 << ", " << static_cast<int>(a2.a16) << ", " << static_cast<int>(a2.a17)
8392 << ", " << static_cast<int>(a2.a18) << "), (" << static_cast<int>(a3.a0)
8393 << ", " << static_cast<int>(a3.a1) << ", " << static_cast<int>(a3.a2)
8394 << ", " << static_cast<int>(a3.a3) << ", " << static_cast<int>(a3.a4)
8395 << ", " << static_cast<int>(a3.a5) << ", " << static_cast<int>(a3.a6)
8396 << ", " << static_cast<int>(a3.a7) << ", " << static_cast<int>(a3.a8)
8397 << ", " << static_cast<int>(a3.a9) << ", " << static_cast<int>(a3.a10)
8398 << ", " << static_cast<int>(a3.a11) << ", " << static_cast<int>(a3.a12)
8399 << ", " << static_cast<int>(a3.a13) << ", " << static_cast<int>(a3.a14)
8400 << ", " << static_cast<int>(a3.a15) << ", " << static_cast<int>(a3.a16)
8401 << ", " << static_cast<int>(a3.a17) << ", " << static_cast<int>(a3.a18)
8402 << "), (" << static_cast<int>(a4.a0) << ", " << static_cast<int>(a4.a1)
8403 << ", " << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3)
8404 << ", " << static_cast<int>(a4.a4) << ", " << static_cast<int>(a4.a5)
8405 << ", " << static_cast<int>(a4.a6) << ", " << static_cast<int>(a4.a7)
8406 << ", " << static_cast<int>(a4.a8) << ", " << static_cast<int>(a4.a9)
8407 << ", " << static_cast<int>(a4.a10) << ", " << static_cast<int>(a4.a11)
8408 << ", " << static_cast<int>(a4.a12) << ", " << static_cast<int>(a4.a13)
8409 << ", " << static_cast<int>(a4.a14) << ", " << static_cast<int>(a4.a15)
8410 << ", " << static_cast<int>(a4.a16) << ", " << static_cast<int>(a4.a17)
8411 << ", " << static_cast<int>(a4.a18) << "), (" << static_cast<int>(a5.a0)
8412 << ", " << static_cast<int>(a5.a1) << ", " << static_cast<int>(a5.a2)
8413 << ", " << static_cast<int>(a5.a3) << ", " << static_cast<int>(a5.a4)
8414 << ", " << static_cast<int>(a5.a5) << ", " << static_cast<int>(a5.a6)
8415 << ", " << static_cast<int>(a5.a7) << ", " << static_cast<int>(a5.a8)
8416 << ", " << static_cast<int>(a5.a9) << ", " << static_cast<int>(a5.a10)
8417 << ", " << static_cast<int>(a5.a11) << ", " << static_cast<int>(a5.a12)
8418 << ", " << static_cast<int>(a5.a13) << ", " << static_cast<int>(a5.a14)
8419 << ", " << static_cast<int>(a5.a15) << ", " << static_cast<int>(a5.a16)
8420 << ", " << static_cast<int>(a5.a17) << ", " << static_cast<int>(a5.a18)
8421 << "), (" << static_cast<int>(a6.a0) << ", " << static_cast<int>(a6.a1)
8422 << ", " << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3)
8423 << ", " << static_cast<int>(a6.a4) << ", " << static_cast<int>(a6.a5)
8424 << ", " << static_cast<int>(a6.a6) << ", " << static_cast<int>(a6.a7)
8425 << ", " << static_cast<int>(a6.a8) << ", " << static_cast<int>(a6.a9)
8426 << ", " << static_cast<int>(a6.a10) << ", " << static_cast<int>(a6.a11)
8427 << ", " << static_cast<int>(a6.a12) << ", " << static_cast<int>(a6.a13)
8428 << ", " << static_cast<int>(a6.a14) << ", " << static_cast<int>(a6.a15)
8429 << ", " << static_cast<int>(a6.a16) << ", " << static_cast<int>(a6.a17)
8430 << ", " << static_cast<int>(a6.a18) << "), (" << static_cast<int>(a7.a0)
8431 << ", " << static_cast<int>(a7.a1) << ", " << static_cast<int>(a7.a2)
8432 << ", " << static_cast<int>(a7.a3) << ", " << static_cast<int>(a7.a4)
8433 << ", " << static_cast<int>(a7.a5) << ", " << static_cast<int>(a7.a6)
8434 << ", " << static_cast<int>(a7.a7) << ", " << static_cast<int>(a7.a8)
8435 << ", " << static_cast<int>(a7.a9) << ", " << static_cast<int>(a7.a10)
8436 << ", " << static_cast<int>(a7.a11) << ", " << static_cast<int>(a7.a12)
8437 << ", " << static_cast<int>(a7.a13) << ", " << static_cast<int>(a7.a14)
8438 << ", " << static_cast<int>(a7.a15) << ", " << static_cast<int>(a7.a16)
8439 << ", " << static_cast<int>(a7.a17) << ", " << static_cast<int>(a7.a18)
8440 << "), (" << static_cast<int>(a8.a0) << ", " << static_cast<int>(a8.a1)
8441 << ", " << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3)
8442 << ", " << static_cast<int>(a8.a4) << ", " << static_cast<int>(a8.a5)
8443 << ", " << static_cast<int>(a8.a6) << ", " << static_cast<int>(a8.a7)
8444 << ", " << static_cast<int>(a8.a8) << ", " << static_cast<int>(a8.a9)
8445 << ", " << static_cast<int>(a8.a10) << ", " << static_cast<int>(a8.a11)
8446 << ", " << static_cast<int>(a8.a12) << ", " << static_cast<int>(a8.a13)
8447 << ", " << static_cast<int>(a8.a14) << ", " << static_cast<int>(a8.a15)
8448 << ", " << static_cast<int>(a8.a16) << ", " << static_cast<int>(a8.a17)
8449 << ", " << static_cast<int>(a8.a18) << "), (" << static_cast<int>(a9.a0)
8450 << ", " << static_cast<int>(a9.a1) << ", " << static_cast<int>(a9.a2)
8451 << ", " << static_cast<int>(a9.a3) << ", " << static_cast<int>(a9.a4)
8452 << ", " << static_cast<int>(a9.a5) << ", " << static_cast<int>(a9.a6)
8453 << ", " << static_cast<int>(a9.a7) << ", " << static_cast<int>(a9.a8)
8454 << ", " << static_cast<int>(a9.a9) << ", " << static_cast<int>(a9.a10)
8455 << ", " << static_cast<int>(a9.a11) << ", " << static_cast<int>(a9.a12)
8456 << ", " << static_cast<int>(a9.a13) << ", " << static_cast<int>(a9.a14)
8457 << ", " << static_cast<int>(a9.a15) << ", " << static_cast<int>(a9.a16)
8458 << ", " << static_cast<int>(a9.a17) << ", " << static_cast<int>(a9.a18)
8459 << "))"
8460 << ")\n";
8461
8462 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
8463
8464 std::cout << "result = " << result << "\n";
8465
8466 CHECK_EQ(18145, result);
8467
8468 // Pass argument that will make the Dart callback throw.
8469 a0.a0 = 42;
8470
8471 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
8472
8473 CHECK_EQ(0, result);
8474
8475 // Pass argument that will make the Dart callback return null.
8476 a0.a0 = 84;
8477
8478 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
8479
8480 CHECK_EQ(0, result);
8481
8482 return 0;
8483}
8484
8485// Used for testing structs and unions by value.
8486// Argument too big to go into integer registers on arm64.
8487// The arguments are passed as pointers to copies.
8488// The amount of arguments exhausts the number of integer registers, such that
8489// pointers to copies are also passed on the stack.
8491 // NOLINTNEXTLINE(whitespace/parens)
8492 int32_t (*f)(Struct20BytesHomogeneousInt32 a0,
8512
8513 a0.a0 = -1;
8514 a0.a1 = 2;
8515 a0.a2 = -3;
8516 a0.a3 = 4;
8517 a0.a4 = -5;
8518 a1.a0 = 6;
8519 a1.a1 = -7;
8520 a1.a2 = 8;
8521 a1.a3 = -9;
8522 a1.a4 = 10;
8523 a2.a0 = -11;
8524 a2.a1 = 12;
8525 a2.a2 = -13;
8526 a2.a3 = 14;
8527 a2.a4 = -15;
8528 a3.a0 = 16;
8529 a3.a1 = -17;
8530 a3.a2 = 18;
8531 a3.a3 = -19;
8532 a3.a4 = 20;
8533 a4.a0 = -21;
8534 a4.a1 = 22;
8535 a4.a2 = -23;
8536 a4.a3 = 24;
8537 a4.a4 = -25;
8538 a5.a0 = 26;
8539 a5.a1 = -27;
8540 a5.a2 = 28;
8541 a5.a3 = -29;
8542 a5.a4 = 30;
8543 a6.a0 = -31;
8544 a6.a1 = 32;
8545 a6.a2 = -33;
8546 a6.a3 = 34;
8547 a6.a4 = -35;
8548 a7.a0 = 36;
8549 a7.a1 = -37;
8550 a7.a2 = 38;
8551 a7.a3 = -39;
8552 a7.a4 = 40;
8553 a8.a0 = -41;
8554 a8.a1 = 42;
8555 a8.a2 = -43;
8556 a8.a3 = 44;
8557 a8.a4 = -45;
8558 a9.a0 = 46;
8559 a9.a1 = -47;
8560 a9.a2 = 48;
8561 a9.a3 = -49;
8562 a9.a4 = 50;
8563
8564 std::cout << "Calling TestPassStruct20BytesHomogeneousInt32x10("
8565 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
8566 << ", " << a0.a4 << "), (" << a1.a0 << ", " << a1.a1 << ", "
8567 << a1.a2 << ", " << a1.a3 << ", " << a1.a4 << "), (" << a2.a0
8568 << ", " << a2.a1 << ", " << a2.a2 << ", " << a2.a3 << ", " << a2.a4
8569 << "), (" << a3.a0 << ", " << a3.a1 << ", " << a3.a2 << ", "
8570 << a3.a3 << ", " << a3.a4 << "), (" << a4.a0 << ", " << a4.a1
8571 << ", " << a4.a2 << ", " << a4.a3 << ", " << a4.a4 << "), ("
8572 << a5.a0 << ", " << a5.a1 << ", " << a5.a2 << ", " << a5.a3 << ", "
8573 << a5.a4 << "), (" << a6.a0 << ", " << a6.a1 << ", " << a6.a2
8574 << ", " << a6.a3 << ", " << a6.a4 << "), (" << a7.a0 << ", "
8575 << a7.a1 << ", " << a7.a2 << ", " << a7.a3 << ", " << a7.a4
8576 << "), (" << a8.a0 << ", " << a8.a1 << ", " << a8.a2 << ", "
8577 << a8.a3 << ", " << a8.a4 << "), (" << a9.a0 << ", " << a9.a1
8578 << ", " << a9.a2 << ", " << a9.a3 << ", " << a9.a4 << "))"
8579 << ")\n";
8580
8581 int32_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
8582
8583 std::cout << "result = " << result << "\n";
8584
8585 CHECK_EQ(25, result);
8586
8587 // Pass argument that will make the Dart callback throw.
8588 a0.a0 = 42;
8589
8590 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
8591
8592 CHECK_EQ(0, result);
8593
8594 // Pass argument that will make the Dart callback return null.
8595 a0.a0 = 84;
8596
8597 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
8598
8599 CHECK_EQ(0, result);
8600
8601 return 0;
8602}
8603
8604// Used for testing structs and unions by value.
8605// Argument too big to go into FPU registers in hardfp and arm64.
8607 // NOLINTNEXTLINE(whitespace/parens)
8608 float (*f)(Struct20BytesHomogeneousFloat a0)) {
8610
8611 a0.a0 = -1.0;
8612 a0.a1 = 2.0;
8613 a0.a2 = -3.0;
8614 a0.a3 = 4.0;
8615 a0.a4 = -5.0;
8616
8617 std::cout << "Calling TestPassStruct20BytesHomogeneousFloat("
8618 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
8619 << ", " << a0.a4 << "))"
8620 << ")\n";
8621
8622 float result = f(a0);
8623
8624 std::cout << "result = " << result << "\n";
8625
8626 CHECK_APPROX(-3.0, result);
8627
8628 // Pass argument that will make the Dart callback throw.
8629 a0.a0 = 42;
8630
8631 result = f(a0);
8632
8633 CHECK_APPROX(0.0, result);
8634
8635 // Pass argument that will make the Dart callback return null.
8636 a0.a0 = 84;
8637
8638 result = f(a0);
8639
8640 CHECK_APPROX(0.0, result);
8641
8642 return 0;
8643}
8644
8645// Used for testing structs and unions by value.
8646// Arguments in FPU registers on arm64.
8647// 5 struct arguments will exhaust available registers.
8649 // NOLINTNEXTLINE(whitespace/parens)
8650 double (*f)(Struct32BytesHomogeneousDouble a0,
8660
8661 a0.a0 = -1.0;
8662 a0.a1 = 2.0;
8663 a0.a2 = -3.0;
8664 a0.a3 = 4.0;
8665 a1.a0 = -5.0;
8666 a1.a1 = 6.0;
8667 a1.a2 = -7.0;
8668 a1.a3 = 8.0;
8669 a2.a0 = -9.0;
8670 a2.a1 = 10.0;
8671 a2.a2 = -11.0;
8672 a2.a3 = 12.0;
8673 a3.a0 = -13.0;
8674 a3.a1 = 14.0;
8675 a3.a2 = -15.0;
8676 a3.a3 = 16.0;
8677 a4.a0 = -17.0;
8678 a4.a1 = 18.0;
8679 a4.a2 = -19.0;
8680 a4.a3 = 20.0;
8681
8682 std::cout << "Calling TestPassStruct32BytesHomogeneousDoublex5("
8683 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
8684 << "), (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", "
8685 << a1.a3 << "), (" << a2.a0 << ", " << a2.a1 << ", " << a2.a2
8686 << ", " << a2.a3 << "), (" << a3.a0 << ", " << a3.a1 << ", "
8687 << a3.a2 << ", " << a3.a3 << "), (" << a4.a0 << ", " << a4.a1
8688 << ", " << a4.a2 << ", " << a4.a3 << "))"
8689 << ")\n";
8690
8691 double result = f(a0, a1, a2, a3, a4);
8692
8693 std::cout << "result = " << result << "\n";
8694
8695 CHECK_APPROX(10.0, result);
8696
8697 // Pass argument that will make the Dart callback throw.
8698 a0.a0 = 42;
8699
8700 result = f(a0, a1, a2, a3, a4);
8701
8702 CHECK_APPROX(0.0, result);
8703
8704 // Pass argument that will make the Dart callback return null.
8705 a0.a0 = 84;
8706
8707 result = f(a0, a1, a2, a3, a4);
8708
8709 CHECK_APPROX(0.0, result);
8710
8711 return 0;
8712}
8713
8714// Used for testing structs and unions by value.
8715// Argument too big to go into FPU registers in arm64.
8717 // NOLINTNEXTLINE(whitespace/parens)
8718 double (*f)(Struct40BytesHomogeneousDouble a0)) {
8720
8721 a0.a0 = -1.0;
8722 a0.a1 = 2.0;
8723 a0.a2 = -3.0;
8724 a0.a3 = 4.0;
8725 a0.a4 = -5.0;
8726
8727 std::cout << "Calling TestPassStruct40BytesHomogeneousDouble("
8728 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
8729 << ", " << a0.a4 << "))"
8730 << ")\n";
8731
8732 double result = f(a0);
8733
8734 std::cout << "result = " << result << "\n";
8735
8736 CHECK_APPROX(-3.0, result);
8737
8738 // Pass argument that will make the Dart callback throw.
8739 a0.a0 = 42;
8740
8741 result = f(a0);
8742
8743 CHECK_APPROX(0.0, result);
8744
8745 // Pass argument that will make the Dart callback return null.
8746 a0.a0 = 84;
8747
8748 result = f(a0);
8749
8750 CHECK_APPROX(0.0, result);
8751
8752 return 0;
8753}
8754
8755// Used for testing structs and unions by value.
8756// Test 1kb struct.
8758 // NOLINTNEXTLINE(whitespace/parens)
8759 uint64_t (*f)(Struct1024BytesHomogeneousUint64 a0)) {
8761
8762 a0.a0 = 1;
8763 a0.a1 = 2;
8764 a0.a2 = 3;
8765 a0.a3 = 4;
8766 a0.a4 = 5;
8767 a0.a5 = 6;
8768 a0.a6 = 7;
8769 a0.a7 = 8;
8770 a0.a8 = 9;
8771 a0.a9 = 10;
8772 a0.a10 = 11;
8773 a0.a11 = 12;
8774 a0.a12 = 13;
8775 a0.a13 = 14;
8776 a0.a14 = 15;
8777 a0.a15 = 16;
8778 a0.a16 = 17;
8779 a0.a17 = 18;
8780 a0.a18 = 19;
8781 a0.a19 = 20;
8782 a0.a20 = 21;
8783 a0.a21 = 22;
8784 a0.a22 = 23;
8785 a0.a23 = 24;
8786 a0.a24 = 25;
8787 a0.a25 = 26;
8788 a0.a26 = 27;
8789 a0.a27 = 28;
8790 a0.a28 = 29;
8791 a0.a29 = 30;
8792 a0.a30 = 31;
8793 a0.a31 = 32;
8794 a0.a32 = 33;
8795 a0.a33 = 34;
8796 a0.a34 = 35;
8797 a0.a35 = 36;
8798 a0.a36 = 37;
8799 a0.a37 = 38;
8800 a0.a38 = 39;
8801 a0.a39 = 40;
8802 a0.a40 = 41;
8803 a0.a41 = 42;
8804 a0.a42 = 43;
8805 a0.a43 = 44;
8806 a0.a44 = 45;
8807 a0.a45 = 46;
8808 a0.a46 = 47;
8809 a0.a47 = 48;
8810 a0.a48 = 49;
8811 a0.a49 = 50;
8812 a0.a50 = 51;
8813 a0.a51 = 52;
8814 a0.a52 = 53;
8815 a0.a53 = 54;
8816 a0.a54 = 55;
8817 a0.a55 = 56;
8818 a0.a56 = 57;
8819 a0.a57 = 58;
8820 a0.a58 = 59;
8821 a0.a59 = 60;
8822 a0.a60 = 61;
8823 a0.a61 = 62;
8824 a0.a62 = 63;
8825 a0.a63 = 64;
8826 a0.a64 = 65;
8827 a0.a65 = 66;
8828 a0.a66 = 67;
8829 a0.a67 = 68;
8830 a0.a68 = 69;
8831 a0.a69 = 70;
8832 a0.a70 = 71;
8833 a0.a71 = 72;
8834 a0.a72 = 73;
8835 a0.a73 = 74;
8836 a0.a74 = 75;
8837 a0.a75 = 76;
8838 a0.a76 = 77;
8839 a0.a77 = 78;
8840 a0.a78 = 79;
8841 a0.a79 = 80;
8842 a0.a80 = 81;
8843 a0.a81 = 82;
8844 a0.a82 = 83;
8845 a0.a83 = 84;
8846 a0.a84 = 85;
8847 a0.a85 = 86;
8848 a0.a86 = 87;
8849 a0.a87 = 88;
8850 a0.a88 = 89;
8851 a0.a89 = 90;
8852 a0.a90 = 91;
8853 a0.a91 = 92;
8854 a0.a92 = 93;
8855 a0.a93 = 94;
8856 a0.a94 = 95;
8857 a0.a95 = 96;
8858 a0.a96 = 97;
8859 a0.a97 = 98;
8860 a0.a98 = 99;
8861 a0.a99 = 100;
8862 a0.a100 = 101;
8863 a0.a101 = 102;
8864 a0.a102 = 103;
8865 a0.a103 = 104;
8866 a0.a104 = 105;
8867 a0.a105 = 106;
8868 a0.a106 = 107;
8869 a0.a107 = 108;
8870 a0.a108 = 109;
8871 a0.a109 = 110;
8872 a0.a110 = 111;
8873 a0.a111 = 112;
8874 a0.a112 = 113;
8875 a0.a113 = 114;
8876 a0.a114 = 115;
8877 a0.a115 = 116;
8878 a0.a116 = 117;
8879 a0.a117 = 118;
8880 a0.a118 = 119;
8881 a0.a119 = 120;
8882 a0.a120 = 121;
8883 a0.a121 = 122;
8884 a0.a122 = 123;
8885 a0.a123 = 124;
8886 a0.a124 = 125;
8887 a0.a125 = 126;
8888 a0.a126 = 127;
8889 a0.a127 = 128;
8890
8891 std::cout << "Calling TestPassStruct1024BytesHomogeneousUint64("
8892 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
8893 << ", " << a0.a4 << ", " << a0.a5 << ", " << a0.a6 << ", " << a0.a7
8894 << ", " << a0.a8 << ", " << a0.a9 << ", " << a0.a10 << ", "
8895 << a0.a11 << ", " << a0.a12 << ", " << a0.a13 << ", " << a0.a14
8896 << ", " << a0.a15 << ", " << a0.a16 << ", " << a0.a17 << ", "
8897 << a0.a18 << ", " << a0.a19 << ", " << a0.a20 << ", " << a0.a21
8898 << ", " << a0.a22 << ", " << a0.a23 << ", " << a0.a24 << ", "
8899 << a0.a25 << ", " << a0.a26 << ", " << a0.a27 << ", " << a0.a28
8900 << ", " << a0.a29 << ", " << a0.a30 << ", " << a0.a31 << ", "
8901 << a0.a32 << ", " << a0.a33 << ", " << a0.a34 << ", " << a0.a35
8902 << ", " << a0.a36 << ", " << a0.a37 << ", " << a0.a38 << ", "
8903 << a0.a39 << ", " << a0.a40 << ", " << a0.a41 << ", " << a0.a42
8904 << ", " << a0.a43 << ", " << a0.a44 << ", " << a0.a45 << ", "
8905 << a0.a46 << ", " << a0.a47 << ", " << a0.a48 << ", " << a0.a49
8906 << ", " << a0.a50 << ", " << a0.a51 << ", " << a0.a52 << ", "
8907 << a0.a53 << ", " << a0.a54 << ", " << a0.a55 << ", " << a0.a56
8908 << ", " << a0.a57 << ", " << a0.a58 << ", " << a0.a59 << ", "
8909 << a0.a60 << ", " << a0.a61 << ", " << a0.a62 << ", " << a0.a63
8910 << ", " << a0.a64 << ", " << a0.a65 << ", " << a0.a66 << ", "
8911 << a0.a67 << ", " << a0.a68 << ", " << a0.a69 << ", " << a0.a70
8912 << ", " << a0.a71 << ", " << a0.a72 << ", " << a0.a73 << ", "
8913 << a0.a74 << ", " << a0.a75 << ", " << a0.a76 << ", " << a0.a77
8914 << ", " << a0.a78 << ", " << a0.a79 << ", " << a0.a80 << ", "
8915 << a0.a81 << ", " << a0.a82 << ", " << a0.a83 << ", " << a0.a84
8916 << ", " << a0.a85 << ", " << a0.a86 << ", " << a0.a87 << ", "
8917 << a0.a88 << ", " << a0.a89 << ", " << a0.a90 << ", " << a0.a91
8918 << ", " << a0.a92 << ", " << a0.a93 << ", " << a0.a94 << ", "
8919 << a0.a95 << ", " << a0.a96 << ", " << a0.a97 << ", " << a0.a98
8920 << ", " << a0.a99 << ", " << a0.a100 << ", " << a0.a101 << ", "
8921 << a0.a102 << ", " << a0.a103 << ", " << a0.a104 << ", " << a0.a105
8922 << ", " << a0.a106 << ", " << a0.a107 << ", " << a0.a108 << ", "
8923 << a0.a109 << ", " << a0.a110 << ", " << a0.a111 << ", " << a0.a112
8924 << ", " << a0.a113 << ", " << a0.a114 << ", " << a0.a115 << ", "
8925 << a0.a116 << ", " << a0.a117 << ", " << a0.a118 << ", " << a0.a119
8926 << ", " << a0.a120 << ", " << a0.a121 << ", " << a0.a122 << ", "
8927 << a0.a123 << ", " << a0.a124 << ", " << a0.a125 << ", " << a0.a126
8928 << ", " << a0.a127 << "))"
8929 << ")\n";
8930
8931 uint64_t result = f(a0);
8932
8933 std::cout << "result = " << result << "\n";
8934
8935 CHECK_EQ(8256, result);
8936
8937 // Pass argument that will make the Dart callback throw.
8938 a0.a0 = 42;
8939
8940 result = f(a0);
8941
8942 CHECK_EQ(0, result);
8943
8944 // Pass argument that will make the Dart callback return null.
8945 a0.a0 = 84;
8946
8947 result = f(a0);
8948
8949 CHECK_EQ(0, result);
8950
8951 return 0;
8952}
8953
8954// Used for testing structs and unions by value.
8955// Tests the alignment of structs in FPU registers and backfilling.
8957 // NOLINTNEXTLINE(whitespace/parens)
8958 float (*f)(float a0,
8960 float a2,
8962 float a4,
8964 float a6,
8966 float a8)) {
8967 float a0;
8969 float a2;
8971 float a4;
8973 float a6;
8975 float a8;
8976
8977 a0 = -1.0;
8978 a1.a0 = 2.0;
8979 a1.a1 = -3.0;
8980 a1.a2 = 4.0;
8981 a1.a3 = -5.0;
8982 a2 = 6.0;
8983 a3.a0 = -7.0;
8984 a3.a1 = 8.0;
8985 a3.a2 = -9.0;
8986 a3.a3 = 10.0;
8987 a4 = -11.0;
8988 a5.a0 = 12.0;
8989 a5.a1 = -13.0;
8990 a5.a2 = 14.0;
8991 a5.a3 = -15.0;
8992 a6 = 16.0;
8993 a7.a0 = -17.0;
8994 a7.a1 = 18.0;
8995 a7.a2 = -19.0;
8996 a7.a3 = 20.0;
8997 a8 = -21.0;
8998
8999 std::cout << "Calling TestPassFloatStruct16BytesHomogeneousFloatFloatStruct1("
9000 << "(" << a0 << ", (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2
9001 << ", " << a1.a3 << "), " << a2 << ", (" << a3.a0 << ", " << a3.a1
9002 << ", " << a3.a2 << ", " << a3.a3 << "), " << a4 << ", (" << a5.a0
9003 << ", " << a5.a1 << ", " << a5.a2 << ", " << a5.a3 << "), " << a6
9004 << ", (" << a7.a0 << ", " << a7.a1 << ", " << a7.a2 << ", " << a7.a3
9005 << "), " << a8 << ")"
9006 << ")\n";
9007
9008 float result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
9009
9010 std::cout << "result = " << result << "\n";
9011
9012 CHECK_APPROX(-11.0, result);
9013
9014 // Pass argument that will make the Dart callback throw.
9015 a0 = 42;
9016
9017 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
9018
9019 CHECK_APPROX(0.0, result);
9020
9021 // Pass argument that will make the Dart callback return null.
9022 a0 = 84;
9023
9024 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
9025
9026 CHECK_APPROX(0.0, result);
9027
9028 return 0;
9029}
9030
9031// Used for testing structs and unions by value.
9032// Tests the alignment of structs in FPU registers and backfilling.
9034 // NOLINTNEXTLINE(whitespace/parens)
9035 double (*f)(float a0,
9037 float a2,
9039 float a4,
9041 float a6,
9043 float a8)) {
9044 float a0;
9046 float a2;
9048 float a4;
9050 float a6;
9052 float a8;
9053
9054 a0 = -1.0;
9055 a1.a0 = 2.0;
9056 a1.a1 = -3.0;
9057 a1.a2 = 4.0;
9058 a1.a3 = -5.0;
9059 a2 = 6.0;
9060 a3.a0 = -7.0;
9061 a3.a1 = 8.0;
9062 a3.a2 = -9.0;
9063 a3.a3 = 10.0;
9064 a4 = -11.0;
9065 a5.a0 = 12.0;
9066 a5.a1 = -13.0;
9067 a5.a2 = 14.0;
9068 a5.a3 = -15.0;
9069 a6 = 16.0;
9070 a7.a0 = -17.0;
9071 a7.a1 = 18.0;
9072 a7.a2 = -19.0;
9073 a7.a3 = 20.0;
9074 a8 = -21.0;
9075
9076 std::cout << "Calling TestPassFloatStruct32BytesHomogeneousDoubleFloatStruct("
9077 << "(" << a0 << ", (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2
9078 << ", " << a1.a3 << "), " << a2 << ", (" << a3.a0 << ", " << a3.a1
9079 << ", " << a3.a2 << ", " << a3.a3 << "), " << a4 << ", (" << a5.a0
9080 << ", " << a5.a1 << ", " << a5.a2 << ", " << a5.a3 << "), " << a6
9081 << ", (" << a7.a0 << ", " << a7.a1 << ", " << a7.a2 << ", " << a7.a3
9082 << "), " << a8 << ")"
9083 << ")\n";
9084
9085 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
9086
9087 std::cout << "result = " << result << "\n";
9088
9089 CHECK_APPROX(-11.0, result);
9090
9091 // Pass argument that will make the Dart callback throw.
9092 a0 = 42;
9093
9094 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
9095
9096 CHECK_APPROX(0.0, result);
9097
9098 // Pass argument that will make the Dart callback return null.
9099 a0 = 84;
9100
9101 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
9102
9103 CHECK_APPROX(0.0, result);
9104
9105 return 0;
9106}
9107
9108// Used for testing structs and unions by value.
9109// Tests the alignment of structs in integers registers and on the stack.
9110// Arm32 aligns this struct at 8.
9111// Also, arm32 allocates the second struct partially in registers, partially
9112// on stack.
9113// Test backfilling of integer registers.
9115 // NOLINTNEXTLINE(whitespace/parens)
9116 double (*f)(int8_t a0,
9118 int8_t a2,
9120 int8_t a4,
9122 int8_t a6,
9124 int8_t a8)) {
9125 int8_t a0;
9126 Struct16BytesMixed a1 = {};
9127 int8_t a2;
9128 Struct16BytesMixed a3 = {};
9129 int8_t a4;
9130 Struct16BytesMixed a5 = {};
9131 int8_t a6;
9132 Struct16BytesMixed a7 = {};
9133 int8_t a8;
9134
9135 a0 = -1;
9136 a1.a0 = 2.0;
9137 a1.a1 = -3;
9138 a2 = 4;
9139 a3.a0 = -5.0;
9140 a3.a1 = 6;
9141 a4 = -7;
9142 a5.a0 = 8.0;
9143 a5.a1 = -9;
9144 a6 = 10;
9145 a7.a0 = -11.0;
9146 a7.a1 = 12;
9147 a8 = -13;
9148
9149 std::cout << "Calling TestPassInt8Struct16BytesMixedInt8Struct16BytesMixedIn("
9150 << "(" << static_cast<int>(a0) << ", (" << a1.a0 << ", " << a1.a1
9151 << "), " << static_cast<int>(a2) << ", (" << a3.a0 << ", " << a3.a1
9152 << "), " << static_cast<int>(a4) << ", (" << a5.a0 << ", " << a5.a1
9153 << "), " << static_cast<int>(a6) << ", (" << a7.a0 << ", " << a7.a1
9154 << "), " << static_cast<int>(a8) << ")"
9155 << ")\n";
9156
9157 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
9158
9159 std::cout << "result = " << result << "\n";
9160
9161 CHECK_APPROX(-7.0, result);
9162
9163 // Pass argument that will make the Dart callback throw.
9164 a0 = 42;
9165
9166 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
9167
9168 CHECK_APPROX(0.0, result);
9169
9170 // Pass argument that will make the Dart callback return null.
9171 a0 = 84;
9172
9173 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
9174
9175 CHECK_APPROX(0.0, result);
9176
9177 return 0;
9178}
9179
9180// Used for testing structs and unions by value.
9181// On Linux x64, it will exhaust xmm registers first, after 6 doubles and 2
9182// structs. The rest of the structs will go on the stack.
9183// The int will be backfilled into the int register.
9185 // NOLINTNEXTLINE(whitespace/parens)
9186 double (*f)(double a0,
9187 double a1,
9188 double a2,
9189 double a3,
9190 double a4,
9191 double a5,
9196 int32_t a10)) {
9197 double a0;
9198 double a1;
9199 double a2;
9200 double a3;
9201 double a4;
9202 double a5;
9203 Struct16BytesMixed a6 = {};
9204 Struct16BytesMixed a7 = {};
9205 Struct16BytesMixed a8 = {};
9206 Struct16BytesMixed a9 = {};
9207 int32_t a10;
9208
9209 a0 = -1.0;
9210 a1 = 2.0;
9211 a2 = -3.0;
9212 a3 = 4.0;
9213 a4 = -5.0;
9214 a5 = 6.0;
9215 a6.a0 = -7.0;
9216 a6.a1 = 8;
9217 a7.a0 = -9.0;
9218 a7.a1 = 10;
9219 a8.a0 = -11.0;
9220 a8.a1 = 12;
9221 a9.a0 = -13.0;
9222 a9.a1 = 14;
9223 a10 = -15;
9224
9225 std::cout << "Calling TestPassDoublex6Struct16BytesMixedx4Int32("
9226 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
9227 << ", " << a5 << ", (" << a6.a0 << ", " << a6.a1 << "), (" << a7.a0
9228 << ", " << a7.a1 << "), (" << a8.a0 << ", " << a8.a1 << "), ("
9229 << a9.a0 << ", " << a9.a1 << "), " << a10 << ")"
9230 << ")\n";
9231
9232 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
9233
9234 std::cout << "result = " << result << "\n";
9235
9236 CHECK_APPROX(-8.0, result);
9237
9238 // Pass argument that will make the Dart callback throw.
9239 a0 = 42;
9240
9241 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
9242
9243 CHECK_APPROX(0.0, result);
9244
9245 // Pass argument that will make the Dart callback return null.
9246 a0 = 84;
9247
9248 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
9249
9250 CHECK_APPROX(0.0, result);
9251
9252 return 0;
9253}
9254
9255// Used for testing structs and unions by value.
9256// On Linux x64, it will exhaust int registers first.
9257// The rest of the structs will go on the stack.
9258// The double will be backfilled into the xmm register.
9260 // NOLINTNEXTLINE(whitespace/parens)
9261 double (*f)(int32_t a0,
9262 int32_t a1,
9263 int32_t a2,
9264 int32_t a3,
9269 double a8)) {
9270 int32_t a0;
9271 int32_t a1;
9272 int32_t a2;
9273 int32_t a3;
9274 Struct16BytesMixed a4 = {};
9275 Struct16BytesMixed a5 = {};
9276 Struct16BytesMixed a6 = {};
9277 Struct16BytesMixed a7 = {};
9278 double a8;
9279
9280 a0 = -1;
9281 a1 = 2;
9282 a2 = -3;
9283 a3 = 4;
9284 a4.a0 = -5.0;
9285 a4.a1 = 6;
9286 a5.a0 = -7.0;
9287 a5.a1 = 8;
9288 a6.a0 = -9.0;
9289 a6.a1 = 10;
9290 a7.a0 = -11.0;
9291 a7.a1 = 12;
9292 a8 = -13.0;
9293
9294 std::cout << "Calling TestPassInt32x4Struct16BytesMixedx4Double("
9295 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", ("
9296 << a4.a0 << ", " << a4.a1 << "), (" << a5.a0 << ", " << a5.a1
9297 << "), (" << a6.a0 << ", " << a6.a1 << "), (" << a7.a0 << ", "
9298 << a7.a1 << "), " << a8 << ")"
9299 << ")\n";
9300
9301 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
9302
9303 std::cout << "result = " << result << "\n";
9304
9305 CHECK_APPROX(-7.0, result);
9306
9307 // Pass argument that will make the Dart callback throw.
9308 a0 = 42;
9309
9310 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
9311
9312 CHECK_APPROX(0.0, result);
9313
9314 // Pass argument that will make the Dart callback return null.
9315 a0 = 84;
9316
9317 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
9318
9319 CHECK_APPROX(0.0, result);
9320
9321 return 0;
9322}
9323
9324// Used for testing structs and unions by value.
9325// On various architectures, first struct is allocated on stack.
9326// Check that the other two arguments are allocated on registers.
9328 // NOLINTNEXTLINE(whitespace/parens)
9329 double (*f)(Struct40BytesHomogeneousDouble a0,
9335
9336 a0.a0 = -1.0;
9337 a0.a1 = 2.0;
9338 a0.a2 = -3.0;
9339 a0.a3 = 4.0;
9340 a0.a4 = -5.0;
9341 a1.a0 = 6;
9342 a1.a1 = -7;
9343 a2.a0 = 8.0;
9344 a2.a1 = -9.0;
9345
9346 std::cout << "Calling TestPassStruct40BytesHomogeneousDoubleStruct4BytesHomo("
9347 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
9348 << ", " << a0.a4 << "), (" << a1.a0 << ", " << a1.a1 << "), ("
9349 << a2.a0 << ", " << a2.a1 << "))"
9350 << ")\n";
9351
9352 double result = f(a0, a1, a2);
9353
9354 std::cout << "result = " << result << "\n";
9355
9356 CHECK_APPROX(-5.0, result);
9357
9358 // Pass argument that will make the Dart callback throw.
9359 a0.a0 = 42;
9360
9361 result = f(a0, a1, a2);
9362
9363 CHECK_APPROX(0.0, result);
9364
9365 // Pass argument that will make the Dart callback return null.
9366 a0.a0 = 84;
9367
9368 result = f(a0, a1, a2);
9369
9370 CHECK_APPROX(0.0, result);
9371
9372 return 0;
9373}
9374
9375// Used for testing structs and unions by value.
9376// Test alignment and padding of 16 byte int within struct.
9378 // NOLINTNEXTLINE(whitespace/parens)
9379 double (*f)(int32_t a0,
9380 int32_t a1,
9381 int32_t a2,
9382 int32_t a3,
9383 int32_t a4,
9384 int32_t a5,
9385 int32_t a6,
9386 int32_t a7,
9387 double a8,
9388 double a9,
9389 double a10,
9390 double a11,
9391 double a12,
9392 double a13,
9393 double a14,
9394 double a15,
9395 int64_t a16,
9396 int8_t a17,
9397 Struct1ByteInt a18,
9398 int64_t a19,
9399 int8_t a20,
9401 int64_t a22,
9402 int8_t a23,
9403 Struct8BytesInt a24,
9404 int64_t a25,
9405 int8_t a26,
9407 int64_t a28,
9408 int8_t a29,
9410 int64_t a31,
9411 int8_t a32,
9413 int64_t a34,
9414 int8_t a35,
9416 int64_t a37,
9417 int8_t a38,
9418 StructAlignmentInt64 a39)) {
9419 int32_t a0;
9420 int32_t a1;
9421 int32_t a2;
9422 int32_t a3;
9423 int32_t a4;
9424 int32_t a5;
9425 int32_t a6;
9426 int32_t a7;
9427 double a8;
9428 double a9;
9429 double a10;
9430 double a11;
9431 double a12;
9432 double a13;
9433 double a14;
9434 double a15;
9435 int64_t a16;
9436 int8_t a17;
9437 Struct1ByteInt a18 = {};
9438 int64_t a19;
9439 int8_t a20;
9441 int64_t a22;
9442 int8_t a23;
9443 Struct8BytesInt a24 = {};
9444 int64_t a25;
9445 int8_t a26;
9447 int64_t a28;
9448 int8_t a29;
9449 Struct8BytesMixed a30 = {};
9450 int64_t a31;
9451 int8_t a32;
9452 StructAlignmentInt16 a33 = {};
9453 int64_t a34;
9454 int8_t a35;
9455 StructAlignmentInt32 a36 = {};
9456 int64_t a37;
9457 int8_t a38;
9458 StructAlignmentInt64 a39 = {};
9459
9460 a0 = -1;
9461 a1 = 2;
9462 a2 = -3;
9463 a3 = 4;
9464 a4 = -5;
9465 a5 = 6;
9466 a6 = -7;
9467 a7 = 8;
9468 a8 = -9.0;
9469 a9 = 10.0;
9470 a10 = -11.0;
9471 a11 = 12.0;
9472 a12 = -13.0;
9473 a13 = 14.0;
9474 a14 = -15.0;
9475 a15 = 16.0;
9476 a16 = -17;
9477 a17 = 18;
9478 a18.a0 = -19;
9479 a19 = 20;
9480 a20 = -21;
9481 a21.a0 = 22;
9482 a21.a1 = -23;
9483 a22 = 24;
9484 a23 = -25;
9485 a24.a0 = 26;
9486 a24.a1 = -27;
9487 a24.a2 = 28;
9488 a25 = -29;
9489 a26 = 30;
9490 a27.a0 = -31.0;
9491 a27.a1 = 32.0;
9492 a28 = -33;
9493 a29 = 34;
9494 a30.a0 = -35.0;
9495 a30.a1 = 36;
9496 a30.a2 = -37;
9497 a31 = 38;
9498 a32 = -39;
9499 a33.a0 = 40;
9500 a33.a1 = -41;
9501 a33.a2 = 42;
9502 a34 = -43;
9503 a35 = 44;
9504 a36.a0 = -45;
9505 a36.a1 = 46;
9506 a36.a2 = -47;
9507 a37 = 48;
9508 a38 = -49;
9509 a39.a0 = 50;
9510 a39.a1 = -51;
9511 a39.a2 = 52;
9512
9513 std::cout << "Calling TestPassInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int("
9514 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
9515 << ", " << a5 << ", " << a6 << ", " << a7 << ", " << a8 << ", "
9516 << a9 << ", " << a10 << ", " << a11 << ", " << a12 << ", " << a13
9517 << ", " << a14 << ", " << a15 << ", " << a16 << ", "
9518 << static_cast<int>(a17) << ", (" << static_cast<int>(a18.a0)
9519 << "), " << a19 << ", " << static_cast<int>(a20) << ", (" << a21.a0
9520 << ", " << a21.a1 << "), " << a22 << ", " << static_cast<int>(a23)
9521 << ", (" << a24.a0 << ", " << a24.a1 << ", " << a24.a2 << "), "
9522 << a25 << ", " << static_cast<int>(a26) << ", (" << a27.a0 << ", "
9523 << a27.a1 << "), " << a28 << ", " << static_cast<int>(a29) << ", ("
9524 << a30.a0 << ", " << a30.a1 << ", " << a30.a2 << "), " << a31
9525 << ", " << static_cast<int>(a32) << ", ("
9526 << static_cast<int>(a33.a0) << ", " << a33.a1 << ", "
9527 << static_cast<int>(a33.a2) << "), " << a34 << ", "
9528 << static_cast<int>(a35) << ", (" << static_cast<int>(a36.a0)
9529 << ", " << a36.a1 << ", " << static_cast<int>(a36.a2) << "), "
9530 << a37 << ", " << static_cast<int>(a38) << ", ("
9531 << static_cast<int>(a39.a0) << ", " << a39.a1 << ", "
9532 << static_cast<int>(a39.a2) << "))"
9533 << ")\n";
9534
9535 double result =
9536 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15,
9537 a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29,
9538 a30, a31, a32, a33, a34, a35, a36, a37, a38, a39);
9539
9540 std::cout << "result = " << result << "\n";
9541
9542 CHECK_APPROX(26.0, result);
9543
9544 // Pass argument that will make the Dart callback throw.
9545 a0 = 42;
9546
9547 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
9548 a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27,
9549 a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39);
9550
9551 CHECK_APPROX(0.0, result);
9552
9553 // Pass argument that will make the Dart callback return null.
9554 a0 = 84;
9555
9556 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
9557 a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27,
9558 a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39);
9559
9560 CHECK_APPROX(0.0, result);
9561
9562 return 0;
9563}
9564
9565// Used for testing structs and unions by value.
9566// Test alignment and padding of 16 byte int within struct.
9568 // NOLINTNEXTLINE(whitespace/parens)
9569 int64_t (*f)(StructAlignmentInt16 a0)) {
9570 StructAlignmentInt16 a0 = {};
9571
9572 a0.a0 = -1;
9573 a0.a1 = 2;
9574 a0.a2 = -3;
9575
9576 std::cout << "Calling TestPassStructAlignmentInt16("
9577 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
9578 << static_cast<int>(a0.a2) << "))"
9579 << ")\n";
9580
9581 int64_t result = f(a0);
9582
9583 std::cout << "result = " << result << "\n";
9584
9585 CHECK_EQ(-2, result);
9586
9587 // Pass argument that will make the Dart callback throw.
9588 a0.a0 = 42;
9589
9590 result = f(a0);
9591
9592 CHECK_EQ(0, result);
9593
9594 // Pass argument that will make the Dart callback return null.
9595 a0.a0 = 84;
9596
9597 result = f(a0);
9598
9599 CHECK_EQ(0, result);
9600
9601 return 0;
9602}
9603
9604// Used for testing structs and unions by value.
9605// Test alignment and padding of 32 byte int within struct.
9607 // NOLINTNEXTLINE(whitespace/parens)
9608 int64_t (*f)(StructAlignmentInt32 a0)) {
9609 StructAlignmentInt32 a0 = {};
9610
9611 a0.a0 = -1;
9612 a0.a1 = 2;
9613 a0.a2 = -3;
9614
9615 std::cout << "Calling TestPassStructAlignmentInt32("
9616 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
9617 << static_cast<int>(a0.a2) << "))"
9618 << ")\n";
9619
9620 int64_t result = f(a0);
9621
9622 std::cout << "result = " << result << "\n";
9623
9624 CHECK_EQ(-2, result);
9625
9626 // Pass argument that will make the Dart callback throw.
9627 a0.a0 = 42;
9628
9629 result = f(a0);
9630
9631 CHECK_EQ(0, result);
9632
9633 // Pass argument that will make the Dart callback return null.
9634 a0.a0 = 84;
9635
9636 result = f(a0);
9637
9638 CHECK_EQ(0, result);
9639
9640 return 0;
9641}
9642
9643// Used for testing structs and unions by value.
9644// Test alignment and padding of 64 byte int within struct.
9646 // NOLINTNEXTLINE(whitespace/parens)
9647 int64_t (*f)(StructAlignmentInt64 a0)) {
9648 StructAlignmentInt64 a0 = {};
9649
9650 a0.a0 = -1;
9651 a0.a1 = 2;
9652 a0.a2 = -3;
9653
9654 std::cout << "Calling TestPassStructAlignmentInt64("
9655 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
9656 << static_cast<int>(a0.a2) << "))"
9657 << ")\n";
9658
9659 int64_t result = f(a0);
9660
9661 std::cout << "result = " << result << "\n";
9662
9663 CHECK_EQ(-2, result);
9664
9665 // Pass argument that will make the Dart callback throw.
9666 a0.a0 = 42;
9667
9668 result = f(a0);
9669
9670 CHECK_EQ(0, result);
9671
9672 // Pass argument that will make the Dart callback return null.
9673 a0.a0 = 84;
9674
9675 result = f(a0);
9676
9677 CHECK_EQ(0, result);
9678
9679 return 0;
9680}
9681
9682// Used for testing structs and unions by value.
9683// Simple nested struct. No alignment gaps on any architectures.
9684// 10 arguments exhaust registers on all platforms.
9686 // NOLINTNEXTLINE(whitespace/parens)
9687 int64_t (*f)(Struct8BytesNestedInt a0,
9697 Struct8BytesNestedInt a0 = {};
9698 Struct8BytesNestedInt a1 = {};
9699 Struct8BytesNestedInt a2 = {};
9700 Struct8BytesNestedInt a3 = {};
9701 Struct8BytesNestedInt a4 = {};
9702 Struct8BytesNestedInt a5 = {};
9703 Struct8BytesNestedInt a6 = {};
9704 Struct8BytesNestedInt a7 = {};
9705 Struct8BytesNestedInt a8 = {};
9706 Struct8BytesNestedInt a9 = {};
9707
9708 a0.a0.a0 = -1;
9709 a0.a0.a1 = 2;
9710 a0.a1.a0 = -3;
9711 a0.a1.a1 = 4;
9712 a1.a0.a0 = -5;
9713 a1.a0.a1 = 6;
9714 a1.a1.a0 = -7;
9715 a1.a1.a1 = 8;
9716 a2.a0.a0 = -9;
9717 a2.a0.a1 = 10;
9718 a2.a1.a0 = -11;
9719 a2.a1.a1 = 12;
9720 a3.a0.a0 = -13;
9721 a3.a0.a1 = 14;
9722 a3.a1.a0 = -15;
9723 a3.a1.a1 = 16;
9724 a4.a0.a0 = -17;
9725 a4.a0.a1 = 18;
9726 a4.a1.a0 = -19;
9727 a4.a1.a1 = 20;
9728 a5.a0.a0 = -21;
9729 a5.a0.a1 = 22;
9730 a5.a1.a0 = -23;
9731 a5.a1.a1 = 24;
9732 a6.a0.a0 = -25;
9733 a6.a0.a1 = 26;
9734 a6.a1.a0 = -27;
9735 a6.a1.a1 = 28;
9736 a7.a0.a0 = -29;
9737 a7.a0.a1 = 30;
9738 a7.a1.a0 = -31;
9739 a7.a1.a1 = 32;
9740 a8.a0.a0 = -33;
9741 a8.a0.a1 = 34;
9742 a8.a1.a0 = -35;
9743 a8.a1.a1 = 36;
9744 a9.a0.a0 = -37;
9745 a9.a0.a1 = 38;
9746 a9.a1.a0 = -39;
9747 a9.a1.a1 = 40;
9748
9749 std::cout << "Calling TestPassStruct8BytesNestedIntx10("
9750 << "(((" << a0.a0.a0 << ", " << a0.a0.a1 << "), (" << a0.a1.a0
9751 << ", " << a0.a1.a1 << ")), ((" << a1.a0.a0 << ", " << a1.a0.a1
9752 << "), (" << a1.a1.a0 << ", " << a1.a1.a1 << ")), ((" << a2.a0.a0
9753 << ", " << a2.a0.a1 << "), (" << a2.a1.a0 << ", " << a2.a1.a1
9754 << ")), ((" << a3.a0.a0 << ", " << a3.a0.a1 << "), (" << a3.a1.a0
9755 << ", " << a3.a1.a1 << ")), ((" << a4.a0.a0 << ", " << a4.a0.a1
9756 << "), (" << a4.a1.a0 << ", " << a4.a1.a1 << ")), ((" << a5.a0.a0
9757 << ", " << a5.a0.a1 << "), (" << a5.a1.a0 << ", " << a5.a1.a1
9758 << ")), ((" << a6.a0.a0 << ", " << a6.a0.a1 << "), (" << a6.a1.a0
9759 << ", " << a6.a1.a1 << ")), ((" << a7.a0.a0 << ", " << a7.a0.a1
9760 << "), (" << a7.a1.a0 << ", " << a7.a1.a1 << ")), ((" << a8.a0.a0
9761 << ", " << a8.a0.a1 << "), (" << a8.a1.a0 << ", " << a8.a1.a1
9762 << ")), ((" << a9.a0.a0 << ", " << a9.a0.a1 << "), (" << a9.a1.a0
9763 << ", " << a9.a1.a1 << ")))"
9764 << ")\n";
9765
9766 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
9767
9768 std::cout << "result = " << result << "\n";
9769
9770 CHECK_EQ(20, result);
9771
9772 // Pass argument that will make the Dart callback throw.
9773 a0.a0.a0 = 42;
9774
9775 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
9776
9777 CHECK_EQ(0, result);
9778
9779 // Pass argument that will make the Dart callback return null.
9780 a0.a0.a0 = 84;
9781
9782 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
9783
9784 CHECK_EQ(0, result);
9785
9786 return 0;
9787}
9788
9789// Used for testing structs and unions by value.
9790// Simple nested struct. No alignment gaps on any architectures.
9791// 10 arguments exhaust fpu registers on all platforms.
9793 // NOLINTNEXTLINE(whitespace/parens)
9794 float (*f)(Struct8BytesNestedFloat a0,
9814
9815 a0.a0.a0 = -1.0;
9816 a0.a1.a0 = 2.0;
9817 a1.a0.a0 = -3.0;
9818 a1.a1.a0 = 4.0;
9819 a2.a0.a0 = -5.0;
9820 a2.a1.a0 = 6.0;
9821 a3.a0.a0 = -7.0;
9822 a3.a1.a0 = 8.0;
9823 a4.a0.a0 = -9.0;
9824 a4.a1.a0 = 10.0;
9825 a5.a0.a0 = -11.0;
9826 a5.a1.a0 = 12.0;
9827 a6.a0.a0 = -13.0;
9828 a6.a1.a0 = 14.0;
9829 a7.a0.a0 = -15.0;
9830 a7.a1.a0 = 16.0;
9831 a8.a0.a0 = -17.0;
9832 a8.a1.a0 = 18.0;
9833 a9.a0.a0 = -19.0;
9834 a9.a1.a0 = 20.0;
9835
9836 std::cout << "Calling TestPassStruct8BytesNestedFloatx10("
9837 << "(((" << a0.a0.a0 << "), (" << a0.a1.a0 << ")), ((" << a1.a0.a0
9838 << "), (" << a1.a1.a0 << ")), ((" << a2.a0.a0 << "), (" << a2.a1.a0
9839 << ")), ((" << a3.a0.a0 << "), (" << a3.a1.a0 << ")), (("
9840 << a4.a0.a0 << "), (" << a4.a1.a0 << ")), ((" << a5.a0.a0 << "), ("
9841 << a5.a1.a0 << ")), ((" << a6.a0.a0 << "), (" << a6.a1.a0
9842 << ")), ((" << a7.a0.a0 << "), (" << a7.a1.a0 << ")), (("
9843 << a8.a0.a0 << "), (" << a8.a1.a0 << ")), ((" << a9.a0.a0 << "), ("
9844 << a9.a1.a0 << ")))"
9845 << ")\n";
9846
9847 float result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
9848
9849 std::cout << "result = " << result << "\n";
9850
9851 CHECK_APPROX(10.0, result);
9852
9853 // Pass argument that will make the Dart callback throw.
9854 a0.a0.a0 = 42;
9855
9856 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
9857
9858 CHECK_APPROX(0.0, result);
9859
9860 // Pass argument that will make the Dart callback return null.
9861 a0.a0.a0 = 84;
9862
9863 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
9864
9865 CHECK_APPROX(0.0, result);
9866
9867 return 0;
9868}
9869
9870// Used for testing structs and unions by value.
9871// Simple nested struct. No alignment gaps on any architectures.
9872// 10 arguments exhaust fpu registers on all platforms.
9873// The nesting is irregular, testing homogenous float rules on arm and arm64,
9874// and the fpu register usage on x64.
9876 // NOLINTNEXTLINE(whitespace/parens)
9877 float (*f)(Struct8BytesNestedFloat2 a0,
9897
9898 a0.a0.a0 = -1.0;
9899 a0.a1 = 2.0;
9900 a1.a0.a0 = -3.0;
9901 a1.a1 = 4.0;
9902 a2.a0.a0 = -5.0;
9903 a2.a1 = 6.0;
9904 a3.a0.a0 = -7.0;
9905 a3.a1 = 8.0;
9906 a4.a0.a0 = -9.0;
9907 a4.a1 = 10.0;
9908 a5.a0.a0 = -11.0;
9909 a5.a1 = 12.0;
9910 a6.a0.a0 = -13.0;
9911 a6.a1 = 14.0;
9912 a7.a0.a0 = -15.0;
9913 a7.a1 = 16.0;
9914 a8.a0.a0 = -17.0;
9915 a8.a1 = 18.0;
9916 a9.a0.a0 = -19.0;
9917 a9.a1 = 20.0;
9918
9919 std::cout << "Calling TestPassStruct8BytesNestedFloat2x10("
9920 << "(((" << a0.a0.a0 << "), " << a0.a1 << "), ((" << a1.a0.a0
9921 << "), " << a1.a1 << "), ((" << a2.a0.a0 << "), " << a2.a1
9922 << "), ((" << a3.a0.a0 << "), " << a3.a1 << "), ((" << a4.a0.a0
9923 << "), " << a4.a1 << "), ((" << a5.a0.a0 << "), " << a5.a1
9924 << "), ((" << a6.a0.a0 << "), " << a6.a1 << "), ((" << a7.a0.a0
9925 << "), " << a7.a1 << "), ((" << a8.a0.a0 << "), " << a8.a1
9926 << "), ((" << a9.a0.a0 << "), " << a9.a1 << "))"
9927 << ")\n";
9928
9929 float result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
9930
9931 std::cout << "result = " << result << "\n";
9932
9933 CHECK_APPROX(10.0, result);
9934
9935 // Pass argument that will make the Dart callback throw.
9936 a0.a0.a0 = 42;
9937
9938 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
9939
9940 CHECK_APPROX(0.0, result);
9941
9942 // Pass argument that will make the Dart callback return null.
9943 a0.a0.a0 = 84;
9944
9945 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
9946
9947 CHECK_APPROX(0.0, result);
9948
9949 return 0;
9950}
9951
9952// Used for testing structs and unions by value.
9953// Simple nested struct. No alignment gaps on any architectures.
9954// 10 arguments exhaust all registers on all platforms.
9956 // NOLINTNEXTLINE(whitespace/parens)
9957 double (*f)(Struct8BytesNestedMixed a0,
9977
9978 a0.a0.a0 = -1;
9979 a0.a0.a1 = 2;
9980 a0.a1.a0 = -3.0;
9981 a1.a0.a0 = 4;
9982 a1.a0.a1 = -5;
9983 a1.a1.a0 = 6.0;
9984 a2.a0.a0 = -7;
9985 a2.a0.a1 = 8;
9986 a2.a1.a0 = -9.0;
9987 a3.a0.a0 = 10;
9988 a3.a0.a1 = -11;
9989 a3.a1.a0 = 12.0;
9990 a4.a0.a0 = -13;
9991 a4.a0.a1 = 14;
9992 a4.a1.a0 = -15.0;
9993 a5.a0.a0 = 16;
9994 a5.a0.a1 = -17;
9995 a5.a1.a0 = 18.0;
9996 a6.a0.a0 = -19;
9997 a6.a0.a1 = 20;
9998 a6.a1.a0 = -21.0;
9999 a7.a0.a0 = 22;
10000 a7.a0.a1 = -23;
10001 a7.a1.a0 = 24.0;
10002 a8.a0.a0 = -25;
10003 a8.a0.a1 = 26;
10004 a8.a1.a0 = -27.0;
10005 a9.a0.a0 = 28;
10006 a9.a0.a1 = -29;
10007 a9.a1.a0 = 30.0;
10008
10009 std::cout << "Calling TestPassStruct8BytesNestedMixedx10("
10010 << "(((" << a0.a0.a0 << ", " << a0.a0.a1 << "), (" << a0.a1.a0
10011 << ")), ((" << a1.a0.a0 << ", " << a1.a0.a1 << "), (" << a1.a1.a0
10012 << ")), ((" << a2.a0.a0 << ", " << a2.a0.a1 << "), (" << a2.a1.a0
10013 << ")), ((" << a3.a0.a0 << ", " << a3.a0.a1 << "), (" << a3.a1.a0
10014 << ")), ((" << a4.a0.a0 << ", " << a4.a0.a1 << "), (" << a4.a1.a0
10015 << ")), ((" << a5.a0.a0 << ", " << a5.a0.a1 << "), (" << a5.a1.a0
10016 << ")), ((" << a6.a0.a0 << ", " << a6.a0.a1 << "), (" << a6.a1.a0
10017 << ")), ((" << a7.a0.a0 << ", " << a7.a0.a1 << "), (" << a7.a1.a0
10018 << ")), ((" << a8.a0.a0 << ", " << a8.a0.a1 << "), (" << a8.a1.a0
10019 << ")), ((" << a9.a0.a0 << ", " << a9.a0.a1 << "), (" << a9.a1.a0
10020 << ")))"
10021 << ")\n";
10022
10023 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
10024
10025 std::cout << "result = " << result << "\n";
10026
10027 CHECK_APPROX(15.0, result);
10028
10029 // Pass argument that will make the Dart callback throw.
10030 a0.a0.a0 = 42;
10031
10032 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
10033
10034 CHECK_APPROX(0.0, result);
10035
10036 // Pass argument that will make the Dart callback return null.
10037 a0.a0.a0 = 84;
10038
10039 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
10040
10041 CHECK_APPROX(0.0, result);
10042
10043 return 0;
10044}
10045
10046// Used for testing structs and unions by value.
10047// Deeper nested struct to test recursive member access.
10049 // NOLINTNEXTLINE(whitespace/parens)
10050 int64_t (*f)(Struct16BytesNestedInt a0, Struct16BytesNestedInt a1)) {
10051 Struct16BytesNestedInt a0 = {};
10052 Struct16BytesNestedInt a1 = {};
10053
10054 a0.a0.a0.a0 = -1;
10055 a0.a0.a0.a1 = 2;
10056 a0.a0.a1.a0 = -3;
10057 a0.a0.a1.a1 = 4;
10058 a0.a1.a0.a0 = -5;
10059 a0.a1.a0.a1 = 6;
10060 a0.a1.a1.a0 = -7;
10061 a0.a1.a1.a1 = 8;
10062 a1.a0.a0.a0 = -9;
10063 a1.a0.a0.a1 = 10;
10064 a1.a0.a1.a0 = -11;
10065 a1.a0.a1.a1 = 12;
10066 a1.a1.a0.a0 = -13;
10067 a1.a1.a0.a1 = 14;
10068 a1.a1.a1.a0 = -15;
10069 a1.a1.a1.a1 = 16;
10070
10071 std::cout << "Calling TestPassStruct16BytesNestedIntx2("
10072 << "((((" << a0.a0.a0.a0 << ", " << a0.a0.a0.a1 << "), ("
10073 << a0.a0.a1.a0 << ", " << a0.a0.a1.a1 << ")), ((" << a0.a1.a0.a0
10074 << ", " << a0.a1.a0.a1 << "), (" << a0.a1.a1.a0 << ", "
10075 << a0.a1.a1.a1 << "))), (((" << a1.a0.a0.a0 << ", " << a1.a0.a0.a1
10076 << "), (" << a1.a0.a1.a0 << ", " << a1.a0.a1.a1 << ")), (("
10077 << a1.a1.a0.a0 << ", " << a1.a1.a0.a1 << "), (" << a1.a1.a1.a0
10078 << ", " << a1.a1.a1.a1 << "))))"
10079 << ")\n";
10080
10081 int64_t result = f(a0, a1);
10082
10083 std::cout << "result = " << result << "\n";
10084
10085 CHECK_EQ(8, result);
10086
10087 // Pass argument that will make the Dart callback throw.
10088 a0.a0.a0.a0 = 42;
10089
10090 result = f(a0, a1);
10091
10092 CHECK_EQ(0, result);
10093
10094 // Pass argument that will make the Dart callback return null.
10095 a0.a0.a0.a0 = 84;
10096
10097 result = f(a0, a1);
10098
10099 CHECK_EQ(0, result);
10100
10101 return 0;
10102}
10103
10104// Used for testing structs and unions by value.
10105// Even deeper nested struct to test recursive member access.
10107 // NOLINTNEXTLINE(whitespace/parens)
10108 int64_t (*f)(Struct32BytesNestedInt a0, Struct32BytesNestedInt a1)) {
10109 Struct32BytesNestedInt a0 = {};
10110 Struct32BytesNestedInt a1 = {};
10111
10112 a0.a0.a0.a0.a0 = -1;
10113 a0.a0.a0.a0.a1 = 2;
10114 a0.a0.a0.a1.a0 = -3;
10115 a0.a0.a0.a1.a1 = 4;
10116 a0.a0.a1.a0.a0 = -5;
10117 a0.a0.a1.a0.a1 = 6;
10118 a0.a0.a1.a1.a0 = -7;
10119 a0.a0.a1.a1.a1 = 8;
10120 a0.a1.a0.a0.a0 = -9;
10121 a0.a1.a0.a0.a1 = 10;
10122 a0.a1.a0.a1.a0 = -11;
10123 a0.a1.a0.a1.a1 = 12;
10124 a0.a1.a1.a0.a0 = -13;
10125 a0.a1.a1.a0.a1 = 14;
10126 a0.a1.a1.a1.a0 = -15;
10127 a0.a1.a1.a1.a1 = 16;
10128 a1.a0.a0.a0.a0 = -17;
10129 a1.a0.a0.a0.a1 = 18;
10130 a1.a0.a0.a1.a0 = -19;
10131 a1.a0.a0.a1.a1 = 20;
10132 a1.a0.a1.a0.a0 = -21;
10133 a1.a0.a1.a0.a1 = 22;
10134 a1.a0.a1.a1.a0 = -23;
10135 a1.a0.a1.a1.a1 = 24;
10136 a1.a1.a0.a0.a0 = -25;
10137 a1.a1.a0.a0.a1 = 26;
10138 a1.a1.a0.a1.a0 = -27;
10139 a1.a1.a0.a1.a1 = 28;
10140 a1.a1.a1.a0.a0 = -29;
10141 a1.a1.a1.a0.a1 = 30;
10142 a1.a1.a1.a1.a0 = -31;
10143 a1.a1.a1.a1.a1 = 32;
10144
10145 std::cout << "Calling TestPassStruct32BytesNestedIntx2("
10146 << "(((((" << a0.a0.a0.a0.a0 << ", " << a0.a0.a0.a0.a1 << "), ("
10147 << a0.a0.a0.a1.a0 << ", " << a0.a0.a0.a1.a1 << ")), (("
10148 << a0.a0.a1.a0.a0 << ", " << a0.a0.a1.a0.a1 << "), ("
10149 << a0.a0.a1.a1.a0 << ", " << a0.a0.a1.a1.a1 << "))), ((("
10150 << a0.a1.a0.a0.a0 << ", " << a0.a1.a0.a0.a1 << "), ("
10151 << a0.a1.a0.a1.a0 << ", " << a0.a1.a0.a1.a1 << ")), (("
10152 << a0.a1.a1.a0.a0 << ", " << a0.a1.a1.a0.a1 << "), ("
10153 << a0.a1.a1.a1.a0 << ", " << a0.a1.a1.a1.a1 << ")))), (((("
10154 << a1.a0.a0.a0.a0 << ", " << a1.a0.a0.a0.a1 << "), ("
10155 << a1.a0.a0.a1.a0 << ", " << a1.a0.a0.a1.a1 << ")), (("
10156 << a1.a0.a1.a0.a0 << ", " << a1.a0.a1.a0.a1 << "), ("
10157 << a1.a0.a1.a1.a0 << ", " << a1.a0.a1.a1.a1 << "))), ((("
10158 << a1.a1.a0.a0.a0 << ", " << a1.a1.a0.a0.a1 << "), ("
10159 << a1.a1.a0.a1.a0 << ", " << a1.a1.a0.a1.a1 << ")), (("
10160 << a1.a1.a1.a0.a0 << ", " << a1.a1.a1.a0.a1 << "), ("
10161 << a1.a1.a1.a1.a0 << ", " << a1.a1.a1.a1.a1 << ")))))"
10162 << ")\n";
10163
10164 int64_t result = f(a0, a1);
10165
10166 std::cout << "result = " << result << "\n";
10167
10168 CHECK_EQ(16, result);
10169
10170 // Pass argument that will make the Dart callback throw.
10171 a0.a0.a0.a0.a0 = 42;
10172
10173 result = f(a0, a1);
10174
10175 CHECK_EQ(0, result);
10176
10177 // Pass argument that will make the Dart callback return null.
10178 a0.a0.a0.a0.a0 = 84;
10179
10180 result = f(a0, a1);
10181
10182 CHECK_EQ(0, result);
10183
10184 return 0;
10185}
10186
10187// Used for testing structs and unions by value.
10188// Test alignment and padding of nested struct with 16 byte int.
10190 // NOLINTNEXTLINE(whitespace/parens)
10191 int64_t (*f)(StructNestedIntStructAlignmentInt16 a0)) {
10193
10194 a0.a0.a0 = -1;
10195 a0.a0.a1 = 2;
10196 a0.a0.a2 = -3;
10197 a0.a1.a0 = 4;
10198 a0.a1.a1 = -5;
10199 a0.a1.a2 = 6;
10200
10201 std::cout << "Calling TestPassStructNestedIntStructAlignmentInt16("
10202 << "(((" << static_cast<int>(a0.a0.a0) << ", " << a0.a0.a1 << ", "
10203 << static_cast<int>(a0.a0.a2) << "), ("
10204 << static_cast<int>(a0.a1.a0) << ", " << a0.a1.a1 << ", "
10205 << static_cast<int>(a0.a1.a2) << ")))"
10206 << ")\n";
10207
10208 int64_t result = f(a0);
10209
10210 std::cout << "result = " << result << "\n";
10211
10212 CHECK_EQ(3, result);
10213
10214 // Pass argument that will make the Dart callback throw.
10215 a0.a0.a0 = 42;
10216
10217 result = f(a0);
10218
10219 CHECK_EQ(0, result);
10220
10221 // Pass argument that will make the Dart callback return null.
10222 a0.a0.a0 = 84;
10223
10224 result = f(a0);
10225
10226 CHECK_EQ(0, result);
10227
10228 return 0;
10229}
10230
10231// Used for testing structs and unions by value.
10232// Test alignment and padding of nested struct with 32 byte int.
10234 // NOLINTNEXTLINE(whitespace/parens)
10235 int64_t (*f)(StructNestedIntStructAlignmentInt32 a0)) {
10237
10238 a0.a0.a0 = -1;
10239 a0.a0.a1 = 2;
10240 a0.a0.a2 = -3;
10241 a0.a1.a0 = 4;
10242 a0.a1.a1 = -5;
10243 a0.a1.a2 = 6;
10244
10245 std::cout << "Calling TestPassStructNestedIntStructAlignmentInt32("
10246 << "(((" << static_cast<int>(a0.a0.a0) << ", " << a0.a0.a1 << ", "
10247 << static_cast<int>(a0.a0.a2) << "), ("
10248 << static_cast<int>(a0.a1.a0) << ", " << a0.a1.a1 << ", "
10249 << static_cast<int>(a0.a1.a2) << ")))"
10250 << ")\n";
10251
10252 int64_t result = f(a0);
10253
10254 std::cout << "result = " << result << "\n";
10255
10256 CHECK_EQ(3, result);
10257
10258 // Pass argument that will make the Dart callback throw.
10259 a0.a0.a0 = 42;
10260
10261 result = f(a0);
10262
10263 CHECK_EQ(0, result);
10264
10265 // Pass argument that will make the Dart callback return null.
10266 a0.a0.a0 = 84;
10267
10268 result = f(a0);
10269
10270 CHECK_EQ(0, result);
10271
10272 return 0;
10273}
10274
10275// Used for testing structs and unions by value.
10276// Test alignment and padding of nested struct with 64 byte int.
10278 // NOLINTNEXTLINE(whitespace/parens)
10279 int64_t (*f)(StructNestedIntStructAlignmentInt64 a0)) {
10281
10282 a0.a0.a0 = -1;
10283 a0.a0.a1 = 2;
10284 a0.a0.a2 = -3;
10285 a0.a1.a0 = 4;
10286 a0.a1.a1 = -5;
10287 a0.a1.a2 = 6;
10288
10289 std::cout << "Calling TestPassStructNestedIntStructAlignmentInt64("
10290 << "(((" << static_cast<int>(a0.a0.a0) << ", " << a0.a0.a1 << ", "
10291 << static_cast<int>(a0.a0.a2) << "), ("
10292 << static_cast<int>(a0.a1.a0) << ", " << a0.a1.a1 << ", "
10293 << static_cast<int>(a0.a1.a2) << ")))"
10294 << ")\n";
10295
10296 int64_t result = f(a0);
10297
10298 std::cout << "result = " << result << "\n";
10299
10300 CHECK_EQ(3, result);
10301
10302 // Pass argument that will make the Dart callback throw.
10303 a0.a0.a0 = 42;
10304
10305 result = f(a0);
10306
10307 CHECK_EQ(0, result);
10308
10309 // Pass argument that will make the Dart callback return null.
10310 a0.a0.a0 = 84;
10311
10312 result = f(a0);
10313
10314 CHECK_EQ(0, result);
10315
10316 return 0;
10317}
10318
10319// Used for testing structs and unions by value.
10320// Return big irregular struct as smoke test.
10322 // NOLINTNEXTLINE(whitespace/parens)
10331
10332 a0.a0 = 1;
10333 a0.a1.a0.a0 = 2;
10334 a0.a1.a0.a1.a0.a0 = -3;
10335 a0.a1.a0.a1.a0.a1 = 4;
10336 a0.a1.a0.a1.a1.a0 = -5.0;
10337 a0.a1.a0.a2 = 6;
10338 a0.a1.a0.a3.a0.a0 = -7.0;
10339 a0.a1.a0.a3.a1 = 8.0;
10340 a0.a1.a0.a4 = 9;
10341 a0.a1.a0.a5.a0.a0 = 10.0;
10342 a0.a1.a0.a5.a1.a0 = -11.0;
10343 a0.a1.a0.a6 = 12;
10344 a0.a1.a1.a0.a0 = -13;
10345 a0.a1.a1.a0.a1 = 14;
10346 a0.a1.a1.a1.a0 = -15.0;
10347 a0.a1.a2 = 16.0;
10348 a0.a1.a3 = -17.0;
10349 a0.a2.a0.a0 = 18;
10350 a0.a2.a0.a1.a0.a0 = -19;
10351 a0.a2.a0.a1.a0.a1 = 20;
10352 a0.a2.a0.a1.a1.a0 = -21.0;
10353 a0.a2.a0.a2 = 22;
10354 a0.a2.a0.a3.a0.a0 = -23.0;
10355 a0.a2.a0.a3.a1 = 24.0;
10356 a0.a2.a0.a4 = 25;
10357 a0.a2.a0.a5.a0.a0 = 26.0;
10358 a0.a2.a0.a5.a1.a0 = -27.0;
10359 a0.a2.a0.a6 = 28;
10360 a0.a2.a1.a0.a0 = -29;
10361 a0.a2.a1.a0.a1 = 30;
10362 a0.a2.a1.a1.a0 = -31.0;
10363 a0.a2.a2 = 32.0;
10364 a0.a2.a3 = -33.0;
10365 a0.a3 = 34.0;
10366 a1.a0 = 35;
10367 a1.a1.a0.a0 = 36;
10368 a1.a1.a0.a1.a0.a0 = -37;
10369 a1.a1.a0.a1.a0.a1 = 38;
10370 a1.a1.a0.a1.a1.a0 = -39.0;
10371 a1.a1.a0.a2 = 40;
10372 a1.a1.a0.a3.a0.a0 = -41.0;
10373 a1.a1.a0.a3.a1 = 42.0;
10374 a1.a1.a0.a4 = 43;
10375 a1.a1.a0.a5.a0.a0 = 44.0;
10376 a1.a1.a0.a5.a1.a0 = -45.0;
10377 a1.a1.a0.a6 = 46;
10378 a1.a1.a1.a0.a0 = -47;
10379 a1.a1.a1.a0.a1 = 48;
10380 a1.a1.a1.a1.a0 = -49.0;
10381 a1.a1.a2 = 50.0;
10382 a1.a1.a3 = -51.0;
10383 a1.a2.a0.a0 = 52;
10384 a1.a2.a0.a1.a0.a0 = -53;
10385 a1.a2.a0.a1.a0.a1 = 54;
10386 a1.a2.a0.a1.a1.a0 = -55.0;
10387 a1.a2.a0.a2 = 56;
10388 a1.a2.a0.a3.a0.a0 = -57.0;
10389 a1.a2.a0.a3.a1 = 58.0;
10390 a1.a2.a0.a4 = 59;
10391 a1.a2.a0.a5.a0.a0 = 60.0;
10392 a1.a2.a0.a5.a1.a0 = -61.0;
10393 a1.a2.a0.a6 = 62;
10394 a1.a2.a1.a0.a0 = -63;
10395 a1.a2.a1.a0.a1 = 64;
10396 a1.a2.a1.a1.a0 = -65.0;
10397 a1.a2.a2 = 66.0;
10398 a1.a2.a3 = -67.0;
10399 a1.a3 = 68.0;
10400 a2.a0 = 69;
10401 a2.a1.a0.a0 = 70;
10402 a2.a1.a0.a1.a0.a0 = -71;
10403 a2.a1.a0.a1.a0.a1 = 72;
10404 a2.a1.a0.a1.a1.a0 = -73.0;
10405 a2.a1.a0.a2 = 74;
10406 a2.a1.a0.a3.a0.a0 = -75.0;
10407 a2.a1.a0.a3.a1 = 76.0;
10408 a2.a1.a0.a4 = 77;
10409 a2.a1.a0.a5.a0.a0 = 78.0;
10410 a2.a1.a0.a5.a1.a0 = -79.0;
10411 a2.a1.a0.a6 = 80;
10412 a2.a1.a1.a0.a0 = -81;
10413 a2.a1.a1.a0.a1 = 82;
10414 a2.a1.a1.a1.a0 = -83.0;
10415 a2.a1.a2 = 84.0;
10416 a2.a1.a3 = -85.0;
10417 a2.a2.a0.a0 = 86;
10418 a2.a2.a0.a1.a0.a0 = -87;
10419 a2.a2.a0.a1.a0.a1 = 88;
10420 a2.a2.a0.a1.a1.a0 = -89.0;
10421 a2.a2.a0.a2 = 90;
10422 a2.a2.a0.a3.a0.a0 = -91.0;
10423 a2.a2.a0.a3.a1 = 92.0;
10424 a2.a2.a0.a4 = 93;
10425 a2.a2.a0.a5.a0.a0 = 94.0;
10426 a2.a2.a0.a5.a1.a0 = -95.0;
10427 a2.a2.a0.a6 = 96;
10428 a2.a2.a1.a0.a0 = -97;
10429 a2.a2.a1.a0.a1 = 98;
10430 a2.a2.a1.a1.a0 = -99.0;
10431 a2.a2.a2 = 100.0;
10432 a2.a2.a3 = -101.0;
10433 a2.a3 = 102.0;
10434 a3.a0 = 103;
10435 a3.a1.a0.a0 = 104;
10436 a3.a1.a0.a1.a0.a0 = -105;
10437 a3.a1.a0.a1.a0.a1 = 106;
10438 a3.a1.a0.a1.a1.a0 = -107.0;
10439 a3.a1.a0.a2 = 108;
10440 a3.a1.a0.a3.a0.a0 = -109.0;
10441 a3.a1.a0.a3.a1 = 110.0;
10442 a3.a1.a0.a4 = 111;
10443 a3.a1.a0.a5.a0.a0 = 112.0;
10444 a3.a1.a0.a5.a1.a0 = -113.0;
10445 a3.a1.a0.a6 = 114;
10446 a3.a1.a1.a0.a0 = -115;
10447 a3.a1.a1.a0.a1 = 116;
10448 a3.a1.a1.a1.a0 = -117.0;
10449 a3.a1.a2 = 118.0;
10450 a3.a1.a3 = -119.0;
10451 a3.a2.a0.a0 = 120;
10452 a3.a2.a0.a1.a0.a0 = -121;
10453 a3.a2.a0.a1.a0.a1 = 122;
10454 a3.a2.a0.a1.a1.a0 = -123.0;
10455 a3.a2.a0.a2 = 124;
10456 a3.a2.a0.a3.a0.a0 = -125.0;
10457 a3.a2.a0.a3.a1 = 126.0;
10458 a3.a2.a0.a4 = 127;
10459 a3.a2.a0.a5.a0.a0 = 128.0;
10460 a3.a2.a0.a5.a1.a0 = -129.0;
10461 a3.a2.a0.a6 = 130;
10462 a3.a2.a1.a0.a0 = -131;
10463 a3.a2.a1.a0.a1 = 132;
10464 a3.a2.a1.a1.a0 = -133.0;
10465 a3.a2.a2 = 134.0;
10466 a3.a2.a3 = -135.0;
10467 a3.a3 = 136.0;
10468
10469 std::cout
10470 << "Calling TestPassStructNestedIrregularEvenBiggerx4("
10471 << "((" << a0.a0 << ", ((" << a0.a1.a0.a0 << ", ((" << a0.a1.a0.a1.a0.a0
10472 << ", " << a0.a1.a0.a1.a0.a1 << "), (" << a0.a1.a0.a1.a1.a0 << ")), "
10473 << a0.a1.a0.a2 << ", ((" << a0.a1.a0.a3.a0.a0 << "), " << a0.a1.a0.a3.a1
10474 << "), " << a0.a1.a0.a4 << ", ((" << a0.a1.a0.a5.a0.a0 << "), ("
10475 << a0.a1.a0.a5.a1.a0 << ")), " << a0.a1.a0.a6 << "), ((" << a0.a1.a1.a0.a0
10476 << ", " << a0.a1.a1.a0.a1 << "), (" << a0.a1.a1.a1.a0 << ")), "
10477 << a0.a1.a2 << ", " << a0.a1.a3 << "), ((" << a0.a2.a0.a0 << ", (("
10478 << a0.a2.a0.a1.a0.a0 << ", " << a0.a2.a0.a1.a0.a1 << "), ("
10479 << a0.a2.a0.a1.a1.a0 << ")), " << a0.a2.a0.a2 << ", (("
10480 << a0.a2.a0.a3.a0.a0 << "), " << a0.a2.a0.a3.a1 << "), " << a0.a2.a0.a4
10481 << ", ((" << a0.a2.a0.a5.a0.a0 << "), (" << a0.a2.a0.a5.a1.a0 << ")), "
10482 << a0.a2.a0.a6 << "), ((" << a0.a2.a1.a0.a0 << ", " << a0.a2.a1.a0.a1
10483 << "), (" << a0.a2.a1.a1.a0 << ")), " << a0.a2.a2 << ", " << a0.a2.a3
10484 << "), " << a0.a3 << "), (" << a1.a0 << ", ((" << a1.a1.a0.a0 << ", (("
10485 << a1.a1.a0.a1.a0.a0 << ", " << a1.a1.a0.a1.a0.a1 << "), ("
10486 << a1.a1.a0.a1.a1.a0 << ")), " << a1.a1.a0.a2 << ", (("
10487 << a1.a1.a0.a3.a0.a0 << "), " << a1.a1.a0.a3.a1 << "), " << a1.a1.a0.a4
10488 << ", ((" << a1.a1.a0.a5.a0.a0 << "), (" << a1.a1.a0.a5.a1.a0 << ")), "
10489 << a1.a1.a0.a6 << "), ((" << a1.a1.a1.a0.a0 << ", " << a1.a1.a1.a0.a1
10490 << "), (" << a1.a1.a1.a1.a0 << ")), " << a1.a1.a2 << ", " << a1.a1.a3
10491 << "), ((" << a1.a2.a0.a0 << ", ((" << a1.a2.a0.a1.a0.a0 << ", "
10492 << a1.a2.a0.a1.a0.a1 << "), (" << a1.a2.a0.a1.a1.a0 << ")), "
10493 << a1.a2.a0.a2 << ", ((" << a1.a2.a0.a3.a0.a0 << "), " << a1.a2.a0.a3.a1
10494 << "), " << a1.a2.a0.a4 << ", ((" << a1.a2.a0.a5.a0.a0 << "), ("
10495 << a1.a2.a0.a5.a1.a0 << ")), " << a1.a2.a0.a6 << "), ((" << a1.a2.a1.a0.a0
10496 << ", " << a1.a2.a1.a0.a1 << "), (" << a1.a2.a1.a1.a0 << ")), "
10497 << a1.a2.a2 << ", " << a1.a2.a3 << "), " << a1.a3 << "), (" << a2.a0
10498 << ", ((" << a2.a1.a0.a0 << ", ((" << a2.a1.a0.a1.a0.a0 << ", "
10499 << a2.a1.a0.a1.a0.a1 << "), (" << a2.a1.a0.a1.a1.a0 << ")), "
10500 << a2.a1.a0.a2 << ", ((" << a2.a1.a0.a3.a0.a0 << "), " << a2.a1.a0.a3.a1
10501 << "), " << a2.a1.a0.a4 << ", ((" << a2.a1.a0.a5.a0.a0 << "), ("
10502 << a2.a1.a0.a5.a1.a0 << ")), " << a2.a1.a0.a6 << "), ((" << a2.a1.a1.a0.a0
10503 << ", " << a2.a1.a1.a0.a1 << "), (" << a2.a1.a1.a1.a0 << ")), "
10504 << a2.a1.a2 << ", " << a2.a1.a3 << "), ((" << a2.a2.a0.a0 << ", (("
10505 << a2.a2.a0.a1.a0.a0 << ", " << a2.a2.a0.a1.a0.a1 << "), ("
10506 << a2.a2.a0.a1.a1.a0 << ")), " << a2.a2.a0.a2 << ", (("
10507 << a2.a2.a0.a3.a0.a0 << "), " << a2.a2.a0.a3.a1 << "), " << a2.a2.a0.a4
10508 << ", ((" << a2.a2.a0.a5.a0.a0 << "), (" << a2.a2.a0.a5.a1.a0 << ")), "
10509 << a2.a2.a0.a6 << "), ((" << a2.a2.a1.a0.a0 << ", " << a2.a2.a1.a0.a1
10510 << "), (" << a2.a2.a1.a1.a0 << ")), " << a2.a2.a2 << ", " << a2.a2.a3
10511 << "), " << a2.a3 << "), (" << a3.a0 << ", ((" << a3.a1.a0.a0 << ", (("
10512 << a3.a1.a0.a1.a0.a0 << ", " << a3.a1.a0.a1.a0.a1 << "), ("
10513 << a3.a1.a0.a1.a1.a0 << ")), " << a3.a1.a0.a2 << ", (("
10514 << a3.a1.a0.a3.a0.a0 << "), " << a3.a1.a0.a3.a1 << "), " << a3.a1.a0.a4
10515 << ", ((" << a3.a1.a0.a5.a0.a0 << "), (" << a3.a1.a0.a5.a1.a0 << ")), "
10516 << a3.a1.a0.a6 << "), ((" << a3.a1.a1.a0.a0 << ", " << a3.a1.a1.a0.a1
10517 << "), (" << a3.a1.a1.a1.a0 << ")), " << a3.a1.a2 << ", " << a3.a1.a3
10518 << "), ((" << a3.a2.a0.a0 << ", ((" << a3.a2.a0.a1.a0.a0 << ", "
10519 << a3.a2.a0.a1.a0.a1 << "), (" << a3.a2.a0.a1.a1.a0 << ")), "
10520 << a3.a2.a0.a2 << ", ((" << a3.a2.a0.a3.a0.a0 << "), " << a3.a2.a0.a3.a1
10521 << "), " << a3.a2.a0.a4 << ", ((" << a3.a2.a0.a5.a0.a0 << "), ("
10522 << a3.a2.a0.a5.a1.a0 << ")), " << a3.a2.a0.a6 << "), ((" << a3.a2.a1.a0.a0
10523 << ", " << a3.a2.a1.a0.a1 << "), (" << a3.a2.a1.a1.a0 << ")), "
10524 << a3.a2.a2 << ", " << a3.a2.a3 << "), " << a3.a3 << "))"
10525 << ")\n";
10526
10527 double result = f(a0, a1, a2, a3);
10528
10529 std::cout << "result = " << result << "\n";
10530
10531 CHECK_APPROX(1572.0, result);
10532
10533 // Pass argument that will make the Dart callback throw.
10534 a0.a0 = 42;
10535
10536 result = f(a0, a1, a2, a3);
10537
10538 CHECK_APPROX(0.0, result);
10539
10540 // Pass argument that will make the Dart callback return null.
10541 a0.a0 = 84;
10542
10543 result = f(a0, a1, a2, a3);
10544
10545 CHECK_APPROX(0.0, result);
10546
10547 return 0;
10548}
10549
10550// Used for testing structs and unions by value.
10551// Simple struct with inline array.
10553 // NOLINTNEXTLINE(whitespace/parens)
10554 int32_t (*f)(Struct8BytesInlineArrayInt a0,
10562
10563 a0.a0[0] = 1;
10564 a0.a0[1] = 2;
10565 a0.a0[2] = 3;
10566 a0.a0[3] = 4;
10567 a0.a0[4] = 5;
10568 a0.a0[5] = 6;
10569 a0.a0[6] = 7;
10570 a0.a0[7] = 8;
10571 a1.a0[0] = 9;
10572 a1.a0[1] = 10;
10573 a1.a0[2] = 11;
10574 a1.a0[3] = 12;
10575 a1.a0[4] = 13;
10576 a1.a0[5] = 14;
10577 a1.a0[6] = 15;
10578 a1.a0[7] = 16;
10579 a2.a0[0] = 17;
10580 a2.a0[1] = 18;
10581 a2.a0[2] = 19;
10582 a2.a0[3] = 20;
10583 a2.a0[4] = 21;
10584 a2.a0[5] = 22;
10585 a2.a0[6] = 23;
10586 a2.a0[7] = 24;
10587 a3.a0[0] = 25;
10588 a3.a0[1] = 26;
10589 a3.a0[2] = 27;
10590 a3.a0[3] = 28;
10591 a3.a0[4] = 29;
10592 a3.a0[5] = 30;
10593 a3.a0[6] = 31;
10594 a3.a0[7] = 32;
10595
10596 std::cout << "Calling TestPassStruct8BytesInlineArrayIntx4("
10597 << "(([" << static_cast<int>(a0.a0[0]) << ", "
10598 << static_cast<int>(a0.a0[1]) << ", " << static_cast<int>(a0.a0[2])
10599 << ", " << static_cast<int>(a0.a0[3]) << ", "
10600 << static_cast<int>(a0.a0[4]) << ", " << static_cast<int>(a0.a0[5])
10601 << ", " << static_cast<int>(a0.a0[6]) << ", "
10602 << static_cast<int>(a0.a0[7]) << "]), (["
10603 << static_cast<int>(a1.a0[0]) << ", " << static_cast<int>(a1.a0[1])
10604 << ", " << static_cast<int>(a1.a0[2]) << ", "
10605 << static_cast<int>(a1.a0[3]) << ", " << static_cast<int>(a1.a0[4])
10606 << ", " << static_cast<int>(a1.a0[5]) << ", "
10607 << static_cast<int>(a1.a0[6]) << ", " << static_cast<int>(a1.a0[7])
10608 << "]), ([" << static_cast<int>(a2.a0[0]) << ", "
10609 << static_cast<int>(a2.a0[1]) << ", " << static_cast<int>(a2.a0[2])
10610 << ", " << static_cast<int>(a2.a0[3]) << ", "
10611 << static_cast<int>(a2.a0[4]) << ", " << static_cast<int>(a2.a0[5])
10612 << ", " << static_cast<int>(a2.a0[6]) << ", "
10613 << static_cast<int>(a2.a0[7]) << "]), (["
10614 << static_cast<int>(a3.a0[0]) << ", " << static_cast<int>(a3.a0[1])
10615 << ", " << static_cast<int>(a3.a0[2]) << ", "
10616 << static_cast<int>(a3.a0[3]) << ", " << static_cast<int>(a3.a0[4])
10617 << ", " << static_cast<int>(a3.a0[5]) << ", "
10618 << static_cast<int>(a3.a0[6]) << ", " << static_cast<int>(a3.a0[7])
10619 << "]))"
10620 << ")\n";
10621
10622 int32_t result = f(a0, a1, a2, a3);
10623
10624 std::cout << "result = " << result << "\n";
10625
10626 CHECK_EQ(528, result);
10627
10628 // Pass argument that will make the Dart callback throw.
10629 a0.a0[0] = 42;
10630
10631 result = f(a0, a1, a2, a3);
10632
10633 CHECK_EQ(0, result);
10634
10635 // Pass argument that will make the Dart callback return null.
10636 a0.a0[0] = 84;
10637
10638 result = f(a0, a1, a2, a3);
10639
10640 CHECK_EQ(0, result);
10641
10642 return 0;
10643}
10644
10645// Used for testing structs and unions by value.
10646// Irregular struct with inline array.
10648 // NOLINTNEXTLINE(whitespace/parens)
10649 int32_t (*f)(StructInlineArrayIrregular a0,
10657
10658 a0.a0[0].a0 = -1;
10659 a0.a0[0].a1 = 2;
10660 a0.a0[1].a0 = -3;
10661 a0.a0[1].a1 = 4;
10662 a0.a1 = 5;
10663 a1.a0[0].a0 = 6;
10664 a1.a0[0].a1 = -7;
10665 a1.a0[1].a0 = 8;
10666 a1.a0[1].a1 = -9;
10667 a1.a1 = 10;
10668 a2.a0[0].a0 = -11;
10669 a2.a0[0].a1 = 12;
10670 a2.a0[1].a0 = -13;
10671 a2.a0[1].a1 = 14;
10672 a2.a1 = 15;
10673 a3.a0[0].a0 = 16;
10674 a3.a0[0].a1 = -17;
10675 a3.a0[1].a0 = 18;
10676 a3.a0[1].a1 = -19;
10677 a3.a1 = 20;
10678
10679 std::cout << "Calling TestPassStructInlineArrayIrregularx4("
10680 << "(([(" << a0.a0[0].a0 << ", " << static_cast<int>(a0.a0[0].a1)
10681 << "), (" << a0.a0[1].a0 << ", " << static_cast<int>(a0.a0[1].a1)
10682 << ")], " << static_cast<int>(a0.a1) << "), ([(" << a1.a0[0].a0
10683 << ", " << static_cast<int>(a1.a0[0].a1) << "), (" << a1.a0[1].a0
10684 << ", " << static_cast<int>(a1.a0[1].a1) << ")], "
10685 << static_cast<int>(a1.a1) << "), ([(" << a2.a0[0].a0 << ", "
10686 << static_cast<int>(a2.a0[0].a1) << "), (" << a2.a0[1].a0 << ", "
10687 << static_cast<int>(a2.a0[1].a1) << ")], "
10688 << static_cast<int>(a2.a1) << "), ([(" << a3.a0[0].a0 << ", "
10689 << static_cast<int>(a3.a0[0].a1) << "), (" << a3.a0[1].a0 << ", "
10690 << static_cast<int>(a3.a0[1].a1) << ")], "
10691 << static_cast<int>(a3.a1) << "))"
10692 << ")\n";
10693
10694 int32_t result = f(a0, a1, a2, a3);
10695
10696 std::cout << "result = " << result << "\n";
10697
10698 CHECK_EQ(50, result);
10699
10700 // Pass argument that will make the Dart callback throw.
10701 a0.a0[0].a0 = 42;
10702
10703 result = f(a0, a1, a2, a3);
10704
10705 CHECK_EQ(0, result);
10706
10707 // Pass argument that will make the Dart callback return null.
10708 a0.a0[0].a0 = 84;
10709
10710 result = f(a0, a1, a2, a3);
10711
10712 CHECK_EQ(0, result);
10713
10714 return 0;
10715}
10716
10717// Used for testing structs and unions by value.
10718// Regular larger struct with inline array.
10720 // NOLINTNEXTLINE(whitespace/parens)
10721 int32_t (*f)(StructInlineArray100Bytes a0)) {
10723
10724 a0.a0[0] = 1;
10725 a0.a0[1] = 2;
10726 a0.a0[2] = 3;
10727 a0.a0[3] = 4;
10728 a0.a0[4] = 5;
10729 a0.a0[5] = 6;
10730 a0.a0[6] = 7;
10731 a0.a0[7] = 8;
10732 a0.a0[8] = 9;
10733 a0.a0[9] = 10;
10734 a0.a0[10] = 11;
10735 a0.a0[11] = 12;
10736 a0.a0[12] = 13;
10737 a0.a0[13] = 14;
10738 a0.a0[14] = 15;
10739 a0.a0[15] = 16;
10740 a0.a0[16] = 17;
10741 a0.a0[17] = 18;
10742 a0.a0[18] = 19;
10743 a0.a0[19] = 20;
10744 a0.a0[20] = 21;
10745 a0.a0[21] = 22;
10746 a0.a0[22] = 23;
10747 a0.a0[23] = 24;
10748 a0.a0[24] = 25;
10749 a0.a0[25] = 26;
10750 a0.a0[26] = 27;
10751 a0.a0[27] = 28;
10752 a0.a0[28] = 29;
10753 a0.a0[29] = 30;
10754 a0.a0[30] = 31;
10755 a0.a0[31] = 32;
10756 a0.a0[32] = 33;
10757 a0.a0[33] = 34;
10758 a0.a0[34] = 35;
10759 a0.a0[35] = 36;
10760 a0.a0[36] = 37;
10761 a0.a0[37] = 38;
10762 a0.a0[38] = 39;
10763 a0.a0[39] = 40;
10764 a0.a0[40] = 41;
10765 a0.a0[41] = 42;
10766 a0.a0[42] = 43;
10767 a0.a0[43] = 44;
10768 a0.a0[44] = 45;
10769 a0.a0[45] = 46;
10770 a0.a0[46] = 47;
10771 a0.a0[47] = 48;
10772 a0.a0[48] = 49;
10773 a0.a0[49] = 50;
10774 a0.a0[50] = 51;
10775 a0.a0[51] = 52;
10776 a0.a0[52] = 53;
10777 a0.a0[53] = 54;
10778 a0.a0[54] = 55;
10779 a0.a0[55] = 56;
10780 a0.a0[56] = 57;
10781 a0.a0[57] = 58;
10782 a0.a0[58] = 59;
10783 a0.a0[59] = 60;
10784 a0.a0[60] = 61;
10785 a0.a0[61] = 62;
10786 a0.a0[62] = 63;
10787 a0.a0[63] = 64;
10788 a0.a0[64] = 65;
10789 a0.a0[65] = 66;
10790 a0.a0[66] = 67;
10791 a0.a0[67] = 68;
10792 a0.a0[68] = 69;
10793 a0.a0[69] = 70;
10794 a0.a0[70] = 71;
10795 a0.a0[71] = 72;
10796 a0.a0[72] = 73;
10797 a0.a0[73] = 74;
10798 a0.a0[74] = 75;
10799 a0.a0[75] = 76;
10800 a0.a0[76] = 77;
10801 a0.a0[77] = 78;
10802 a0.a0[78] = 79;
10803 a0.a0[79] = 80;
10804 a0.a0[80] = 81;
10805 a0.a0[81] = 82;
10806 a0.a0[82] = 83;
10807 a0.a0[83] = 84;
10808 a0.a0[84] = 85;
10809 a0.a0[85] = 86;
10810 a0.a0[86] = 87;
10811 a0.a0[87] = 88;
10812 a0.a0[88] = 89;
10813 a0.a0[89] = 90;
10814 a0.a0[90] = 91;
10815 a0.a0[91] = 92;
10816 a0.a0[92] = 93;
10817 a0.a0[93] = 94;
10818 a0.a0[94] = 95;
10819 a0.a0[95] = 96;
10820 a0.a0[96] = 97;
10821 a0.a0[97] = 98;
10822 a0.a0[98] = 99;
10823 a0.a0[99] = 100;
10824
10825 std::cout
10826 << "Calling TestPassStructInlineArray100Bytes("
10827 << "(([" << static_cast<int>(a0.a0[0]) << ", "
10828 << static_cast<int>(a0.a0[1]) << ", " << static_cast<int>(a0.a0[2])
10829 << ", " << static_cast<int>(a0.a0[3]) << ", "
10830 << static_cast<int>(a0.a0[4]) << ", " << static_cast<int>(a0.a0[5])
10831 << ", " << static_cast<int>(a0.a0[6]) << ", "
10832 << static_cast<int>(a0.a0[7]) << ", " << static_cast<int>(a0.a0[8])
10833 << ", " << static_cast<int>(a0.a0[9]) << ", "
10834 << static_cast<int>(a0.a0[10]) << ", " << static_cast<int>(a0.a0[11])
10835 << ", " << static_cast<int>(a0.a0[12]) << ", "
10836 << static_cast<int>(a0.a0[13]) << ", " << static_cast<int>(a0.a0[14])
10837 << ", " << static_cast<int>(a0.a0[15]) << ", "
10838 << static_cast<int>(a0.a0[16]) << ", " << static_cast<int>(a0.a0[17])
10839 << ", " << static_cast<int>(a0.a0[18]) << ", "
10840 << static_cast<int>(a0.a0[19]) << ", " << static_cast<int>(a0.a0[20])
10841 << ", " << static_cast<int>(a0.a0[21]) << ", "
10842 << static_cast<int>(a0.a0[22]) << ", " << static_cast<int>(a0.a0[23])
10843 << ", " << static_cast<int>(a0.a0[24]) << ", "
10844 << static_cast<int>(a0.a0[25]) << ", " << static_cast<int>(a0.a0[26])
10845 << ", " << static_cast<int>(a0.a0[27]) << ", "
10846 << static_cast<int>(a0.a0[28]) << ", " << static_cast<int>(a0.a0[29])
10847 << ", " << static_cast<int>(a0.a0[30]) << ", "
10848 << static_cast<int>(a0.a0[31]) << ", " << static_cast<int>(a0.a0[32])
10849 << ", " << static_cast<int>(a0.a0[33]) << ", "
10850 << static_cast<int>(a0.a0[34]) << ", " << static_cast<int>(a0.a0[35])
10851 << ", " << static_cast<int>(a0.a0[36]) << ", "
10852 << static_cast<int>(a0.a0[37]) << ", " << static_cast<int>(a0.a0[38])
10853 << ", " << static_cast<int>(a0.a0[39]) << ", "
10854 << static_cast<int>(a0.a0[40]) << ", " << static_cast<int>(a0.a0[41])
10855 << ", " << static_cast<int>(a0.a0[42]) << ", "
10856 << static_cast<int>(a0.a0[43]) << ", " << static_cast<int>(a0.a0[44])
10857 << ", " << static_cast<int>(a0.a0[45]) << ", "
10858 << static_cast<int>(a0.a0[46]) << ", " << static_cast<int>(a0.a0[47])
10859 << ", " << static_cast<int>(a0.a0[48]) << ", "
10860 << static_cast<int>(a0.a0[49]) << ", " << static_cast<int>(a0.a0[50])
10861 << ", " << static_cast<int>(a0.a0[51]) << ", "
10862 << static_cast<int>(a0.a0[52]) << ", " << static_cast<int>(a0.a0[53])
10863 << ", " << static_cast<int>(a0.a0[54]) << ", "
10864 << static_cast<int>(a0.a0[55]) << ", " << static_cast<int>(a0.a0[56])
10865 << ", " << static_cast<int>(a0.a0[57]) << ", "
10866 << static_cast<int>(a0.a0[58]) << ", " << static_cast<int>(a0.a0[59])
10867 << ", " << static_cast<int>(a0.a0[60]) << ", "
10868 << static_cast<int>(a0.a0[61]) << ", " << static_cast<int>(a0.a0[62])
10869 << ", " << static_cast<int>(a0.a0[63]) << ", "
10870 << static_cast<int>(a0.a0[64]) << ", " << static_cast<int>(a0.a0[65])
10871 << ", " << static_cast<int>(a0.a0[66]) << ", "
10872 << static_cast<int>(a0.a0[67]) << ", " << static_cast<int>(a0.a0[68])
10873 << ", " << static_cast<int>(a0.a0[69]) << ", "
10874 << static_cast<int>(a0.a0[70]) << ", " << static_cast<int>(a0.a0[71])
10875 << ", " << static_cast<int>(a0.a0[72]) << ", "
10876 << static_cast<int>(a0.a0[73]) << ", " << static_cast<int>(a0.a0[74])
10877 << ", " << static_cast<int>(a0.a0[75]) << ", "
10878 << static_cast<int>(a0.a0[76]) << ", " << static_cast<int>(a0.a0[77])
10879 << ", " << static_cast<int>(a0.a0[78]) << ", "
10880 << static_cast<int>(a0.a0[79]) << ", " << static_cast<int>(a0.a0[80])
10881 << ", " << static_cast<int>(a0.a0[81]) << ", "
10882 << static_cast<int>(a0.a0[82]) << ", " << static_cast<int>(a0.a0[83])
10883 << ", " << static_cast<int>(a0.a0[84]) << ", "
10884 << static_cast<int>(a0.a0[85]) << ", " << static_cast<int>(a0.a0[86])
10885 << ", " << static_cast<int>(a0.a0[87]) << ", "
10886 << static_cast<int>(a0.a0[88]) << ", " << static_cast<int>(a0.a0[89])
10887 << ", " << static_cast<int>(a0.a0[90]) << ", "
10888 << static_cast<int>(a0.a0[91]) << ", " << static_cast<int>(a0.a0[92])
10889 << ", " << static_cast<int>(a0.a0[93]) << ", "
10890 << static_cast<int>(a0.a0[94]) << ", " << static_cast<int>(a0.a0[95])
10891 << ", " << static_cast<int>(a0.a0[96]) << ", "
10892 << static_cast<int>(a0.a0[97]) << ", " << static_cast<int>(a0.a0[98])
10893 << ", " << static_cast<int>(a0.a0[99]) << "]))"
10894 << ")\n";
10895
10896 int32_t result = f(a0);
10897
10898 std::cout << "result = " << result << "\n";
10899
10900 CHECK_EQ(5050, result);
10901
10902 // Pass argument that will make the Dart callback throw.
10903 a0.a0[0] = 42;
10904
10905 result = f(a0);
10906
10907 CHECK_EQ(0, result);
10908
10909 // Pass argument that will make the Dart callback return null.
10910 a0.a0[0] = 84;
10911
10912 result = f(a0);
10913
10914 CHECK_EQ(0, result);
10915
10916 return 0;
10917}
10918
10919// Used for testing structs and unions by value.
10920// Arguments in FPU registers on arm hardfp and arm64.
10921// 5 struct arguments will exhaust available registers.
10923 // NOLINTNEXTLINE(whitespace/parens)
10934
10935 a0.a0.a0 = -1.0;
10936 a0.a1[0].a0 = 2.0;
10937 a0.a1[1].a0 = -3.0;
10938 a0.a2 = 4.0;
10939 a1.a0.a0 = -5.0;
10940 a1.a1[0].a0 = 6.0;
10941 a1.a1[1].a0 = -7.0;
10942 a1.a2 = 8.0;
10943 a2.a0.a0 = -9.0;
10944 a2.a1[0].a0 = 10.0;
10945 a2.a1[1].a0 = -11.0;
10946 a2.a2 = 12.0;
10947 a3.a0.a0 = -13.0;
10948 a3.a1[0].a0 = 14.0;
10949 a3.a1[1].a0 = -15.0;
10950 a3.a2 = 16.0;
10951 a4.a0.a0 = -17.0;
10952 a4.a1[0].a0 = 18.0;
10953 a4.a1[1].a0 = -19.0;
10954 a4.a2 = 20.0;
10955
10956 std::cout << "Calling TestPassStructStruct16BytesHomogeneousFloat2x5("
10957 << "(((" << a0.a0.a0 << "), [(" << a0.a1[0].a0 << "), ("
10958 << a0.a1[1].a0 << ")], " << a0.a2 << "), ((" << a1.a0.a0 << "), [("
10959 << a1.a1[0].a0 << "), (" << a1.a1[1].a0 << ")], " << a1.a2
10960 << "), ((" << a2.a0.a0 << "), [(" << a2.a1[0].a0 << "), ("
10961 << a2.a1[1].a0 << ")], " << a2.a2 << "), ((" << a3.a0.a0 << "), [("
10962 << a3.a1[0].a0 << "), (" << a3.a1[1].a0 << ")], " << a3.a2
10963 << "), ((" << a4.a0.a0 << "), [(" << a4.a1[0].a0 << "), ("
10964 << a4.a1[1].a0 << ")], " << a4.a2 << "))"
10965 << ")\n";
10966
10967 float result = f(a0, a1, a2, a3, a4);
10968
10969 std::cout << "result = " << result << "\n";
10970
10971 CHECK_APPROX(10.0, result);
10972
10973 // Pass argument that will make the Dart callback throw.
10974 a0.a0.a0 = 42;
10975
10976 result = f(a0, a1, a2, a3, a4);
10977
10978 CHECK_APPROX(0.0, result);
10979
10980 // Pass argument that will make the Dart callback return null.
10981 a0.a0.a0 = 84;
10982
10983 result = f(a0, a1, a2, a3, a4);
10984
10985 CHECK_APPROX(0.0, result);
10986
10987 return 0;
10988}
10989
10990// Used for testing structs and unions by value.
10991// Arguments in FPU registers on arm64.
10992// 5 struct arguments will exhaust available registers.
10994 // NOLINTNEXTLINE(whitespace/parens)
11005
11006 a0.a0.a0 = -1.0;
11007 a0.a1[0].a0 = 2.0;
11008 a0.a1[1].a0 = -3.0;
11009 a0.a2 = 4.0;
11010 a1.a0.a0 = -5.0;
11011 a1.a1[0].a0 = 6.0;
11012 a1.a1[1].a0 = -7.0;
11013 a1.a2 = 8.0;
11014 a2.a0.a0 = -9.0;
11015 a2.a1[0].a0 = 10.0;
11016 a2.a1[1].a0 = -11.0;
11017 a2.a2 = 12.0;
11018 a3.a0.a0 = -13.0;
11019 a3.a1[0].a0 = 14.0;
11020 a3.a1[1].a0 = -15.0;
11021 a3.a2 = 16.0;
11022 a4.a0.a0 = -17.0;
11023 a4.a1[0].a0 = 18.0;
11024 a4.a1[1].a0 = -19.0;
11025 a4.a2 = 20.0;
11026
11027 std::cout << "Calling TestPassStructStruct32BytesHomogeneousDouble2x5("
11028 << "(((" << a0.a0.a0 << "), [(" << a0.a1[0].a0 << "), ("
11029 << a0.a1[1].a0 << ")], " << a0.a2 << "), ((" << a1.a0.a0 << "), [("
11030 << a1.a1[0].a0 << "), (" << a1.a1[1].a0 << ")], " << a1.a2
11031 << "), ((" << a2.a0.a0 << "), [(" << a2.a1[0].a0 << "), ("
11032 << a2.a1[1].a0 << ")], " << a2.a2 << "), ((" << a3.a0.a0 << "), [("
11033 << a3.a1[0].a0 << "), (" << a3.a1[1].a0 << ")], " << a3.a2
11034 << "), ((" << a4.a0.a0 << "), [(" << a4.a1[0].a0 << "), ("
11035 << a4.a1[1].a0 << ")], " << a4.a2 << "))"
11036 << ")\n";
11037
11038 double result = f(a0, a1, a2, a3, a4);
11039
11040 std::cout << "result = " << result << "\n";
11041
11042 CHECK_APPROX(10.0, result);
11043
11044 // Pass argument that will make the Dart callback throw.
11045 a0.a0.a0 = 42;
11046
11047 result = f(a0, a1, a2, a3, a4);
11048
11049 CHECK_APPROX(0.0, result);
11050
11051 // Pass argument that will make the Dart callback return null.
11052 a0.a0.a0 = 84;
11053
11054 result = f(a0, a1, a2, a3, a4);
11055
11056 CHECK_APPROX(0.0, result);
11057
11058 return 0;
11059}
11060
11061// Used for testing structs and unions by value.
11062// On x64, arguments are split over FP and int registers.
11063// On x64, it will exhaust the integer registers with the 6th argument.
11064// The rest goes on the stack.
11065// On arm, arguments are 4 byte aligned.
11067 // NOLINTNEXTLINE(whitespace/parens)
11068 float (*f)(StructStruct16BytesMixed3 a0,
11088
11089 a0.a0.a0 = -1.0;
11090 a0.a1[0].a0 = 2.0;
11091 a0.a1[0].a1 = -3;
11092 a0.a1[0].a2 = 4;
11093 a0.a2[0] = -5;
11094 a0.a2[1] = 6;
11095 a1.a0.a0 = -7.0;
11096 a1.a1[0].a0 = 8.0;
11097 a1.a1[0].a1 = -9;
11098 a1.a1[0].a2 = 10;
11099 a1.a2[0] = -11;
11100 a1.a2[1] = 12;
11101 a2.a0.a0 = -13.0;
11102 a2.a1[0].a0 = 14.0;
11103 a2.a1[0].a1 = -15;
11104 a2.a1[0].a2 = 16;
11105 a2.a2[0] = -17;
11106 a2.a2[1] = 18;
11107 a3.a0.a0 = -19.0;
11108 a3.a1[0].a0 = 20.0;
11109 a3.a1[0].a1 = -21;
11110 a3.a1[0].a2 = 22;
11111 a3.a2[0] = -23;
11112 a3.a2[1] = 24;
11113 a4.a0.a0 = -25.0;
11114 a4.a1[0].a0 = 26.0;
11115 a4.a1[0].a1 = -27;
11116 a4.a1[0].a2 = 28;
11117 a4.a2[0] = -29;
11118 a4.a2[1] = 30;
11119 a5.a0.a0 = -31.0;
11120 a5.a1[0].a0 = 32.0;
11121 a5.a1[0].a1 = -33;
11122 a5.a1[0].a2 = 34;
11123 a5.a2[0] = -35;
11124 a5.a2[1] = 36;
11125 a6.a0.a0 = -37.0;
11126 a6.a1[0].a0 = 38.0;
11127 a6.a1[0].a1 = -39;
11128 a6.a1[0].a2 = 40;
11129 a6.a2[0] = -41;
11130 a6.a2[1] = 42;
11131 a7.a0.a0 = -43.0;
11132 a7.a1[0].a0 = 44.0;
11133 a7.a1[0].a1 = -45;
11134 a7.a1[0].a2 = 46;
11135 a7.a2[0] = -47;
11136 a7.a2[1] = 48;
11137 a8.a0.a0 = -49.0;
11138 a8.a1[0].a0 = 50.0;
11139 a8.a1[0].a1 = -51;
11140 a8.a1[0].a2 = 52;
11141 a8.a2[0] = -53;
11142 a8.a2[1] = 54;
11143 a9.a0.a0 = -55.0;
11144 a9.a1[0].a0 = 56.0;
11145 a9.a1[0].a1 = -57;
11146 a9.a1[0].a2 = 58;
11147 a9.a2[0] = -59;
11148 a9.a2[1] = 60;
11149
11150 std::cout << "Calling TestPassStructStruct16BytesMixed3x10("
11151 << "(((" << a0.a0.a0 << "), [(" << a0.a1[0].a0 << ", "
11152 << a0.a1[0].a1 << ", " << a0.a1[0].a2 << ")], [" << a0.a2[0] << ", "
11153 << a0.a2[1] << "]), ((" << a1.a0.a0 << "), [(" << a1.a1[0].a0
11154 << ", " << a1.a1[0].a1 << ", " << a1.a1[0].a2 << ")], [" << a1.a2[0]
11155 << ", " << a1.a2[1] << "]), ((" << a2.a0.a0 << "), [("
11156 << a2.a1[0].a0 << ", " << a2.a1[0].a1 << ", " << a2.a1[0].a2
11157 << ")], [" << a2.a2[0] << ", " << a2.a2[1] << "]), ((" << a3.a0.a0
11158 << "), [(" << a3.a1[0].a0 << ", " << a3.a1[0].a1 << ", "
11159 << a3.a1[0].a2 << ")], [" << a3.a2[0] << ", " << a3.a2[1]
11160 << "]), ((" << a4.a0.a0 << "), [(" << a4.a1[0].a0 << ", "
11161 << a4.a1[0].a1 << ", " << a4.a1[0].a2 << ")], [" << a4.a2[0] << ", "
11162 << a4.a2[1] << "]), ((" << a5.a0.a0 << "), [(" << a5.a1[0].a0
11163 << ", " << a5.a1[0].a1 << ", " << a5.a1[0].a2 << ")], [" << a5.a2[0]
11164 << ", " << a5.a2[1] << "]), ((" << a6.a0.a0 << "), [("
11165 << a6.a1[0].a0 << ", " << a6.a1[0].a1 << ", " << a6.a1[0].a2
11166 << ")], [" << a6.a2[0] << ", " << a6.a2[1] << "]), ((" << a7.a0.a0
11167 << "), [(" << a7.a1[0].a0 << ", " << a7.a1[0].a1 << ", "
11168 << a7.a1[0].a2 << ")], [" << a7.a2[0] << ", " << a7.a2[1]
11169 << "]), ((" << a8.a0.a0 << "), [(" << a8.a1[0].a0 << ", "
11170 << a8.a1[0].a1 << ", " << a8.a1[0].a2 << ")], [" << a8.a2[0] << ", "
11171 << a8.a2[1] << "]), ((" << a9.a0.a0 << "), [(" << a9.a1[0].a0
11172 << ", " << a9.a1[0].a1 << ", " << a9.a1[0].a2 << ")], [" << a9.a2[0]
11173 << ", " << a9.a2[1] << "]))"
11174 << ")\n";
11175
11176 float result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11177
11178 std::cout << "result = " << result << "\n";
11179
11180 CHECK_APPROX(30.0, result);
11181
11182 // Pass argument that will make the Dart callback throw.
11183 a0.a0.a0 = 42;
11184
11185 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11186
11187 CHECK_APPROX(0.0, result);
11188
11189 // Pass argument that will make the Dart callback return null.
11190 a0.a0.a0 = 84;
11191
11192 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11193
11194 CHECK_APPROX(0.0, result);
11195
11196 return 0;
11197}
11198
11199// Used for testing structs and unions by value.
11200// Test multi dimensional inline array struct as argument.
11202 // NOLINTNEXTLINE(whitespace/parens)
11203 uint32_t (*f)(uint8_t a0,
11205 uint8_t a2,
11207 uint8_t a4,
11209 uint8_t a6)) {
11210 uint8_t a0;
11212 uint8_t a2;
11214 uint8_t a4;
11216 uint8_t a6;
11217
11218 a0 = 1;
11219 a1.a0[0][0][0][0][0] = 2;
11220 a1.a0[0][0][0][0][1] = 3;
11221 a1.a0[0][0][0][1][0] = 4;
11222 a1.a0[0][0][0][1][1] = 5;
11223 a1.a0[0][0][1][0][0] = 6;
11224 a1.a0[0][0][1][0][1] = 7;
11225 a1.a0[0][0][1][1][0] = 8;
11226 a1.a0[0][0][1][1][1] = 9;
11227 a1.a0[0][1][0][0][0] = 10;
11228 a1.a0[0][1][0][0][1] = 11;
11229 a1.a0[0][1][0][1][0] = 12;
11230 a1.a0[0][1][0][1][1] = 13;
11231 a1.a0[0][1][1][0][0] = 14;
11232 a1.a0[0][1][1][0][1] = 15;
11233 a1.a0[0][1][1][1][0] = 16;
11234 a1.a0[0][1][1][1][1] = 17;
11235 a1.a0[1][0][0][0][0] = 18;
11236 a1.a0[1][0][0][0][1] = 19;
11237 a1.a0[1][0][0][1][0] = 20;
11238 a1.a0[1][0][0][1][1] = 21;
11239 a1.a0[1][0][1][0][0] = 22;
11240 a1.a0[1][0][1][0][1] = 23;
11241 a1.a0[1][0][1][1][0] = 24;
11242 a1.a0[1][0][1][1][1] = 25;
11243 a1.a0[1][1][0][0][0] = 26;
11244 a1.a0[1][1][0][0][1] = 27;
11245 a1.a0[1][1][0][1][0] = 28;
11246 a1.a0[1][1][0][1][1] = 29;
11247 a1.a0[1][1][1][0][0] = 30;
11248 a1.a0[1][1][1][0][1] = 31;
11249 a1.a0[1][1][1][1][0] = 32;
11250 a1.a0[1][1][1][1][1] = 33;
11251 a2 = 34;
11252 a3.a0[0][0][0] = 35;
11253 a3.a0[0][0][1] = 36;
11254 a3.a0[0][1][0] = 37;
11255 a3.a0[0][1][1] = 38;
11256 a3.a0[1][0][0] = 39;
11257 a3.a0[1][0][1] = 40;
11258 a3.a0[1][1][0] = 41;
11259 a3.a0[1][1][1] = 42;
11260 a4 = 43;
11261 a5.a0[0][0][0] = 44;
11262 a5.a0[0][0][1] = 45;
11263 a5.a0[0][1][0] = 46;
11264 a5.a0[0][1][1] = 47;
11265 a5.a0[1][0][0] = 48;
11266 a5.a0[1][0][1] = 49;
11267 a5.a0[1][1][0] = 50;
11268 a5.a0[1][1][1] = 51;
11269 a6 = 52;
11270
11271 std::cout << "Calling TestPassUint8Struct32BytesInlineArrayMultiDimensionalI("
11272 << "(" << static_cast<int>(a0) << ", ([[[[["
11273 << static_cast<int>(a1.a0[0][0][0][0][0]) << ", "
11274 << static_cast<int>(a1.a0[0][0][0][0][1]) << "], ["
11275 << static_cast<int>(a1.a0[0][0][0][1][0]) << ", "
11276 << static_cast<int>(a1.a0[0][0][0][1][1]) << "]], [["
11277 << static_cast<int>(a1.a0[0][0][1][0][0]) << ", "
11278 << static_cast<int>(a1.a0[0][0][1][0][1]) << "], ["
11279 << static_cast<int>(a1.a0[0][0][1][1][0]) << ", "
11280 << static_cast<int>(a1.a0[0][0][1][1][1]) << "]]], [[["
11281 << static_cast<int>(a1.a0[0][1][0][0][0]) << ", "
11282 << static_cast<int>(a1.a0[0][1][0][0][1]) << "], ["
11283 << static_cast<int>(a1.a0[0][1][0][1][0]) << ", "
11284 << static_cast<int>(a1.a0[0][1][0][1][1]) << "]], [["
11285 << static_cast<int>(a1.a0[0][1][1][0][0]) << ", "
11286 << static_cast<int>(a1.a0[0][1][1][0][1]) << "], ["
11287 << static_cast<int>(a1.a0[0][1][1][1][0]) << ", "
11288 << static_cast<int>(a1.a0[0][1][1][1][1]) << "]]]], [[[["
11289 << static_cast<int>(a1.a0[1][0][0][0][0]) << ", "
11290 << static_cast<int>(a1.a0[1][0][0][0][1]) << "], ["
11291 << static_cast<int>(a1.a0[1][0][0][1][0]) << ", "
11292 << static_cast<int>(a1.a0[1][0][0][1][1]) << "]], [["
11293 << static_cast<int>(a1.a0[1][0][1][0][0]) << ", "
11294 << static_cast<int>(a1.a0[1][0][1][0][1]) << "], ["
11295 << static_cast<int>(a1.a0[1][0][1][1][0]) << ", "
11296 << static_cast<int>(a1.a0[1][0][1][1][1]) << "]]], [[["
11297 << static_cast<int>(a1.a0[1][1][0][0][0]) << ", "
11298 << static_cast<int>(a1.a0[1][1][0][0][1]) << "], ["
11299 << static_cast<int>(a1.a0[1][1][0][1][0]) << ", "
11300 << static_cast<int>(a1.a0[1][1][0][1][1]) << "]], [["
11301 << static_cast<int>(a1.a0[1][1][1][0][0]) << ", "
11302 << static_cast<int>(a1.a0[1][1][1][0][1]) << "], ["
11303 << static_cast<int>(a1.a0[1][1][1][1][0]) << ", "
11304 << static_cast<int>(a1.a0[1][1][1][1][1]) << "]]]]]), "
11305 << static_cast<int>(a2) << ", ([[["
11306 << static_cast<int>(a3.a0[0][0][0]) << ", "
11307 << static_cast<int>(a3.a0[0][0][1]) << "], ["
11308 << static_cast<int>(a3.a0[0][1][0]) << ", "
11309 << static_cast<int>(a3.a0[0][1][1]) << "]], [["
11310 << static_cast<int>(a3.a0[1][0][0]) << ", "
11311 << static_cast<int>(a3.a0[1][0][1]) << "], ["
11312 << static_cast<int>(a3.a0[1][1][0]) << ", "
11313 << static_cast<int>(a3.a0[1][1][1]) << "]]]), "
11314 << static_cast<int>(a4) << ", ([[["
11315 << static_cast<int>(a5.a0[0][0][0]) << ", "
11316 << static_cast<int>(a5.a0[0][0][1]) << "], ["
11317 << static_cast<int>(a5.a0[0][1][0]) << ", "
11318 << static_cast<int>(a5.a0[0][1][1]) << "]], [["
11319 << static_cast<int>(a5.a0[1][0][0]) << ", "
11320 << static_cast<int>(a5.a0[1][0][1]) << "], ["
11321 << static_cast<int>(a5.a0[1][1][0]) << ", "
11322 << static_cast<int>(a5.a0[1][1][1]) << "]]]), "
11323 << static_cast<int>(a6) << ")"
11324 << ")\n";
11325
11326 uint32_t result = f(a0, a1, a2, a3, a4, a5, a6);
11327
11328 std::cout << "result = " << result << "\n";
11329
11330 CHECK_EQ(1378, result);
11331
11332 // Pass argument that will make the Dart callback throw.
11333 a0 = 42;
11334
11335 result = f(a0, a1, a2, a3, a4, a5, a6);
11336
11337 CHECK_EQ(0, result);
11338
11339 // Pass argument that will make the Dart callback return null.
11340 a0 = 84;
11341
11342 result = f(a0, a1, a2, a3, a4, a5, a6);
11343
11344 CHECK_EQ(0, result);
11345
11346 return 0;
11347}
11348
11349// Used for testing structs and unions by value.
11350// Test struct in multi dimensional inline array.
11352 // NOLINTNEXTLINE(whitespace/parens)
11353 uint32_t (*f)(uint8_t a0,
11355 uint8_t a2)) {
11356 uint8_t a0;
11358 uint8_t a2;
11359
11360 a0 = 1;
11361 a1.a0[0][0].a0 = 2;
11362 a1.a0[0][1].a0 = -3;
11363 a1.a0[1][0].a0 = 4;
11364 a1.a0[1][1].a0 = -5;
11365 a2 = 6;
11366
11367 std::cout << "Calling TestPassUint8Struct4BytesInlineArrayMultiDimensionalIn("
11368 << "(" << static_cast<int>(a0) << ", ([[("
11369 << static_cast<int>(a1.a0[0][0].a0) << "), ("
11370 << static_cast<int>(a1.a0[0][1].a0) << ")], [("
11371 << static_cast<int>(a1.a0[1][0].a0) << "), ("
11372 << static_cast<int>(a1.a0[1][1].a0) << ")]]), "
11373 << static_cast<int>(a2) << ")"
11374 << ")\n";
11375
11376 uint32_t result = f(a0, a1, a2);
11377
11378 std::cout << "result = " << result << "\n";
11379
11380 CHECK_EQ(5, result);
11381
11382 // Pass argument that will make the Dart callback throw.
11383 a0 = 42;
11384
11385 result = f(a0, a1, a2);
11386
11387 CHECK_EQ(0, result);
11388
11389 // Pass argument that will make the Dart callback return null.
11390 a0 = 84;
11391
11392 result = f(a0, a1, a2);
11393
11394 CHECK_EQ(0, result);
11395
11396 return 0;
11397}
11398
11399// Used for testing structs and unions by value.
11400// Small struct with mis-aligned member.
11402 // NOLINTNEXTLINE(whitespace/parens)
11403 int64_t (*f)(Struct3BytesPackedInt a0,
11413 Struct3BytesPackedInt a0 = {};
11414 Struct3BytesPackedInt a1 = {};
11415 Struct3BytesPackedInt a2 = {};
11416 Struct3BytesPackedInt a3 = {};
11417 Struct3BytesPackedInt a4 = {};
11418 Struct3BytesPackedInt a5 = {};
11419 Struct3BytesPackedInt a6 = {};
11420 Struct3BytesPackedInt a7 = {};
11421 Struct3BytesPackedInt a8 = {};
11422 Struct3BytesPackedInt a9 = {};
11423
11424 a0.a0 = -1;
11425 a0.a1 = 2;
11426 a1.a0 = -3;
11427 a1.a1 = 4;
11428 a2.a0 = -5;
11429 a2.a1 = 6;
11430 a3.a0 = -7;
11431 a3.a1 = 8;
11432 a4.a0 = -9;
11433 a4.a1 = 10;
11434 a5.a0 = -11;
11435 a5.a1 = 12;
11436 a6.a0 = -13;
11437 a6.a1 = 14;
11438 a7.a0 = -15;
11439 a7.a1 = 16;
11440 a8.a0 = -17;
11441 a8.a1 = 18;
11442 a9.a0 = -19;
11443 a9.a1 = 20;
11444
11445 std::cout << "Calling TestPassStruct3BytesPackedIntx10("
11446 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << "), ("
11447 << static_cast<int>(a1.a0) << ", " << a1.a1 << "), ("
11448 << static_cast<int>(a2.a0) << ", " << a2.a1 << "), ("
11449 << static_cast<int>(a3.a0) << ", " << a3.a1 << "), ("
11450 << static_cast<int>(a4.a0) << ", " << a4.a1 << "), ("
11451 << static_cast<int>(a5.a0) << ", " << a5.a1 << "), ("
11452 << static_cast<int>(a6.a0) << ", " << a6.a1 << "), ("
11453 << static_cast<int>(a7.a0) << ", " << a7.a1 << "), ("
11454 << static_cast<int>(a8.a0) << ", " << a8.a1 << "), ("
11455 << static_cast<int>(a9.a0) << ", " << a9.a1 << "))"
11456 << ")\n";
11457
11458 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11459
11460 std::cout << "result = " << result << "\n";
11461
11462 CHECK_EQ(10, result);
11463
11464 // Pass argument that will make the Dart callback throw.
11465 a0.a0 = 42;
11466
11467 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11468
11469 CHECK_EQ(0, result);
11470
11471 // Pass argument that will make the Dart callback return null.
11472 a0.a0 = 84;
11473
11474 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11475
11476 CHECK_EQ(0, result);
11477
11478 return 0;
11479}
11480
11481// Used for testing structs and unions by value.
11482// Struct with mis-aligned member.
11484 // NOLINTNEXTLINE(whitespace/parens)
11485 int64_t (*f)(Struct8BytesPackedInt a0,
11495 Struct8BytesPackedInt a0 = {};
11496 Struct8BytesPackedInt a1 = {};
11497 Struct8BytesPackedInt a2 = {};
11498 Struct8BytesPackedInt a3 = {};
11499 Struct8BytesPackedInt a4 = {};
11500 Struct8BytesPackedInt a5 = {};
11501 Struct8BytesPackedInt a6 = {};
11502 Struct8BytesPackedInt a7 = {};
11503 Struct8BytesPackedInt a8 = {};
11504 Struct8BytesPackedInt a9 = {};
11505
11506 a0.a0 = 1;
11507 a0.a1 = 2;
11508 a0.a2 = 3;
11509 a0.a3 = 4;
11510 a0.a4 = 5;
11511 a1.a0 = 6;
11512 a1.a1 = 7;
11513 a1.a2 = 8;
11514 a1.a3 = 9;
11515 a1.a4 = 10;
11516 a2.a0 = 11;
11517 a2.a1 = 12;
11518 a2.a2 = 13;
11519 a2.a3 = 14;
11520 a2.a4 = 15;
11521 a3.a0 = 16;
11522 a3.a1 = 17;
11523 a3.a2 = 18;
11524 a3.a3 = 19;
11525 a3.a4 = 20;
11526 a4.a0 = 21;
11527 a4.a1 = 22;
11528 a4.a2 = 23;
11529 a4.a3 = 24;
11530 a4.a4 = 25;
11531 a5.a0 = 26;
11532 a5.a1 = 27;
11533 a5.a2 = 28;
11534 a5.a3 = 29;
11535 a5.a4 = 30;
11536 a6.a0 = 31;
11537 a6.a1 = 32;
11538 a6.a2 = 33;
11539 a6.a3 = 34;
11540 a6.a4 = 35;
11541 a7.a0 = 36;
11542 a7.a1 = 37;
11543 a7.a2 = 38;
11544 a7.a3 = 39;
11545 a7.a4 = 40;
11546 a8.a0 = 41;
11547 a8.a1 = 42;
11548 a8.a2 = 43;
11549 a8.a3 = 44;
11550 a8.a4 = 45;
11551 a9.a0 = 46;
11552 a9.a1 = 47;
11553 a9.a2 = 48;
11554 a9.a3 = 49;
11555 a9.a4 = 50;
11556
11557 std::cout << "Calling TestPassStruct8BytesPackedIntx10("
11558 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
11559 << static_cast<int>(a0.a2) << ", " << static_cast<int>(a0.a3)
11560 << ", " << static_cast<int>(a0.a4) << "), ("
11561 << static_cast<int>(a1.a0) << ", " << a1.a1 << ", "
11562 << static_cast<int>(a1.a2) << ", " << static_cast<int>(a1.a3)
11563 << ", " << static_cast<int>(a1.a4) << "), ("
11564 << static_cast<int>(a2.a0) << ", " << a2.a1 << ", "
11565 << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3)
11566 << ", " << static_cast<int>(a2.a4) << "), ("
11567 << static_cast<int>(a3.a0) << ", " << a3.a1 << ", "
11568 << static_cast<int>(a3.a2) << ", " << static_cast<int>(a3.a3)
11569 << ", " << static_cast<int>(a3.a4) << "), ("
11570 << static_cast<int>(a4.a0) << ", " << a4.a1 << ", "
11571 << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3)
11572 << ", " << static_cast<int>(a4.a4) << "), ("
11573 << static_cast<int>(a5.a0) << ", " << a5.a1 << ", "
11574 << static_cast<int>(a5.a2) << ", " << static_cast<int>(a5.a3)
11575 << ", " << static_cast<int>(a5.a4) << "), ("
11576 << static_cast<int>(a6.a0) << ", " << a6.a1 << ", "
11577 << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3)
11578 << ", " << static_cast<int>(a6.a4) << "), ("
11579 << static_cast<int>(a7.a0) << ", " << a7.a1 << ", "
11580 << static_cast<int>(a7.a2) << ", " << static_cast<int>(a7.a3)
11581 << ", " << static_cast<int>(a7.a4) << "), ("
11582 << static_cast<int>(a8.a0) << ", " << a8.a1 << ", "
11583 << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3)
11584 << ", " << static_cast<int>(a8.a4) << "), ("
11585 << static_cast<int>(a9.a0) << ", " << a9.a1 << ", "
11586 << static_cast<int>(a9.a2) << ", " << static_cast<int>(a9.a3)
11587 << ", " << static_cast<int>(a9.a4) << "))"
11588 << ")\n";
11589
11590 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11591
11592 std::cout << "result = " << result << "\n";
11593
11594 CHECK_EQ(1275, result);
11595
11596 // Pass argument that will make the Dart callback throw.
11597 a0.a0 = 42;
11598
11599 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11600
11601 CHECK_EQ(0, result);
11602
11603 // Pass argument that will make the Dart callback return null.
11604 a0.a0 = 84;
11605
11606 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11607
11608 CHECK_EQ(0, result);
11609
11610 return 0;
11611}
11612
11613// Used for testing structs and unions by value.
11614// Struct with mis-aligned member.
11615// Tests backfilling of CPU and FPU registers.
11617 // NOLINTNEXTLINE(whitespace/parens)
11618 double (*f)(Struct9BytesPackedMixed a0,
11628 double a10,
11629 int32_t a11,
11630 int32_t a12)) {
11641 double a10;
11642 int32_t a11;
11643 int32_t a12;
11644
11645 a0.a0 = 1;
11646 a0.a1 = 2.0;
11647 a1.a0 = 3;
11648 a1.a1 = 4.0;
11649 a2.a0 = 5;
11650 a2.a1 = 6.0;
11651 a3.a0 = 7;
11652 a3.a1 = 8.0;
11653 a4.a0 = 9;
11654 a4.a1 = 10.0;
11655 a5.a0 = 11;
11656 a5.a1 = 12.0;
11657 a6.a0 = 13;
11658 a6.a1 = 14.0;
11659 a7.a0 = 15;
11660 a7.a1 = 16.0;
11661 a8.a0 = 17;
11662 a8.a1 = 18.0;
11663 a9.a0 = 19;
11664 a9.a1 = 20.0;
11665 a10 = -21.0;
11666 a11 = 22;
11667 a12 = -23;
11668
11669 std::cout << "Calling TestPassStruct9BytesPackedMixedx10DoubleInt32x2("
11670 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << "), ("
11671 << static_cast<int>(a1.a0) << ", " << a1.a1 << "), ("
11672 << static_cast<int>(a2.a0) << ", " << a2.a1 << "), ("
11673 << static_cast<int>(a3.a0) << ", " << a3.a1 << "), ("
11674 << static_cast<int>(a4.a0) << ", " << a4.a1 << "), ("
11675 << static_cast<int>(a5.a0) << ", " << a5.a1 << "), ("
11676 << static_cast<int>(a6.a0) << ", " << a6.a1 << "), ("
11677 << static_cast<int>(a7.a0) << ", " << a7.a1 << "), ("
11678 << static_cast<int>(a8.a0) << ", " << a8.a1 << "), ("
11679 << static_cast<int>(a9.a0) << ", " << a9.a1 << "), " << a10 << ", "
11680 << a11 << ", " << a12 << ")"
11681 << ")\n";
11682
11683 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
11684
11685 std::cout << "result = " << result << "\n";
11686
11687 CHECK_APPROX(188.0, result);
11688
11689 // Pass argument that will make the Dart callback throw.
11690 a0.a0 = 42;
11691
11692 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
11693
11694 CHECK_APPROX(0.0, result);
11695
11696 // Pass argument that will make the Dart callback return null.
11697 a0.a0 = 84;
11698
11699 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
11700
11701 CHECK_APPROX(0.0, result);
11702
11703 return 0;
11704}
11705
11706// Used for testing structs and unions by value.
11707// This packed struct happens to have only aligned members.
11709 // NOLINTNEXTLINE(whitespace/parens)
11710 double (*f)(Struct5BytesPackedMixed a0)) {
11712
11713 a0.a0 = -1.0;
11714 a0.a1 = 2;
11715
11716 std::cout << "Calling TestPassStruct5BytesPackedMixed("
11717 << "((" << a0.a0 << ", " << static_cast<int>(a0.a1) << "))"
11718 << ")\n";
11719
11720 double result = f(a0);
11721
11722 std::cout << "result = " << result << "\n";
11723
11724 CHECK_APPROX(1.0, result);
11725
11726 // Pass argument that will make the Dart callback throw.
11727 a0.a0 = 42;
11728
11729 result = f(a0);
11730
11731 CHECK_APPROX(0.0, result);
11732
11733 // Pass argument that will make the Dart callback return null.
11734 a0.a0 = 84;
11735
11736 result = f(a0);
11737
11738 CHECK_APPROX(0.0, result);
11739
11740 return 0;
11741}
11742
11743// Used for testing structs and unions by value.
11744// Check alignment of packed struct in non-packed struct.
11746 // NOLINTNEXTLINE(whitespace/parens)
11749
11750 a0.a0 = 1;
11751 a0.a1.a0 = 2.0;
11752 a0.a1.a1 = 3;
11753
11754 std::cout << "Calling TestPassStructNestedAlignmentStruct5BytesPackedMixed("
11755 << "((" << static_cast<int>(a0.a0) << ", (" << a0.a1.a0 << ", "
11756 << static_cast<int>(a0.a1.a1) << ")))"
11757 << ")\n";
11758
11759 double result = f(a0);
11760
11761 std::cout << "result = " << result << "\n";
11762
11763 CHECK_APPROX(6.0, result);
11764
11765 // Pass argument that will make the Dart callback throw.
11766 a0.a0 = 42;
11767
11768 result = f(a0);
11769
11770 CHECK_APPROX(0.0, result);
11771
11772 // Pass argument that will make the Dart callback return null.
11773 a0.a0 = 84;
11774
11775 result = f(a0);
11776
11777 CHECK_APPROX(0.0, result);
11778
11779 return 0;
11780}
11781
11782// Used for testing structs and unions by value.
11783// Check alignment of packed struct array in non-packed struct.
11785 // NOLINTNEXTLINE(whitespace/parens)
11786 double (*f)(Struct6BytesInlineArrayInt a0)) {
11788
11789 a0.a0[0].a0 = -1;
11790 a0.a0[0].a1 = 2;
11791 a0.a0[1].a0 = -3;
11792 a0.a0[1].a1 = 4;
11793
11794 std::cout << "Calling TestPassStruct6BytesInlineArrayInt("
11795 << "(([(" << static_cast<int>(a0.a0[0].a0) << ", " << a0.a0[0].a1
11796 << "), (" << static_cast<int>(a0.a0[1].a0) << ", " << a0.a0[1].a1
11797 << ")]))"
11798 << ")\n";
11799
11800 double result = f(a0);
11801
11802 std::cout << "result = " << result << "\n";
11803
11804 CHECK_APPROX(2.0, result);
11805
11806 // Pass argument that will make the Dart callback throw.
11807 a0.a0[0].a0 = 42;
11808
11809 result = f(a0);
11810
11811 CHECK_APPROX(0.0, result);
11812
11813 // Pass argument that will make the Dart callback return null.
11814 a0.a0[0].a0 = 84;
11815
11816 result = f(a0);
11817
11818 CHECK_APPROX(0.0, result);
11819
11820 return 0;
11821}
11822
11823// Used for testing structs and unions by value.
11824// Check alignment of packed struct array in non-packed struct.
11826 // NOLINTNEXTLINE(whitespace/parens)
11827 double (*f)(Struct15BytesInlineArrayMixed a0)) {
11829
11830 a0.a0[0].a0 = -1.0;
11831 a0.a0[0].a1 = 2;
11832 a0.a0[1].a0 = -3.0;
11833 a0.a0[1].a1 = 4;
11834 a0.a0[2].a0 = -5.0;
11835 a0.a0[2].a1 = 6;
11836
11837 std::cout << "Calling TestPassStruct15BytesInlineArrayMixed("
11838 << "(([(" << a0.a0[0].a0 << ", " << static_cast<int>(a0.a0[0].a1)
11839 << "), (" << a0.a0[1].a0 << ", " << static_cast<int>(a0.a0[1].a1)
11840 << "), (" << a0.a0[2].a0 << ", " << static_cast<int>(a0.a0[2].a1)
11841 << ")]))"
11842 << ")\n";
11843
11844 double result = f(a0);
11845
11846 std::cout << "result = " << result << "\n";
11847
11848 CHECK_APPROX(3.0, result);
11849
11850 // Pass argument that will make the Dart callback throw.
11851 a0.a0[0].a0 = 42;
11852
11853 result = f(a0);
11854
11855 CHECK_APPROX(0.0, result);
11856
11857 // Pass argument that will make the Dart callback return null.
11858 a0.a0[0].a0 = 84;
11859
11860 result = f(a0);
11861
11862 CHECK_APPROX(0.0, result);
11863
11864 return 0;
11865}
11866
11867// Used for testing structs and unions by value.
11868// Check placement of mixed integer/float union.
11870 // NOLINTNEXTLINE(whitespace/parens)
11871 double (*f)(Union4BytesMixed a0,
11880 Union4BytesMixed a9)) {
11881 Union4BytesMixed a0 = {};
11882 Union4BytesMixed a1 = {};
11883 Union4BytesMixed a2 = {};
11884 Union4BytesMixed a3 = {};
11885 Union4BytesMixed a4 = {};
11886 Union4BytesMixed a5 = {};
11887 Union4BytesMixed a6 = {};
11888 Union4BytesMixed a7 = {};
11889 Union4BytesMixed a8 = {};
11890 Union4BytesMixed a9 = {};
11891
11892 a0.a0 = 1;
11893 a1.a0 = 2;
11894 a2.a0 = 3;
11895 a3.a0 = 4;
11896 a4.a0 = 5;
11897 a5.a0 = 6;
11898 a6.a0 = 7;
11899 a7.a0 = 8;
11900 a8.a0 = 9;
11901 a9.a0 = 10;
11902
11903 std::cout << "Calling TestPassUnion4BytesMixedx10("
11904 << "((" << a0.a0 << "), (" << a1.a0 << "), (" << a2.a0 << "), ("
11905 << a3.a0 << "), (" << a4.a0 << "), (" << a5.a0 << "), (" << a6.a0
11906 << "), (" << a7.a0 << "), (" << a8.a0 << "), (" << a9.a0 << "))"
11907 << ")\n";
11908
11909 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11910
11911 std::cout << "result = " << result << "\n";
11912
11913 CHECK_APPROX(55.0, result);
11914
11915 // Pass argument that will make the Dart callback throw.
11916 a0.a0 = 42;
11917
11918 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11919
11920 CHECK_APPROX(0.0, result);
11921
11922 // Pass argument that will make the Dart callback return null.
11923 a0.a0 = 84;
11924
11925 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11926
11927 CHECK_APPROX(0.0, result);
11928
11929 return 0;
11930}
11931
11932// Used for testing structs and unions by value.
11933// Check placement of mixed floats union.
11935 // NOLINTNEXTLINE(whitespace/parens)
11936 double (*f)(Union8BytesNestedFloat a0,
11946 Union8BytesNestedFloat a0 = {};
11947 Union8BytesNestedFloat a1 = {};
11948 Union8BytesNestedFloat a2 = {};
11949 Union8BytesNestedFloat a3 = {};
11950 Union8BytesNestedFloat a4 = {};
11951 Union8BytesNestedFloat a5 = {};
11952 Union8BytesNestedFloat a6 = {};
11953 Union8BytesNestedFloat a7 = {};
11954 Union8BytesNestedFloat a8 = {};
11955 Union8BytesNestedFloat a9 = {};
11956
11957 a0.a0 = -1.0;
11958 a1.a0 = 2.0;
11959 a2.a0 = -3.0;
11960 a3.a0 = 4.0;
11961 a4.a0 = -5.0;
11962 a5.a0 = 6.0;
11963 a6.a0 = -7.0;
11964 a7.a0 = 8.0;
11965 a8.a0 = -9.0;
11966 a9.a0 = 10.0;
11967
11968 std::cout << "Calling TestPassUnion8BytesNestedFloatx10("
11969 << "((" << a0.a0 << "), (" << a1.a0 << "), (" << a2.a0 << "), ("
11970 << a3.a0 << "), (" << a4.a0 << "), (" << a5.a0 << "), (" << a6.a0
11971 << "), (" << a7.a0 << "), (" << a8.a0 << "), (" << a9.a0 << "))"
11972 << ")\n";
11973
11974 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11975
11976 std::cout << "result = " << result << "\n";
11977
11978 CHECK_APPROX(5.0, result);
11979
11980 // Pass argument that will make the Dart callback throw.
11981 a0.a0 = 42;
11982
11983 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11984
11985 CHECK_APPROX(0.0, result);
11986
11987 // Pass argument that will make the Dart callback return null.
11988 a0.a0 = 84;
11989
11990 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11991
11992 CHECK_APPROX(0.0, result);
11993
11994 return 0;
11995}
11996
11997// Used for testing structs and unions by value.
11998// Mixed-size union argument.
12000 // NOLINTNEXTLINE(whitespace/parens)
12001 double (*f)(Union9BytesNestedInt a0,
12011 Union9BytesNestedInt a0 = {};
12012 Union9BytesNestedInt a1 = {};
12013 Union9BytesNestedInt a2 = {};
12014 Union9BytesNestedInt a3 = {};
12015 Union9BytesNestedInt a4 = {};
12016 Union9BytesNestedInt a5 = {};
12017 Union9BytesNestedInt a6 = {};
12018 Union9BytesNestedInt a7 = {};
12019 Union9BytesNestedInt a8 = {};
12020 Union9BytesNestedInt a9 = {};
12021
12022 a0.a0.a0 = -1;
12023 a0.a0.a1 = 2;
12024 a0.a0.a2 = -3;
12025 a1.a0.a0 = 4;
12026 a1.a0.a1 = -5;
12027 a1.a0.a2 = 6;
12028 a2.a0.a0 = -7;
12029 a2.a0.a1 = 8;
12030 a2.a0.a2 = -9;
12031 a3.a0.a0 = 10;
12032 a3.a0.a1 = -11;
12033 a3.a0.a2 = 12;
12034 a4.a0.a0 = -13;
12035 a4.a0.a1 = 14;
12036 a4.a0.a2 = -15;
12037 a5.a0.a0 = 16;
12038 a5.a0.a1 = -17;
12039 a5.a0.a2 = 18;
12040 a6.a0.a0 = -19;
12041 a6.a0.a1 = 20;
12042 a6.a0.a2 = -21;
12043 a7.a0.a0 = 22;
12044 a7.a0.a1 = -23;
12045 a7.a0.a2 = 24;
12046 a8.a0.a0 = -25;
12047 a8.a0.a1 = 26;
12048 a8.a0.a2 = -27;
12049 a9.a0.a0 = 28;
12050 a9.a0.a1 = -29;
12051 a9.a0.a2 = 30;
12052
12053 std::cout << "Calling TestPassUnion9BytesNestedIntx10("
12054 << "(((" << a0.a0.a0 << ", " << a0.a0.a1 << ", " << a0.a0.a2
12055 << ")), ((" << a1.a0.a0 << ", " << a1.a0.a1 << ", " << a1.a0.a2
12056 << ")), ((" << a2.a0.a0 << ", " << a2.a0.a1 << ", " << a2.a0.a2
12057 << ")), ((" << a3.a0.a0 << ", " << a3.a0.a1 << ", " << a3.a0.a2
12058 << ")), ((" << a4.a0.a0 << ", " << a4.a0.a1 << ", " << a4.a0.a2
12059 << ")), ((" << a5.a0.a0 << ", " << a5.a0.a1 << ", " << a5.a0.a2
12060 << ")), ((" << a6.a0.a0 << ", " << a6.a0.a1 << ", " << a6.a0.a2
12061 << ")), ((" << a7.a0.a0 << ", " << a7.a0.a1 << ", " << a7.a0.a2
12062 << ")), ((" << a8.a0.a0 << ", " << a8.a0.a1 << ", " << a8.a0.a2
12063 << ")), ((" << a9.a0.a0 << ", " << a9.a0.a1 << ", " << a9.a0.a2
12064 << ")))"
12065 << ")\n";
12066
12067 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
12068
12069 std::cout << "result = " << result << "\n";
12070
12071 CHECK_APPROX(15.0, result);
12072
12073 // Pass argument that will make the Dart callback throw.
12074 a0.a0.a0 = 42;
12075
12076 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
12077
12078 CHECK_APPROX(0.0, result);
12079
12080 // Pass argument that will make the Dart callback return null.
12081 a0.a0.a0 = 84;
12082
12083 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
12084
12085 CHECK_APPROX(0.0, result);
12086
12087 return 0;
12088}
12089
12090// Used for testing structs and unions by value.
12091// Union with homogenous floats.
12093 // NOLINTNEXTLINE(whitespace/parens)
12114
12115 a0.a0[0] = -1.0;
12116 a0.a0[1] = 2.0;
12117 a0.a0[2] = -3.0;
12118 a0.a0[3] = 4.0;
12119 a1.a0[0] = -5.0;
12120 a1.a0[1] = 6.0;
12121 a1.a0[2] = -7.0;
12122 a1.a0[3] = 8.0;
12123 a2.a0[0] = -9.0;
12124 a2.a0[1] = 10.0;
12125 a2.a0[2] = -11.0;
12126 a2.a0[3] = 12.0;
12127 a3.a0[0] = -13.0;
12128 a3.a0[1] = 14.0;
12129 a3.a0[2] = -15.0;
12130 a3.a0[3] = 16.0;
12131 a4.a0[0] = -17.0;
12132 a4.a0[1] = 18.0;
12133 a4.a0[2] = -19.0;
12134 a4.a0[3] = 20.0;
12135 a5.a0[0] = -21.0;
12136 a5.a0[1] = 22.0;
12137 a5.a0[2] = -23.0;
12138 a5.a0[3] = 24.0;
12139 a6.a0[0] = -25.0;
12140 a6.a0[1] = 26.0;
12141 a6.a0[2] = -27.0;
12142 a6.a0[3] = 28.0;
12143 a7.a0[0] = -29.0;
12144 a7.a0[1] = 30.0;
12145 a7.a0[2] = -31.0;
12146 a7.a0[3] = 32.0;
12147 a8.a0[0] = -33.0;
12148 a8.a0[1] = 34.0;
12149 a8.a0[2] = -35.0;
12150 a8.a0[3] = 36.0;
12151 a9.a0[0] = -37.0;
12152 a9.a0[1] = 38.0;
12153 a9.a0[2] = -39.0;
12154 a9.a0[3] = 40.0;
12155
12156 std::cout << "Calling TestPassUnion16BytesNestedInlineArrayFloatx10("
12157 << "(([" << a0.a0[0] << ", " << a0.a0[1] << ", " << a0.a0[2] << ", "
12158 << a0.a0[3] << "]), ([" << a1.a0[0] << ", " << a1.a0[1] << ", "
12159 << a1.a0[2] << ", " << a1.a0[3] << "]), ([" << a2.a0[0] << ", "
12160 << a2.a0[1] << ", " << a2.a0[2] << ", " << a2.a0[3] << "]), (["
12161 << a3.a0[0] << ", " << a3.a0[1] << ", " << a3.a0[2] << ", "
12162 << a3.a0[3] << "]), ([" << a4.a0[0] << ", " << a4.a0[1] << ", "
12163 << a4.a0[2] << ", " << a4.a0[3] << "]), ([" << a5.a0[0] << ", "
12164 << a5.a0[1] << ", " << a5.a0[2] << ", " << a5.a0[3] << "]), (["
12165 << a6.a0[0] << ", " << a6.a0[1] << ", " << a6.a0[2] << ", "
12166 << a6.a0[3] << "]), ([" << a7.a0[0] << ", " << a7.a0[1] << ", "
12167 << a7.a0[2] << ", " << a7.a0[3] << "]), ([" << a8.a0[0] << ", "
12168 << a8.a0[1] << ", " << a8.a0[2] << ", " << a8.a0[3] << "]), (["
12169 << a9.a0[0] << ", " << a9.a0[1] << ", " << a9.a0[2] << ", "
12170 << a9.a0[3] << "]))"
12171 << ")\n";
12172
12173 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
12174
12175 std::cout << "result = " << result << "\n";
12176
12177 CHECK_APPROX(20.0, result);
12178
12179 // Pass argument that will make the Dart callback throw.
12180 a0.a0[0] = 42;
12181
12182 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
12183
12184 CHECK_APPROX(0.0, result);
12185
12186 // Pass argument that will make the Dart callback return null.
12187 a0.a0[0] = 84;
12188
12189 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
12190
12191 CHECK_APPROX(0.0, result);
12192
12193 return 0;
12194}
12195
12196// Used for testing structs and unions by value.
12197// Union with homogenous floats.
12199 // NOLINTNEXTLINE(whitespace/parens)
12200 double (*f)(Union16BytesNestedFloat a0,
12220
12221 a0.a0.a0 = -1.0;
12222 a0.a0.a1 = 2.0;
12223 a1.a0.a0 = -3.0;
12224 a1.a0.a1 = 4.0;
12225 a2.a0.a0 = -5.0;
12226 a2.a0.a1 = 6.0;
12227 a3.a0.a0 = -7.0;
12228 a3.a0.a1 = 8.0;
12229 a4.a0.a0 = -9.0;
12230 a4.a0.a1 = 10.0;
12231 a5.a0.a0 = -11.0;
12232 a5.a0.a1 = 12.0;
12233 a6.a0.a0 = -13.0;
12234 a6.a0.a1 = 14.0;
12235 a7.a0.a0 = -15.0;
12236 a7.a0.a1 = 16.0;
12237 a8.a0.a0 = -17.0;
12238 a8.a0.a1 = 18.0;
12239 a9.a0.a0 = -19.0;
12240 a9.a0.a1 = 20.0;
12241
12242 std::cout << "Calling TestPassUnion16BytesNestedFloatx10("
12243 << "(((" << a0.a0.a0 << ", " << a0.a0.a1 << ")), ((" << a1.a0.a0
12244 << ", " << a1.a0.a1 << ")), ((" << a2.a0.a0 << ", " << a2.a0.a1
12245 << ")), ((" << a3.a0.a0 << ", " << a3.a0.a1 << ")), ((" << a4.a0.a0
12246 << ", " << a4.a0.a1 << ")), ((" << a5.a0.a0 << ", " << a5.a0.a1
12247 << ")), ((" << a6.a0.a0 << ", " << a6.a0.a1 << ")), ((" << a7.a0.a0
12248 << ", " << a7.a0.a1 << ")), ((" << a8.a0.a0 << ", " << a8.a0.a1
12249 << ")), ((" << a9.a0.a0 << ", " << a9.a0.a1 << ")))"
12250 << ")\n";
12251
12252 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
12253
12254 std::cout << "result = " << result << "\n";
12255
12256 CHECK_APPROX(10.0, result);
12257
12258 // Pass argument that will make the Dart callback throw.
12259 a0.a0.a0 = 42;
12260
12261 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
12262
12263 CHECK_APPROX(0.0, result);
12264
12265 // Pass argument that will make the Dart callback return null.
12266 a0.a0.a0 = 84;
12267
12268 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
12269
12270 CHECK_APPROX(0.0, result);
12271
12272 return 0;
12273}
12274
12275// Used for testing structs and unions by value.
12276// Passing bools and a struct with bools.
12277// Exhausts the registers to test bools and the bool struct alignment on the
12278// stack.
12280 // NOLINTNEXTLINE(whitespace/parens)
12281 int32_t (*f)(uint8_t a0,
12282 bool a1,
12283 bool a2,
12284 bool a3,
12285 bool a4,
12286 bool a5,
12287 bool a6,
12288 bool a7,
12289 bool a8,
12290 bool a9,
12292 bool a11)) {
12293 uint8_t a0;
12294 bool a1;
12295 bool a2;
12296 bool a3;
12297 bool a4;
12298 bool a5;
12299 bool a6;
12300 bool a7;
12301 bool a8;
12302 bool a9;
12304 bool a11;
12305
12306 a0 = 1;
12307 a1 = false;
12308 a2 = true;
12309 a3 = false;
12310 a4 = true;
12311 a5 = false;
12312 a6 = true;
12313 a7 = false;
12314 a8 = true;
12315 a9 = false;
12316 a10.a0 = true;
12317 a10.a1 = false;
12318 a10.a2 = true;
12319 a10.a3 = false;
12320 a10.a4 = true;
12321 a10.a5 = false;
12322 a10.a6 = true;
12323 a10.a7 = false;
12324 a10.a8 = true;
12325 a10.a9 = false;
12326 a11 = true;
12327
12328 std::cout << "Calling TestPassUint8Boolx9Struct10BytesHomogeneousBoolBool("
12329 << "(" << static_cast<int>(a0) << ", " << a1 << ", " << a2 << ", "
12330 << a3 << ", " << a4 << ", " << a5 << ", " << a6 << ", " << a7
12331 << ", " << a8 << ", " << a9 << ", (" << a10.a0 << ", " << a10.a1
12332 << ", " << a10.a2 << ", " << a10.a3 << ", " << a10.a4 << ", "
12333 << a10.a5 << ", " << a10.a6 << ", " << a10.a7 << ", " << a10.a8
12334 << ", " << a10.a9 << "), " << a11 << ")"
12335 << ")\n";
12336
12337 int32_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
12338
12339 std::cout << "result = " << result << "\n";
12340
12341 CHECK_EQ(11, result);
12342
12343 // Pass argument that will make the Dart callback throw.
12344 a0 = 42;
12345
12346 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
12347
12348 CHECK_EQ(0, result);
12349
12350 // Pass argument that will make the Dart callback return null.
12351 a0 = 84;
12352
12353 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
12354
12355 CHECK_EQ(0, result);
12356
12357 return 0;
12358}
12359
12360// Used for testing structs and unions by value.
12361// Passing bools and a struct with bools.
12362// Exhausts the registers to test bools and the bool struct alignment on the
12363// stack.
12365 // NOLINTNEXTLINE(whitespace/parens)
12366 int32_t (*f)(uint8_t a0,
12367 bool a1,
12368 bool a2,
12369 bool a3,
12370 bool a4,
12371 bool a5,
12372 bool a6,
12373 bool a7,
12374 bool a8,
12375 bool a9,
12377 bool a11)) {
12378 uint8_t a0;
12379 bool a1;
12380 bool a2;
12381 bool a3;
12382 bool a4;
12383 bool a5;
12384 bool a6;
12385 bool a7;
12386 bool a8;
12387 bool a9;
12389 bool a11;
12390
12391 a0 = 1;
12392 a1 = false;
12393 a2 = true;
12394 a3 = false;
12395 a4 = true;
12396 a5 = false;
12397 a6 = true;
12398 a7 = false;
12399 a8 = true;
12400 a9 = false;
12401 a10.a0[0] = true;
12402 a10.a0[1] = false;
12403 a10.a0[2] = true;
12404 a10.a0[3] = false;
12405 a10.a0[4] = true;
12406 a10.a0[5] = false;
12407 a10.a0[6] = true;
12408 a10.a0[7] = false;
12409 a10.a0[8] = true;
12410 a10.a0[9] = false;
12411 a11 = true;
12412
12413 std::cout << "Calling TestPassUint8Boolx9Struct10BytesInlineArrayBoolBool("
12414 << "(" << static_cast<int>(a0) << ", " << a1 << ", " << a2 << ", "
12415 << a3 << ", " << a4 << ", " << a5 << ", " << a6 << ", " << a7
12416 << ", " << a8 << ", " << a9 << ", ([" << a10.a0[0] << ", "
12417 << a10.a0[1] << ", " << a10.a0[2] << ", " << a10.a0[3] << ", "
12418 << a10.a0[4] << ", " << a10.a0[5] << ", " << a10.a0[6] << ", "
12419 << a10.a0[7] << ", " << a10.a0[8] << ", " << a10.a0[9] << "]), "
12420 << a11 << ")"
12421 << ")\n";
12422
12423 int32_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
12424
12425 std::cout << "result = " << result << "\n";
12426
12427 CHECK_EQ(11, result);
12428
12429 // Pass argument that will make the Dart callback throw.
12430 a0 = 42;
12431
12432 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
12433
12434 CHECK_EQ(0, result);
12435
12436 // Pass argument that will make the Dart callback return null.
12437 a0 = 84;
12438
12439 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
12440
12441 CHECK_EQ(0, result);
12442
12443 return 0;
12444}
12445
12446// Used for testing structs and unions by value.
12447// Returning a bool.
12449 // NOLINTNEXTLINE(whitespace/parens)
12450 bool (*f)(uint8_t a0, Struct1ByteBool a1)) {
12451 uint8_t a0;
12452 Struct1ByteBool a1 = {};
12453
12454 a0 = 1;
12455 a1.a0 = false;
12456
12457 std::cout << "Calling TestPassUint8Struct1ByteBool("
12458 << "(" << static_cast<int>(a0) << ", (" << a1.a0 << "))"
12459 << ")\n";
12460
12461 bool result = f(a0, a1);
12462
12463 std::cout << "result = " << result << "\n";
12464
12465 CHECK_EQ(1, result);
12466
12467 // Pass argument that will make the Dart callback throw.
12468 a0 = 42;
12469
12470 result = f(a0, a1);
12471
12472 CHECK_EQ(0, result);
12473
12474 // Pass argument that will make the Dart callback return null.
12475 a0 = 84;
12476
12477 result = f(a0, a1);
12478
12479 CHECK_EQ(0, result);
12480
12481 return 0;
12482}
12483
12484// Used for testing structs and unions by value.
12485// Returning a wchar.
12487 // NOLINTNEXTLINE(whitespace/parens)
12488 wchar_t (*f)(wchar_t a0,
12490 uintptr_t a2,
12491 uintptr_t a3,
12492 /* NOLINT(runtime/int) */ long a4,
12493 /* NOLINT(runtime/int) */ unsigned long a5)) {
12494 wchar_t a0;
12495 StructInlineArrayInt a1 = {};
12496 uintptr_t a2;
12497 uintptr_t a3;
12498 /* NOLINT(runtime/int) */ long a4;
12499 /* NOLINT(runtime/int) */ unsigned long a5;
12500
12501 a0 = 1;
12502 a1.a0[0] = 2;
12503 a1.a0[1] = 3;
12504 a1.a0[2] = 4;
12505 a1.a0[3] = 5;
12506 a1.a0[4] = 6;
12507 a1.a0[5] = 7;
12508 a1.a0[6] = 8;
12509 a1.a0[7] = 9;
12510 a1.a0[8] = 10;
12511 a1.a0[9] = 11;
12512 a2 = 12;
12513 a3 = 13;
12514 a4 = 14;
12515 a5 = 15;
12516
12517 std::cout << "Calling TestPassWCharStructInlineArrayIntUintPtrx2LongUnsigned("
12518 << "(" << a0 << ", ([" << a1.a0[0] << ", " << a1.a0[1] << ", "
12519 << a1.a0[2] << ", " << a1.a0[3] << ", " << a1.a0[4] << ", "
12520 << a1.a0[5] << ", " << a1.a0[6] << ", " << a1.a0[7] << ", "
12521 << a1.a0[8] << ", " << a1.a0[9] << "]), " << a2 << ", " << a3
12522 << ", " << a4 << ", " << a5 << ")"
12523 << ")\n";
12524
12525 wchar_t result = f(a0, a1, a2, a3, a4, a5);
12526
12527 std::cout << "result = " << result << "\n";
12528
12529 CHECK_EQ(120, result);
12530
12531 // Pass argument that will make the Dart callback throw.
12532 a0 = 42;
12533
12534 result = f(a0, a1, a2, a3, a4, a5);
12535
12536 CHECK_EQ(0, result);
12537
12538 // Pass argument that will make the Dart callback return null.
12539 a0 = 84;
12540
12541 result = f(a0, a1, a2, a3, a4, a5);
12542
12543 CHECK_EQ(0, result);
12544
12545 return 0;
12546}
12547
12548// Used for testing structs and unions by value.
12549// Struct stradles last argument register
12551 // NOLINTNEXTLINE(whitespace/parens)
12552 int64_t (*f)(int64_t a0,
12553 int64_t a1,
12554 int64_t a2,
12555 int64_t a3,
12556 int64_t a4,
12557 int64_t a5,
12558 int64_t a6,
12560 int64_t a0;
12561 int64_t a1;
12562 int64_t a2;
12563 int64_t a3;
12564 int64_t a4;
12565 int64_t a5;
12566 int64_t a6;
12568
12569 a0 = -1;
12570 a1 = 2;
12571 a2 = -3;
12572 a3 = 4;
12573 a4 = -5;
12574 a5 = 6;
12575 a6 = -7;
12576 a7.a0 = 8;
12577 a7.a1 = -9;
12578 a7.a2 = 10;
12579
12580 std::cout << "Calling TestPassInt64x7Struct12BytesHomogeneousInt32("
12581 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
12582 << ", " << a5 << ", " << a6 << ", (" << a7.a0 << ", " << a7.a1
12583 << ", " << a7.a2 << "))"
12584 << ")\n";
12585
12586 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7);
12587
12588 std::cout << "result = " << result << "\n";
12589
12590 CHECK_EQ(5, result);
12591
12592 // Pass argument that will make the Dart callback throw.
12593 a0 = 42;
12594
12595 result = f(a0, a1, a2, a3, a4, a5, a6, a7);
12596
12597 CHECK_EQ(0, result);
12598
12599 // Pass argument that will make the Dart callback return null.
12600 a0 = 84;
12601
12602 result = f(a0, a1, a2, a3, a4, a5, a6, a7);
12603
12604 CHECK_EQ(0, result);
12605
12606 return 0;
12607}
12608
12609// Used for testing structs and unions by value.
12610// Smallest struct with data.
12612 // NOLINTNEXTLINE(whitespace/parens)
12613 Struct1ByteInt (*f)(int8_t a0)) {
12614 int8_t a0;
12615
12616 a0 = -1;
12617
12618 std::cout << "Calling TestReturnStruct1ByteInt("
12619 << "(" << static_cast<int>(a0) << ")"
12620 << ")\n";
12621
12622 Struct1ByteInt result = f(a0);
12623
12624 std::cout << "result = "
12625 << "(" << static_cast<int>(result.a0) << ")"
12626 << "\n";
12627
12628 CHECK_EQ(a0, result.a0);
12629
12630 // Pass argument that will make the Dart callback throw.
12631 a0 = 42;
12632
12633 result = f(a0);
12634
12635 CHECK_EQ(0, result.a0);
12636
12637 // Pass argument that will make the Dart callback return null.
12638 a0 = 84;
12639
12640 result = f(a0);
12641
12642 CHECK_EQ(0, result.a0);
12643
12644 return 0;
12645}
12646
12647// Used for testing structs and unions by value.
12648// Smaller than word size return value on all architectures.
12650 // NOLINTNEXTLINE(whitespace/parens)
12651 Struct3BytesHomogeneousUint8 (*f)(uint8_t a0, uint8_t a1, uint8_t a2)) {
12652 uint8_t a0;
12653 uint8_t a1;
12654 uint8_t a2;
12655
12656 a0 = 1;
12657 a1 = 2;
12658 a2 = 3;
12659
12660 std::cout << "Calling TestReturnStruct3BytesHomogeneousUint8("
12661 << "(" << static_cast<int>(a0) << ", " << static_cast<int>(a1)
12662 << ", " << static_cast<int>(a2) << ")"
12663 << ")\n";
12664
12666
12667 std::cout << "result = "
12668 << "(" << static_cast<int>(result.a0) << ", "
12669 << static_cast<int>(result.a1) << ", "
12670 << static_cast<int>(result.a2) << ")"
12671 << "\n";
12672
12673 CHECK_EQ(a0, result.a0);
12674 CHECK_EQ(a1, result.a1);
12675 CHECK_EQ(a2, result.a2);
12676
12677 // Pass argument that will make the Dart callback throw.
12678 a0 = 42;
12679
12680 result = f(a0, a1, a2);
12681
12682 CHECK_EQ(0, result.a0);
12683 CHECK_EQ(0, result.a1);
12684 CHECK_EQ(0, result.a2);
12685
12686 // Pass argument that will make the Dart callback return null.
12687 a0 = 84;
12688
12689 result = f(a0, a1, a2);
12690
12691 CHECK_EQ(0, result.a0);
12692 CHECK_EQ(0, result.a1);
12693 CHECK_EQ(0, result.a2);
12694
12695 return 0;
12696}
12697
12698// Used for testing structs and unions by value.
12699// Smaller than word size return value on all architectures.
12700// With alignment rules taken into account size is 4 bytes.
12702 // NOLINTNEXTLINE(whitespace/parens)
12703 Struct3BytesInt2ByteAligned (*f)(int16_t a0, int8_t a1)) {
12704 int16_t a0;
12705 int8_t a1;
12706
12707 a0 = -1;
12708 a1 = 2;
12709
12710 std::cout << "Calling TestReturnStruct3BytesInt2ByteAligned("
12711 << "(" << a0 << ", " << static_cast<int>(a1) << ")"
12712 << ")\n";
12713
12715
12716 std::cout << "result = "
12717 << "(" << result.a0 << ", " << static_cast<int>(result.a1) << ")"
12718 << "\n";
12719
12720 CHECK_EQ(a0, result.a0);
12721 CHECK_EQ(a1, result.a1);
12722
12723 // Pass argument that will make the Dart callback throw.
12724 a0 = 42;
12725
12726 result = f(a0, a1);
12727
12728 CHECK_EQ(0, result.a0);
12729 CHECK_EQ(0, result.a1);
12730
12731 // Pass argument that will make the Dart callback return null.
12732 a0 = 84;
12733
12734 result = f(a0, a1);
12735
12736 CHECK_EQ(0, result.a0);
12737 CHECK_EQ(0, result.a1);
12738
12739 return 0;
12740}
12741
12742// Used for testing structs and unions by value.
12743// Word size return value on 32 bit architectures..
12745 // NOLINTNEXTLINE(whitespace/parens)
12746 Struct4BytesHomogeneousInt16 (*f)(int16_t a0, int16_t a1)) {
12747 int16_t a0;
12748 int16_t a1;
12749
12750 a0 = -1;
12751 a1 = 2;
12752
12753 std::cout << "Calling TestReturnStruct4BytesHomogeneousInt16("
12754 << "(" << a0 << ", " << a1 << ")"
12755 << ")\n";
12756
12758
12759 std::cout << "result = "
12760 << "(" << result.a0 << ", " << result.a1 << ")"
12761 << "\n";
12762
12763 CHECK_EQ(a0, result.a0);
12764 CHECK_EQ(a1, result.a1);
12765
12766 // Pass argument that will make the Dart callback throw.
12767 a0 = 42;
12768
12769 result = f(a0, a1);
12770
12771 CHECK_EQ(0, result.a0);
12772 CHECK_EQ(0, result.a1);
12773
12774 // Pass argument that will make the Dart callback return null.
12775 a0 = 84;
12776
12777 result = f(a0, a1);
12778
12779 CHECK_EQ(0, result.a0);
12780 CHECK_EQ(0, result.a1);
12781
12782 return 0;
12783}
12784
12785// Used for testing structs and unions by value.
12786// Non-wordsize return value.
12788 // NOLINTNEXTLINE(whitespace/parens)
12789 Struct7BytesHomogeneousUint8 (*f)(uint8_t a0,
12790 uint8_t a1,
12791 uint8_t a2,
12792 uint8_t a3,
12793 uint8_t a4,
12794 uint8_t a5,
12795 uint8_t a6)) {
12796 uint8_t a0;
12797 uint8_t a1;
12798 uint8_t a2;
12799 uint8_t a3;
12800 uint8_t a4;
12801 uint8_t a5;
12802 uint8_t a6;
12803
12804 a0 = 1;
12805 a1 = 2;
12806 a2 = 3;
12807 a3 = 4;
12808 a4 = 5;
12809 a5 = 6;
12810 a6 = 7;
12811
12812 std::cout << "Calling TestReturnStruct7BytesHomogeneousUint8("
12813 << "(" << static_cast<int>(a0) << ", " << static_cast<int>(a1)
12814 << ", " << static_cast<int>(a2) << ", " << static_cast<int>(a3)
12815 << ", " << static_cast<int>(a4) << ", " << static_cast<int>(a5)
12816 << ", " << static_cast<int>(a6) << ")"
12817 << ")\n";
12818
12819 Struct7BytesHomogeneousUint8 result = f(a0, a1, a2, a3, a4, a5, a6);
12820
12821 std::cout << "result = "
12822 << "(" << static_cast<int>(result.a0) << ", "
12823 << static_cast<int>(result.a1) << ", "
12824 << static_cast<int>(result.a2) << ", "
12825 << static_cast<int>(result.a3) << ", "
12826 << static_cast<int>(result.a4) << ", "
12827 << static_cast<int>(result.a5) << ", "
12828 << static_cast<int>(result.a6) << ")"
12829 << "\n";
12830
12831 CHECK_EQ(a0, result.a0);
12832 CHECK_EQ(a1, result.a1);
12833 CHECK_EQ(a2, result.a2);
12834 CHECK_EQ(a3, result.a3);
12835 CHECK_EQ(a4, result.a4);
12836 CHECK_EQ(a5, result.a5);
12837 CHECK_EQ(a6, result.a6);
12838
12839 // Pass argument that will make the Dart callback throw.
12840 a0 = 42;
12841
12842 result = f(a0, a1, a2, a3, a4, a5, a6);
12843
12844 CHECK_EQ(0, result.a0);
12845 CHECK_EQ(0, result.a1);
12846 CHECK_EQ(0, result.a2);
12847 CHECK_EQ(0, result.a3);
12848 CHECK_EQ(0, result.a4);
12849 CHECK_EQ(0, result.a5);
12850 CHECK_EQ(0, result.a6);
12851
12852 // Pass argument that will make the Dart callback return null.
12853 a0 = 84;
12854
12855 result = f(a0, a1, a2, a3, a4, a5, a6);
12856
12857 CHECK_EQ(0, result.a0);
12858 CHECK_EQ(0, result.a1);
12859 CHECK_EQ(0, result.a2);
12860 CHECK_EQ(0, result.a3);
12861 CHECK_EQ(0, result.a4);
12862 CHECK_EQ(0, result.a5);
12863 CHECK_EQ(0, result.a6);
12864
12865 return 0;
12866}
12867
12868// Used for testing structs and unions by value.
12869// Non-wordsize return value.
12870// With alignment rules taken into account size is 8 bytes.
12872 // NOLINTNEXTLINE(whitespace/parens)
12873 Struct7BytesInt4ByteAligned (*f)(int32_t a0, int16_t a1, int8_t a2)) {
12874 int32_t a0;
12875 int16_t a1;
12876 int8_t a2;
12877
12878 a0 = -1;
12879 a1 = 2;
12880 a2 = -3;
12881
12882 std::cout << "Calling TestReturnStruct7BytesInt4ByteAligned("
12883 << "(" << a0 << ", " << a1 << ", " << static_cast<int>(a2) << ")"
12884 << ")\n";
12885
12886 Struct7BytesInt4ByteAligned result = f(a0, a1, a2);
12887
12888 std::cout << "result = "
12889 << "(" << result.a0 << ", " << result.a1 << ", "
12890 << static_cast<int>(result.a2) << ")"
12891 << "\n";
12892
12893 CHECK_EQ(a0, result.a0);
12894 CHECK_EQ(a1, result.a1);
12895 CHECK_EQ(a2, result.a2);
12896
12897 // Pass argument that will make the Dart callback throw.
12898 a0 = 42;
12899
12900 result = f(a0, a1, a2);
12901
12902 CHECK_EQ(0, result.a0);
12903 CHECK_EQ(0, result.a1);
12904 CHECK_EQ(0, result.a2);
12905
12906 // Pass argument that will make the Dart callback return null.
12907 a0 = 84;
12908
12909 result = f(a0, a1, a2);
12910
12911 CHECK_EQ(0, result.a0);
12912 CHECK_EQ(0, result.a1);
12913 CHECK_EQ(0, result.a2);
12914
12915 return 0;
12916}
12917
12918// Used for testing structs and unions by value.
12919// Return value in integer registers on many architectures.
12921 // NOLINTNEXTLINE(whitespace/parens)
12922 Struct8BytesInt (*f)(int16_t a0, int16_t a1, int32_t a2)) {
12923 int16_t a0;
12924 int16_t a1;
12925 int32_t a2;
12926
12927 a0 = -1;
12928 a1 = 2;
12929 a2 = -3;
12930
12931 std::cout << "Calling TestReturnStruct8BytesInt("
12932 << "(" << a0 << ", " << a1 << ", " << a2 << ")"
12933 << ")\n";
12934
12935 Struct8BytesInt result = f(a0, a1, a2);
12936
12937 std::cout << "result = "
12938 << "(" << result.a0 << ", " << result.a1 << ", " << result.a2 << ")"
12939 << "\n";
12940
12941 CHECK_EQ(a0, result.a0);
12942 CHECK_EQ(a1, result.a1);
12943 CHECK_EQ(a2, result.a2);
12944
12945 // Pass argument that will make the Dart callback throw.
12946 a0 = 42;
12947
12948 result = f(a0, a1, a2);
12949
12950 CHECK_EQ(0, result.a0);
12951 CHECK_EQ(0, result.a1);
12952 CHECK_EQ(0, result.a2);
12953
12954 // Pass argument that will make the Dart callback return null.
12955 a0 = 84;
12956
12957 result = f(a0, a1, a2);
12958
12959 CHECK_EQ(0, result.a0);
12960 CHECK_EQ(0, result.a1);
12961 CHECK_EQ(0, result.a2);
12962
12963 return 0;
12964}
12965
12966// Used for testing structs and unions by value.
12967// Return value in FP registers on many architectures.
12969 // NOLINTNEXTLINE(whitespace/parens)
12970 Struct8BytesHomogeneousFloat (*f)(float a0, float a1)) {
12971 float a0;
12972 float a1;
12973
12974 a0 = -1.0;
12975 a1 = 2.0;
12976
12977 std::cout << "Calling TestReturnStruct8BytesHomogeneousFloat("
12978 << "(" << a0 << ", " << a1 << ")"
12979 << ")\n";
12980
12982
12983 std::cout << "result = "
12984 << "(" << result.a0 << ", " << result.a1 << ")"
12985 << "\n";
12986
12987 CHECK_APPROX(a0, result.a0);
12988 CHECK_APPROX(a1, result.a1);
12989
12990 // Pass argument that will make the Dart callback throw.
12991 a0 = 42;
12992
12993 result = f(a0, a1);
12994
12995 CHECK_APPROX(0.0, result.a0);
12996 CHECK_APPROX(0.0, result.a1);
12997
12998 // Pass argument that will make the Dart callback return null.
12999 a0 = 84;
13000
13001 result = f(a0, a1);
13002
13003 CHECK_APPROX(0.0, result.a0);
13004 CHECK_APPROX(0.0, result.a1);
13005
13006 return 0;
13007}
13008
13009// Used for testing structs and unions by value.
13010// Return value split over FP and integer register in x64.
13012 // NOLINTNEXTLINE(whitespace/parens)
13013 Struct8BytesMixed (*f)(float a0, int16_t a1, int16_t a2)) {
13014 float a0;
13015 int16_t a1;
13016 int16_t a2;
13017
13018 a0 = -1.0;
13019 a1 = 2;
13020 a2 = -3;
13021
13022 std::cout << "Calling TestReturnStruct8BytesMixed("
13023 << "(" << a0 << ", " << a1 << ", " << a2 << ")"
13024 << ")\n";
13025
13026 Struct8BytesMixed result = f(a0, a1, a2);
13027
13028 std::cout << "result = "
13029 << "(" << result.a0 << ", " << result.a1 << ", " << result.a2 << ")"
13030 << "\n";
13031
13032 CHECK_APPROX(a0, result.a0);
13033 CHECK_EQ(a1, result.a1);
13034 CHECK_EQ(a2, result.a2);
13035
13036 // Pass argument that will make the Dart callback throw.
13037 a0 = 42;
13038
13039 result = f(a0, a1, a2);
13040
13041 CHECK_APPROX(0.0, result.a0);
13042 CHECK_EQ(0, result.a1);
13043 CHECK_EQ(0, result.a2);
13044
13045 // Pass argument that will make the Dart callback return null.
13046 a0 = 84;
13047
13048 result = f(a0, a1, a2);
13049
13050 CHECK_APPROX(0.0, result.a0);
13051 CHECK_EQ(0, result.a1);
13052 CHECK_EQ(0, result.a2);
13053
13054 return 0;
13055}
13056
13057// Used for testing structs and unions by value.
13058// The minimum alignment of this struct is only 1 byte based on its fields.
13059// Test that the memory backing these structs is the right size and that
13060// dart:ffi trampolines do not write outside this size.
13062 // NOLINTNEXTLINE(whitespace/parens)
13063 Struct9BytesHomogeneousUint8 (*f)(uint8_t a0,
13064 uint8_t a1,
13065 uint8_t a2,
13066 uint8_t a3,
13067 uint8_t a4,
13068 uint8_t a5,
13069 uint8_t a6,
13070 uint8_t a7,
13071 uint8_t a8)) {
13072 uint8_t a0;
13073 uint8_t a1;
13074 uint8_t a2;
13075 uint8_t a3;
13076 uint8_t a4;
13077 uint8_t a5;
13078 uint8_t a6;
13079 uint8_t a7;
13080 uint8_t a8;
13081
13082 a0 = 1;
13083 a1 = 2;
13084 a2 = 3;
13085 a3 = 4;
13086 a4 = 5;
13087 a5 = 6;
13088 a6 = 7;
13089 a7 = 8;
13090 a8 = 9;
13091
13092 std::cout << "Calling TestReturnStruct9BytesHomogeneousUint8("
13093 << "(" << static_cast<int>(a0) << ", " << static_cast<int>(a1)
13094 << ", " << static_cast<int>(a2) << ", " << static_cast<int>(a3)
13095 << ", " << static_cast<int>(a4) << ", " << static_cast<int>(a5)
13096 << ", " << static_cast<int>(a6) << ", " << static_cast<int>(a7)
13097 << ", " << static_cast<int>(a8) << ")"
13098 << ")\n";
13099
13100 Struct9BytesHomogeneousUint8 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
13101
13102 std::cout << "result = "
13103 << "(" << static_cast<int>(result.a0) << ", "
13104 << static_cast<int>(result.a1) << ", "
13105 << static_cast<int>(result.a2) << ", "
13106 << static_cast<int>(result.a3) << ", "
13107 << static_cast<int>(result.a4) << ", "
13108 << static_cast<int>(result.a5) << ", "
13109 << static_cast<int>(result.a6) << ", "
13110 << static_cast<int>(result.a7) << ", "
13111 << static_cast<int>(result.a8) << ")"
13112 << "\n";
13113
13114 CHECK_EQ(a0, result.a0);
13115 CHECK_EQ(a1, result.a1);
13116 CHECK_EQ(a2, result.a2);
13117 CHECK_EQ(a3, result.a3);
13118 CHECK_EQ(a4, result.a4);
13119 CHECK_EQ(a5, result.a5);
13120 CHECK_EQ(a6, result.a6);
13121 CHECK_EQ(a7, result.a7);
13122 CHECK_EQ(a8, result.a8);
13123
13124 // Pass argument that will make the Dart callback throw.
13125 a0 = 42;
13126
13127 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
13128
13129 CHECK_EQ(0, result.a0);
13130 CHECK_EQ(0, result.a1);
13131 CHECK_EQ(0, result.a2);
13132 CHECK_EQ(0, result.a3);
13133 CHECK_EQ(0, result.a4);
13134 CHECK_EQ(0, result.a5);
13135 CHECK_EQ(0, result.a6);
13136 CHECK_EQ(0, result.a7);
13137 CHECK_EQ(0, result.a8);
13138
13139 // Pass argument that will make the Dart callback return null.
13140 a0 = 84;
13141
13142 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
13143
13144 CHECK_EQ(0, result.a0);
13145 CHECK_EQ(0, result.a1);
13146 CHECK_EQ(0, result.a2);
13147 CHECK_EQ(0, result.a3);
13148 CHECK_EQ(0, result.a4);
13149 CHECK_EQ(0, result.a5);
13150 CHECK_EQ(0, result.a6);
13151 CHECK_EQ(0, result.a7);
13152 CHECK_EQ(0, result.a8);
13153
13154 return 0;
13155}
13156
13157// Used for testing structs and unions by value.
13158// Return value in two integer registers on x64.
13159// With alignment rules taken into account size is 12 or 16 bytes.
13161 // NOLINTNEXTLINE(whitespace/parens)
13162 Struct9BytesInt4Or8ByteAligned (*f)(int64_t a0, int8_t a1)) {
13163 int64_t a0;
13164 int8_t a1;
13165
13166 a0 = -1;
13167 a1 = 2;
13168
13169 std::cout << "Calling TestReturnStruct9BytesInt4Or8ByteAligned("
13170 << "(" << a0 << ", " << static_cast<int>(a1) << ")"
13171 << ")\n";
13172
13174
13175 std::cout << "result = "
13176 << "(" << result.a0 << ", " << static_cast<int>(result.a1) << ")"
13177 << "\n";
13178
13179 CHECK_EQ(a0, result.a0);
13180 CHECK_EQ(a1, result.a1);
13181
13182 // Pass argument that will make the Dart callback throw.
13183 a0 = 42;
13184
13185 result = f(a0, a1);
13186
13187 CHECK_EQ(0, result.a0);
13188 CHECK_EQ(0, result.a1);
13189
13190 // Pass argument that will make the Dart callback return null.
13191 a0 = 84;
13192
13193 result = f(a0, a1);
13194
13195 CHECK_EQ(0, result.a0);
13196 CHECK_EQ(0, result.a1);
13197
13198 return 0;
13199}
13200
13201// Used for testing structs and unions by value.
13202// Return value in FPU registers, but does not use all registers on arm hardfp
13203// and arm64.
13205 // NOLINTNEXTLINE(whitespace/parens)
13206 Struct12BytesHomogeneousFloat (*f)(float a0, float a1, float a2)) {
13207 float a0;
13208 float a1;
13209 float a2;
13210
13211 a0 = -1.0;
13212 a1 = 2.0;
13213 a2 = -3.0;
13214
13215 std::cout << "Calling TestReturnStruct12BytesHomogeneousFloat("
13216 << "(" << a0 << ", " << a1 << ", " << a2 << ")"
13217 << ")\n";
13218
13220
13221 std::cout << "result = "
13222 << "(" << result.a0 << ", " << result.a1 << ", " << result.a2 << ")"
13223 << "\n";
13224
13225 CHECK_APPROX(a0, result.a0);
13226 CHECK_APPROX(a1, result.a1);
13227 CHECK_APPROX(a2, result.a2);
13228
13229 // Pass argument that will make the Dart callback throw.
13230 a0 = 42;
13231
13232 result = f(a0, a1, a2);
13233
13234 CHECK_APPROX(0.0, result.a0);
13235 CHECK_APPROX(0.0, result.a1);
13236 CHECK_APPROX(0.0, result.a2);
13237
13238 // Pass argument that will make the Dart callback return null.
13239 a0 = 84;
13240
13241 result = f(a0, a1, a2);
13242
13243 CHECK_APPROX(0.0, result.a0);
13244 CHECK_APPROX(0.0, result.a1);
13245 CHECK_APPROX(0.0, result.a2);
13246
13247 return 0;
13248}
13249
13250// Used for testing structs and unions by value.
13251// Return value in FPU registers on arm hardfp and arm64.
13253 // NOLINTNEXTLINE(whitespace/parens)
13255 *f)(float a0, float a1, float a2, float a3)) {
13256 float a0;
13257 float a1;
13258 float a2;
13259 float a3;
13260
13261 a0 = -1.0;
13262 a1 = 2.0;
13263 a2 = -3.0;
13264 a3 = 4.0;
13265
13266 std::cout << "Calling TestReturnStruct16BytesHomogeneousFloat("
13267 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ")"
13268 << ")\n";
13269
13270 Struct16BytesHomogeneousFloat result = f(a0, a1, a2, a3);
13271
13272 std::cout << "result = "
13273 << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
13274 << ", " << result.a3 << ")"
13275 << "\n";
13276
13277 CHECK_APPROX(a0, result.a0);
13278 CHECK_APPROX(a1, result.a1);
13279 CHECK_APPROX(a2, result.a2);
13280 CHECK_APPROX(a3, result.a3);
13281
13282 // Pass argument that will make the Dart callback throw.
13283 a0 = 42;
13284
13285 result = f(a0, a1, a2, a3);
13286
13287 CHECK_APPROX(0.0, result.a0);
13288 CHECK_APPROX(0.0, result.a1);
13289 CHECK_APPROX(0.0, result.a2);
13290 CHECK_APPROX(0.0, result.a3);
13291
13292 // Pass argument that will make the Dart callback return null.
13293 a0 = 84;
13294
13295 result = f(a0, a1, a2, a3);
13296
13297 CHECK_APPROX(0.0, result.a0);
13298 CHECK_APPROX(0.0, result.a1);
13299 CHECK_APPROX(0.0, result.a2);
13300 CHECK_APPROX(0.0, result.a3);
13301
13302 return 0;
13303}
13304
13305// Used for testing structs and unions by value.
13306// Return value split over FP and integer register in x64.
13308 // NOLINTNEXTLINE(whitespace/parens)
13309 Struct16BytesMixed (*f)(double a0, int64_t a1)) {
13310 double a0;
13311 int64_t a1;
13312
13313 a0 = -1.0;
13314 a1 = 2;
13315
13316 std::cout << "Calling TestReturnStruct16BytesMixed("
13317 << "(" << a0 << ", " << a1 << ")"
13318 << ")\n";
13319
13320 Struct16BytesMixed result = f(a0, a1);
13321
13322 std::cout << "result = "
13323 << "(" << result.a0 << ", " << result.a1 << ")"
13324 << "\n";
13325
13326 CHECK_APPROX(a0, result.a0);
13327 CHECK_EQ(a1, result.a1);
13328
13329 // Pass argument that will make the Dart callback throw.
13330 a0 = 42;
13331
13332 result = f(a0, a1);
13333
13334 CHECK_APPROX(0.0, result.a0);
13335 CHECK_EQ(0, result.a1);
13336
13337 // Pass argument that will make the Dart callback return null.
13338 a0 = 84;
13339
13340 result = f(a0, a1);
13341
13342 CHECK_APPROX(0.0, result.a0);
13343 CHECK_EQ(0, result.a1);
13344
13345 return 0;
13346}
13347
13348// Used for testing structs and unions by value.
13349// Return value split over FP and integer register in x64.
13350// The integer register contains half float half int.
13352 // NOLINTNEXTLINE(whitespace/parens)
13353 Struct16BytesMixed2 (*f)(float a0, float a1, float a2, int32_t a3)) {
13354 float a0;
13355 float a1;
13356 float a2;
13357 int32_t a3;
13358
13359 a0 = -1.0;
13360 a1 = 2.0;
13361 a2 = -3.0;
13362 a3 = 4;
13363
13364 std::cout << "Calling TestReturnStruct16BytesMixed2("
13365 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ")"
13366 << ")\n";
13367
13368 Struct16BytesMixed2 result = f(a0, a1, a2, a3);
13369
13370 std::cout << "result = "
13371 << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
13372 << ", " << result.a3 << ")"
13373 << "\n";
13374
13375 CHECK_APPROX(a0, result.a0);
13376 CHECK_APPROX(a1, result.a1);
13377 CHECK_APPROX(a2, result.a2);
13378 CHECK_EQ(a3, result.a3);
13379
13380 // Pass argument that will make the Dart callback throw.
13381 a0 = 42;
13382
13383 result = f(a0, a1, a2, a3);
13384
13385 CHECK_APPROX(0.0, result.a0);
13386 CHECK_APPROX(0.0, result.a1);
13387 CHECK_APPROX(0.0, result.a2);
13388 CHECK_EQ(0, result.a3);
13389
13390 // Pass argument that will make the Dart callback return null.
13391 a0 = 84;
13392
13393 result = f(a0, a1, a2, a3);
13394
13395 CHECK_APPROX(0.0, result.a0);
13396 CHECK_APPROX(0.0, result.a1);
13397 CHECK_APPROX(0.0, result.a2);
13398 CHECK_EQ(0, result.a3);
13399
13400 return 0;
13401}
13402
13403// Used for testing structs and unions by value.
13404// Return value returned in preallocated space passed by pointer on most ABIs.
13405// Is non word size on purpose, to test that structs are rounded up to word size
13406// on all ABIs.
13408 // NOLINTNEXTLINE(whitespace/parens)
13409 Struct17BytesInt (*f)(int64_t a0, int64_t a1, int8_t a2)) {
13410 int64_t a0;
13411 int64_t a1;
13412 int8_t a2;
13413
13414 a0 = -1;
13415 a1 = 2;
13416 a2 = -3;
13417
13418 std::cout << "Calling TestReturnStruct17BytesInt("
13419 << "(" << a0 << ", " << a1 << ", " << static_cast<int>(a2) << ")"
13420 << ")\n";
13421
13422 Struct17BytesInt result = f(a0, a1, a2);
13423
13424 std::cout << "result = "
13425 << "(" << result.a0 << ", " << result.a1 << ", "
13426 << static_cast<int>(result.a2) << ")"
13427 << "\n";
13428
13429 CHECK_EQ(a0, result.a0);
13430 CHECK_EQ(a1, result.a1);
13431 CHECK_EQ(a2, result.a2);
13432
13433 // Pass argument that will make the Dart callback throw.
13434 a0 = 42;
13435
13436 result = f(a0, a1, a2);
13437
13438 CHECK_EQ(0, result.a0);
13439 CHECK_EQ(0, result.a1);
13440 CHECK_EQ(0, result.a2);
13441
13442 // Pass argument that will make the Dart callback return null.
13443 a0 = 84;
13444
13445 result = f(a0, a1, a2);
13446
13447 CHECK_EQ(0, result.a0);
13448 CHECK_EQ(0, result.a1);
13449 CHECK_EQ(0, result.a2);
13450
13451 return 0;
13452}
13453
13454// Used for testing structs and unions by value.
13455// The minimum alignment of this struct is only 1 byte based on its fields.
13456// Test that the memory backing these structs is the right size and that
13457// dart:ffi trampolines do not write outside this size.
13459 // NOLINTNEXTLINE(whitespace/parens)
13460 Struct19BytesHomogeneousUint8 (*f)(uint8_t a0,
13461 uint8_t a1,
13462 uint8_t a2,
13463 uint8_t a3,
13464 uint8_t a4,
13465 uint8_t a5,
13466 uint8_t a6,
13467 uint8_t a7,
13468 uint8_t a8,
13469 uint8_t a9,
13470 uint8_t a10,
13471 uint8_t a11,
13472 uint8_t a12,
13473 uint8_t a13,
13474 uint8_t a14,
13475 uint8_t a15,
13476 uint8_t a16,
13477 uint8_t a17,
13478 uint8_t a18)) {
13479 uint8_t a0;
13480 uint8_t a1;
13481 uint8_t a2;
13482 uint8_t a3;
13483 uint8_t a4;
13484 uint8_t a5;
13485 uint8_t a6;
13486 uint8_t a7;
13487 uint8_t a8;
13488 uint8_t a9;
13489 uint8_t a10;
13490 uint8_t a11;
13491 uint8_t a12;
13492 uint8_t a13;
13493 uint8_t a14;
13494 uint8_t a15;
13495 uint8_t a16;
13496 uint8_t a17;
13497 uint8_t a18;
13498
13499 a0 = 1;
13500 a1 = 2;
13501 a2 = 3;
13502 a3 = 4;
13503 a4 = 5;
13504 a5 = 6;
13505 a6 = 7;
13506 a7 = 8;
13507 a8 = 9;
13508 a9 = 10;
13509 a10 = 11;
13510 a11 = 12;
13511 a12 = 13;
13512 a13 = 14;
13513 a14 = 15;
13514 a15 = 16;
13515 a16 = 17;
13516 a17 = 18;
13517 a18 = 19;
13518
13519 std::cout << "Calling TestReturnStruct19BytesHomogeneousUint8("
13520 << "(" << static_cast<int>(a0) << ", " << static_cast<int>(a1)
13521 << ", " << static_cast<int>(a2) << ", " << static_cast<int>(a3)
13522 << ", " << static_cast<int>(a4) << ", " << static_cast<int>(a5)
13523 << ", " << static_cast<int>(a6) << ", " << static_cast<int>(a7)
13524 << ", " << static_cast<int>(a8) << ", " << static_cast<int>(a9)
13525 << ", " << static_cast<int>(a10) << ", " << static_cast<int>(a11)
13526 << ", " << static_cast<int>(a12) << ", " << static_cast<int>(a13)
13527 << ", " << static_cast<int>(a14) << ", " << static_cast<int>(a15)
13528 << ", " << static_cast<int>(a16) << ", " << static_cast<int>(a17)
13529 << ", " << static_cast<int>(a18) << ")"
13530 << ")\n";
13531
13533 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15,
13534 a16, a17, a18);
13535
13536 std::cout << "result = "
13537 << "(" << static_cast<int>(result.a0) << ", "
13538 << static_cast<int>(result.a1) << ", "
13539 << static_cast<int>(result.a2) << ", "
13540 << static_cast<int>(result.a3) << ", "
13541 << static_cast<int>(result.a4) << ", "
13542 << static_cast<int>(result.a5) << ", "
13543 << static_cast<int>(result.a6) << ", "
13544 << static_cast<int>(result.a7) << ", "
13545 << static_cast<int>(result.a8) << ", "
13546 << static_cast<int>(result.a9) << ", "
13547 << static_cast<int>(result.a10) << ", "
13548 << static_cast<int>(result.a11) << ", "
13549 << static_cast<int>(result.a12) << ", "
13550 << static_cast<int>(result.a13) << ", "
13551 << static_cast<int>(result.a14) << ", "
13552 << static_cast<int>(result.a15) << ", "
13553 << static_cast<int>(result.a16) << ", "
13554 << static_cast<int>(result.a17) << ", "
13555 << static_cast<int>(result.a18) << ")"
13556 << "\n";
13557
13558 CHECK_EQ(a0, result.a0);
13559 CHECK_EQ(a1, result.a1);
13560 CHECK_EQ(a2, result.a2);
13561 CHECK_EQ(a3, result.a3);
13562 CHECK_EQ(a4, result.a4);
13563 CHECK_EQ(a5, result.a5);
13564 CHECK_EQ(a6, result.a6);
13565 CHECK_EQ(a7, result.a7);
13566 CHECK_EQ(a8, result.a8);
13567 CHECK_EQ(a9, result.a9);
13568 CHECK_EQ(a10, result.a10);
13569 CHECK_EQ(a11, result.a11);
13570 CHECK_EQ(a12, result.a12);
13571 CHECK_EQ(a13, result.a13);
13572 CHECK_EQ(a14, result.a14);
13573 CHECK_EQ(a15, result.a15);
13574 CHECK_EQ(a16, result.a16);
13575 CHECK_EQ(a17, result.a17);
13576 CHECK_EQ(a18, result.a18);
13577
13578 // Pass argument that will make the Dart callback throw.
13579 a0 = 42;
13580
13581 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
13582 a15, a16, a17, a18);
13583
13584 CHECK_EQ(0, result.a0);
13585 CHECK_EQ(0, result.a1);
13586 CHECK_EQ(0, result.a2);
13587 CHECK_EQ(0, result.a3);
13588 CHECK_EQ(0, result.a4);
13589 CHECK_EQ(0, result.a5);
13590 CHECK_EQ(0, result.a6);
13591 CHECK_EQ(0, result.a7);
13592 CHECK_EQ(0, result.a8);
13593 CHECK_EQ(0, result.a9);
13594 CHECK_EQ(0, result.a10);
13595 CHECK_EQ(0, result.a11);
13596 CHECK_EQ(0, result.a12);
13597 CHECK_EQ(0, result.a13);
13598 CHECK_EQ(0, result.a14);
13599 CHECK_EQ(0, result.a15);
13600 CHECK_EQ(0, result.a16);
13601 CHECK_EQ(0, result.a17);
13602 CHECK_EQ(0, result.a18);
13603
13604 // Pass argument that will make the Dart callback return null.
13605 a0 = 84;
13606
13607 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
13608 a15, a16, a17, a18);
13609
13610 CHECK_EQ(0, result.a0);
13611 CHECK_EQ(0, result.a1);
13612 CHECK_EQ(0, result.a2);
13613 CHECK_EQ(0, result.a3);
13614 CHECK_EQ(0, result.a4);
13615 CHECK_EQ(0, result.a5);
13616 CHECK_EQ(0, result.a6);
13617 CHECK_EQ(0, result.a7);
13618 CHECK_EQ(0, result.a8);
13619 CHECK_EQ(0, result.a9);
13620 CHECK_EQ(0, result.a10);
13621 CHECK_EQ(0, result.a11);
13622 CHECK_EQ(0, result.a12);
13623 CHECK_EQ(0, result.a13);
13624 CHECK_EQ(0, result.a14);
13625 CHECK_EQ(0, result.a15);
13626 CHECK_EQ(0, result.a16);
13627 CHECK_EQ(0, result.a17);
13628 CHECK_EQ(0, result.a18);
13629
13630 return 0;
13631}
13632
13633// Used for testing structs and unions by value.
13634// Return value too big to go in cpu registers on arm64.
13636 // NOLINTNEXTLINE(whitespace/parens)
13638 *f)(int32_t a0, int32_t a1, int32_t a2, int32_t a3, int32_t a4)) {
13639 int32_t a0;
13640 int32_t a1;
13641 int32_t a2;
13642 int32_t a3;
13643 int32_t a4;
13644
13645 a0 = -1;
13646 a1 = 2;
13647 a2 = -3;
13648 a3 = 4;
13649 a4 = -5;
13650
13651 std::cout << "Calling TestReturnStruct20BytesHomogeneousInt32("
13652 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
13653 << ")"
13654 << ")\n";
13655
13656 Struct20BytesHomogeneousInt32 result = f(a0, a1, a2, a3, a4);
13657
13658 std::cout << "result = "
13659 << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
13660 << ", " << result.a3 << ", " << result.a4 << ")"
13661 << "\n";
13662
13663 CHECK_EQ(a0, result.a0);
13664 CHECK_EQ(a1, result.a1);
13665 CHECK_EQ(a2, result.a2);
13666 CHECK_EQ(a3, result.a3);
13667 CHECK_EQ(a4, result.a4);
13668
13669 // Pass argument that will make the Dart callback throw.
13670 a0 = 42;
13671
13672 result = f(a0, a1, a2, a3, a4);
13673
13674 CHECK_EQ(0, result.a0);
13675 CHECK_EQ(0, result.a1);
13676 CHECK_EQ(0, result.a2);
13677 CHECK_EQ(0, result.a3);
13678 CHECK_EQ(0, result.a4);
13679
13680 // Pass argument that will make the Dart callback return null.
13681 a0 = 84;
13682
13683 result = f(a0, a1, a2, a3, a4);
13684
13685 CHECK_EQ(0, result.a0);
13686 CHECK_EQ(0, result.a1);
13687 CHECK_EQ(0, result.a2);
13688 CHECK_EQ(0, result.a3);
13689 CHECK_EQ(0, result.a4);
13690
13691 return 0;
13692}
13693
13694// Used for testing structs and unions by value.
13695// Return value too big to go in FPU registers on x64, arm hardfp and arm64.
13697 // NOLINTNEXTLINE(whitespace/parens)
13699 *f)(float a0, float a1, float a2, float a3, float a4)) {
13700 float a0;
13701 float a1;
13702 float a2;
13703 float a3;
13704 float a4;
13705
13706 a0 = -1.0;
13707 a1 = 2.0;
13708 a2 = -3.0;
13709 a3 = 4.0;
13710 a4 = -5.0;
13711
13712 std::cout << "Calling TestReturnStruct20BytesHomogeneousFloat("
13713 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
13714 << ")"
13715 << ")\n";
13716
13717 Struct20BytesHomogeneousFloat result = f(a0, a1, a2, a3, a4);
13718
13719 std::cout << "result = "
13720 << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
13721 << ", " << result.a3 << ", " << result.a4 << ")"
13722 << "\n";
13723
13724 CHECK_APPROX(a0, result.a0);
13725 CHECK_APPROX(a1, result.a1);
13726 CHECK_APPROX(a2, result.a2);
13727 CHECK_APPROX(a3, result.a3);
13728 CHECK_APPROX(a4, result.a4);
13729
13730 // Pass argument that will make the Dart callback throw.
13731 a0 = 42;
13732
13733 result = f(a0, a1, a2, a3, a4);
13734
13735 CHECK_APPROX(0.0, result.a0);
13736 CHECK_APPROX(0.0, result.a1);
13737 CHECK_APPROX(0.0, result.a2);
13738 CHECK_APPROX(0.0, result.a3);
13739 CHECK_APPROX(0.0, result.a4);
13740
13741 // Pass argument that will make the Dart callback return null.
13742 a0 = 84;
13743
13744 result = f(a0, a1, a2, a3, a4);
13745
13746 CHECK_APPROX(0.0, result.a0);
13747 CHECK_APPROX(0.0, result.a1);
13748 CHECK_APPROX(0.0, result.a2);
13749 CHECK_APPROX(0.0, result.a3);
13750 CHECK_APPROX(0.0, result.a4);
13751
13752 return 0;
13753}
13754
13755// Used for testing structs and unions by value.
13756// Return value in FPU registers on arm64.
13758 // NOLINTNEXTLINE(whitespace/parens)
13760 *f)(double a0, double a1, double a2, double a3)) {
13761 double a0;
13762 double a1;
13763 double a2;
13764 double a3;
13765
13766 a0 = -1.0;
13767 a1 = 2.0;
13768 a2 = -3.0;
13769 a3 = 4.0;
13770
13771 std::cout << "Calling TestReturnStruct32BytesHomogeneousDouble("
13772 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ")"
13773 << ")\n";
13774
13775 Struct32BytesHomogeneousDouble result = f(a0, a1, a2, a3);
13776
13777 std::cout << "result = "
13778 << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
13779 << ", " << result.a3 << ")"
13780 << "\n";
13781
13782 CHECK_APPROX(a0, result.a0);
13783 CHECK_APPROX(a1, result.a1);
13784 CHECK_APPROX(a2, result.a2);
13785 CHECK_APPROX(a3, result.a3);
13786
13787 // Pass argument that will make the Dart callback throw.
13788 a0 = 42;
13789
13790 result = f(a0, a1, a2, a3);
13791
13792 CHECK_APPROX(0.0, result.a0);
13793 CHECK_APPROX(0.0, result.a1);
13794 CHECK_APPROX(0.0, result.a2);
13795 CHECK_APPROX(0.0, result.a3);
13796
13797 // Pass argument that will make the Dart callback return null.
13798 a0 = 84;
13799
13800 result = f(a0, a1, a2, a3);
13801
13802 CHECK_APPROX(0.0, result.a0);
13803 CHECK_APPROX(0.0, result.a1);
13804 CHECK_APPROX(0.0, result.a2);
13805 CHECK_APPROX(0.0, result.a3);
13806
13807 return 0;
13808}
13809
13810// Used for testing structs and unions by value.
13811// Return value too big to go in FPU registers on arm64.
13813 // NOLINTNEXTLINE(whitespace/parens)
13815 *f)(double a0, double a1, double a2, double a3, double a4)) {
13816 double a0;
13817 double a1;
13818 double a2;
13819 double a3;
13820 double a4;
13821
13822 a0 = -1.0;
13823 a1 = 2.0;
13824 a2 = -3.0;
13825 a3 = 4.0;
13826 a4 = -5.0;
13827
13828 std::cout << "Calling TestReturnStruct40BytesHomogeneousDouble("
13829 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
13830 << ")"
13831 << ")\n";
13832
13833 Struct40BytesHomogeneousDouble result = f(a0, a1, a2, a3, a4);
13834
13835 std::cout << "result = "
13836 << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
13837 << ", " << result.a3 << ", " << result.a4 << ")"
13838 << "\n";
13839
13840 CHECK_APPROX(a0, result.a0);
13841 CHECK_APPROX(a1, result.a1);
13842 CHECK_APPROX(a2, result.a2);
13843 CHECK_APPROX(a3, result.a3);
13844 CHECK_APPROX(a4, result.a4);
13845
13846 // Pass argument that will make the Dart callback throw.
13847 a0 = 42;
13848
13849 result = f(a0, a1, a2, a3, a4);
13850
13851 CHECK_APPROX(0.0, result.a0);
13852 CHECK_APPROX(0.0, result.a1);
13853 CHECK_APPROX(0.0, result.a2);
13854 CHECK_APPROX(0.0, result.a3);
13855 CHECK_APPROX(0.0, result.a4);
13856
13857 // Pass argument that will make the Dart callback return null.
13858 a0 = 84;
13859
13860 result = f(a0, a1, a2, a3, a4);
13861
13862 CHECK_APPROX(0.0, result.a0);
13863 CHECK_APPROX(0.0, result.a1);
13864 CHECK_APPROX(0.0, result.a2);
13865 CHECK_APPROX(0.0, result.a3);
13866 CHECK_APPROX(0.0, result.a4);
13867
13868 return 0;
13869}
13870
13871// Used for testing structs and unions by value.
13872// Test 1kb struct.
13874 // NOLINTNEXTLINE(whitespace/parens)
13875 Struct1024BytesHomogeneousUint64 (*f)(uint64_t a0,
13876 uint64_t a1,
13877 uint64_t a2,
13878 uint64_t a3,
13879 uint64_t a4,
13880 uint64_t a5,
13881 uint64_t a6,
13882 uint64_t a7,
13883 uint64_t a8,
13884 uint64_t a9,
13885 uint64_t a10,
13886 uint64_t a11,
13887 uint64_t a12,
13888 uint64_t a13,
13889 uint64_t a14,
13890 uint64_t a15,
13891 uint64_t a16,
13892 uint64_t a17,
13893 uint64_t a18,
13894 uint64_t a19,
13895 uint64_t a20,
13896 uint64_t a21,
13897 uint64_t a22,
13898 uint64_t a23,
13899 uint64_t a24,
13900 uint64_t a25,
13901 uint64_t a26,
13902 uint64_t a27,
13903 uint64_t a28,
13904 uint64_t a29,
13905 uint64_t a30,
13906 uint64_t a31,
13907 uint64_t a32,
13908 uint64_t a33,
13909 uint64_t a34,
13910 uint64_t a35,
13911 uint64_t a36,
13912 uint64_t a37,
13913 uint64_t a38,
13914 uint64_t a39,
13915 uint64_t a40,
13916 uint64_t a41,
13917 uint64_t a42,
13918 uint64_t a43,
13919 uint64_t a44,
13920 uint64_t a45,
13921 uint64_t a46,
13922 uint64_t a47,
13923 uint64_t a48,
13924 uint64_t a49,
13925 uint64_t a50,
13926 uint64_t a51,
13927 uint64_t a52,
13928 uint64_t a53,
13929 uint64_t a54,
13930 uint64_t a55,
13931 uint64_t a56,
13932 uint64_t a57,
13933 uint64_t a58,
13934 uint64_t a59,
13935 uint64_t a60,
13936 uint64_t a61,
13937 uint64_t a62,
13938 uint64_t a63,
13939 uint64_t a64,
13940 uint64_t a65,
13941 uint64_t a66,
13942 uint64_t a67,
13943 uint64_t a68,
13944 uint64_t a69,
13945 uint64_t a70,
13946 uint64_t a71,
13947 uint64_t a72,
13948 uint64_t a73,
13949 uint64_t a74,
13950 uint64_t a75,
13951 uint64_t a76,
13952 uint64_t a77,
13953 uint64_t a78,
13954 uint64_t a79,
13955 uint64_t a80,
13956 uint64_t a81,
13957 uint64_t a82,
13958 uint64_t a83,
13959 uint64_t a84,
13960 uint64_t a85,
13961 uint64_t a86,
13962 uint64_t a87,
13963 uint64_t a88,
13964 uint64_t a89,
13965 uint64_t a90,
13966 uint64_t a91,
13967 uint64_t a92,
13968 uint64_t a93,
13969 uint64_t a94,
13970 uint64_t a95,
13971 uint64_t a96,
13972 uint64_t a97,
13973 uint64_t a98,
13974 uint64_t a99,
13975 uint64_t a100,
13976 uint64_t a101,
13977 uint64_t a102,
13978 uint64_t a103,
13979 uint64_t a104,
13980 uint64_t a105,
13981 uint64_t a106,
13982 uint64_t a107,
13983 uint64_t a108,
13984 uint64_t a109,
13985 uint64_t a110,
13986 uint64_t a111,
13987 uint64_t a112,
13988 uint64_t a113,
13989 uint64_t a114,
13990 uint64_t a115,
13991 uint64_t a116,
13992 uint64_t a117,
13993 uint64_t a118,
13994 uint64_t a119,
13995 uint64_t a120,
13996 uint64_t a121,
13997 uint64_t a122,
13998 uint64_t a123,
13999 uint64_t a124,
14000 uint64_t a125,
14001 uint64_t a126,
14002 uint64_t a127)) {
14003 uint64_t a0;
14004 uint64_t a1;
14005 uint64_t a2;
14006 uint64_t a3;
14007 uint64_t a4;
14008 uint64_t a5;
14009 uint64_t a6;
14010 uint64_t a7;
14011 uint64_t a8;
14012 uint64_t a9;
14013 uint64_t a10;
14014 uint64_t a11;
14015 uint64_t a12;
14016 uint64_t a13;
14017 uint64_t a14;
14018 uint64_t a15;
14019 uint64_t a16;
14020 uint64_t a17;
14021 uint64_t a18;
14022 uint64_t a19;
14023 uint64_t a20;
14024 uint64_t a21;
14025 uint64_t a22;
14026 uint64_t a23;
14027 uint64_t a24;
14028 uint64_t a25;
14029 uint64_t a26;
14030 uint64_t a27;
14031 uint64_t a28;
14032 uint64_t a29;
14033 uint64_t a30;
14034 uint64_t a31;
14035 uint64_t a32;
14036 uint64_t a33;
14037 uint64_t a34;
14038 uint64_t a35;
14039 uint64_t a36;
14040 uint64_t a37;
14041 uint64_t a38;
14042 uint64_t a39;
14043 uint64_t a40;
14044 uint64_t a41;
14045 uint64_t a42;
14046 uint64_t a43;
14047 uint64_t a44;
14048 uint64_t a45;
14049 uint64_t a46;
14050 uint64_t a47;
14051 uint64_t a48;
14052 uint64_t a49;
14053 uint64_t a50;
14054 uint64_t a51;
14055 uint64_t a52;
14056 uint64_t a53;
14057 uint64_t a54;
14058 uint64_t a55;
14059 uint64_t a56;
14060 uint64_t a57;
14061 uint64_t a58;
14062 uint64_t a59;
14063 uint64_t a60;
14064 uint64_t a61;
14065 uint64_t a62;
14066 uint64_t a63;
14067 uint64_t a64;
14068 uint64_t a65;
14069 uint64_t a66;
14070 uint64_t a67;
14071 uint64_t a68;
14072 uint64_t a69;
14073 uint64_t a70;
14074 uint64_t a71;
14075 uint64_t a72;
14076 uint64_t a73;
14077 uint64_t a74;
14078 uint64_t a75;
14079 uint64_t a76;
14080 uint64_t a77;
14081 uint64_t a78;
14082 uint64_t a79;
14083 uint64_t a80;
14084 uint64_t a81;
14085 uint64_t a82;
14086 uint64_t a83;
14087 uint64_t a84;
14088 uint64_t a85;
14089 uint64_t a86;
14090 uint64_t a87;
14091 uint64_t a88;
14092 uint64_t a89;
14093 uint64_t a90;
14094 uint64_t a91;
14095 uint64_t a92;
14096 uint64_t a93;
14097 uint64_t a94;
14098 uint64_t a95;
14099 uint64_t a96;
14100 uint64_t a97;
14101 uint64_t a98;
14102 uint64_t a99;
14103 uint64_t a100;
14104 uint64_t a101;
14105 uint64_t a102;
14106 uint64_t a103;
14107 uint64_t a104;
14108 uint64_t a105;
14109 uint64_t a106;
14110 uint64_t a107;
14111 uint64_t a108;
14112 uint64_t a109;
14113 uint64_t a110;
14114 uint64_t a111;
14115 uint64_t a112;
14116 uint64_t a113;
14117 uint64_t a114;
14118 uint64_t a115;
14119 uint64_t a116;
14120 uint64_t a117;
14121 uint64_t a118;
14122 uint64_t a119;
14123 uint64_t a120;
14124 uint64_t a121;
14125 uint64_t a122;
14126 uint64_t a123;
14127 uint64_t a124;
14128 uint64_t a125;
14129 uint64_t a126;
14130 uint64_t a127;
14131
14132 a0 = 1;
14133 a1 = 2;
14134 a2 = 3;
14135 a3 = 4;
14136 a4 = 5;
14137 a5 = 6;
14138 a6 = 7;
14139 a7 = 8;
14140 a8 = 9;
14141 a9 = 10;
14142 a10 = 11;
14143 a11 = 12;
14144 a12 = 13;
14145 a13 = 14;
14146 a14 = 15;
14147 a15 = 16;
14148 a16 = 17;
14149 a17 = 18;
14150 a18 = 19;
14151 a19 = 20;
14152 a20 = 21;
14153 a21 = 22;
14154 a22 = 23;
14155 a23 = 24;
14156 a24 = 25;
14157 a25 = 26;
14158 a26 = 27;
14159 a27 = 28;
14160 a28 = 29;
14161 a29 = 30;
14162 a30 = 31;
14163 a31 = 32;
14164 a32 = 33;
14165 a33 = 34;
14166 a34 = 35;
14167 a35 = 36;
14168 a36 = 37;
14169 a37 = 38;
14170 a38 = 39;
14171 a39 = 40;
14172 a40 = 41;
14173 a41 = 42;
14174 a42 = 43;
14175 a43 = 44;
14176 a44 = 45;
14177 a45 = 46;
14178 a46 = 47;
14179 a47 = 48;
14180 a48 = 49;
14181 a49 = 50;
14182 a50 = 51;
14183 a51 = 52;
14184 a52 = 53;
14185 a53 = 54;
14186 a54 = 55;
14187 a55 = 56;
14188 a56 = 57;
14189 a57 = 58;
14190 a58 = 59;
14191 a59 = 60;
14192 a60 = 61;
14193 a61 = 62;
14194 a62 = 63;
14195 a63 = 64;
14196 a64 = 65;
14197 a65 = 66;
14198 a66 = 67;
14199 a67 = 68;
14200 a68 = 69;
14201 a69 = 70;
14202 a70 = 71;
14203 a71 = 72;
14204 a72 = 73;
14205 a73 = 74;
14206 a74 = 75;
14207 a75 = 76;
14208 a76 = 77;
14209 a77 = 78;
14210 a78 = 79;
14211 a79 = 80;
14212 a80 = 81;
14213 a81 = 82;
14214 a82 = 83;
14215 a83 = 84;
14216 a84 = 85;
14217 a85 = 86;
14218 a86 = 87;
14219 a87 = 88;
14220 a88 = 89;
14221 a89 = 90;
14222 a90 = 91;
14223 a91 = 92;
14224 a92 = 93;
14225 a93 = 94;
14226 a94 = 95;
14227 a95 = 96;
14228 a96 = 97;
14229 a97 = 98;
14230 a98 = 99;
14231 a99 = 100;
14232 a100 = 101;
14233 a101 = 102;
14234 a102 = 103;
14235 a103 = 104;
14236 a104 = 105;
14237 a105 = 106;
14238 a106 = 107;
14239 a107 = 108;
14240 a108 = 109;
14241 a109 = 110;
14242 a110 = 111;
14243 a111 = 112;
14244 a112 = 113;
14245 a113 = 114;
14246 a114 = 115;
14247 a115 = 116;
14248 a116 = 117;
14249 a117 = 118;
14250 a118 = 119;
14251 a119 = 120;
14252 a120 = 121;
14253 a121 = 122;
14254 a122 = 123;
14255 a123 = 124;
14256 a124 = 125;
14257 a125 = 126;
14258 a126 = 127;
14259 a127 = 128;
14260
14261 std::cout << "Calling TestReturnStruct1024BytesHomogeneousUint64("
14262 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
14263 << ", " << a5 << ", " << a6 << ", " << a7 << ", " << a8 << ", "
14264 << a9 << ", " << a10 << ", " << a11 << ", " << a12 << ", " << a13
14265 << ", " << a14 << ", " << a15 << ", " << a16 << ", " << a17 << ", "
14266 << a18 << ", " << a19 << ", " << a20 << ", " << a21 << ", " << a22
14267 << ", " << a23 << ", " << a24 << ", " << a25 << ", " << a26 << ", "
14268 << a27 << ", " << a28 << ", " << a29 << ", " << a30 << ", " << a31
14269 << ", " << a32 << ", " << a33 << ", " << a34 << ", " << a35 << ", "
14270 << a36 << ", " << a37 << ", " << a38 << ", " << a39 << ", " << a40
14271 << ", " << a41 << ", " << a42 << ", " << a43 << ", " << a44 << ", "
14272 << a45 << ", " << a46 << ", " << a47 << ", " << a48 << ", " << a49
14273 << ", " << a50 << ", " << a51 << ", " << a52 << ", " << a53 << ", "
14274 << a54 << ", " << a55 << ", " << a56 << ", " << a57 << ", " << a58
14275 << ", " << a59 << ", " << a60 << ", " << a61 << ", " << a62 << ", "
14276 << a63 << ", " << a64 << ", " << a65 << ", " << a66 << ", " << a67
14277 << ", " << a68 << ", " << a69 << ", " << a70 << ", " << a71 << ", "
14278 << a72 << ", " << a73 << ", " << a74 << ", " << a75 << ", " << a76
14279 << ", " << a77 << ", " << a78 << ", " << a79 << ", " << a80 << ", "
14280 << a81 << ", " << a82 << ", " << a83 << ", " << a84 << ", " << a85
14281 << ", " << a86 << ", " << a87 << ", " << a88 << ", " << a89 << ", "
14282 << a90 << ", " << a91 << ", " << a92 << ", " << a93 << ", " << a94
14283 << ", " << a95 << ", " << a96 << ", " << a97 << ", " << a98 << ", "
14284 << a99 << ", " << a100 << ", " << a101 << ", " << a102 << ", "
14285 << a103 << ", " << a104 << ", " << a105 << ", " << a106 << ", "
14286 << a107 << ", " << a108 << ", " << a109 << ", " << a110 << ", "
14287 << a111 << ", " << a112 << ", " << a113 << ", " << a114 << ", "
14288 << a115 << ", " << a116 << ", " << a117 << ", " << a118 << ", "
14289 << a119 << ", " << a120 << ", " << a121 << ", " << a122 << ", "
14290 << a123 << ", " << a124 << ", " << a125 << ", " << a126 << ", "
14291 << a127 << ")"
14292 << ")\n";
14293
14295 a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16,
14296 a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31,
14297 a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, a45, a46,
14298 a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61,
14299 a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, a74, a75, a76,
14300 a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91,
14301 a92, a93, a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104,
14302 a105, a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116,
14303 a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127);
14304
14305 std::cout << "result = "
14306 << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
14307 << ", " << result.a3 << ", " << result.a4 << ", " << result.a5
14308 << ", " << result.a6 << ", " << result.a7 << ", " << result.a8
14309 << ", " << result.a9 << ", " << result.a10 << ", " << result.a11
14310 << ", " << result.a12 << ", " << result.a13 << ", " << result.a14
14311 << ", " << result.a15 << ", " << result.a16 << ", " << result.a17
14312 << ", " << result.a18 << ", " << result.a19 << ", " << result.a20
14313 << ", " << result.a21 << ", " << result.a22 << ", " << result.a23
14314 << ", " << result.a24 << ", " << result.a25 << ", " << result.a26
14315 << ", " << result.a27 << ", " << result.a28 << ", " << result.a29
14316 << ", " << result.a30 << ", " << result.a31 << ", " << result.a32
14317 << ", " << result.a33 << ", " << result.a34 << ", " << result.a35
14318 << ", " << result.a36 << ", " << result.a37 << ", " << result.a38
14319 << ", " << result.a39 << ", " << result.a40 << ", " << result.a41
14320 << ", " << result.a42 << ", " << result.a43 << ", " << result.a44
14321 << ", " << result.a45 << ", " << result.a46 << ", " << result.a47
14322 << ", " << result.a48 << ", " << result.a49 << ", " << result.a50
14323 << ", " << result.a51 << ", " << result.a52 << ", " << result.a53
14324 << ", " << result.a54 << ", " << result.a55 << ", " << result.a56
14325 << ", " << result.a57 << ", " << result.a58 << ", " << result.a59
14326 << ", " << result.a60 << ", " << result.a61 << ", " << result.a62
14327 << ", " << result.a63 << ", " << result.a64 << ", " << result.a65
14328 << ", " << result.a66 << ", " << result.a67 << ", " << result.a68
14329 << ", " << result.a69 << ", " << result.a70 << ", " << result.a71
14330 << ", " << result.a72 << ", " << result.a73 << ", " << result.a74
14331 << ", " << result.a75 << ", " << result.a76 << ", " << result.a77
14332 << ", " << result.a78 << ", " << result.a79 << ", " << result.a80
14333 << ", " << result.a81 << ", " << result.a82 << ", " << result.a83
14334 << ", " << result.a84 << ", " << result.a85 << ", " << result.a86
14335 << ", " << result.a87 << ", " << result.a88 << ", " << result.a89
14336 << ", " << result.a90 << ", " << result.a91 << ", " << result.a92
14337 << ", " << result.a93 << ", " << result.a94 << ", " << result.a95
14338 << ", " << result.a96 << ", " << result.a97 << ", " << result.a98
14339 << ", " << result.a99 << ", " << result.a100 << ", " << result.a101
14340 << ", " << result.a102 << ", " << result.a103 << ", " << result.a104
14341 << ", " << result.a105 << ", " << result.a106 << ", " << result.a107
14342 << ", " << result.a108 << ", " << result.a109 << ", " << result.a110
14343 << ", " << result.a111 << ", " << result.a112 << ", " << result.a113
14344 << ", " << result.a114 << ", " << result.a115 << ", " << result.a116
14345 << ", " << result.a117 << ", " << result.a118 << ", " << result.a119
14346 << ", " << result.a120 << ", " << result.a121 << ", " << result.a122
14347 << ", " << result.a123 << ", " << result.a124 << ", " << result.a125
14348 << ", " << result.a126 << ", " << result.a127 << ")"
14349 << "\n";
14350
14351 CHECK_EQ(a0, result.a0);
14352 CHECK_EQ(a1, result.a1);
14353 CHECK_EQ(a2, result.a2);
14354 CHECK_EQ(a3, result.a3);
14355 CHECK_EQ(a4, result.a4);
14356 CHECK_EQ(a5, result.a5);
14357 CHECK_EQ(a6, result.a6);
14358 CHECK_EQ(a7, result.a7);
14359 CHECK_EQ(a8, result.a8);
14360 CHECK_EQ(a9, result.a9);
14361 CHECK_EQ(a10, result.a10);
14362 CHECK_EQ(a11, result.a11);
14363 CHECK_EQ(a12, result.a12);
14364 CHECK_EQ(a13, result.a13);
14365 CHECK_EQ(a14, result.a14);
14366 CHECK_EQ(a15, result.a15);
14367 CHECK_EQ(a16, result.a16);
14368 CHECK_EQ(a17, result.a17);
14369 CHECK_EQ(a18, result.a18);
14370 CHECK_EQ(a19, result.a19);
14371 CHECK_EQ(a20, result.a20);
14372 CHECK_EQ(a21, result.a21);
14373 CHECK_EQ(a22, result.a22);
14374 CHECK_EQ(a23, result.a23);
14375 CHECK_EQ(a24, result.a24);
14376 CHECK_EQ(a25, result.a25);
14377 CHECK_EQ(a26, result.a26);
14378 CHECK_EQ(a27, result.a27);
14379 CHECK_EQ(a28, result.a28);
14380 CHECK_EQ(a29, result.a29);
14381 CHECK_EQ(a30, result.a30);
14382 CHECK_EQ(a31, result.a31);
14383 CHECK_EQ(a32, result.a32);
14384 CHECK_EQ(a33, result.a33);
14385 CHECK_EQ(a34, result.a34);
14386 CHECK_EQ(a35, result.a35);
14387 CHECK_EQ(a36, result.a36);
14388 CHECK_EQ(a37, result.a37);
14389 CHECK_EQ(a38, result.a38);
14390 CHECK_EQ(a39, result.a39);
14391 CHECK_EQ(a40, result.a40);
14392 CHECK_EQ(a41, result.a41);
14393 CHECK_EQ(a42, result.a42);
14394 CHECK_EQ(a43, result.a43);
14395 CHECK_EQ(a44, result.a44);
14396 CHECK_EQ(a45, result.a45);
14397 CHECK_EQ(a46, result.a46);
14398 CHECK_EQ(a47, result.a47);
14399 CHECK_EQ(a48, result.a48);
14400 CHECK_EQ(a49, result.a49);
14401 CHECK_EQ(a50, result.a50);
14402 CHECK_EQ(a51, result.a51);
14403 CHECK_EQ(a52, result.a52);
14404 CHECK_EQ(a53, result.a53);
14405 CHECK_EQ(a54, result.a54);
14406 CHECK_EQ(a55, result.a55);
14407 CHECK_EQ(a56, result.a56);
14408 CHECK_EQ(a57, result.a57);
14409 CHECK_EQ(a58, result.a58);
14410 CHECK_EQ(a59, result.a59);
14411 CHECK_EQ(a60, result.a60);
14412 CHECK_EQ(a61, result.a61);
14413 CHECK_EQ(a62, result.a62);
14414 CHECK_EQ(a63, result.a63);
14415 CHECK_EQ(a64, result.a64);
14416 CHECK_EQ(a65, result.a65);
14417 CHECK_EQ(a66, result.a66);
14418 CHECK_EQ(a67, result.a67);
14419 CHECK_EQ(a68, result.a68);
14420 CHECK_EQ(a69, result.a69);
14421 CHECK_EQ(a70, result.a70);
14422 CHECK_EQ(a71, result.a71);
14423 CHECK_EQ(a72, result.a72);
14424 CHECK_EQ(a73, result.a73);
14425 CHECK_EQ(a74, result.a74);
14426 CHECK_EQ(a75, result.a75);
14427 CHECK_EQ(a76, result.a76);
14428 CHECK_EQ(a77, result.a77);
14429 CHECK_EQ(a78, result.a78);
14430 CHECK_EQ(a79, result.a79);
14431 CHECK_EQ(a80, result.a80);
14432 CHECK_EQ(a81, result.a81);
14433 CHECK_EQ(a82, result.a82);
14434 CHECK_EQ(a83, result.a83);
14435 CHECK_EQ(a84, result.a84);
14436 CHECK_EQ(a85, result.a85);
14437 CHECK_EQ(a86, result.a86);
14438 CHECK_EQ(a87, result.a87);
14439 CHECK_EQ(a88, result.a88);
14440 CHECK_EQ(a89, result.a89);
14441 CHECK_EQ(a90, result.a90);
14442 CHECK_EQ(a91, result.a91);
14443 CHECK_EQ(a92, result.a92);
14444 CHECK_EQ(a93, result.a93);
14445 CHECK_EQ(a94, result.a94);
14446 CHECK_EQ(a95, result.a95);
14447 CHECK_EQ(a96, result.a96);
14448 CHECK_EQ(a97, result.a97);
14449 CHECK_EQ(a98, result.a98);
14450 CHECK_EQ(a99, result.a99);
14451 CHECK_EQ(a100, result.a100);
14452 CHECK_EQ(a101, result.a101);
14453 CHECK_EQ(a102, result.a102);
14454 CHECK_EQ(a103, result.a103);
14455 CHECK_EQ(a104, result.a104);
14456 CHECK_EQ(a105, result.a105);
14457 CHECK_EQ(a106, result.a106);
14458 CHECK_EQ(a107, result.a107);
14459 CHECK_EQ(a108, result.a108);
14460 CHECK_EQ(a109, result.a109);
14461 CHECK_EQ(a110, result.a110);
14462 CHECK_EQ(a111, result.a111);
14463 CHECK_EQ(a112, result.a112);
14464 CHECK_EQ(a113, result.a113);
14465 CHECK_EQ(a114, result.a114);
14466 CHECK_EQ(a115, result.a115);
14467 CHECK_EQ(a116, result.a116);
14468 CHECK_EQ(a117, result.a117);
14469 CHECK_EQ(a118, result.a118);
14470 CHECK_EQ(a119, result.a119);
14471 CHECK_EQ(a120, result.a120);
14472 CHECK_EQ(a121, result.a121);
14473 CHECK_EQ(a122, result.a122);
14474 CHECK_EQ(a123, result.a123);
14475 CHECK_EQ(a124, result.a124);
14476 CHECK_EQ(a125, result.a125);
14477 CHECK_EQ(a126, result.a126);
14478 CHECK_EQ(a127, result.a127);
14479
14480 // Pass argument that will make the Dart callback throw.
14481 a0 = 42;
14482
14483 result = f(
14484 a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16,
14485 a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31,
14486 a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, a45, a46,
14487 a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61,
14488 a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, a74, a75, a76,
14489 a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91,
14490 a92, a93, a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104,
14491 a105, a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116,
14492 a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127);
14493
14494 CHECK_EQ(0, result.a0);
14495 CHECK_EQ(0, result.a1);
14496 CHECK_EQ(0, result.a2);
14497 CHECK_EQ(0, result.a3);
14498 CHECK_EQ(0, result.a4);
14499 CHECK_EQ(0, result.a5);
14500 CHECK_EQ(0, result.a6);
14501 CHECK_EQ(0, result.a7);
14502 CHECK_EQ(0, result.a8);
14503 CHECK_EQ(0, result.a9);
14504 CHECK_EQ(0, result.a10);
14505 CHECK_EQ(0, result.a11);
14506 CHECK_EQ(0, result.a12);
14507 CHECK_EQ(0, result.a13);
14508 CHECK_EQ(0, result.a14);
14509 CHECK_EQ(0, result.a15);
14510 CHECK_EQ(0, result.a16);
14511 CHECK_EQ(0, result.a17);
14512 CHECK_EQ(0, result.a18);
14513 CHECK_EQ(0, result.a19);
14514 CHECK_EQ(0, result.a20);
14515 CHECK_EQ(0, result.a21);
14516 CHECK_EQ(0, result.a22);
14517 CHECK_EQ(0, result.a23);
14518 CHECK_EQ(0, result.a24);
14519 CHECK_EQ(0, result.a25);
14520 CHECK_EQ(0, result.a26);
14521 CHECK_EQ(0, result.a27);
14522 CHECK_EQ(0, result.a28);
14523 CHECK_EQ(0, result.a29);
14524 CHECK_EQ(0, result.a30);
14525 CHECK_EQ(0, result.a31);
14526 CHECK_EQ(0, result.a32);
14527 CHECK_EQ(0, result.a33);
14528 CHECK_EQ(0, result.a34);
14529 CHECK_EQ(0, result.a35);
14530 CHECK_EQ(0, result.a36);
14531 CHECK_EQ(0, result.a37);
14532 CHECK_EQ(0, result.a38);
14533 CHECK_EQ(0, result.a39);
14534 CHECK_EQ(0, result.a40);
14535 CHECK_EQ(0, result.a41);
14536 CHECK_EQ(0, result.a42);
14537 CHECK_EQ(0, result.a43);
14538 CHECK_EQ(0, result.a44);
14539 CHECK_EQ(0, result.a45);
14540 CHECK_EQ(0, result.a46);
14541 CHECK_EQ(0, result.a47);
14542 CHECK_EQ(0, result.a48);
14543 CHECK_EQ(0, result.a49);
14544 CHECK_EQ(0, result.a50);
14545 CHECK_EQ(0, result.a51);
14546 CHECK_EQ(0, result.a52);
14547 CHECK_EQ(0, result.a53);
14548 CHECK_EQ(0, result.a54);
14549 CHECK_EQ(0, result.a55);
14550 CHECK_EQ(0, result.a56);
14551 CHECK_EQ(0, result.a57);
14552 CHECK_EQ(0, result.a58);
14553 CHECK_EQ(0, result.a59);
14554 CHECK_EQ(0, result.a60);
14555 CHECK_EQ(0, result.a61);
14556 CHECK_EQ(0, result.a62);
14557 CHECK_EQ(0, result.a63);
14558 CHECK_EQ(0, result.a64);
14559 CHECK_EQ(0, result.a65);
14560 CHECK_EQ(0, result.a66);
14561 CHECK_EQ(0, result.a67);
14562 CHECK_EQ(0, result.a68);
14563 CHECK_EQ(0, result.a69);
14564 CHECK_EQ(0, result.a70);
14565 CHECK_EQ(0, result.a71);
14566 CHECK_EQ(0, result.a72);
14567 CHECK_EQ(0, result.a73);
14568 CHECK_EQ(0, result.a74);
14569 CHECK_EQ(0, result.a75);
14570 CHECK_EQ(0, result.a76);
14571 CHECK_EQ(0, result.a77);
14572 CHECK_EQ(0, result.a78);
14573 CHECK_EQ(0, result.a79);
14574 CHECK_EQ(0, result.a80);
14575 CHECK_EQ(0, result.a81);
14576 CHECK_EQ(0, result.a82);
14577 CHECK_EQ(0, result.a83);
14578 CHECK_EQ(0, result.a84);
14579 CHECK_EQ(0, result.a85);
14580 CHECK_EQ(0, result.a86);
14581 CHECK_EQ(0, result.a87);
14582 CHECK_EQ(0, result.a88);
14583 CHECK_EQ(0, result.a89);
14584 CHECK_EQ(0, result.a90);
14585 CHECK_EQ(0, result.a91);
14586 CHECK_EQ(0, result.a92);
14587 CHECK_EQ(0, result.a93);
14588 CHECK_EQ(0, result.a94);
14589 CHECK_EQ(0, result.a95);
14590 CHECK_EQ(0, result.a96);
14591 CHECK_EQ(0, result.a97);
14592 CHECK_EQ(0, result.a98);
14593 CHECK_EQ(0, result.a99);
14594 CHECK_EQ(0, result.a100);
14595 CHECK_EQ(0, result.a101);
14596 CHECK_EQ(0, result.a102);
14597 CHECK_EQ(0, result.a103);
14598 CHECK_EQ(0, result.a104);
14599 CHECK_EQ(0, result.a105);
14600 CHECK_EQ(0, result.a106);
14601 CHECK_EQ(0, result.a107);
14602 CHECK_EQ(0, result.a108);
14603 CHECK_EQ(0, result.a109);
14604 CHECK_EQ(0, result.a110);
14605 CHECK_EQ(0, result.a111);
14606 CHECK_EQ(0, result.a112);
14607 CHECK_EQ(0, result.a113);
14608 CHECK_EQ(0, result.a114);
14609 CHECK_EQ(0, result.a115);
14610 CHECK_EQ(0, result.a116);
14611 CHECK_EQ(0, result.a117);
14612 CHECK_EQ(0, result.a118);
14613 CHECK_EQ(0, result.a119);
14614 CHECK_EQ(0, result.a120);
14615 CHECK_EQ(0, result.a121);
14616 CHECK_EQ(0, result.a122);
14617 CHECK_EQ(0, result.a123);
14618 CHECK_EQ(0, result.a124);
14619 CHECK_EQ(0, result.a125);
14620 CHECK_EQ(0, result.a126);
14621 CHECK_EQ(0, result.a127);
14622
14623 // Pass argument that will make the Dart callback return null.
14624 a0 = 84;
14625
14626 result = f(
14627 a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16,
14628 a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31,
14629 a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, a45, a46,
14630 a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61,
14631 a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, a74, a75, a76,
14632 a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91,
14633 a92, a93, a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104,
14634 a105, a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116,
14635 a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127);
14636
14637 CHECK_EQ(0, result.a0);
14638 CHECK_EQ(0, result.a1);
14639 CHECK_EQ(0, result.a2);
14640 CHECK_EQ(0, result.a3);
14641 CHECK_EQ(0, result.a4);
14642 CHECK_EQ(0, result.a5);
14643 CHECK_EQ(0, result.a6);
14644 CHECK_EQ(0, result.a7);
14645 CHECK_EQ(0, result.a8);
14646 CHECK_EQ(0, result.a9);
14647 CHECK_EQ(0, result.a10);
14648 CHECK_EQ(0, result.a11);
14649 CHECK_EQ(0, result.a12);
14650 CHECK_EQ(0, result.a13);
14651 CHECK_EQ(0, result.a14);
14652 CHECK_EQ(0, result.a15);
14653 CHECK_EQ(0, result.a16);
14654 CHECK_EQ(0, result.a17);
14655 CHECK_EQ(0, result.a18);
14656 CHECK_EQ(0, result.a19);
14657 CHECK_EQ(0, result.a20);
14658 CHECK_EQ(0, result.a21);
14659 CHECK_EQ(0, result.a22);
14660 CHECK_EQ(0, result.a23);
14661 CHECK_EQ(0, result.a24);
14662 CHECK_EQ(0, result.a25);
14663 CHECK_EQ(0, result.a26);
14664 CHECK_EQ(0, result.a27);
14665 CHECK_EQ(0, result.a28);
14666 CHECK_EQ(0, result.a29);
14667 CHECK_EQ(0, result.a30);
14668 CHECK_EQ(0, result.a31);
14669 CHECK_EQ(0, result.a32);
14670 CHECK_EQ(0, result.a33);
14671 CHECK_EQ(0, result.a34);
14672 CHECK_EQ(0, result.a35);
14673 CHECK_EQ(0, result.a36);
14674 CHECK_EQ(0, result.a37);
14675 CHECK_EQ(0, result.a38);
14676 CHECK_EQ(0, result.a39);
14677 CHECK_EQ(0, result.a40);
14678 CHECK_EQ(0, result.a41);
14679 CHECK_EQ(0, result.a42);
14680 CHECK_EQ(0, result.a43);
14681 CHECK_EQ(0, result.a44);
14682 CHECK_EQ(0, result.a45);
14683 CHECK_EQ(0, result.a46);
14684 CHECK_EQ(0, result.a47);
14685 CHECK_EQ(0, result.a48);
14686 CHECK_EQ(0, result.a49);
14687 CHECK_EQ(0, result.a50);
14688 CHECK_EQ(0, result.a51);
14689 CHECK_EQ(0, result.a52);
14690 CHECK_EQ(0, result.a53);
14691 CHECK_EQ(0, result.a54);
14692 CHECK_EQ(0, result.a55);
14693 CHECK_EQ(0, result.a56);
14694 CHECK_EQ(0, result.a57);
14695 CHECK_EQ(0, result.a58);
14696 CHECK_EQ(0, result.a59);
14697 CHECK_EQ(0, result.a60);
14698 CHECK_EQ(0, result.a61);
14699 CHECK_EQ(0, result.a62);
14700 CHECK_EQ(0, result.a63);
14701 CHECK_EQ(0, result.a64);
14702 CHECK_EQ(0, result.a65);
14703 CHECK_EQ(0, result.a66);
14704 CHECK_EQ(0, result.a67);
14705 CHECK_EQ(0, result.a68);
14706 CHECK_EQ(0, result.a69);
14707 CHECK_EQ(0, result.a70);
14708 CHECK_EQ(0, result.a71);
14709 CHECK_EQ(0, result.a72);
14710 CHECK_EQ(0, result.a73);
14711 CHECK_EQ(0, result.a74);
14712 CHECK_EQ(0, result.a75);
14713 CHECK_EQ(0, result.a76);
14714 CHECK_EQ(0, result.a77);
14715 CHECK_EQ(0, result.a78);
14716 CHECK_EQ(0, result.a79);
14717 CHECK_EQ(0, result.a80);
14718 CHECK_EQ(0, result.a81);
14719 CHECK_EQ(0, result.a82);
14720 CHECK_EQ(0, result.a83);
14721 CHECK_EQ(0, result.a84);
14722 CHECK_EQ(0, result.a85);
14723 CHECK_EQ(0, result.a86);
14724 CHECK_EQ(0, result.a87);
14725 CHECK_EQ(0, result.a88);
14726 CHECK_EQ(0, result.a89);
14727 CHECK_EQ(0, result.a90);
14728 CHECK_EQ(0, result.a91);
14729 CHECK_EQ(0, result.a92);
14730 CHECK_EQ(0, result.a93);
14731 CHECK_EQ(0, result.a94);
14732 CHECK_EQ(0, result.a95);
14733 CHECK_EQ(0, result.a96);
14734 CHECK_EQ(0, result.a97);
14735 CHECK_EQ(0, result.a98);
14736 CHECK_EQ(0, result.a99);
14737 CHECK_EQ(0, result.a100);
14738 CHECK_EQ(0, result.a101);
14739 CHECK_EQ(0, result.a102);
14740 CHECK_EQ(0, result.a103);
14741 CHECK_EQ(0, result.a104);
14742 CHECK_EQ(0, result.a105);
14743 CHECK_EQ(0, result.a106);
14744 CHECK_EQ(0, result.a107);
14745 CHECK_EQ(0, result.a108);
14746 CHECK_EQ(0, result.a109);
14747 CHECK_EQ(0, result.a110);
14748 CHECK_EQ(0, result.a111);
14749 CHECK_EQ(0, result.a112);
14750 CHECK_EQ(0, result.a113);
14751 CHECK_EQ(0, result.a114);
14752 CHECK_EQ(0, result.a115);
14753 CHECK_EQ(0, result.a116);
14754 CHECK_EQ(0, result.a117);
14755 CHECK_EQ(0, result.a118);
14756 CHECK_EQ(0, result.a119);
14757 CHECK_EQ(0, result.a120);
14758 CHECK_EQ(0, result.a121);
14759 CHECK_EQ(0, result.a122);
14760 CHECK_EQ(0, result.a123);
14761 CHECK_EQ(0, result.a124);
14762 CHECK_EQ(0, result.a125);
14763 CHECK_EQ(0, result.a126);
14764 CHECK_EQ(0, result.a127);
14765
14766 return 0;
14767}
14768
14769// Used for testing structs and unions by value.
14770// Small struct with mis-aligned member.
14772 // NOLINTNEXTLINE(whitespace/parens)
14773 Struct3BytesPackedInt (*f)(int8_t a0, int16_t a1)) {
14774 int8_t a0;
14775 int16_t a1;
14776
14777 a0 = -1;
14778 a1 = 2;
14779
14780 std::cout << "Calling TestReturnStruct3BytesPackedInt("
14781 << "(" << static_cast<int>(a0) << ", " << a1 << ")"
14782 << ")\n";
14783
14784 Struct3BytesPackedInt result = f(a0, a1);
14785
14786 std::cout << "result = "
14787 << "(" << static_cast<int>(result.a0) << ", " << result.a1 << ")"
14788 << "\n";
14789
14790 CHECK_EQ(a0, result.a0);
14791 CHECK_EQ(a1, result.a1);
14792
14793 // Pass argument that will make the Dart callback throw.
14794 a0 = 42;
14795
14796 result = f(a0, a1);
14797
14798 CHECK_EQ(0, result.a0);
14799 CHECK_EQ(0, result.a1);
14800
14801 // Pass argument that will make the Dart callback return null.
14802 a0 = 84;
14803
14804 result = f(a0, a1);
14805
14806 CHECK_EQ(0, result.a0);
14807 CHECK_EQ(0, result.a1);
14808
14809 return 0;
14810}
14811
14812// Used for testing structs and unions by value.
14813// Struct with mis-aligned member.
14815 // NOLINTNEXTLINE(whitespace/parens)
14817 *f)(uint8_t a0, uint32_t a1, uint8_t a2, uint8_t a3, uint8_t a4)) {
14818 uint8_t a0;
14819 uint32_t a1;
14820 uint8_t a2;
14821 uint8_t a3;
14822 uint8_t a4;
14823
14824 a0 = 1;
14825 a1 = 2;
14826 a2 = 3;
14827 a3 = 4;
14828 a4 = 5;
14829
14830 std::cout << "Calling TestReturnStruct8BytesPackedInt("
14831 << "(" << static_cast<int>(a0) << ", " << a1 << ", "
14832 << static_cast<int>(a2) << ", " << static_cast<int>(a3) << ", "
14833 << static_cast<int>(a4) << ")"
14834 << ")\n";
14835
14836 Struct8BytesPackedInt result = f(a0, a1, a2, a3, a4);
14837
14838 std::cout << "result = "
14839 << "(" << static_cast<int>(result.a0) << ", " << result.a1 << ", "
14840 << static_cast<int>(result.a2) << ", "
14841 << static_cast<int>(result.a3) << ", "
14842 << static_cast<int>(result.a4) << ")"
14843 << "\n";
14844
14845 CHECK_EQ(a0, result.a0);
14846 CHECK_EQ(a1, result.a1);
14847 CHECK_EQ(a2, result.a2);
14848 CHECK_EQ(a3, result.a3);
14849 CHECK_EQ(a4, result.a4);
14850
14851 // Pass argument that will make the Dart callback throw.
14852 a0 = 42;
14853
14854 result = f(a0, a1, a2, a3, a4);
14855
14856 CHECK_EQ(0, result.a0);
14857 CHECK_EQ(0, result.a1);
14858 CHECK_EQ(0, result.a2);
14859 CHECK_EQ(0, result.a3);
14860 CHECK_EQ(0, result.a4);
14861
14862 // Pass argument that will make the Dart callback return null.
14863 a0 = 84;
14864
14865 result = f(a0, a1, a2, a3, a4);
14866
14867 CHECK_EQ(0, result.a0);
14868 CHECK_EQ(0, result.a1);
14869 CHECK_EQ(0, result.a2);
14870 CHECK_EQ(0, result.a3);
14871 CHECK_EQ(0, result.a4);
14872
14873 return 0;
14874}
14875
14876// Used for testing structs and unions by value.
14877// Struct with mis-aligned member.
14878// Tests backfilling of CPU and FPU registers.
14880 // NOLINTNEXTLINE(whitespace/parens)
14881 Struct9BytesPackedMixed (*f)(uint8_t a0, double a1)) {
14882 uint8_t a0;
14883 double a1;
14884
14885 a0 = 1;
14886 a1 = 2.0;
14887
14888 std::cout << "Calling TestReturnStruct9BytesPackedMixed("
14889 << "(" << static_cast<int>(a0) << ", " << a1 << ")"
14890 << ")\n";
14891
14893
14894 std::cout << "result = "
14895 << "(" << static_cast<int>(result.a0) << ", " << result.a1 << ")"
14896 << "\n";
14897
14898 CHECK_EQ(a0, result.a0);
14899 CHECK_APPROX(a1, result.a1);
14900
14901 // Pass argument that will make the Dart callback throw.
14902 a0 = 42;
14903
14904 result = f(a0, a1);
14905
14906 CHECK_EQ(0, result.a0);
14907 CHECK_APPROX(0.0, result.a1);
14908
14909 // Pass argument that will make the Dart callback return null.
14910 a0 = 84;
14911
14912 result = f(a0, a1);
14913
14914 CHECK_EQ(0, result.a0);
14915 CHECK_APPROX(0.0, result.a1);
14916
14917 return 0;
14918}
14919
14920// Used for testing structs and unions by value.
14921// Returning a mixed integer/float union.
14923 // NOLINTNEXTLINE(whitespace/parens)
14924 Union4BytesMixed (*f)(uint32_t a0)) {
14925 uint32_t a0;
14926
14927 a0 = 1;
14928
14929 std::cout << "Calling TestReturnUnion4BytesMixed("
14930 << "(" << a0 << ")"
14931 << ")\n";
14932
14934
14935 std::cout << "result = "
14936 << "(" << result.a0 << ")"
14937 << "\n";
14938
14939 CHECK_EQ(a0, result.a0);
14940
14941 // Pass argument that will make the Dart callback throw.
14942 a0 = 42;
14943
14944 result = f(a0);
14945
14946 CHECK_EQ(0, result.a0);
14947
14948 // Pass argument that will make the Dart callback return null.
14949 a0 = 84;
14950
14951 result = f(a0);
14952
14953 CHECK_EQ(0, result.a0);
14954
14955 return 0;
14956}
14957
14958// Used for testing structs and unions by value.
14959// Returning a floating point only union.
14961 // NOLINTNEXTLINE(whitespace/parens)
14962 Union8BytesNestedFloat (*f)(double a0)) {
14963 double a0;
14964
14965 a0 = -1.0;
14966
14967 std::cout << "Calling TestReturnUnion8BytesNestedFloat("
14968 << "(" << a0 << ")"
14969 << ")\n";
14970
14972
14973 std::cout << "result = "
14974 << "(" << result.a0 << ")"
14975 << "\n";
14976
14977 CHECK_APPROX(a0, result.a0);
14978
14979 // Pass argument that will make the Dart callback throw.
14980 a0 = 42;
14981
14982 result = f(a0);
14983
14984 CHECK_APPROX(0.0, result.a0);
14985
14986 // Pass argument that will make the Dart callback return null.
14987 a0 = 84;
14988
14989 result = f(a0);
14990
14991 CHECK_APPROX(0.0, result.a0);
14992
14993 return 0;
14994}
14995
14996// Used for testing structs and unions by value.
14997// Returning a mixed-size union.
14999 // NOLINTNEXTLINE(whitespace/parens)
15001 Struct8BytesInt a0 = {};
15002
15003 a0.a0 = -1;
15004 a0.a1 = 2;
15005 a0.a2 = -3;
15006
15007 std::cout << "Calling TestReturnUnion9BytesNestedInt("
15008 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << "))"
15009 << ")\n";
15010
15012
15013 std::cout << "result = "
15014 << "((" << result.a0.a0 << ", " << result.a0.a1 << ", "
15015 << result.a0.a2 << "))"
15016 << "\n";
15017
15018 CHECK_EQ(a0.a0, result.a0.a0);
15019 CHECK_EQ(a0.a1, result.a0.a1);
15020 CHECK_EQ(a0.a2, result.a0.a2);
15021
15022 // Pass argument that will make the Dart callback throw.
15023 a0.a0 = 42;
15024
15025 result = f(a0);
15026
15027 CHECK_EQ(0, result.a0.a0);
15028 CHECK_EQ(0, result.a0.a1);
15029 CHECK_EQ(0, result.a0.a2);
15030
15031 // Pass argument that will make the Dart callback return null.
15032 a0.a0 = 84;
15033
15034 result = f(a0);
15035
15036 CHECK_EQ(0, result.a0.a0);
15037 CHECK_EQ(0, result.a0.a1);
15038 CHECK_EQ(0, result.a0.a2);
15039
15040 return 0;
15041}
15042
15043// Used for testing structs and unions by value.
15044// Returning union with homogenous floats.
15046 // NOLINTNEXTLINE(whitespace/parens)
15049
15050 a0.a0 = -1.0;
15051 a0.a1 = 2.0;
15052
15053 std::cout << "Calling TestReturnUnion16BytesNestedFloat("
15054 << "((" << a0.a0 << ", " << a0.a1 << "))"
15055 << ")\n";
15056
15058
15059 std::cout << "result = "
15060 << "((" << result.a0.a0 << ", " << result.a0.a1 << "))"
15061 << "\n";
15062
15063 CHECK_APPROX(a0.a0, result.a0.a0);
15064 CHECK_APPROX(a0.a1, result.a0.a1);
15065
15066 // Pass argument that will make the Dart callback throw.
15067 a0.a0 = 42;
15068
15069 result = f(a0);
15070
15071 CHECK_APPROX(0.0, result.a0.a0);
15072 CHECK_APPROX(0.0, result.a0.a1);
15073
15074 // Pass argument that will make the Dart callback return null.
15075 a0.a0 = 84;
15076
15077 result = f(a0);
15078
15079 CHECK_APPROX(0.0, result.a0.a0);
15080 CHECK_APPROX(0.0, result.a0.a1);
15081
15082 return 0;
15083}
15084
15085// Used for testing structs and unions by value.
15086// Test that a struct passed in as argument can be returned.
15087// Especially for ffi callbacks.
15088// Struct is passed in int registers in most ABIs.
15090 // NOLINTNEXTLINE(whitespace/parens)
15092 Struct1ByteInt a0 = {};
15093
15094 a0.a0 = -1;
15095
15096 std::cout << "Calling TestReturnStructArgumentStruct1ByteInt("
15097 << "((" << static_cast<int>(a0.a0) << "))"
15098 << ")\n";
15099
15100 Struct1ByteInt result = f(a0);
15101
15102 std::cout << "result = "
15103 << "(" << static_cast<int>(result.a0) << ")"
15104 << "\n";
15105
15106 CHECK_EQ(a0.a0, result.a0);
15107
15108 // Pass argument that will make the Dart callback throw.
15109 a0.a0 = 42;
15110
15111 result = f(a0);
15112
15113 CHECK_EQ(0, result.a0);
15114
15115 // Pass argument that will make the Dart callback return null.
15116 a0.a0 = 84;
15117
15118 result = f(a0);
15119
15120 CHECK_EQ(0, result.a0);
15121
15122 return 0;
15123}
15124
15125// Used for testing structs and unions by value.
15126// Test that a struct passed in as argument can be returned.
15127// Especially for ffi callbacks.
15128// Struct is passed on stack on all ABIs.
15130 // NOLINTNEXTLINE(whitespace/parens)
15131 Struct1ByteInt (*f)(int32_t a0,
15132 int32_t a1,
15133 int32_t a2,
15134 int32_t a3,
15135 int32_t a4,
15136 int32_t a5,
15137 int32_t a6,
15138 int32_t a7,
15139 Struct1ByteInt a8)) {
15140 int32_t a0;
15141 int32_t a1;
15142 int32_t a2;
15143 int32_t a3;
15144 int32_t a4;
15145 int32_t a5;
15146 int32_t a6;
15147 int32_t a7;
15148 Struct1ByteInt a8 = {};
15149
15150 a0 = -1;
15151 a1 = 2;
15152 a2 = -3;
15153 a3 = 4;
15154 a4 = -5;
15155 a5 = 6;
15156 a6 = -7;
15157 a7 = 8;
15158 a8.a0 = -9;
15159
15160 std::cout << "Calling TestReturnStructArgumentInt32x8Struct1ByteInt("
15161 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
15162 << ", " << a5 << ", " << a6 << ", " << a7 << ", ("
15163 << static_cast<int>(a8.a0) << "))"
15164 << ")\n";
15165
15166 Struct1ByteInt result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
15167
15168 std::cout << "result = "
15169 << "(" << static_cast<int>(result.a0) << ")"
15170 << "\n";
15171
15172 CHECK_EQ(a8.a0, result.a0);
15173
15174 // Pass argument that will make the Dart callback throw.
15175 a0 = 42;
15176
15177 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
15178
15179 CHECK_EQ(0, result.a0);
15180
15181 // Pass argument that will make the Dart callback return null.
15182 a0 = 84;
15183
15184 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
15185
15186 CHECK_EQ(0, result.a0);
15187
15188 return 0;
15189}
15190
15191// Used for testing structs and unions by value.
15192// Test that a struct passed in as argument can be returned.
15193// Especially for ffi callbacks.
15194// Struct is passed in float registers in most ABIs.
15196 // NOLINTNEXTLINE(whitespace/parens)
15199
15200 a0.a0 = -1.0;
15201 a0.a1 = 2.0;
15202
15203 std::cout << "Calling TestReturnStructArgumentStruct8BytesHomogeneousFloat("
15204 << "((" << a0.a0 << ", " << a0.a1 << "))"
15205 << ")\n";
15206
15208
15209 std::cout << "result = "
15210 << "(" << result.a0 << ", " << result.a1 << ")"
15211 << "\n";
15212
15213 CHECK_APPROX(a0.a0, result.a0);
15214 CHECK_APPROX(a0.a1, result.a1);
15215
15216 // Pass argument that will make the Dart callback throw.
15217 a0.a0 = 42;
15218
15219 result = f(a0);
15220
15221 CHECK_APPROX(0.0, result.a0);
15222 CHECK_APPROX(0.0, result.a1);
15223
15224 // Pass argument that will make the Dart callback return null.
15225 a0.a0 = 84;
15226
15227 result = f(a0);
15228
15229 CHECK_APPROX(0.0, result.a0);
15230 CHECK_APPROX(0.0, result.a1);
15231
15232 return 0;
15233}
15234
15235// Used for testing structs and unions by value.
15236// On arm64, both argument and return value are passed in by pointer.
15238 // NOLINTNEXTLINE(whitespace/parens)
15241
15242 a0.a0 = -1;
15243 a0.a1 = 2;
15244 a0.a2 = -3;
15245 a0.a3 = 4;
15246 a0.a4 = -5;
15247
15248 std::cout << "Calling TestReturnStructArgumentStruct20BytesHomogeneousInt32("
15249 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
15250 << ", " << a0.a4 << "))"
15251 << ")\n";
15252
15254
15255 std::cout << "result = "
15256 << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
15257 << ", " << result.a3 << ", " << result.a4 << ")"
15258 << "\n";
15259
15260 CHECK_EQ(a0.a0, result.a0);
15261 CHECK_EQ(a0.a1, result.a1);
15262 CHECK_EQ(a0.a2, result.a2);
15263 CHECK_EQ(a0.a3, result.a3);
15264 CHECK_EQ(a0.a4, result.a4);
15265
15266 // Pass argument that will make the Dart callback throw.
15267 a0.a0 = 42;
15268
15269 result = f(a0);
15270
15271 CHECK_EQ(0, result.a0);
15272 CHECK_EQ(0, result.a1);
15273 CHECK_EQ(0, result.a2);
15274 CHECK_EQ(0, result.a3);
15275 CHECK_EQ(0, result.a4);
15276
15277 // Pass argument that will make the Dart callback return null.
15278 a0.a0 = 84;
15279
15280 result = f(a0);
15281
15282 CHECK_EQ(0, result.a0);
15283 CHECK_EQ(0, result.a1);
15284 CHECK_EQ(0, result.a2);
15285 CHECK_EQ(0, result.a3);
15286 CHECK_EQ(0, result.a4);
15287
15288 return 0;
15289}
15290
15291// Used for testing structs and unions by value.
15292// On arm64, both argument and return value are passed in by pointer.
15293// Ints exhaust registers, so that pointer is passed on stack.
15295 // NOLINTNEXTLINE(whitespace/parens)
15296 Struct20BytesHomogeneousInt32 (*f)(int32_t a0,
15297 int32_t a1,
15298 int32_t a2,
15299 int32_t a3,
15300 int32_t a4,
15301 int32_t a5,
15302 int32_t a6,
15303 int32_t a7,
15305 int32_t a0;
15306 int32_t a1;
15307 int32_t a2;
15308 int32_t a3;
15309 int32_t a4;
15310 int32_t a5;
15311 int32_t a6;
15312 int32_t a7;
15314
15315 a0 = -1;
15316 a1 = 2;
15317 a2 = -3;
15318 a3 = 4;
15319 a4 = -5;
15320 a5 = 6;
15321 a6 = -7;
15322 a7 = 8;
15323 a8.a0 = -9;
15324 a8.a1 = 10;
15325 a8.a2 = -11;
15326 a8.a3 = 12;
15327 a8.a4 = -13;
15328
15329 std::cout << "Calling TestReturnStructArgumentInt32x8Struct20BytesHomogeneou("
15330 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
15331 << ", " << a5 << ", " << a6 << ", " << a7 << ", (" << a8.a0 << ", "
15332 << a8.a1 << ", " << a8.a2 << ", " << a8.a3 << ", " << a8.a4 << "))"
15333 << ")\n";
15334
15335 Struct20BytesHomogeneousInt32 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
15336
15337 std::cout << "result = "
15338 << "(" << result.a0 << ", " << result.a1 << ", " << result.a2
15339 << ", " << result.a3 << ", " << result.a4 << ")"
15340 << "\n";
15341
15342 CHECK_EQ(a8.a0, result.a0);
15343 CHECK_EQ(a8.a1, result.a1);
15344 CHECK_EQ(a8.a2, result.a2);
15345 CHECK_EQ(a8.a3, result.a3);
15346 CHECK_EQ(a8.a4, result.a4);
15347
15348 // Pass argument that will make the Dart callback throw.
15349 a0 = 42;
15350
15351 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
15352
15353 CHECK_EQ(0, result.a0);
15354 CHECK_EQ(0, result.a1);
15355 CHECK_EQ(0, result.a2);
15356 CHECK_EQ(0, result.a3);
15357 CHECK_EQ(0, result.a4);
15358
15359 // Pass argument that will make the Dart callback return null.
15360 a0 = 84;
15361
15362 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
15363
15364 CHECK_EQ(0, result.a0);
15365 CHECK_EQ(0, result.a1);
15366 CHECK_EQ(0, result.a2);
15367 CHECK_EQ(0, result.a3);
15368 CHECK_EQ(0, result.a4);
15369
15370 return 0;
15371}
15372
15373// Used for testing structs and unions by value.
15374// Test returning struct with inline array.
15376 // NOLINTNEXTLINE(whitespace/parens)
15379
15380 a0.a0[0] = 1;
15381 a0.a0[1] = 2;
15382 a0.a0[2] = 3;
15383 a0.a0[3] = 4;
15384 a0.a0[4] = 5;
15385 a0.a0[5] = 6;
15386 a0.a0[6] = 7;
15387 a0.a0[7] = 8;
15388
15389 std::cout << "Calling TestReturnStructArgumentStruct8BytesInlineArrayInt("
15390 << "(([" << static_cast<int>(a0.a0[0]) << ", "
15391 << static_cast<int>(a0.a0[1]) << ", " << static_cast<int>(a0.a0[2])
15392 << ", " << static_cast<int>(a0.a0[3]) << ", "
15393 << static_cast<int>(a0.a0[4]) << ", " << static_cast<int>(a0.a0[5])
15394 << ", " << static_cast<int>(a0.a0[6]) << ", "
15395 << static_cast<int>(a0.a0[7]) << "]))"
15396 << ")\n";
15397
15399
15400 std::cout << "result = "
15401 << "([" << static_cast<int>(result.a0[0]) << ", "
15402 << static_cast<int>(result.a0[1]) << ", "
15403 << static_cast<int>(result.a0[2]) << ", "
15404 << static_cast<int>(result.a0[3]) << ", "
15405 << static_cast<int>(result.a0[4]) << ", "
15406 << static_cast<int>(result.a0[5]) << ", "
15407 << static_cast<int>(result.a0[6]) << ", "
15408 << static_cast<int>(result.a0[7]) << "])"
15409 << "\n";
15410
15411 for (intptr_t i = 0; i < 8; i++) {
15412 CHECK_EQ(a0.a0[i], result.a0[i]);
15413 }
15414
15415 // Pass argument that will make the Dart callback throw.
15416 a0.a0[0] = 42;
15417
15418 result = f(a0);
15419
15420 for (intptr_t i = 0; i < 8; i++) {
15421 CHECK_EQ(0, result.a0[i]);
15422 }
15423
15424 // Pass argument that will make the Dart callback return null.
15425 a0.a0[0] = 84;
15426
15427 result = f(a0);
15428
15429 for (intptr_t i = 0; i < 8; i++) {
15430 CHECK_EQ(0, result.a0[i]);
15431 }
15432
15433 return 0;
15434}
15435
15436// Used for testing structs and unions by value.
15437// Return value in FPU registers on arm hardfp and arm64.
15439 // NOLINTNEXTLINE(whitespace/parens)
15443
15444 a0.a0.a0 = -1.0;
15445 a0.a1[0].a0 = 2.0;
15446 a0.a1[1].a0 = -3.0;
15447 a0.a2 = 4.0;
15448
15449 std::cout << "Calling TestReturnStructArgumentStructStruct16BytesHomogeneous("
15450 << "(((" << a0.a0.a0 << "), [(" << a0.a1[0].a0 << "), ("
15451 << a0.a1[1].a0 << ")], " << a0.a2 << "))"
15452 << ")\n";
15453
15455
15456 std::cout << "result = "
15457 << "((" << result.a0.a0 << "), [(" << result.a1[0].a0 << "), ("
15458 << result.a1[1].a0 << ")], " << result.a2 << ")"
15459 << "\n";
15460
15461 CHECK_APPROX(a0.a0.a0, result.a0.a0);
15462 for (intptr_t i = 0; i < 2; i++) {
15463 CHECK_APPROX(a0.a1[i].a0, result.a1[i].a0);
15464 }
15465 CHECK_APPROX(a0.a2, result.a2);
15466
15467 // Pass argument that will make the Dart callback throw.
15468 a0.a0.a0 = 42;
15469
15470 result = f(a0);
15471
15472 CHECK_APPROX(0.0, result.a0.a0);
15473 for (intptr_t i = 0; i < 2; i++) {
15474 CHECK_APPROX(0.0, result.a1[i].a0);
15475 }
15476 CHECK_APPROX(0.0, result.a2);
15477
15478 // Pass argument that will make the Dart callback return null.
15479 a0.a0.a0 = 84;
15480
15481 result = f(a0);
15482
15483 CHECK_APPROX(0.0, result.a0.a0);
15484 for (intptr_t i = 0; i < 2; i++) {
15485 CHECK_APPROX(0.0, result.a1[i].a0);
15486 }
15487 CHECK_APPROX(0.0, result.a2);
15488
15489 return 0;
15490}
15491
15492// Used for testing structs and unions by value.
15493// Return value in FPU registers on arm64.
15495 // NOLINTNEXTLINE(whitespace/parens)
15499
15500 a0.a0.a0 = -1.0;
15501 a0.a1[0].a0 = 2.0;
15502 a0.a1[1].a0 = -3.0;
15503 a0.a2 = 4.0;
15504
15505 std::cout << "Calling TestReturnStructArgumentStructStruct32BytesHomogeneous("
15506 << "(((" << a0.a0.a0 << "), [(" << a0.a1[0].a0 << "), ("
15507 << a0.a1[1].a0 << ")], " << a0.a2 << "))"
15508 << ")\n";
15509
15511
15512 std::cout << "result = "
15513 << "((" << result.a0.a0 << "), [(" << result.a1[0].a0 << "), ("
15514 << result.a1[1].a0 << ")], " << result.a2 << ")"
15515 << "\n";
15516
15517 CHECK_APPROX(a0.a0.a0, result.a0.a0);
15518 for (intptr_t i = 0; i < 2; i++) {
15519 CHECK_APPROX(a0.a1[i].a0, result.a1[i].a0);
15520 }
15521 CHECK_APPROX(a0.a2, result.a2);
15522
15523 // Pass argument that will make the Dart callback throw.
15524 a0.a0.a0 = 42;
15525
15526 result = f(a0);
15527
15528 CHECK_APPROX(0.0, result.a0.a0);
15529 for (intptr_t i = 0; i < 2; i++) {
15530 CHECK_APPROX(0.0, result.a1[i].a0);
15531 }
15532 CHECK_APPROX(0.0, result.a2);
15533
15534 // Pass argument that will make the Dart callback return null.
15535 a0.a0.a0 = 84;
15536
15537 result = f(a0);
15538
15539 CHECK_APPROX(0.0, result.a0.a0);
15540 for (intptr_t i = 0; i < 2; i++) {
15541 CHECK_APPROX(0.0, result.a1[i].a0);
15542 }
15543 CHECK_APPROX(0.0, result.a2);
15544
15545 return 0;
15546}
15547
15548// Used for testing structs and unions by value.
15549// On x64 Linux, return value is split over FP and int registers.
15551 // NOLINTNEXTLINE(whitespace/parens)
15554
15555 a0.a0.a0 = -1.0;
15556 a0.a1[0].a0 = 2.0;
15557 a0.a1[0].a1 = -3;
15558 a0.a1[0].a2 = 4;
15559 a0.a2[0] = -5;
15560 a0.a2[1] = 6;
15561
15562 std::cout << "Calling TestReturnStructArgumentStructStruct16BytesMixed3("
15563 << "(((" << a0.a0.a0 << "), [(" << a0.a1[0].a0 << ", "
15564 << a0.a1[0].a1 << ", " << a0.a1[0].a2 << ")], [" << a0.a2[0] << ", "
15565 << a0.a2[1] << "]))"
15566 << ")\n";
15567
15569
15570 std::cout << "result = "
15571 << "((" << result.a0.a0 << "), [(" << result.a1[0].a0 << ", "
15572 << result.a1[0].a1 << ", " << result.a1[0].a2 << ")], ["
15573 << result.a2[0] << ", " << result.a2[1] << "])"
15574 << "\n";
15575
15576 CHECK_APPROX(a0.a0.a0, result.a0.a0);
15577 for (intptr_t i = 0; i < 1; i++) {
15578 CHECK_APPROX(a0.a1[i].a0, result.a1[i].a0);
15579 CHECK_EQ(a0.a1[i].a1, result.a1[i].a1);
15580 CHECK_EQ(a0.a1[i].a2, result.a1[i].a2);
15581 }
15582 for (intptr_t i = 0; i < 2; i++) {
15583 CHECK_EQ(a0.a2[i], result.a2[i]);
15584 }
15585
15586 // Pass argument that will make the Dart callback throw.
15587 a0.a0.a0 = 42;
15588
15589 result = f(a0);
15590
15591 CHECK_APPROX(0.0, result.a0.a0);
15592 for (intptr_t i = 0; i < 1; i++) {
15593 CHECK_APPROX(0.0, result.a1[i].a0);
15594 CHECK_EQ(0, result.a1[i].a1);
15595 CHECK_EQ(0, result.a1[i].a2);
15596 }
15597 for (intptr_t i = 0; i < 2; i++) {
15598 CHECK_EQ(0, result.a2[i]);
15599 }
15600
15601 // Pass argument that will make the Dart callback return null.
15602 a0.a0.a0 = 84;
15603
15604 result = f(a0);
15605
15606 CHECK_APPROX(0.0, result.a0.a0);
15607 for (intptr_t i = 0; i < 1; i++) {
15608 CHECK_APPROX(0.0, result.a1[i].a0);
15609 CHECK_EQ(0, result.a1[i].a1);
15610 CHECK_EQ(0, result.a1[i].a2);
15611 }
15612 for (intptr_t i = 0; i < 2; i++) {
15613 CHECK_EQ(0, result.a2[i]);
15614 }
15615
15616 return 0;
15617}
15618
15619// Used for testing structs and unions by value.
15620// Test alignment and padding of 16 byte int within struct.
15622 // NOLINTNEXTLINE(whitespace/parens)
15623 StructAlignmentInt16 (*f)(int8_t a0, int16_t a1, int8_t a2)) {
15624 int8_t a0;
15625 int16_t a1;
15626 int8_t a2;
15627
15628 a0 = -1;
15629 a1 = 2;
15630 a2 = -3;
15631
15632 std::cout << "Calling TestReturnStructAlignmentInt16("
15633 << "(" << static_cast<int>(a0) << ", " << a1 << ", "
15634 << static_cast<int>(a2) << ")"
15635 << ")\n";
15636
15637 StructAlignmentInt16 result = f(a0, a1, a2);
15638
15639 std::cout << "result = "
15640 << "(" << static_cast<int>(result.a0) << ", " << result.a1 << ", "
15641 << static_cast<int>(result.a2) << ")"
15642 << "\n";
15643
15644 CHECK_EQ(a0, result.a0);
15645 CHECK_EQ(a1, result.a1);
15646 CHECK_EQ(a2, result.a2);
15647
15648 // Pass argument that will make the Dart callback throw.
15649 a0 = 42;
15650
15651 result = f(a0, a1, a2);
15652
15653 CHECK_EQ(0, result.a0);
15654 CHECK_EQ(0, result.a1);
15655 CHECK_EQ(0, result.a2);
15656
15657 // Pass argument that will make the Dart callback return null.
15658 a0 = 84;
15659
15660 result = f(a0, a1, a2);
15661
15662 CHECK_EQ(0, result.a0);
15663 CHECK_EQ(0, result.a1);
15664 CHECK_EQ(0, result.a2);
15665
15666 return 0;
15667}
15668
15669// Used for testing structs and unions by value.
15670// Test alignment and padding of 32 byte int within struct.
15672 // NOLINTNEXTLINE(whitespace/parens)
15673 StructAlignmentInt32 (*f)(int8_t a0, int32_t a1, int8_t a2)) {
15674 int8_t a0;
15675 int32_t a1;
15676 int8_t a2;
15677
15678 a0 = -1;
15679 a1 = 2;
15680 a2 = -3;
15681
15682 std::cout << "Calling TestReturnStructAlignmentInt32("
15683 << "(" << static_cast<int>(a0) << ", " << a1 << ", "
15684 << static_cast<int>(a2) << ")"
15685 << ")\n";
15686
15687 StructAlignmentInt32 result = f(a0, a1, a2);
15688
15689 std::cout << "result = "
15690 << "(" << static_cast<int>(result.a0) << ", " << result.a1 << ", "
15691 << static_cast<int>(result.a2) << ")"
15692 << "\n";
15693
15694 CHECK_EQ(a0, result.a0);
15695 CHECK_EQ(a1, result.a1);
15696 CHECK_EQ(a2, result.a2);
15697
15698 // Pass argument that will make the Dart callback throw.
15699 a0 = 42;
15700
15701 result = f(a0, a1, a2);
15702
15703 CHECK_EQ(0, result.a0);
15704 CHECK_EQ(0, result.a1);
15705 CHECK_EQ(0, result.a2);
15706
15707 // Pass argument that will make the Dart callback return null.
15708 a0 = 84;
15709
15710 result = f(a0, a1, a2);
15711
15712 CHECK_EQ(0, result.a0);
15713 CHECK_EQ(0, result.a1);
15714 CHECK_EQ(0, result.a2);
15715
15716 return 0;
15717}
15718
15719// Used for testing structs and unions by value.
15720// Test alignment and padding of 64 byte int within struct.
15722 // NOLINTNEXTLINE(whitespace/parens)
15723 StructAlignmentInt64 (*f)(int8_t a0, int64_t a1, int8_t a2)) {
15724 int8_t a0;
15725 int64_t a1;
15726 int8_t a2;
15727
15728 a0 = -1;
15729 a1 = 2;
15730 a2 = -3;
15731
15732 std::cout << "Calling TestReturnStructAlignmentInt64("
15733 << "(" << static_cast<int>(a0) << ", " << a1 << ", "
15734 << static_cast<int>(a2) << ")"
15735 << ")\n";
15736
15737 StructAlignmentInt64 result = f(a0, a1, a2);
15738
15739 std::cout << "result = "
15740 << "(" << static_cast<int>(result.a0) << ", " << result.a1 << ", "
15741 << static_cast<int>(result.a2) << ")"
15742 << "\n";
15743
15744 CHECK_EQ(a0, result.a0);
15745 CHECK_EQ(a1, result.a1);
15746 CHECK_EQ(a2, result.a2);
15747
15748 // Pass argument that will make the Dart callback throw.
15749 a0 = 42;
15750
15751 result = f(a0, a1, a2);
15752
15753 CHECK_EQ(0, result.a0);
15754 CHECK_EQ(0, result.a1);
15755 CHECK_EQ(0, result.a2);
15756
15757 // Pass argument that will make the Dart callback return null.
15758 a0 = 84;
15759
15760 result = f(a0, a1, a2);
15761
15762 CHECK_EQ(0, result.a0);
15763 CHECK_EQ(0, result.a1);
15764 CHECK_EQ(0, result.a2);
15765
15766 return 0;
15767}
15768
15769// Used for testing structs and unions by value.
15770// Simple nested struct.
15772 // NOLINTNEXTLINE(whitespace/parens)
15777
15778 a0.a0 = -1;
15779 a0.a1 = 2;
15780 a1.a0 = -3;
15781 a1.a1 = 4;
15782
15783 std::cout << "Calling TestReturnStruct8BytesNestedInt("
15784 << "((" << a0.a0 << ", " << a0.a1 << "), (" << a1.a0 << ", "
15785 << a1.a1 << "))"
15786 << ")\n";
15787
15788 Struct8BytesNestedInt result = f(a0, a1);
15789
15790 std::cout << "result = "
15791 << "((" << result.a0.a0 << ", " << result.a0.a1 << "), ("
15792 << result.a1.a0 << ", " << result.a1.a1 << "))"
15793 << "\n";
15794
15795 CHECK_EQ(a0.a0, result.a0.a0);
15796 CHECK_EQ(a0.a1, result.a0.a1);
15797 CHECK_EQ(a1.a0, result.a1.a0);
15798 CHECK_EQ(a1.a1, result.a1.a1);
15799
15800 // Pass argument that will make the Dart callback throw.
15801 a0.a0 = 42;
15802
15803 result = f(a0, a1);
15804
15805 CHECK_EQ(0, result.a0.a0);
15806 CHECK_EQ(0, result.a0.a1);
15807 CHECK_EQ(0, result.a1.a0);
15808 CHECK_EQ(0, result.a1.a1);
15809
15810 // Pass argument that will make the Dart callback return null.
15811 a0.a0 = 84;
15812
15813 result = f(a0, a1);
15814
15815 CHECK_EQ(0, result.a0.a0);
15816 CHECK_EQ(0, result.a0.a1);
15817 CHECK_EQ(0, result.a1.a0);
15818 CHECK_EQ(0, result.a1.a1);
15819
15820 return 0;
15821}
15822
15823// Used for testing structs and unions by value.
15824// Simple nested struct with floats.
15826 // NOLINTNEXTLINE(whitespace/parens)
15828 Struct4BytesFloat a0 = {};
15829 Struct4BytesFloat a1 = {};
15830
15831 a0.a0 = -1.0;
15832 a1.a0 = 2.0;
15833
15834 std::cout << "Calling TestReturnStruct8BytesNestedFloat("
15835 << "((" << a0.a0 << "), (" << a1.a0 << "))"
15836 << ")\n";
15837
15839
15840 std::cout << "result = "
15841 << "((" << result.a0.a0 << "), (" << result.a1.a0 << "))"
15842 << "\n";
15843
15844 CHECK_APPROX(a0.a0, result.a0.a0);
15845 CHECK_APPROX(a1.a0, result.a1.a0);
15846
15847 // Pass argument that will make the Dart callback throw.
15848 a0.a0 = 42;
15849
15850 result = f(a0, a1);
15851
15852 CHECK_APPROX(0.0, result.a0.a0);
15853 CHECK_APPROX(0.0, result.a1.a0);
15854
15855 // Pass argument that will make the Dart callback return null.
15856 a0.a0 = 84;
15857
15858 result = f(a0, a1);
15859
15860 CHECK_APPROX(0.0, result.a0.a0);
15861 CHECK_APPROX(0.0, result.a1.a0);
15862
15863 return 0;
15864}
15865
15866// Used for testing structs and unions by value.
15867// The nesting is irregular, testing homogenous float rules on arm and arm64,
15868// and the fpu register usage on x64.
15870 // NOLINTNEXTLINE(whitespace/parens)
15871 Struct8BytesNestedFloat2 (*f)(Struct4BytesFloat a0, float a1)) {
15872 Struct4BytesFloat a0 = {};
15873 float a1;
15874
15875 a0.a0 = -1.0;
15876 a1 = 2.0;
15877
15878 std::cout << "Calling TestReturnStruct8BytesNestedFloat2("
15879 << "((" << a0.a0 << "), " << a1 << ")"
15880 << ")\n";
15881
15883
15884 std::cout << "result = "
15885 << "((" << result.a0.a0 << "), " << result.a1 << ")"
15886 << "\n";
15887
15888 CHECK_APPROX(a0.a0, result.a0.a0);
15889 CHECK_APPROX(a1, result.a1);
15890
15891 // Pass argument that will make the Dart callback throw.
15892 a0.a0 = 42;
15893
15894 result = f(a0, a1);
15895
15896 CHECK_APPROX(0.0, result.a0.a0);
15897 CHECK_APPROX(0.0, result.a1);
15898
15899 // Pass argument that will make the Dart callback return null.
15900 a0.a0 = 84;
15901
15902 result = f(a0, a1);
15903
15904 CHECK_APPROX(0.0, result.a0.a0);
15905 CHECK_APPROX(0.0, result.a1);
15906
15907 return 0;
15908}
15909
15910// Used for testing structs and unions by value.
15911// Simple nested struct with mixed members.
15913 // NOLINTNEXTLINE(whitespace/parens)
15915 Struct4BytesFloat a1)) {
15917 Struct4BytesFloat a1 = {};
15918
15919 a0.a0 = -1;
15920 a0.a1 = 2;
15921 a1.a0 = -3.0;
15922
15923 std::cout << "Calling TestReturnStruct8BytesNestedMixed("
15924 << "((" << a0.a0 << ", " << a0.a1 << "), (" << a1.a0 << "))"
15925 << ")\n";
15926
15928
15929 std::cout << "result = "
15930 << "((" << result.a0.a0 << ", " << result.a0.a1 << "), ("
15931 << result.a1.a0 << "))"
15932 << "\n";
15933
15934 CHECK_EQ(a0.a0, result.a0.a0);
15935 CHECK_EQ(a0.a1, result.a0.a1);
15936 CHECK_APPROX(a1.a0, result.a1.a0);
15937
15938 // Pass argument that will make the Dart callback throw.
15939 a0.a0 = 42;
15940
15941 result = f(a0, a1);
15942
15943 CHECK_EQ(0, result.a0.a0);
15944 CHECK_EQ(0, result.a0.a1);
15945 CHECK_APPROX(0.0, result.a1.a0);
15946
15947 // Pass argument that will make the Dart callback return null.
15948 a0.a0 = 84;
15949
15950 result = f(a0, a1);
15951
15952 CHECK_EQ(0, result.a0.a0);
15953 CHECK_EQ(0, result.a0.a1);
15954 CHECK_APPROX(0.0, result.a1.a0);
15955
15956 return 0;
15957}
15958
15959// Used for testing structs and unions by value.
15960// Deeper nested struct to test recursive member access.
15962 // NOLINTNEXTLINE(whitespace/parens)
15965 Struct8BytesNestedInt a0 = {};
15966 Struct8BytesNestedInt a1 = {};
15967
15968 a0.a0.a0 = -1;
15969 a0.a0.a1 = 2;
15970 a0.a1.a0 = -3;
15971 a0.a1.a1 = 4;
15972 a1.a0.a0 = -5;
15973 a1.a0.a1 = 6;
15974 a1.a1.a0 = -7;
15975 a1.a1.a1 = 8;
15976
15977 std::cout << "Calling TestReturnStruct16BytesNestedInt("
15978 << "(((" << a0.a0.a0 << ", " << a0.a0.a1 << "), (" << a0.a1.a0
15979 << ", " << a0.a1.a1 << ")), ((" << a1.a0.a0 << ", " << a1.a0.a1
15980 << "), (" << a1.a1.a0 << ", " << a1.a1.a1 << ")))"
15981 << ")\n";
15982
15984
15985 std::cout << "result = "
15986 << "(((" << result.a0.a0.a0 << ", " << result.a0.a0.a1 << "), ("
15987 << result.a0.a1.a0 << ", " << result.a0.a1.a1 << ")), (("
15988 << result.a1.a0.a0 << ", " << result.a1.a0.a1 << "), ("
15989 << result.a1.a1.a0 << ", " << result.a1.a1.a1 << ")))"
15990 << "\n";
15991
15992 CHECK_EQ(a0.a0.a0, result.a0.a0.a0);
15993 CHECK_EQ(a0.a0.a1, result.a0.a0.a1);
15994 CHECK_EQ(a0.a1.a0, result.a0.a1.a0);
15995 CHECK_EQ(a0.a1.a1, result.a0.a1.a1);
15996 CHECK_EQ(a1.a0.a0, result.a1.a0.a0);
15997 CHECK_EQ(a1.a0.a1, result.a1.a0.a1);
15998 CHECK_EQ(a1.a1.a0, result.a1.a1.a0);
15999 CHECK_EQ(a1.a1.a1, result.a1.a1.a1);
16000
16001 // Pass argument that will make the Dart callback throw.
16002 a0.a0.a0 = 42;
16003
16004 result = f(a0, a1);
16005
16006 CHECK_EQ(0, result.a0.a0.a0);
16007 CHECK_EQ(0, result.a0.a0.a1);
16008 CHECK_EQ(0, result.a0.a1.a0);
16009 CHECK_EQ(0, result.a0.a1.a1);
16010 CHECK_EQ(0, result.a1.a0.a0);
16011 CHECK_EQ(0, result.a1.a0.a1);
16012 CHECK_EQ(0, result.a1.a1.a0);
16013 CHECK_EQ(0, result.a1.a1.a1);
16014
16015 // Pass argument that will make the Dart callback return null.
16016 a0.a0.a0 = 84;
16017
16018 result = f(a0, a1);
16019
16020 CHECK_EQ(0, result.a0.a0.a0);
16021 CHECK_EQ(0, result.a0.a0.a1);
16022 CHECK_EQ(0, result.a0.a1.a0);
16023 CHECK_EQ(0, result.a0.a1.a1);
16024 CHECK_EQ(0, result.a1.a0.a0);
16025 CHECK_EQ(0, result.a1.a0.a1);
16026 CHECK_EQ(0, result.a1.a1.a0);
16027 CHECK_EQ(0, result.a1.a1.a1);
16028
16029 return 0;
16030}
16031
16032// Used for testing structs and unions by value.
16033// Even deeper nested struct to test recursive member access.
16035 // NOLINTNEXTLINE(whitespace/parens)
16038 Struct16BytesNestedInt a0 = {};
16039 Struct16BytesNestedInt a1 = {};
16040
16041 a0.a0.a0.a0 = -1;
16042 a0.a0.a0.a1 = 2;
16043 a0.a0.a1.a0 = -3;
16044 a0.a0.a1.a1 = 4;
16045 a0.a1.a0.a0 = -5;
16046 a0.a1.a0.a1 = 6;
16047 a0.a1.a1.a0 = -7;
16048 a0.a1.a1.a1 = 8;
16049 a1.a0.a0.a0 = -9;
16050 a1.a0.a0.a1 = 10;
16051 a1.a0.a1.a0 = -11;
16052 a1.a0.a1.a1 = 12;
16053 a1.a1.a0.a0 = -13;
16054 a1.a1.a0.a1 = 14;
16055 a1.a1.a1.a0 = -15;
16056 a1.a1.a1.a1 = 16;
16057
16058 std::cout << "Calling TestReturnStruct32BytesNestedInt("
16059 << "((((" << a0.a0.a0.a0 << ", " << a0.a0.a0.a1 << "), ("
16060 << a0.a0.a1.a0 << ", " << a0.a0.a1.a1 << ")), ((" << a0.a1.a0.a0
16061 << ", " << a0.a1.a0.a1 << "), (" << a0.a1.a1.a0 << ", "
16062 << a0.a1.a1.a1 << "))), (((" << a1.a0.a0.a0 << ", " << a1.a0.a0.a1
16063 << "), (" << a1.a0.a1.a0 << ", " << a1.a0.a1.a1 << ")), (("
16064 << a1.a1.a0.a0 << ", " << a1.a1.a0.a1 << "), (" << a1.a1.a1.a0
16065 << ", " << a1.a1.a1.a1 << "))))"
16066 << ")\n";
16067
16069
16070 std::cout << "result = "
16071 << "((((" << result.a0.a0.a0.a0 << ", " << result.a0.a0.a0.a1
16072 << "), (" << result.a0.a0.a1.a0 << ", " << result.a0.a0.a1.a1
16073 << ")), ((" << result.a0.a1.a0.a0 << ", " << result.a0.a1.a0.a1
16074 << "), (" << result.a0.a1.a1.a0 << ", " << result.a0.a1.a1.a1
16075 << "))), (((" << result.a1.a0.a0.a0 << ", " << result.a1.a0.a0.a1
16076 << "), (" << result.a1.a0.a1.a0 << ", " << result.a1.a0.a1.a1
16077 << ")), ((" << result.a1.a1.a0.a0 << ", " << result.a1.a1.a0.a1
16078 << "), (" << result.a1.a1.a1.a0 << ", " << result.a1.a1.a1.a1
16079 << "))))"
16080 << "\n";
16081
16082 CHECK_EQ(a0.a0.a0.a0, result.a0.a0.a0.a0);
16083 CHECK_EQ(a0.a0.a0.a1, result.a0.a0.a0.a1);
16084 CHECK_EQ(a0.a0.a1.a0, result.a0.a0.a1.a0);
16085 CHECK_EQ(a0.a0.a1.a1, result.a0.a0.a1.a1);
16086 CHECK_EQ(a0.a1.a0.a0, result.a0.a1.a0.a0);
16087 CHECK_EQ(a0.a1.a0.a1, result.a0.a1.a0.a1);
16088 CHECK_EQ(a0.a1.a1.a0, result.a0.a1.a1.a0);
16089 CHECK_EQ(a0.a1.a1.a1, result.a0.a1.a1.a1);
16090 CHECK_EQ(a1.a0.a0.a0, result.a1.a0.a0.a0);
16091 CHECK_EQ(a1.a0.a0.a1, result.a1.a0.a0.a1);
16092 CHECK_EQ(a1.a0.a1.a0, result.a1.a0.a1.a0);
16093 CHECK_EQ(a1.a0.a1.a1, result.a1.a0.a1.a1);
16094 CHECK_EQ(a1.a1.a0.a0, result.a1.a1.a0.a0);
16095 CHECK_EQ(a1.a1.a0.a1, result.a1.a1.a0.a1);
16096 CHECK_EQ(a1.a1.a1.a0, result.a1.a1.a1.a0);
16097 CHECK_EQ(a1.a1.a1.a1, result.a1.a1.a1.a1);
16098
16099 // Pass argument that will make the Dart callback throw.
16100 a0.a0.a0.a0 = 42;
16101
16102 result = f(a0, a1);
16103
16104 CHECK_EQ(0, result.a0.a0.a0.a0);
16105 CHECK_EQ(0, result.a0.a0.a0.a1);
16106 CHECK_EQ(0, result.a0.a0.a1.a0);
16107 CHECK_EQ(0, result.a0.a0.a1.a1);
16108 CHECK_EQ(0, result.a0.a1.a0.a0);
16109 CHECK_EQ(0, result.a0.a1.a0.a1);
16110 CHECK_EQ(0, result.a0.a1.a1.a0);
16111 CHECK_EQ(0, result.a0.a1.a1.a1);
16112 CHECK_EQ(0, result.a1.a0.a0.a0);
16113 CHECK_EQ(0, result.a1.a0.a0.a1);
16114 CHECK_EQ(0, result.a1.a0.a1.a0);
16115 CHECK_EQ(0, result.a1.a0.a1.a1);
16116 CHECK_EQ(0, result.a1.a1.a0.a0);
16117 CHECK_EQ(0, result.a1.a1.a0.a1);
16118 CHECK_EQ(0, result.a1.a1.a1.a0);
16119 CHECK_EQ(0, result.a1.a1.a1.a1);
16120
16121 // Pass argument that will make the Dart callback return null.
16122 a0.a0.a0.a0 = 84;
16123
16124 result = f(a0, a1);
16125
16126 CHECK_EQ(0, result.a0.a0.a0.a0);
16127 CHECK_EQ(0, result.a0.a0.a0.a1);
16128 CHECK_EQ(0, result.a0.a0.a1.a0);
16129 CHECK_EQ(0, result.a0.a0.a1.a1);
16130 CHECK_EQ(0, result.a0.a1.a0.a0);
16131 CHECK_EQ(0, result.a0.a1.a0.a1);
16132 CHECK_EQ(0, result.a0.a1.a1.a0);
16133 CHECK_EQ(0, result.a0.a1.a1.a1);
16134 CHECK_EQ(0, result.a1.a0.a0.a0);
16135 CHECK_EQ(0, result.a1.a0.a0.a1);
16136 CHECK_EQ(0, result.a1.a0.a1.a0);
16137 CHECK_EQ(0, result.a1.a0.a1.a1);
16138 CHECK_EQ(0, result.a1.a1.a0.a0);
16139 CHECK_EQ(0, result.a1.a1.a0.a1);
16140 CHECK_EQ(0, result.a1.a1.a1.a0);
16141 CHECK_EQ(0, result.a1.a1.a1.a1);
16142
16143 return 0;
16144}
16145
16146// Used for testing structs and unions by value.
16147// Test alignment and padding of nested struct with 16 byte int.
16149 // NOLINTNEXTLINE(whitespace/parens)
16152 StructAlignmentInt16 a0 = {};
16153 StructAlignmentInt16 a1 = {};
16154
16155 a0.a0 = -1;
16156 a0.a1 = 2;
16157 a0.a2 = -3;
16158 a1.a0 = 4;
16159 a1.a1 = -5;
16160 a1.a2 = 6;
16161
16162 std::cout << "Calling TestReturnStructNestedIntStructAlignmentInt16("
16163 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
16164 << static_cast<int>(a0.a2) << "), (" << static_cast<int>(a1.a0)
16165 << ", " << a1.a1 << ", " << static_cast<int>(a1.a2) << "))"
16166 << ")\n";
16167
16169
16170 std::cout << "result = "
16171 << "((" << static_cast<int>(result.a0.a0) << ", " << result.a0.a1
16172 << ", " << static_cast<int>(result.a0.a2) << "), ("
16173 << static_cast<int>(result.a1.a0) << ", " << result.a1.a1 << ", "
16174 << static_cast<int>(result.a1.a2) << "))"
16175 << "\n";
16176
16177 CHECK_EQ(a0.a0, result.a0.a0);
16178 CHECK_EQ(a0.a1, result.a0.a1);
16179 CHECK_EQ(a0.a2, result.a0.a2);
16180 CHECK_EQ(a1.a0, result.a1.a0);
16181 CHECK_EQ(a1.a1, result.a1.a1);
16182 CHECK_EQ(a1.a2, result.a1.a2);
16183
16184 // Pass argument that will make the Dart callback throw.
16185 a0.a0 = 42;
16186
16187 result = f(a0, a1);
16188
16189 CHECK_EQ(0, result.a0.a0);
16190 CHECK_EQ(0, result.a0.a1);
16191 CHECK_EQ(0, result.a0.a2);
16192 CHECK_EQ(0, result.a1.a0);
16193 CHECK_EQ(0, result.a1.a1);
16194 CHECK_EQ(0, result.a1.a2);
16195
16196 // Pass argument that will make the Dart callback return null.
16197 a0.a0 = 84;
16198
16199 result = f(a0, a1);
16200
16201 CHECK_EQ(0, result.a0.a0);
16202 CHECK_EQ(0, result.a0.a1);
16203 CHECK_EQ(0, result.a0.a2);
16204 CHECK_EQ(0, result.a1.a0);
16205 CHECK_EQ(0, result.a1.a1);
16206 CHECK_EQ(0, result.a1.a2);
16207
16208 return 0;
16209}
16210
16211// Used for testing structs and unions by value.
16212// Test alignment and padding of nested struct with 32 byte int.
16214 // NOLINTNEXTLINE(whitespace/parens)
16217 StructAlignmentInt32 a0 = {};
16218 StructAlignmentInt32 a1 = {};
16219
16220 a0.a0 = -1;
16221 a0.a1 = 2;
16222 a0.a2 = -3;
16223 a1.a0 = 4;
16224 a1.a1 = -5;
16225 a1.a2 = 6;
16226
16227 std::cout << "Calling TestReturnStructNestedIntStructAlignmentInt32("
16228 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
16229 << static_cast<int>(a0.a2) << "), (" << static_cast<int>(a1.a0)
16230 << ", " << a1.a1 << ", " << static_cast<int>(a1.a2) << "))"
16231 << ")\n";
16232
16234
16235 std::cout << "result = "
16236 << "((" << static_cast<int>(result.a0.a0) << ", " << result.a0.a1
16237 << ", " << static_cast<int>(result.a0.a2) << "), ("
16238 << static_cast<int>(result.a1.a0) << ", " << result.a1.a1 << ", "
16239 << static_cast<int>(result.a1.a2) << "))"
16240 << "\n";
16241
16242 CHECK_EQ(a0.a0, result.a0.a0);
16243 CHECK_EQ(a0.a1, result.a0.a1);
16244 CHECK_EQ(a0.a2, result.a0.a2);
16245 CHECK_EQ(a1.a0, result.a1.a0);
16246 CHECK_EQ(a1.a1, result.a1.a1);
16247 CHECK_EQ(a1.a2, result.a1.a2);
16248
16249 // Pass argument that will make the Dart callback throw.
16250 a0.a0 = 42;
16251
16252 result = f(a0, a1);
16253
16254 CHECK_EQ(0, result.a0.a0);
16255 CHECK_EQ(0, result.a0.a1);
16256 CHECK_EQ(0, result.a0.a2);
16257 CHECK_EQ(0, result.a1.a0);
16258 CHECK_EQ(0, result.a1.a1);
16259 CHECK_EQ(0, result.a1.a2);
16260
16261 // Pass argument that will make the Dart callback return null.
16262 a0.a0 = 84;
16263
16264 result = f(a0, a1);
16265
16266 CHECK_EQ(0, result.a0.a0);
16267 CHECK_EQ(0, result.a0.a1);
16268 CHECK_EQ(0, result.a0.a2);
16269 CHECK_EQ(0, result.a1.a0);
16270 CHECK_EQ(0, result.a1.a1);
16271 CHECK_EQ(0, result.a1.a2);
16272
16273 return 0;
16274}
16275
16276// Used for testing structs and unions by value.
16277// Test alignment and padding of nested struct with 64 byte int.
16279 // NOLINTNEXTLINE(whitespace/parens)
16282 StructAlignmentInt64 a0 = {};
16283 StructAlignmentInt64 a1 = {};
16284
16285 a0.a0 = -1;
16286 a0.a1 = 2;
16287 a0.a2 = -3;
16288 a1.a0 = 4;
16289 a1.a1 = -5;
16290 a1.a2 = 6;
16291
16292 std::cout << "Calling TestReturnStructNestedIntStructAlignmentInt64("
16293 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
16294 << static_cast<int>(a0.a2) << "), (" << static_cast<int>(a1.a0)
16295 << ", " << a1.a1 << ", " << static_cast<int>(a1.a2) << "))"
16296 << ")\n";
16297
16299
16300 std::cout << "result = "
16301 << "((" << static_cast<int>(result.a0.a0) << ", " << result.a0.a1
16302 << ", " << static_cast<int>(result.a0.a2) << "), ("
16303 << static_cast<int>(result.a1.a0) << ", " << result.a1.a1 << ", "
16304 << static_cast<int>(result.a1.a2) << "))"
16305 << "\n";
16306
16307 CHECK_EQ(a0.a0, result.a0.a0);
16308 CHECK_EQ(a0.a1, result.a0.a1);
16309 CHECK_EQ(a0.a2, result.a0.a2);
16310 CHECK_EQ(a1.a0, result.a1.a0);
16311 CHECK_EQ(a1.a1, result.a1.a1);
16312 CHECK_EQ(a1.a2, result.a1.a2);
16313
16314 // Pass argument that will make the Dart callback throw.
16315 a0.a0 = 42;
16316
16317 result = f(a0, a1);
16318
16319 CHECK_EQ(0, result.a0.a0);
16320 CHECK_EQ(0, result.a0.a1);
16321 CHECK_EQ(0, result.a0.a2);
16322 CHECK_EQ(0, result.a1.a0);
16323 CHECK_EQ(0, result.a1.a1);
16324 CHECK_EQ(0, result.a1.a2);
16325
16326 // Pass argument that will make the Dart callback return null.
16327 a0.a0 = 84;
16328
16329 result = f(a0, a1);
16330
16331 CHECK_EQ(0, result.a0.a0);
16332 CHECK_EQ(0, result.a0.a1);
16333 CHECK_EQ(0, result.a0.a2);
16334 CHECK_EQ(0, result.a1.a0);
16335 CHECK_EQ(0, result.a1.a1);
16336 CHECK_EQ(0, result.a1.a2);
16337
16338 return 0;
16339}
16340
16341// Used for testing structs and unions by value.
16342// Return big irregular struct as smoke test.
16344 // NOLINTNEXTLINE(whitespace/parens)
16345 StructNestedIrregularEvenBigger (*f)(uint64_t a0,
16348 double a3)) {
16349 uint64_t a0;
16352 double a3;
16353
16354 a0 = 1;
16355 a1.a0.a0 = 2;
16356 a1.a0.a1.a0.a0 = -3;
16357 a1.a0.a1.a0.a1 = 4;
16358 a1.a0.a1.a1.a0 = -5.0;
16359 a1.a0.a2 = 6;
16360 a1.a0.a3.a0.a0 = -7.0;
16361 a1.a0.a3.a1 = 8.0;
16362 a1.a0.a4 = 9;
16363 a1.a0.a5.a0.a0 = 10.0;
16364 a1.a0.a5.a1.a0 = -11.0;
16365 a1.a0.a6 = 12;
16366 a1.a1.a0.a0 = -13;
16367 a1.a1.a0.a1 = 14;
16368 a1.a1.a1.a0 = -15.0;
16369 a1.a2 = 16.0;
16370 a1.a3 = -17.0;
16371 a2.a0.a0 = 18;
16372 a2.a0.a1.a0.a0 = -19;
16373 a2.a0.a1.a0.a1 = 20;
16374 a2.a0.a1.a1.a0 = -21.0;
16375 a2.a0.a2 = 22;
16376 a2.a0.a3.a0.a0 = -23.0;
16377 a2.a0.a3.a1 = 24.0;
16378 a2.a0.a4 = 25;
16379 a2.a0.a5.a0.a0 = 26.0;
16380 a2.a0.a5.a1.a0 = -27.0;
16381 a2.a0.a6 = 28;
16382 a2.a1.a0.a0 = -29;
16383 a2.a1.a0.a1 = 30;
16384 a2.a1.a1.a0 = -31.0;
16385 a2.a2 = 32.0;
16386 a2.a3 = -33.0;
16387 a3 = 34.0;
16388
16389 std::cout << "Calling TestReturnStructNestedIrregularEvenBigger("
16390 << "(" << a0 << ", ((" << a1.a0.a0 << ", ((" << a1.a0.a1.a0.a0
16391 << ", " << a1.a0.a1.a0.a1 << "), (" << a1.a0.a1.a1.a0 << ")), "
16392 << a1.a0.a2 << ", ((" << a1.a0.a3.a0.a0 << "), " << a1.a0.a3.a1
16393 << "), " << a1.a0.a4 << ", ((" << a1.a0.a5.a0.a0 << "), ("
16394 << a1.a0.a5.a1.a0 << ")), " << a1.a0.a6 << "), ((" << a1.a1.a0.a0
16395 << ", " << a1.a1.a0.a1 << "), (" << a1.a1.a1.a0 << ")), " << a1.a2
16396 << ", " << a1.a3 << "), ((" << a2.a0.a0 << ", ((" << a2.a0.a1.a0.a0
16397 << ", " << a2.a0.a1.a0.a1 << "), (" << a2.a0.a1.a1.a0 << ")), "
16398 << a2.a0.a2 << ", ((" << a2.a0.a3.a0.a0 << "), " << a2.a0.a3.a1
16399 << "), " << a2.a0.a4 << ", ((" << a2.a0.a5.a0.a0 << "), ("
16400 << a2.a0.a5.a1.a0 << ")), " << a2.a0.a6 << "), ((" << a2.a1.a0.a0
16401 << ", " << a2.a1.a0.a1 << "), (" << a2.a1.a1.a0 << ")), " << a2.a2
16402 << ", " << a2.a3 << "), " << a3 << ")"
16403 << ")\n";
16404
16405 StructNestedIrregularEvenBigger result = f(a0, a1, a2, a3);
16406
16407 std::cout << "result = "
16408 << "(" << result.a0 << ", ((" << result.a1.a0.a0 << ", (("
16409 << result.a1.a0.a1.a0.a0 << ", " << result.a1.a0.a1.a0.a1 << "), ("
16410 << result.a1.a0.a1.a1.a0 << ")), " << result.a1.a0.a2 << ", (("
16411 << result.a1.a0.a3.a0.a0 << "), " << result.a1.a0.a3.a1 << "), "
16412 << result.a1.a0.a4 << ", ((" << result.a1.a0.a5.a0.a0 << "), ("
16413 << result.a1.a0.a5.a1.a0 << ")), " << result.a1.a0.a6 << "), (("
16414 << result.a1.a1.a0.a0 << ", " << result.a1.a1.a0.a1 << "), ("
16415 << result.a1.a1.a1.a0 << ")), " << result.a1.a2 << ", "
16416 << result.a1.a3 << "), ((" << result.a2.a0.a0 << ", (("
16417 << result.a2.a0.a1.a0.a0 << ", " << result.a2.a0.a1.a0.a1 << "), ("
16418 << result.a2.a0.a1.a1.a0 << ")), " << result.a2.a0.a2 << ", (("
16419 << result.a2.a0.a3.a0.a0 << "), " << result.a2.a0.a3.a1 << "), "
16420 << result.a2.a0.a4 << ", ((" << result.a2.a0.a5.a0.a0 << "), ("
16421 << result.a2.a0.a5.a1.a0 << ")), " << result.a2.a0.a6 << "), (("
16422 << result.a2.a1.a0.a0 << ", " << result.a2.a1.a0.a1 << "), ("
16423 << result.a2.a1.a1.a0 << ")), " << result.a2.a2 << ", "
16424 << result.a2.a3 << "), " << result.a3 << ")"
16425 << "\n";
16426
16427 CHECK_EQ(a0, result.a0);
16428 CHECK_EQ(a1.a0.a0, result.a1.a0.a0);
16429 CHECK_EQ(a1.a0.a1.a0.a0, result.a1.a0.a1.a0.a0);
16430 CHECK_EQ(a1.a0.a1.a0.a1, result.a1.a0.a1.a0.a1);
16431 CHECK_APPROX(a1.a0.a1.a1.a0, result.a1.a0.a1.a1.a0);
16432 CHECK_EQ(a1.a0.a2, result.a1.a0.a2);
16433 CHECK_APPROX(a1.a0.a3.a0.a0, result.a1.a0.a3.a0.a0);
16434 CHECK_APPROX(a1.a0.a3.a1, result.a1.a0.a3.a1);
16435 CHECK_EQ(a1.a0.a4, result.a1.a0.a4);
16436 CHECK_APPROX(a1.a0.a5.a0.a0, result.a1.a0.a5.a0.a0);
16437 CHECK_APPROX(a1.a0.a5.a1.a0, result.a1.a0.a5.a1.a0);
16438 CHECK_EQ(a1.a0.a6, result.a1.a0.a6);
16439 CHECK_EQ(a1.a1.a0.a0, result.a1.a1.a0.a0);
16440 CHECK_EQ(a1.a1.a0.a1, result.a1.a1.a0.a1);
16441 CHECK_APPROX(a1.a1.a1.a0, result.a1.a1.a1.a0);
16442 CHECK_APPROX(a1.a2, result.a1.a2);
16443 CHECK_APPROX(a1.a3, result.a1.a3);
16444 CHECK_EQ(a2.a0.a0, result.a2.a0.a0);
16445 CHECK_EQ(a2.a0.a1.a0.a0, result.a2.a0.a1.a0.a0);
16446 CHECK_EQ(a2.a0.a1.a0.a1, result.a2.a0.a1.a0.a1);
16447 CHECK_APPROX(a2.a0.a1.a1.a0, result.a2.a0.a1.a1.a0);
16448 CHECK_EQ(a2.a0.a2, result.a2.a0.a2);
16449 CHECK_APPROX(a2.a0.a3.a0.a0, result.a2.a0.a3.a0.a0);
16450 CHECK_APPROX(a2.a0.a3.a1, result.a2.a0.a3.a1);
16451 CHECK_EQ(a2.a0.a4, result.a2.a0.a4);
16452 CHECK_APPROX(a2.a0.a5.a0.a0, result.a2.a0.a5.a0.a0);
16453 CHECK_APPROX(a2.a0.a5.a1.a0, result.a2.a0.a5.a1.a0);
16454 CHECK_EQ(a2.a0.a6, result.a2.a0.a6);
16455 CHECK_EQ(a2.a1.a0.a0, result.a2.a1.a0.a0);
16456 CHECK_EQ(a2.a1.a0.a1, result.a2.a1.a0.a1);
16457 CHECK_APPROX(a2.a1.a1.a0, result.a2.a1.a1.a0);
16458 CHECK_APPROX(a2.a2, result.a2.a2);
16459 CHECK_APPROX(a2.a3, result.a2.a3);
16460 CHECK_APPROX(a3, result.a3);
16461
16462 // Pass argument that will make the Dart callback throw.
16463 a0 = 42;
16464
16465 result = f(a0, a1, a2, a3);
16466
16467 CHECK_EQ(0, result.a0);
16468 CHECK_EQ(0, result.a1.a0.a0);
16469 CHECK_EQ(0, result.a1.a0.a1.a0.a0);
16470 CHECK_EQ(0, result.a1.a0.a1.a0.a1);
16471 CHECK_APPROX(0.0, result.a1.a0.a1.a1.a0);
16472 CHECK_EQ(0, result.a1.a0.a2);
16473 CHECK_APPROX(0.0, result.a1.a0.a3.a0.a0);
16474 CHECK_APPROX(0.0, result.a1.a0.a3.a1);
16475 CHECK_EQ(0, result.a1.a0.a4);
16476 CHECK_APPROX(0.0, result.a1.a0.a5.a0.a0);
16477 CHECK_APPROX(0.0, result.a1.a0.a5.a1.a0);
16478 CHECK_EQ(0, result.a1.a0.a6);
16479 CHECK_EQ(0, result.a1.a1.a0.a0);
16480 CHECK_EQ(0, result.a1.a1.a0.a1);
16481 CHECK_APPROX(0.0, result.a1.a1.a1.a0);
16482 CHECK_APPROX(0.0, result.a1.a2);
16483 CHECK_APPROX(0.0, result.a1.a3);
16484 CHECK_EQ(0, result.a2.a0.a0);
16485 CHECK_EQ(0, result.a2.a0.a1.a0.a0);
16486 CHECK_EQ(0, result.a2.a0.a1.a0.a1);
16487 CHECK_APPROX(0.0, result.a2.a0.a1.a1.a0);
16488 CHECK_EQ(0, result.a2.a0.a2);
16489 CHECK_APPROX(0.0, result.a2.a0.a3.a0.a0);
16490 CHECK_APPROX(0.0, result.a2.a0.a3.a1);
16491 CHECK_EQ(0, result.a2.a0.a4);
16492 CHECK_APPROX(0.0, result.a2.a0.a5.a0.a0);
16493 CHECK_APPROX(0.0, result.a2.a0.a5.a1.a0);
16494 CHECK_EQ(0, result.a2.a0.a6);
16495 CHECK_EQ(0, result.a2.a1.a0.a0);
16496 CHECK_EQ(0, result.a2.a1.a0.a1);
16497 CHECK_APPROX(0.0, result.a2.a1.a1.a0);
16498 CHECK_APPROX(0.0, result.a2.a2);
16499 CHECK_APPROX(0.0, result.a2.a3);
16500 CHECK_APPROX(0.0, result.a3);
16501
16502 // Pass argument that will make the Dart callback return null.
16503 a0 = 84;
16504
16505 result = f(a0, a1, a2, a3);
16506
16507 CHECK_EQ(0, result.a0);
16508 CHECK_EQ(0, result.a1.a0.a0);
16509 CHECK_EQ(0, result.a1.a0.a1.a0.a0);
16510 CHECK_EQ(0, result.a1.a0.a1.a0.a1);
16511 CHECK_APPROX(0.0, result.a1.a0.a1.a1.a0);
16512 CHECK_EQ(0, result.a1.a0.a2);
16513 CHECK_APPROX(0.0, result.a1.a0.a3.a0.a0);
16514 CHECK_APPROX(0.0, result.a1.a0.a3.a1);
16515 CHECK_EQ(0, result.a1.a0.a4);
16516 CHECK_APPROX(0.0, result.a1.a0.a5.a0.a0);
16517 CHECK_APPROX(0.0, result.a1.a0.a5.a1.a0);
16518 CHECK_EQ(0, result.a1.a0.a6);
16519 CHECK_EQ(0, result.a1.a1.a0.a0);
16520 CHECK_EQ(0, result.a1.a1.a0.a1);
16521 CHECK_APPROX(0.0, result.a1.a1.a1.a0);
16522 CHECK_APPROX(0.0, result.a1.a2);
16523 CHECK_APPROX(0.0, result.a1.a3);
16524 CHECK_EQ(0, result.a2.a0.a0);
16525 CHECK_EQ(0, result.a2.a0.a1.a0.a0);
16526 CHECK_EQ(0, result.a2.a0.a1.a0.a1);
16527 CHECK_APPROX(0.0, result.a2.a0.a1.a1.a0);
16528 CHECK_EQ(0, result.a2.a0.a2);
16529 CHECK_APPROX(0.0, result.a2.a0.a3.a0.a0);
16530 CHECK_APPROX(0.0, result.a2.a0.a3.a1);
16531 CHECK_EQ(0, result.a2.a0.a4);
16532 CHECK_APPROX(0.0, result.a2.a0.a5.a0.a0);
16533 CHECK_APPROX(0.0, result.a2.a0.a5.a1.a0);
16534 CHECK_EQ(0, result.a2.a0.a6);
16535 CHECK_EQ(0, result.a2.a1.a0.a0);
16536 CHECK_EQ(0, result.a2.a1.a0.a1);
16537 CHECK_APPROX(0.0, result.a2.a1.a1.a0);
16538 CHECK_APPROX(0.0, result.a2.a2);
16539 CHECK_APPROX(0.0, result.a2.a3);
16540 CHECK_APPROX(0.0, result.a3);
16541
16542 return 0;
16543}
16544
16545// Used for testing structs and unions by value.
16546// Smallest struct with data.
16547// 10 struct arguments will exhaust available registers.
16549 // NOLINTNEXTLINE(whitespace/parens)
16550 void (*f)(Struct1ByteInt a0,
16551 Struct1ByteInt a1,
16552 Struct1ByteInt a2,
16553 Struct1ByteInt a3,
16554 Struct1ByteInt a4,
16555 Struct1ByteInt a5,
16556 Struct1ByteInt a6,
16557 Struct1ByteInt a7,
16558 Struct1ByteInt a8,
16559 Struct1ByteInt a9)) {
16560 Struct1ByteInt a0 = {};
16561 Struct1ByteInt a1 = {};
16562 Struct1ByteInt a2 = {};
16563 Struct1ByteInt a3 = {};
16564 Struct1ByteInt a4 = {};
16565 Struct1ByteInt a5 = {};
16566 Struct1ByteInt a6 = {};
16567 Struct1ByteInt a7 = {};
16568 Struct1ByteInt a8 = {};
16569 Struct1ByteInt a9 = {};
16570
16571 a0.a0 = -1;
16572 a1.a0 = 2;
16573 a2.a0 = -3;
16574 a3.a0 = 4;
16575 a4.a0 = -5;
16576 a5.a0 = 6;
16577 a6.a0 = -7;
16578 a7.a0 = 8;
16579 a8.a0 = -9;
16580 a9.a0 = 10;
16581
16582 std::cout << "Calling TestAsyncPassStruct1ByteIntx10("
16583 << "((" << static_cast<int>(a0.a0) << "), ("
16584 << static_cast<int>(a1.a0) << "), (" << static_cast<int>(a2.a0)
16585 << "), (" << static_cast<int>(a3.a0) << "), ("
16586 << static_cast<int>(a4.a0) << "), (" << static_cast<int>(a5.a0)
16587 << "), (" << static_cast<int>(a6.a0) << "), ("
16588 << static_cast<int>(a7.a0) << "), (" << static_cast<int>(a8.a0)
16589 << "), (" << static_cast<int>(a9.a0) << "))"
16590 << ")\n";
16591
16592 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
16593}
16594
16595// Used for testing structs and unions by value.
16596// Not a multiple of word size, not a power of two.
16597// 10 struct arguments will exhaust available registers.
16599 // NOLINTNEXTLINE(whitespace/parens)
16620
16621 a0.a0 = 1;
16622 a0.a1 = 2;
16623 a0.a2 = 3;
16624 a1.a0 = 4;
16625 a1.a1 = 5;
16626 a1.a2 = 6;
16627 a2.a0 = 7;
16628 a2.a1 = 8;
16629 a2.a2 = 9;
16630 a3.a0 = 10;
16631 a3.a1 = 11;
16632 a3.a2 = 12;
16633 a4.a0 = 13;
16634 a4.a1 = 14;
16635 a4.a2 = 15;
16636 a5.a0 = 16;
16637 a5.a1 = 17;
16638 a5.a2 = 18;
16639 a6.a0 = 19;
16640 a6.a1 = 20;
16641 a6.a2 = 21;
16642 a7.a0 = 22;
16643 a7.a1 = 23;
16644 a7.a2 = 24;
16645 a8.a0 = 25;
16646 a8.a1 = 26;
16647 a8.a2 = 27;
16648 a9.a0 = 28;
16649 a9.a1 = 29;
16650 a9.a2 = 30;
16651
16652 std::cout << "Calling TestAsyncPassStruct3BytesHomogeneousUint8x10("
16653 << "((" << static_cast<int>(a0.a0) << ", "
16654 << static_cast<int>(a0.a1) << ", " << static_cast<int>(a0.a2)
16655 << "), (" << static_cast<int>(a1.a0) << ", "
16656 << static_cast<int>(a1.a1) << ", " << static_cast<int>(a1.a2)
16657 << "), (" << static_cast<int>(a2.a0) << ", "
16658 << static_cast<int>(a2.a1) << ", " << static_cast<int>(a2.a2)
16659 << "), (" << static_cast<int>(a3.a0) << ", "
16660 << static_cast<int>(a3.a1) << ", " << static_cast<int>(a3.a2)
16661 << "), (" << static_cast<int>(a4.a0) << ", "
16662 << static_cast<int>(a4.a1) << ", " << static_cast<int>(a4.a2)
16663 << "), (" << static_cast<int>(a5.a0) << ", "
16664 << static_cast<int>(a5.a1) << ", " << static_cast<int>(a5.a2)
16665 << "), (" << static_cast<int>(a6.a0) << ", "
16666 << static_cast<int>(a6.a1) << ", " << static_cast<int>(a6.a2)
16667 << "), (" << static_cast<int>(a7.a0) << ", "
16668 << static_cast<int>(a7.a1) << ", " << static_cast<int>(a7.a2)
16669 << "), (" << static_cast<int>(a8.a0) << ", "
16670 << static_cast<int>(a8.a1) << ", " << static_cast<int>(a8.a2)
16671 << "), (" << static_cast<int>(a9.a0) << ", "
16672 << static_cast<int>(a9.a1) << ", " << static_cast<int>(a9.a2)
16673 << "))"
16674 << ")\n";
16675
16676 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
16677}
16678
16679// Used for testing structs and unions by value.
16680// Not a multiple of word size, not a power of two.
16681// With alignment rules taken into account size is 4 bytes.
16682// 10 struct arguments will exhaust available registers.
16684 // NOLINTNEXTLINE(whitespace/parens)
16685 void (*f)(Struct3BytesInt2ByteAligned a0,
16705
16706 a0.a0 = -1;
16707 a0.a1 = 2;
16708 a1.a0 = -3;
16709 a1.a1 = 4;
16710 a2.a0 = -5;
16711 a2.a1 = 6;
16712 a3.a0 = -7;
16713 a3.a1 = 8;
16714 a4.a0 = -9;
16715 a4.a1 = 10;
16716 a5.a0 = -11;
16717 a5.a1 = 12;
16718 a6.a0 = -13;
16719 a6.a1 = 14;
16720 a7.a0 = -15;
16721 a7.a1 = 16;
16722 a8.a0 = -17;
16723 a8.a1 = 18;
16724 a9.a0 = -19;
16725 a9.a1 = 20;
16726
16727 std::cout << "Calling TestAsyncPassStruct3BytesInt2ByteAlignedx10("
16728 << "((" << a0.a0 << ", " << static_cast<int>(a0.a1) << "), ("
16729 << a1.a0 << ", " << static_cast<int>(a1.a1) << "), (" << a2.a0
16730 << ", " << static_cast<int>(a2.a1) << "), (" << a3.a0 << ", "
16731 << static_cast<int>(a3.a1) << "), (" << a4.a0 << ", "
16732 << static_cast<int>(a4.a1) << "), (" << a5.a0 << ", "
16733 << static_cast<int>(a5.a1) << "), (" << a6.a0 << ", "
16734 << static_cast<int>(a6.a1) << "), (" << a7.a0 << ", "
16735 << static_cast<int>(a7.a1) << "), (" << a8.a0 << ", "
16736 << static_cast<int>(a8.a1) << "), (" << a9.a0 << ", "
16737 << static_cast<int>(a9.a1) << "))"
16738 << ")\n";
16739
16740 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
16741}
16742
16743// Used for testing structs and unions by value.
16744// Exactly word size on 32-bit architectures.
16745// 10 struct arguments will exhaust available registers.
16747 // NOLINTNEXTLINE(whitespace/parens)
16768
16769 a0.a0 = -1;
16770 a0.a1 = 2;
16771 a1.a0 = -3;
16772 a1.a1 = 4;
16773 a2.a0 = -5;
16774 a2.a1 = 6;
16775 a3.a0 = -7;
16776 a3.a1 = 8;
16777 a4.a0 = -9;
16778 a4.a1 = 10;
16779 a5.a0 = -11;
16780 a5.a1 = 12;
16781 a6.a0 = -13;
16782 a6.a1 = 14;
16783 a7.a0 = -15;
16784 a7.a1 = 16;
16785 a8.a0 = -17;
16786 a8.a1 = 18;
16787 a9.a0 = -19;
16788 a9.a1 = 20;
16789
16790 std::cout << "Calling TestAsyncPassStruct4BytesHomogeneousInt16x10("
16791 << "((" << a0.a0 << ", " << a0.a1 << "), (" << a1.a0 << ", "
16792 << a1.a1 << "), (" << a2.a0 << ", " << a2.a1 << "), (" << a3.a0
16793 << ", " << a3.a1 << "), (" << a4.a0 << ", " << a4.a1 << "), ("
16794 << a5.a0 << ", " << a5.a1 << "), (" << a6.a0 << ", " << a6.a1
16795 << "), (" << a7.a0 << ", " << a7.a1 << "), (" << a8.a0 << ", "
16796 << a8.a1 << "), (" << a9.a0 << ", " << a9.a1 << "))"
16797 << ")\n";
16798
16799 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
16800}
16801
16802// Used for testing structs and unions by value.
16803// Sub word size on 64 bit architectures.
16804// 10 struct arguments will exhaust available registers.
16806 // NOLINTNEXTLINE(whitespace/parens)
16827
16828 a0.a0 = 1;
16829 a0.a1 = 2;
16830 a0.a2 = 3;
16831 a0.a3 = 4;
16832 a0.a4 = 5;
16833 a0.a5 = 6;
16834 a0.a6 = 7;
16835 a1.a0 = 8;
16836 a1.a1 = 9;
16837 a1.a2 = 10;
16838 a1.a3 = 11;
16839 a1.a4 = 12;
16840 a1.a5 = 13;
16841 a1.a6 = 14;
16842 a2.a0 = 15;
16843 a2.a1 = 16;
16844 a2.a2 = 17;
16845 a2.a3 = 18;
16846 a2.a4 = 19;
16847 a2.a5 = 20;
16848 a2.a6 = 21;
16849 a3.a0 = 22;
16850 a3.a1 = 23;
16851 a3.a2 = 24;
16852 a3.a3 = 25;
16853 a3.a4 = 26;
16854 a3.a5 = 27;
16855 a3.a6 = 28;
16856 a4.a0 = 29;
16857 a4.a1 = 30;
16858 a4.a2 = 31;
16859 a4.a3 = 32;
16860 a4.a4 = 33;
16861 a4.a5 = 34;
16862 a4.a6 = 35;
16863 a5.a0 = 36;
16864 a5.a1 = 37;
16865 a5.a2 = 38;
16866 a5.a3 = 39;
16867 a5.a4 = 40;
16868 a5.a5 = 41;
16869 a5.a6 = 42;
16870 a6.a0 = 43;
16871 a6.a1 = 44;
16872 a6.a2 = 45;
16873 a6.a3 = 46;
16874 a6.a4 = 47;
16875 a6.a5 = 48;
16876 a6.a6 = 49;
16877 a7.a0 = 50;
16878 a7.a1 = 51;
16879 a7.a2 = 52;
16880 a7.a3 = 53;
16881 a7.a4 = 54;
16882 a7.a5 = 55;
16883 a7.a6 = 56;
16884 a8.a0 = 57;
16885 a8.a1 = 58;
16886 a8.a2 = 59;
16887 a8.a3 = 60;
16888 a8.a4 = 61;
16889 a8.a5 = 62;
16890 a8.a6 = 63;
16891 a9.a0 = 64;
16892 a9.a1 = 65;
16893 a9.a2 = 66;
16894 a9.a3 = 67;
16895 a9.a4 = 68;
16896 a9.a5 = 69;
16897 a9.a6 = 70;
16898
16899 std::cout
16900 << "Calling TestAsyncPassStruct7BytesHomogeneousUint8x10("
16901 << "((" << static_cast<int>(a0.a0) << ", " << static_cast<int>(a0.a1)
16902 << ", " << static_cast<int>(a0.a2) << ", " << static_cast<int>(a0.a3)
16903 << ", " << static_cast<int>(a0.a4) << ", " << static_cast<int>(a0.a5)
16904 << ", " << static_cast<int>(a0.a6) << "), (" << static_cast<int>(a1.a0)
16905 << ", " << static_cast<int>(a1.a1) << ", " << static_cast<int>(a1.a2)
16906 << ", " << static_cast<int>(a1.a3) << ", " << static_cast<int>(a1.a4)
16907 << ", " << static_cast<int>(a1.a5) << ", " << static_cast<int>(a1.a6)
16908 << "), (" << static_cast<int>(a2.a0) << ", " << static_cast<int>(a2.a1)
16909 << ", " << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3)
16910 << ", " << static_cast<int>(a2.a4) << ", " << static_cast<int>(a2.a5)
16911 << ", " << static_cast<int>(a2.a6) << "), (" << static_cast<int>(a3.a0)
16912 << ", " << static_cast<int>(a3.a1) << ", " << static_cast<int>(a3.a2)
16913 << ", " << static_cast<int>(a3.a3) << ", " << static_cast<int>(a3.a4)
16914 << ", " << static_cast<int>(a3.a5) << ", " << static_cast<int>(a3.a6)
16915 << "), (" << static_cast<int>(a4.a0) << ", " << static_cast<int>(a4.a1)
16916 << ", " << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3)
16917 << ", " << static_cast<int>(a4.a4) << ", " << static_cast<int>(a4.a5)
16918 << ", " << static_cast<int>(a4.a6) << "), (" << static_cast<int>(a5.a0)
16919 << ", " << static_cast<int>(a5.a1) << ", " << static_cast<int>(a5.a2)
16920 << ", " << static_cast<int>(a5.a3) << ", " << static_cast<int>(a5.a4)
16921 << ", " << static_cast<int>(a5.a5) << ", " << static_cast<int>(a5.a6)
16922 << "), (" << static_cast<int>(a6.a0) << ", " << static_cast<int>(a6.a1)
16923 << ", " << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3)
16924 << ", " << static_cast<int>(a6.a4) << ", " << static_cast<int>(a6.a5)
16925 << ", " << static_cast<int>(a6.a6) << "), (" << static_cast<int>(a7.a0)
16926 << ", " << static_cast<int>(a7.a1) << ", " << static_cast<int>(a7.a2)
16927 << ", " << static_cast<int>(a7.a3) << ", " << static_cast<int>(a7.a4)
16928 << ", " << static_cast<int>(a7.a5) << ", " << static_cast<int>(a7.a6)
16929 << "), (" << static_cast<int>(a8.a0) << ", " << static_cast<int>(a8.a1)
16930 << ", " << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3)
16931 << ", " << static_cast<int>(a8.a4) << ", " << static_cast<int>(a8.a5)
16932 << ", " << static_cast<int>(a8.a6) << "), (" << static_cast<int>(a9.a0)
16933 << ", " << static_cast<int>(a9.a1) << ", " << static_cast<int>(a9.a2)
16934 << ", " << static_cast<int>(a9.a3) << ", " << static_cast<int>(a9.a4)
16935 << ", " << static_cast<int>(a9.a5) << ", " << static_cast<int>(a9.a6)
16936 << "))"
16937 << ")\n";
16938
16939 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
16940}
16941
16942// Used for testing structs and unions by value.
16943// Sub word size on 64 bit architectures.
16944// With alignment rules taken into account size is 8 bytes.
16945// 10 struct arguments will exhaust available registers.
16947 // NOLINTNEXTLINE(whitespace/parens)
16948 void (*f)(Struct7BytesInt4ByteAligned a0,
16968
16969 a0.a0 = -1;
16970 a0.a1 = 2;
16971 a0.a2 = -3;
16972 a1.a0 = 4;
16973 a1.a1 = -5;
16974 a1.a2 = 6;
16975 a2.a0 = -7;
16976 a2.a1 = 8;
16977 a2.a2 = -9;
16978 a3.a0 = 10;
16979 a3.a1 = -11;
16980 a3.a2 = 12;
16981 a4.a0 = -13;
16982 a4.a1 = 14;
16983 a4.a2 = -15;
16984 a5.a0 = 16;
16985 a5.a1 = -17;
16986 a5.a2 = 18;
16987 a6.a0 = -19;
16988 a6.a1 = 20;
16989 a6.a2 = -21;
16990 a7.a0 = 22;
16991 a7.a1 = -23;
16992 a7.a2 = 24;
16993 a8.a0 = -25;
16994 a8.a1 = 26;
16995 a8.a2 = -27;
16996 a9.a0 = 28;
16997 a9.a1 = -29;
16998 a9.a2 = 30;
16999
17000 std::cout << "Calling TestAsyncPassStruct7BytesInt4ByteAlignedx10("
17001 << "((" << a0.a0 << ", " << a0.a1 << ", " << static_cast<int>(a0.a2)
17002 << "), (" << a1.a0 << ", " << a1.a1 << ", "
17003 << static_cast<int>(a1.a2) << "), (" << a2.a0 << ", " << a2.a1
17004 << ", " << static_cast<int>(a2.a2) << "), (" << a3.a0 << ", "
17005 << a3.a1 << ", " << static_cast<int>(a3.a2) << "), (" << a4.a0
17006 << ", " << a4.a1 << ", " << static_cast<int>(a4.a2) << "), ("
17007 << a5.a0 << ", " << a5.a1 << ", " << static_cast<int>(a5.a2)
17008 << "), (" << a6.a0 << ", " << a6.a1 << ", "
17009 << static_cast<int>(a6.a2) << "), (" << a7.a0 << ", " << a7.a1
17010 << ", " << static_cast<int>(a7.a2) << "), (" << a8.a0 << ", "
17011 << a8.a1 << ", " << static_cast<int>(a8.a2) << "), (" << a9.a0
17012 << ", " << a9.a1 << ", " << static_cast<int>(a9.a2) << "))"
17013 << ")\n";
17014
17015 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
17016}
17017
17018// Used for testing structs and unions by value.
17019// Exactly word size struct on 64bit architectures.
17020// 10 struct arguments will exhaust available registers.
17022 // NOLINTNEXTLINE(whitespace/parens)
17023 void (*f)(Struct8BytesInt a0,
17024 Struct8BytesInt a1,
17025 Struct8BytesInt a2,
17026 Struct8BytesInt a3,
17027 Struct8BytesInt a4,
17028 Struct8BytesInt a5,
17029 Struct8BytesInt a6,
17030 Struct8BytesInt a7,
17031 Struct8BytesInt a8,
17032 Struct8BytesInt a9)) {
17033 Struct8BytesInt a0 = {};
17034 Struct8BytesInt a1 = {};
17035 Struct8BytesInt a2 = {};
17036 Struct8BytesInt a3 = {};
17037 Struct8BytesInt a4 = {};
17038 Struct8BytesInt a5 = {};
17039 Struct8BytesInt a6 = {};
17040 Struct8BytesInt a7 = {};
17041 Struct8BytesInt a8 = {};
17042 Struct8BytesInt a9 = {};
17043
17044 a0.a0 = -1;
17045 a0.a1 = 2;
17046 a0.a2 = -3;
17047 a1.a0 = 4;
17048 a1.a1 = -5;
17049 a1.a2 = 6;
17050 a2.a0 = -7;
17051 a2.a1 = 8;
17052 a2.a2 = -9;
17053 a3.a0 = 10;
17054 a3.a1 = -11;
17055 a3.a2 = 12;
17056 a4.a0 = -13;
17057 a4.a1 = 14;
17058 a4.a2 = -15;
17059 a5.a0 = 16;
17060 a5.a1 = -17;
17061 a5.a2 = 18;
17062 a6.a0 = -19;
17063 a6.a1 = 20;
17064 a6.a2 = -21;
17065 a7.a0 = 22;
17066 a7.a1 = -23;
17067 a7.a2 = 24;
17068 a8.a0 = -25;
17069 a8.a1 = 26;
17070 a8.a2 = -27;
17071 a9.a0 = 28;
17072 a9.a1 = -29;
17073 a9.a2 = 30;
17074
17075 std::cout << "Calling TestAsyncPassStruct8BytesIntx10("
17076 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << "), ("
17077 << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << "), (" << a2.a0
17078 << ", " << a2.a1 << ", " << a2.a2 << "), (" << a3.a0 << ", "
17079 << a3.a1 << ", " << a3.a2 << "), (" << a4.a0 << ", " << a4.a1
17080 << ", " << a4.a2 << "), (" << a5.a0 << ", " << a5.a1 << ", "
17081 << a5.a2 << "), (" << a6.a0 << ", " << a6.a1 << ", " << a6.a2
17082 << "), (" << a7.a0 << ", " << a7.a1 << ", " << a7.a2 << "), ("
17083 << a8.a0 << ", " << a8.a1 << ", " << a8.a2 << "), (" << a9.a0
17084 << ", " << a9.a1 << ", " << a9.a2 << "))"
17085 << ")\n";
17086
17087 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
17088}
17089
17090// Used for testing structs and unions by value.
17091// Arguments passed in FP registers as long as they fit.
17092// 10 struct arguments will exhaust available registers.
17094 // NOLINTNEXTLINE(whitespace/parens)
17115
17116 a0.a0 = -1.0;
17117 a0.a1 = 2.0;
17118 a1.a0 = -3.0;
17119 a1.a1 = 4.0;
17120 a2.a0 = -5.0;
17121 a2.a1 = 6.0;
17122 a3.a0 = -7.0;
17123 a3.a1 = 8.0;
17124 a4.a0 = -9.0;
17125 a4.a1 = 10.0;
17126 a5.a0 = -11.0;
17127 a5.a1 = 12.0;
17128 a6.a0 = -13.0;
17129 a6.a1 = 14.0;
17130 a7.a0 = -15.0;
17131 a7.a1 = 16.0;
17132 a8.a0 = -17.0;
17133 a8.a1 = 18.0;
17134 a9.a0 = -19.0;
17135 a9.a1 = 20.0;
17136
17137 std::cout << "Calling TestAsyncPassStruct8BytesHomogeneousFloatx10("
17138 << "((" << a0.a0 << ", " << a0.a1 << "), (" << a1.a0 << ", "
17139 << a1.a1 << "), (" << a2.a0 << ", " << a2.a1 << "), (" << a3.a0
17140 << ", " << a3.a1 << "), (" << a4.a0 << ", " << a4.a1 << "), ("
17141 << a5.a0 << ", " << a5.a1 << "), (" << a6.a0 << ", " << a6.a1
17142 << "), (" << a7.a0 << ", " << a7.a1 << "), (" << a8.a0 << ", "
17143 << a8.a1 << "), (" << a9.a0 << ", " << a9.a1 << "))"
17144 << ")\n";
17145
17146 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
17147}
17148
17149// Used for testing structs and unions by value.
17150// On x64, arguments go in int registers because it is not only float.
17151// 10 struct arguments will exhaust available registers.
17153 // NOLINTNEXTLINE(whitespace/parens)
17154 void (*f)(Struct8BytesMixed a0,
17163 Struct8BytesMixed a9)) {
17164 Struct8BytesMixed a0 = {};
17165 Struct8BytesMixed a1 = {};
17166 Struct8BytesMixed a2 = {};
17167 Struct8BytesMixed a3 = {};
17168 Struct8BytesMixed a4 = {};
17169 Struct8BytesMixed a5 = {};
17170 Struct8BytesMixed a6 = {};
17171 Struct8BytesMixed a7 = {};
17172 Struct8BytesMixed a8 = {};
17173 Struct8BytesMixed a9 = {};
17174
17175 a0.a0 = -1.0;
17176 a0.a1 = 2;
17177 a0.a2 = -3;
17178 a1.a0 = 4.0;
17179 a1.a1 = -5;
17180 a1.a2 = 6;
17181 a2.a0 = -7.0;
17182 a2.a1 = 8;
17183 a2.a2 = -9;
17184 a3.a0 = 10.0;
17185 a3.a1 = -11;
17186 a3.a2 = 12;
17187 a4.a0 = -13.0;
17188 a4.a1 = 14;
17189 a4.a2 = -15;
17190 a5.a0 = 16.0;
17191 a5.a1 = -17;
17192 a5.a2 = 18;
17193 a6.a0 = -19.0;
17194 a6.a1 = 20;
17195 a6.a2 = -21;
17196 a7.a0 = 22.0;
17197 a7.a1 = -23;
17198 a7.a2 = 24;
17199 a8.a0 = -25.0;
17200 a8.a1 = 26;
17201 a8.a2 = -27;
17202 a9.a0 = 28.0;
17203 a9.a1 = -29;
17204 a9.a2 = 30;
17205
17206 std::cout << "Calling TestAsyncPassStruct8BytesMixedx10("
17207 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << "), ("
17208 << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << "), (" << a2.a0
17209 << ", " << a2.a1 << ", " << a2.a2 << "), (" << a3.a0 << ", "
17210 << a3.a1 << ", " << a3.a2 << "), (" << a4.a0 << ", " << a4.a1
17211 << ", " << a4.a2 << "), (" << a5.a0 << ", " << a5.a1 << ", "
17212 << a5.a2 << "), (" << a6.a0 << ", " << a6.a1 << ", " << a6.a2
17213 << "), (" << a7.a0 << ", " << a7.a1 << ", " << a7.a2 << "), ("
17214 << a8.a0 << ", " << a8.a1 << ", " << a8.a2 << "), (" << a9.a0
17215 << ", " << a9.a1 << ", " << a9.a2 << "))"
17216 << ")\n";
17217
17218 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
17219}
17220
17221// Used for testing structs and unions by value.
17222// Argument is a single byte over a multiple of word size.
17223// 10 struct arguments will exhaust available registers.
17224// Struct only has 1-byte aligned fields to test struct alignment itself.
17225// Tests upper bytes in the integer registers that are partly filled.
17226// Tests stack alignment of non word size stack arguments.
17228 // NOLINTNEXTLINE(whitespace/parens)
17249
17250 a0.a0 = 1;
17251 a0.a1 = 2;
17252 a0.a2 = 3;
17253 a0.a3 = 4;
17254 a0.a4 = 5;
17255 a0.a5 = 6;
17256 a0.a6 = 7;
17257 a0.a7 = 8;
17258 a0.a8 = 9;
17259 a1.a0 = 10;
17260 a1.a1 = 11;
17261 a1.a2 = 12;
17262 a1.a3 = 13;
17263 a1.a4 = 14;
17264 a1.a5 = 15;
17265 a1.a6 = 16;
17266 a1.a7 = 17;
17267 a1.a8 = 18;
17268 a2.a0 = 19;
17269 a2.a1 = 20;
17270 a2.a2 = 21;
17271 a2.a3 = 22;
17272 a2.a4 = 23;
17273 a2.a5 = 24;
17274 a2.a6 = 25;
17275 a2.a7 = 26;
17276 a2.a8 = 27;
17277 a3.a0 = 28;
17278 a3.a1 = 29;
17279 a3.a2 = 30;
17280 a3.a3 = 31;
17281 a3.a4 = 32;
17282 a3.a5 = 33;
17283 a3.a6 = 34;
17284 a3.a7 = 35;
17285 a3.a8 = 36;
17286 a4.a0 = 37;
17287 a4.a1 = 38;
17288 a4.a2 = 39;
17289 a4.a3 = 40;
17290 a4.a4 = 41;
17291 a4.a5 = 42;
17292 a4.a6 = 43;
17293 a4.a7 = 44;
17294 a4.a8 = 45;
17295 a5.a0 = 46;
17296 a5.a1 = 47;
17297 a5.a2 = 48;
17298 a5.a3 = 49;
17299 a5.a4 = 50;
17300 a5.a5 = 51;
17301 a5.a6 = 52;
17302 a5.a7 = 53;
17303 a5.a8 = 54;
17304 a6.a0 = 55;
17305 a6.a1 = 56;
17306 a6.a2 = 57;
17307 a6.a3 = 58;
17308 a6.a4 = 59;
17309 a6.a5 = 60;
17310 a6.a6 = 61;
17311 a6.a7 = 62;
17312 a6.a8 = 63;
17313 a7.a0 = 64;
17314 a7.a1 = 65;
17315 a7.a2 = 66;
17316 a7.a3 = 67;
17317 a7.a4 = 68;
17318 a7.a5 = 69;
17319 a7.a6 = 70;
17320 a7.a7 = 71;
17321 a7.a8 = 72;
17322 a8.a0 = 73;
17323 a8.a1 = 74;
17324 a8.a2 = 75;
17325 a8.a3 = 76;
17326 a8.a4 = 77;
17327 a8.a5 = 78;
17328 a8.a6 = 79;
17329 a8.a7 = 80;
17330 a8.a8 = 81;
17331 a9.a0 = 82;
17332 a9.a1 = 83;
17333 a9.a2 = 84;
17334 a9.a3 = 85;
17335 a9.a4 = 86;
17336 a9.a5 = 87;
17337 a9.a6 = 88;
17338 a9.a7 = 89;
17339 a9.a8 = 90;
17340
17341 std::cout
17342 << "Calling TestAsyncPassStruct9BytesHomogeneousUint8x10("
17343 << "((" << static_cast<int>(a0.a0) << ", " << static_cast<int>(a0.a1)
17344 << ", " << static_cast<int>(a0.a2) << ", " << static_cast<int>(a0.a3)
17345 << ", " << static_cast<int>(a0.a4) << ", " << static_cast<int>(a0.a5)
17346 << ", " << static_cast<int>(a0.a6) << ", " << static_cast<int>(a0.a7)
17347 << ", " << static_cast<int>(a0.a8) << "), (" << static_cast<int>(a1.a0)
17348 << ", " << static_cast<int>(a1.a1) << ", " << static_cast<int>(a1.a2)
17349 << ", " << static_cast<int>(a1.a3) << ", " << static_cast<int>(a1.a4)
17350 << ", " << static_cast<int>(a1.a5) << ", " << static_cast<int>(a1.a6)
17351 << ", " << static_cast<int>(a1.a7) << ", " << static_cast<int>(a1.a8)
17352 << "), (" << static_cast<int>(a2.a0) << ", " << static_cast<int>(a2.a1)
17353 << ", " << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3)
17354 << ", " << static_cast<int>(a2.a4) << ", " << static_cast<int>(a2.a5)
17355 << ", " << static_cast<int>(a2.a6) << ", " << static_cast<int>(a2.a7)
17356 << ", " << static_cast<int>(a2.a8) << "), (" << static_cast<int>(a3.a0)
17357 << ", " << static_cast<int>(a3.a1) << ", " << static_cast<int>(a3.a2)
17358 << ", " << static_cast<int>(a3.a3) << ", " << static_cast<int>(a3.a4)
17359 << ", " << static_cast<int>(a3.a5) << ", " << static_cast<int>(a3.a6)
17360 << ", " << static_cast<int>(a3.a7) << ", " << static_cast<int>(a3.a8)
17361 << "), (" << static_cast<int>(a4.a0) << ", " << static_cast<int>(a4.a1)
17362 << ", " << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3)
17363 << ", " << static_cast<int>(a4.a4) << ", " << static_cast<int>(a4.a5)
17364 << ", " << static_cast<int>(a4.a6) << ", " << static_cast<int>(a4.a7)
17365 << ", " << static_cast<int>(a4.a8) << "), (" << static_cast<int>(a5.a0)
17366 << ", " << static_cast<int>(a5.a1) << ", " << static_cast<int>(a5.a2)
17367 << ", " << static_cast<int>(a5.a3) << ", " << static_cast<int>(a5.a4)
17368 << ", " << static_cast<int>(a5.a5) << ", " << static_cast<int>(a5.a6)
17369 << ", " << static_cast<int>(a5.a7) << ", " << static_cast<int>(a5.a8)
17370 << "), (" << static_cast<int>(a6.a0) << ", " << static_cast<int>(a6.a1)
17371 << ", " << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3)
17372 << ", " << static_cast<int>(a6.a4) << ", " << static_cast<int>(a6.a5)
17373 << ", " << static_cast<int>(a6.a6) << ", " << static_cast<int>(a6.a7)
17374 << ", " << static_cast<int>(a6.a8) << "), (" << static_cast<int>(a7.a0)
17375 << ", " << static_cast<int>(a7.a1) << ", " << static_cast<int>(a7.a2)
17376 << ", " << static_cast<int>(a7.a3) << ", " << static_cast<int>(a7.a4)
17377 << ", " << static_cast<int>(a7.a5) << ", " << static_cast<int>(a7.a6)
17378 << ", " << static_cast<int>(a7.a7) << ", " << static_cast<int>(a7.a8)
17379 << "), (" << static_cast<int>(a8.a0) << ", " << static_cast<int>(a8.a1)
17380 << ", " << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3)
17381 << ", " << static_cast<int>(a8.a4) << ", " << static_cast<int>(a8.a5)
17382 << ", " << static_cast<int>(a8.a6) << ", " << static_cast<int>(a8.a7)
17383 << ", " << static_cast<int>(a8.a8) << "), (" << static_cast<int>(a9.a0)
17384 << ", " << static_cast<int>(a9.a1) << ", " << static_cast<int>(a9.a2)
17385 << ", " << static_cast<int>(a9.a3) << ", " << static_cast<int>(a9.a4)
17386 << ", " << static_cast<int>(a9.a5) << ", " << static_cast<int>(a9.a6)
17387 << ", " << static_cast<int>(a9.a7) << ", " << static_cast<int>(a9.a8)
17388 << "))"
17389 << ")\n";
17390
17391 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
17392}
17393
17394// Used for testing structs and unions by value.
17395// Argument is a single byte over a multiple of word size.
17396// With alignment rules taken into account size is 12 or 16 bytes.
17397// 10 struct arguments will exhaust available registers.
17398//
17400 // NOLINTNEXTLINE(whitespace/parens)
17421
17422 a0.a0 = -1;
17423 a0.a1 = 2;
17424 a1.a0 = -3;
17425 a1.a1 = 4;
17426 a2.a0 = -5;
17427 a2.a1 = 6;
17428 a3.a0 = -7;
17429 a3.a1 = 8;
17430 a4.a0 = -9;
17431 a4.a1 = 10;
17432 a5.a0 = -11;
17433 a5.a1 = 12;
17434 a6.a0 = -13;
17435 a6.a1 = 14;
17436 a7.a0 = -15;
17437 a7.a1 = 16;
17438 a8.a0 = -17;
17439 a8.a1 = 18;
17440 a9.a0 = -19;
17441 a9.a1 = 20;
17442
17443 std::cout << "Calling TestAsyncPassStruct9BytesInt4Or8ByteAlignedx10("
17444 << "((" << a0.a0 << ", " << static_cast<int>(a0.a1) << "), ("
17445 << a1.a0 << ", " << static_cast<int>(a1.a1) << "), (" << a2.a0
17446 << ", " << static_cast<int>(a2.a1) << "), (" << a3.a0 << ", "
17447 << static_cast<int>(a3.a1) << "), (" << a4.a0 << ", "
17448 << static_cast<int>(a4.a1) << "), (" << a5.a0 << ", "
17449 << static_cast<int>(a5.a1) << "), (" << a6.a0 << ", "
17450 << static_cast<int>(a6.a1) << "), (" << a7.a0 << ", "
17451 << static_cast<int>(a7.a1) << "), (" << a8.a0 << ", "
17452 << static_cast<int>(a8.a1) << "), (" << a9.a0 << ", "
17453 << static_cast<int>(a9.a1) << "))"
17454 << ")\n";
17455
17456 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
17457}
17458
17459// Used for testing structs and unions by value.
17460// Arguments in FPU registers on arm hardfp and arm64.
17461// Struct arguments will exhaust available registers, and leave some empty.
17462// The last argument is to test whether arguments are backfilled.
17464 // NOLINTNEXTLINE(whitespace/parens)
17477
17478 a0.a0 = -1.0;
17479 a0.a1 = 2.0;
17480 a0.a2 = -3.0;
17481 a1.a0 = 4.0;
17482 a1.a1 = -5.0;
17483 a1.a2 = 6.0;
17484 a2.a0 = -7.0;
17485 a2.a1 = 8.0;
17486 a2.a2 = -9.0;
17487 a3.a0 = 10.0;
17488 a3.a1 = -11.0;
17489 a3.a2 = 12.0;
17490 a4.a0 = -13.0;
17491 a4.a1 = 14.0;
17492 a4.a2 = -15.0;
17493 a5.a0 = 16.0;
17494 a5.a1 = -17.0;
17495 a5.a2 = 18.0;
17496
17497 std::cout << "Calling TestAsyncPassStruct12BytesHomogeneousFloatx6("
17498 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << "), ("
17499 << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << "), (" << a2.a0
17500 << ", " << a2.a1 << ", " << a2.a2 << "), (" << a3.a0 << ", "
17501 << a3.a1 << ", " << a3.a2 << "), (" << a4.a0 << ", " << a4.a1
17502 << ", " << a4.a2 << "), (" << a5.a0 << ", " << a5.a1 << ", "
17503 << a5.a2 << "))"
17504 << ")\n";
17505
17506 f(a0, a1, a2, a3, a4, a5);
17507}
17508
17509// Used for testing structs and unions by value.
17510// On Linux x64 argument is transferred on stack because it is over 16 bytes.
17511// Arguments in FPU registers on arm hardfp and arm64.
17512// 5 struct arguments will exhaust available registers.
17514 // NOLINTNEXTLINE(whitespace/parens)
17525
17526 a0.a0 = -1.0;
17527 a0.a1 = 2.0;
17528 a0.a2 = -3.0;
17529 a0.a3 = 4.0;
17530 a1.a0 = -5.0;
17531 a1.a1 = 6.0;
17532 a1.a2 = -7.0;
17533 a1.a3 = 8.0;
17534 a2.a0 = -9.0;
17535 a2.a1 = 10.0;
17536 a2.a2 = -11.0;
17537 a2.a3 = 12.0;
17538 a3.a0 = -13.0;
17539 a3.a1 = 14.0;
17540 a3.a2 = -15.0;
17541 a3.a3 = 16.0;
17542 a4.a0 = -17.0;
17543 a4.a1 = 18.0;
17544 a4.a2 = -19.0;
17545 a4.a3 = 20.0;
17546
17547 std::cout << "Calling TestAsyncPassStruct16BytesHomogeneousFloatx5("
17548 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
17549 << "), (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", "
17550 << a1.a3 << "), (" << a2.a0 << ", " << a2.a1 << ", " << a2.a2
17551 << ", " << a2.a3 << "), (" << a3.a0 << ", " << a3.a1 << ", "
17552 << a3.a2 << ", " << a3.a3 << "), (" << a4.a0 << ", " << a4.a1
17553 << ", " << a4.a2 << ", " << a4.a3 << "))"
17554 << ")\n";
17555
17556 f(a0, a1, a2, a3, a4);
17557}
17558
17559// Used for testing structs and unions by value.
17560// On x64, arguments are split over FP and int registers.
17561// On x64, it will exhaust the integer registers with the 6th argument.
17562// The rest goes on the stack.
17563// On arm, arguments are 8 byte aligned.
17565 // NOLINTNEXTLINE(whitespace/parens)
17566 void (*f)(Struct16BytesMixed a0,
17575 Struct16BytesMixed a9)) {
17576 Struct16BytesMixed a0 = {};
17577 Struct16BytesMixed a1 = {};
17578 Struct16BytesMixed a2 = {};
17579 Struct16BytesMixed a3 = {};
17580 Struct16BytesMixed a4 = {};
17581 Struct16BytesMixed a5 = {};
17582 Struct16BytesMixed a6 = {};
17583 Struct16BytesMixed a7 = {};
17584 Struct16BytesMixed a8 = {};
17585 Struct16BytesMixed a9 = {};
17586
17587 a0.a0 = -1.0;
17588 a0.a1 = 2;
17589 a1.a0 = -3.0;
17590 a1.a1 = 4;
17591 a2.a0 = -5.0;
17592 a2.a1 = 6;
17593 a3.a0 = -7.0;
17594 a3.a1 = 8;
17595 a4.a0 = -9.0;
17596 a4.a1 = 10;
17597 a5.a0 = -11.0;
17598 a5.a1 = 12;
17599 a6.a0 = -13.0;
17600 a6.a1 = 14;
17601 a7.a0 = -15.0;
17602 a7.a1 = 16;
17603 a8.a0 = -17.0;
17604 a8.a1 = 18;
17605 a9.a0 = -19.0;
17606 a9.a1 = 20;
17607
17608 std::cout << "Calling TestAsyncPassStruct16BytesMixedx10("
17609 << "((" << a0.a0 << ", " << a0.a1 << "), (" << a1.a0 << ", "
17610 << a1.a1 << "), (" << a2.a0 << ", " << a2.a1 << "), (" << a3.a0
17611 << ", " << a3.a1 << "), (" << a4.a0 << ", " << a4.a1 << "), ("
17612 << a5.a0 << ", " << a5.a1 << "), (" << a6.a0 << ", " << a6.a1
17613 << "), (" << a7.a0 << ", " << a7.a1 << "), (" << a8.a0 << ", "
17614 << a8.a1 << "), (" << a9.a0 << ", " << a9.a1 << "))"
17615 << ")\n";
17616
17617 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
17618}
17619
17620// Used for testing structs and unions by value.
17621// On x64, arguments are split over FP and int registers.
17622// On x64, it will exhaust the integer registers with the 6th argument.
17623// The rest goes on the stack.
17624// On arm, arguments are 4 byte aligned.
17626 // NOLINTNEXTLINE(whitespace/parens)
17627 void (*f)(Struct16BytesMixed2 a0,
17636 Struct16BytesMixed2 a9)) {
17637 Struct16BytesMixed2 a0 = {};
17638 Struct16BytesMixed2 a1 = {};
17639 Struct16BytesMixed2 a2 = {};
17640 Struct16BytesMixed2 a3 = {};
17641 Struct16BytesMixed2 a4 = {};
17642 Struct16BytesMixed2 a5 = {};
17643 Struct16BytesMixed2 a6 = {};
17644 Struct16BytesMixed2 a7 = {};
17645 Struct16BytesMixed2 a8 = {};
17646 Struct16BytesMixed2 a9 = {};
17647
17648 a0.a0 = -1.0;
17649 a0.a1 = 2.0;
17650 a0.a2 = -3.0;
17651 a0.a3 = 4;
17652 a1.a0 = -5.0;
17653 a1.a1 = 6.0;
17654 a1.a2 = -7.0;
17655 a1.a3 = 8;
17656 a2.a0 = -9.0;
17657 a2.a1 = 10.0;
17658 a2.a2 = -11.0;
17659 a2.a3 = 12;
17660 a3.a0 = -13.0;
17661 a3.a1 = 14.0;
17662 a3.a2 = -15.0;
17663 a3.a3 = 16;
17664 a4.a0 = -17.0;
17665 a4.a1 = 18.0;
17666 a4.a2 = -19.0;
17667 a4.a3 = 20;
17668 a5.a0 = -21.0;
17669 a5.a1 = 22.0;
17670 a5.a2 = -23.0;
17671 a5.a3 = 24;
17672 a6.a0 = -25.0;
17673 a6.a1 = 26.0;
17674 a6.a2 = -27.0;
17675 a6.a3 = 28;
17676 a7.a0 = -29.0;
17677 a7.a1 = 30.0;
17678 a7.a2 = -31.0;
17679 a7.a3 = 32;
17680 a8.a0 = -33.0;
17681 a8.a1 = 34.0;
17682 a8.a2 = -35.0;
17683 a8.a3 = 36;
17684 a9.a0 = -37.0;
17685 a9.a1 = 38.0;
17686 a9.a2 = -39.0;
17687 a9.a3 = 40;
17688
17689 std::cout << "Calling TestAsyncPassStruct16BytesMixed2x10("
17690 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
17691 << "), (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", "
17692 << a1.a3 << "), (" << a2.a0 << ", " << a2.a1 << ", " << a2.a2
17693 << ", " << a2.a3 << "), (" << a3.a0 << ", " << a3.a1 << ", "
17694 << a3.a2 << ", " << a3.a3 << "), (" << a4.a0 << ", " << a4.a1
17695 << ", " << a4.a2 << ", " << a4.a3 << "), (" << a5.a0 << ", "
17696 << a5.a1 << ", " << a5.a2 << ", " << a5.a3 << "), (" << a6.a0
17697 << ", " << a6.a1 << ", " << a6.a2 << ", " << a6.a3 << "), ("
17698 << a7.a0 << ", " << a7.a1 << ", " << a7.a2 << ", " << a7.a3
17699 << "), (" << a8.a0 << ", " << a8.a1 << ", " << a8.a2 << ", "
17700 << a8.a3 << "), (" << a9.a0 << ", " << a9.a1 << ", " << a9.a2
17701 << ", " << a9.a3 << "))"
17702 << ")\n";
17703
17704 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
17705}
17706
17707// Used for testing structs and unions by value.
17708// Arguments are passed as pointer to copy on arm64.
17709// Tests that the memory allocated for copies are rounded up to word size.
17711 // NOLINTNEXTLINE(whitespace/parens)
17712 void (*f)(Struct17BytesInt a0,
17721 Struct17BytesInt a9)) {
17722 Struct17BytesInt a0 = {};
17723 Struct17BytesInt a1 = {};
17724 Struct17BytesInt a2 = {};
17725 Struct17BytesInt a3 = {};
17726 Struct17BytesInt a4 = {};
17727 Struct17BytesInt a5 = {};
17728 Struct17BytesInt a6 = {};
17729 Struct17BytesInt a7 = {};
17730 Struct17BytesInt a8 = {};
17731 Struct17BytesInt a9 = {};
17732
17733 a0.a0 = -1;
17734 a0.a1 = 2;
17735 a0.a2 = -3;
17736 a1.a0 = 4;
17737 a1.a1 = -5;
17738 a1.a2 = 6;
17739 a2.a0 = -7;
17740 a2.a1 = 8;
17741 a2.a2 = -9;
17742 a3.a0 = 10;
17743 a3.a1 = -11;
17744 a3.a2 = 12;
17745 a4.a0 = -13;
17746 a4.a1 = 14;
17747 a4.a2 = -15;
17748 a5.a0 = 16;
17749 a5.a1 = -17;
17750 a5.a2 = 18;
17751 a6.a0 = -19;
17752 a6.a1 = 20;
17753 a6.a2 = -21;
17754 a7.a0 = 22;
17755 a7.a1 = -23;
17756 a7.a2 = 24;
17757 a8.a0 = -25;
17758 a8.a1 = 26;
17759 a8.a2 = -27;
17760 a9.a0 = 28;
17761 a9.a1 = -29;
17762 a9.a2 = 30;
17763
17764 std::cout << "Calling TestAsyncPassStruct17BytesIntx10("
17765 << "((" << a0.a0 << ", " << a0.a1 << ", " << static_cast<int>(a0.a2)
17766 << "), (" << a1.a0 << ", " << a1.a1 << ", "
17767 << static_cast<int>(a1.a2) << "), (" << a2.a0 << ", " << a2.a1
17768 << ", " << static_cast<int>(a2.a2) << "), (" << a3.a0 << ", "
17769 << a3.a1 << ", " << static_cast<int>(a3.a2) << "), (" << a4.a0
17770 << ", " << a4.a1 << ", " << static_cast<int>(a4.a2) << "), ("
17771 << a5.a0 << ", " << a5.a1 << ", " << static_cast<int>(a5.a2)
17772 << "), (" << a6.a0 << ", " << a6.a1 << ", "
17773 << static_cast<int>(a6.a2) << "), (" << a7.a0 << ", " << a7.a1
17774 << ", " << static_cast<int>(a7.a2) << "), (" << a8.a0 << ", "
17775 << a8.a1 << ", " << static_cast<int>(a8.a2) << "), (" << a9.a0
17776 << ", " << a9.a1 << ", " << static_cast<int>(a9.a2) << "))"
17777 << ")\n";
17778
17779 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
17780}
17781
17782// Used for testing structs and unions by value.
17783// The minimum alignment of this struct is only 1 byte based on its fields.
17784// Test that the memory backing these structs is extended to the right size.
17785//
17787 // NOLINTNEXTLINE(whitespace/parens)
17808
17809 a0.a0 = 1;
17810 a0.a1 = 2;
17811 a0.a2 = 3;
17812 a0.a3 = 4;
17813 a0.a4 = 5;
17814 a0.a5 = 6;
17815 a0.a6 = 7;
17816 a0.a7 = 8;
17817 a0.a8 = 9;
17818 a0.a9 = 10;
17819 a0.a10 = 11;
17820 a0.a11 = 12;
17821 a0.a12 = 13;
17822 a0.a13 = 14;
17823 a0.a14 = 15;
17824 a0.a15 = 16;
17825 a0.a16 = 17;
17826 a0.a17 = 18;
17827 a0.a18 = 19;
17828 a1.a0 = 20;
17829 a1.a1 = 21;
17830 a1.a2 = 22;
17831 a1.a3 = 23;
17832 a1.a4 = 24;
17833 a1.a5 = 25;
17834 a1.a6 = 26;
17835 a1.a7 = 27;
17836 a1.a8 = 28;
17837 a1.a9 = 29;
17838 a1.a10 = 30;
17839 a1.a11 = 31;
17840 a1.a12 = 32;
17841 a1.a13 = 33;
17842 a1.a14 = 34;
17843 a1.a15 = 35;
17844 a1.a16 = 36;
17845 a1.a17 = 37;
17846 a1.a18 = 38;
17847 a2.a0 = 39;
17848 a2.a1 = 40;
17849 a2.a2 = 41;
17850 a2.a3 = 42;
17851 a2.a4 = 43;
17852 a2.a5 = 44;
17853 a2.a6 = 45;
17854 a2.a7 = 46;
17855 a2.a8 = 47;
17856 a2.a9 = 48;
17857 a2.a10 = 49;
17858 a2.a11 = 50;
17859 a2.a12 = 51;
17860 a2.a13 = 52;
17861 a2.a14 = 53;
17862 a2.a15 = 54;
17863 a2.a16 = 55;
17864 a2.a17 = 56;
17865 a2.a18 = 57;
17866 a3.a0 = 58;
17867 a3.a1 = 59;
17868 a3.a2 = 60;
17869 a3.a3 = 61;
17870 a3.a4 = 62;
17871 a3.a5 = 63;
17872 a3.a6 = 64;
17873 a3.a7 = 65;
17874 a3.a8 = 66;
17875 a3.a9 = 67;
17876 a3.a10 = 68;
17877 a3.a11 = 69;
17878 a3.a12 = 70;
17879 a3.a13 = 71;
17880 a3.a14 = 72;
17881 a3.a15 = 73;
17882 a3.a16 = 74;
17883 a3.a17 = 75;
17884 a3.a18 = 76;
17885 a4.a0 = 77;
17886 a4.a1 = 78;
17887 a4.a2 = 79;
17888 a4.a3 = 80;
17889 a4.a4 = 81;
17890 a4.a5 = 82;
17891 a4.a6 = 83;
17892 a4.a7 = 84;
17893 a4.a8 = 85;
17894 a4.a9 = 86;
17895 a4.a10 = 87;
17896 a4.a11 = 88;
17897 a4.a12 = 89;
17898 a4.a13 = 90;
17899 a4.a14 = 91;
17900 a4.a15 = 92;
17901 a4.a16 = 93;
17902 a4.a17 = 94;
17903 a4.a18 = 95;
17904 a5.a0 = 96;
17905 a5.a1 = 97;
17906 a5.a2 = 98;
17907 a5.a3 = 99;
17908 a5.a4 = 100;
17909 a5.a5 = 101;
17910 a5.a6 = 102;
17911 a5.a7 = 103;
17912 a5.a8 = 104;
17913 a5.a9 = 105;
17914 a5.a10 = 106;
17915 a5.a11 = 107;
17916 a5.a12 = 108;
17917 a5.a13 = 109;
17918 a5.a14 = 110;
17919 a5.a15 = 111;
17920 a5.a16 = 112;
17921 a5.a17 = 113;
17922 a5.a18 = 114;
17923 a6.a0 = 115;
17924 a6.a1 = 116;
17925 a6.a2 = 117;
17926 a6.a3 = 118;
17927 a6.a4 = 119;
17928 a6.a5 = 120;
17929 a6.a6 = 121;
17930 a6.a7 = 122;
17931 a6.a8 = 123;
17932 a6.a9 = 124;
17933 a6.a10 = 125;
17934 a6.a11 = 126;
17935 a6.a12 = 127;
17936 a6.a13 = 128;
17937 a6.a14 = 129;
17938 a6.a15 = 130;
17939 a6.a16 = 131;
17940 a6.a17 = 132;
17941 a6.a18 = 133;
17942 a7.a0 = 134;
17943 a7.a1 = 135;
17944 a7.a2 = 136;
17945 a7.a3 = 137;
17946 a7.a4 = 138;
17947 a7.a5 = 139;
17948 a7.a6 = 140;
17949 a7.a7 = 141;
17950 a7.a8 = 142;
17951 a7.a9 = 143;
17952 a7.a10 = 144;
17953 a7.a11 = 145;
17954 a7.a12 = 146;
17955 a7.a13 = 147;
17956 a7.a14 = 148;
17957 a7.a15 = 149;
17958 a7.a16 = 150;
17959 a7.a17 = 151;
17960 a7.a18 = 152;
17961 a8.a0 = 153;
17962 a8.a1 = 154;
17963 a8.a2 = 155;
17964 a8.a3 = 156;
17965 a8.a4 = 157;
17966 a8.a5 = 158;
17967 a8.a6 = 159;
17968 a8.a7 = 160;
17969 a8.a8 = 161;
17970 a8.a9 = 162;
17971 a8.a10 = 163;
17972 a8.a11 = 164;
17973 a8.a12 = 165;
17974 a8.a13 = 166;
17975 a8.a14 = 167;
17976 a8.a15 = 168;
17977 a8.a16 = 169;
17978 a8.a17 = 170;
17979 a8.a18 = 171;
17980 a9.a0 = 172;
17981 a9.a1 = 173;
17982 a9.a2 = 174;
17983 a9.a3 = 175;
17984 a9.a4 = 176;
17985 a9.a5 = 177;
17986 a9.a6 = 178;
17987 a9.a7 = 179;
17988 a9.a8 = 180;
17989 a9.a9 = 181;
17990 a9.a10 = 182;
17991 a9.a11 = 183;
17992 a9.a12 = 184;
17993 a9.a13 = 185;
17994 a9.a14 = 186;
17995 a9.a15 = 187;
17996 a9.a16 = 188;
17997 a9.a17 = 189;
17998 a9.a18 = 190;
17999
18000 std::cout
18001 << "Calling TestAsyncPassStruct19BytesHomogeneousUint8x10("
18002 << "((" << static_cast<int>(a0.a0) << ", " << static_cast<int>(a0.a1)
18003 << ", " << static_cast<int>(a0.a2) << ", " << static_cast<int>(a0.a3)
18004 << ", " << static_cast<int>(a0.a4) << ", " << static_cast<int>(a0.a5)
18005 << ", " << static_cast<int>(a0.a6) << ", " << static_cast<int>(a0.a7)
18006 << ", " << static_cast<int>(a0.a8) << ", " << static_cast<int>(a0.a9)
18007 << ", " << static_cast<int>(a0.a10) << ", " << static_cast<int>(a0.a11)
18008 << ", " << static_cast<int>(a0.a12) << ", " << static_cast<int>(a0.a13)
18009 << ", " << static_cast<int>(a0.a14) << ", " << static_cast<int>(a0.a15)
18010 << ", " << static_cast<int>(a0.a16) << ", " << static_cast<int>(a0.a17)
18011 << ", " << static_cast<int>(a0.a18) << "), (" << static_cast<int>(a1.a0)
18012 << ", " << static_cast<int>(a1.a1) << ", " << static_cast<int>(a1.a2)
18013 << ", " << static_cast<int>(a1.a3) << ", " << static_cast<int>(a1.a4)
18014 << ", " << static_cast<int>(a1.a5) << ", " << static_cast<int>(a1.a6)
18015 << ", " << static_cast<int>(a1.a7) << ", " << static_cast<int>(a1.a8)
18016 << ", " << static_cast<int>(a1.a9) << ", " << static_cast<int>(a1.a10)
18017 << ", " << static_cast<int>(a1.a11) << ", " << static_cast<int>(a1.a12)
18018 << ", " << static_cast<int>(a1.a13) << ", " << static_cast<int>(a1.a14)
18019 << ", " << static_cast<int>(a1.a15) << ", " << static_cast<int>(a1.a16)
18020 << ", " << static_cast<int>(a1.a17) << ", " << static_cast<int>(a1.a18)
18021 << "), (" << static_cast<int>(a2.a0) << ", " << static_cast<int>(a2.a1)
18022 << ", " << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3)
18023 << ", " << static_cast<int>(a2.a4) << ", " << static_cast<int>(a2.a5)
18024 << ", " << static_cast<int>(a2.a6) << ", " << static_cast<int>(a2.a7)
18025 << ", " << static_cast<int>(a2.a8) << ", " << static_cast<int>(a2.a9)
18026 << ", " << static_cast<int>(a2.a10) << ", " << static_cast<int>(a2.a11)
18027 << ", " << static_cast<int>(a2.a12) << ", " << static_cast<int>(a2.a13)
18028 << ", " << static_cast<int>(a2.a14) << ", " << static_cast<int>(a2.a15)
18029 << ", " << static_cast<int>(a2.a16) << ", " << static_cast<int>(a2.a17)
18030 << ", " << static_cast<int>(a2.a18) << "), (" << static_cast<int>(a3.a0)
18031 << ", " << static_cast<int>(a3.a1) << ", " << static_cast<int>(a3.a2)
18032 << ", " << static_cast<int>(a3.a3) << ", " << static_cast<int>(a3.a4)
18033 << ", " << static_cast<int>(a3.a5) << ", " << static_cast<int>(a3.a6)
18034 << ", " << static_cast<int>(a3.a7) << ", " << static_cast<int>(a3.a8)
18035 << ", " << static_cast<int>(a3.a9) << ", " << static_cast<int>(a3.a10)
18036 << ", " << static_cast<int>(a3.a11) << ", " << static_cast<int>(a3.a12)
18037 << ", " << static_cast<int>(a3.a13) << ", " << static_cast<int>(a3.a14)
18038 << ", " << static_cast<int>(a3.a15) << ", " << static_cast<int>(a3.a16)
18039 << ", " << static_cast<int>(a3.a17) << ", " << static_cast<int>(a3.a18)
18040 << "), (" << static_cast<int>(a4.a0) << ", " << static_cast<int>(a4.a1)
18041 << ", " << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3)
18042 << ", " << static_cast<int>(a4.a4) << ", " << static_cast<int>(a4.a5)
18043 << ", " << static_cast<int>(a4.a6) << ", " << static_cast<int>(a4.a7)
18044 << ", " << static_cast<int>(a4.a8) << ", " << static_cast<int>(a4.a9)
18045 << ", " << static_cast<int>(a4.a10) << ", " << static_cast<int>(a4.a11)
18046 << ", " << static_cast<int>(a4.a12) << ", " << static_cast<int>(a4.a13)
18047 << ", " << static_cast<int>(a4.a14) << ", " << static_cast<int>(a4.a15)
18048 << ", " << static_cast<int>(a4.a16) << ", " << static_cast<int>(a4.a17)
18049 << ", " << static_cast<int>(a4.a18) << "), (" << static_cast<int>(a5.a0)
18050 << ", " << static_cast<int>(a5.a1) << ", " << static_cast<int>(a5.a2)
18051 << ", " << static_cast<int>(a5.a3) << ", " << static_cast<int>(a5.a4)
18052 << ", " << static_cast<int>(a5.a5) << ", " << static_cast<int>(a5.a6)
18053 << ", " << static_cast<int>(a5.a7) << ", " << static_cast<int>(a5.a8)
18054 << ", " << static_cast<int>(a5.a9) << ", " << static_cast<int>(a5.a10)
18055 << ", " << static_cast<int>(a5.a11) << ", " << static_cast<int>(a5.a12)
18056 << ", " << static_cast<int>(a5.a13) << ", " << static_cast<int>(a5.a14)
18057 << ", " << static_cast<int>(a5.a15) << ", " << static_cast<int>(a5.a16)
18058 << ", " << static_cast<int>(a5.a17) << ", " << static_cast<int>(a5.a18)
18059 << "), (" << static_cast<int>(a6.a0) << ", " << static_cast<int>(a6.a1)
18060 << ", " << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3)
18061 << ", " << static_cast<int>(a6.a4) << ", " << static_cast<int>(a6.a5)
18062 << ", " << static_cast<int>(a6.a6) << ", " << static_cast<int>(a6.a7)
18063 << ", " << static_cast<int>(a6.a8) << ", " << static_cast<int>(a6.a9)
18064 << ", " << static_cast<int>(a6.a10) << ", " << static_cast<int>(a6.a11)
18065 << ", " << static_cast<int>(a6.a12) << ", " << static_cast<int>(a6.a13)
18066 << ", " << static_cast<int>(a6.a14) << ", " << static_cast<int>(a6.a15)
18067 << ", " << static_cast<int>(a6.a16) << ", " << static_cast<int>(a6.a17)
18068 << ", " << static_cast<int>(a6.a18) << "), (" << static_cast<int>(a7.a0)
18069 << ", " << static_cast<int>(a7.a1) << ", " << static_cast<int>(a7.a2)
18070 << ", " << static_cast<int>(a7.a3) << ", " << static_cast<int>(a7.a4)
18071 << ", " << static_cast<int>(a7.a5) << ", " << static_cast<int>(a7.a6)
18072 << ", " << static_cast<int>(a7.a7) << ", " << static_cast<int>(a7.a8)
18073 << ", " << static_cast<int>(a7.a9) << ", " << static_cast<int>(a7.a10)
18074 << ", " << static_cast<int>(a7.a11) << ", " << static_cast<int>(a7.a12)
18075 << ", " << static_cast<int>(a7.a13) << ", " << static_cast<int>(a7.a14)
18076 << ", " << static_cast<int>(a7.a15) << ", " << static_cast<int>(a7.a16)
18077 << ", " << static_cast<int>(a7.a17) << ", " << static_cast<int>(a7.a18)
18078 << "), (" << static_cast<int>(a8.a0) << ", " << static_cast<int>(a8.a1)
18079 << ", " << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3)
18080 << ", " << static_cast<int>(a8.a4) << ", " << static_cast<int>(a8.a5)
18081 << ", " << static_cast<int>(a8.a6) << ", " << static_cast<int>(a8.a7)
18082 << ", " << static_cast<int>(a8.a8) << ", " << static_cast<int>(a8.a9)
18083 << ", " << static_cast<int>(a8.a10) << ", " << static_cast<int>(a8.a11)
18084 << ", " << static_cast<int>(a8.a12) << ", " << static_cast<int>(a8.a13)
18085 << ", " << static_cast<int>(a8.a14) << ", " << static_cast<int>(a8.a15)
18086 << ", " << static_cast<int>(a8.a16) << ", " << static_cast<int>(a8.a17)
18087 << ", " << static_cast<int>(a8.a18) << "), (" << static_cast<int>(a9.a0)
18088 << ", " << static_cast<int>(a9.a1) << ", " << static_cast<int>(a9.a2)
18089 << ", " << static_cast<int>(a9.a3) << ", " << static_cast<int>(a9.a4)
18090 << ", " << static_cast<int>(a9.a5) << ", " << static_cast<int>(a9.a6)
18091 << ", " << static_cast<int>(a9.a7) << ", " << static_cast<int>(a9.a8)
18092 << ", " << static_cast<int>(a9.a9) << ", " << static_cast<int>(a9.a10)
18093 << ", " << static_cast<int>(a9.a11) << ", " << static_cast<int>(a9.a12)
18094 << ", " << static_cast<int>(a9.a13) << ", " << static_cast<int>(a9.a14)
18095 << ", " << static_cast<int>(a9.a15) << ", " << static_cast<int>(a9.a16)
18096 << ", " << static_cast<int>(a9.a17) << ", " << static_cast<int>(a9.a18)
18097 << "))"
18098 << ")\n";
18099
18100 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
18101}
18102
18103// Used for testing structs and unions by value.
18104// Argument too big to go into integer registers on arm64.
18105// The arguments are passed as pointers to copies.
18106// The amount of arguments exhausts the number of integer registers, such that
18107// pointers to copies are also passed on the stack.
18109 // NOLINTNEXTLINE(whitespace/parens)
18130
18131 a0.a0 = -1;
18132 a0.a1 = 2;
18133 a0.a2 = -3;
18134 a0.a3 = 4;
18135 a0.a4 = -5;
18136 a1.a0 = 6;
18137 a1.a1 = -7;
18138 a1.a2 = 8;
18139 a1.a3 = -9;
18140 a1.a4 = 10;
18141 a2.a0 = -11;
18142 a2.a1 = 12;
18143 a2.a2 = -13;
18144 a2.a3 = 14;
18145 a2.a4 = -15;
18146 a3.a0 = 16;
18147 a3.a1 = -17;
18148 a3.a2 = 18;
18149 a3.a3 = -19;
18150 a3.a4 = 20;
18151 a4.a0 = -21;
18152 a4.a1 = 22;
18153 a4.a2 = -23;
18154 a4.a3 = 24;
18155 a4.a4 = -25;
18156 a5.a0 = 26;
18157 a5.a1 = -27;
18158 a5.a2 = 28;
18159 a5.a3 = -29;
18160 a5.a4 = 30;
18161 a6.a0 = -31;
18162 a6.a1 = 32;
18163 a6.a2 = -33;
18164 a6.a3 = 34;
18165 a6.a4 = -35;
18166 a7.a0 = 36;
18167 a7.a1 = -37;
18168 a7.a2 = 38;
18169 a7.a3 = -39;
18170 a7.a4 = 40;
18171 a8.a0 = -41;
18172 a8.a1 = 42;
18173 a8.a2 = -43;
18174 a8.a3 = 44;
18175 a8.a4 = -45;
18176 a9.a0 = 46;
18177 a9.a1 = -47;
18178 a9.a2 = 48;
18179 a9.a3 = -49;
18180 a9.a4 = 50;
18181
18182 std::cout << "Calling TestAsyncPassStruct20BytesHomogeneousInt32x10("
18183 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
18184 << ", " << a0.a4 << "), (" << a1.a0 << ", " << a1.a1 << ", "
18185 << a1.a2 << ", " << a1.a3 << ", " << a1.a4 << "), (" << a2.a0
18186 << ", " << a2.a1 << ", " << a2.a2 << ", " << a2.a3 << ", " << a2.a4
18187 << "), (" << a3.a0 << ", " << a3.a1 << ", " << a3.a2 << ", "
18188 << a3.a3 << ", " << a3.a4 << "), (" << a4.a0 << ", " << a4.a1
18189 << ", " << a4.a2 << ", " << a4.a3 << ", " << a4.a4 << "), ("
18190 << a5.a0 << ", " << a5.a1 << ", " << a5.a2 << ", " << a5.a3 << ", "
18191 << a5.a4 << "), (" << a6.a0 << ", " << a6.a1 << ", " << a6.a2
18192 << ", " << a6.a3 << ", " << a6.a4 << "), (" << a7.a0 << ", "
18193 << a7.a1 << ", " << a7.a2 << ", " << a7.a3 << ", " << a7.a4
18194 << "), (" << a8.a0 << ", " << a8.a1 << ", " << a8.a2 << ", "
18195 << a8.a3 << ", " << a8.a4 << "), (" << a9.a0 << ", " << a9.a1
18196 << ", " << a9.a2 << ", " << a9.a3 << ", " << a9.a4 << "))"
18197 << ")\n";
18198
18199 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
18200}
18201
18202// Used for testing structs and unions by value.
18203// Argument too big to go into FPU registers in hardfp and arm64.
18205 // NOLINTNEXTLINE(whitespace/parens)
18206 void (*f)(Struct20BytesHomogeneousFloat a0)) {
18208
18209 a0.a0 = -1.0;
18210 a0.a1 = 2.0;
18211 a0.a2 = -3.0;
18212 a0.a3 = 4.0;
18213 a0.a4 = -5.0;
18214
18215 std::cout << "Calling TestAsyncPassStruct20BytesHomogeneousFloat("
18216 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
18217 << ", " << a0.a4 << "))"
18218 << ")\n";
18219
18220 f(a0);
18221}
18222
18223// Used for testing structs and unions by value.
18224// Arguments in FPU registers on arm64.
18225// 5 struct arguments will exhaust available registers.
18227 // NOLINTNEXTLINE(whitespace/parens)
18238
18239 a0.a0 = -1.0;
18240 a0.a1 = 2.0;
18241 a0.a2 = -3.0;
18242 a0.a3 = 4.0;
18243 a1.a0 = -5.0;
18244 a1.a1 = 6.0;
18245 a1.a2 = -7.0;
18246 a1.a3 = 8.0;
18247 a2.a0 = -9.0;
18248 a2.a1 = 10.0;
18249 a2.a2 = -11.0;
18250 a2.a3 = 12.0;
18251 a3.a0 = -13.0;
18252 a3.a1 = 14.0;
18253 a3.a2 = -15.0;
18254 a3.a3 = 16.0;
18255 a4.a0 = -17.0;
18256 a4.a1 = 18.0;
18257 a4.a2 = -19.0;
18258 a4.a3 = 20.0;
18259
18260 std::cout << "Calling TestAsyncPassStruct32BytesHomogeneousDoublex5("
18261 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
18262 << "), (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", "
18263 << a1.a3 << "), (" << a2.a0 << ", " << a2.a1 << ", " << a2.a2
18264 << ", " << a2.a3 << "), (" << a3.a0 << ", " << a3.a1 << ", "
18265 << a3.a2 << ", " << a3.a3 << "), (" << a4.a0 << ", " << a4.a1
18266 << ", " << a4.a2 << ", " << a4.a3 << "))"
18267 << ")\n";
18268
18269 f(a0, a1, a2, a3, a4);
18270}
18271
18272// Used for testing structs and unions by value.
18273// Argument too big to go into FPU registers in arm64.
18275 // NOLINTNEXTLINE(whitespace/parens)
18276 void (*f)(Struct40BytesHomogeneousDouble a0)) {
18278
18279 a0.a0 = -1.0;
18280 a0.a1 = 2.0;
18281 a0.a2 = -3.0;
18282 a0.a3 = 4.0;
18283 a0.a4 = -5.0;
18284
18285 std::cout << "Calling TestAsyncPassStruct40BytesHomogeneousDouble("
18286 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
18287 << ", " << a0.a4 << "))"
18288 << ")\n";
18289
18290 f(a0);
18291}
18292
18293// Used for testing structs and unions by value.
18294// Test 1kb struct.
18296 // NOLINTNEXTLINE(whitespace/parens)
18297 void (*f)(Struct1024BytesHomogeneousUint64 a0)) {
18299
18300 a0.a0 = 1;
18301 a0.a1 = 2;
18302 a0.a2 = 3;
18303 a0.a3 = 4;
18304 a0.a4 = 5;
18305 a0.a5 = 6;
18306 a0.a6 = 7;
18307 a0.a7 = 8;
18308 a0.a8 = 9;
18309 a0.a9 = 10;
18310 a0.a10 = 11;
18311 a0.a11 = 12;
18312 a0.a12 = 13;
18313 a0.a13 = 14;
18314 a0.a14 = 15;
18315 a0.a15 = 16;
18316 a0.a16 = 17;
18317 a0.a17 = 18;
18318 a0.a18 = 19;
18319 a0.a19 = 20;
18320 a0.a20 = 21;
18321 a0.a21 = 22;
18322 a0.a22 = 23;
18323 a0.a23 = 24;
18324 a0.a24 = 25;
18325 a0.a25 = 26;
18326 a0.a26 = 27;
18327 a0.a27 = 28;
18328 a0.a28 = 29;
18329 a0.a29 = 30;
18330 a0.a30 = 31;
18331 a0.a31 = 32;
18332 a0.a32 = 33;
18333 a0.a33 = 34;
18334 a0.a34 = 35;
18335 a0.a35 = 36;
18336 a0.a36 = 37;
18337 a0.a37 = 38;
18338 a0.a38 = 39;
18339 a0.a39 = 40;
18340 a0.a40 = 41;
18341 a0.a41 = 42;
18342 a0.a42 = 43;
18343 a0.a43 = 44;
18344 a0.a44 = 45;
18345 a0.a45 = 46;
18346 a0.a46 = 47;
18347 a0.a47 = 48;
18348 a0.a48 = 49;
18349 a0.a49 = 50;
18350 a0.a50 = 51;
18351 a0.a51 = 52;
18352 a0.a52 = 53;
18353 a0.a53 = 54;
18354 a0.a54 = 55;
18355 a0.a55 = 56;
18356 a0.a56 = 57;
18357 a0.a57 = 58;
18358 a0.a58 = 59;
18359 a0.a59 = 60;
18360 a0.a60 = 61;
18361 a0.a61 = 62;
18362 a0.a62 = 63;
18363 a0.a63 = 64;
18364 a0.a64 = 65;
18365 a0.a65 = 66;
18366 a0.a66 = 67;
18367 a0.a67 = 68;
18368 a0.a68 = 69;
18369 a0.a69 = 70;
18370 a0.a70 = 71;
18371 a0.a71 = 72;
18372 a0.a72 = 73;
18373 a0.a73 = 74;
18374 a0.a74 = 75;
18375 a0.a75 = 76;
18376 a0.a76 = 77;
18377 a0.a77 = 78;
18378 a0.a78 = 79;
18379 a0.a79 = 80;
18380 a0.a80 = 81;
18381 a0.a81 = 82;
18382 a0.a82 = 83;
18383 a0.a83 = 84;
18384 a0.a84 = 85;
18385 a0.a85 = 86;
18386 a0.a86 = 87;
18387 a0.a87 = 88;
18388 a0.a88 = 89;
18389 a0.a89 = 90;
18390 a0.a90 = 91;
18391 a0.a91 = 92;
18392 a0.a92 = 93;
18393 a0.a93 = 94;
18394 a0.a94 = 95;
18395 a0.a95 = 96;
18396 a0.a96 = 97;
18397 a0.a97 = 98;
18398 a0.a98 = 99;
18399 a0.a99 = 100;
18400 a0.a100 = 101;
18401 a0.a101 = 102;
18402 a0.a102 = 103;
18403 a0.a103 = 104;
18404 a0.a104 = 105;
18405 a0.a105 = 106;
18406 a0.a106 = 107;
18407 a0.a107 = 108;
18408 a0.a108 = 109;
18409 a0.a109 = 110;
18410 a0.a110 = 111;
18411 a0.a111 = 112;
18412 a0.a112 = 113;
18413 a0.a113 = 114;
18414 a0.a114 = 115;
18415 a0.a115 = 116;
18416 a0.a116 = 117;
18417 a0.a117 = 118;
18418 a0.a118 = 119;
18419 a0.a119 = 120;
18420 a0.a120 = 121;
18421 a0.a121 = 122;
18422 a0.a122 = 123;
18423 a0.a123 = 124;
18424 a0.a124 = 125;
18425 a0.a125 = 126;
18426 a0.a126 = 127;
18427 a0.a127 = 128;
18428
18429 std::cout << "Calling TestAsyncPassStruct1024BytesHomogeneousUint64("
18430 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
18431 << ", " << a0.a4 << ", " << a0.a5 << ", " << a0.a6 << ", " << a0.a7
18432 << ", " << a0.a8 << ", " << a0.a9 << ", " << a0.a10 << ", "
18433 << a0.a11 << ", " << a0.a12 << ", " << a0.a13 << ", " << a0.a14
18434 << ", " << a0.a15 << ", " << a0.a16 << ", " << a0.a17 << ", "
18435 << a0.a18 << ", " << a0.a19 << ", " << a0.a20 << ", " << a0.a21
18436 << ", " << a0.a22 << ", " << a0.a23 << ", " << a0.a24 << ", "
18437 << a0.a25 << ", " << a0.a26 << ", " << a0.a27 << ", " << a0.a28
18438 << ", " << a0.a29 << ", " << a0.a30 << ", " << a0.a31 << ", "
18439 << a0.a32 << ", " << a0.a33 << ", " << a0.a34 << ", " << a0.a35
18440 << ", " << a0.a36 << ", " << a0.a37 << ", " << a0.a38 << ", "
18441 << a0.a39 << ", " << a0.a40 << ", " << a0.a41 << ", " << a0.a42
18442 << ", " << a0.a43 << ", " << a0.a44 << ", " << a0.a45 << ", "
18443 << a0.a46 << ", " << a0.a47 << ", " << a0.a48 << ", " << a0.a49
18444 << ", " << a0.a50 << ", " << a0.a51 << ", " << a0.a52 << ", "
18445 << a0.a53 << ", " << a0.a54 << ", " << a0.a55 << ", " << a0.a56
18446 << ", " << a0.a57 << ", " << a0.a58 << ", " << a0.a59 << ", "
18447 << a0.a60 << ", " << a0.a61 << ", " << a0.a62 << ", " << a0.a63
18448 << ", " << a0.a64 << ", " << a0.a65 << ", " << a0.a66 << ", "
18449 << a0.a67 << ", " << a0.a68 << ", " << a0.a69 << ", " << a0.a70
18450 << ", " << a0.a71 << ", " << a0.a72 << ", " << a0.a73 << ", "
18451 << a0.a74 << ", " << a0.a75 << ", " << a0.a76 << ", " << a0.a77
18452 << ", " << a0.a78 << ", " << a0.a79 << ", " << a0.a80 << ", "
18453 << a0.a81 << ", " << a0.a82 << ", " << a0.a83 << ", " << a0.a84
18454 << ", " << a0.a85 << ", " << a0.a86 << ", " << a0.a87 << ", "
18455 << a0.a88 << ", " << a0.a89 << ", " << a0.a90 << ", " << a0.a91
18456 << ", " << a0.a92 << ", " << a0.a93 << ", " << a0.a94 << ", "
18457 << a0.a95 << ", " << a0.a96 << ", " << a0.a97 << ", " << a0.a98
18458 << ", " << a0.a99 << ", " << a0.a100 << ", " << a0.a101 << ", "
18459 << a0.a102 << ", " << a0.a103 << ", " << a0.a104 << ", " << a0.a105
18460 << ", " << a0.a106 << ", " << a0.a107 << ", " << a0.a108 << ", "
18461 << a0.a109 << ", " << a0.a110 << ", " << a0.a111 << ", " << a0.a112
18462 << ", " << a0.a113 << ", " << a0.a114 << ", " << a0.a115 << ", "
18463 << a0.a116 << ", " << a0.a117 << ", " << a0.a118 << ", " << a0.a119
18464 << ", " << a0.a120 << ", " << a0.a121 << ", " << a0.a122 << ", "
18465 << a0.a123 << ", " << a0.a124 << ", " << a0.a125 << ", " << a0.a126
18466 << ", " << a0.a127 << "))"
18467 << ")\n";
18468
18469 f(a0);
18470}
18471
18472// Used for testing structs and unions by value.
18473// Tests the alignment of structs in FPU registers and backfilling.
18475 // NOLINTNEXTLINE(whitespace/parens)
18476 void (*f)(float a0,
18478 float a2,
18480 float a4,
18482 float a6,
18484 float a8)) {
18485 float a0;
18487 float a2;
18489 float a4;
18491 float a6;
18493 float a8;
18494
18495 a0 = -1.0;
18496 a1.a0 = 2.0;
18497 a1.a1 = -3.0;
18498 a1.a2 = 4.0;
18499 a1.a3 = -5.0;
18500 a2 = 6.0;
18501 a3.a0 = -7.0;
18502 a3.a1 = 8.0;
18503 a3.a2 = -9.0;
18504 a3.a3 = 10.0;
18505 a4 = -11.0;
18506 a5.a0 = 12.0;
18507 a5.a1 = -13.0;
18508 a5.a2 = 14.0;
18509 a5.a3 = -15.0;
18510 a6 = 16.0;
18511 a7.a0 = -17.0;
18512 a7.a1 = 18.0;
18513 a7.a2 = -19.0;
18514 a7.a3 = 20.0;
18515 a8 = -21.0;
18516
18517 std::cout
18518 << "Calling TestAsyncPassFloatStruct16BytesHomogeneousFloatFloatStruct1("
18519 << "(" << a0 << ", (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", "
18520 << a1.a3 << "), " << a2 << ", (" << a3.a0 << ", " << a3.a1 << ", "
18521 << a3.a2 << ", " << a3.a3 << "), " << a4 << ", (" << a5.a0 << ", "
18522 << a5.a1 << ", " << a5.a2 << ", " << a5.a3 << "), " << a6 << ", ("
18523 << a7.a0 << ", " << a7.a1 << ", " << a7.a2 << ", " << a7.a3 << "), " << a8
18524 << ")"
18525 << ")\n";
18526
18527 f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
18528}
18529
18530// Used for testing structs and unions by value.
18531// Tests the alignment of structs in FPU registers and backfilling.
18533 // NOLINTNEXTLINE(whitespace/parens)
18534 void (*f)(float a0,
18536 float a2,
18538 float a4,
18540 float a6,
18542 float a8)) {
18543 float a0;
18545 float a2;
18547 float a4;
18549 float a6;
18551 float a8;
18552
18553 a0 = -1.0;
18554 a1.a0 = 2.0;
18555 a1.a1 = -3.0;
18556 a1.a2 = 4.0;
18557 a1.a3 = -5.0;
18558 a2 = 6.0;
18559 a3.a0 = -7.0;
18560 a3.a1 = 8.0;
18561 a3.a2 = -9.0;
18562 a3.a3 = 10.0;
18563 a4 = -11.0;
18564 a5.a0 = 12.0;
18565 a5.a1 = -13.0;
18566 a5.a2 = 14.0;
18567 a5.a3 = -15.0;
18568 a6 = 16.0;
18569 a7.a0 = -17.0;
18570 a7.a1 = 18.0;
18571 a7.a2 = -19.0;
18572 a7.a3 = 20.0;
18573 a8 = -21.0;
18574
18575 std::cout
18576 << "Calling TestAsyncPassFloatStruct32BytesHomogeneousDoubleFloatStruct("
18577 << "(" << a0 << ", (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", "
18578 << a1.a3 << "), " << a2 << ", (" << a3.a0 << ", " << a3.a1 << ", "
18579 << a3.a2 << ", " << a3.a3 << "), " << a4 << ", (" << a5.a0 << ", "
18580 << a5.a1 << ", " << a5.a2 << ", " << a5.a3 << "), " << a6 << ", ("
18581 << a7.a0 << ", " << a7.a1 << ", " << a7.a2 << ", " << a7.a3 << "), " << a8
18582 << ")"
18583 << ")\n";
18584
18585 f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
18586}
18587
18588// Used for testing structs and unions by value.
18589// Tests the alignment of structs in integers registers and on the stack.
18590// Arm32 aligns this struct at 8.
18591// Also, arm32 allocates the second struct partially in registers, partially
18592// on stack.
18593// Test backfilling of integer registers.
18595 // NOLINTNEXTLINE(whitespace/parens)
18596 void (*f)(int8_t a0,
18598 int8_t a2,
18600 int8_t a4,
18602 int8_t a6,
18604 int8_t a8)) {
18605 int8_t a0;
18606 Struct16BytesMixed a1 = {};
18607 int8_t a2;
18608 Struct16BytesMixed a3 = {};
18609 int8_t a4;
18610 Struct16BytesMixed a5 = {};
18611 int8_t a6;
18612 Struct16BytesMixed a7 = {};
18613 int8_t a8;
18614
18615 a0 = -1;
18616 a1.a0 = 2.0;
18617 a1.a1 = -3;
18618 a2 = 4;
18619 a3.a0 = -5.0;
18620 a3.a1 = 6;
18621 a4 = -7;
18622 a5.a0 = 8.0;
18623 a5.a1 = -9;
18624 a6 = 10;
18625 a7.a0 = -11.0;
18626 a7.a1 = 12;
18627 a8 = -13;
18628
18629 std::cout
18630 << "Calling TestAsyncPassInt8Struct16BytesMixedInt8Struct16BytesMixedIn("
18631 << "(" << static_cast<int>(a0) << ", (" << a1.a0 << ", " << a1.a1 << "), "
18632 << static_cast<int>(a2) << ", (" << a3.a0 << ", " << a3.a1 << "), "
18633 << static_cast<int>(a4) << ", (" << a5.a0 << ", " << a5.a1 << "), "
18634 << static_cast<int>(a6) << ", (" << a7.a0 << ", " << a7.a1 << "), "
18635 << static_cast<int>(a8) << ")"
18636 << ")\n";
18637
18638 f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
18639}
18640
18641// Used for testing structs and unions by value.
18642// On Linux x64, it will exhaust xmm registers first, after 6 doubles and 2
18643// structs. The rest of the structs will go on the stack.
18644// The int will be backfilled into the int register.
18646 // NOLINTNEXTLINE(whitespace/parens)
18647 void (*f)(double a0,
18648 double a1,
18649 double a2,
18650 double a3,
18651 double a4,
18652 double a5,
18657 int32_t a10)) {
18658 double a0;
18659 double a1;
18660 double a2;
18661 double a3;
18662 double a4;
18663 double a5;
18664 Struct16BytesMixed a6 = {};
18665 Struct16BytesMixed a7 = {};
18666 Struct16BytesMixed a8 = {};
18667 Struct16BytesMixed a9 = {};
18668 int32_t a10;
18669
18670 a0 = -1.0;
18671 a1 = 2.0;
18672 a2 = -3.0;
18673 a3 = 4.0;
18674 a4 = -5.0;
18675 a5 = 6.0;
18676 a6.a0 = -7.0;
18677 a6.a1 = 8;
18678 a7.a0 = -9.0;
18679 a7.a1 = 10;
18680 a8.a0 = -11.0;
18681 a8.a1 = 12;
18682 a9.a0 = -13.0;
18683 a9.a1 = 14;
18684 a10 = -15;
18685
18686 std::cout << "Calling TestAsyncPassDoublex6Struct16BytesMixedx4Int32("
18687 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
18688 << ", " << a5 << ", (" << a6.a0 << ", " << a6.a1 << "), (" << a7.a0
18689 << ", " << a7.a1 << "), (" << a8.a0 << ", " << a8.a1 << "), ("
18690 << a9.a0 << ", " << a9.a1 << "), " << a10 << ")"
18691 << ")\n";
18692
18693 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
18694}
18695
18696// Used for testing structs and unions by value.
18697// On Linux x64, it will exhaust int registers first.
18698// The rest of the structs will go on the stack.
18699// The double will be backfilled into the xmm register.
18701 // NOLINTNEXTLINE(whitespace/parens)
18702 void (*f)(int32_t a0,
18703 int32_t a1,
18704 int32_t a2,
18705 int32_t a3,
18710 double a8)) {
18711 int32_t a0;
18712 int32_t a1;
18713 int32_t a2;
18714 int32_t a3;
18715 Struct16BytesMixed a4 = {};
18716 Struct16BytesMixed a5 = {};
18717 Struct16BytesMixed a6 = {};
18718 Struct16BytesMixed a7 = {};
18719 double a8;
18720
18721 a0 = -1;
18722 a1 = 2;
18723 a2 = -3;
18724 a3 = 4;
18725 a4.a0 = -5.0;
18726 a4.a1 = 6;
18727 a5.a0 = -7.0;
18728 a5.a1 = 8;
18729 a6.a0 = -9.0;
18730 a6.a1 = 10;
18731 a7.a0 = -11.0;
18732 a7.a1 = 12;
18733 a8 = -13.0;
18734
18735 std::cout << "Calling TestAsyncPassInt32x4Struct16BytesMixedx4Double("
18736 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", ("
18737 << a4.a0 << ", " << a4.a1 << "), (" << a5.a0 << ", " << a5.a1
18738 << "), (" << a6.a0 << ", " << a6.a1 << "), (" << a7.a0 << ", "
18739 << a7.a1 << "), " << a8 << ")"
18740 << ")\n";
18741
18742 f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
18743}
18744
18745// Used for testing structs and unions by value.
18746// On various architectures, first struct is allocated on stack.
18747// Check that the other two arguments are allocated on registers.
18749 // NOLINTNEXTLINE(whitespace/parens)
18756
18757 a0.a0 = -1.0;
18758 a0.a1 = 2.0;
18759 a0.a2 = -3.0;
18760 a0.a3 = 4.0;
18761 a0.a4 = -5.0;
18762 a1.a0 = 6;
18763 a1.a1 = -7;
18764 a2.a0 = 8.0;
18765 a2.a1 = -9.0;
18766
18767 std::cout
18768 << "Calling TestAsyncPassStruct40BytesHomogeneousDoubleStruct4BytesHomo("
18769 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
18770 << ", " << a0.a4 << "), (" << a1.a0 << ", " << a1.a1 << "), (" << a2.a0
18771 << ", " << a2.a1 << "))"
18772 << ")\n";
18773
18774 f(a0, a1, a2);
18775}
18776
18777// Used for testing structs and unions by value.
18778// Test alignment and padding of 16 byte int within struct.
18780 // NOLINTNEXTLINE(whitespace/parens)
18781 void (*f)(int32_t a0,
18782 int32_t a1,
18783 int32_t a2,
18784 int32_t a3,
18785 int32_t a4,
18786 int32_t a5,
18787 int32_t a6,
18788 int32_t a7,
18789 double a8,
18790 double a9,
18791 double a10,
18792 double a11,
18793 double a12,
18794 double a13,
18795 double a14,
18796 double a15,
18797 int64_t a16,
18798 int8_t a17,
18799 Struct1ByteInt a18,
18800 int64_t a19,
18801 int8_t a20,
18803 int64_t a22,
18804 int8_t a23,
18805 Struct8BytesInt a24,
18806 int64_t a25,
18807 int8_t a26,
18809 int64_t a28,
18810 int8_t a29,
18812 int64_t a31,
18813 int8_t a32,
18815 int64_t a34,
18816 int8_t a35,
18818 int64_t a37,
18819 int8_t a38,
18820 StructAlignmentInt64 a39)) {
18821 int32_t a0;
18822 int32_t a1;
18823 int32_t a2;
18824 int32_t a3;
18825 int32_t a4;
18826 int32_t a5;
18827 int32_t a6;
18828 int32_t a7;
18829 double a8;
18830 double a9;
18831 double a10;
18832 double a11;
18833 double a12;
18834 double a13;
18835 double a14;
18836 double a15;
18837 int64_t a16;
18838 int8_t a17;
18839 Struct1ByteInt a18 = {};
18840 int64_t a19;
18841 int8_t a20;
18843 int64_t a22;
18844 int8_t a23;
18845 Struct8BytesInt a24 = {};
18846 int64_t a25;
18847 int8_t a26;
18849 int64_t a28;
18850 int8_t a29;
18851 Struct8BytesMixed a30 = {};
18852 int64_t a31;
18853 int8_t a32;
18854 StructAlignmentInt16 a33 = {};
18855 int64_t a34;
18856 int8_t a35;
18857 StructAlignmentInt32 a36 = {};
18858 int64_t a37;
18859 int8_t a38;
18860 StructAlignmentInt64 a39 = {};
18861
18862 a0 = -1;
18863 a1 = 2;
18864 a2 = -3;
18865 a3 = 4;
18866 a4 = -5;
18867 a5 = 6;
18868 a6 = -7;
18869 a7 = 8;
18870 a8 = -9.0;
18871 a9 = 10.0;
18872 a10 = -11.0;
18873 a11 = 12.0;
18874 a12 = -13.0;
18875 a13 = 14.0;
18876 a14 = -15.0;
18877 a15 = 16.0;
18878 a16 = -17;
18879 a17 = 18;
18880 a18.a0 = -19;
18881 a19 = 20;
18882 a20 = -21;
18883 a21.a0 = 22;
18884 a21.a1 = -23;
18885 a22 = 24;
18886 a23 = -25;
18887 a24.a0 = 26;
18888 a24.a1 = -27;
18889 a24.a2 = 28;
18890 a25 = -29;
18891 a26 = 30;
18892 a27.a0 = -31.0;
18893 a27.a1 = 32.0;
18894 a28 = -33;
18895 a29 = 34;
18896 a30.a0 = -35.0;
18897 a30.a1 = 36;
18898 a30.a2 = -37;
18899 a31 = 38;
18900 a32 = -39;
18901 a33.a0 = 40;
18902 a33.a1 = -41;
18903 a33.a2 = 42;
18904 a34 = -43;
18905 a35 = 44;
18906 a36.a0 = -45;
18907 a36.a1 = 46;
18908 a36.a2 = -47;
18909 a37 = 48;
18910 a38 = -49;
18911 a39.a0 = 50;
18912 a39.a1 = -51;
18913 a39.a2 = 52;
18914
18915 std::cout
18916 << "Calling TestAsyncPassInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int("
18917 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
18918 << ", " << a5 << ", " << a6 << ", " << a7 << ", " << a8 << ", " << a9
18919 << ", " << a10 << ", " << a11 << ", " << a12 << ", " << a13 << ", " << a14
18920 << ", " << a15 << ", " << a16 << ", " << static_cast<int>(a17) << ", ("
18921 << static_cast<int>(a18.a0) << "), " << a19 << ", "
18922 << static_cast<int>(a20) << ", (" << a21.a0 << ", " << a21.a1 << "), "
18923 << a22 << ", " << static_cast<int>(a23) << ", (" << a24.a0 << ", "
18924 << a24.a1 << ", " << a24.a2 << "), " << a25 << ", "
18925 << static_cast<int>(a26) << ", (" << a27.a0 << ", " << a27.a1 << "), "
18926 << a28 << ", " << static_cast<int>(a29) << ", (" << a30.a0 << ", "
18927 << a30.a1 << ", " << a30.a2 << "), " << a31 << ", "
18928 << static_cast<int>(a32) << ", (" << static_cast<int>(a33.a0) << ", "
18929 << a33.a1 << ", " << static_cast<int>(a33.a2) << "), " << a34 << ", "
18930 << static_cast<int>(a35) << ", (" << static_cast<int>(a36.a0) << ", "
18931 << a36.a1 << ", " << static_cast<int>(a36.a2) << "), " << a37 << ", "
18932 << static_cast<int>(a38) << ", (" << static_cast<int>(a39.a0) << ", "
18933 << a39.a1 << ", " << static_cast<int>(a39.a2) << "))"
18934 << ")\n";
18935
18936 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16,
18937 a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31,
18938 a32, a33, a34, a35, a36, a37, a38, a39);
18939}
18940
18941// Used for testing structs and unions by value.
18942// Test alignment and padding of 16 byte int within struct.
18944 // NOLINTNEXTLINE(whitespace/parens)
18945 void (*f)(StructAlignmentInt16 a0)) {
18946 StructAlignmentInt16 a0 = {};
18947
18948 a0.a0 = -1;
18949 a0.a1 = 2;
18950 a0.a2 = -3;
18951
18952 std::cout << "Calling TestAsyncPassStructAlignmentInt16("
18953 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
18954 << static_cast<int>(a0.a2) << "))"
18955 << ")\n";
18956
18957 f(a0);
18958}
18959
18960// Used for testing structs and unions by value.
18961// Test alignment and padding of 32 byte int within struct.
18963 // NOLINTNEXTLINE(whitespace/parens)
18964 void (*f)(StructAlignmentInt32 a0)) {
18965 StructAlignmentInt32 a0 = {};
18966
18967 a0.a0 = -1;
18968 a0.a1 = 2;
18969 a0.a2 = -3;
18970
18971 std::cout << "Calling TestAsyncPassStructAlignmentInt32("
18972 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
18973 << static_cast<int>(a0.a2) << "))"
18974 << ")\n";
18975
18976 f(a0);
18977}
18978
18979// Used for testing structs and unions by value.
18980// Test alignment and padding of 64 byte int within struct.
18982 // NOLINTNEXTLINE(whitespace/parens)
18983 void (*f)(StructAlignmentInt64 a0)) {
18984 StructAlignmentInt64 a0 = {};
18985
18986 a0.a0 = -1;
18987 a0.a1 = 2;
18988 a0.a2 = -3;
18989
18990 std::cout << "Calling TestAsyncPassStructAlignmentInt64("
18991 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
18992 << static_cast<int>(a0.a2) << "))"
18993 << ")\n";
18994
18995 f(a0);
18996}
18997
18998// Used for testing structs and unions by value.
18999// Simple nested struct. No alignment gaps on any architectures.
19000// 10 arguments exhaust registers on all platforms.
19002 // NOLINTNEXTLINE(whitespace/parens)
19003 void (*f)(Struct8BytesNestedInt a0,
19013 Struct8BytesNestedInt a0 = {};
19014 Struct8BytesNestedInt a1 = {};
19015 Struct8BytesNestedInt a2 = {};
19016 Struct8BytesNestedInt a3 = {};
19017 Struct8BytesNestedInt a4 = {};
19018 Struct8BytesNestedInt a5 = {};
19019 Struct8BytesNestedInt a6 = {};
19020 Struct8BytesNestedInt a7 = {};
19021 Struct8BytesNestedInt a8 = {};
19022 Struct8BytesNestedInt a9 = {};
19023
19024 a0.a0.a0 = -1;
19025 a0.a0.a1 = 2;
19026 a0.a1.a0 = -3;
19027 a0.a1.a1 = 4;
19028 a1.a0.a0 = -5;
19029 a1.a0.a1 = 6;
19030 a1.a1.a0 = -7;
19031 a1.a1.a1 = 8;
19032 a2.a0.a0 = -9;
19033 a2.a0.a1 = 10;
19034 a2.a1.a0 = -11;
19035 a2.a1.a1 = 12;
19036 a3.a0.a0 = -13;
19037 a3.a0.a1 = 14;
19038 a3.a1.a0 = -15;
19039 a3.a1.a1 = 16;
19040 a4.a0.a0 = -17;
19041 a4.a0.a1 = 18;
19042 a4.a1.a0 = -19;
19043 a4.a1.a1 = 20;
19044 a5.a0.a0 = -21;
19045 a5.a0.a1 = 22;
19046 a5.a1.a0 = -23;
19047 a5.a1.a1 = 24;
19048 a6.a0.a0 = -25;
19049 a6.a0.a1 = 26;
19050 a6.a1.a0 = -27;
19051 a6.a1.a1 = 28;
19052 a7.a0.a0 = -29;
19053 a7.a0.a1 = 30;
19054 a7.a1.a0 = -31;
19055 a7.a1.a1 = 32;
19056 a8.a0.a0 = -33;
19057 a8.a0.a1 = 34;
19058 a8.a1.a0 = -35;
19059 a8.a1.a1 = 36;
19060 a9.a0.a0 = -37;
19061 a9.a0.a1 = 38;
19062 a9.a1.a0 = -39;
19063 a9.a1.a1 = 40;
19064
19065 std::cout << "Calling TestAsyncPassStruct8BytesNestedIntx10("
19066 << "(((" << a0.a0.a0 << ", " << a0.a0.a1 << "), (" << a0.a1.a0
19067 << ", " << a0.a1.a1 << ")), ((" << a1.a0.a0 << ", " << a1.a0.a1
19068 << "), (" << a1.a1.a0 << ", " << a1.a1.a1 << ")), ((" << a2.a0.a0
19069 << ", " << a2.a0.a1 << "), (" << a2.a1.a0 << ", " << a2.a1.a1
19070 << ")), ((" << a3.a0.a0 << ", " << a3.a0.a1 << "), (" << a3.a1.a0
19071 << ", " << a3.a1.a1 << ")), ((" << a4.a0.a0 << ", " << a4.a0.a1
19072 << "), (" << a4.a1.a0 << ", " << a4.a1.a1 << ")), ((" << a5.a0.a0
19073 << ", " << a5.a0.a1 << "), (" << a5.a1.a0 << ", " << a5.a1.a1
19074 << ")), ((" << a6.a0.a0 << ", " << a6.a0.a1 << "), (" << a6.a1.a0
19075 << ", " << a6.a1.a1 << ")), ((" << a7.a0.a0 << ", " << a7.a0.a1
19076 << "), (" << a7.a1.a0 << ", " << a7.a1.a1 << ")), ((" << a8.a0.a0
19077 << ", " << a8.a0.a1 << "), (" << a8.a1.a0 << ", " << a8.a1.a1
19078 << ")), ((" << a9.a0.a0 << ", " << a9.a0.a1 << "), (" << a9.a1.a0
19079 << ", " << a9.a1.a1 << ")))"
19080 << ")\n";
19081
19082 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
19083}
19084
19085// Used for testing structs and unions by value.
19086// Simple nested struct. No alignment gaps on any architectures.
19087// 10 arguments exhaust fpu registers on all platforms.
19089 // NOLINTNEXTLINE(whitespace/parens)
19090 void (*f)(Struct8BytesNestedFloat a0,
19110
19111 a0.a0.a0 = -1.0;
19112 a0.a1.a0 = 2.0;
19113 a1.a0.a0 = -3.0;
19114 a1.a1.a0 = 4.0;
19115 a2.a0.a0 = -5.0;
19116 a2.a1.a0 = 6.0;
19117 a3.a0.a0 = -7.0;
19118 a3.a1.a0 = 8.0;
19119 a4.a0.a0 = -9.0;
19120 a4.a1.a0 = 10.0;
19121 a5.a0.a0 = -11.0;
19122 a5.a1.a0 = 12.0;
19123 a6.a0.a0 = -13.0;
19124 a6.a1.a0 = 14.0;
19125 a7.a0.a0 = -15.0;
19126 a7.a1.a0 = 16.0;
19127 a8.a0.a0 = -17.0;
19128 a8.a1.a0 = 18.0;
19129 a9.a0.a0 = -19.0;
19130 a9.a1.a0 = 20.0;
19131
19132 std::cout << "Calling TestAsyncPassStruct8BytesNestedFloatx10("
19133 << "(((" << a0.a0.a0 << "), (" << a0.a1.a0 << ")), ((" << a1.a0.a0
19134 << "), (" << a1.a1.a0 << ")), ((" << a2.a0.a0 << "), (" << a2.a1.a0
19135 << ")), ((" << a3.a0.a0 << "), (" << a3.a1.a0 << ")), (("
19136 << a4.a0.a0 << "), (" << a4.a1.a0 << ")), ((" << a5.a0.a0 << "), ("
19137 << a5.a1.a0 << ")), ((" << a6.a0.a0 << "), (" << a6.a1.a0
19138 << ")), ((" << a7.a0.a0 << "), (" << a7.a1.a0 << ")), (("
19139 << a8.a0.a0 << "), (" << a8.a1.a0 << ")), ((" << a9.a0.a0 << "), ("
19140 << a9.a1.a0 << ")))"
19141 << ")\n";
19142
19143 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
19144}
19145
19146// Used for testing structs and unions by value.
19147// Simple nested struct. No alignment gaps on any architectures.
19148// 10 arguments exhaust fpu registers on all platforms.
19149// The nesting is irregular, testing homogenous float rules on arm and arm64,
19150// and the fpu register usage on x64.
19152 // NOLINTNEXTLINE(whitespace/parens)
19153 void (*f)(Struct8BytesNestedFloat2 a0,
19173
19174 a0.a0.a0 = -1.0;
19175 a0.a1 = 2.0;
19176 a1.a0.a0 = -3.0;
19177 a1.a1 = 4.0;
19178 a2.a0.a0 = -5.0;
19179 a2.a1 = 6.0;
19180 a3.a0.a0 = -7.0;
19181 a3.a1 = 8.0;
19182 a4.a0.a0 = -9.0;
19183 a4.a1 = 10.0;
19184 a5.a0.a0 = -11.0;
19185 a5.a1 = 12.0;
19186 a6.a0.a0 = -13.0;
19187 a6.a1 = 14.0;
19188 a7.a0.a0 = -15.0;
19189 a7.a1 = 16.0;
19190 a8.a0.a0 = -17.0;
19191 a8.a1 = 18.0;
19192 a9.a0.a0 = -19.0;
19193 a9.a1 = 20.0;
19194
19195 std::cout << "Calling TestAsyncPassStruct8BytesNestedFloat2x10("
19196 << "(((" << a0.a0.a0 << "), " << a0.a1 << "), ((" << a1.a0.a0
19197 << "), " << a1.a1 << "), ((" << a2.a0.a0 << "), " << a2.a1
19198 << "), ((" << a3.a0.a0 << "), " << a3.a1 << "), ((" << a4.a0.a0
19199 << "), " << a4.a1 << "), ((" << a5.a0.a0 << "), " << a5.a1
19200 << "), ((" << a6.a0.a0 << "), " << a6.a1 << "), ((" << a7.a0.a0
19201 << "), " << a7.a1 << "), ((" << a8.a0.a0 << "), " << a8.a1
19202 << "), ((" << a9.a0.a0 << "), " << a9.a1 << "))"
19203 << ")\n";
19204
19205 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
19206}
19207
19208// Used for testing structs and unions by value.
19209// Simple nested struct. No alignment gaps on any architectures.
19210// 10 arguments exhaust all registers on all platforms.
19212 // NOLINTNEXTLINE(whitespace/parens)
19213 void (*f)(Struct8BytesNestedMixed a0,
19233
19234 a0.a0.a0 = -1;
19235 a0.a0.a1 = 2;
19236 a0.a1.a0 = -3.0;
19237 a1.a0.a0 = 4;
19238 a1.a0.a1 = -5;
19239 a1.a1.a0 = 6.0;
19240 a2.a0.a0 = -7;
19241 a2.a0.a1 = 8;
19242 a2.a1.a0 = -9.0;
19243 a3.a0.a0 = 10;
19244 a3.a0.a1 = -11;
19245 a3.a1.a0 = 12.0;
19246 a4.a0.a0 = -13;
19247 a4.a0.a1 = 14;
19248 a4.a1.a0 = -15.0;
19249 a5.a0.a0 = 16;
19250 a5.a0.a1 = -17;
19251 a5.a1.a0 = 18.0;
19252 a6.a0.a0 = -19;
19253 a6.a0.a1 = 20;
19254 a6.a1.a0 = -21.0;
19255 a7.a0.a0 = 22;
19256 a7.a0.a1 = -23;
19257 a7.a1.a0 = 24.0;
19258 a8.a0.a0 = -25;
19259 a8.a0.a1 = 26;
19260 a8.a1.a0 = -27.0;
19261 a9.a0.a0 = 28;
19262 a9.a0.a1 = -29;
19263 a9.a1.a0 = 30.0;
19264
19265 std::cout << "Calling TestAsyncPassStruct8BytesNestedMixedx10("
19266 << "(((" << a0.a0.a0 << ", " << a0.a0.a1 << "), (" << a0.a1.a0
19267 << ")), ((" << a1.a0.a0 << ", " << a1.a0.a1 << "), (" << a1.a1.a0
19268 << ")), ((" << a2.a0.a0 << ", " << a2.a0.a1 << "), (" << a2.a1.a0
19269 << ")), ((" << a3.a0.a0 << ", " << a3.a0.a1 << "), (" << a3.a1.a0
19270 << ")), ((" << a4.a0.a0 << ", " << a4.a0.a1 << "), (" << a4.a1.a0
19271 << ")), ((" << a5.a0.a0 << ", " << a5.a0.a1 << "), (" << a5.a1.a0
19272 << ")), ((" << a6.a0.a0 << ", " << a6.a0.a1 << "), (" << a6.a1.a0
19273 << ")), ((" << a7.a0.a0 << ", " << a7.a0.a1 << "), (" << a7.a1.a0
19274 << ")), ((" << a8.a0.a0 << ", " << a8.a0.a1 << "), (" << a8.a1.a0
19275 << ")), ((" << a9.a0.a0 << ", " << a9.a0.a1 << "), (" << a9.a1.a0
19276 << ")))"
19277 << ")\n";
19278
19279 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
19280}
19281
19282// Used for testing structs and unions by value.
19283// Deeper nested struct to test recursive member access.
19285 // NOLINTNEXTLINE(whitespace/parens)
19287 Struct16BytesNestedInt a0 = {};
19288 Struct16BytesNestedInt a1 = {};
19289
19290 a0.a0.a0.a0 = -1;
19291 a0.a0.a0.a1 = 2;
19292 a0.a0.a1.a0 = -3;
19293 a0.a0.a1.a1 = 4;
19294 a0.a1.a0.a0 = -5;
19295 a0.a1.a0.a1 = 6;
19296 a0.a1.a1.a0 = -7;
19297 a0.a1.a1.a1 = 8;
19298 a1.a0.a0.a0 = -9;
19299 a1.a0.a0.a1 = 10;
19300 a1.a0.a1.a0 = -11;
19301 a1.a0.a1.a1 = 12;
19302 a1.a1.a0.a0 = -13;
19303 a1.a1.a0.a1 = 14;
19304 a1.a1.a1.a0 = -15;
19305 a1.a1.a1.a1 = 16;
19306
19307 std::cout << "Calling TestAsyncPassStruct16BytesNestedIntx2("
19308 << "((((" << a0.a0.a0.a0 << ", " << a0.a0.a0.a1 << "), ("
19309 << a0.a0.a1.a0 << ", " << a0.a0.a1.a1 << ")), ((" << a0.a1.a0.a0
19310 << ", " << a0.a1.a0.a1 << "), (" << a0.a1.a1.a0 << ", "
19311 << a0.a1.a1.a1 << "))), (((" << a1.a0.a0.a0 << ", " << a1.a0.a0.a1
19312 << "), (" << a1.a0.a1.a0 << ", " << a1.a0.a1.a1 << ")), (("
19313 << a1.a1.a0.a0 << ", " << a1.a1.a0.a1 << "), (" << a1.a1.a1.a0
19314 << ", " << a1.a1.a1.a1 << "))))"
19315 << ")\n";
19316
19317 f(a0, a1);
19318}
19319
19320// Used for testing structs and unions by value.
19321// Even deeper nested struct to test recursive member access.
19323 // NOLINTNEXTLINE(whitespace/parens)
19325 Struct32BytesNestedInt a0 = {};
19326 Struct32BytesNestedInt a1 = {};
19327
19328 a0.a0.a0.a0.a0 = -1;
19329 a0.a0.a0.a0.a1 = 2;
19330 a0.a0.a0.a1.a0 = -3;
19331 a0.a0.a0.a1.a1 = 4;
19332 a0.a0.a1.a0.a0 = -5;
19333 a0.a0.a1.a0.a1 = 6;
19334 a0.a0.a1.a1.a0 = -7;
19335 a0.a0.a1.a1.a1 = 8;
19336 a0.a1.a0.a0.a0 = -9;
19337 a0.a1.a0.a0.a1 = 10;
19338 a0.a1.a0.a1.a0 = -11;
19339 a0.a1.a0.a1.a1 = 12;
19340 a0.a1.a1.a0.a0 = -13;
19341 a0.a1.a1.a0.a1 = 14;
19342 a0.a1.a1.a1.a0 = -15;
19343 a0.a1.a1.a1.a1 = 16;
19344 a1.a0.a0.a0.a0 = -17;
19345 a1.a0.a0.a0.a1 = 18;
19346 a1.a0.a0.a1.a0 = -19;
19347 a1.a0.a0.a1.a1 = 20;
19348 a1.a0.a1.a0.a0 = -21;
19349 a1.a0.a1.a0.a1 = 22;
19350 a1.a0.a1.a1.a0 = -23;
19351 a1.a0.a1.a1.a1 = 24;
19352 a1.a1.a0.a0.a0 = -25;
19353 a1.a1.a0.a0.a1 = 26;
19354 a1.a1.a0.a1.a0 = -27;
19355 a1.a1.a0.a1.a1 = 28;
19356 a1.a1.a1.a0.a0 = -29;
19357 a1.a1.a1.a0.a1 = 30;
19358 a1.a1.a1.a1.a0 = -31;
19359 a1.a1.a1.a1.a1 = 32;
19360
19361 std::cout << "Calling TestAsyncPassStruct32BytesNestedIntx2("
19362 << "(((((" << a0.a0.a0.a0.a0 << ", " << a0.a0.a0.a0.a1 << "), ("
19363 << a0.a0.a0.a1.a0 << ", " << a0.a0.a0.a1.a1 << ")), (("
19364 << a0.a0.a1.a0.a0 << ", " << a0.a0.a1.a0.a1 << "), ("
19365 << a0.a0.a1.a1.a0 << ", " << a0.a0.a1.a1.a1 << "))), ((("
19366 << a0.a1.a0.a0.a0 << ", " << a0.a1.a0.a0.a1 << "), ("
19367 << a0.a1.a0.a1.a0 << ", " << a0.a1.a0.a1.a1 << ")), (("
19368 << a0.a1.a1.a0.a0 << ", " << a0.a1.a1.a0.a1 << "), ("
19369 << a0.a1.a1.a1.a0 << ", " << a0.a1.a1.a1.a1 << ")))), (((("
19370 << a1.a0.a0.a0.a0 << ", " << a1.a0.a0.a0.a1 << "), ("
19371 << a1.a0.a0.a1.a0 << ", " << a1.a0.a0.a1.a1 << ")), (("
19372 << a1.a0.a1.a0.a0 << ", " << a1.a0.a1.a0.a1 << "), ("
19373 << a1.a0.a1.a1.a0 << ", " << a1.a0.a1.a1.a1 << "))), ((("
19374 << a1.a1.a0.a0.a0 << ", " << a1.a1.a0.a0.a1 << "), ("
19375 << a1.a1.a0.a1.a0 << ", " << a1.a1.a0.a1.a1 << ")), (("
19376 << a1.a1.a1.a0.a0 << ", " << a1.a1.a1.a0.a1 << "), ("
19377 << a1.a1.a1.a1.a0 << ", " << a1.a1.a1.a1.a1 << ")))))"
19378 << ")\n";
19379
19380 f(a0, a1);
19381}
19382
19383// Used for testing structs and unions by value.
19384// Test alignment and padding of nested struct with 16 byte int.
19386 // NOLINTNEXTLINE(whitespace/parens)
19389
19390 a0.a0.a0 = -1;
19391 a0.a0.a1 = 2;
19392 a0.a0.a2 = -3;
19393 a0.a1.a0 = 4;
19394 a0.a1.a1 = -5;
19395 a0.a1.a2 = 6;
19396
19397 std::cout << "Calling TestAsyncPassStructNestedIntStructAlignmentInt16("
19398 << "(((" << static_cast<int>(a0.a0.a0) << ", " << a0.a0.a1 << ", "
19399 << static_cast<int>(a0.a0.a2) << "), ("
19400 << static_cast<int>(a0.a1.a0) << ", " << a0.a1.a1 << ", "
19401 << static_cast<int>(a0.a1.a2) << ")))"
19402 << ")\n";
19403
19404 f(a0);
19405}
19406
19407// Used for testing structs and unions by value.
19408// Test alignment and padding of nested struct with 32 byte int.
19410 // NOLINTNEXTLINE(whitespace/parens)
19413
19414 a0.a0.a0 = -1;
19415 a0.a0.a1 = 2;
19416 a0.a0.a2 = -3;
19417 a0.a1.a0 = 4;
19418 a0.a1.a1 = -5;
19419 a0.a1.a2 = 6;
19420
19421 std::cout << "Calling TestAsyncPassStructNestedIntStructAlignmentInt32("
19422 << "(((" << static_cast<int>(a0.a0.a0) << ", " << a0.a0.a1 << ", "
19423 << static_cast<int>(a0.a0.a2) << "), ("
19424 << static_cast<int>(a0.a1.a0) << ", " << a0.a1.a1 << ", "
19425 << static_cast<int>(a0.a1.a2) << ")))"
19426 << ")\n";
19427
19428 f(a0);
19429}
19430
19431// Used for testing structs and unions by value.
19432// Test alignment and padding of nested struct with 64 byte int.
19434 // NOLINTNEXTLINE(whitespace/parens)
19437
19438 a0.a0.a0 = -1;
19439 a0.a0.a1 = 2;
19440 a0.a0.a2 = -3;
19441 a0.a1.a0 = 4;
19442 a0.a1.a1 = -5;
19443 a0.a1.a2 = 6;
19444
19445 std::cout << "Calling TestAsyncPassStructNestedIntStructAlignmentInt64("
19446 << "(((" << static_cast<int>(a0.a0.a0) << ", " << a0.a0.a1 << ", "
19447 << static_cast<int>(a0.a0.a2) << "), ("
19448 << static_cast<int>(a0.a1.a0) << ", " << a0.a1.a1 << ", "
19449 << static_cast<int>(a0.a1.a2) << ")))"
19450 << ")\n";
19451
19452 f(a0);
19453}
19454
19455// Used for testing structs and unions by value.
19456// Return big irregular struct as smoke test.
19458 // NOLINTNEXTLINE(whitespace/parens)
19467
19468 a0.a0 = 1;
19469 a0.a1.a0.a0 = 2;
19470 a0.a1.a0.a1.a0.a0 = -3;
19471 a0.a1.a0.a1.a0.a1 = 4;
19472 a0.a1.a0.a1.a1.a0 = -5.0;
19473 a0.a1.a0.a2 = 6;
19474 a0.a1.a0.a3.a0.a0 = -7.0;
19475 a0.a1.a0.a3.a1 = 8.0;
19476 a0.a1.a0.a4 = 9;
19477 a0.a1.a0.a5.a0.a0 = 10.0;
19478 a0.a1.a0.a5.a1.a0 = -11.0;
19479 a0.a1.a0.a6 = 12;
19480 a0.a1.a1.a0.a0 = -13;
19481 a0.a1.a1.a0.a1 = 14;
19482 a0.a1.a1.a1.a0 = -15.0;
19483 a0.a1.a2 = 16.0;
19484 a0.a1.a3 = -17.0;
19485 a0.a2.a0.a0 = 18;
19486 a0.a2.a0.a1.a0.a0 = -19;
19487 a0.a2.a0.a1.a0.a1 = 20;
19488 a0.a2.a0.a1.a1.a0 = -21.0;
19489 a0.a2.a0.a2 = 22;
19490 a0.a2.a0.a3.a0.a0 = -23.0;
19491 a0.a2.a0.a3.a1 = 24.0;
19492 a0.a2.a0.a4 = 25;
19493 a0.a2.a0.a5.a0.a0 = 26.0;
19494 a0.a2.a0.a5.a1.a0 = -27.0;
19495 a0.a2.a0.a6 = 28;
19496 a0.a2.a1.a0.a0 = -29;
19497 a0.a2.a1.a0.a1 = 30;
19498 a0.a2.a1.a1.a0 = -31.0;
19499 a0.a2.a2 = 32.0;
19500 a0.a2.a3 = -33.0;
19501 a0.a3 = 34.0;
19502 a1.a0 = 35;
19503 a1.a1.a0.a0 = 36;
19504 a1.a1.a0.a1.a0.a0 = -37;
19505 a1.a1.a0.a1.a0.a1 = 38;
19506 a1.a1.a0.a1.a1.a0 = -39.0;
19507 a1.a1.a0.a2 = 40;
19508 a1.a1.a0.a3.a0.a0 = -41.0;
19509 a1.a1.a0.a3.a1 = 42.0;
19510 a1.a1.a0.a4 = 43;
19511 a1.a1.a0.a5.a0.a0 = 44.0;
19512 a1.a1.a0.a5.a1.a0 = -45.0;
19513 a1.a1.a0.a6 = 46;
19514 a1.a1.a1.a0.a0 = -47;
19515 a1.a1.a1.a0.a1 = 48;
19516 a1.a1.a1.a1.a0 = -49.0;
19517 a1.a1.a2 = 50.0;
19518 a1.a1.a3 = -51.0;
19519 a1.a2.a0.a0 = 52;
19520 a1.a2.a0.a1.a0.a0 = -53;
19521 a1.a2.a0.a1.a0.a1 = 54;
19522 a1.a2.a0.a1.a1.a0 = -55.0;
19523 a1.a2.a0.a2 = 56;
19524 a1.a2.a0.a3.a0.a0 = -57.0;
19525 a1.a2.a0.a3.a1 = 58.0;
19526 a1.a2.a0.a4 = 59;
19527 a1.a2.a0.a5.a0.a0 = 60.0;
19528 a1.a2.a0.a5.a1.a0 = -61.0;
19529 a1.a2.a0.a6 = 62;
19530 a1.a2.a1.a0.a0 = -63;
19531 a1.a2.a1.a0.a1 = 64;
19532 a1.a2.a1.a1.a0 = -65.0;
19533 a1.a2.a2 = 66.0;
19534 a1.a2.a3 = -67.0;
19535 a1.a3 = 68.0;
19536 a2.a0 = 69;
19537 a2.a1.a0.a0 = 70;
19538 a2.a1.a0.a1.a0.a0 = -71;
19539 a2.a1.a0.a1.a0.a1 = 72;
19540 a2.a1.a0.a1.a1.a0 = -73.0;
19541 a2.a1.a0.a2 = 74;
19542 a2.a1.a0.a3.a0.a0 = -75.0;
19543 a2.a1.a0.a3.a1 = 76.0;
19544 a2.a1.a0.a4 = 77;
19545 a2.a1.a0.a5.a0.a0 = 78.0;
19546 a2.a1.a0.a5.a1.a0 = -79.0;
19547 a2.a1.a0.a6 = 80;
19548 a2.a1.a1.a0.a0 = -81;
19549 a2.a1.a1.a0.a1 = 82;
19550 a2.a1.a1.a1.a0 = -83.0;
19551 a2.a1.a2 = 84.0;
19552 a2.a1.a3 = -85.0;
19553 a2.a2.a0.a0 = 86;
19554 a2.a2.a0.a1.a0.a0 = -87;
19555 a2.a2.a0.a1.a0.a1 = 88;
19556 a2.a2.a0.a1.a1.a0 = -89.0;
19557 a2.a2.a0.a2 = 90;
19558 a2.a2.a0.a3.a0.a0 = -91.0;
19559 a2.a2.a0.a3.a1 = 92.0;
19560 a2.a2.a0.a4 = 93;
19561 a2.a2.a0.a5.a0.a0 = 94.0;
19562 a2.a2.a0.a5.a1.a0 = -95.0;
19563 a2.a2.a0.a6 = 96;
19564 a2.a2.a1.a0.a0 = -97;
19565 a2.a2.a1.a0.a1 = 98;
19566 a2.a2.a1.a1.a0 = -99.0;
19567 a2.a2.a2 = 100.0;
19568 a2.a2.a3 = -101.0;
19569 a2.a3 = 102.0;
19570 a3.a0 = 103;
19571 a3.a1.a0.a0 = 104;
19572 a3.a1.a0.a1.a0.a0 = -105;
19573 a3.a1.a0.a1.a0.a1 = 106;
19574 a3.a1.a0.a1.a1.a0 = -107.0;
19575 a3.a1.a0.a2 = 108;
19576 a3.a1.a0.a3.a0.a0 = -109.0;
19577 a3.a1.a0.a3.a1 = 110.0;
19578 a3.a1.a0.a4 = 111;
19579 a3.a1.a0.a5.a0.a0 = 112.0;
19580 a3.a1.a0.a5.a1.a0 = -113.0;
19581 a3.a1.a0.a6 = 114;
19582 a3.a1.a1.a0.a0 = -115;
19583 a3.a1.a1.a0.a1 = 116;
19584 a3.a1.a1.a1.a0 = -117.0;
19585 a3.a1.a2 = 118.0;
19586 a3.a1.a3 = -119.0;
19587 a3.a2.a0.a0 = 120;
19588 a3.a2.a0.a1.a0.a0 = -121;
19589 a3.a2.a0.a1.a0.a1 = 122;
19590 a3.a2.a0.a1.a1.a0 = -123.0;
19591 a3.a2.a0.a2 = 124;
19592 a3.a2.a0.a3.a0.a0 = -125.0;
19593 a3.a2.a0.a3.a1 = 126.0;
19594 a3.a2.a0.a4 = 127;
19595 a3.a2.a0.a5.a0.a0 = 128.0;
19596 a3.a2.a0.a5.a1.a0 = -129.0;
19597 a3.a2.a0.a6 = 130;
19598 a3.a2.a1.a0.a0 = -131;
19599 a3.a2.a1.a0.a1 = 132;
19600 a3.a2.a1.a1.a0 = -133.0;
19601 a3.a2.a2 = 134.0;
19602 a3.a2.a3 = -135.0;
19603 a3.a3 = 136.0;
19604
19605 std::cout
19606 << "Calling TestAsyncPassStructNestedIrregularEvenBiggerx4("
19607 << "((" << a0.a0 << ", ((" << a0.a1.a0.a0 << ", ((" << a0.a1.a0.a1.a0.a0
19608 << ", " << a0.a1.a0.a1.a0.a1 << "), (" << a0.a1.a0.a1.a1.a0 << ")), "
19609 << a0.a1.a0.a2 << ", ((" << a0.a1.a0.a3.a0.a0 << "), " << a0.a1.a0.a3.a1
19610 << "), " << a0.a1.a0.a4 << ", ((" << a0.a1.a0.a5.a0.a0 << "), ("
19611 << a0.a1.a0.a5.a1.a0 << ")), " << a0.a1.a0.a6 << "), ((" << a0.a1.a1.a0.a0
19612 << ", " << a0.a1.a1.a0.a1 << "), (" << a0.a1.a1.a1.a0 << ")), "
19613 << a0.a1.a2 << ", " << a0.a1.a3 << "), ((" << a0.a2.a0.a0 << ", (("
19614 << a0.a2.a0.a1.a0.a0 << ", " << a0.a2.a0.a1.a0.a1 << "), ("
19615 << a0.a2.a0.a1.a1.a0 << ")), " << a0.a2.a0.a2 << ", (("
19616 << a0.a2.a0.a3.a0.a0 << "), " << a0.a2.a0.a3.a1 << "), " << a0.a2.a0.a4
19617 << ", ((" << a0.a2.a0.a5.a0.a0 << "), (" << a0.a2.a0.a5.a1.a0 << ")), "
19618 << a0.a2.a0.a6 << "), ((" << a0.a2.a1.a0.a0 << ", " << a0.a2.a1.a0.a1
19619 << "), (" << a0.a2.a1.a1.a0 << ")), " << a0.a2.a2 << ", " << a0.a2.a3
19620 << "), " << a0.a3 << "), (" << a1.a0 << ", ((" << a1.a1.a0.a0 << ", (("
19621 << a1.a1.a0.a1.a0.a0 << ", " << a1.a1.a0.a1.a0.a1 << "), ("
19622 << a1.a1.a0.a1.a1.a0 << ")), " << a1.a1.a0.a2 << ", (("
19623 << a1.a1.a0.a3.a0.a0 << "), " << a1.a1.a0.a3.a1 << "), " << a1.a1.a0.a4
19624 << ", ((" << a1.a1.a0.a5.a0.a0 << "), (" << a1.a1.a0.a5.a1.a0 << ")), "
19625 << a1.a1.a0.a6 << "), ((" << a1.a1.a1.a0.a0 << ", " << a1.a1.a1.a0.a1
19626 << "), (" << a1.a1.a1.a1.a0 << ")), " << a1.a1.a2 << ", " << a1.a1.a3
19627 << "), ((" << a1.a2.a0.a0 << ", ((" << a1.a2.a0.a1.a0.a0 << ", "
19628 << a1.a2.a0.a1.a0.a1 << "), (" << a1.a2.a0.a1.a1.a0 << ")), "
19629 << a1.a2.a0.a2 << ", ((" << a1.a2.a0.a3.a0.a0 << "), " << a1.a2.a0.a3.a1
19630 << "), " << a1.a2.a0.a4 << ", ((" << a1.a2.a0.a5.a0.a0 << "), ("
19631 << a1.a2.a0.a5.a1.a0 << ")), " << a1.a2.a0.a6 << "), ((" << a1.a2.a1.a0.a0
19632 << ", " << a1.a2.a1.a0.a1 << "), (" << a1.a2.a1.a1.a0 << ")), "
19633 << a1.a2.a2 << ", " << a1.a2.a3 << "), " << a1.a3 << "), (" << a2.a0
19634 << ", ((" << a2.a1.a0.a0 << ", ((" << a2.a1.a0.a1.a0.a0 << ", "
19635 << a2.a1.a0.a1.a0.a1 << "), (" << a2.a1.a0.a1.a1.a0 << ")), "
19636 << a2.a1.a0.a2 << ", ((" << a2.a1.a0.a3.a0.a0 << "), " << a2.a1.a0.a3.a1
19637 << "), " << a2.a1.a0.a4 << ", ((" << a2.a1.a0.a5.a0.a0 << "), ("
19638 << a2.a1.a0.a5.a1.a0 << ")), " << a2.a1.a0.a6 << "), ((" << a2.a1.a1.a0.a0
19639 << ", " << a2.a1.a1.a0.a1 << "), (" << a2.a1.a1.a1.a0 << ")), "
19640 << a2.a1.a2 << ", " << a2.a1.a3 << "), ((" << a2.a2.a0.a0 << ", (("
19641 << a2.a2.a0.a1.a0.a0 << ", " << a2.a2.a0.a1.a0.a1 << "), ("
19642 << a2.a2.a0.a1.a1.a0 << ")), " << a2.a2.a0.a2 << ", (("
19643 << a2.a2.a0.a3.a0.a0 << "), " << a2.a2.a0.a3.a1 << "), " << a2.a2.a0.a4
19644 << ", ((" << a2.a2.a0.a5.a0.a0 << "), (" << a2.a2.a0.a5.a1.a0 << ")), "
19645 << a2.a2.a0.a6 << "), ((" << a2.a2.a1.a0.a0 << ", " << a2.a2.a1.a0.a1
19646 << "), (" << a2.a2.a1.a1.a0 << ")), " << a2.a2.a2 << ", " << a2.a2.a3
19647 << "), " << a2.a3 << "), (" << a3.a0 << ", ((" << a3.a1.a0.a0 << ", (("
19648 << a3.a1.a0.a1.a0.a0 << ", " << a3.a1.a0.a1.a0.a1 << "), ("
19649 << a3.a1.a0.a1.a1.a0 << ")), " << a3.a1.a0.a2 << ", (("
19650 << a3.a1.a0.a3.a0.a0 << "), " << a3.a1.a0.a3.a1 << "), " << a3.a1.a0.a4
19651 << ", ((" << a3.a1.a0.a5.a0.a0 << "), (" << a3.a1.a0.a5.a1.a0 << ")), "
19652 << a3.a1.a0.a6 << "), ((" << a3.a1.a1.a0.a0 << ", " << a3.a1.a1.a0.a1
19653 << "), (" << a3.a1.a1.a1.a0 << ")), " << a3.a1.a2 << ", " << a3.a1.a3
19654 << "), ((" << a3.a2.a0.a0 << ", ((" << a3.a2.a0.a1.a0.a0 << ", "
19655 << a3.a2.a0.a1.a0.a1 << "), (" << a3.a2.a0.a1.a1.a0 << ")), "
19656 << a3.a2.a0.a2 << ", ((" << a3.a2.a0.a3.a0.a0 << "), " << a3.a2.a0.a3.a1
19657 << "), " << a3.a2.a0.a4 << ", ((" << a3.a2.a0.a5.a0.a0 << "), ("
19658 << a3.a2.a0.a5.a1.a0 << ")), " << a3.a2.a0.a6 << "), ((" << a3.a2.a1.a0.a0
19659 << ", " << a3.a2.a1.a0.a1 << "), (" << a3.a2.a1.a1.a0 << ")), "
19660 << a3.a2.a2 << ", " << a3.a2.a3 << "), " << a3.a3 << "))"
19661 << ")\n";
19662
19663 f(a0, a1, a2, a3);
19664}
19665
19666// Used for testing structs and unions by value.
19667// Simple struct with inline array.
19669 // NOLINTNEXTLINE(whitespace/parens)
19670 void (*f)(Struct8BytesInlineArrayInt a0,
19678
19679 a0.a0[0] = 1;
19680 a0.a0[1] = 2;
19681 a0.a0[2] = 3;
19682 a0.a0[3] = 4;
19683 a0.a0[4] = 5;
19684 a0.a0[5] = 6;
19685 a0.a0[6] = 7;
19686 a0.a0[7] = 8;
19687 a1.a0[0] = 9;
19688 a1.a0[1] = 10;
19689 a1.a0[2] = 11;
19690 a1.a0[3] = 12;
19691 a1.a0[4] = 13;
19692 a1.a0[5] = 14;
19693 a1.a0[6] = 15;
19694 a1.a0[7] = 16;
19695 a2.a0[0] = 17;
19696 a2.a0[1] = 18;
19697 a2.a0[2] = 19;
19698 a2.a0[3] = 20;
19699 a2.a0[4] = 21;
19700 a2.a0[5] = 22;
19701 a2.a0[6] = 23;
19702 a2.a0[7] = 24;
19703 a3.a0[0] = 25;
19704 a3.a0[1] = 26;
19705 a3.a0[2] = 27;
19706 a3.a0[3] = 28;
19707 a3.a0[4] = 29;
19708 a3.a0[5] = 30;
19709 a3.a0[6] = 31;
19710 a3.a0[7] = 32;
19711
19712 std::cout << "Calling TestAsyncPassStruct8BytesInlineArrayIntx4("
19713 << "(([" << static_cast<int>(a0.a0[0]) << ", "
19714 << static_cast<int>(a0.a0[1]) << ", " << static_cast<int>(a0.a0[2])
19715 << ", " << static_cast<int>(a0.a0[3]) << ", "
19716 << static_cast<int>(a0.a0[4]) << ", " << static_cast<int>(a0.a0[5])
19717 << ", " << static_cast<int>(a0.a0[6]) << ", "
19718 << static_cast<int>(a0.a0[7]) << "]), (["
19719 << static_cast<int>(a1.a0[0]) << ", " << static_cast<int>(a1.a0[1])
19720 << ", " << static_cast<int>(a1.a0[2]) << ", "
19721 << static_cast<int>(a1.a0[3]) << ", " << static_cast<int>(a1.a0[4])
19722 << ", " << static_cast<int>(a1.a0[5]) << ", "
19723 << static_cast<int>(a1.a0[6]) << ", " << static_cast<int>(a1.a0[7])
19724 << "]), ([" << static_cast<int>(a2.a0[0]) << ", "
19725 << static_cast<int>(a2.a0[1]) << ", " << static_cast<int>(a2.a0[2])
19726 << ", " << static_cast<int>(a2.a0[3]) << ", "
19727 << static_cast<int>(a2.a0[4]) << ", " << static_cast<int>(a2.a0[5])
19728 << ", " << static_cast<int>(a2.a0[6]) << ", "
19729 << static_cast<int>(a2.a0[7]) << "]), (["
19730 << static_cast<int>(a3.a0[0]) << ", " << static_cast<int>(a3.a0[1])
19731 << ", " << static_cast<int>(a3.a0[2]) << ", "
19732 << static_cast<int>(a3.a0[3]) << ", " << static_cast<int>(a3.a0[4])
19733 << ", " << static_cast<int>(a3.a0[5]) << ", "
19734 << static_cast<int>(a3.a0[6]) << ", " << static_cast<int>(a3.a0[7])
19735 << "]))"
19736 << ")\n";
19737
19738 f(a0, a1, a2, a3);
19739}
19740
19741// Used for testing structs and unions by value.
19742// Irregular struct with inline array.
19744 // NOLINTNEXTLINE(whitespace/parens)
19745 void (*f)(StructInlineArrayIrregular a0,
19753
19754 a0.a0[0].a0 = -1;
19755 a0.a0[0].a1 = 2;
19756 a0.a0[1].a0 = -3;
19757 a0.a0[1].a1 = 4;
19758 a0.a1 = 5;
19759 a1.a0[0].a0 = 6;
19760 a1.a0[0].a1 = -7;
19761 a1.a0[1].a0 = 8;
19762 a1.a0[1].a1 = -9;
19763 a1.a1 = 10;
19764 a2.a0[0].a0 = -11;
19765 a2.a0[0].a1 = 12;
19766 a2.a0[1].a0 = -13;
19767 a2.a0[1].a1 = 14;
19768 a2.a1 = 15;
19769 a3.a0[0].a0 = 16;
19770 a3.a0[0].a1 = -17;
19771 a3.a0[1].a0 = 18;
19772 a3.a0[1].a1 = -19;
19773 a3.a1 = 20;
19774
19775 std::cout << "Calling TestAsyncPassStructInlineArrayIrregularx4("
19776 << "(([(" << a0.a0[0].a0 << ", " << static_cast<int>(a0.a0[0].a1)
19777 << "), (" << a0.a0[1].a0 << ", " << static_cast<int>(a0.a0[1].a1)
19778 << ")], " << static_cast<int>(a0.a1) << "), ([(" << a1.a0[0].a0
19779 << ", " << static_cast<int>(a1.a0[0].a1) << "), (" << a1.a0[1].a0
19780 << ", " << static_cast<int>(a1.a0[1].a1) << ")], "
19781 << static_cast<int>(a1.a1) << "), ([(" << a2.a0[0].a0 << ", "
19782 << static_cast<int>(a2.a0[0].a1) << "), (" << a2.a0[1].a0 << ", "
19783 << static_cast<int>(a2.a0[1].a1) << ")], "
19784 << static_cast<int>(a2.a1) << "), ([(" << a3.a0[0].a0 << ", "
19785 << static_cast<int>(a3.a0[0].a1) << "), (" << a3.a0[1].a0 << ", "
19786 << static_cast<int>(a3.a0[1].a1) << ")], "
19787 << static_cast<int>(a3.a1) << "))"
19788 << ")\n";
19789
19790 f(a0, a1, a2, a3);
19791}
19792
19793// Used for testing structs and unions by value.
19794// Regular larger struct with inline array.
19796 // NOLINTNEXTLINE(whitespace/parens)
19797 void (*f)(StructInlineArray100Bytes a0)) {
19799
19800 a0.a0[0] = 1;
19801 a0.a0[1] = 2;
19802 a0.a0[2] = 3;
19803 a0.a0[3] = 4;
19804 a0.a0[4] = 5;
19805 a0.a0[5] = 6;
19806 a0.a0[6] = 7;
19807 a0.a0[7] = 8;
19808 a0.a0[8] = 9;
19809 a0.a0[9] = 10;
19810 a0.a0[10] = 11;
19811 a0.a0[11] = 12;
19812 a0.a0[12] = 13;
19813 a0.a0[13] = 14;
19814 a0.a0[14] = 15;
19815 a0.a0[15] = 16;
19816 a0.a0[16] = 17;
19817 a0.a0[17] = 18;
19818 a0.a0[18] = 19;
19819 a0.a0[19] = 20;
19820 a0.a0[20] = 21;
19821 a0.a0[21] = 22;
19822 a0.a0[22] = 23;
19823 a0.a0[23] = 24;
19824 a0.a0[24] = 25;
19825 a0.a0[25] = 26;
19826 a0.a0[26] = 27;
19827 a0.a0[27] = 28;
19828 a0.a0[28] = 29;
19829 a0.a0[29] = 30;
19830 a0.a0[30] = 31;
19831 a0.a0[31] = 32;
19832 a0.a0[32] = 33;
19833 a0.a0[33] = 34;
19834 a0.a0[34] = 35;
19835 a0.a0[35] = 36;
19836 a0.a0[36] = 37;
19837 a0.a0[37] = 38;
19838 a0.a0[38] = 39;
19839 a0.a0[39] = 40;
19840 a0.a0[40] = 41;
19841 a0.a0[41] = 42;
19842 a0.a0[42] = 43;
19843 a0.a0[43] = 44;
19844 a0.a0[44] = 45;
19845 a0.a0[45] = 46;
19846 a0.a0[46] = 47;
19847 a0.a0[47] = 48;
19848 a0.a0[48] = 49;
19849 a0.a0[49] = 50;
19850 a0.a0[50] = 51;
19851 a0.a0[51] = 52;
19852 a0.a0[52] = 53;
19853 a0.a0[53] = 54;
19854 a0.a0[54] = 55;
19855 a0.a0[55] = 56;
19856 a0.a0[56] = 57;
19857 a0.a0[57] = 58;
19858 a0.a0[58] = 59;
19859 a0.a0[59] = 60;
19860 a0.a0[60] = 61;
19861 a0.a0[61] = 62;
19862 a0.a0[62] = 63;
19863 a0.a0[63] = 64;
19864 a0.a0[64] = 65;
19865 a0.a0[65] = 66;
19866 a0.a0[66] = 67;
19867 a0.a0[67] = 68;
19868 a0.a0[68] = 69;
19869 a0.a0[69] = 70;
19870 a0.a0[70] = 71;
19871 a0.a0[71] = 72;
19872 a0.a0[72] = 73;
19873 a0.a0[73] = 74;
19874 a0.a0[74] = 75;
19875 a0.a0[75] = 76;
19876 a0.a0[76] = 77;
19877 a0.a0[77] = 78;
19878 a0.a0[78] = 79;
19879 a0.a0[79] = 80;
19880 a0.a0[80] = 81;
19881 a0.a0[81] = 82;
19882 a0.a0[82] = 83;
19883 a0.a0[83] = 84;
19884 a0.a0[84] = 85;
19885 a0.a0[85] = 86;
19886 a0.a0[86] = 87;
19887 a0.a0[87] = 88;
19888 a0.a0[88] = 89;
19889 a0.a0[89] = 90;
19890 a0.a0[90] = 91;
19891 a0.a0[91] = 92;
19892 a0.a0[92] = 93;
19893 a0.a0[93] = 94;
19894 a0.a0[94] = 95;
19895 a0.a0[95] = 96;
19896 a0.a0[96] = 97;
19897 a0.a0[97] = 98;
19898 a0.a0[98] = 99;
19899 a0.a0[99] = 100;
19900
19901 std::cout
19902 << "Calling TestAsyncPassStructInlineArray100Bytes("
19903 << "(([" << static_cast<int>(a0.a0[0]) << ", "
19904 << static_cast<int>(a0.a0[1]) << ", " << static_cast<int>(a0.a0[2])
19905 << ", " << static_cast<int>(a0.a0[3]) << ", "
19906 << static_cast<int>(a0.a0[4]) << ", " << static_cast<int>(a0.a0[5])
19907 << ", " << static_cast<int>(a0.a0[6]) << ", "
19908 << static_cast<int>(a0.a0[7]) << ", " << static_cast<int>(a0.a0[8])
19909 << ", " << static_cast<int>(a0.a0[9]) << ", "
19910 << static_cast<int>(a0.a0[10]) << ", " << static_cast<int>(a0.a0[11])
19911 << ", " << static_cast<int>(a0.a0[12]) << ", "
19912 << static_cast<int>(a0.a0[13]) << ", " << static_cast<int>(a0.a0[14])
19913 << ", " << static_cast<int>(a0.a0[15]) << ", "
19914 << static_cast<int>(a0.a0[16]) << ", " << static_cast<int>(a0.a0[17])
19915 << ", " << static_cast<int>(a0.a0[18]) << ", "
19916 << static_cast<int>(a0.a0[19]) << ", " << static_cast<int>(a0.a0[20])
19917 << ", " << static_cast<int>(a0.a0[21]) << ", "
19918 << static_cast<int>(a0.a0[22]) << ", " << static_cast<int>(a0.a0[23])
19919 << ", " << static_cast<int>(a0.a0[24]) << ", "
19920 << static_cast<int>(a0.a0[25]) << ", " << static_cast<int>(a0.a0[26])
19921 << ", " << static_cast<int>(a0.a0[27]) << ", "
19922 << static_cast<int>(a0.a0[28]) << ", " << static_cast<int>(a0.a0[29])
19923 << ", " << static_cast<int>(a0.a0[30]) << ", "
19924 << static_cast<int>(a0.a0[31]) << ", " << static_cast<int>(a0.a0[32])
19925 << ", " << static_cast<int>(a0.a0[33]) << ", "
19926 << static_cast<int>(a0.a0[34]) << ", " << static_cast<int>(a0.a0[35])
19927 << ", " << static_cast<int>(a0.a0[36]) << ", "
19928 << static_cast<int>(a0.a0[37]) << ", " << static_cast<int>(a0.a0[38])
19929 << ", " << static_cast<int>(a0.a0[39]) << ", "
19930 << static_cast<int>(a0.a0[40]) << ", " << static_cast<int>(a0.a0[41])
19931 << ", " << static_cast<int>(a0.a0[42]) << ", "
19932 << static_cast<int>(a0.a0[43]) << ", " << static_cast<int>(a0.a0[44])
19933 << ", " << static_cast<int>(a0.a0[45]) << ", "
19934 << static_cast<int>(a0.a0[46]) << ", " << static_cast<int>(a0.a0[47])
19935 << ", " << static_cast<int>(a0.a0[48]) << ", "
19936 << static_cast<int>(a0.a0[49]) << ", " << static_cast<int>(a0.a0[50])
19937 << ", " << static_cast<int>(a0.a0[51]) << ", "
19938 << static_cast<int>(a0.a0[52]) << ", " << static_cast<int>(a0.a0[53])
19939 << ", " << static_cast<int>(a0.a0[54]) << ", "
19940 << static_cast<int>(a0.a0[55]) << ", " << static_cast<int>(a0.a0[56])
19941 << ", " << static_cast<int>(a0.a0[57]) << ", "
19942 << static_cast<int>(a0.a0[58]) << ", " << static_cast<int>(a0.a0[59])
19943 << ", " << static_cast<int>(a0.a0[60]) << ", "
19944 << static_cast<int>(a0.a0[61]) << ", " << static_cast<int>(a0.a0[62])
19945 << ", " << static_cast<int>(a0.a0[63]) << ", "
19946 << static_cast<int>(a0.a0[64]) << ", " << static_cast<int>(a0.a0[65])
19947 << ", " << static_cast<int>(a0.a0[66]) << ", "
19948 << static_cast<int>(a0.a0[67]) << ", " << static_cast<int>(a0.a0[68])
19949 << ", " << static_cast<int>(a0.a0[69]) << ", "
19950 << static_cast<int>(a0.a0[70]) << ", " << static_cast<int>(a0.a0[71])
19951 << ", " << static_cast<int>(a0.a0[72]) << ", "
19952 << static_cast<int>(a0.a0[73]) << ", " << static_cast<int>(a0.a0[74])
19953 << ", " << static_cast<int>(a0.a0[75]) << ", "
19954 << static_cast<int>(a0.a0[76]) << ", " << static_cast<int>(a0.a0[77])
19955 << ", " << static_cast<int>(a0.a0[78]) << ", "
19956 << static_cast<int>(a0.a0[79]) << ", " << static_cast<int>(a0.a0[80])
19957 << ", " << static_cast<int>(a0.a0[81]) << ", "
19958 << static_cast<int>(a0.a0[82]) << ", " << static_cast<int>(a0.a0[83])
19959 << ", " << static_cast<int>(a0.a0[84]) << ", "
19960 << static_cast<int>(a0.a0[85]) << ", " << static_cast<int>(a0.a0[86])
19961 << ", " << static_cast<int>(a0.a0[87]) << ", "
19962 << static_cast<int>(a0.a0[88]) << ", " << static_cast<int>(a0.a0[89])
19963 << ", " << static_cast<int>(a0.a0[90]) << ", "
19964 << static_cast<int>(a0.a0[91]) << ", " << static_cast<int>(a0.a0[92])
19965 << ", " << static_cast<int>(a0.a0[93]) << ", "
19966 << static_cast<int>(a0.a0[94]) << ", " << static_cast<int>(a0.a0[95])
19967 << ", " << static_cast<int>(a0.a0[96]) << ", "
19968 << static_cast<int>(a0.a0[97]) << ", " << static_cast<int>(a0.a0[98])
19969 << ", " << static_cast<int>(a0.a0[99]) << "]))"
19970 << ")\n";
19971
19972 f(a0);
19973}
19974
19975// Used for testing structs and unions by value.
19976// Arguments in FPU registers on arm hardfp and arm64.
19977// 5 struct arguments will exhaust available registers.
19979 // NOLINTNEXTLINE(whitespace/parens)
19990
19991 a0.a0.a0 = -1.0;
19992 a0.a1[0].a0 = 2.0;
19993 a0.a1[1].a0 = -3.0;
19994 a0.a2 = 4.0;
19995 a1.a0.a0 = -5.0;
19996 a1.a1[0].a0 = 6.0;
19997 a1.a1[1].a0 = -7.0;
19998 a1.a2 = 8.0;
19999 a2.a0.a0 = -9.0;
20000 a2.a1[0].a0 = 10.0;
20001 a2.a1[1].a0 = -11.0;
20002 a2.a2 = 12.0;
20003 a3.a0.a0 = -13.0;
20004 a3.a1[0].a0 = 14.0;
20005 a3.a1[1].a0 = -15.0;
20006 a3.a2 = 16.0;
20007 a4.a0.a0 = -17.0;
20008 a4.a1[0].a0 = 18.0;
20009 a4.a1[1].a0 = -19.0;
20010 a4.a2 = 20.0;
20011
20012 std::cout << "Calling TestAsyncPassStructStruct16BytesHomogeneousFloat2x5("
20013 << "(((" << a0.a0.a0 << "), [(" << a0.a1[0].a0 << "), ("
20014 << a0.a1[1].a0 << ")], " << a0.a2 << "), ((" << a1.a0.a0 << "), [("
20015 << a1.a1[0].a0 << "), (" << a1.a1[1].a0 << ")], " << a1.a2
20016 << "), ((" << a2.a0.a0 << "), [(" << a2.a1[0].a0 << "), ("
20017 << a2.a1[1].a0 << ")], " << a2.a2 << "), ((" << a3.a0.a0 << "), [("
20018 << a3.a1[0].a0 << "), (" << a3.a1[1].a0 << ")], " << a3.a2
20019 << "), ((" << a4.a0.a0 << "), [(" << a4.a1[0].a0 << "), ("
20020 << a4.a1[1].a0 << ")], " << a4.a2 << "))"
20021 << ")\n";
20022
20023 f(a0, a1, a2, a3, a4);
20024}
20025
20026// Used for testing structs and unions by value.
20027// Arguments in FPU registers on arm64.
20028// 5 struct arguments will exhaust available registers.
20030 // NOLINTNEXTLINE(whitespace/parens)
20041
20042 a0.a0.a0 = -1.0;
20043 a0.a1[0].a0 = 2.0;
20044 a0.a1[1].a0 = -3.0;
20045 a0.a2 = 4.0;
20046 a1.a0.a0 = -5.0;
20047 a1.a1[0].a0 = 6.0;
20048 a1.a1[1].a0 = -7.0;
20049 a1.a2 = 8.0;
20050 a2.a0.a0 = -9.0;
20051 a2.a1[0].a0 = 10.0;
20052 a2.a1[1].a0 = -11.0;
20053 a2.a2 = 12.0;
20054 a3.a0.a0 = -13.0;
20055 a3.a1[0].a0 = 14.0;
20056 a3.a1[1].a0 = -15.0;
20057 a3.a2 = 16.0;
20058 a4.a0.a0 = -17.0;
20059 a4.a1[0].a0 = 18.0;
20060 a4.a1[1].a0 = -19.0;
20061 a4.a2 = 20.0;
20062
20063 std::cout << "Calling TestAsyncPassStructStruct32BytesHomogeneousDouble2x5("
20064 << "(((" << a0.a0.a0 << "), [(" << a0.a1[0].a0 << "), ("
20065 << a0.a1[1].a0 << ")], " << a0.a2 << "), ((" << a1.a0.a0 << "), [("
20066 << a1.a1[0].a0 << "), (" << a1.a1[1].a0 << ")], " << a1.a2
20067 << "), ((" << a2.a0.a0 << "), [(" << a2.a1[0].a0 << "), ("
20068 << a2.a1[1].a0 << ")], " << a2.a2 << "), ((" << a3.a0.a0 << "), [("
20069 << a3.a1[0].a0 << "), (" << a3.a1[1].a0 << ")], " << a3.a2
20070 << "), ((" << a4.a0.a0 << "), [(" << a4.a1[0].a0 << "), ("
20071 << a4.a1[1].a0 << ")], " << a4.a2 << "))"
20072 << ")\n";
20073
20074 f(a0, a1, a2, a3, a4);
20075}
20076
20077// Used for testing structs and unions by value.
20078// On x64, arguments are split over FP and int registers.
20079// On x64, it will exhaust the integer registers with the 6th argument.
20080// The rest goes on the stack.
20081// On arm, arguments are 4 byte aligned.
20083 // NOLINTNEXTLINE(whitespace/parens)
20084 void (*f)(StructStruct16BytesMixed3 a0,
20104
20105 a0.a0.a0 = -1.0;
20106 a0.a1[0].a0 = 2.0;
20107 a0.a1[0].a1 = -3;
20108 a0.a1[0].a2 = 4;
20109 a0.a2[0] = -5;
20110 a0.a2[1] = 6;
20111 a1.a0.a0 = -7.0;
20112 a1.a1[0].a0 = 8.0;
20113 a1.a1[0].a1 = -9;
20114 a1.a1[0].a2 = 10;
20115 a1.a2[0] = -11;
20116 a1.a2[1] = 12;
20117 a2.a0.a0 = -13.0;
20118 a2.a1[0].a0 = 14.0;
20119 a2.a1[0].a1 = -15;
20120 a2.a1[0].a2 = 16;
20121 a2.a2[0] = -17;
20122 a2.a2[1] = 18;
20123 a3.a0.a0 = -19.0;
20124 a3.a1[0].a0 = 20.0;
20125 a3.a1[0].a1 = -21;
20126 a3.a1[0].a2 = 22;
20127 a3.a2[0] = -23;
20128 a3.a2[1] = 24;
20129 a4.a0.a0 = -25.0;
20130 a4.a1[0].a0 = 26.0;
20131 a4.a1[0].a1 = -27;
20132 a4.a1[0].a2 = 28;
20133 a4.a2[0] = -29;
20134 a4.a2[1] = 30;
20135 a5.a0.a0 = -31.0;
20136 a5.a1[0].a0 = 32.0;
20137 a5.a1[0].a1 = -33;
20138 a5.a1[0].a2 = 34;
20139 a5.a2[0] = -35;
20140 a5.a2[1] = 36;
20141 a6.a0.a0 = -37.0;
20142 a6.a1[0].a0 = 38.0;
20143 a6.a1[0].a1 = -39;
20144 a6.a1[0].a2 = 40;
20145 a6.a2[0] = -41;
20146 a6.a2[1] = 42;
20147 a7.a0.a0 = -43.0;
20148 a7.a1[0].a0 = 44.0;
20149 a7.a1[0].a1 = -45;
20150 a7.a1[0].a2 = 46;
20151 a7.a2[0] = -47;
20152 a7.a2[1] = 48;
20153 a8.a0.a0 = -49.0;
20154 a8.a1[0].a0 = 50.0;
20155 a8.a1[0].a1 = -51;
20156 a8.a1[0].a2 = 52;
20157 a8.a2[0] = -53;
20158 a8.a2[1] = 54;
20159 a9.a0.a0 = -55.0;
20160 a9.a1[0].a0 = 56.0;
20161 a9.a1[0].a1 = -57;
20162 a9.a1[0].a2 = 58;
20163 a9.a2[0] = -59;
20164 a9.a2[1] = 60;
20165
20166 std::cout << "Calling TestAsyncPassStructStruct16BytesMixed3x10("
20167 << "(((" << a0.a0.a0 << "), [(" << a0.a1[0].a0 << ", "
20168 << a0.a1[0].a1 << ", " << a0.a1[0].a2 << ")], [" << a0.a2[0] << ", "
20169 << a0.a2[1] << "]), ((" << a1.a0.a0 << "), [(" << a1.a1[0].a0
20170 << ", " << a1.a1[0].a1 << ", " << a1.a1[0].a2 << ")], [" << a1.a2[0]
20171 << ", " << a1.a2[1] << "]), ((" << a2.a0.a0 << "), [("
20172 << a2.a1[0].a0 << ", " << a2.a1[0].a1 << ", " << a2.a1[0].a2
20173 << ")], [" << a2.a2[0] << ", " << a2.a2[1] << "]), ((" << a3.a0.a0
20174 << "), [(" << a3.a1[0].a0 << ", " << a3.a1[0].a1 << ", "
20175 << a3.a1[0].a2 << ")], [" << a3.a2[0] << ", " << a3.a2[1]
20176 << "]), ((" << a4.a0.a0 << "), [(" << a4.a1[0].a0 << ", "
20177 << a4.a1[0].a1 << ", " << a4.a1[0].a2 << ")], [" << a4.a2[0] << ", "
20178 << a4.a2[1] << "]), ((" << a5.a0.a0 << "), [(" << a5.a1[0].a0
20179 << ", " << a5.a1[0].a1 << ", " << a5.a1[0].a2 << ")], [" << a5.a2[0]
20180 << ", " << a5.a2[1] << "]), ((" << a6.a0.a0 << "), [("
20181 << a6.a1[0].a0 << ", " << a6.a1[0].a1 << ", " << a6.a1[0].a2
20182 << ")], [" << a6.a2[0] << ", " << a6.a2[1] << "]), ((" << a7.a0.a0
20183 << "), [(" << a7.a1[0].a0 << ", " << a7.a1[0].a1 << ", "
20184 << a7.a1[0].a2 << ")], [" << a7.a2[0] << ", " << a7.a2[1]
20185 << "]), ((" << a8.a0.a0 << "), [(" << a8.a1[0].a0 << ", "
20186 << a8.a1[0].a1 << ", " << a8.a1[0].a2 << ")], [" << a8.a2[0] << ", "
20187 << a8.a2[1] << "]), ((" << a9.a0.a0 << "), [(" << a9.a1[0].a0
20188 << ", " << a9.a1[0].a1 << ", " << a9.a1[0].a2 << ")], [" << a9.a2[0]
20189 << ", " << a9.a2[1] << "]))"
20190 << ")\n";
20191
20192 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
20193}
20194
20195// Used for testing structs and unions by value.
20196// Test multi dimensional inline array struct as argument.
20198 // NOLINTNEXTLINE(whitespace/parens)
20199 void (*f)(uint8_t a0,
20201 uint8_t a2,
20203 uint8_t a4,
20205 uint8_t a6)) {
20206 uint8_t a0;
20208 uint8_t a2;
20210 uint8_t a4;
20212 uint8_t a6;
20213
20214 a0 = 1;
20215 a1.a0[0][0][0][0][0] = 2;
20216 a1.a0[0][0][0][0][1] = 3;
20217 a1.a0[0][0][0][1][0] = 4;
20218 a1.a0[0][0][0][1][1] = 5;
20219 a1.a0[0][0][1][0][0] = 6;
20220 a1.a0[0][0][1][0][1] = 7;
20221 a1.a0[0][0][1][1][0] = 8;
20222 a1.a0[0][0][1][1][1] = 9;
20223 a1.a0[0][1][0][0][0] = 10;
20224 a1.a0[0][1][0][0][1] = 11;
20225 a1.a0[0][1][0][1][0] = 12;
20226 a1.a0[0][1][0][1][1] = 13;
20227 a1.a0[0][1][1][0][0] = 14;
20228 a1.a0[0][1][1][0][1] = 15;
20229 a1.a0[0][1][1][1][0] = 16;
20230 a1.a0[0][1][1][1][1] = 17;
20231 a1.a0[1][0][0][0][0] = 18;
20232 a1.a0[1][0][0][0][1] = 19;
20233 a1.a0[1][0][0][1][0] = 20;
20234 a1.a0[1][0][0][1][1] = 21;
20235 a1.a0[1][0][1][0][0] = 22;
20236 a1.a0[1][0][1][0][1] = 23;
20237 a1.a0[1][0][1][1][0] = 24;
20238 a1.a0[1][0][1][1][1] = 25;
20239 a1.a0[1][1][0][0][0] = 26;
20240 a1.a0[1][1][0][0][1] = 27;
20241 a1.a0[1][1][0][1][0] = 28;
20242 a1.a0[1][1][0][1][1] = 29;
20243 a1.a0[1][1][1][0][0] = 30;
20244 a1.a0[1][1][1][0][1] = 31;
20245 a1.a0[1][1][1][1][0] = 32;
20246 a1.a0[1][1][1][1][1] = 33;
20247 a2 = 34;
20248 a3.a0[0][0][0] = 35;
20249 a3.a0[0][0][1] = 36;
20250 a3.a0[0][1][0] = 37;
20251 a3.a0[0][1][1] = 38;
20252 a3.a0[1][0][0] = 39;
20253 a3.a0[1][0][1] = 40;
20254 a3.a0[1][1][0] = 41;
20255 a3.a0[1][1][1] = 42;
20256 a4 = 43;
20257 a5.a0[0][0][0] = 44;
20258 a5.a0[0][0][1] = 45;
20259 a5.a0[0][1][0] = 46;
20260 a5.a0[0][1][1] = 47;
20261 a5.a0[1][0][0] = 48;
20262 a5.a0[1][0][1] = 49;
20263 a5.a0[1][1][0] = 50;
20264 a5.a0[1][1][1] = 51;
20265 a6 = 52;
20266
20267 std::cout
20268 << "Calling TestAsyncPassUint8Struct32BytesInlineArrayMultiDimensionalI("
20269 << "(" << static_cast<int>(a0) << ", ([[[[["
20270 << static_cast<int>(a1.a0[0][0][0][0][0]) << ", "
20271 << static_cast<int>(a1.a0[0][0][0][0][1]) << "], ["
20272 << static_cast<int>(a1.a0[0][0][0][1][0]) << ", "
20273 << static_cast<int>(a1.a0[0][0][0][1][1]) << "]], [["
20274 << static_cast<int>(a1.a0[0][0][1][0][0]) << ", "
20275 << static_cast<int>(a1.a0[0][0][1][0][1]) << "], ["
20276 << static_cast<int>(a1.a0[0][0][1][1][0]) << ", "
20277 << static_cast<int>(a1.a0[0][0][1][1][1]) << "]]], [[["
20278 << static_cast<int>(a1.a0[0][1][0][0][0]) << ", "
20279 << static_cast<int>(a1.a0[0][1][0][0][1]) << "], ["
20280 << static_cast<int>(a1.a0[0][1][0][1][0]) << ", "
20281 << static_cast<int>(a1.a0[0][1][0][1][1]) << "]], [["
20282 << static_cast<int>(a1.a0[0][1][1][0][0]) << ", "
20283 << static_cast<int>(a1.a0[0][1][1][0][1]) << "], ["
20284 << static_cast<int>(a1.a0[0][1][1][1][0]) << ", "
20285 << static_cast<int>(a1.a0[0][1][1][1][1]) << "]]]], [[[["
20286 << static_cast<int>(a1.a0[1][0][0][0][0]) << ", "
20287 << static_cast<int>(a1.a0[1][0][0][0][1]) << "], ["
20288 << static_cast<int>(a1.a0[1][0][0][1][0]) << ", "
20289 << static_cast<int>(a1.a0[1][0][0][1][1]) << "]], [["
20290 << static_cast<int>(a1.a0[1][0][1][0][0]) << ", "
20291 << static_cast<int>(a1.a0[1][0][1][0][1]) << "], ["
20292 << static_cast<int>(a1.a0[1][0][1][1][0]) << ", "
20293 << static_cast<int>(a1.a0[1][0][1][1][1]) << "]]], [[["
20294 << static_cast<int>(a1.a0[1][1][0][0][0]) << ", "
20295 << static_cast<int>(a1.a0[1][1][0][0][1]) << "], ["
20296 << static_cast<int>(a1.a0[1][1][0][1][0]) << ", "
20297 << static_cast<int>(a1.a0[1][1][0][1][1]) << "]], [["
20298 << static_cast<int>(a1.a0[1][1][1][0][0]) << ", "
20299 << static_cast<int>(a1.a0[1][1][1][0][1]) << "], ["
20300 << static_cast<int>(a1.a0[1][1][1][1][0]) << ", "
20301 << static_cast<int>(a1.a0[1][1][1][1][1]) << "]]]]]), "
20302 << static_cast<int>(a2) << ", ([[[" << static_cast<int>(a3.a0[0][0][0])
20303 << ", " << static_cast<int>(a3.a0[0][0][1]) << "], ["
20304 << static_cast<int>(a3.a0[0][1][0]) << ", "
20305 << static_cast<int>(a3.a0[0][1][1]) << "]], [["
20306 << static_cast<int>(a3.a0[1][0][0]) << ", "
20307 << static_cast<int>(a3.a0[1][0][1]) << "], ["
20308 << static_cast<int>(a3.a0[1][1][0]) << ", "
20309 << static_cast<int>(a3.a0[1][1][1]) << "]]]), " << static_cast<int>(a4)
20310 << ", ([[[" << static_cast<int>(a5.a0[0][0][0]) << ", "
20311 << static_cast<int>(a5.a0[0][0][1]) << "], ["
20312 << static_cast<int>(a5.a0[0][1][0]) << ", "
20313 << static_cast<int>(a5.a0[0][1][1]) << "]], [["
20314 << static_cast<int>(a5.a0[1][0][0]) << ", "
20315 << static_cast<int>(a5.a0[1][0][1]) << "], ["
20316 << static_cast<int>(a5.a0[1][1][0]) << ", "
20317 << static_cast<int>(a5.a0[1][1][1]) << "]]]), " << static_cast<int>(a6)
20318 << ")"
20319 << ")\n";
20320
20321 f(a0, a1, a2, a3, a4, a5, a6);
20322}
20323
20324// Used for testing structs and unions by value.
20325// Test struct in multi dimensional inline array.
20327 // NOLINTNEXTLINE(whitespace/parens)
20328 void (*f)(uint8_t a0,
20330 uint8_t a2)) {
20331 uint8_t a0;
20333 uint8_t a2;
20334
20335 a0 = 1;
20336 a1.a0[0][0].a0 = 2;
20337 a1.a0[0][1].a0 = -3;
20338 a1.a0[1][0].a0 = 4;
20339 a1.a0[1][1].a0 = -5;
20340 a2 = 6;
20341
20342 std::cout
20343 << "Calling TestAsyncPassUint8Struct4BytesInlineArrayMultiDimensionalIn("
20344 << "(" << static_cast<int>(a0) << ", ([[("
20345 << static_cast<int>(a1.a0[0][0].a0) << "), ("
20346 << static_cast<int>(a1.a0[0][1].a0) << ")], [("
20347 << static_cast<int>(a1.a0[1][0].a0) << "), ("
20348 << static_cast<int>(a1.a0[1][1].a0) << ")]]), " << static_cast<int>(a2)
20349 << ")"
20350 << ")\n";
20351
20352 f(a0, a1, a2);
20353}
20354
20355// Used for testing structs and unions by value.
20356// Small struct with mis-aligned member.
20358 // NOLINTNEXTLINE(whitespace/parens)
20359 void (*f)(Struct3BytesPackedInt a0,
20369 Struct3BytesPackedInt a0 = {};
20370 Struct3BytesPackedInt a1 = {};
20371 Struct3BytesPackedInt a2 = {};
20372 Struct3BytesPackedInt a3 = {};
20373 Struct3BytesPackedInt a4 = {};
20374 Struct3BytesPackedInt a5 = {};
20375 Struct3BytesPackedInt a6 = {};
20376 Struct3BytesPackedInt a7 = {};
20377 Struct3BytesPackedInt a8 = {};
20378 Struct3BytesPackedInt a9 = {};
20379
20380 a0.a0 = -1;
20381 a0.a1 = 2;
20382 a1.a0 = -3;
20383 a1.a1 = 4;
20384 a2.a0 = -5;
20385 a2.a1 = 6;
20386 a3.a0 = -7;
20387 a3.a1 = 8;
20388 a4.a0 = -9;
20389 a4.a1 = 10;
20390 a5.a0 = -11;
20391 a5.a1 = 12;
20392 a6.a0 = -13;
20393 a6.a1 = 14;
20394 a7.a0 = -15;
20395 a7.a1 = 16;
20396 a8.a0 = -17;
20397 a8.a1 = 18;
20398 a9.a0 = -19;
20399 a9.a1 = 20;
20400
20401 std::cout << "Calling TestAsyncPassStruct3BytesPackedIntx10("
20402 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << "), ("
20403 << static_cast<int>(a1.a0) << ", " << a1.a1 << "), ("
20404 << static_cast<int>(a2.a0) << ", " << a2.a1 << "), ("
20405 << static_cast<int>(a3.a0) << ", " << a3.a1 << "), ("
20406 << static_cast<int>(a4.a0) << ", " << a4.a1 << "), ("
20407 << static_cast<int>(a5.a0) << ", " << a5.a1 << "), ("
20408 << static_cast<int>(a6.a0) << ", " << a6.a1 << "), ("
20409 << static_cast<int>(a7.a0) << ", " << a7.a1 << "), ("
20410 << static_cast<int>(a8.a0) << ", " << a8.a1 << "), ("
20411 << static_cast<int>(a9.a0) << ", " << a9.a1 << "))"
20412 << ")\n";
20413
20414 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
20415}
20416
20417// Used for testing structs and unions by value.
20418// Struct with mis-aligned member.
20420 // NOLINTNEXTLINE(whitespace/parens)
20421 void (*f)(Struct8BytesPackedInt a0,
20431 Struct8BytesPackedInt a0 = {};
20432 Struct8BytesPackedInt a1 = {};
20433 Struct8BytesPackedInt a2 = {};
20434 Struct8BytesPackedInt a3 = {};
20435 Struct8BytesPackedInt a4 = {};
20436 Struct8BytesPackedInt a5 = {};
20437 Struct8BytesPackedInt a6 = {};
20438 Struct8BytesPackedInt a7 = {};
20439 Struct8BytesPackedInt a8 = {};
20440 Struct8BytesPackedInt a9 = {};
20441
20442 a0.a0 = 1;
20443 a0.a1 = 2;
20444 a0.a2 = 3;
20445 a0.a3 = 4;
20446 a0.a4 = 5;
20447 a1.a0 = 6;
20448 a1.a1 = 7;
20449 a1.a2 = 8;
20450 a1.a3 = 9;
20451 a1.a4 = 10;
20452 a2.a0 = 11;
20453 a2.a1 = 12;
20454 a2.a2 = 13;
20455 a2.a3 = 14;
20456 a2.a4 = 15;
20457 a3.a0 = 16;
20458 a3.a1 = 17;
20459 a3.a2 = 18;
20460 a3.a3 = 19;
20461 a3.a4 = 20;
20462 a4.a0 = 21;
20463 a4.a1 = 22;
20464 a4.a2 = 23;
20465 a4.a3 = 24;
20466 a4.a4 = 25;
20467 a5.a0 = 26;
20468 a5.a1 = 27;
20469 a5.a2 = 28;
20470 a5.a3 = 29;
20471 a5.a4 = 30;
20472 a6.a0 = 31;
20473 a6.a1 = 32;
20474 a6.a2 = 33;
20475 a6.a3 = 34;
20476 a6.a4 = 35;
20477 a7.a0 = 36;
20478 a7.a1 = 37;
20479 a7.a2 = 38;
20480 a7.a3 = 39;
20481 a7.a4 = 40;
20482 a8.a0 = 41;
20483 a8.a1 = 42;
20484 a8.a2 = 43;
20485 a8.a3 = 44;
20486 a8.a4 = 45;
20487 a9.a0 = 46;
20488 a9.a1 = 47;
20489 a9.a2 = 48;
20490 a9.a3 = 49;
20491 a9.a4 = 50;
20492
20493 std::cout << "Calling TestAsyncPassStruct8BytesPackedIntx10("
20494 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
20495 << static_cast<int>(a0.a2) << ", " << static_cast<int>(a0.a3)
20496 << ", " << static_cast<int>(a0.a4) << "), ("
20497 << static_cast<int>(a1.a0) << ", " << a1.a1 << ", "
20498 << static_cast<int>(a1.a2) << ", " << static_cast<int>(a1.a3)
20499 << ", " << static_cast<int>(a1.a4) << "), ("
20500 << static_cast<int>(a2.a0) << ", " << a2.a1 << ", "
20501 << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3)
20502 << ", " << static_cast<int>(a2.a4) << "), ("
20503 << static_cast<int>(a3.a0) << ", " << a3.a1 << ", "
20504 << static_cast<int>(a3.a2) << ", " << static_cast<int>(a3.a3)
20505 << ", " << static_cast<int>(a3.a4) << "), ("
20506 << static_cast<int>(a4.a0) << ", " << a4.a1 << ", "
20507 << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3)
20508 << ", " << static_cast<int>(a4.a4) << "), ("
20509 << static_cast<int>(a5.a0) << ", " << a5.a1 << ", "
20510 << static_cast<int>(a5.a2) << ", " << static_cast<int>(a5.a3)
20511 << ", " << static_cast<int>(a5.a4) << "), ("
20512 << static_cast<int>(a6.a0) << ", " << a6.a1 << ", "
20513 << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3)
20514 << ", " << static_cast<int>(a6.a4) << "), ("
20515 << static_cast<int>(a7.a0) << ", " << a7.a1 << ", "
20516 << static_cast<int>(a7.a2) << ", " << static_cast<int>(a7.a3)
20517 << ", " << static_cast<int>(a7.a4) << "), ("
20518 << static_cast<int>(a8.a0) << ", " << a8.a1 << ", "
20519 << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3)
20520 << ", " << static_cast<int>(a8.a4) << "), ("
20521 << static_cast<int>(a9.a0) << ", " << a9.a1 << ", "
20522 << static_cast<int>(a9.a2) << ", " << static_cast<int>(a9.a3)
20523 << ", " << static_cast<int>(a9.a4) << "))"
20524 << ")\n";
20525
20526 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
20527}
20528
20529// Used for testing structs and unions by value.
20530// Struct with mis-aligned member.
20531// Tests backfilling of CPU and FPU registers.
20533 // NOLINTNEXTLINE(whitespace/parens)
20534 void (*f)(Struct9BytesPackedMixed a0,
20544 double a10,
20545 int32_t a11,
20546 int32_t a12)) {
20557 double a10;
20558 int32_t a11;
20559 int32_t a12;
20560
20561 a0.a0 = 1;
20562 a0.a1 = 2.0;
20563 a1.a0 = 3;
20564 a1.a1 = 4.0;
20565 a2.a0 = 5;
20566 a2.a1 = 6.0;
20567 a3.a0 = 7;
20568 a3.a1 = 8.0;
20569 a4.a0 = 9;
20570 a4.a1 = 10.0;
20571 a5.a0 = 11;
20572 a5.a1 = 12.0;
20573 a6.a0 = 13;
20574 a6.a1 = 14.0;
20575 a7.a0 = 15;
20576 a7.a1 = 16.0;
20577 a8.a0 = 17;
20578 a8.a1 = 18.0;
20579 a9.a0 = 19;
20580 a9.a1 = 20.0;
20581 a10 = -21.0;
20582 a11 = 22;
20583 a12 = -23;
20584
20585 std::cout << "Calling TestAsyncPassStruct9BytesPackedMixedx10DoubleInt32x2("
20586 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << "), ("
20587 << static_cast<int>(a1.a0) << ", " << a1.a1 << "), ("
20588 << static_cast<int>(a2.a0) << ", " << a2.a1 << "), ("
20589 << static_cast<int>(a3.a0) << ", " << a3.a1 << "), ("
20590 << static_cast<int>(a4.a0) << ", " << a4.a1 << "), ("
20591 << static_cast<int>(a5.a0) << ", " << a5.a1 << "), ("
20592 << static_cast<int>(a6.a0) << ", " << a6.a1 << "), ("
20593 << static_cast<int>(a7.a0) << ", " << a7.a1 << "), ("
20594 << static_cast<int>(a8.a0) << ", " << a8.a1 << "), ("
20595 << static_cast<int>(a9.a0) << ", " << a9.a1 << "), " << a10 << ", "
20596 << a11 << ", " << a12 << ")"
20597 << ")\n";
20598
20599 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
20600}
20601
20602// Used for testing structs and unions by value.
20603// This packed struct happens to have only aligned members.
20605 // NOLINTNEXTLINE(whitespace/parens)
20606 void (*f)(Struct5BytesPackedMixed a0)) {
20608
20609 a0.a0 = -1.0;
20610 a0.a1 = 2;
20611
20612 std::cout << "Calling TestAsyncPassStruct5BytesPackedMixed("
20613 << "((" << a0.a0 << ", " << static_cast<int>(a0.a1) << "))"
20614 << ")\n";
20615
20616 f(a0);
20617}
20618
20619// Used for testing structs and unions by value.
20620// Check alignment of packed struct in non-packed struct.
20622 // NOLINTNEXTLINE(whitespace/parens)
20625
20626 a0.a0 = 1;
20627 a0.a1.a0 = 2.0;
20628 a0.a1.a1 = 3;
20629
20630 std::cout
20631 << "Calling TestAsyncPassStructNestedAlignmentStruct5BytesPackedMixed("
20632 << "((" << static_cast<int>(a0.a0) << ", (" << a0.a1.a0 << ", "
20633 << static_cast<int>(a0.a1.a1) << ")))"
20634 << ")\n";
20635
20636 f(a0);
20637}
20638
20639// Used for testing structs and unions by value.
20640// Check alignment of packed struct array in non-packed struct.
20642 // NOLINTNEXTLINE(whitespace/parens)
20643 void (*f)(Struct6BytesInlineArrayInt a0)) {
20645
20646 a0.a0[0].a0 = -1;
20647 a0.a0[0].a1 = 2;
20648 a0.a0[1].a0 = -3;
20649 a0.a0[1].a1 = 4;
20650
20651 std::cout << "Calling TestAsyncPassStruct6BytesInlineArrayInt("
20652 << "(([(" << static_cast<int>(a0.a0[0].a0) << ", " << a0.a0[0].a1
20653 << "), (" << static_cast<int>(a0.a0[1].a0) << ", " << a0.a0[1].a1
20654 << ")]))"
20655 << ")\n";
20656
20657 f(a0);
20658}
20659
20660// Used for testing structs and unions by value.
20661// Check alignment of packed struct array in non-packed struct.
20663 // NOLINTNEXTLINE(whitespace/parens)
20664 void (*f)(Struct15BytesInlineArrayMixed a0)) {
20666
20667 a0.a0[0].a0 = -1.0;
20668 a0.a0[0].a1 = 2;
20669 a0.a0[1].a0 = -3.0;
20670 a0.a0[1].a1 = 4;
20671 a0.a0[2].a0 = -5.0;
20672 a0.a0[2].a1 = 6;
20673
20674 std::cout << "Calling TestAsyncPassStruct15BytesInlineArrayMixed("
20675 << "(([(" << a0.a0[0].a0 << ", " << static_cast<int>(a0.a0[0].a1)
20676 << "), (" << a0.a0[1].a0 << ", " << static_cast<int>(a0.a0[1].a1)
20677 << "), (" << a0.a0[2].a0 << ", " << static_cast<int>(a0.a0[2].a1)
20678 << ")]))"
20679 << ")\n";
20680
20681 f(a0);
20682}
20683
20684// Used for testing structs and unions by value.
20685// Check placement of mixed integer/float union.
20687 // NOLINTNEXTLINE(whitespace/parens)
20688 void (*f)(Union4BytesMixed a0,
20697 Union4BytesMixed a9)) {
20698 Union4BytesMixed a0 = {};
20699 Union4BytesMixed a1 = {};
20700 Union4BytesMixed a2 = {};
20701 Union4BytesMixed a3 = {};
20702 Union4BytesMixed a4 = {};
20703 Union4BytesMixed a5 = {};
20704 Union4BytesMixed a6 = {};
20705 Union4BytesMixed a7 = {};
20706 Union4BytesMixed a8 = {};
20707 Union4BytesMixed a9 = {};
20708
20709 a0.a0 = 1;
20710 a1.a0 = 2;
20711 a2.a0 = 3;
20712 a3.a0 = 4;
20713 a4.a0 = 5;
20714 a5.a0 = 6;
20715 a6.a0 = 7;
20716 a7.a0 = 8;
20717 a8.a0 = 9;
20718 a9.a0 = 10;
20719
20720 std::cout << "Calling TestAsyncPassUnion4BytesMixedx10("
20721 << "((" << a0.a0 << "), (" << a1.a0 << "), (" << a2.a0 << "), ("
20722 << a3.a0 << "), (" << a4.a0 << "), (" << a5.a0 << "), (" << a6.a0
20723 << "), (" << a7.a0 << "), (" << a8.a0 << "), (" << a9.a0 << "))"
20724 << ")\n";
20725
20726 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
20727}
20728
20729// Used for testing structs and unions by value.
20730// Check placement of mixed floats union.
20732 // NOLINTNEXTLINE(whitespace/parens)
20733 void (*f)(Union8BytesNestedFloat a0,
20743 Union8BytesNestedFloat a0 = {};
20744 Union8BytesNestedFloat a1 = {};
20745 Union8BytesNestedFloat a2 = {};
20746 Union8BytesNestedFloat a3 = {};
20747 Union8BytesNestedFloat a4 = {};
20748 Union8BytesNestedFloat a5 = {};
20749 Union8BytesNestedFloat a6 = {};
20750 Union8BytesNestedFloat a7 = {};
20751 Union8BytesNestedFloat a8 = {};
20752 Union8BytesNestedFloat a9 = {};
20753
20754 a0.a0 = -1.0;
20755 a1.a0 = 2.0;
20756 a2.a0 = -3.0;
20757 a3.a0 = 4.0;
20758 a4.a0 = -5.0;
20759 a5.a0 = 6.0;
20760 a6.a0 = -7.0;
20761 a7.a0 = 8.0;
20762 a8.a0 = -9.0;
20763 a9.a0 = 10.0;
20764
20765 std::cout << "Calling TestAsyncPassUnion8BytesNestedFloatx10("
20766 << "((" << a0.a0 << "), (" << a1.a0 << "), (" << a2.a0 << "), ("
20767 << a3.a0 << "), (" << a4.a0 << "), (" << a5.a0 << "), (" << a6.a0
20768 << "), (" << a7.a0 << "), (" << a8.a0 << "), (" << a9.a0 << "))"
20769 << ")\n";
20770
20771 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
20772}
20773
20774// Used for testing structs and unions by value.
20775// Mixed-size union argument.
20777 // NOLINTNEXTLINE(whitespace/parens)
20778 void (*f)(Union9BytesNestedInt a0,
20788 Union9BytesNestedInt a0 = {};
20789 Union9BytesNestedInt a1 = {};
20790 Union9BytesNestedInt a2 = {};
20791 Union9BytesNestedInt a3 = {};
20792 Union9BytesNestedInt a4 = {};
20793 Union9BytesNestedInt a5 = {};
20794 Union9BytesNestedInt a6 = {};
20795 Union9BytesNestedInt a7 = {};
20796 Union9BytesNestedInt a8 = {};
20797 Union9BytesNestedInt a9 = {};
20798
20799 a0.a0.a0 = -1;
20800 a0.a0.a1 = 2;
20801 a0.a0.a2 = -3;
20802 a1.a0.a0 = 4;
20803 a1.a0.a1 = -5;
20804 a1.a0.a2 = 6;
20805 a2.a0.a0 = -7;
20806 a2.a0.a1 = 8;
20807 a2.a0.a2 = -9;
20808 a3.a0.a0 = 10;
20809 a3.a0.a1 = -11;
20810 a3.a0.a2 = 12;
20811 a4.a0.a0 = -13;
20812 a4.a0.a1 = 14;
20813 a4.a0.a2 = -15;
20814 a5.a0.a0 = 16;
20815 a5.a0.a1 = -17;
20816 a5.a0.a2 = 18;
20817 a6.a0.a0 = -19;
20818 a6.a0.a1 = 20;
20819 a6.a0.a2 = -21;
20820 a7.a0.a0 = 22;
20821 a7.a0.a1 = -23;
20822 a7.a0.a2 = 24;
20823 a8.a0.a0 = -25;
20824 a8.a0.a1 = 26;
20825 a8.a0.a2 = -27;
20826 a9.a0.a0 = 28;
20827 a9.a0.a1 = -29;
20828 a9.a0.a2 = 30;
20829
20830 std::cout << "Calling TestAsyncPassUnion9BytesNestedIntx10("
20831 << "(((" << a0.a0.a0 << ", " << a0.a0.a1 << ", " << a0.a0.a2
20832 << ")), ((" << a1.a0.a0 << ", " << a1.a0.a1 << ", " << a1.a0.a2
20833 << ")), ((" << a2.a0.a0 << ", " << a2.a0.a1 << ", " << a2.a0.a2
20834 << ")), ((" << a3.a0.a0 << ", " << a3.a0.a1 << ", " << a3.a0.a2
20835 << ")), ((" << a4.a0.a0 << ", " << a4.a0.a1 << ", " << a4.a0.a2
20836 << ")), ((" << a5.a0.a0 << ", " << a5.a0.a1 << ", " << a5.a0.a2
20837 << ")), ((" << a6.a0.a0 << ", " << a6.a0.a1 << ", " << a6.a0.a2
20838 << ")), ((" << a7.a0.a0 << ", " << a7.a0.a1 << ", " << a7.a0.a2
20839 << ")), ((" << a8.a0.a0 << ", " << a8.a0.a1 << ", " << a8.a0.a2
20840 << ")), ((" << a9.a0.a0 << ", " << a9.a0.a1 << ", " << a9.a0.a2
20841 << ")))"
20842 << ")\n";
20843
20844 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
20845}
20846
20847// Used for testing structs and unions by value.
20848// Union with homogenous floats.
20850 // NOLINTNEXTLINE(whitespace/parens)
20871
20872 a0.a0[0] = -1.0;
20873 a0.a0[1] = 2.0;
20874 a0.a0[2] = -3.0;
20875 a0.a0[3] = 4.0;
20876 a1.a0[0] = -5.0;
20877 a1.a0[1] = 6.0;
20878 a1.a0[2] = -7.0;
20879 a1.a0[3] = 8.0;
20880 a2.a0[0] = -9.0;
20881 a2.a0[1] = 10.0;
20882 a2.a0[2] = -11.0;
20883 a2.a0[3] = 12.0;
20884 a3.a0[0] = -13.0;
20885 a3.a0[1] = 14.0;
20886 a3.a0[2] = -15.0;
20887 a3.a0[3] = 16.0;
20888 a4.a0[0] = -17.0;
20889 a4.a0[1] = 18.0;
20890 a4.a0[2] = -19.0;
20891 a4.a0[3] = 20.0;
20892 a5.a0[0] = -21.0;
20893 a5.a0[1] = 22.0;
20894 a5.a0[2] = -23.0;
20895 a5.a0[3] = 24.0;
20896 a6.a0[0] = -25.0;
20897 a6.a0[1] = 26.0;
20898 a6.a0[2] = -27.0;
20899 a6.a0[3] = 28.0;
20900 a7.a0[0] = -29.0;
20901 a7.a0[1] = 30.0;
20902 a7.a0[2] = -31.0;
20903 a7.a0[3] = 32.0;
20904 a8.a0[0] = -33.0;
20905 a8.a0[1] = 34.0;
20906 a8.a0[2] = -35.0;
20907 a8.a0[3] = 36.0;
20908 a9.a0[0] = -37.0;
20909 a9.a0[1] = 38.0;
20910 a9.a0[2] = -39.0;
20911 a9.a0[3] = 40.0;
20912
20913 std::cout << "Calling TestAsyncPassUnion16BytesNestedInlineArrayFloatx10("
20914 << "(([" << a0.a0[0] << ", " << a0.a0[1] << ", " << a0.a0[2] << ", "
20915 << a0.a0[3] << "]), ([" << a1.a0[0] << ", " << a1.a0[1] << ", "
20916 << a1.a0[2] << ", " << a1.a0[3] << "]), ([" << a2.a0[0] << ", "
20917 << a2.a0[1] << ", " << a2.a0[2] << ", " << a2.a0[3] << "]), (["
20918 << a3.a0[0] << ", " << a3.a0[1] << ", " << a3.a0[2] << ", "
20919 << a3.a0[3] << "]), ([" << a4.a0[0] << ", " << a4.a0[1] << ", "
20920 << a4.a0[2] << ", " << a4.a0[3] << "]), ([" << a5.a0[0] << ", "
20921 << a5.a0[1] << ", " << a5.a0[2] << ", " << a5.a0[3] << "]), (["
20922 << a6.a0[0] << ", " << a6.a0[1] << ", " << a6.a0[2] << ", "
20923 << a6.a0[3] << "]), ([" << a7.a0[0] << ", " << a7.a0[1] << ", "
20924 << a7.a0[2] << ", " << a7.a0[3] << "]), ([" << a8.a0[0] << ", "
20925 << a8.a0[1] << ", " << a8.a0[2] << ", " << a8.a0[3] << "]), (["
20926 << a9.a0[0] << ", " << a9.a0[1] << ", " << a9.a0[2] << ", "
20927 << a9.a0[3] << "]))"
20928 << ")\n";
20929
20930 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
20931}
20932
20933// Used for testing structs and unions by value.
20934// Union with homogenous floats.
20936 // NOLINTNEXTLINE(whitespace/parens)
20937 void (*f)(Union16BytesNestedFloat a0,
20957
20958 a0.a0.a0 = -1.0;
20959 a0.a0.a1 = 2.0;
20960 a1.a0.a0 = -3.0;
20961 a1.a0.a1 = 4.0;
20962 a2.a0.a0 = -5.0;
20963 a2.a0.a1 = 6.0;
20964 a3.a0.a0 = -7.0;
20965 a3.a0.a1 = 8.0;
20966 a4.a0.a0 = -9.0;
20967 a4.a0.a1 = 10.0;
20968 a5.a0.a0 = -11.0;
20969 a5.a0.a1 = 12.0;
20970 a6.a0.a0 = -13.0;
20971 a6.a0.a1 = 14.0;
20972 a7.a0.a0 = -15.0;
20973 a7.a0.a1 = 16.0;
20974 a8.a0.a0 = -17.0;
20975 a8.a0.a1 = 18.0;
20976 a9.a0.a0 = -19.0;
20977 a9.a0.a1 = 20.0;
20978
20979 std::cout << "Calling TestAsyncPassUnion16BytesNestedFloatx10("
20980 << "(((" << a0.a0.a0 << ", " << a0.a0.a1 << ")), ((" << a1.a0.a0
20981 << ", " << a1.a0.a1 << ")), ((" << a2.a0.a0 << ", " << a2.a0.a1
20982 << ")), ((" << a3.a0.a0 << ", " << a3.a0.a1 << ")), ((" << a4.a0.a0
20983 << ", " << a4.a0.a1 << ")), ((" << a5.a0.a0 << ", " << a5.a0.a1
20984 << ")), ((" << a6.a0.a0 << ", " << a6.a0.a1 << ")), ((" << a7.a0.a0
20985 << ", " << a7.a0.a1 << ")), ((" << a8.a0.a0 << ", " << a8.a0.a1
20986 << ")), ((" << a9.a0.a0 << ", " << a9.a0.a1 << ")))"
20987 << ")\n";
20988
20989 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
20990}
20991
20992// Used for testing structs and unions by value.
20993// Passing bools and a struct with bools.
20994// Exhausts the registers to test bools and the bool struct alignment on the
20995// stack.
20997 // NOLINTNEXTLINE(whitespace/parens)
20998 void (*f)(uint8_t a0,
20999 bool a1,
21000 bool a2,
21001 bool a3,
21002 bool a4,
21003 bool a5,
21004 bool a6,
21005 bool a7,
21006 bool a8,
21007 bool a9,
21009 bool a11)) {
21010 uint8_t a0;
21011 bool a1;
21012 bool a2;
21013 bool a3;
21014 bool a4;
21015 bool a5;
21016 bool a6;
21017 bool a7;
21018 bool a8;
21019 bool a9;
21021 bool a11;
21022
21023 a0 = 1;
21024 a1 = false;
21025 a2 = true;
21026 a3 = false;
21027 a4 = true;
21028 a5 = false;
21029 a6 = true;
21030 a7 = false;
21031 a8 = true;
21032 a9 = false;
21033 a10.a0 = true;
21034 a10.a1 = false;
21035 a10.a2 = true;
21036 a10.a3 = false;
21037 a10.a4 = true;
21038 a10.a5 = false;
21039 a10.a6 = true;
21040 a10.a7 = false;
21041 a10.a8 = true;
21042 a10.a9 = false;
21043 a11 = true;
21044
21045 std::cout
21046 << "Calling TestAsyncPassUint8Boolx9Struct10BytesHomogeneousBoolBool("
21047 << "(" << static_cast<int>(a0) << ", " << a1 << ", " << a2 << ", " << a3
21048 << ", " << a4 << ", " << a5 << ", " << a6 << ", " << a7 << ", " << a8
21049 << ", " << a9 << ", (" << a10.a0 << ", " << a10.a1 << ", " << a10.a2
21050 << ", " << a10.a3 << ", " << a10.a4 << ", " << a10.a5 << ", " << a10.a6
21051 << ", " << a10.a7 << ", " << a10.a8 << ", " << a10.a9 << "), " << a11
21052 << ")"
21053 << ")\n";
21054
21055 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
21056}
21057
21058// Used for testing structs and unions by value.
21059// Passing bools and a struct with bools.
21060// Exhausts the registers to test bools and the bool struct alignment on the
21061// stack.
21063 // NOLINTNEXTLINE(whitespace/parens)
21064 void (*f)(uint8_t a0,
21065 bool a1,
21066 bool a2,
21067 bool a3,
21068 bool a4,
21069 bool a5,
21070 bool a6,
21071 bool a7,
21072 bool a8,
21073 bool a9,
21075 bool a11)) {
21076 uint8_t a0;
21077 bool a1;
21078 bool a2;
21079 bool a3;
21080 bool a4;
21081 bool a5;
21082 bool a6;
21083 bool a7;
21084 bool a8;
21085 bool a9;
21087 bool a11;
21088
21089 a0 = 1;
21090 a1 = false;
21091 a2 = true;
21092 a3 = false;
21093 a4 = true;
21094 a5 = false;
21095 a6 = true;
21096 a7 = false;
21097 a8 = true;
21098 a9 = false;
21099 a10.a0[0] = true;
21100 a10.a0[1] = false;
21101 a10.a0[2] = true;
21102 a10.a0[3] = false;
21103 a10.a0[4] = true;
21104 a10.a0[5] = false;
21105 a10.a0[6] = true;
21106 a10.a0[7] = false;
21107 a10.a0[8] = true;
21108 a10.a0[9] = false;
21109 a11 = true;
21110
21111 std::cout
21112 << "Calling TestAsyncPassUint8Boolx9Struct10BytesInlineArrayBoolBool("
21113 << "(" << static_cast<int>(a0) << ", " << a1 << ", " << a2 << ", " << a3
21114 << ", " << a4 << ", " << a5 << ", " << a6 << ", " << a7 << ", " << a8
21115 << ", " << a9 << ", ([" << a10.a0[0] << ", " << a10.a0[1] << ", "
21116 << a10.a0[2] << ", " << a10.a0[3] << ", " << a10.a0[4] << ", "
21117 << a10.a0[5] << ", " << a10.a0[6] << ", " << a10.a0[7] << ", "
21118 << a10.a0[8] << ", " << a10.a0[9] << "]), " << a11 << ")"
21119 << ")\n";
21120
21121 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
21122}
21123
21124// Used for testing structs and unions by value.
21125// Returning a bool.
21127 // NOLINTNEXTLINE(whitespace/parens)
21128 void (*f)(uint8_t a0, Struct1ByteBool a1)) {
21129 uint8_t a0;
21130 Struct1ByteBool a1 = {};
21131
21132 a0 = 1;
21133 a1.a0 = false;
21134
21135 std::cout << "Calling TestAsyncPassUint8Struct1ByteBool("
21136 << "(" << static_cast<int>(a0) << ", (" << a1.a0 << "))"
21137 << ")\n";
21138
21139 f(a0, a1);
21140}
21141
21142// Used for testing structs and unions by value.
21143// Returning a wchar.
21145 // NOLINTNEXTLINE(whitespace/parens)
21146 void (*f)(wchar_t a0,
21148 uintptr_t a2,
21149 uintptr_t a3,
21150 /* NOLINT(runtime/int) */ long a4,
21151 /* NOLINT(runtime/int) */ unsigned long a5)) {
21152 wchar_t a0;
21153 StructInlineArrayInt a1 = {};
21154 uintptr_t a2;
21155 uintptr_t a3;
21156 /* NOLINT(runtime/int) */ long a4;
21157 /* NOLINT(runtime/int) */ unsigned long a5;
21158
21159 a0 = 1;
21160 a1.a0[0] = 2;
21161 a1.a0[1] = 3;
21162 a1.a0[2] = 4;
21163 a1.a0[3] = 5;
21164 a1.a0[4] = 6;
21165 a1.a0[5] = 7;
21166 a1.a0[6] = 8;
21167 a1.a0[7] = 9;
21168 a1.a0[8] = 10;
21169 a1.a0[9] = 11;
21170 a2 = 12;
21171 a3 = 13;
21172 a4 = 14;
21173 a5 = 15;
21174
21175 std::cout
21176 << "Calling TestAsyncPassWCharStructInlineArrayIntUintPtrx2LongUnsigned("
21177 << "(" << a0 << ", ([" << a1.a0[0] << ", " << a1.a0[1] << ", " << a1.a0[2]
21178 << ", " << a1.a0[3] << ", " << a1.a0[4] << ", " << a1.a0[5] << ", "
21179 << a1.a0[6] << ", " << a1.a0[7] << ", " << a1.a0[8] << ", " << a1.a0[9]
21180 << "]), " << a2 << ", " << a3 << ", " << a4 << ", " << a5 << ")"
21181 << ")\n";
21182
21183 f(a0, a1, a2, a3, a4, a5);
21184}
21185
21186// Used for testing structs and unions by value.
21187// Struct stradles last argument register
21189 // NOLINTNEXTLINE(whitespace/parens)
21190 void (*f)(int64_t a0,
21191 int64_t a1,
21192 int64_t a2,
21193 int64_t a3,
21194 int64_t a4,
21195 int64_t a5,
21196 int64_t a6,
21198 int64_t a0;
21199 int64_t a1;
21200 int64_t a2;
21201 int64_t a3;
21202 int64_t a4;
21203 int64_t a5;
21204 int64_t a6;
21206
21207 a0 = -1;
21208 a1 = 2;
21209 a2 = -3;
21210 a3 = 4;
21211 a4 = -5;
21212 a5 = 6;
21213 a6 = -7;
21214 a7.a0 = 8;
21215 a7.a1 = -9;
21216 a7.a2 = 10;
21217
21218 std::cout << "Calling TestAsyncPassInt64x7Struct12BytesHomogeneousInt32("
21219 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
21220 << ", " << a5 << ", " << a6 << ", (" << a7.a0 << ", " << a7.a1
21221 << ", " << a7.a2 << "))"
21222 << ")\n";
21223
21224 f(a0, a1, a2, a3, a4, a5, a6, a7);
21225}
21226
21227// Used for testing structs and unions by value.
21228// Smallest struct with data.
21230 // NOLINTNEXTLINE(whitespace/parens)
21231 void (*f)(int8_t a0)) {
21232 int8_t a0;
21233
21234 a0 = -1;
21235
21236 std::cout << "Calling TestAsyncReturnStruct1ByteInt("
21237 << "(" << static_cast<int>(a0) << ")"
21238 << ")\n";
21239
21240 f(a0);
21241}
21242
21243// Used for testing structs and unions by value.
21244// Smaller than word size return value on all architectures.
21246 // NOLINTNEXTLINE(whitespace/parens)
21247 void (*f)(uint8_t a0, uint8_t a1, uint8_t a2)) {
21248 uint8_t a0;
21249 uint8_t a1;
21250 uint8_t a2;
21251
21252 a0 = 1;
21253 a1 = 2;
21254 a2 = 3;
21255
21256 std::cout << "Calling TestAsyncReturnStruct3BytesHomogeneousUint8("
21257 << "(" << static_cast<int>(a0) << ", " << static_cast<int>(a1)
21258 << ", " << static_cast<int>(a2) << ")"
21259 << ")\n";
21260
21261 f(a0, a1, a2);
21262}
21263
21264// Used for testing structs and unions by value.
21265// Smaller than word size return value on all architectures.
21266// With alignment rules taken into account size is 4 bytes.
21268 // NOLINTNEXTLINE(whitespace/parens)
21269 void (*f)(int16_t a0, int8_t a1)) {
21270 int16_t a0;
21271 int8_t a1;
21272
21273 a0 = -1;
21274 a1 = 2;
21275
21276 std::cout << "Calling TestAsyncReturnStruct3BytesInt2ByteAligned("
21277 << "(" << a0 << ", " << static_cast<int>(a1) << ")"
21278 << ")\n";
21279
21280 f(a0, a1);
21281}
21282
21283// Used for testing structs and unions by value.
21284// Word size return value on 32 bit architectures..
21286 // NOLINTNEXTLINE(whitespace/parens)
21287 void (*f)(int16_t a0, int16_t a1)) {
21288 int16_t a0;
21289 int16_t a1;
21290
21291 a0 = -1;
21292 a1 = 2;
21293
21294 std::cout << "Calling TestAsyncReturnStruct4BytesHomogeneousInt16("
21295 << "(" << a0 << ", " << a1 << ")"
21296 << ")\n";
21297
21298 f(a0, a1);
21299}
21300
21301// Used for testing structs and unions by value.
21302// Non-wordsize return value.
21304 // NOLINTNEXTLINE(whitespace/parens)
21305 void (*f)(uint8_t a0,
21306 uint8_t a1,
21307 uint8_t a2,
21308 uint8_t a3,
21309 uint8_t a4,
21310 uint8_t a5,
21311 uint8_t a6)) {
21312 uint8_t a0;
21313 uint8_t a1;
21314 uint8_t a2;
21315 uint8_t a3;
21316 uint8_t a4;
21317 uint8_t a5;
21318 uint8_t a6;
21319
21320 a0 = 1;
21321 a1 = 2;
21322 a2 = 3;
21323 a3 = 4;
21324 a4 = 5;
21325 a5 = 6;
21326 a6 = 7;
21327
21328 std::cout << "Calling TestAsyncReturnStruct7BytesHomogeneousUint8("
21329 << "(" << static_cast<int>(a0) << ", " << static_cast<int>(a1)
21330 << ", " << static_cast<int>(a2) << ", " << static_cast<int>(a3)
21331 << ", " << static_cast<int>(a4) << ", " << static_cast<int>(a5)
21332 << ", " << static_cast<int>(a6) << ")"
21333 << ")\n";
21334
21335 f(a0, a1, a2, a3, a4, a5, a6);
21336}
21337
21338// Used for testing structs and unions by value.
21339// Non-wordsize return value.
21340// With alignment rules taken into account size is 8 bytes.
21342 // NOLINTNEXTLINE(whitespace/parens)
21343 void (*f)(int32_t a0, int16_t a1, int8_t a2)) {
21344 int32_t a0;
21345 int16_t a1;
21346 int8_t a2;
21347
21348 a0 = -1;
21349 a1 = 2;
21350 a2 = -3;
21351
21352 std::cout << "Calling TestAsyncReturnStruct7BytesInt4ByteAligned("
21353 << "(" << a0 << ", " << a1 << ", " << static_cast<int>(a2) << ")"
21354 << ")\n";
21355
21356 f(a0, a1, a2);
21357}
21358
21359// Used for testing structs and unions by value.
21360// Return value in integer registers on many architectures.
21362 // NOLINTNEXTLINE(whitespace/parens)
21363 void (*f)(int16_t a0, int16_t a1, int32_t a2)) {
21364 int16_t a0;
21365 int16_t a1;
21366 int32_t a2;
21367
21368 a0 = -1;
21369 a1 = 2;
21370 a2 = -3;
21371
21372 std::cout << "Calling TestAsyncReturnStruct8BytesInt("
21373 << "(" << a0 << ", " << a1 << ", " << a2 << ")"
21374 << ")\n";
21375
21376 f(a0, a1, a2);
21377}
21378
21379// Used for testing structs and unions by value.
21380// Return value in FP registers on many architectures.
21382 // NOLINTNEXTLINE(whitespace/parens)
21383 void (*f)(float a0, float a1)) {
21384 float a0;
21385 float a1;
21386
21387 a0 = -1.0;
21388 a1 = 2.0;
21389
21390 std::cout << "Calling TestAsyncReturnStruct8BytesHomogeneousFloat("
21391 << "(" << a0 << ", " << a1 << ")"
21392 << ")\n";
21393
21394 f(a0, a1);
21395}
21396
21397// Used for testing structs and unions by value.
21398// Return value split over FP and integer register in x64.
21400 // NOLINTNEXTLINE(whitespace/parens)
21401 void (*f)(float a0, int16_t a1, int16_t a2)) {
21402 float a0;
21403 int16_t a1;
21404 int16_t a2;
21405
21406 a0 = -1.0;
21407 a1 = 2;
21408 a2 = -3;
21409
21410 std::cout << "Calling TestAsyncReturnStruct8BytesMixed("
21411 << "(" << a0 << ", " << a1 << ", " << a2 << ")"
21412 << ")\n";
21413
21414 f(a0, a1, a2);
21415}
21416
21417// Used for testing structs and unions by value.
21418// The minimum alignment of this struct is only 1 byte based on its fields.
21419// Test that the memory backing these structs is the right size and that
21420// dart:ffi trampolines do not write outside this size.
21422 // NOLINTNEXTLINE(whitespace/parens)
21423 void (*f)(uint8_t a0,
21424 uint8_t a1,
21425 uint8_t a2,
21426 uint8_t a3,
21427 uint8_t a4,
21428 uint8_t a5,
21429 uint8_t a6,
21430 uint8_t a7,
21431 uint8_t a8)) {
21432 uint8_t a0;
21433 uint8_t a1;
21434 uint8_t a2;
21435 uint8_t a3;
21436 uint8_t a4;
21437 uint8_t a5;
21438 uint8_t a6;
21439 uint8_t a7;
21440 uint8_t a8;
21441
21442 a0 = 1;
21443 a1 = 2;
21444 a2 = 3;
21445 a3 = 4;
21446 a4 = 5;
21447 a5 = 6;
21448 a6 = 7;
21449 a7 = 8;
21450 a8 = 9;
21451
21452 std::cout << "Calling TestAsyncReturnStruct9BytesHomogeneousUint8("
21453 << "(" << static_cast<int>(a0) << ", " << static_cast<int>(a1)
21454 << ", " << static_cast<int>(a2) << ", " << static_cast<int>(a3)
21455 << ", " << static_cast<int>(a4) << ", " << static_cast<int>(a5)
21456 << ", " << static_cast<int>(a6) << ", " << static_cast<int>(a7)
21457 << ", " << static_cast<int>(a8) << ")"
21458 << ")\n";
21459
21460 f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
21461}
21462
21463// Used for testing structs and unions by value.
21464// Return value in two integer registers on x64.
21465// With alignment rules taken into account size is 12 or 16 bytes.
21467 // NOLINTNEXTLINE(whitespace/parens)
21468 void (*f)(int64_t a0, int8_t a1)) {
21469 int64_t a0;
21470 int8_t a1;
21471
21472 a0 = -1;
21473 a1 = 2;
21474
21475 std::cout << "Calling TestAsyncReturnStruct9BytesInt4Or8ByteAligned("
21476 << "(" << a0 << ", " << static_cast<int>(a1) << ")"
21477 << ")\n";
21478
21479 f(a0, a1);
21480}
21481
21482// Used for testing structs and unions by value.
21483// Return value in FPU registers, but does not use all registers on arm hardfp
21484// and arm64.
21486 // NOLINTNEXTLINE(whitespace/parens)
21487 void (*f)(float a0, float a1, float a2)) {
21488 float a0;
21489 float a1;
21490 float a2;
21491
21492 a0 = -1.0;
21493 a1 = 2.0;
21494 a2 = -3.0;
21495
21496 std::cout << "Calling TestAsyncReturnStruct12BytesHomogeneousFloat("
21497 << "(" << a0 << ", " << a1 << ", " << a2 << ")"
21498 << ")\n";
21499
21500 f(a0, a1, a2);
21501}
21502
21503// Used for testing structs and unions by value.
21504// Return value in FPU registers on arm hardfp and arm64.
21506 // NOLINTNEXTLINE(whitespace/parens)
21507 void (*f)(float a0, float a1, float a2, float a3)) {
21508 float a0;
21509 float a1;
21510 float a2;
21511 float a3;
21512
21513 a0 = -1.0;
21514 a1 = 2.0;
21515 a2 = -3.0;
21516 a3 = 4.0;
21517
21518 std::cout << "Calling TestAsyncReturnStruct16BytesHomogeneousFloat("
21519 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ")"
21520 << ")\n";
21521
21522 f(a0, a1, a2, a3);
21523}
21524
21525// Used for testing structs and unions by value.
21526// Return value split over FP and integer register in x64.
21528 // NOLINTNEXTLINE(whitespace/parens)
21529 void (*f)(double a0, int64_t a1)) {
21530 double a0;
21531 int64_t a1;
21532
21533 a0 = -1.0;
21534 a1 = 2;
21535
21536 std::cout << "Calling TestAsyncReturnStruct16BytesMixed("
21537 << "(" << a0 << ", " << a1 << ")"
21538 << ")\n";
21539
21540 f(a0, a1);
21541}
21542
21543// Used for testing structs and unions by value.
21544// Return value split over FP and integer register in x64.
21545// The integer register contains half float half int.
21547 // NOLINTNEXTLINE(whitespace/parens)
21548 void (*f)(float a0, float a1, float a2, int32_t a3)) {
21549 float a0;
21550 float a1;
21551 float a2;
21552 int32_t a3;
21553
21554 a0 = -1.0;
21555 a1 = 2.0;
21556 a2 = -3.0;
21557 a3 = 4;
21558
21559 std::cout << "Calling TestAsyncReturnStruct16BytesMixed2("
21560 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ")"
21561 << ")\n";
21562
21563 f(a0, a1, a2, a3);
21564}
21565
21566// Used for testing structs and unions by value.
21567// Return value returned in preallocated space passed by pointer on most ABIs.
21568// Is non word size on purpose, to test that structs are rounded up to word size
21569// on all ABIs.
21571 // NOLINTNEXTLINE(whitespace/parens)
21572 void (*f)(int64_t a0, int64_t a1, int8_t a2)) {
21573 int64_t a0;
21574 int64_t a1;
21575 int8_t a2;
21576
21577 a0 = -1;
21578 a1 = 2;
21579 a2 = -3;
21580
21581 std::cout << "Calling TestAsyncReturnStruct17BytesInt("
21582 << "(" << a0 << ", " << a1 << ", " << static_cast<int>(a2) << ")"
21583 << ")\n";
21584
21585 f(a0, a1, a2);
21586}
21587
21588// Used for testing structs and unions by value.
21589// The minimum alignment of this struct is only 1 byte based on its fields.
21590// Test that the memory backing these structs is the right size and that
21591// dart:ffi trampolines do not write outside this size.
21593 // NOLINTNEXTLINE(whitespace/parens)
21594 void (*f)(uint8_t a0,
21595 uint8_t a1,
21596 uint8_t a2,
21597 uint8_t a3,
21598 uint8_t a4,
21599 uint8_t a5,
21600 uint8_t a6,
21601 uint8_t a7,
21602 uint8_t a8,
21603 uint8_t a9,
21604 uint8_t a10,
21605 uint8_t a11,
21606 uint8_t a12,
21607 uint8_t a13,
21608 uint8_t a14,
21609 uint8_t a15,
21610 uint8_t a16,
21611 uint8_t a17,
21612 uint8_t a18)) {
21613 uint8_t a0;
21614 uint8_t a1;
21615 uint8_t a2;
21616 uint8_t a3;
21617 uint8_t a4;
21618 uint8_t a5;
21619 uint8_t a6;
21620 uint8_t a7;
21621 uint8_t a8;
21622 uint8_t a9;
21623 uint8_t a10;
21624 uint8_t a11;
21625 uint8_t a12;
21626 uint8_t a13;
21627 uint8_t a14;
21628 uint8_t a15;
21629 uint8_t a16;
21630 uint8_t a17;
21631 uint8_t a18;
21632
21633 a0 = 1;
21634 a1 = 2;
21635 a2 = 3;
21636 a3 = 4;
21637 a4 = 5;
21638 a5 = 6;
21639 a6 = 7;
21640 a7 = 8;
21641 a8 = 9;
21642 a9 = 10;
21643 a10 = 11;
21644 a11 = 12;
21645 a12 = 13;
21646 a13 = 14;
21647 a14 = 15;
21648 a15 = 16;
21649 a16 = 17;
21650 a17 = 18;
21651 a18 = 19;
21652
21653 std::cout << "Calling TestAsyncReturnStruct19BytesHomogeneousUint8("
21654 << "(" << static_cast<int>(a0) << ", " << static_cast<int>(a1)
21655 << ", " << static_cast<int>(a2) << ", " << static_cast<int>(a3)
21656 << ", " << static_cast<int>(a4) << ", " << static_cast<int>(a5)
21657 << ", " << static_cast<int>(a6) << ", " << static_cast<int>(a7)
21658 << ", " << static_cast<int>(a8) << ", " << static_cast<int>(a9)
21659 << ", " << static_cast<int>(a10) << ", " << static_cast<int>(a11)
21660 << ", " << static_cast<int>(a12) << ", " << static_cast<int>(a13)
21661 << ", " << static_cast<int>(a14) << ", " << static_cast<int>(a15)
21662 << ", " << static_cast<int>(a16) << ", " << static_cast<int>(a17)
21663 << ", " << static_cast<int>(a18) << ")"
21664 << ")\n";
21665
21666 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16,
21667 a17, a18);
21668}
21669
21670// Used for testing structs and unions by value.
21671// Return value too big to go in cpu registers on arm64.
21673 // NOLINTNEXTLINE(whitespace/parens)
21674 void (*f)(int32_t a0, int32_t a1, int32_t a2, int32_t a3, int32_t a4)) {
21675 int32_t a0;
21676 int32_t a1;
21677 int32_t a2;
21678 int32_t a3;
21679 int32_t a4;
21680
21681 a0 = -1;
21682 a1 = 2;
21683 a2 = -3;
21684 a3 = 4;
21685 a4 = -5;
21686
21687 std::cout << "Calling TestAsyncReturnStruct20BytesHomogeneousInt32("
21688 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
21689 << ")"
21690 << ")\n";
21691
21692 f(a0, a1, a2, a3, a4);
21693}
21694
21695// Used for testing structs and unions by value.
21696// Return value too big to go in FPU registers on x64, arm hardfp and arm64.
21698 // NOLINTNEXTLINE(whitespace/parens)
21699 void (*f)(float a0, float a1, float a2, float a3, float a4)) {
21700 float a0;
21701 float a1;
21702 float a2;
21703 float a3;
21704 float a4;
21705
21706 a0 = -1.0;
21707 a1 = 2.0;
21708 a2 = -3.0;
21709 a3 = 4.0;
21710 a4 = -5.0;
21711
21712 std::cout << "Calling TestAsyncReturnStruct20BytesHomogeneousFloat("
21713 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
21714 << ")"
21715 << ")\n";
21716
21717 f(a0, a1, a2, a3, a4);
21718}
21719
21720// Used for testing structs and unions by value.
21721// Return value in FPU registers on arm64.
21723 // NOLINTNEXTLINE(whitespace/parens)
21724 void (*f)(double a0, double a1, double a2, double a3)) {
21725 double a0;
21726 double a1;
21727 double a2;
21728 double a3;
21729
21730 a0 = -1.0;
21731 a1 = 2.0;
21732 a2 = -3.0;
21733 a3 = 4.0;
21734
21735 std::cout << "Calling TestAsyncReturnStruct32BytesHomogeneousDouble("
21736 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ")"
21737 << ")\n";
21738
21739 f(a0, a1, a2, a3);
21740}
21741
21742// Used for testing structs and unions by value.
21743// Return value too big to go in FPU registers on arm64.
21745 // NOLINTNEXTLINE(whitespace/parens)
21746 void (*f)(double a0, double a1, double a2, double a3, double a4)) {
21747 double a0;
21748 double a1;
21749 double a2;
21750 double a3;
21751 double a4;
21752
21753 a0 = -1.0;
21754 a1 = 2.0;
21755 a2 = -3.0;
21756 a3 = 4.0;
21757 a4 = -5.0;
21758
21759 std::cout << "Calling TestAsyncReturnStruct40BytesHomogeneousDouble("
21760 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
21761 << ")"
21762 << ")\n";
21763
21764 f(a0, a1, a2, a3, a4);
21765}
21766
21767// Used for testing structs and unions by value.
21768// Test 1kb struct.
21770 // NOLINTNEXTLINE(whitespace/parens)
21771 void (*f)(uint64_t a0,
21772 uint64_t a1,
21773 uint64_t a2,
21774 uint64_t a3,
21775 uint64_t a4,
21776 uint64_t a5,
21777 uint64_t a6,
21778 uint64_t a7,
21779 uint64_t a8,
21780 uint64_t a9,
21781 uint64_t a10,
21782 uint64_t a11,
21783 uint64_t a12,
21784 uint64_t a13,
21785 uint64_t a14,
21786 uint64_t a15,
21787 uint64_t a16,
21788 uint64_t a17,
21789 uint64_t a18,
21790 uint64_t a19,
21791 uint64_t a20,
21792 uint64_t a21,
21793 uint64_t a22,
21794 uint64_t a23,
21795 uint64_t a24,
21796 uint64_t a25,
21797 uint64_t a26,
21798 uint64_t a27,
21799 uint64_t a28,
21800 uint64_t a29,
21801 uint64_t a30,
21802 uint64_t a31,
21803 uint64_t a32,
21804 uint64_t a33,
21805 uint64_t a34,
21806 uint64_t a35,
21807 uint64_t a36,
21808 uint64_t a37,
21809 uint64_t a38,
21810 uint64_t a39,
21811 uint64_t a40,
21812 uint64_t a41,
21813 uint64_t a42,
21814 uint64_t a43,
21815 uint64_t a44,
21816 uint64_t a45,
21817 uint64_t a46,
21818 uint64_t a47,
21819 uint64_t a48,
21820 uint64_t a49,
21821 uint64_t a50,
21822 uint64_t a51,
21823 uint64_t a52,
21824 uint64_t a53,
21825 uint64_t a54,
21826 uint64_t a55,
21827 uint64_t a56,
21828 uint64_t a57,
21829 uint64_t a58,
21830 uint64_t a59,
21831 uint64_t a60,
21832 uint64_t a61,
21833 uint64_t a62,
21834 uint64_t a63,
21835 uint64_t a64,
21836 uint64_t a65,
21837 uint64_t a66,
21838 uint64_t a67,
21839 uint64_t a68,
21840 uint64_t a69,
21841 uint64_t a70,
21842 uint64_t a71,
21843 uint64_t a72,
21844 uint64_t a73,
21845 uint64_t a74,
21846 uint64_t a75,
21847 uint64_t a76,
21848 uint64_t a77,
21849 uint64_t a78,
21850 uint64_t a79,
21851 uint64_t a80,
21852 uint64_t a81,
21853 uint64_t a82,
21854 uint64_t a83,
21855 uint64_t a84,
21856 uint64_t a85,
21857 uint64_t a86,
21858 uint64_t a87,
21859 uint64_t a88,
21860 uint64_t a89,
21861 uint64_t a90,
21862 uint64_t a91,
21863 uint64_t a92,
21864 uint64_t a93,
21865 uint64_t a94,
21866 uint64_t a95,
21867 uint64_t a96,
21868 uint64_t a97,
21869 uint64_t a98,
21870 uint64_t a99,
21871 uint64_t a100,
21872 uint64_t a101,
21873 uint64_t a102,
21874 uint64_t a103,
21875 uint64_t a104,
21876 uint64_t a105,
21877 uint64_t a106,
21878 uint64_t a107,
21879 uint64_t a108,
21880 uint64_t a109,
21881 uint64_t a110,
21882 uint64_t a111,
21883 uint64_t a112,
21884 uint64_t a113,
21885 uint64_t a114,
21886 uint64_t a115,
21887 uint64_t a116,
21888 uint64_t a117,
21889 uint64_t a118,
21890 uint64_t a119,
21891 uint64_t a120,
21892 uint64_t a121,
21893 uint64_t a122,
21894 uint64_t a123,
21895 uint64_t a124,
21896 uint64_t a125,
21897 uint64_t a126,
21898 uint64_t a127)) {
21899 uint64_t a0;
21900 uint64_t a1;
21901 uint64_t a2;
21902 uint64_t a3;
21903 uint64_t a4;
21904 uint64_t a5;
21905 uint64_t a6;
21906 uint64_t a7;
21907 uint64_t a8;
21908 uint64_t a9;
21909 uint64_t a10;
21910 uint64_t a11;
21911 uint64_t a12;
21912 uint64_t a13;
21913 uint64_t a14;
21914 uint64_t a15;
21915 uint64_t a16;
21916 uint64_t a17;
21917 uint64_t a18;
21918 uint64_t a19;
21919 uint64_t a20;
21920 uint64_t a21;
21921 uint64_t a22;
21922 uint64_t a23;
21923 uint64_t a24;
21924 uint64_t a25;
21925 uint64_t a26;
21926 uint64_t a27;
21927 uint64_t a28;
21928 uint64_t a29;
21929 uint64_t a30;
21930 uint64_t a31;
21931 uint64_t a32;
21932 uint64_t a33;
21933 uint64_t a34;
21934 uint64_t a35;
21935 uint64_t a36;
21936 uint64_t a37;
21937 uint64_t a38;
21938 uint64_t a39;
21939 uint64_t a40;
21940 uint64_t a41;
21941 uint64_t a42;
21942 uint64_t a43;
21943 uint64_t a44;
21944 uint64_t a45;
21945 uint64_t a46;
21946 uint64_t a47;
21947 uint64_t a48;
21948 uint64_t a49;
21949 uint64_t a50;
21950 uint64_t a51;
21951 uint64_t a52;
21952 uint64_t a53;
21953 uint64_t a54;
21954 uint64_t a55;
21955 uint64_t a56;
21956 uint64_t a57;
21957 uint64_t a58;
21958 uint64_t a59;
21959 uint64_t a60;
21960 uint64_t a61;
21961 uint64_t a62;
21962 uint64_t a63;
21963 uint64_t a64;
21964 uint64_t a65;
21965 uint64_t a66;
21966 uint64_t a67;
21967 uint64_t a68;
21968 uint64_t a69;
21969 uint64_t a70;
21970 uint64_t a71;
21971 uint64_t a72;
21972 uint64_t a73;
21973 uint64_t a74;
21974 uint64_t a75;
21975 uint64_t a76;
21976 uint64_t a77;
21977 uint64_t a78;
21978 uint64_t a79;
21979 uint64_t a80;
21980 uint64_t a81;
21981 uint64_t a82;
21982 uint64_t a83;
21983 uint64_t a84;
21984 uint64_t a85;
21985 uint64_t a86;
21986 uint64_t a87;
21987 uint64_t a88;
21988 uint64_t a89;
21989 uint64_t a90;
21990 uint64_t a91;
21991 uint64_t a92;
21992 uint64_t a93;
21993 uint64_t a94;
21994 uint64_t a95;
21995 uint64_t a96;
21996 uint64_t a97;
21997 uint64_t a98;
21998 uint64_t a99;
21999 uint64_t a100;
22000 uint64_t a101;
22001 uint64_t a102;
22002 uint64_t a103;
22003 uint64_t a104;
22004 uint64_t a105;
22005 uint64_t a106;
22006 uint64_t a107;
22007 uint64_t a108;
22008 uint64_t a109;
22009 uint64_t a110;
22010 uint64_t a111;
22011 uint64_t a112;
22012 uint64_t a113;
22013 uint64_t a114;
22014 uint64_t a115;
22015 uint64_t a116;
22016 uint64_t a117;
22017 uint64_t a118;
22018 uint64_t a119;
22019 uint64_t a120;
22020 uint64_t a121;
22021 uint64_t a122;
22022 uint64_t a123;
22023 uint64_t a124;
22024 uint64_t a125;
22025 uint64_t a126;
22026 uint64_t a127;
22027
22028 a0 = 1;
22029 a1 = 2;
22030 a2 = 3;
22031 a3 = 4;
22032 a4 = 5;
22033 a5 = 6;
22034 a6 = 7;
22035 a7 = 8;
22036 a8 = 9;
22037 a9 = 10;
22038 a10 = 11;
22039 a11 = 12;
22040 a12 = 13;
22041 a13 = 14;
22042 a14 = 15;
22043 a15 = 16;
22044 a16 = 17;
22045 a17 = 18;
22046 a18 = 19;
22047 a19 = 20;
22048 a20 = 21;
22049 a21 = 22;
22050 a22 = 23;
22051 a23 = 24;
22052 a24 = 25;
22053 a25 = 26;
22054 a26 = 27;
22055 a27 = 28;
22056 a28 = 29;
22057 a29 = 30;
22058 a30 = 31;
22059 a31 = 32;
22060 a32 = 33;
22061 a33 = 34;
22062 a34 = 35;
22063 a35 = 36;
22064 a36 = 37;
22065 a37 = 38;
22066 a38 = 39;
22067 a39 = 40;
22068 a40 = 41;
22069 a41 = 42;
22070 a42 = 43;
22071 a43 = 44;
22072 a44 = 45;
22073 a45 = 46;
22074 a46 = 47;
22075 a47 = 48;
22076 a48 = 49;
22077 a49 = 50;
22078 a50 = 51;
22079 a51 = 52;
22080 a52 = 53;
22081 a53 = 54;
22082 a54 = 55;
22083 a55 = 56;
22084 a56 = 57;
22085 a57 = 58;
22086 a58 = 59;
22087 a59 = 60;
22088 a60 = 61;
22089 a61 = 62;
22090 a62 = 63;
22091 a63 = 64;
22092 a64 = 65;
22093 a65 = 66;
22094 a66 = 67;
22095 a67 = 68;
22096 a68 = 69;
22097 a69 = 70;
22098 a70 = 71;
22099 a71 = 72;
22100 a72 = 73;
22101 a73 = 74;
22102 a74 = 75;
22103 a75 = 76;
22104 a76 = 77;
22105 a77 = 78;
22106 a78 = 79;
22107 a79 = 80;
22108 a80 = 81;
22109 a81 = 82;
22110 a82 = 83;
22111 a83 = 84;
22112 a84 = 85;
22113 a85 = 86;
22114 a86 = 87;
22115 a87 = 88;
22116 a88 = 89;
22117 a89 = 90;
22118 a90 = 91;
22119 a91 = 92;
22120 a92 = 93;
22121 a93 = 94;
22122 a94 = 95;
22123 a95 = 96;
22124 a96 = 97;
22125 a97 = 98;
22126 a98 = 99;
22127 a99 = 100;
22128 a100 = 101;
22129 a101 = 102;
22130 a102 = 103;
22131 a103 = 104;
22132 a104 = 105;
22133 a105 = 106;
22134 a106 = 107;
22135 a107 = 108;
22136 a108 = 109;
22137 a109 = 110;
22138 a110 = 111;
22139 a111 = 112;
22140 a112 = 113;
22141 a113 = 114;
22142 a114 = 115;
22143 a115 = 116;
22144 a116 = 117;
22145 a117 = 118;
22146 a118 = 119;
22147 a119 = 120;
22148 a120 = 121;
22149 a121 = 122;
22150 a122 = 123;
22151 a123 = 124;
22152 a124 = 125;
22153 a125 = 126;
22154 a126 = 127;
22155 a127 = 128;
22156
22157 std::cout << "Calling TestAsyncReturnStruct1024BytesHomogeneousUint64("
22158 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
22159 << ", " << a5 << ", " << a6 << ", " << a7 << ", " << a8 << ", "
22160 << a9 << ", " << a10 << ", " << a11 << ", " << a12 << ", " << a13
22161 << ", " << a14 << ", " << a15 << ", " << a16 << ", " << a17 << ", "
22162 << a18 << ", " << a19 << ", " << a20 << ", " << a21 << ", " << a22
22163 << ", " << a23 << ", " << a24 << ", " << a25 << ", " << a26 << ", "
22164 << a27 << ", " << a28 << ", " << a29 << ", " << a30 << ", " << a31
22165 << ", " << a32 << ", " << a33 << ", " << a34 << ", " << a35 << ", "
22166 << a36 << ", " << a37 << ", " << a38 << ", " << a39 << ", " << a40
22167 << ", " << a41 << ", " << a42 << ", " << a43 << ", " << a44 << ", "
22168 << a45 << ", " << a46 << ", " << a47 << ", " << a48 << ", " << a49
22169 << ", " << a50 << ", " << a51 << ", " << a52 << ", " << a53 << ", "
22170 << a54 << ", " << a55 << ", " << a56 << ", " << a57 << ", " << a58
22171 << ", " << a59 << ", " << a60 << ", " << a61 << ", " << a62 << ", "
22172 << a63 << ", " << a64 << ", " << a65 << ", " << a66 << ", " << a67
22173 << ", " << a68 << ", " << a69 << ", " << a70 << ", " << a71 << ", "
22174 << a72 << ", " << a73 << ", " << a74 << ", " << a75 << ", " << a76
22175 << ", " << a77 << ", " << a78 << ", " << a79 << ", " << a80 << ", "
22176 << a81 << ", " << a82 << ", " << a83 << ", " << a84 << ", " << a85
22177 << ", " << a86 << ", " << a87 << ", " << a88 << ", " << a89 << ", "
22178 << a90 << ", " << a91 << ", " << a92 << ", " << a93 << ", " << a94
22179 << ", " << a95 << ", " << a96 << ", " << a97 << ", " << a98 << ", "
22180 << a99 << ", " << a100 << ", " << a101 << ", " << a102 << ", "
22181 << a103 << ", " << a104 << ", " << a105 << ", " << a106 << ", "
22182 << a107 << ", " << a108 << ", " << a109 << ", " << a110 << ", "
22183 << a111 << ", " << a112 << ", " << a113 << ", " << a114 << ", "
22184 << a115 << ", " << a116 << ", " << a117 << ", " << a118 << ", "
22185 << a119 << ", " << a120 << ", " << a121 << ", " << a122 << ", "
22186 << a123 << ", " << a124 << ", " << a125 << ", " << a126 << ", "
22187 << a127 << ")"
22188 << ")\n";
22189
22190 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16,
22191 a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31,
22192 a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, a45, a46,
22193 a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61,
22194 a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, a74, a75, a76,
22195 a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91,
22196 a92, a93, a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105,
22197 a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, a117,
22198 a118, a119, a120, a121, a122, a123, a124, a125, a126, a127);
22199}
22200
22201// Used for testing structs and unions by value.
22202// Small struct with mis-aligned member.
22204 // NOLINTNEXTLINE(whitespace/parens)
22205 void (*f)(int8_t a0, int16_t a1)) {
22206 int8_t a0;
22207 int16_t a1;
22208
22209 a0 = -1;
22210 a1 = 2;
22211
22212 std::cout << "Calling TestAsyncReturnStruct3BytesPackedInt("
22213 << "(" << static_cast<int>(a0) << ", " << a1 << ")"
22214 << ")\n";
22215
22216 f(a0, a1);
22217}
22218
22219// Used for testing structs and unions by value.
22220// Struct with mis-aligned member.
22222 // NOLINTNEXTLINE(whitespace/parens)
22223 void (*f)(uint8_t a0, uint32_t a1, uint8_t a2, uint8_t a3, uint8_t a4)) {
22224 uint8_t a0;
22225 uint32_t a1;
22226 uint8_t a2;
22227 uint8_t a3;
22228 uint8_t a4;
22229
22230 a0 = 1;
22231 a1 = 2;
22232 a2 = 3;
22233 a3 = 4;
22234 a4 = 5;
22235
22236 std::cout << "Calling TestAsyncReturnStruct8BytesPackedInt("
22237 << "(" << static_cast<int>(a0) << ", " << a1 << ", "
22238 << static_cast<int>(a2) << ", " << static_cast<int>(a3) << ", "
22239 << static_cast<int>(a4) << ")"
22240 << ")\n";
22241
22242 f(a0, a1, a2, a3, a4);
22243}
22244
22245// Used for testing structs and unions by value.
22246// Struct with mis-aligned member.
22247// Tests backfilling of CPU and FPU registers.
22249 // NOLINTNEXTLINE(whitespace/parens)
22250 void (*f)(uint8_t a0, double a1)) {
22251 uint8_t a0;
22252 double a1;
22253
22254 a0 = 1;
22255 a1 = 2.0;
22256
22257 std::cout << "Calling TestAsyncReturnStruct9BytesPackedMixed("
22258 << "(" << static_cast<int>(a0) << ", " << a1 << ")"
22259 << ")\n";
22260
22261 f(a0, a1);
22262}
22263
22264// Used for testing structs and unions by value.
22265// Returning a mixed integer/float union.
22267 // NOLINTNEXTLINE(whitespace/parens)
22268 void (*f)(uint32_t a0)) {
22269 uint32_t a0;
22270
22271 a0 = 1;
22272
22273 std::cout << "Calling TestAsyncReturnUnion4BytesMixed("
22274 << "(" << a0 << ")"
22275 << ")\n";
22276
22277 f(a0);
22278}
22279
22280// Used for testing structs and unions by value.
22281// Returning a floating point only union.
22283 // NOLINTNEXTLINE(whitespace/parens)
22284 void (*f)(double a0)) {
22285 double a0;
22286
22287 a0 = -1.0;
22288
22289 std::cout << "Calling TestAsyncReturnUnion8BytesNestedFloat("
22290 << "(" << a0 << ")"
22291 << ")\n";
22292
22293 f(a0);
22294}
22295
22296// Used for testing structs and unions by value.
22297// Returning a mixed-size union.
22299 // NOLINTNEXTLINE(whitespace/parens)
22300 void (*f)(Struct8BytesInt a0)) {
22301 Struct8BytesInt a0 = {};
22302
22303 a0.a0 = -1;
22304 a0.a1 = 2;
22305 a0.a2 = -3;
22306
22307 std::cout << "Calling TestAsyncReturnUnion9BytesNestedInt("
22308 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << "))"
22309 << ")\n";
22310
22311 f(a0);
22312}
22313
22314// Used for testing structs and unions by value.
22315// Returning union with homogenous floats.
22317 // NOLINTNEXTLINE(whitespace/parens)
22318 void (*f)(Struct8BytesHomogeneousFloat a0)) {
22320
22321 a0.a0 = -1.0;
22322 a0.a1 = 2.0;
22323
22324 std::cout << "Calling TestAsyncReturnUnion16BytesNestedFloat("
22325 << "((" << a0.a0 << ", " << a0.a1 << "))"
22326 << ")\n";
22327
22328 f(a0);
22329}
22330
22331// Used for testing structs and unions by value.
22332// Test that a struct passed in as argument can be returned.
22333// Especially for ffi callbacks.
22334// Struct is passed in int registers in most ABIs.
22336 // NOLINTNEXTLINE(whitespace/parens)
22337 void (*f)(Struct1ByteInt a0)) {
22338 Struct1ByteInt a0 = {};
22339
22340 a0.a0 = -1;
22341
22342 std::cout << "Calling TestAsyncReturnStructArgumentStruct1ByteInt("
22343 << "((" << static_cast<int>(a0.a0) << "))"
22344 << ")\n";
22345
22346 f(a0);
22347}
22348
22349// Used for testing structs and unions by value.
22350// Test that a struct passed in as argument can be returned.
22351// Especially for ffi callbacks.
22352// Struct is passed on stack on all ABIs.
22354 // NOLINTNEXTLINE(whitespace/parens)
22355 void (*f)(int32_t a0,
22356 int32_t a1,
22357 int32_t a2,
22358 int32_t a3,
22359 int32_t a4,
22360 int32_t a5,
22361 int32_t a6,
22362 int32_t a7,
22363 Struct1ByteInt a8)) {
22364 int32_t a0;
22365 int32_t a1;
22366 int32_t a2;
22367 int32_t a3;
22368 int32_t a4;
22369 int32_t a5;
22370 int32_t a6;
22371 int32_t a7;
22372 Struct1ByteInt a8 = {};
22373
22374 a0 = -1;
22375 a1 = 2;
22376 a2 = -3;
22377 a3 = 4;
22378 a4 = -5;
22379 a5 = 6;
22380 a6 = -7;
22381 a7 = 8;
22382 a8.a0 = -9;
22383
22384 std::cout << "Calling TestAsyncReturnStructArgumentInt32x8Struct1ByteInt("
22385 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
22386 << ", " << a5 << ", " << a6 << ", " << a7 << ", ("
22387 << static_cast<int>(a8.a0) << "))"
22388 << ")\n";
22389
22390 f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
22391}
22392
22393// Used for testing structs and unions by value.
22394// Test that a struct passed in as argument can be returned.
22395// Especially for ffi callbacks.
22396// Struct is passed in float registers in most ABIs.
22398 // NOLINTNEXTLINE(whitespace/parens)
22399 void (*f)(Struct8BytesHomogeneousFloat a0)) {
22401
22402 a0.a0 = -1.0;
22403 a0.a1 = 2.0;
22404
22405 std::cout
22406 << "Calling TestAsyncReturnStructArgumentStruct8BytesHomogeneousFloat("
22407 << "((" << a0.a0 << ", " << a0.a1 << "))"
22408 << ")\n";
22409
22410 f(a0);
22411}
22412
22413// Used for testing structs and unions by value.
22414// On arm64, both argument and return value are passed in by pointer.
22416 // NOLINTNEXTLINE(whitespace/parens)
22417 void (*f)(Struct20BytesHomogeneousInt32 a0)) {
22419
22420 a0.a0 = -1;
22421 a0.a1 = 2;
22422 a0.a2 = -3;
22423 a0.a3 = 4;
22424 a0.a4 = -5;
22425
22426 std::cout
22427 << "Calling TestAsyncReturnStructArgumentStruct20BytesHomogeneousInt32("
22428 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
22429 << ", " << a0.a4 << "))"
22430 << ")\n";
22431
22432 f(a0);
22433}
22434
22435// Used for testing structs and unions by value.
22436// On arm64, both argument and return value are passed in by pointer.
22437// Ints exhaust registers, so that pointer is passed on stack.
22439 // NOLINTNEXTLINE(whitespace/parens)
22440 void (*f)(int32_t a0,
22441 int32_t a1,
22442 int32_t a2,
22443 int32_t a3,
22444 int32_t a4,
22445 int32_t a5,
22446 int32_t a6,
22447 int32_t a7,
22449 int32_t a0;
22450 int32_t a1;
22451 int32_t a2;
22452 int32_t a3;
22453 int32_t a4;
22454 int32_t a5;
22455 int32_t a6;
22456 int32_t a7;
22458
22459 a0 = -1;
22460 a1 = 2;
22461 a2 = -3;
22462 a3 = 4;
22463 a4 = -5;
22464 a5 = 6;
22465 a6 = -7;
22466 a7 = 8;
22467 a8.a0 = -9;
22468 a8.a1 = 10;
22469 a8.a2 = -11;
22470 a8.a3 = 12;
22471 a8.a4 = -13;
22472
22473 std::cout
22474 << "Calling TestAsyncReturnStructArgumentInt32x8Struct20BytesHomogeneou("
22475 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
22476 << ", " << a5 << ", " << a6 << ", " << a7 << ", (" << a8.a0 << ", "
22477 << a8.a1 << ", " << a8.a2 << ", " << a8.a3 << ", " << a8.a4 << "))"
22478 << ")\n";
22479
22480 f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
22481}
22482
22483// Used for testing structs and unions by value.
22484// Test returning struct with inline array.
22486 // NOLINTNEXTLINE(whitespace/parens)
22487 void (*f)(Struct8BytesInlineArrayInt a0)) {
22489
22490 a0.a0[0] = 1;
22491 a0.a0[1] = 2;
22492 a0.a0[2] = 3;
22493 a0.a0[3] = 4;
22494 a0.a0[4] = 5;
22495 a0.a0[5] = 6;
22496 a0.a0[6] = 7;
22497 a0.a0[7] = 8;
22498
22499 std::cout
22500 << "Calling TestAsyncReturnStructArgumentStruct8BytesInlineArrayInt("
22501 << "(([" << static_cast<int>(a0.a0[0]) << ", "
22502 << static_cast<int>(a0.a0[1]) << ", " << static_cast<int>(a0.a0[2])
22503 << ", " << static_cast<int>(a0.a0[3]) << ", "
22504 << static_cast<int>(a0.a0[4]) << ", " << static_cast<int>(a0.a0[5])
22505 << ", " << static_cast<int>(a0.a0[6]) << ", "
22506 << static_cast<int>(a0.a0[7]) << "]))"
22507 << ")\n";
22508
22509 f(a0);
22510}
22511
22512// Used for testing structs and unions by value.
22513// Return value in FPU registers on arm hardfp and arm64.
22515 // NOLINTNEXTLINE(whitespace/parens)
22518
22519 a0.a0.a0 = -1.0;
22520 a0.a1[0].a0 = 2.0;
22521 a0.a1[1].a0 = -3.0;
22522 a0.a2 = 4.0;
22523
22524 std::cout
22525 << "Calling TestAsyncReturnStructArgumentStructStruct16BytesHomogeneous("
22526 << "(((" << a0.a0.a0 << "), [(" << a0.a1[0].a0 << "), (" << a0.a1[1].a0
22527 << ")], " << a0.a2 << "))"
22528 << ")\n";
22529
22530 f(a0);
22531}
22532
22533// Used for testing structs and unions by value.
22534// Return value in FPU registers on arm64.
22536 // NOLINTNEXTLINE(whitespace/parens)
22539
22540 a0.a0.a0 = -1.0;
22541 a0.a1[0].a0 = 2.0;
22542 a0.a1[1].a0 = -3.0;
22543 a0.a2 = 4.0;
22544
22545 std::cout
22546 << "Calling TestAsyncReturnStructArgumentStructStruct32BytesHomogeneous("
22547 << "(((" << a0.a0.a0 << "), [(" << a0.a1[0].a0 << "), (" << a0.a1[1].a0
22548 << ")], " << a0.a2 << "))"
22549 << ")\n";
22550
22551 f(a0);
22552}
22553
22554// Used for testing structs and unions by value.
22555// On x64 Linux, return value is split over FP and int registers.
22557 // NOLINTNEXTLINE(whitespace/parens)
22558 void (*f)(StructStruct16BytesMixed3 a0)) {
22560
22561 a0.a0.a0 = -1.0;
22562 a0.a1[0].a0 = 2.0;
22563 a0.a1[0].a1 = -3;
22564 a0.a1[0].a2 = 4;
22565 a0.a2[0] = -5;
22566 a0.a2[1] = 6;
22567
22568 std::cout << "Calling TestAsyncReturnStructArgumentStructStruct16BytesMixed3("
22569 << "(((" << a0.a0.a0 << "), [(" << a0.a1[0].a0 << ", "
22570 << a0.a1[0].a1 << ", " << a0.a1[0].a2 << ")], [" << a0.a2[0] << ", "
22571 << a0.a2[1] << "]))"
22572 << ")\n";
22573
22574 f(a0);
22575}
22576
22577// Used for testing structs and unions by value.
22578// Test alignment and padding of 16 byte int within struct.
22580 // NOLINTNEXTLINE(whitespace/parens)
22581 void (*f)(int8_t a0, int16_t a1, int8_t a2)) {
22582 int8_t a0;
22583 int16_t a1;
22584 int8_t a2;
22585
22586 a0 = -1;
22587 a1 = 2;
22588 a2 = -3;
22589
22590 std::cout << "Calling TestAsyncReturnStructAlignmentInt16("
22591 << "(" << static_cast<int>(a0) << ", " << a1 << ", "
22592 << static_cast<int>(a2) << ")"
22593 << ")\n";
22594
22595 f(a0, a1, a2);
22596}
22597
22598// Used for testing structs and unions by value.
22599// Test alignment and padding of 32 byte int within struct.
22601 // NOLINTNEXTLINE(whitespace/parens)
22602 void (*f)(int8_t a0, int32_t a1, int8_t a2)) {
22603 int8_t a0;
22604 int32_t a1;
22605 int8_t a2;
22606
22607 a0 = -1;
22608 a1 = 2;
22609 a2 = -3;
22610
22611 std::cout << "Calling TestAsyncReturnStructAlignmentInt32("
22612 << "(" << static_cast<int>(a0) << ", " << a1 << ", "
22613 << static_cast<int>(a2) << ")"
22614 << ")\n";
22615
22616 f(a0, a1, a2);
22617}
22618
22619// Used for testing structs and unions by value.
22620// Test alignment and padding of 64 byte int within struct.
22622 // NOLINTNEXTLINE(whitespace/parens)
22623 void (*f)(int8_t a0, int64_t a1, int8_t a2)) {
22624 int8_t a0;
22625 int64_t a1;
22626 int8_t a2;
22627
22628 a0 = -1;
22629 a1 = 2;
22630 a2 = -3;
22631
22632 std::cout << "Calling TestAsyncReturnStructAlignmentInt64("
22633 << "(" << static_cast<int>(a0) << ", " << a1 << ", "
22634 << static_cast<int>(a2) << ")"
22635 << ")\n";
22636
22637 f(a0, a1, a2);
22638}
22639
22640// Used for testing structs and unions by value.
22641// Simple nested struct.
22643 // NOLINTNEXTLINE(whitespace/parens)
22648
22649 a0.a0 = -1;
22650 a0.a1 = 2;
22651 a1.a0 = -3;
22652 a1.a1 = 4;
22653
22654 std::cout << "Calling TestAsyncReturnStruct8BytesNestedInt("
22655 << "((" << a0.a0 << ", " << a0.a1 << "), (" << a1.a0 << ", "
22656 << a1.a1 << "))"
22657 << ")\n";
22658
22659 f(a0, a1);
22660}
22661
22662// Used for testing structs and unions by value.
22663// Simple nested struct with floats.
22665 // NOLINTNEXTLINE(whitespace/parens)
22666 void (*f)(Struct4BytesFloat a0, Struct4BytesFloat a1)) {
22667 Struct4BytesFloat a0 = {};
22668 Struct4BytesFloat a1 = {};
22669
22670 a0.a0 = -1.0;
22671 a1.a0 = 2.0;
22672
22673 std::cout << "Calling TestAsyncReturnStruct8BytesNestedFloat("
22674 << "((" << a0.a0 << "), (" << a1.a0 << "))"
22675 << ")\n";
22676
22677 f(a0, a1);
22678}
22679
22680// Used for testing structs and unions by value.
22681// The nesting is irregular, testing homogenous float rules on arm and arm64,
22682// and the fpu register usage on x64.
22684 // NOLINTNEXTLINE(whitespace/parens)
22685 void (*f)(Struct4BytesFloat a0, float a1)) {
22686 Struct4BytesFloat a0 = {};
22687 float a1;
22688
22689 a0.a0 = -1.0;
22690 a1 = 2.0;
22691
22692 std::cout << "Calling TestAsyncReturnStruct8BytesNestedFloat2("
22693 << "((" << a0.a0 << "), " << a1 << ")"
22694 << ")\n";
22695
22696 f(a0, a1);
22697}
22698
22699// Used for testing structs and unions by value.
22700// Simple nested struct with mixed members.
22702 // NOLINTNEXTLINE(whitespace/parens)
22705 Struct4BytesFloat a1 = {};
22706
22707 a0.a0 = -1;
22708 a0.a1 = 2;
22709 a1.a0 = -3.0;
22710
22711 std::cout << "Calling TestAsyncReturnStruct8BytesNestedMixed("
22712 << "((" << a0.a0 << ", " << a0.a1 << "), (" << a1.a0 << "))"
22713 << ")\n";
22714
22715 f(a0, a1);
22716}
22717
22718// Used for testing structs and unions by value.
22719// Deeper nested struct to test recursive member access.
22721 // NOLINTNEXTLINE(whitespace/parens)
22723 Struct8BytesNestedInt a0 = {};
22724 Struct8BytesNestedInt a1 = {};
22725
22726 a0.a0.a0 = -1;
22727 a0.a0.a1 = 2;
22728 a0.a1.a0 = -3;
22729 a0.a1.a1 = 4;
22730 a1.a0.a0 = -5;
22731 a1.a0.a1 = 6;
22732 a1.a1.a0 = -7;
22733 a1.a1.a1 = 8;
22734
22735 std::cout << "Calling TestAsyncReturnStruct16BytesNestedInt("
22736 << "(((" << a0.a0.a0 << ", " << a0.a0.a1 << "), (" << a0.a1.a0
22737 << ", " << a0.a1.a1 << ")), ((" << a1.a0.a0 << ", " << a1.a0.a1
22738 << "), (" << a1.a1.a0 << ", " << a1.a1.a1 << ")))"
22739 << ")\n";
22740
22741 f(a0, a1);
22742}
22743
22744// Used for testing structs and unions by value.
22745// Even deeper nested struct to test recursive member access.
22747 // NOLINTNEXTLINE(whitespace/parens)
22749 Struct16BytesNestedInt a0 = {};
22750 Struct16BytesNestedInt a1 = {};
22751
22752 a0.a0.a0.a0 = -1;
22753 a0.a0.a0.a1 = 2;
22754 a0.a0.a1.a0 = -3;
22755 a0.a0.a1.a1 = 4;
22756 a0.a1.a0.a0 = -5;
22757 a0.a1.a0.a1 = 6;
22758 a0.a1.a1.a0 = -7;
22759 a0.a1.a1.a1 = 8;
22760 a1.a0.a0.a0 = -9;
22761 a1.a0.a0.a1 = 10;
22762 a1.a0.a1.a0 = -11;
22763 a1.a0.a1.a1 = 12;
22764 a1.a1.a0.a0 = -13;
22765 a1.a1.a0.a1 = 14;
22766 a1.a1.a1.a0 = -15;
22767 a1.a1.a1.a1 = 16;
22768
22769 std::cout << "Calling TestAsyncReturnStruct32BytesNestedInt("
22770 << "((((" << a0.a0.a0.a0 << ", " << a0.a0.a0.a1 << "), ("
22771 << a0.a0.a1.a0 << ", " << a0.a0.a1.a1 << ")), ((" << a0.a1.a0.a0
22772 << ", " << a0.a1.a0.a1 << "), (" << a0.a1.a1.a0 << ", "
22773 << a0.a1.a1.a1 << "))), (((" << a1.a0.a0.a0 << ", " << a1.a0.a0.a1
22774 << "), (" << a1.a0.a1.a0 << ", " << a1.a0.a1.a1 << ")), (("
22775 << a1.a1.a0.a0 << ", " << a1.a1.a0.a1 << "), (" << a1.a1.a1.a0
22776 << ", " << a1.a1.a1.a1 << "))))"
22777 << ")\n";
22778
22779 f(a0, a1);
22780}
22781
22782// Used for testing structs and unions by value.
22783// Test alignment and padding of nested struct with 16 byte int.
22785 // NOLINTNEXTLINE(whitespace/parens)
22787 StructAlignmentInt16 a0 = {};
22788 StructAlignmentInt16 a1 = {};
22789
22790 a0.a0 = -1;
22791 a0.a1 = 2;
22792 a0.a2 = -3;
22793 a1.a0 = 4;
22794 a1.a1 = -5;
22795 a1.a2 = 6;
22796
22797 std::cout << "Calling TestAsyncReturnStructNestedIntStructAlignmentInt16("
22798 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
22799 << static_cast<int>(a0.a2) << "), (" << static_cast<int>(a1.a0)
22800 << ", " << a1.a1 << ", " << static_cast<int>(a1.a2) << "))"
22801 << ")\n";
22802
22803 f(a0, a1);
22804}
22805
22806// Used for testing structs and unions by value.
22807// Test alignment and padding of nested struct with 32 byte int.
22809 // NOLINTNEXTLINE(whitespace/parens)
22811 StructAlignmentInt32 a0 = {};
22812 StructAlignmentInt32 a1 = {};
22813
22814 a0.a0 = -1;
22815 a0.a1 = 2;
22816 a0.a2 = -3;
22817 a1.a0 = 4;
22818 a1.a1 = -5;
22819 a1.a2 = 6;
22820
22821 std::cout << "Calling TestAsyncReturnStructNestedIntStructAlignmentInt32("
22822 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
22823 << static_cast<int>(a0.a2) << "), (" << static_cast<int>(a1.a0)
22824 << ", " << a1.a1 << ", " << static_cast<int>(a1.a2) << "))"
22825 << ")\n";
22826
22827 f(a0, a1);
22828}
22829
22830// Used for testing structs and unions by value.
22831// Test alignment and padding of nested struct with 64 byte int.
22833 // NOLINTNEXTLINE(whitespace/parens)
22835 StructAlignmentInt64 a0 = {};
22836 StructAlignmentInt64 a1 = {};
22837
22838 a0.a0 = -1;
22839 a0.a1 = 2;
22840 a0.a2 = -3;
22841 a1.a0 = 4;
22842 a1.a1 = -5;
22843 a1.a2 = 6;
22844
22845 std::cout << "Calling TestAsyncReturnStructNestedIntStructAlignmentInt64("
22846 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
22847 << static_cast<int>(a0.a2) << "), (" << static_cast<int>(a1.a0)
22848 << ", " << a1.a1 << ", " << static_cast<int>(a1.a2) << "))"
22849 << ")\n";
22850
22851 f(a0, a1);
22852}
22853
22854// Used for testing structs and unions by value.
22855// Return big irregular struct as smoke test.
22857 // NOLINTNEXTLINE(whitespace/parens)
22858 void (*f)(uint64_t a0,
22861 double a3)) {
22862 uint64_t a0;
22865 double a3;
22866
22867 a0 = 1;
22868 a1.a0.a0 = 2;
22869 a1.a0.a1.a0.a0 = -3;
22870 a1.a0.a1.a0.a1 = 4;
22871 a1.a0.a1.a1.a0 = -5.0;
22872 a1.a0.a2 = 6;
22873 a1.a0.a3.a0.a0 = -7.0;
22874 a1.a0.a3.a1 = 8.0;
22875 a1.a0.a4 = 9;
22876 a1.a0.a5.a0.a0 = 10.0;
22877 a1.a0.a5.a1.a0 = -11.0;
22878 a1.a0.a6 = 12;
22879 a1.a1.a0.a0 = -13;
22880 a1.a1.a0.a1 = 14;
22881 a1.a1.a1.a0 = -15.0;
22882 a1.a2 = 16.0;
22883 a1.a3 = -17.0;
22884 a2.a0.a0 = 18;
22885 a2.a0.a1.a0.a0 = -19;
22886 a2.a0.a1.a0.a1 = 20;
22887 a2.a0.a1.a1.a0 = -21.0;
22888 a2.a0.a2 = 22;
22889 a2.a0.a3.a0.a0 = -23.0;
22890 a2.a0.a3.a1 = 24.0;
22891 a2.a0.a4 = 25;
22892 a2.a0.a5.a0.a0 = 26.0;
22893 a2.a0.a5.a1.a0 = -27.0;
22894 a2.a0.a6 = 28;
22895 a2.a1.a0.a0 = -29;
22896 a2.a1.a0.a1 = 30;
22897 a2.a1.a1.a0 = -31.0;
22898 a2.a2 = 32.0;
22899 a2.a3 = -33.0;
22900 a3 = 34.0;
22901
22902 std::cout << "Calling TestAsyncReturnStructNestedIrregularEvenBigger("
22903 << "(" << a0 << ", ((" << a1.a0.a0 << ", ((" << a1.a0.a1.a0.a0
22904 << ", " << a1.a0.a1.a0.a1 << "), (" << a1.a0.a1.a1.a0 << ")), "
22905 << a1.a0.a2 << ", ((" << a1.a0.a3.a0.a0 << "), " << a1.a0.a3.a1
22906 << "), " << a1.a0.a4 << ", ((" << a1.a0.a5.a0.a0 << "), ("
22907 << a1.a0.a5.a1.a0 << ")), " << a1.a0.a6 << "), ((" << a1.a1.a0.a0
22908 << ", " << a1.a1.a0.a1 << "), (" << a1.a1.a1.a0 << ")), " << a1.a2
22909 << ", " << a1.a3 << "), ((" << a2.a0.a0 << ", ((" << a2.a0.a1.a0.a0
22910 << ", " << a2.a0.a1.a0.a1 << "), (" << a2.a0.a1.a1.a0 << ")), "
22911 << a2.a0.a2 << ", ((" << a2.a0.a3.a0.a0 << "), " << a2.a0.a3.a1
22912 << "), " << a2.a0.a4 << ", ((" << a2.a0.a5.a0.a0 << "), ("
22913 << a2.a0.a5.a1.a0 << ")), " << a2.a0.a6 << "), ((" << a2.a1.a0.a0
22914 << ", " << a2.a1.a0.a1 << "), (" << a2.a1.a1.a0 << ")), " << a2.a2
22915 << ", " << a2.a3 << "), " << a3 << ")"
22916 << ")\n";
22917
22918 f(a0, a1, a2, a3);
22919}
22920
22921// Used for testing structs and unions by value.
22922// Single variadic argument.
22923DART_EXPORT int64_t VariadicAt1Int64x2(int64_t a0, ...) {
22924 va_list var_args;
22925 va_start(var_args, a0);
22926 int64_t a1 = va_arg(var_args, int64_t);
22927 va_end(var_args);
22928
22929 std::cout << "VariadicAt1Int64x2"
22930 << "(" << a0 << ", " << a1 << ")"
22931 << "\n";
22932
22933 int64_t result = 0;
22934
22935 result += a0;
22936 result += a1;
22937
22938 std::cout << "result = " << result << "\n";
22939
22940 return result;
22941}
22942
22943// Used for testing structs and unions by value.
22944// Single variadic argument.
22945DART_EXPORT double VariadicAt1Doublex2(double a0, ...) {
22946 va_list var_args;
22947 va_start(var_args, a0);
22948 double a1 = va_arg(var_args, double);
22949 va_end(var_args);
22950
22951 std::cout << "VariadicAt1Doublex2"
22952 << "(" << a0 << ", " << a1 << ")"
22953 << "\n";
22954
22955 double result = 0;
22956
22957 result += a0;
22958 result += a1;
22959
22960 std::cout << "result = " << result << "\n";
22961
22962 return result;
22963}
22964
22965// Used for testing structs and unions by value.
22966// Variadic arguments.
22967DART_EXPORT int64_t VariadicAt1Int64x5(int64_t a0, ...) {
22968 va_list var_args;
22969 va_start(var_args, a0);
22970 int64_t a1 = va_arg(var_args, int64_t);
22971 int64_t a2 = va_arg(var_args, int64_t);
22972 int64_t a3 = va_arg(var_args, int64_t);
22973 int64_t a4 = va_arg(var_args, int64_t);
22974 va_end(var_args);
22975
22976 std::cout << "VariadicAt1Int64x5"
22977 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
22978 << ")"
22979 << "\n";
22980
22981 int64_t result = 0;
22982
22983 result += a0;
22984 result += a1;
22985 result += a2;
22986 result += a3;
22987 result += a4;
22988
22989 std::cout << "result = " << result << "\n";
22990
22991 return result;
22992}
22993
22994// Used for testing structs and unions by value.
22995// Variadic arguments.
22996DART_EXPORT double VariadicAt1Doublex5(double a0, ...) {
22997 va_list var_args;
22998 va_start(var_args, a0);
22999 double a1 = va_arg(var_args, double);
23000 double a2 = va_arg(var_args, double);
23001 double a3 = va_arg(var_args, double);
23002 double a4 = va_arg(var_args, double);
23003 va_end(var_args);
23004
23005 std::cout << "VariadicAt1Doublex5"
23006 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
23007 << ")"
23008 << "\n";
23009
23010 double result = 0;
23011
23012 result += a0;
23013 result += a1;
23014 result += a2;
23015 result += a3;
23016 result += a4;
23017
23018 std::cout << "result = " << result << "\n";
23019
23020 return result;
23021}
23022
23023// Used for testing structs and unions by value.
23024// Variadic arguments exhaust registers.
23025DART_EXPORT int64_t VariadicAt1Int64x20(int64_t a0, ...) {
23026 va_list var_args;
23027 va_start(var_args, a0);
23028 int64_t a1 = va_arg(var_args, int64_t);
23029 int64_t a2 = va_arg(var_args, int64_t);
23030 int64_t a3 = va_arg(var_args, int64_t);
23031 int64_t a4 = va_arg(var_args, int64_t);
23032 int64_t a5 = va_arg(var_args, int64_t);
23033 int64_t a6 = va_arg(var_args, int64_t);
23034 int64_t a7 = va_arg(var_args, int64_t);
23035 int64_t a8 = va_arg(var_args, int64_t);
23036 int64_t a9 = va_arg(var_args, int64_t);
23037 int64_t a10 = va_arg(var_args, int64_t);
23038 int64_t a11 = va_arg(var_args, int64_t);
23039 int64_t a12 = va_arg(var_args, int64_t);
23040 int64_t a13 = va_arg(var_args, int64_t);
23041 int64_t a14 = va_arg(var_args, int64_t);
23042 int64_t a15 = va_arg(var_args, int64_t);
23043 int64_t a16 = va_arg(var_args, int64_t);
23044 int64_t a17 = va_arg(var_args, int64_t);
23045 int64_t a18 = va_arg(var_args, int64_t);
23046 int64_t a19 = va_arg(var_args, int64_t);
23047 va_end(var_args);
23048
23049 std::cout << "VariadicAt1Int64x20"
23050 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
23051 << ", " << a5 << ", " << a6 << ", " << a7 << ", " << a8 << ", "
23052 << a9 << ", " << a10 << ", " << a11 << ", " << a12 << ", " << a13
23053 << ", " << a14 << ", " << a15 << ", " << a16 << ", " << a17 << ", "
23054 << a18 << ", " << a19 << ")"
23055 << "\n";
23056
23057 int64_t result = 0;
23058
23059 result += a0;
23060 result += a1;
23061 result += a2;
23062 result += a3;
23063 result += a4;
23064 result += a5;
23065 result += a6;
23066 result += a7;
23067 result += a8;
23068 result += a9;
23069 result += a10;
23070 result += a11;
23071 result += a12;
23072 result += a13;
23073 result += a14;
23074 result += a15;
23075 result += a16;
23076 result += a17;
23077 result += a18;
23078 result += a19;
23079
23080 std::cout << "result = " << result << "\n";
23081
23082 return result;
23083}
23084
23085// Used for testing structs and unions by value.
23086// Variadic arguments exhaust registers.
23087DART_EXPORT double VariadicAt1Doublex20(double a0, ...) {
23088 va_list var_args;
23089 va_start(var_args, a0);
23090 double a1 = va_arg(var_args, double);
23091 double a2 = va_arg(var_args, double);
23092 double a3 = va_arg(var_args, double);
23093 double a4 = va_arg(var_args, double);
23094 double a5 = va_arg(var_args, double);
23095 double a6 = va_arg(var_args, double);
23096 double a7 = va_arg(var_args, double);
23097 double a8 = va_arg(var_args, double);
23098 double a9 = va_arg(var_args, double);
23099 double a10 = va_arg(var_args, double);
23100 double a11 = va_arg(var_args, double);
23101 double a12 = va_arg(var_args, double);
23102 double a13 = va_arg(var_args, double);
23103 double a14 = va_arg(var_args, double);
23104 double a15 = va_arg(var_args, double);
23105 double a16 = va_arg(var_args, double);
23106 double a17 = va_arg(var_args, double);
23107 double a18 = va_arg(var_args, double);
23108 double a19 = va_arg(var_args, double);
23109 va_end(var_args);
23110
23111 std::cout << "VariadicAt1Doublex20"
23112 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
23113 << ", " << a5 << ", " << a6 << ", " << a7 << ", " << a8 << ", "
23114 << a9 << ", " << a10 << ", " << a11 << ", " << a12 << ", " << a13
23115 << ", " << a14 << ", " << a15 << ", " << a16 << ", " << a17 << ", "
23116 << a18 << ", " << a19 << ")"
23117 << "\n";
23118
23119 double result = 0;
23120
23121 result += a0;
23122 result += a1;
23123 result += a2;
23124 result += a3;
23125 result += a4;
23126 result += a5;
23127 result += a6;
23128 result += a7;
23129 result += a8;
23130 result += a9;
23131 result += a10;
23132 result += a11;
23133 result += a12;
23134 result += a13;
23135 result += a14;
23136 result += a15;
23137 result += a16;
23138 result += a17;
23139 result += a18;
23140 result += a19;
23141
23142 std::cout << "result = " << result << "\n";
23143
23144 return result;
23145}
23146
23147// Used for testing structs and unions by value.
23148// Variadic arguments including struct.
23150 va_list var_args;
23151 va_start(var_args, a0);
23152 int64_t a1 = va_arg(var_args, int64_t);
23153 Struct8BytesInt a2 = va_arg(var_args, Struct8BytesInt);
23154 int64_t a3 = va_arg(var_args, int64_t);
23155 va_end(var_args);
23156
23157 std::cout << "VariadicAt1Int64x2Struct8BytesIntInt64"
23158 << "(" << a0 << ", " << a1 << ", (" << a2.a0 << ", " << a2.a1
23159 << ", " << a2.a2 << "), " << a3 << ")"
23160 << "\n";
23161
23162 int64_t result = 0;
23163
23164 result += a0;
23165 result += a1;
23166 result += a2.a0;
23167 result += a2.a1;
23168 result += a2.a2;
23169 result += a3;
23170
23171 std::cout << "result = " << result << "\n";
23172
23173 return result;
23174}
23175
23176// Used for testing structs and unions by value.
23177// Variadic arguments including struct.
23179 ...) {
23180 va_list var_args;
23181 va_start(var_args, a0);
23182 double a1 = va_arg(var_args, double);
23184 va_arg(var_args, Struct32BytesHomogeneousDouble);
23185 double a3 = va_arg(var_args, double);
23186 va_end(var_args);
23187
23188 std::cout << "VariadicAt1Doublex2Struct32BytesHomogeneousDoubleD"
23189 << "(" << a0 << ", " << a1 << ", (" << a2.a0 << ", " << a2.a1
23190 << ", " << a2.a2 << ", " << a2.a3 << "), " << a3 << ")"
23191 << "\n";
23192
23193 double result = 0;
23194
23195 result += a0;
23196 result += a1;
23197 result += a2.a0;
23198 result += a2.a1;
23199 result += a2.a2;
23200 result += a2.a3;
23201 result += a3;
23202
23203 std::cout << "result = " << result << "\n";
23204
23205 return result;
23206}
23207
23208// Used for testing structs and unions by value.
23209// Variadic arguments including struct.
23211 ...) {
23212 va_list var_args;
23213 va_start(var_args, a0);
23215 va_arg(var_args, Struct12BytesHomogeneousFloat);
23216 double a2 = va_arg(var_args, double);
23217 va_end(var_args);
23218
23219 std::cout << "VariadicAt1DoubleStruct12BytesHomogeneousFloatDoub"
23220 << "(" << a0 << ", (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2
23221 << "), " << a2 << ")"
23222 << "\n";
23223
23224 double result = 0;
23225
23226 result += a0;
23227 result += a1.a0;
23228 result += a1.a1;
23229 result += a1.a2;
23230 result += a2;
23231
23232 std::cout << "result = " << result << "\n";
23233
23234 return result;
23235}
23236
23237// Used for testing structs and unions by value.
23238// Variadic arguments including struct.
23239DART_EXPORT int32_t
23241 va_list var_args;
23242 va_start(var_args, a0);
23244 va_arg(var_args, Struct20BytesHomogeneousInt32);
23245 int32_t a2 = va_arg(var_args, int32_t);
23246 va_end(var_args);
23247
23248 std::cout << "VariadicAt1Int32Struct20BytesHomogeneousInt32Int32"
23249 << "(" << a0 << ", (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2
23250 << ", " << a1.a3 << ", " << a1.a4 << "), " << a2 << ")"
23251 << "\n";
23252
23253 int32_t result = 0;
23254
23255 result += a0;
23256 result += a1.a0;
23257 result += a1.a1;
23258 result += a1.a2;
23259 result += a1.a3;
23260 result += a1.a4;
23261 result += a2;
23262
23263 std::cout << "result = " << result << "\n";
23264
23265 return result;
23266}
23267
23268// Used for testing structs and unions by value.
23269// Variadic arguments including struct.
23271 ...) {
23272 va_list var_args;
23273 va_start(var_args, a0);
23275 va_arg(var_args, Struct20BytesHomogeneousFloat);
23276 double a2 = va_arg(var_args, double);
23277 va_end(var_args);
23278
23279 std::cout << "VariadicAt1DoubleStruct20BytesHomogeneousFloatDoub"
23280 << "(" << a0 << ", (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2
23281 << ", " << a1.a3 << ", " << a1.a4 << "), " << a2 << ")"
23282 << "\n";
23283
23284 double result = 0;
23285
23286 result += a0;
23287 result += a1.a0;
23288 result += a1.a1;
23289 result += a1.a2;
23290 result += a1.a3;
23291 result += a1.a4;
23292 result += a2;
23293
23294 std::cout << "result = " << result << "\n";
23295
23296 return result;
23297}
23298
23299// Used for testing structs and unions by value.
23300// Regression test for variadic arguments.
23301// https://github.com/dart-lang/sdk/issues/49460
23302DART_EXPORT int32_t VariadicAt2Int32Int64IntPtr(int32_t a0, int64_t a1, ...) {
23303 va_list var_args;
23304 va_start(var_args, a1);
23305 intptr_t a2 = va_arg(var_args, intptr_t);
23306 va_end(var_args);
23307
23308 std::cout << "VariadicAt2Int32Int64IntPtr"
23309 << "(" << a0 << ", " << a1 << ", " << a2 << ")"
23310 << "\n";
23311
23312 int32_t result = 0;
23313
23314 result += a0;
23315 result += a1;
23316 result += a2;
23317
23318 std::cout << "result = " << result << "\n";
23319
23320 return result;
23321}
23322
23323// Used for testing structs and unions by value.
23324// Variadic arguments mixed.
23326 va_list var_args;
23327 va_start(var_args, a0);
23328 int64_t a1 = va_arg(var_args, int64_t);
23329 int32_t a2 = va_arg(var_args, int32_t);
23330 double a3 = va_arg(var_args, double);
23331 int64_t a4 = va_arg(var_args, int64_t);
23332 int32_t a5 = va_arg(var_args, int32_t);
23333 va_end(var_args);
23334
23335 std::cout << "VariadicAt1DoubleInt64Int32DoubleInt64Int32"
23336 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
23337 << ", " << a5 << ")"
23338 << "\n";
23339
23340 double result = 0;
23341
23342 result += a0;
23343 result += a1;
23344 result += a2;
23345 result += a3;
23346 result += a4;
23347 result += a5;
23348
23349 std::cout << "result = " << result << "\n";
23350
23351 return result;
23352}
23353
23354// Used for testing structs and unions by value.
23355// Variadic arguments homogenous struct stack alignment on macos_arm64.
23357 int64_t a0,
23358 ...) {
23359 va_list var_args;
23360 va_start(var_args, a0);
23361 int32_t a1 = va_arg(var_args, int32_t);
23363 va_arg(var_args, Struct12BytesHomogeneousFloat);
23364 va_end(var_args);
23365
23366 std::cout << "VariadicAt1Int64Int32Struct12BytesHomogeneousFloat"
23367 << "(" << a0 << ", " << a1 << ", (" << a2.a0 << ", " << a2.a1
23368 << ", " << a2.a2 << "))"
23369 << "\n";
23370
23371 double result = 0;
23372
23373 result += a0;
23374 result += a1;
23375 result += a2.a0;
23376 result += a2.a1;
23377 result += a2.a2;
23378
23379 std::cout << "result = " << result << "\n";
23380
23381 return result;
23382}
23383
23384// Used for testing structs and unions by value.
23385// Variadic arguments homogenous struct stack alignment on macos_arm64.
23387 double a0,
23388 double a1,
23389 double a2,
23390 double a3,
23391 double a4,
23392 double a5,
23393 double a6,
23394 double a7,
23395 float a8,
23397 int64_t a10,
23398 ...) {
23399 va_list var_args;
23400 va_start(var_args, a10);
23401 int32_t a11 = va_arg(var_args, int32_t);
23403 va_arg(var_args, Struct12BytesHomogeneousFloat);
23404 va_end(var_args);
23405
23406 std::cout << "VariadicAt11Doublex8FloatStruct12BytesHomogeneousF"
23407 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
23408 << ", " << a5 << ", " << a6 << ", " << a7 << ", " << a8 << ", ("
23409 << a9.a0 << ", " << a9.a1 << ", " << a9.a2 << "), " << a10 << ", "
23410 << a11 << ", (" << a12.a0 << ", " << a12.a1 << ", " << a12.a2
23411 << "))"
23412 << "\n";
23413
23414 double result = 0;
23415
23416 result += a0;
23417 result += a1;
23418 result += a2;
23419 result += a3;
23420 result += a4;
23421 result += a5;
23422 result += a6;
23423 result += a7;
23424 result += a8;
23425 result += a9.a0;
23426 result += a9.a1;
23427 result += a9.a2;
23428 result += a10;
23429 result += a11;
23430 result += a12.a0;
23431 result += a12.a1;
23432 result += a12.a2;
23433
23434 std::cout << "result = " << result << "\n";
23435
23436 return result;
23437}
23438
23439// Used for testing structs and unions by value.
23440// Variadic arguments mixed.
23442 ...) {
23443 va_list var_args;
23444 va_start(var_args, a0);
23445 int64_t a1 = va_arg(var_args, int64_t);
23446 int32_t a2 = va_arg(var_args, int32_t);
23448 va_arg(var_args, Struct20BytesHomogeneousInt32);
23449 double a4 = va_arg(var_args, double);
23450 int64_t a5 = va_arg(var_args, int64_t);
23451 int32_t a6 = va_arg(var_args, int32_t);
23453 va_arg(var_args, Struct12BytesHomogeneousFloat);
23454 int64_t a8 = va_arg(var_args, int64_t);
23455 va_end(var_args);
23456
23457 std::cout << "VariadicAt1DoubleInt64Int32Struct20BytesHomogeneou"
23458 << "(" << a0 << ", " << a1 << ", " << a2 << ", (" << a3.a0 << ", "
23459 << a3.a1 << ", " << a3.a2 << ", " << a3.a3 << ", " << a3.a4 << "), "
23460 << a4 << ", " << a5 << ", " << a6 << ", (" << a7.a0 << ", " << a7.a1
23461 << ", " << a7.a2 << "), " << a8 << ")"
23462 << "\n";
23463
23464 double result = 0;
23465
23466 result += a0;
23467 result += a1;
23468 result += a2;
23469 result += a3.a0;
23470 result += a3.a1;
23471 result += a3.a2;
23472 result += a3.a3;
23473 result += a3.a4;
23474 result += a4;
23475 result += a5;
23476 result += a6;
23477 result += a7.a0;
23478 result += a7.a1;
23479 result += a7.a2;
23480 result += a8;
23481
23482 std::cout << "result = " << result << "\n";
23483
23484 return result;
23485}
23486
23487// Used for testing structs and unions by value.
23488// Variadic arguments function definition, but not passing any.
23490 double a1,
23491 double a2,
23492 double a3,
23493 double a4,
23494 ...) {
23495 va_list var_args;
23496 va_start(var_args, a4);
23497
23498 va_end(var_args);
23499
23500 std::cout << "VariadicAt5Doublex5"
23501 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
23502 << ")"
23503 << "\n";
23504
23505 double result = 0;
23506
23507 result += a0;
23508 result += a1;
23509 result += a2;
23510 result += a3;
23511 result += a4;
23512
23513 std::cout << "result = " << result << "\n";
23514
23515 return result;
23516}
23517
23518// Used for testing structs and unions by value.
23519// Struct stradles last argument register, variadic
23521 ...) {
23522 va_list var_args;
23523 va_start(var_args, a0);
23524 int64_t a1 = va_arg(var_args, int64_t);
23525 int64_t a2 = va_arg(var_args, int64_t);
23526 int64_t a3 = va_arg(var_args, int64_t);
23527 int64_t a4 = va_arg(var_args, int64_t);
23528 int64_t a5 = va_arg(var_args, int64_t);
23529 int64_t a6 = va_arg(var_args, int64_t);
23531 va_arg(var_args, Struct12BytesHomogeneousInt32);
23532 va_end(var_args);
23533
23534 std::cout << "VariadicAt1Int64x7Struct12BytesHomogeneousInt32"
23535 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
23536 << ", " << a5 << ", " << a6 << ", (" << a7.a0 << ", " << a7.a1
23537 << ", " << a7.a2 << "))"
23538 << "\n";
23539
23540 int64_t result = 0;
23541
23542 result += a0;
23543 result += a1;
23544 result += a2;
23545 result += a3;
23546 result += a4;
23547 result += a5;
23548 result += a6;
23549 result += a7.a0;
23550 result += a7.a1;
23551 result += a7.a2;
23552
23553 std::cout << "result = " << result << "\n";
23554
23555 return result;
23556}
23557
23558// Used for testing structs and unions by value.
23559// Variadic arguments test on macos_arm64.
23562 ...) {
23563 va_list var_args;
23564 va_start(var_args, a0);
23565 int32_t a1 = va_arg(var_args, int32_t);
23566 int32_t a2 = va_arg(var_args, int32_t);
23567 int32_t a3 = va_arg(var_args, int32_t);
23568 int32_t a4 = va_arg(var_args, int32_t);
23569 va_end(var_args);
23570
23571 std::cout << "VariadicAt1Struct12BytesHomogeneousInt32Int32x4"
23572 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << "), " << a1
23573 << ", " << a2 << ", " << a3 << ", " << a4 << ")"
23574 << "\n";
23575
23576 int32_t result = 0;
23577
23578 result += a0.a0;
23579 result += a0.a1;
23580 result += a0.a2;
23581 result += a1;
23582 result += a2;
23583 result += a3;
23584 result += a4;
23585
23586 std::cout << "result = " << result << "\n";
23587
23588 return result;
23589}
23590
23591// Used for testing structs and unions by value.
23592// Single variadic argument.
23594 // NOLINTNEXTLINE(whitespace/parens)
23595 int64_t (*f)(int64_t a0, ...)) {
23596 int64_t a0;
23597 int64_t a1;
23598
23599 a0 = -1;
23600 a1 = 2;
23601
23602 std::cout << "Calling TestVariadicAt1Int64x2("
23603 << "(" << a0 << ", " << a1 << ")"
23604 << ")\n";
23605
23606 int64_t result = f(a0, a1);
23607
23608 std::cout << "result = " << result << "\n";
23609
23610 CHECK_EQ(1, result);
23611
23612 // Pass argument that will make the Dart callback throw.
23613 a0 = 42;
23614
23615 result = f(a0, a1);
23616
23617 CHECK_EQ(0, result);
23618
23619 // Pass argument that will make the Dart callback return null.
23620 a0 = 84;
23621
23622 result = f(a0, a1);
23623
23624 CHECK_EQ(0, result);
23625
23626 return 0;
23627}
23628
23629// Used for testing structs and unions by value.
23630// Single variadic argument.
23632 // NOLINTNEXTLINE(whitespace/parens)
23633 double (*f)(double a0, ...)) {
23634 double a0;
23635 double a1;
23636
23637 a0 = -1.0;
23638 a1 = 2.0;
23639
23640 std::cout << "Calling TestVariadicAt1Doublex2("
23641 << "(" << a0 << ", " << a1 << ")"
23642 << ")\n";
23643
23644 double result = f(a0, a1);
23645
23646 std::cout << "result = " << result << "\n";
23647
23648 CHECK_APPROX(1.0, result);
23649
23650 // Pass argument that will make the Dart callback throw.
23651 a0 = 42;
23652
23653 result = f(a0, a1);
23654
23655 CHECK_APPROX(0.0, result);
23656
23657 // Pass argument that will make the Dart callback return null.
23658 a0 = 84;
23659
23660 result = f(a0, a1);
23661
23662 CHECK_APPROX(0.0, result);
23663
23664 return 0;
23665}
23666
23667// Used for testing structs and unions by value.
23668// Variadic arguments.
23670 // NOLINTNEXTLINE(whitespace/parens)
23671 int64_t (*f)(int64_t a0, ...)) {
23672 int64_t a0;
23673 int64_t a1;
23674 int64_t a2;
23675 int64_t a3;
23676 int64_t a4;
23677
23678 a0 = -1;
23679 a1 = 2;
23680 a2 = -3;
23681 a3 = 4;
23682 a4 = -5;
23683
23684 std::cout << "Calling TestVariadicAt1Int64x5("
23685 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
23686 << ")"
23687 << ")\n";
23688
23689 int64_t result = f(a0, a1, a2, a3, a4);
23690
23691 std::cout << "result = " << result << "\n";
23692
23693 CHECK_EQ(-3, result);
23694
23695 // Pass argument that will make the Dart callback throw.
23696 a0 = 42;
23697
23698 result = f(a0, a1, a2, a3, a4);
23699
23700 CHECK_EQ(0, result);
23701
23702 // Pass argument that will make the Dart callback return null.
23703 a0 = 84;
23704
23705 result = f(a0, a1, a2, a3, a4);
23706
23707 CHECK_EQ(0, result);
23708
23709 return 0;
23710}
23711
23712// Used for testing structs and unions by value.
23713// Variadic arguments.
23715 // NOLINTNEXTLINE(whitespace/parens)
23716 double (*f)(double a0, ...)) {
23717 double a0;
23718 double a1;
23719 double a2;
23720 double a3;
23721 double a4;
23722
23723 a0 = -1.0;
23724 a1 = 2.0;
23725 a2 = -3.0;
23726 a3 = 4.0;
23727 a4 = -5.0;
23728
23729 std::cout << "Calling TestVariadicAt1Doublex5("
23730 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
23731 << ")"
23732 << ")\n";
23733
23734 double result = f(a0, a1, a2, a3, a4);
23735
23736 std::cout << "result = " << result << "\n";
23737
23738 CHECK_APPROX(-3.0, result);
23739
23740 // Pass argument that will make the Dart callback throw.
23741 a0 = 42;
23742
23743 result = f(a0, a1, a2, a3, a4);
23744
23745 CHECK_APPROX(0.0, result);
23746
23747 // Pass argument that will make the Dart callback return null.
23748 a0 = 84;
23749
23750 result = f(a0, a1, a2, a3, a4);
23751
23752 CHECK_APPROX(0.0, result);
23753
23754 return 0;
23755}
23756
23757// Used for testing structs and unions by value.
23758// Variadic arguments exhaust registers.
23760 // NOLINTNEXTLINE(whitespace/parens)
23761 int64_t (*f)(int64_t a0, ...)) {
23762 int64_t a0;
23763 int64_t a1;
23764 int64_t a2;
23765 int64_t a3;
23766 int64_t a4;
23767 int64_t a5;
23768 int64_t a6;
23769 int64_t a7;
23770 int64_t a8;
23771 int64_t a9;
23772 int64_t a10;
23773 int64_t a11;
23774 int64_t a12;
23775 int64_t a13;
23776 int64_t a14;
23777 int64_t a15;
23778 int64_t a16;
23779 int64_t a17;
23780 int64_t a18;
23781 int64_t a19;
23782
23783 a0 = -1;
23784 a1 = 2;
23785 a2 = -3;
23786 a3 = 4;
23787 a4 = -5;
23788 a5 = 6;
23789 a6 = -7;
23790 a7 = 8;
23791 a8 = -9;
23792 a9 = 10;
23793 a10 = -11;
23794 a11 = 12;
23795 a12 = -13;
23796 a13 = 14;
23797 a14 = -15;
23798 a15 = 16;
23799 a16 = -17;
23800 a17 = 18;
23801 a18 = -19;
23802 a19 = 20;
23803
23804 std::cout << "Calling TestVariadicAt1Int64x20("
23805 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
23806 << ", " << a5 << ", " << a6 << ", " << a7 << ", " << a8 << ", "
23807 << a9 << ", " << a10 << ", " << a11 << ", " << a12 << ", " << a13
23808 << ", " << a14 << ", " << a15 << ", " << a16 << ", " << a17 << ", "
23809 << a18 << ", " << a19 << ")"
23810 << ")\n";
23811
23812 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13,
23813 a14, a15, a16, a17, a18, a19);
23814
23815 std::cout << "result = " << result << "\n";
23816
23817 CHECK_EQ(10, result);
23818
23819 // Pass argument that will make the Dart callback throw.
23820 a0 = 42;
23821
23822 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
23823 a15, a16, a17, a18, a19);
23824
23825 CHECK_EQ(0, result);
23826
23827 // Pass argument that will make the Dart callback return null.
23828 a0 = 84;
23829
23830 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
23831 a15, a16, a17, a18, a19);
23832
23833 CHECK_EQ(0, result);
23834
23835 return 0;
23836}
23837
23838// Used for testing structs and unions by value.
23839// Variadic arguments exhaust registers.
23841 // NOLINTNEXTLINE(whitespace/parens)
23842 double (*f)(double a0, ...)) {
23843 double a0;
23844 double a1;
23845 double a2;
23846 double a3;
23847 double a4;
23848 double a5;
23849 double a6;
23850 double a7;
23851 double a8;
23852 double a9;
23853 double a10;
23854 double a11;
23855 double a12;
23856 double a13;
23857 double a14;
23858 double a15;
23859 double a16;
23860 double a17;
23861 double a18;
23862 double a19;
23863
23864 a0 = -1.0;
23865 a1 = 2.0;
23866 a2 = -3.0;
23867 a3 = 4.0;
23868 a4 = -5.0;
23869 a5 = 6.0;
23870 a6 = -7.0;
23871 a7 = 8.0;
23872 a8 = -9.0;
23873 a9 = 10.0;
23874 a10 = -11.0;
23875 a11 = 12.0;
23876 a12 = -13.0;
23877 a13 = 14.0;
23878 a14 = -15.0;
23879 a15 = 16.0;
23880 a16 = -17.0;
23881 a17 = 18.0;
23882 a18 = -19.0;
23883 a19 = 20.0;
23884
23885 std::cout << "Calling TestVariadicAt1Doublex20("
23886 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
23887 << ", " << a5 << ", " << a6 << ", " << a7 << ", " << a8 << ", "
23888 << a9 << ", " << a10 << ", " << a11 << ", " << a12 << ", " << a13
23889 << ", " << a14 << ", " << a15 << ", " << a16 << ", " << a17 << ", "
23890 << a18 << ", " << a19 << ")"
23891 << ")\n";
23892
23893 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13,
23894 a14, a15, a16, a17, a18, a19);
23895
23896 std::cout << "result = " << result << "\n";
23897
23898 CHECK_APPROX(10.0, result);
23899
23900 // Pass argument that will make the Dart callback throw.
23901 a0 = 42;
23902
23903 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
23904 a15, a16, a17, a18, a19);
23905
23906 CHECK_APPROX(0.0, result);
23907
23908 // Pass argument that will make the Dart callback return null.
23909 a0 = 84;
23910
23911 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
23912 a15, a16, a17, a18, a19);
23913
23914 CHECK_APPROX(0.0, result);
23915
23916 return 0;
23917}
23918
23919// Used for testing structs and unions by value.
23920// Variadic arguments including struct.
23922 // NOLINTNEXTLINE(whitespace/parens)
23923 int64_t (*f)(int64_t a0, ...)) {
23924 int64_t a0;
23925 int64_t a1;
23926 Struct8BytesInt a2 = {};
23927 int64_t a3;
23928
23929 a0 = -1;
23930 a1 = 2;
23931 a2.a0 = -3;
23932 a2.a1 = 4;
23933 a2.a2 = -5;
23934 a3 = 6;
23935
23936 std::cout << "Calling TestVariadicAt1Int64x2Struct8BytesIntInt64("
23937 << "(" << a0 << ", " << a1 << ", (" << a2.a0 << ", " << a2.a1
23938 << ", " << a2.a2 << "), " << a3 << ")"
23939 << ")\n";
23940
23941 int64_t result = f(a0, a1, a2, a3);
23942
23943 std::cout << "result = " << result << "\n";
23944
23945 CHECK_EQ(3, result);
23946
23947 // Pass argument that will make the Dart callback throw.
23948 a0 = 42;
23949
23950 result = f(a0, a1, a2, a3);
23951
23952 CHECK_EQ(0, result);
23953
23954 // Pass argument that will make the Dart callback return null.
23955 a0 = 84;
23956
23957 result = f(a0, a1, a2, a3);
23958
23959 CHECK_EQ(0, result);
23960
23961 return 0;
23962}
23963
23964// Used for testing structs and unions by value.
23965// Variadic arguments including struct.
23967 // NOLINTNEXTLINE(whitespace/parens)
23968 double (*f)(double a0, ...)) {
23969 double a0;
23970 double a1;
23972 double a3;
23973
23974 a0 = -1.0;
23975 a1 = 2.0;
23976 a2.a0 = -3.0;
23977 a2.a1 = 4.0;
23978 a2.a2 = -5.0;
23979 a2.a3 = 6.0;
23980 a3 = -7.0;
23981
23982 std::cout << "Calling TestVariadicAt1Doublex2Struct32BytesHomogeneousDoubleD("
23983 << "(" << a0 << ", " << a1 << ", (" << a2.a0 << ", " << a2.a1
23984 << ", " << a2.a2 << ", " << a2.a3 << "), " << a3 << ")"
23985 << ")\n";
23986
23987 double result = f(a0, a1, a2, a3);
23988
23989 std::cout << "result = " << result << "\n";
23990
23991 CHECK_APPROX(-4.0, result);
23992
23993 // Pass argument that will make the Dart callback throw.
23994 a0 = 42;
23995
23996 result = f(a0, a1, a2, a3);
23997
23998 CHECK_APPROX(0.0, result);
23999
24000 // Pass argument that will make the Dart callback return null.
24001 a0 = 84;
24002
24003 result = f(a0, a1, a2, a3);
24004
24005 CHECK_APPROX(0.0, result);
24006
24007 return 0;
24008}
24009
24010// Used for testing structs and unions by value.
24011// Variadic arguments including struct.
24013 // NOLINTNEXTLINE(whitespace/parens)
24014 double (*f)(double a0, ...)) {
24015 double a0;
24017 double a2;
24018
24019 a0 = -1.0;
24020 a1.a0 = 2.0;
24021 a1.a1 = -3.0;
24022 a1.a2 = 4.0;
24023 a2 = -5.0;
24024
24025 std::cout << "Calling TestVariadicAt1DoubleStruct12BytesHomogeneousFloatDoub("
24026 << "(" << a0 << ", (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2
24027 << "), " << a2 << ")"
24028 << ")\n";
24029
24030 double result = f(a0, a1, a2);
24031
24032 std::cout << "result = " << result << "\n";
24033
24034 CHECK_APPROX(-3.0, result);
24035
24036 // Pass argument that will make the Dart callback throw.
24037 a0 = 42;
24038
24039 result = f(a0, a1, a2);
24040
24041 CHECK_APPROX(0.0, result);
24042
24043 // Pass argument that will make the Dart callback return null.
24044 a0 = 84;
24045
24046 result = f(a0, a1, a2);
24047
24048 CHECK_APPROX(0.0, result);
24049
24050 return 0;
24051}
24052
24053// Used for testing structs and unions by value.
24054// Variadic arguments including struct.
24056 // NOLINTNEXTLINE(whitespace/parens)
24057 int32_t (*f)(int32_t a0, ...)) {
24058 int32_t a0;
24060 int32_t a2;
24061
24062 a0 = -1;
24063 a1.a0 = 2;
24064 a1.a1 = -3;
24065 a1.a2 = 4;
24066 a1.a3 = -5;
24067 a1.a4 = 6;
24068 a2 = -7;
24069
24070 std::cout << "Calling TestVariadicAt1Int32Struct20BytesHomogeneousInt32Int32("
24071 << "(" << a0 << ", (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2
24072 << ", " << a1.a3 << ", " << a1.a4 << "), " << a2 << ")"
24073 << ")\n";
24074
24075 int32_t result = f(a0, a1, a2);
24076
24077 std::cout << "result = " << result << "\n";
24078
24079 CHECK_EQ(-4, result);
24080
24081 // Pass argument that will make the Dart callback throw.
24082 a0 = 42;
24083
24084 result = f(a0, a1, a2);
24085
24086 CHECK_EQ(0, result);
24087
24088 // Pass argument that will make the Dart callback return null.
24089 a0 = 84;
24090
24091 result = f(a0, a1, a2);
24092
24093 CHECK_EQ(0, result);
24094
24095 return 0;
24096}
24097
24098// Used for testing structs and unions by value.
24099// Variadic arguments including struct.
24101 // NOLINTNEXTLINE(whitespace/parens)
24102 double (*f)(double a0, ...)) {
24103 double a0;
24105 double a2;
24106
24107 a0 = -1.0;
24108 a1.a0 = 2.0;
24109 a1.a1 = -3.0;
24110 a1.a2 = 4.0;
24111 a1.a3 = -5.0;
24112 a1.a4 = 6.0;
24113 a2 = -7.0;
24114
24115 std::cout << "Calling TestVariadicAt1DoubleStruct20BytesHomogeneousFloatDoub("
24116 << "(" << a0 << ", (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2
24117 << ", " << a1.a3 << ", " << a1.a4 << "), " << a2 << ")"
24118 << ")\n";
24119
24120 double result = f(a0, a1, a2);
24121
24122 std::cout << "result = " << result << "\n";
24123
24124 CHECK_APPROX(-4.0, result);
24125
24126 // Pass argument that will make the Dart callback throw.
24127 a0 = 42;
24128
24129 result = f(a0, a1, a2);
24130
24131 CHECK_APPROX(0.0, result);
24132
24133 // Pass argument that will make the Dart callback return null.
24134 a0 = 84;
24135
24136 result = f(a0, a1, a2);
24137
24138 CHECK_APPROX(0.0, result);
24139
24140 return 0;
24141}
24142
24143// Used for testing structs and unions by value.
24144// Regression test for variadic arguments.
24145// https://github.com/dart-lang/sdk/issues/49460
24147 // NOLINTNEXTLINE(whitespace/parens)
24148 int32_t (*f)(int32_t a0, int64_t a1, ...)) {
24149 int32_t a0;
24150 int64_t a1;
24151 intptr_t a2;
24152
24153 a0 = -1;
24154 a1 = 2;
24155 a2 = -3;
24156
24157 std::cout << "Calling TestVariadicAt2Int32Int64IntPtr("
24158 << "(" << a0 << ", " << a1 << ", " << a2 << ")"
24159 << ")\n";
24160
24161 int32_t result = f(a0, a1, a2);
24162
24163 std::cout << "result = " << result << "\n";
24164
24165 CHECK_EQ(-2, result);
24166
24167 // Pass argument that will make the Dart callback throw.
24168 a0 = 42;
24169
24170 result = f(a0, a1, a2);
24171
24172 CHECK_EQ(0, result);
24173
24174 // Pass argument that will make the Dart callback return null.
24175 a0 = 84;
24176
24177 result = f(a0, a1, a2);
24178
24179 CHECK_EQ(0, result);
24180
24181 return 0;
24182}
24183
24184// Used for testing structs and unions by value.
24185// Variadic arguments mixed.
24187 // NOLINTNEXTLINE(whitespace/parens)
24188 double (*f)(double a0, ...)) {
24189 double a0;
24190 int64_t a1;
24191 int32_t a2;
24192 double a3;
24193 int64_t a4;
24194 int32_t a5;
24195
24196 a0 = -1.0;
24197 a1 = 2;
24198 a2 = -3;
24199 a3 = 4.0;
24200 a4 = -5;
24201 a5 = 6;
24202
24203 std::cout << "Calling TestVariadicAt1DoubleInt64Int32DoubleInt64Int32("
24204 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
24205 << ", " << a5 << ")"
24206 << ")\n";
24207
24208 double result = f(a0, a1, a2, a3, a4, a5);
24209
24210 std::cout << "result = " << result << "\n";
24211
24212 CHECK_APPROX(3.0, result);
24213
24214 // Pass argument that will make the Dart callback throw.
24215 a0 = 42;
24216
24217 result = f(a0, a1, a2, a3, a4, a5);
24218
24219 CHECK_APPROX(0.0, result);
24220
24221 // Pass argument that will make the Dart callback return null.
24222 a0 = 84;
24223
24224 result = f(a0, a1, a2, a3, a4, a5);
24225
24226 CHECK_APPROX(0.0, result);
24227
24228 return 0;
24229}
24230
24231// Used for testing structs and unions by value.
24232// Variadic arguments homogenous struct stack alignment on macos_arm64.
24234 // NOLINTNEXTLINE(whitespace/parens)
24235 double (*f)(int64_t a0, ...)) {
24236 int64_t a0;
24237 int32_t a1;
24239
24240 a0 = -1;
24241 a1 = 2;
24242 a2.a0 = -3.0;
24243 a2.a1 = 4.0;
24244 a2.a2 = -5.0;
24245
24246 std::cout << "Calling TestVariadicAt1Int64Int32Struct12BytesHomogeneousFloat("
24247 << "(" << a0 << ", " << a1 << ", (" << a2.a0 << ", " << a2.a1
24248 << ", " << a2.a2 << "))"
24249 << ")\n";
24250
24251 double result = f(a0, a1, a2);
24252
24253 std::cout << "result = " << result << "\n";
24254
24255 CHECK_APPROX(-3.0, result);
24256
24257 // Pass argument that will make the Dart callback throw.
24258 a0 = 42;
24259
24260 result = f(a0, a1, a2);
24261
24262 CHECK_APPROX(0.0, result);
24263
24264 // Pass argument that will make the Dart callback return null.
24265 a0 = 84;
24266
24267 result = f(a0, a1, a2);
24268
24269 CHECK_APPROX(0.0, result);
24270
24271 return 0;
24272}
24273
24274// Used for testing structs and unions by value.
24275// Variadic arguments homogenous struct stack alignment on macos_arm64.
24277 // NOLINTNEXTLINE(whitespace/parens)
24278 double (*f)(double a0,
24279 double a1,
24280 double a2,
24281 double a3,
24282 double a4,
24283 double a5,
24284 double a6,
24285 double a7,
24286 float a8,
24288 int64_t a10,
24289 ...)) {
24290 double a0;
24291 double a1;
24292 double a2;
24293 double a3;
24294 double a4;
24295 double a5;
24296 double a6;
24297 double a7;
24298 float a8;
24300 int64_t a10;
24301 int32_t a11;
24303
24304 a0 = -1.0;
24305 a1 = 2.0;
24306 a2 = -3.0;
24307 a3 = 4.0;
24308 a4 = -5.0;
24309 a5 = 6.0;
24310 a6 = -7.0;
24311 a7 = 8.0;
24312 a8 = -9.0;
24313 a9.a0 = 10.0;
24314 a9.a1 = -11.0;
24315 a9.a2 = 12.0;
24316 a10 = -13;
24317 a11 = 14;
24318 a12.a0 = -15.0;
24319 a12.a1 = 16.0;
24320 a12.a2 = -17.0;
24321
24322 std::cout << "Calling TestVariadicAt11Doublex8FloatStruct12BytesHomogeneousF("
24323 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
24324 << ", " << a5 << ", " << a6 << ", " << a7 << ", " << a8 << ", ("
24325 << a9.a0 << ", " << a9.a1 << ", " << a9.a2 << "), " << a10 << ", "
24326 << a11 << ", (" << a12.a0 << ", " << a12.a1 << ", " << a12.a2
24327 << "))"
24328 << ")\n";
24329
24330 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
24331
24332 std::cout << "result = " << result << "\n";
24333
24334 CHECK_APPROX(-9.0, result);
24335
24336 // Pass argument that will make the Dart callback throw.
24337 a0 = 42;
24338
24339 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
24340
24341 CHECK_APPROX(0.0, result);
24342
24343 // Pass argument that will make the Dart callback return null.
24344 a0 = 84;
24345
24346 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
24347
24348 CHECK_APPROX(0.0, result);
24349
24350 return 0;
24351}
24352
24353// Used for testing structs and unions by value.
24354// Variadic arguments mixed.
24356 // NOLINTNEXTLINE(whitespace/parens)
24357 double (*f)(double a0, ...)) {
24358 double a0;
24359 int64_t a1;
24360 int32_t a2;
24362 double a4;
24363 int64_t a5;
24364 int32_t a6;
24366 int64_t a8;
24367
24368 a0 = -1.0;
24369 a1 = 2;
24370 a2 = -3;
24371 a3.a0 = 4;
24372 a3.a1 = -5;
24373 a3.a2 = 6;
24374 a3.a3 = -7;
24375 a3.a4 = 8;
24376 a4 = -9.0;
24377 a5 = 10;
24378 a6 = -11;
24379 a7.a0 = 12.0;
24380 a7.a1 = -13.0;
24381 a7.a2 = 14.0;
24382 a8 = -15;
24383
24384 std::cout << "Calling TestVariadicAt1DoubleInt64Int32Struct20BytesHomogeneou("
24385 << "(" << a0 << ", " << a1 << ", " << a2 << ", (" << a3.a0 << ", "
24386 << a3.a1 << ", " << a3.a2 << ", " << a3.a3 << ", " << a3.a4 << "), "
24387 << a4 << ", " << a5 << ", " << a6 << ", (" << a7.a0 << ", " << a7.a1
24388 << ", " << a7.a2 << "), " << a8 << ")"
24389 << ")\n";
24390
24391 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
24392
24393 std::cout << "result = " << result << "\n";
24394
24395 CHECK_APPROX(-8.0, result);
24396
24397 // Pass argument that will make the Dart callback throw.
24398 a0 = 42;
24399
24400 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
24401
24402 CHECK_APPROX(0.0, result);
24403
24404 // Pass argument that will make the Dart callback return null.
24405 a0 = 84;
24406
24407 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
24408
24409 CHECK_APPROX(0.0, result);
24410
24411 return 0;
24412}
24413
24414// Used for testing structs and unions by value.
24415// Variadic arguments function definition, but not passing any.
24417 // NOLINTNEXTLINE(whitespace/parens)
24418 double (*f)(double a0, double a1, double a2, double a3, double a4, ...)) {
24419 double a0;
24420 double a1;
24421 double a2;
24422 double a3;
24423 double a4;
24424
24425 a0 = -1.0;
24426 a1 = 2.0;
24427 a2 = -3.0;
24428 a3 = 4.0;
24429 a4 = -5.0;
24430
24431 std::cout << "Calling TestVariadicAt5Doublex5("
24432 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
24433 << ")"
24434 << ")\n";
24435
24436 double result = f(a0, a1, a2, a3, a4);
24437
24438 std::cout << "result = " << result << "\n";
24439
24440 CHECK_APPROX(-3.0, result);
24441
24442 // Pass argument that will make the Dart callback throw.
24443 a0 = 42;
24444
24445 result = f(a0, a1, a2, a3, a4);
24446
24447 CHECK_APPROX(0.0, result);
24448
24449 // Pass argument that will make the Dart callback return null.
24450 a0 = 84;
24451
24452 result = f(a0, a1, a2, a3, a4);
24453
24454 CHECK_APPROX(0.0, result);
24455
24456 return 0;
24457}
24458
24459// Used for testing structs and unions by value.
24460// Struct stradles last argument register, variadic
24462 // NOLINTNEXTLINE(whitespace/parens)
24463 int64_t (*f)(int64_t a0, ...)) {
24464 int64_t a0;
24465 int64_t a1;
24466 int64_t a2;
24467 int64_t a3;
24468 int64_t a4;
24469 int64_t a5;
24470 int64_t a6;
24472
24473 a0 = -1;
24474 a1 = 2;
24475 a2 = -3;
24476 a3 = 4;
24477 a4 = -5;
24478 a5 = 6;
24479 a6 = -7;
24480 a7.a0 = 8;
24481 a7.a1 = -9;
24482 a7.a2 = 10;
24483
24484 std::cout << "Calling TestVariadicAt1Int64x7Struct12BytesHomogeneousInt32("
24485 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
24486 << ", " << a5 << ", " << a6 << ", (" << a7.a0 << ", " << a7.a1
24487 << ", " << a7.a2 << "))"
24488 << ")\n";
24489
24490 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7);
24491
24492 std::cout << "result = " << result << "\n";
24493
24494 CHECK_EQ(5, result);
24495
24496 // Pass argument that will make the Dart callback throw.
24497 a0 = 42;
24498
24499 result = f(a0, a1, a2, a3, a4, a5, a6, a7);
24500
24501 CHECK_EQ(0, result);
24502
24503 // Pass argument that will make the Dart callback return null.
24504 a0 = 84;
24505
24506 result = f(a0, a1, a2, a3, a4, a5, a6, a7);
24507
24508 CHECK_EQ(0, result);
24509
24510 return 0;
24511}
24512
24513// Used for testing structs and unions by value.
24514// Variadic arguments test on macos_arm64.
24516 // NOLINTNEXTLINE(whitespace/parens)
24517 int32_t (*f)(Struct12BytesHomogeneousInt32 a0, ...)) {
24519 int32_t a1;
24520 int32_t a2;
24521 int32_t a3;
24522 int32_t a4;
24523
24524 a0.a0 = -1;
24525 a0.a1 = 2;
24526 a0.a2 = -3;
24527 a1 = 4;
24528 a2 = -5;
24529 a3 = 6;
24530 a4 = -7;
24531
24532 std::cout << "Calling TestVariadicAt1Struct12BytesHomogeneousInt32Int32x4("
24533 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << "), " << a1
24534 << ", " << a2 << ", " << a3 << ", " << a4 << ")"
24535 << ")\n";
24536
24537 int32_t result = f(a0, a1, a2, a3, a4);
24538
24539 std::cout << "result = " << result << "\n";
24540
24541 CHECK_EQ(-4, result);
24542
24543 // Pass argument that will make the Dart callback throw.
24544 a0.a0 = 42;
24545
24546 result = f(a0, a1, a2, a3, a4);
24547
24548 CHECK_EQ(0, result);
24549
24550 // Pass argument that will make the Dart callback return null.
24551 a0.a0 = 84;
24552
24553 result = f(a0, a1, a2, a3, a4);
24554
24555 CHECK_EQ(0, result);
24556
24557 return 0;
24558}
24559
24560} // namespace dart
#define CHECK_EQ(X, Y)
#define CHECK_APPROX(EXPECTED, ACTUAL)
#define DART_EXPORT
GAsyncResult * result
va_start(args, format)
va_end(args)
Definition: dart_vm.cc:33
DART_EXPORT double PassStruct40BytesHomogeneousDoubleStruct4BytesHomo(Struct40BytesHomogeneousDouble a0, Struct4BytesHomogeneousInt16 a1, Struct8BytesHomogeneousFloat a2)
DART_EXPORT intptr_t TestPassUnion16BytesNestedFloatx10(double(*f)(Union16BytesNestedFloat a0, Union16BytesNestedFloat a1, Union16BytesNestedFloat a2, Union16BytesNestedFloat a3, Union16BytesNestedFloat a4, Union16BytesNestedFloat a5, Union16BytesNestedFloat a6, Union16BytesNestedFloat a7, Union16BytesNestedFloat a8, Union16BytesNestedFloat a9))
DART_EXPORT void TestAsyncPassStructNestedIrregularEvenBiggerx4(void(*f)(StructNestedIrregularEvenBigger a0, StructNestedIrregularEvenBigger a1, StructNestedIrregularEvenBigger a2, StructNestedIrregularEvenBigger a3))
DART_EXPORT intptr_t TestReturnStruct8BytesNestedFloat2(Struct8BytesNestedFloat2(*f)(Struct4BytesFloat a0, float a1))
DART_EXPORT intptr_t TestPassStruct8BytesMixedx10(float(*f)(Struct8BytesMixed a0, Struct8BytesMixed a1, Struct8BytesMixed a2, Struct8BytesMixed a3, Struct8BytesMixed a4, Struct8BytesMixed a5, Struct8BytesMixed a6, Struct8BytesMixed a7, Struct8BytesMixed a8, Struct8BytesMixed a9))
DART_EXPORT intptr_t TestReturnStructNestedIntStructAlignmentInt32(StructNestedIntStructAlignmentInt32(*f)(StructAlignmentInt32 a0, StructAlignmentInt32 a1))
DART_EXPORT int64_t PassStruct8BytesPackedIntx10(Struct8BytesPackedInt a0, Struct8BytesPackedInt a1, Struct8BytesPackedInt a2, Struct8BytesPackedInt a3, Struct8BytesPackedInt a4, Struct8BytesPackedInt a5, Struct8BytesPackedInt a6, Struct8BytesPackedInt a7, Struct8BytesPackedInt a8, Struct8BytesPackedInt a9)
DART_EXPORT void TestAsyncReturnStructArgumentInt32x8Struct20BytesHomogeneou(void(*f)(int32_t a0, int32_t a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, Struct20BytesHomogeneousInt32 a8))
DART_EXPORT void TestAsyncReturnStructArgumentStruct8BytesHomogeneousFloat(void(*f)(Struct8BytesHomogeneousFloat a0))
DART_EXPORT Struct16BytesMixed2 ReturnStruct16BytesMixed2(float a0, float a1, float a2, int32_t a3)
DART_EXPORT intptr_t TestReturnStructArgumentInt32x8Struct1ByteInt(Struct1ByteInt(*f)(int32_t a0, int32_t a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, Struct1ByteInt a8))
DART_EXPORT double PassUnion4BytesMixedx10(Union4BytesMixed a0, Union4BytesMixed a1, Union4BytesMixed a2, Union4BytesMixed a3, Union4BytesMixed a4, Union4BytesMixed a5, Union4BytesMixed a6, Union4BytesMixed a7, Union4BytesMixed a8, Union4BytesMixed a9)
DART_EXPORT double PassStruct32BytesHomogeneousDoublex5(Struct32BytesHomogeneousDouble a0, Struct32BytesHomogeneousDouble a1, Struct32BytesHomogeneousDouble a2, Struct32BytesHomogeneousDouble a3, Struct32BytesHomogeneousDouble a4)
DART_EXPORT void TestAsyncReturnStruct16BytesNestedInt(void(*f)(Struct8BytesNestedInt a0, Struct8BytesNestedInt a1))
DART_EXPORT Struct8BytesNestedFloat2 ReturnStruct8BytesNestedFloat2(Struct4BytesFloat a0, float a1)
DART_EXPORT intptr_t TestReturnStruct8BytesNestedFloat(Struct8BytesNestedFloat(*f)(Struct4BytesFloat a0, Struct4BytesFloat a1))
DART_EXPORT void TestAsyncPassStruct15BytesInlineArrayMixed(void(*f)(Struct15BytesInlineArrayMixed a0))
DART_EXPORT intptr_t TestPassUint8Struct32BytesInlineArrayMultiDimensionalI(uint32_t(*f)(uint8_t a0, Struct32BytesInlineArrayMultiDimensionalInt a1, uint8_t a2, Struct8BytesInlineArrayMultiDimensionalInt a3, uint8_t a4, Struct8BytesInlineArrayMultiDimensionalInt a5, uint8_t a6))
DART_EXPORT void TestAsyncPassUnion16BytesNestedInlineArrayFloatx10(void(*f)(Union16BytesNestedInlineArrayFloat a0, Union16BytesNestedInlineArrayFloat a1, Union16BytesNestedInlineArrayFloat a2, Union16BytesNestedInlineArrayFloat a3, Union16BytesNestedInlineArrayFloat a4, Union16BytesNestedInlineArrayFloat a5, Union16BytesNestedInlineArrayFloat a6, Union16BytesNestedInlineArrayFloat a7, Union16BytesNestedInlineArrayFloat a8, Union16BytesNestedInlineArrayFloat a9))
DART_EXPORT Struct1ByteInt ReturnStructArgumentInt32x8Struct1ByteInt(int32_t a0, int32_t a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, Struct1ByteInt a8)
DART_EXPORT Struct7BytesInt4ByteAligned ReturnStruct7BytesInt4ByteAligned(int32_t a0, int16_t a1, int8_t a2)
DART_EXPORT void TestAsyncReturnStruct8BytesNestedMixed(void(*f)(Struct4BytesHomogeneousInt16 a0, Struct4BytesFloat a1))
DART_EXPORT intptr_t TestReturnStruct8BytesNestedInt(Struct8BytesNestedInt(*f)(Struct4BytesHomogeneousInt16 a0, Struct4BytesHomogeneousInt16 a1))
DART_EXPORT intptr_t TestPassInt32x4Struct16BytesMixedx4Double(double(*f)(int32_t a0, int32_t a1, int32_t a2, int32_t a3, Struct16BytesMixed a4, Struct16BytesMixed a5, Struct16BytesMixed a6, Struct16BytesMixed a7, double a8))
DART_EXPORT void TestAsyncPassStruct19BytesHomogeneousUint8x10(void(*f)(Struct19BytesHomogeneousUint8 a0, Struct19BytesHomogeneousUint8 a1, Struct19BytesHomogeneousUint8 a2, Struct19BytesHomogeneousUint8 a3, Struct19BytesHomogeneousUint8 a4, Struct19BytesHomogeneousUint8 a5, Struct19BytesHomogeneousUint8 a6, Struct19BytesHomogeneousUint8 a7, Struct19BytesHomogeneousUint8 a8, Struct19BytesHomogeneousUint8 a9))
DART_EXPORT void TestAsyncPassStruct8BytesNestedMixedx10(void(*f)(Struct8BytesNestedMixed a0, Struct8BytesNestedMixed a1, Struct8BytesNestedMixed a2, Struct8BytesNestedMixed a3, Struct8BytesNestedMixed a4, Struct8BytesNestedMixed a5, Struct8BytesNestedMixed a6, Struct8BytesNestedMixed a7, Struct8BytesNestedMixed a8, Struct8BytesNestedMixed a9))
DART_EXPORT int64_t PassStructNestedIntStructAlignmentInt32(StructNestedIntStructAlignmentInt32 a0)
DART_EXPORT intptr_t TestVariadicAt1Struct12BytesHomogeneousInt32Int32x4(int32_t(*f)(Struct12BytesHomogeneousInt32 a0,...))
DART_EXPORT intptr_t TestReturnStructArgumentStructStruct16BytesHomogeneous(StructStruct16BytesHomogeneousFloat2(*f)(StructStruct16BytesHomogeneousFloat2 a0))
DART_EXPORT Struct16BytesNestedInt ReturnStruct16BytesNestedInt(Struct8BytesNestedInt a0, Struct8BytesNestedInt a1)
DART_EXPORT intptr_t TestPassStruct8BytesPackedIntx10(int64_t(*f)(Struct8BytesPackedInt a0, Struct8BytesPackedInt a1, Struct8BytesPackedInt a2, Struct8BytesPackedInt a3, Struct8BytesPackedInt a4, Struct8BytesPackedInt a5, Struct8BytesPackedInt a6, Struct8BytesPackedInt a7, Struct8BytesPackedInt a8, Struct8BytesPackedInt a9))
DART_EXPORT void TestAsyncReturnStruct1ByteInt(void(*f)(int8_t a0))
DART_EXPORT float PassStruct16BytesMixed2x10(Struct16BytesMixed2 a0, Struct16BytesMixed2 a1, Struct16BytesMixed2 a2, Struct16BytesMixed2 a3, Struct16BytesMixed2 a4, Struct16BytesMixed2 a5, Struct16BytesMixed2 a6, Struct16BytesMixed2 a7, Struct16BytesMixed2 a8, Struct16BytesMixed2 a9)
DART_EXPORT intptr_t TestPassStruct16BytesMixed2x10(float(*f)(Struct16BytesMixed2 a0, Struct16BytesMixed2 a1, Struct16BytesMixed2 a2, Struct16BytesMixed2 a3, Struct16BytesMixed2 a4, Struct16BytesMixed2 a5, Struct16BytesMixed2 a6, Struct16BytesMixed2 a7, Struct16BytesMixed2 a8, Struct16BytesMixed2 a9))
DART_EXPORT intptr_t TestPassStruct8BytesNestedIntx10(int64_t(*f)(Struct8BytesNestedInt a0, Struct8BytesNestedInt a1, Struct8BytesNestedInt a2, Struct8BytesNestedInt a3, Struct8BytesNestedInt a4, Struct8BytesNestedInt a5, Struct8BytesNestedInt a6, Struct8BytesNestedInt a7, Struct8BytesNestedInt a8, Struct8BytesNestedInt a9))
DART_EXPORT void TestAsyncPassStruct1ByteIntx10(void(*f)(Struct1ByteInt a0, Struct1ByteInt a1, Struct1ByteInt a2, Struct1ByteInt a3, Struct1ByteInt a4, Struct1ByteInt a5, Struct1ByteInt a6, Struct1ByteInt a7, Struct1ByteInt a8, Struct1ByteInt a9))
DART_EXPORT double PassInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int(int32_t a0, int32_t a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, double a8, double a9, double a10, double a11, double a12, double a13, double a14, double a15, int64_t a16, int8_t a17, Struct1ByteInt a18, int64_t a19, int8_t a20, Struct4BytesHomogeneousInt16 a21, int64_t a22, int8_t a23, Struct8BytesInt a24, int64_t a25, int8_t a26, Struct8BytesHomogeneousFloat a27, int64_t a28, int8_t a29, Struct8BytesMixed a30, int64_t a31, int8_t a32, StructAlignmentInt16 a33, int64_t a34, int8_t a35, StructAlignmentInt32 a36, int64_t a37, int8_t a38, StructAlignmentInt64 a39)
DART_EXPORT void TestAsyncReturnStruct1024BytesHomogeneousUint64(void(*f)(uint64_t a0, uint64_t a1, uint64_t a2, uint64_t a3, uint64_t a4, uint64_t a5, uint64_t a6, uint64_t a7, uint64_t a8, uint64_t a9, uint64_t a10, uint64_t a11, uint64_t a12, uint64_t a13, uint64_t a14, uint64_t a15, uint64_t a16, uint64_t a17, uint64_t a18, uint64_t a19, uint64_t a20, uint64_t a21, uint64_t a22, uint64_t a23, uint64_t a24, uint64_t a25, uint64_t a26, uint64_t a27, uint64_t a28, uint64_t a29, uint64_t a30, uint64_t a31, uint64_t a32, uint64_t a33, uint64_t a34, uint64_t a35, uint64_t a36, uint64_t a37, uint64_t a38, uint64_t a39, uint64_t a40, uint64_t a41, uint64_t a42, uint64_t a43, uint64_t a44, uint64_t a45, uint64_t a46, uint64_t a47, uint64_t a48, uint64_t a49, uint64_t a50, uint64_t a51, uint64_t a52, uint64_t a53, uint64_t a54, uint64_t a55, uint64_t a56, uint64_t a57, uint64_t a58, uint64_t a59, uint64_t a60, uint64_t a61, uint64_t a62, uint64_t a63, uint64_t a64, uint64_t a65, uint64_t a66, uint64_t a67, uint64_t a68, uint64_t a69, uint64_t a70, uint64_t a71, uint64_t a72, uint64_t a73, uint64_t a74, uint64_t a75, uint64_t a76, uint64_t a77, uint64_t a78, uint64_t a79, uint64_t a80, uint64_t a81, uint64_t a82, uint64_t a83, uint64_t a84, uint64_t a85, uint64_t a86, uint64_t a87, uint64_t a88, uint64_t a89, uint64_t a90, uint64_t a91, uint64_t a92, uint64_t a93, uint64_t a94, uint64_t a95, uint64_t a96, uint64_t a97, uint64_t a98, uint64_t a99, uint64_t a100, uint64_t a101, uint64_t a102, uint64_t a103, uint64_t a104, uint64_t a105, uint64_t a106, uint64_t a107, uint64_t a108, uint64_t a109, uint64_t a110, uint64_t a111, uint64_t a112, uint64_t a113, uint64_t a114, uint64_t a115, uint64_t a116, uint64_t a117, uint64_t a118, uint64_t a119, uint64_t a120, uint64_t a121, uint64_t a122, uint64_t a123, uint64_t a124, uint64_t a125, uint64_t a126, uint64_t a127))
DART_EXPORT int64_t PassStructAlignmentInt64(StructAlignmentInt64 a0)
DART_EXPORT intptr_t TestPassStruct3BytesPackedIntx10(int64_t(*f)(Struct3BytesPackedInt a0, Struct3BytesPackedInt a1, Struct3BytesPackedInt a2, Struct3BytesPackedInt a3, Struct3BytesPackedInt a4, Struct3BytesPackedInt a5, Struct3BytesPackedInt a6, Struct3BytesPackedInt a7, Struct3BytesPackedInt a8, Struct3BytesPackedInt a9))
DART_EXPORT void TestAsyncReturnStructNestedIntStructAlignmentInt64(void(*f)(StructAlignmentInt64 a0, StructAlignmentInt64 a1))
DART_EXPORT void TestAsyncPassStruct16BytesHomogeneousFloatx5(void(*f)(Struct16BytesHomogeneousFloat a0, Struct16BytesHomogeneousFloat a1, Struct16BytesHomogeneousFloat a2, Struct16BytesHomogeneousFloat a3, Struct16BytesHomogeneousFloat a4))
DART_EXPORT void TestAsyncReturnStructArgumentStruct1ByteInt(void(*f)(Struct1ByteInt a0))
DART_EXPORT double PassFloatStruct32BytesHomogeneousDoubleFloatStruct(float a0, Struct32BytesHomogeneousDouble a1, float a2, Struct32BytesHomogeneousDouble a3, float a4, Struct32BytesHomogeneousDouble a5, float a6, Struct32BytesHomogeneousDouble a7, float a8)
DART_EXPORT intptr_t TestPassStruct3BytesHomogeneousUint8x10(int64_t(*f)(Struct3BytesHomogeneousUint8 a0, Struct3BytesHomogeneousUint8 a1, Struct3BytesHomogeneousUint8 a2, Struct3BytesHomogeneousUint8 a3, Struct3BytesHomogeneousUint8 a4, Struct3BytesHomogeneousUint8 a5, Struct3BytesHomogeneousUint8 a6, Struct3BytesHomogeneousUint8 a7, Struct3BytesHomogeneousUint8 a8, Struct3BytesHomogeneousUint8 a9))
DART_EXPORT void TestAsyncPassUnion8BytesNestedFloatx10(void(*f)(Union8BytesNestedFloat a0, Union8BytesNestedFloat a1, Union8BytesNestedFloat a2, Union8BytesNestedFloat a3, Union8BytesNestedFloat a4, Union8BytesNestedFloat a5, Union8BytesNestedFloat a6, Union8BytesNestedFloat a7, Union8BytesNestedFloat a8, Union8BytesNestedFloat a9))
DART_EXPORT StructNestedIntStructAlignmentInt64 ReturnStructNestedIntStructAlignmentInt64(StructAlignmentInt64 a0, StructAlignmentInt64 a1)
DART_EXPORT Struct9BytesPackedMixed ReturnStruct9BytesPackedMixed(uint8_t a0, double a1)
DART_EXPORT intptr_t TestPassWCharStructInlineArrayIntUintPtrx2LongUnsigned(wchar_t(*f)(wchar_t a0, StructInlineArrayInt a1, uintptr_t a2, uintptr_t a3, long a4, unsigned long a5))
DART_EXPORT void TestAsyncPassUnion9BytesNestedIntx10(void(*f)(Union9BytesNestedInt a0, Union9BytesNestedInt a1, Union9BytesNestedInt a2, Union9BytesNestedInt a3, Union9BytesNestedInt a4, Union9BytesNestedInt a5, Union9BytesNestedInt a6, Union9BytesNestedInt a7, Union9BytesNestedInt a8, Union9BytesNestedInt a9))
DART_EXPORT double PassUnion9BytesNestedIntx10(Union9BytesNestedInt a0, Union9BytesNestedInt a1, Union9BytesNestedInt a2, Union9BytesNestedInt a3, Union9BytesNestedInt a4, Union9BytesNestedInt a5, Union9BytesNestedInt a6, Union9BytesNestedInt a7, Union9BytesNestedInt a8, Union9BytesNestedInt a9)
DART_EXPORT intptr_t TestPassStructNestedIrregularEvenBiggerx4(double(*f)(StructNestedIrregularEvenBigger a0, StructNestedIrregularEvenBigger a1, StructNestedIrregularEvenBigger a2, StructNestedIrregularEvenBigger a3))
DART_EXPORT intptr_t TestReturnStructAlignmentInt32(StructAlignmentInt32(*f)(int8_t a0, int32_t a1, int8_t a2))
DART_EXPORT void TestAsyncReturnStructArgumentStructStruct16BytesHomogeneous(void(*f)(StructStruct16BytesHomogeneousFloat2 a0))
DART_EXPORT void TestAsyncPassFloatStruct16BytesHomogeneousFloatFloatStruct1(void(*f)(float a0, Struct16BytesHomogeneousFloat a1, float a2, Struct16BytesHomogeneousFloat a3, float a4, Struct16BytesHomogeneousFloat a5, float a6, Struct16BytesHomogeneousFloat a7, float a8))
DART_EXPORT void TestAsyncPassStruct12BytesHomogeneousFloatx6(void(*f)(Struct12BytesHomogeneousFloat a0, Struct12BytesHomogeneousFloat a1, Struct12BytesHomogeneousFloat a2, Struct12BytesHomogeneousFloat a3, Struct12BytesHomogeneousFloat a4, Struct12BytesHomogeneousFloat a5))
DART_EXPORT int64_t VariadicAt1Int64x2(int64_t a0,...)
DART_EXPORT void TestAsyncPassStruct8BytesIntx10(void(*f)(Struct8BytesInt a0, Struct8BytesInt a1, Struct8BytesInt a2, Struct8BytesInt a3, Struct8BytesInt a4, Struct8BytesInt a5, Struct8BytesInt a6, Struct8BytesInt a7, Struct8BytesInt a8, Struct8BytesInt a9))
DART_EXPORT intptr_t TestReturnStruct3BytesInt2ByteAligned(Struct3BytesInt2ByteAligned(*f)(int16_t a0, int8_t a1))
DART_EXPORT intptr_t TestPassStructNestedIntStructAlignmentInt32(int64_t(*f)(StructNestedIntStructAlignmentInt32 a0))
DART_EXPORT int64_t PassStruct17BytesIntx10(Struct17BytesInt a0, Struct17BytesInt a1, Struct17BytesInt a2, Struct17BytesInt a3, Struct17BytesInt a4, Struct17BytesInt a5, Struct17BytesInt a6, Struct17BytesInt a7, Struct17BytesInt a8, Struct17BytesInt a9)
DART_EXPORT int64_t PassStruct1ByteIntx10(Struct1ByteInt a0, Struct1ByteInt a1, Struct1ByteInt a2, Struct1ByteInt a3, Struct1ByteInt a4, Struct1ByteInt a5, Struct1ByteInt a6, Struct1ByteInt a7, Struct1ByteInt a8, Struct1ByteInt a9)
DART_EXPORT void TestAsyncReturnUnion4BytesMixed(void(*f)(uint32_t a0))
DART_EXPORT double PassStruct40BytesHomogeneousDouble(Struct40BytesHomogeneousDouble a0)
DART_EXPORT void TestAsyncPassWCharStructInlineArrayIntUintPtrx2LongUnsigned(void(*f)(wchar_t a0, StructInlineArrayInt a1, uintptr_t a2, uintptr_t a3, long a4, unsigned long a5))
DART_EXPORT int64_t VariadicAt1Int64x2Struct8BytesIntInt64(int64_t a0,...)
DART_EXPORT intptr_t TestPassInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int(double(*f)(int32_t a0, int32_t a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, double a8, double a9, double a10, double a11, double a12, double a13, double a14, double a15, int64_t a16, int8_t a17, Struct1ByteInt a18, int64_t a19, int8_t a20, Struct4BytesHomogeneousInt16 a21, int64_t a22, int8_t a23, Struct8BytesInt a24, int64_t a25, int8_t a26, Struct8BytesHomogeneousFloat a27, int64_t a28, int8_t a29, Struct8BytesMixed a30, int64_t a31, int8_t a32, StructAlignmentInt16 a33, int64_t a34, int8_t a35, StructAlignmentInt32 a36, int64_t a37, int8_t a38, StructAlignmentInt64 a39))
DART_EXPORT void TestAsyncPassStruct3BytesHomogeneousUint8x10(void(*f)(Struct3BytesHomogeneousUint8 a0, Struct3BytesHomogeneousUint8 a1, Struct3BytesHomogeneousUint8 a2, Struct3BytesHomogeneousUint8 a3, Struct3BytesHomogeneousUint8 a4, Struct3BytesHomogeneousUint8 a5, Struct3BytesHomogeneousUint8 a6, Struct3BytesHomogeneousUint8 a7, Struct3BytesHomogeneousUint8 a8, Struct3BytesHomogeneousUint8 a9))
DART_EXPORT void TestAsyncReturnStruct32BytesHomogeneousDouble(void(*f)(double a0, double a1, double a2, double a3))
DART_EXPORT Struct8BytesInt ReturnStruct8BytesInt(int16_t a0, int16_t a1, int32_t a2)
DART_EXPORT Union16BytesNestedFloat ReturnUnion16BytesNestedFloat(Struct8BytesHomogeneousFloat a0)
DART_EXPORT intptr_t TestVariadicAt1Int64x7Struct12BytesHomogeneousInt32(int64_t(*f)(int64_t a0,...))
DART_EXPORT intptr_t TestVariadicAt11Doublex8FloatStruct12BytesHomogeneousF(double(*f)(double a0, double a1, double a2, double a3, double a4, double a5, double a6, double a7, float a8, Struct12BytesHomogeneousFloat a9, int64_t a10,...))
DART_EXPORT void TestAsyncPassStruct17BytesIntx10(void(*f)(Struct17BytesInt a0, Struct17BytesInt a1, Struct17BytesInt a2, Struct17BytesInt a3, Struct17BytesInt a4, Struct17BytesInt a5, Struct17BytesInt a6, Struct17BytesInt a7, Struct17BytesInt a8, Struct17BytesInt a9))
DART_EXPORT intptr_t TestPassStructStruct16BytesMixed3x10(float(*f)(StructStruct16BytesMixed3 a0, StructStruct16BytesMixed3 a1, StructStruct16BytesMixed3 a2, StructStruct16BytesMixed3 a3, StructStruct16BytesMixed3 a4, StructStruct16BytesMixed3 a5, StructStruct16BytesMixed3 a6, StructStruct16BytesMixed3 a7, StructStruct16BytesMixed3 a8, StructStruct16BytesMixed3 a9))
DART_EXPORT intptr_t TestPassUnion4BytesMixedx10(double(*f)(Union4BytesMixed a0, Union4BytesMixed a1, Union4BytesMixed a2, Union4BytesMixed a3, Union4BytesMixed a4, Union4BytesMixed a5, Union4BytesMixed a6, Union4BytesMixed a7, Union4BytesMixed a8, Union4BytesMixed a9))
DART_EXPORT void TestAsyncReturnStruct20BytesHomogeneousFloat(void(*f)(float a0, float a1, float a2, float a3, float a4))
DART_EXPORT intptr_t TestReturnUnion8BytesNestedFloat(Union8BytesNestedFloat(*f)(double a0))
DART_EXPORT intptr_t TestReturnStruct16BytesHomogeneousFloat(Struct16BytesHomogeneousFloat(*f)(float a0, float a1, float a2, float a3))
DART_EXPORT intptr_t TestPassStruct16BytesHomogeneousFloatx5(float(*f)(Struct16BytesHomogeneousFloat a0, Struct16BytesHomogeneousFloat a1, Struct16BytesHomogeneousFloat a2, Struct16BytesHomogeneousFloat a3, Struct16BytesHomogeneousFloat a4))
DART_EXPORT intptr_t TestPassUint8Struct4BytesInlineArrayMultiDimensionalIn(uint32_t(*f)(uint8_t a0, Struct4BytesInlineArrayMultiDimensionalInt a1, uint8_t a2))
DART_EXPORT void TestAsyncReturnStruct9BytesInt4Or8ByteAligned(void(*f)(int64_t a0, int8_t a1))
DART_EXPORT void TestAsyncPassStruct7BytesInt4ByteAlignedx10(void(*f)(Struct7BytesInt4ByteAligned a0, Struct7BytesInt4ByteAligned a1, Struct7BytesInt4ByteAligned a2, Struct7BytesInt4ByteAligned a3, Struct7BytesInt4ByteAligned a4, Struct7BytesInt4ByteAligned a5, Struct7BytesInt4ByteAligned a6, Struct7BytesInt4ByteAligned a7, Struct7BytesInt4ByteAligned a8, Struct7BytesInt4ByteAligned a9))
DART_EXPORT void TestAsyncPassStruct8BytesHomogeneousFloatx10(void(*f)(Struct8BytesHomogeneousFloat a0, Struct8BytesHomogeneousFloat a1, Struct8BytesHomogeneousFloat a2, Struct8BytesHomogeneousFloat a3, Struct8BytesHomogeneousFloat a4, Struct8BytesHomogeneousFloat a5, Struct8BytesHomogeneousFloat a6, Struct8BytesHomogeneousFloat a7, Struct8BytesHomogeneousFloat a8, Struct8BytesHomogeneousFloat a9))
DART_EXPORT intptr_t TestVariadicAt1DoubleStruct12BytesHomogeneousFloatDoub(double(*f)(double a0,...))
DART_EXPORT int64_t PassStruct19BytesHomogeneousUint8x10(Struct19BytesHomogeneousUint8 a0, Struct19BytesHomogeneousUint8 a1, Struct19BytesHomogeneousUint8 a2, Struct19BytesHomogeneousUint8 a3, Struct19BytesHomogeneousUint8 a4, Struct19BytesHomogeneousUint8 a5, Struct19BytesHomogeneousUint8 a6, Struct19BytesHomogeneousUint8 a7, Struct19BytesHomogeneousUint8 a8, Struct19BytesHomogeneousUint8 a9)
DART_EXPORT intptr_t TestVariadicAt1DoubleStruct20BytesHomogeneousFloatDoub(double(*f)(double a0,...))
DART_EXPORT intptr_t TestPassUnion16BytesNestedInlineArrayFloatx10(double(*f)(Union16BytesNestedInlineArrayFloat a0, Union16BytesNestedInlineArrayFloat a1, Union16BytesNestedInlineArrayFloat a2, Union16BytesNestedInlineArrayFloat a3, Union16BytesNestedInlineArrayFloat a4, Union16BytesNestedInlineArrayFloat a5, Union16BytesNestedInlineArrayFloat a6, Union16BytesNestedInlineArrayFloat a7, Union16BytesNestedInlineArrayFloat a8, Union16BytesNestedInlineArrayFloat a9))
DART_EXPORT Struct4BytesHomogeneousInt16 ReturnStruct4BytesHomogeneousInt16(int16_t a0, int16_t a1)
DART_EXPORT StructNestedIrregularEvenBigger ReturnStructNestedIrregularEvenBigger(uint64_t a0, StructNestedIrregularBigger a1, StructNestedIrregularBigger a2, double a3)
DART_EXPORT intptr_t TestPassStruct9BytesPackedMixedx10DoubleInt32x2(double(*f)(Struct9BytesPackedMixed a0, Struct9BytesPackedMixed a1, Struct9BytesPackedMixed a2, Struct9BytesPackedMixed a3, Struct9BytesPackedMixed a4, Struct9BytesPackedMixed a5, Struct9BytesPackedMixed a6, Struct9BytesPackedMixed a7, Struct9BytesPackedMixed a8, Struct9BytesPackedMixed a9, double a10, int32_t a11, int32_t a12))
DART_EXPORT void TestAsyncReturnStructNestedIrregularEvenBigger(void(*f)(uint64_t a0, StructNestedIrregularBigger a1, StructNestedIrregularBigger a2, double a3))
DART_EXPORT void TestAsyncPassStruct16BytesMixedx10(void(*f)(Struct16BytesMixed a0, Struct16BytesMixed a1, Struct16BytesMixed a2, Struct16BytesMixed a3, Struct16BytesMixed a4, Struct16BytesMixed a5, Struct16BytesMixed a6, Struct16BytesMixed a7, Struct16BytesMixed a8, Struct16BytesMixed a9))
DART_EXPORT Struct8BytesHomogeneousFloat ReturnStructArgumentStruct8BytesHomogeneousFloat(Struct8BytesHomogeneousFloat a0)
DART_EXPORT void TestAsyncPassStructStruct32BytesHomogeneousDouble2x5(void(*f)(StructStruct32BytesHomogeneousDouble2 a0, StructStruct32BytesHomogeneousDouble2 a1, StructStruct32BytesHomogeneousDouble2 a2, StructStruct32BytesHomogeneousDouble2 a3, StructStruct32BytesHomogeneousDouble2 a4))
DART_EXPORT intptr_t TestReturnStruct40BytesHomogeneousDouble(Struct40BytesHomogeneousDouble(*f)(double a0, double a1, double a2, double a3, double a4))
DART_EXPORT Struct8BytesPackedInt ReturnStruct8BytesPackedInt(uint8_t a0, uint32_t a1, uint8_t a2, uint8_t a3, uint8_t a4)
DART_EXPORT void TestAsyncPassStruct20BytesHomogeneousFloat(void(*f)(Struct20BytesHomogeneousFloat a0))
DART_EXPORT double PassStruct15BytesInlineArrayMixed(Struct15BytesInlineArrayMixed a0)
DART_EXPORT void TestAsyncPassStruct20BytesHomogeneousInt32x10(void(*f)(Struct20BytesHomogeneousInt32 a0, Struct20BytesHomogeneousInt32 a1, Struct20BytesHomogeneousInt32 a2, Struct20BytesHomogeneousInt32 a3, Struct20BytesHomogeneousInt32 a4, Struct20BytesHomogeneousInt32 a5, Struct20BytesHomogeneousInt32 a6, Struct20BytesHomogeneousInt32 a7, Struct20BytesHomogeneousInt32 a8, Struct20BytesHomogeneousInt32 a9))
DART_EXPORT void TestAsyncReturnStructArgumentStruct8BytesInlineArrayInt(void(*f)(Struct8BytesInlineArrayInt a0))
DART_EXPORT int64_t PassStructNestedIntStructAlignmentInt16(StructNestedIntStructAlignmentInt16 a0)
DART_EXPORT intptr_t TestPassUnion9BytesNestedIntx10(double(*f)(Union9BytesNestedInt a0, Union9BytesNestedInt a1, Union9BytesNestedInt a2, Union9BytesNestedInt a3, Union9BytesNestedInt a4, Union9BytesNestedInt a5, Union9BytesNestedInt a6, Union9BytesNestedInt a7, Union9BytesNestedInt a8, Union9BytesNestedInt a9))
DART_EXPORT int64_t PassStructNestedIntStructAlignmentInt64(StructNestedIntStructAlignmentInt64 a0)
DART_EXPORT intptr_t TestPassStruct1024BytesHomogeneousUint64(uint64_t(*f)(Struct1024BytesHomogeneousUint64 a0))
DART_EXPORT void TestAsyncPassUint8Boolx9Struct10BytesInlineArrayBoolBool(void(*f)(uint8_t a0, bool a1, bool a2, bool a3, bool a4, bool a5, bool a6, bool a7, bool a8, bool a9, Struct10BytesInlineArrayBool a10, bool a11))
DART_EXPORT void TestAsyncPassStruct32BytesNestedIntx2(void(*f)(Struct32BytesNestedInt a0, Struct32BytesNestedInt a1))
DART_EXPORT intptr_t TestVariadicAt1Int64x20(int64_t(*f)(int64_t a0,...))
DART_EXPORT int64_t PassStruct8BytesNestedIntx10(Struct8BytesNestedInt a0, Struct8BytesNestedInt a1, Struct8BytesNestedInt a2, Struct8BytesNestedInt a3, Struct8BytesNestedInt a4, Struct8BytesNestedInt a5, Struct8BytesNestedInt a6, Struct8BytesNestedInt a7, Struct8BytesNestedInt a8, Struct8BytesNestedInt a9)
DART_EXPORT Struct1024BytesHomogeneousUint64 ReturnStruct1024BytesHomogeneousUint64(uint64_t a0, uint64_t a1, uint64_t a2, uint64_t a3, uint64_t a4, uint64_t a5, uint64_t a6, uint64_t a7, uint64_t a8, uint64_t a9, uint64_t a10, uint64_t a11, uint64_t a12, uint64_t a13, uint64_t a14, uint64_t a15, uint64_t a16, uint64_t a17, uint64_t a18, uint64_t a19, uint64_t a20, uint64_t a21, uint64_t a22, uint64_t a23, uint64_t a24, uint64_t a25, uint64_t a26, uint64_t a27, uint64_t a28, uint64_t a29, uint64_t a30, uint64_t a31, uint64_t a32, uint64_t a33, uint64_t a34, uint64_t a35, uint64_t a36, uint64_t a37, uint64_t a38, uint64_t a39, uint64_t a40, uint64_t a41, uint64_t a42, uint64_t a43, uint64_t a44, uint64_t a45, uint64_t a46, uint64_t a47, uint64_t a48, uint64_t a49, uint64_t a50, uint64_t a51, uint64_t a52, uint64_t a53, uint64_t a54, uint64_t a55, uint64_t a56, uint64_t a57, uint64_t a58, uint64_t a59, uint64_t a60, uint64_t a61, uint64_t a62, uint64_t a63, uint64_t a64, uint64_t a65, uint64_t a66, uint64_t a67, uint64_t a68, uint64_t a69, uint64_t a70, uint64_t a71, uint64_t a72, uint64_t a73, uint64_t a74, uint64_t a75, uint64_t a76, uint64_t a77, uint64_t a78, uint64_t a79, uint64_t a80, uint64_t a81, uint64_t a82, uint64_t a83, uint64_t a84, uint64_t a85, uint64_t a86, uint64_t a87, uint64_t a88, uint64_t a89, uint64_t a90, uint64_t a91, uint64_t a92, uint64_t a93, uint64_t a94, uint64_t a95, uint64_t a96, uint64_t a97, uint64_t a98, uint64_t a99, uint64_t a100, uint64_t a101, uint64_t a102, uint64_t a103, uint64_t a104, uint64_t a105, uint64_t a106, uint64_t a107, uint64_t a108, uint64_t a109, uint64_t a110, uint64_t a111, uint64_t a112, uint64_t a113, uint64_t a114, uint64_t a115, uint64_t a116, uint64_t a117, uint64_t a118, uint64_t a119, uint64_t a120, uint64_t a121, uint64_t a122, uint64_t a123, uint64_t a124, uint64_t a125, uint64_t a126, uint64_t a127)
DART_EXPORT intptr_t TestReturnStruct16BytesMixed(Struct16BytesMixed(*f)(double a0, int64_t a1))
DART_EXPORT double VariadicAt1Doublex20(double a0,...)
DART_EXPORT StructAlignmentInt16 ReturnStructAlignmentInt16(int8_t a0, int16_t a1, int8_t a2)
DART_EXPORT Struct9BytesHomogeneousUint8 ReturnStruct9BytesHomogeneousUint8(uint8_t a0, uint8_t a1, uint8_t a2, uint8_t a3, uint8_t a4, uint8_t a5, uint8_t a6, uint8_t a7, uint8_t a8)
DART_EXPORT intptr_t TestPassInt8Struct16BytesMixedInt8Struct16BytesMixedIn(double(*f)(int8_t a0, Struct16BytesMixed a1, int8_t a2, Struct16BytesMixed a3, int8_t a4, Struct16BytesMixed a5, int8_t a6, Struct16BytesMixed a7, int8_t a8))
DART_EXPORT int32_t PassStructInlineArrayIrregularx4(StructInlineArrayIrregular a0, StructInlineArrayIrregular a1, StructInlineArrayIrregular a2, StructInlineArrayIrregular a3)
DART_EXPORT void TestAsyncReturnStruct9BytesPackedMixed(void(*f)(uint8_t a0, double a1))
DART_EXPORT double VariadicAt5Doublex5(double a0, double a1, double a2, double a3, double a4,...)
DART_EXPORT int64_t PassStruct7BytesInt4ByteAlignedx10(Struct7BytesInt4ByteAligned a0, Struct7BytesInt4ByteAligned a1, Struct7BytesInt4ByteAligned a2, Struct7BytesInt4ByteAligned a3, Struct7BytesInt4ByteAligned a4, Struct7BytesInt4ByteAligned a5, Struct7BytesInt4ByteAligned a6, Struct7BytesInt4ByteAligned a7, Struct7BytesInt4ByteAligned a8, Struct7BytesInt4ByteAligned a9)
DART_EXPORT StructNestedIntStructAlignmentInt16 ReturnStructNestedIntStructAlignmentInt16(StructAlignmentInt16 a0, StructAlignmentInt16 a1)
DART_EXPORT intptr_t TestVariadicAt5Doublex5(double(*f)(double a0, double a1, double a2, double a3, double a4,...))
DART_EXPORT intptr_t TestPassStruct8BytesIntx10(int64_t(*f)(Struct8BytesInt a0, Struct8BytesInt a1, Struct8BytesInt a2, Struct8BytesInt a3, Struct8BytesInt a4, Struct8BytesInt a5, Struct8BytesInt a6, Struct8BytesInt a7, Struct8BytesInt a8, Struct8BytesInt a9))
DART_EXPORT int64_t PassStructAlignmentInt16(StructAlignmentInt16 a0)
DART_EXPORT intptr_t TestReturnStruct1024BytesHomogeneousUint64(Struct1024BytesHomogeneousUint64(*f)(uint64_t a0, uint64_t a1, uint64_t a2, uint64_t a3, uint64_t a4, uint64_t a5, uint64_t a6, uint64_t a7, uint64_t a8, uint64_t a9, uint64_t a10, uint64_t a11, uint64_t a12, uint64_t a13, uint64_t a14, uint64_t a15, uint64_t a16, uint64_t a17, uint64_t a18, uint64_t a19, uint64_t a20, uint64_t a21, uint64_t a22, uint64_t a23, uint64_t a24, uint64_t a25, uint64_t a26, uint64_t a27, uint64_t a28, uint64_t a29, uint64_t a30, uint64_t a31, uint64_t a32, uint64_t a33, uint64_t a34, uint64_t a35, uint64_t a36, uint64_t a37, uint64_t a38, uint64_t a39, uint64_t a40, uint64_t a41, uint64_t a42, uint64_t a43, uint64_t a44, uint64_t a45, uint64_t a46, uint64_t a47, uint64_t a48, uint64_t a49, uint64_t a50, uint64_t a51, uint64_t a52, uint64_t a53, uint64_t a54, uint64_t a55, uint64_t a56, uint64_t a57, uint64_t a58, uint64_t a59, uint64_t a60, uint64_t a61, uint64_t a62, uint64_t a63, uint64_t a64, uint64_t a65, uint64_t a66, uint64_t a67, uint64_t a68, uint64_t a69, uint64_t a70, uint64_t a71, uint64_t a72, uint64_t a73, uint64_t a74, uint64_t a75, uint64_t a76, uint64_t a77, uint64_t a78, uint64_t a79, uint64_t a80, uint64_t a81, uint64_t a82, uint64_t a83, uint64_t a84, uint64_t a85, uint64_t a86, uint64_t a87, uint64_t a88, uint64_t a89, uint64_t a90, uint64_t a91, uint64_t a92, uint64_t a93, uint64_t a94, uint64_t a95, uint64_t a96, uint64_t a97, uint64_t a98, uint64_t a99, uint64_t a100, uint64_t a101, uint64_t a102, uint64_t a103, uint64_t a104, uint64_t a105, uint64_t a106, uint64_t a107, uint64_t a108, uint64_t a109, uint64_t a110, uint64_t a111, uint64_t a112, uint64_t a113, uint64_t a114, uint64_t a115, uint64_t a116, uint64_t a117, uint64_t a118, uint64_t a119, uint64_t a120, uint64_t a121, uint64_t a122, uint64_t a123, uint64_t a124, uint64_t a125, uint64_t a126, uint64_t a127))
DART_EXPORT void TestAsyncPassStructAlignmentInt64(void(*f)(StructAlignmentInt64 a0))
DART_EXPORT Struct8BytesNestedInt ReturnStruct8BytesNestedInt(Struct4BytesHomogeneousInt16 a0, Struct4BytesHomogeneousInt16 a1)
DART_EXPORT void TestAsyncPassStruct1024BytesHomogeneousUint64(void(*f)(Struct1024BytesHomogeneousUint64 a0))
DART_EXPORT void TestAsyncReturnUnion8BytesNestedFloat(void(*f)(double a0))
DART_EXPORT intptr_t TestReturnStruct9BytesInt4Or8ByteAligned(Struct9BytesInt4Or8ByteAligned(*f)(int64_t a0, int8_t a1))
DART_EXPORT Struct40BytesHomogeneousDouble ReturnStruct40BytesHomogeneousDouble(double a0, double a1, double a2, double a3, double a4)
DART_EXPORT int32_t PassUint8Boolx9Struct10BytesHomogeneousBoolBool(uint8_t a0, bool a1, bool a2, bool a3, bool a4, bool a5, bool a6, bool a7, bool a8, bool a9, Struct10BytesHomogeneousBool a10, bool a11)
DART_EXPORT double PassStruct9BytesPackedMixedx10DoubleInt32x2(Struct9BytesPackedMixed a0, Struct9BytesPackedMixed a1, Struct9BytesPackedMixed a2, Struct9BytesPackedMixed a3, Struct9BytesPackedMixed a4, Struct9BytesPackedMixed a5, Struct9BytesPackedMixed a6, Struct9BytesPackedMixed a7, Struct9BytesPackedMixed a8, Struct9BytesPackedMixed a9, double a10, int32_t a11, int32_t a12)
DART_EXPORT int32_t PassStruct20BytesHomogeneousInt32x10(Struct20BytesHomogeneousInt32 a0, Struct20BytesHomogeneousInt32 a1, Struct20BytesHomogeneousInt32 a2, Struct20BytesHomogeneousInt32 a3, Struct20BytesHomogeneousInt32 a4, Struct20BytesHomogeneousInt32 a5, Struct20BytesHomogeneousInt32 a6, Struct20BytesHomogeneousInt32 a7, Struct20BytesHomogeneousInt32 a8, Struct20BytesHomogeneousInt32 a9)
DART_EXPORT intptr_t TestReturnStruct19BytesHomogeneousUint8(Struct19BytesHomogeneousUint8(*f)(uint8_t a0, uint8_t a1, uint8_t a2, uint8_t a3, uint8_t a4, uint8_t a5, uint8_t a6, uint8_t a7, uint8_t a8, uint8_t a9, uint8_t a10, uint8_t a11, uint8_t a12, uint8_t a13, uint8_t a14, uint8_t a15, uint8_t a16, uint8_t a17, uint8_t a18))
DART_EXPORT void TestAsyncReturnStruct8BytesPackedInt(void(*f)(uint8_t a0, uint32_t a1, uint8_t a2, uint8_t a3, uint8_t a4))
DART_EXPORT void TestAsyncPassInt32x4Struct16BytesMixedx4Double(void(*f)(int32_t a0, int32_t a1, int32_t a2, int32_t a3, Struct16BytesMixed a4, Struct16BytesMixed a5, Struct16BytesMixed a6, Struct16BytesMixed a7, double a8))
DART_EXPORT Struct7BytesHomogeneousUint8 ReturnStruct7BytesHomogeneousUint8(uint8_t a0, uint8_t a1, uint8_t a2, uint8_t a3, uint8_t a4, uint8_t a5, uint8_t a6)
DART_EXPORT Union9BytesNestedInt ReturnUnion9BytesNestedInt(Struct8BytesInt a0)
DART_EXPORT intptr_t TestReturnStructArgumentInt32x8Struct20BytesHomogeneou(Struct20BytesHomogeneousInt32(*f)(int32_t a0, int32_t a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, Struct20BytesHomogeneousInt32 a8))
DART_EXPORT Struct16BytesHomogeneousFloat ReturnStruct16BytesHomogeneousFloat(float a0, float a1, float a2, float a3)
DART_EXPORT void TestAsyncPassDoublex6Struct16BytesMixedx4Int32(void(*f)(double a0, double a1, double a2, double a3, double a4, double a5, Struct16BytesMixed a6, Struct16BytesMixed a7, Struct16BytesMixed a8, Struct16BytesMixed a9, int32_t a10))
DART_EXPORT Union8BytesNestedFloat ReturnUnion8BytesNestedFloat(double a0)
DART_EXPORT intptr_t TestReturnStruct8BytesNestedMixed(Struct8BytesNestedMixed(*f)(Struct4BytesHomogeneousInt16 a0, Struct4BytesFloat a1))
DART_EXPORT void TestAsyncPassInt64x7Struct12BytesHomogeneousInt32(void(*f)(int64_t a0, int64_t a1, int64_t a2, int64_t a3, int64_t a4, int64_t a5, int64_t a6, Struct12BytesHomogeneousInt32 a7))
DART_EXPORT float PassStruct8BytesNestedFloatx10(Struct8BytesNestedFloat a0, Struct8BytesNestedFloat a1, Struct8BytesNestedFloat a2, Struct8BytesNestedFloat a3, Struct8BytesNestedFloat a4, Struct8BytesNestedFloat a5, Struct8BytesNestedFloat a6, Struct8BytesNestedFloat a7, Struct8BytesNestedFloat a8, Struct8BytesNestedFloat a9)
DART_EXPORT intptr_t TestReturnStruct32BytesHomogeneousDouble(Struct32BytesHomogeneousDouble(*f)(double a0, double a1, double a2, double a3))
DART_EXPORT void TestAsyncPassInt8Struct16BytesMixedInt8Struct16BytesMixedIn(void(*f)(int8_t a0, Struct16BytesMixed a1, int8_t a2, Struct16BytesMixed a3, int8_t a4, Struct16BytesMixed a5, int8_t a6, Struct16BytesMixed a7, int8_t a8))
DART_EXPORT intptr_t TestReturnStructArgumentStruct20BytesHomogeneousInt32(Struct20BytesHomogeneousInt32(*f)(Struct20BytesHomogeneousInt32 a0))
DART_EXPORT void TestAsyncPassStructInlineArray100Bytes(void(*f)(StructInlineArray100Bytes a0))
DART_EXPORT double VariadicAt1DoubleStruct20BytesHomogeneousFloatDoub(double a0,...)
DART_EXPORT intptr_t TestPassStruct16BytesNestedIntx2(int64_t(*f)(Struct16BytesNestedInt a0, Struct16BytesNestedInt a1))
DART_EXPORT void TestAsyncReturnStruct8BytesMixed(void(*f)(float a0, int16_t a1, int16_t a2))
DART_EXPORT intptr_t TestReturnUnion9BytesNestedInt(Union9BytesNestedInt(*f)(Struct8BytesInt a0))
DART_EXPORT intptr_t TestReturnStructArgumentStruct1ByteInt(Struct1ByteInt(*f)(Struct1ByteInt a0))
DART_EXPORT int64_t PassStruct4BytesHomogeneousInt16x10(Struct4BytesHomogeneousInt16 a0, Struct4BytesHomogeneousInt16 a1, Struct4BytesHomogeneousInt16 a2, Struct4BytesHomogeneousInt16 a3, Struct4BytesHomogeneousInt16 a4, Struct4BytesHomogeneousInt16 a5, Struct4BytesHomogeneousInt16 a6, Struct4BytesHomogeneousInt16 a7, Struct4BytesHomogeneousInt16 a8, Struct4BytesHomogeneousInt16 a9)
DART_EXPORT void TestAsyncReturnStruct40BytesHomogeneousDouble(void(*f)(double a0, double a1, double a2, double a3, double a4))
DART_EXPORT double PassDoublex6Struct16BytesMixedx4Int32(double a0, double a1, double a2, double a3, double a4, double a5, Struct16BytesMixed a6, Struct16BytesMixed a7, Struct16BytesMixed a8, Struct16BytesMixed a9, int32_t a10)
DART_EXPORT int64_t VariadicAt1Int64x5(int64_t a0,...)
DART_EXPORT Struct32BytesHomogeneousDouble ReturnStruct32BytesHomogeneousDouble(double a0, double a1, double a2, double a3)
DART_EXPORT int64_t PassStruct9BytesHomogeneousUint8x10(Struct9BytesHomogeneousUint8 a0, Struct9BytesHomogeneousUint8 a1, Struct9BytesHomogeneousUint8 a2, Struct9BytesHomogeneousUint8 a3, Struct9BytesHomogeneousUint8 a4, Struct9BytesHomogeneousUint8 a5, Struct9BytesHomogeneousUint8 a6, Struct9BytesHomogeneousUint8 a7, Struct9BytesHomogeneousUint8 a8, Struct9BytesHomogeneousUint8 a9)
DART_EXPORT void TestAsyncPassStructNestedAlignmentStruct5BytesPackedMixed(void(*f)(StructNestedAlignmentStruct5BytesPackedMixed a0))
DART_EXPORT intptr_t TestPassFloatStruct32BytesHomogeneousDoubleFloatStruct(double(*f)(float a0, Struct32BytesHomogeneousDouble a1, float a2, Struct32BytesHomogeneousDouble a3, float a4, Struct32BytesHomogeneousDouble a5, float a6, Struct32BytesHomogeneousDouble a7, float a8))
DART_EXPORT void TestAsyncPassStructAlignmentInt16(void(*f)(StructAlignmentInt16 a0))
DART_EXPORT void TestAsyncPassStruct6BytesInlineArrayInt(void(*f)(Struct6BytesInlineArrayInt a0))
DART_EXPORT intptr_t TestReturnStructAlignmentInt16(StructAlignmentInt16(*f)(int8_t a0, int16_t a1, int8_t a2))
DART_EXPORT int32_t VariadicAt1Struct12BytesHomogeneousInt32Int32x4(Struct12BytesHomogeneousInt32 a0,...)
DART_EXPORT Struct20BytesHomogeneousFloat ReturnStruct20BytesHomogeneousFloat(float a0, float a1, float a2, float a3, float a4)
DART_EXPORT intptr_t TestPassStructAlignmentInt64(int64_t(*f)(StructAlignmentInt64 a0))
DART_EXPORT intptr_t TestReturnStructNestedIntStructAlignmentInt64(StructNestedIntStructAlignmentInt64(*f)(StructAlignmentInt64 a0, StructAlignmentInt64 a1))
DART_EXPORT double PassStruct16BytesMixedx10(Struct16BytesMixed a0, Struct16BytesMixed a1, Struct16BytesMixed a2, Struct16BytesMixed a3, Struct16BytesMixed a4, Struct16BytesMixed a5, Struct16BytesMixed a6, Struct16BytesMixed a7, Struct16BytesMixed a8, Struct16BytesMixed a9)
DART_EXPORT intptr_t TestReturnStruct16BytesNestedInt(Struct16BytesNestedInt(*f)(Struct8BytesNestedInt a0, Struct8BytesNestedInt a1))
DART_EXPORT intptr_t TestVariadicAt1DoubleInt64Int32Struct20BytesHomogeneou(double(*f)(double a0,...))
DART_EXPORT int64_t VariadicAt1Int64x7Struct12BytesHomogeneousInt32(int64_t a0,...)
DART_EXPORT void TestAsyncPassStructNestedIntStructAlignmentInt32(void(*f)(StructNestedIntStructAlignmentInt32 a0))
DART_EXPORT intptr_t TestPassStruct17BytesIntx10(int64_t(*f)(Struct17BytesInt a0, Struct17BytesInt a1, Struct17BytesInt a2, Struct17BytesInt a3, Struct17BytesInt a4, Struct17BytesInt a5, Struct17BytesInt a6, Struct17BytesInt a7, Struct17BytesInt a8, Struct17BytesInt a9))
DART_EXPORT intptr_t TestPassInt64x7Struct12BytesHomogeneousInt32(int64_t(*f)(int64_t a0, int64_t a1, int64_t a2, int64_t a3, int64_t a4, int64_t a5, int64_t a6, Struct12BytesHomogeneousInt32 a7))
DART_EXPORT intptr_t TestReturnStructNestedIrregularEvenBigger(StructNestedIrregularEvenBigger(*f)(uint64_t a0, StructNestedIrregularBigger a1, StructNestedIrregularBigger a2, double a3))
DART_EXPORT intptr_t TestReturnStructArgumentStructStruct16BytesMixed3(StructStruct16BytesMixed3(*f)(StructStruct16BytesMixed3 a0))
DART_EXPORT Struct17BytesInt ReturnStruct17BytesInt(int64_t a0, int64_t a1, int8_t a2)
DART_EXPORT float PassStructStruct16BytesHomogeneousFloat2x5(StructStruct16BytesHomogeneousFloat2 a0, StructStruct16BytesHomogeneousFloat2 a1, StructStruct16BytesHomogeneousFloat2 a2, StructStruct16BytesHomogeneousFloat2 a3, StructStruct16BytesHomogeneousFloat2 a4)
DART_EXPORT void TestAsyncReturnStruct8BytesNestedFloat(void(*f)(Struct4BytesFloat a0, Struct4BytesFloat a1))
DART_EXPORT intptr_t TestPassFloatStruct16BytesHomogeneousFloatFloatStruct1(float(*f)(float a0, Struct16BytesHomogeneousFloat a1, float a2, Struct16BytesHomogeneousFloat a3, float a4, Struct16BytesHomogeneousFloat a5, float a6, Struct16BytesHomogeneousFloat a7, float a8))
DART_EXPORT double PassStructNestedAlignmentStruct5BytesPackedMixed(StructNestedAlignmentStruct5BytesPackedMixed a0)
DART_EXPORT intptr_t TestReturnStruct3BytesPackedInt(Struct3BytesPackedInt(*f)(int8_t a0, int16_t a1))
DART_EXPORT void TestAsyncPassFloatStruct32BytesHomogeneousDoubleFloatStruct(void(*f)(float a0, Struct32BytesHomogeneousDouble a1, float a2, Struct32BytesHomogeneousDouble a3, float a4, Struct32BytesHomogeneousDouble a5, float a6, Struct32BytesHomogeneousDouble a7, float a8))
DART_EXPORT wchar_t PassWCharStructInlineArrayIntUintPtrx2LongUnsigned(wchar_t a0, StructInlineArrayInt a1, uintptr_t a2, uintptr_t a3, long a4, unsigned long a5)
DART_EXPORT void TestAsyncPassStructNestedIntStructAlignmentInt64(void(*f)(StructNestedIntStructAlignmentInt64 a0))
DART_EXPORT double VariadicAt1Doublex2(double a0,...)
DART_EXPORT intptr_t TestReturnStruct32BytesNestedInt(Struct32BytesNestedInt(*f)(Struct16BytesNestedInt a0, Struct16BytesNestedInt a1))
DART_EXPORT void TestAsyncPassStruct5BytesPackedMixed(void(*f)(Struct5BytesPackedMixed a0))
DART_EXPORT double PassStruct5BytesPackedMixed(Struct5BytesPackedMixed a0)
DART_EXPORT void TestAsyncReturnStruct8BytesHomogeneousFloat(void(*f)(float a0, float a1))
DART_EXPORT void TestAsyncReturnStruct4BytesHomogeneousInt16(void(*f)(int16_t a0, int16_t a1))
DART_EXPORT void TestAsyncReturnStructAlignmentInt64(void(*f)(int8_t a0, int64_t a1, int8_t a2))
DART_EXPORT intptr_t TestPassUint8Struct1ByteBool(bool(*f)(uint8_t a0, Struct1ByteBool a1))
DART_EXPORT Struct8BytesNestedMixed ReturnStruct8BytesNestedMixed(Struct4BytesHomogeneousInt16 a0, Struct4BytesFloat a1)
DART_EXPORT void TestAsyncPassUint8Struct32BytesInlineArrayMultiDimensionalI(void(*f)(uint8_t a0, Struct32BytesInlineArrayMultiDimensionalInt a1, uint8_t a2, Struct8BytesInlineArrayMultiDimensionalInt a3, uint8_t a4, Struct8BytesInlineArrayMultiDimensionalInt a5, uint8_t a6))
DART_EXPORT void TestAsyncReturnStructArgumentStruct20BytesHomogeneousInt32(void(*f)(Struct20BytesHomogeneousInt32 a0))
DART_EXPORT void TestAsyncReturnStruct16BytesMixed2(void(*f)(float a0, float a1, float a2, int32_t a3))
DART_EXPORT Struct20BytesHomogeneousInt32 ReturnStructArgumentInt32x8Struct20BytesHomogeneou(int32_t a0, int32_t a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, Struct20BytesHomogeneousInt32 a8)
DART_EXPORT void TestAsyncPassUint8Struct4BytesInlineArrayMultiDimensionalIn(void(*f)(uint8_t a0, Struct4BytesInlineArrayMultiDimensionalInt a1, uint8_t a2))
DART_EXPORT int32_t PassStructInlineArray100Bytes(StructInlineArray100Bytes a0)
DART_EXPORT void TestAsyncPassStruct8BytesNestedFloatx10(void(*f)(Struct8BytesNestedFloat a0, Struct8BytesNestedFloat a1, Struct8BytesNestedFloat a2, Struct8BytesNestedFloat a3, Struct8BytesNestedFloat a4, Struct8BytesNestedFloat a5, Struct8BytesNestedFloat a6, Struct8BytesNestedFloat a7, Struct8BytesNestedFloat a8, Struct8BytesNestedFloat a9))
DART_EXPORT void TestAsyncPassStruct8BytesPackedIntx10(void(*f)(Struct8BytesPackedInt a0, Struct8BytesPackedInt a1, Struct8BytesPackedInt a2, Struct8BytesPackedInt a3, Struct8BytesPackedInt a4, Struct8BytesPackedInt a5, Struct8BytesPackedInt a6, Struct8BytesPackedInt a7, Struct8BytesPackedInt a8, Struct8BytesPackedInt a9))
DART_EXPORT StructStruct16BytesMixed3 ReturnStructArgumentStructStruct16BytesMixed3(StructStruct16BytesMixed3 a0)
DART_EXPORT intptr_t TestReturnStruct9BytesHomogeneousUint8(Struct9BytesHomogeneousUint8(*f)(uint8_t a0, uint8_t a1, uint8_t a2, uint8_t a3, uint8_t a4, uint8_t a5, uint8_t a6, uint8_t a7, uint8_t a8))
DART_EXPORT void TestAsyncReturnStruct32BytesNestedInt(void(*f)(Struct16BytesNestedInt a0, Struct16BytesNestedInt a1))
DART_EXPORT Union4BytesMixed ReturnUnion4BytesMixed(uint32_t a0)
DART_EXPORT double PassStructStruct32BytesHomogeneousDouble2x5(StructStruct32BytesHomogeneousDouble2 a0, StructStruct32BytesHomogeneousDouble2 a1, StructStruct32BytesHomogeneousDouble2 a2, StructStruct32BytesHomogeneousDouble2 a3, StructStruct32BytesHomogeneousDouble2 a4)
DART_EXPORT double VariadicAt11Doublex8FloatStruct12BytesHomogeneousF(double a0, double a1, double a2, double a3, double a4, double a5, double a6, double a7, float a8, Struct12BytesHomogeneousFloat a9, int64_t a10,...)
DART_EXPORT void TestAsyncPassStruct9BytesPackedMixedx10DoubleInt32x2(void(*f)(Struct9BytesPackedMixed a0, Struct9BytesPackedMixed a1, Struct9BytesPackedMixed a2, Struct9BytesPackedMixed a3, Struct9BytesPackedMixed a4, Struct9BytesPackedMixed a5, Struct9BytesPackedMixed a6, Struct9BytesPackedMixed a7, Struct9BytesPackedMixed a8, Struct9BytesPackedMixed a9, double a10, int32_t a11, int32_t a12))
DART_EXPORT intptr_t TestReturnStructAlignmentInt64(StructAlignmentInt64(*f)(int8_t a0, int64_t a1, int8_t a2))
DART_EXPORT intptr_t TestPassStruct8BytesHomogeneousFloatx10(float(*f)(Struct8BytesHomogeneousFloat a0, Struct8BytesHomogeneousFloat a1, Struct8BytesHomogeneousFloat a2, Struct8BytesHomogeneousFloat a3, Struct8BytesHomogeneousFloat a4, Struct8BytesHomogeneousFloat a5, Struct8BytesHomogeneousFloat a6, Struct8BytesHomogeneousFloat a7, Struct8BytesHomogeneousFloat a8, Struct8BytesHomogeneousFloat a9))
DART_EXPORT Struct20BytesHomogeneousInt32 ReturnStruct20BytesHomogeneousInt32(int32_t a0, int32_t a1, int32_t a2, int32_t a3, int32_t a4)
DART_EXPORT void TestAsyncReturnStructAlignmentInt16(void(*f)(int8_t a0, int16_t a1, int8_t a2))
DART_EXPORT Struct8BytesHomogeneousFloat ReturnStruct8BytesHomogeneousFloat(float a0, float a1)
DART_EXPORT float PassStruct8BytesMixedx10(Struct8BytesMixed a0, Struct8BytesMixed a1, Struct8BytesMixed a2, Struct8BytesMixed a3, Struct8BytesMixed a4, Struct8BytesMixed a5, Struct8BytesMixed a6, Struct8BytesMixed a7, Struct8BytesMixed a8, Struct8BytesMixed a9)
DART_EXPORT int64_t PassStruct7BytesHomogeneousUint8x10(Struct7BytesHomogeneousUint8 a0, Struct7BytesHomogeneousUint8 a1, Struct7BytesHomogeneousUint8 a2, Struct7BytesHomogeneousUint8 a3, Struct7BytesHomogeneousUint8 a4, Struct7BytesHomogeneousUint8 a5, Struct7BytesHomogeneousUint8 a6, Struct7BytesHomogeneousUint8 a7, Struct7BytesHomogeneousUint8 a8, Struct7BytesHomogeneousUint8 a9)
DART_EXPORT bool PassUint8Struct1ByteBool(uint8_t a0, Struct1ByteBool a1)
DART_EXPORT intptr_t TestPassStruct20BytesHomogeneousFloat(float(*f)(Struct20BytesHomogeneousFloat a0))
DART_EXPORT intptr_t TestReturnStruct8BytesHomogeneousFloat(Struct8BytesHomogeneousFloat(*f)(float a0, float a1))
DART_EXPORT intptr_t TestVariadicAt1Doublex2(double(*f)(double a0,...))
DART_EXPORT void TestAsyncPassStruct8BytesMixedx10(void(*f)(Struct8BytesMixed a0, Struct8BytesMixed a1, Struct8BytesMixed a2, Struct8BytesMixed a3, Struct8BytesMixed a4, Struct8BytesMixed a5, Struct8BytesMixed a6, Struct8BytesMixed a7, Struct8BytesMixed a8, Struct8BytesMixed a9))
DART_EXPORT intptr_t TestVariadicAt2Int32Int64IntPtr(int32_t(*f)(int32_t a0, int64_t a1,...))
DART_EXPORT Struct8BytesMixed ReturnStruct8BytesMixed(float a0, int16_t a1, int16_t a2)
DART_EXPORT void TestAsyncPassStruct8BytesNestedFloat2x10(void(*f)(Struct8BytesNestedFloat2 a0, Struct8BytesNestedFloat2 a1, Struct8BytesNestedFloat2 a2, Struct8BytesNestedFloat2 a3, Struct8BytesNestedFloat2 a4, Struct8BytesNestedFloat2 a5, Struct8BytesNestedFloat2 a6, Struct8BytesNestedFloat2 a7, Struct8BytesNestedFloat2 a8, Struct8BytesNestedFloat2 a9))
DART_EXPORT void TestAsyncReturnUnion9BytesNestedInt(void(*f)(Struct8BytesInt a0))
DART_EXPORT intptr_t TestPassStruct9BytesInt4Or8ByteAlignedx10(int64_t(*f)(Struct9BytesInt4Or8ByteAligned a0, Struct9BytesInt4Or8ByteAligned a1, Struct9BytesInt4Or8ByteAligned a2, Struct9BytesInt4Or8ByteAligned a3, Struct9BytesInt4Or8ByteAligned a4, Struct9BytesInt4Or8ByteAligned a5, Struct9BytesInt4Or8ByteAligned a6, Struct9BytesInt4Or8ByteAligned a7, Struct9BytesInt4Or8ByteAligned a8, Struct9BytesInt4Or8ByteAligned a9))
DART_EXPORT intptr_t TestVariadicAt1Int64x2Struct8BytesIntInt64(int64_t(*f)(int64_t a0,...))
DART_EXPORT void TestAsyncPassStructStruct16BytesMixed3x10(void(*f)(StructStruct16BytesMixed3 a0, StructStruct16BytesMixed3 a1, StructStruct16BytesMixed3 a2, StructStruct16BytesMixed3 a3, StructStruct16BytesMixed3 a4, StructStruct16BytesMixed3 a5, StructStruct16BytesMixed3 a6, StructStruct16BytesMixed3 a7, StructStruct16BytesMixed3 a8, StructStruct16BytesMixed3 a9))
DART_EXPORT double VariadicAt1DoubleInt64Int32DoubleInt64Int32(double a0,...)
DART_EXPORT intptr_t TestPassStruct7BytesInt4ByteAlignedx10(int64_t(*f)(Struct7BytesInt4ByteAligned a0, Struct7BytesInt4ByteAligned a1, Struct7BytesInt4ByteAligned a2, Struct7BytesInt4ByteAligned a3, Struct7BytesInt4ByteAligned a4, Struct7BytesInt4ByteAligned a5, Struct7BytesInt4ByteAligned a6, Struct7BytesInt4ByteAligned a7, Struct7BytesInt4ByteAligned a8, Struct7BytesInt4ByteAligned a9))
DART_EXPORT void TestAsyncReturnStruct12BytesHomogeneousFloat(void(*f)(float a0, float a1, float a2))
DART_EXPORT Struct3BytesHomogeneousUint8 ReturnStruct3BytesHomogeneousUint8(uint8_t a0, uint8_t a1, uint8_t a2)
DART_EXPORT intptr_t TestReturnStruct12BytesHomogeneousFloat(Struct12BytesHomogeneousFloat(*f)(float a0, float a1, float a2))
DART_EXPORT int64_t PassStruct3BytesHomogeneousUint8x10(Struct3BytesHomogeneousUint8 a0, Struct3BytesHomogeneousUint8 a1, Struct3BytesHomogeneousUint8 a2, Struct3BytesHomogeneousUint8 a3, Struct3BytesHomogeneousUint8 a4, Struct3BytesHomogeneousUint8 a5, Struct3BytesHomogeneousUint8 a6, Struct3BytesHomogeneousUint8 a7, Struct3BytesHomogeneousUint8 a8, Struct3BytesHomogeneousUint8 a9)
DART_EXPORT intptr_t TestReturnStruct1ByteInt(Struct1ByteInt(*f)(int8_t a0))
DART_EXPORT intptr_t TestVariadicAt1Int32Struct20BytesHomogeneousInt32Int32(int32_t(*f)(int32_t a0,...))
DART_EXPORT StructStruct16BytesHomogeneousFloat2 ReturnStructArgumentStructStruct16BytesHomogeneous(StructStruct16BytesHomogeneousFloat2 a0)
DART_EXPORT void TestAsyncPassStruct8BytesInlineArrayIntx4(void(*f)(Struct8BytesInlineArrayInt a0, Struct8BytesInlineArrayInt a1, Struct8BytesInlineArrayInt a2, Struct8BytesInlineArrayInt a3))
DART_EXPORT void TestAsyncReturnStructArgumentInt32x8Struct1ByteInt(void(*f)(int32_t a0, int32_t a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, Struct1ByteInt a8))
DART_EXPORT void TestAsyncReturnStructNestedIntStructAlignmentInt32(void(*f)(StructAlignmentInt32 a0, StructAlignmentInt32 a1))
DART_EXPORT double PassUnion8BytesNestedFloatx10(Union8BytesNestedFloat a0, Union8BytesNestedFloat a1, Union8BytesNestedFloat a2, Union8BytesNestedFloat a3, Union8BytesNestedFloat a4, Union8BytesNestedFloat a5, Union8BytesNestedFloat a6, Union8BytesNestedFloat a7, Union8BytesNestedFloat a8, Union8BytesNestedFloat a9)
DART_EXPORT float PassStruct12BytesHomogeneousFloatx6(Struct12BytesHomogeneousFloat a0, Struct12BytesHomogeneousFloat a1, Struct12BytesHomogeneousFloat a2, Struct12BytesHomogeneousFloat a3, Struct12BytesHomogeneousFloat a4, Struct12BytesHomogeneousFloat a5)
DART_EXPORT intptr_t TestVariadicAt1DoubleInt64Int32DoubleInt64Int32(double(*f)(double a0,...))
DART_EXPORT intptr_t TestVariadicAt1Doublex2Struct32BytesHomogeneousDoubleD(double(*f)(double a0,...))
DART_EXPORT int32_t PassStruct8BytesInlineArrayIntx4(Struct8BytesInlineArrayInt a0, Struct8BytesInlineArrayInt a1, Struct8BytesInlineArrayInt a2, Struct8BytesInlineArrayInt a3)
DART_EXPORT intptr_t TestReturnStruct16BytesMixed2(Struct16BytesMixed2(*f)(float a0, float a1, float a2, int32_t a3))
DART_EXPORT void TestAsyncPassStruct40BytesHomogeneousDouble(void(*f)(Struct40BytesHomogeneousDouble a0))
DART_EXPORT Struct1ByteInt ReturnStructArgumentStruct1ByteInt(Struct1ByteInt a0)
DART_EXPORT intptr_t TestReturnStruct7BytesInt4ByteAligned(Struct7BytesInt4ByteAligned(*f)(int32_t a0, int16_t a1, int8_t a2))
DART_EXPORT void TestAsyncPassUnion4BytesMixedx10(void(*f)(Union4BytesMixed a0, Union4BytesMixed a1, Union4BytesMixed a2, Union4BytesMixed a3, Union4BytesMixed a4, Union4BytesMixed a5, Union4BytesMixed a6, Union4BytesMixed a7, Union4BytesMixed a8, Union4BytesMixed a9))
DART_EXPORT intptr_t TestPassStructNestedIntStructAlignmentInt64(int64_t(*f)(StructNestedIntStructAlignmentInt64 a0))
DART_EXPORT float PassStruct20BytesHomogeneousFloat(Struct20BytesHomogeneousFloat a0)
DART_EXPORT intptr_t TestReturnStructArgumentStructStruct32BytesHomogeneous(StructStruct32BytesHomogeneousDouble2(*f)(StructStruct32BytesHomogeneousDouble2 a0))
DART_EXPORT void TestAsyncReturnStructArgumentStructStruct32BytesHomogeneous(void(*f)(StructStruct32BytesHomogeneousDouble2 a0))
DART_EXPORT void TestAsyncPassStruct9BytesHomogeneousUint8x10(void(*f)(Struct9BytesHomogeneousUint8 a0, Struct9BytesHomogeneousUint8 a1, Struct9BytesHomogeneousUint8 a2, Struct9BytesHomogeneousUint8 a3, Struct9BytesHomogeneousUint8 a4, Struct9BytesHomogeneousUint8 a5, Struct9BytesHomogeneousUint8 a6, Struct9BytesHomogeneousUint8 a7, Struct9BytesHomogeneousUint8 a8, Struct9BytesHomogeneousUint8 a9))
DART_EXPORT intptr_t TestPassStruct40BytesHomogeneousDouble(double(*f)(Struct40BytesHomogeneousDouble a0))
DART_EXPORT intptr_t TestReturnStruct8BytesMixed(Struct8BytesMixed(*f)(float a0, int16_t a1, int16_t a2))
DART_EXPORT Struct32BytesNestedInt ReturnStruct32BytesNestedInt(Struct16BytesNestedInt a0, Struct16BytesNestedInt a1)
DART_EXPORT float PassStructStruct16BytesMixed3x10(StructStruct16BytesMixed3 a0, StructStruct16BytesMixed3 a1, StructStruct16BytesMixed3 a2, StructStruct16BytesMixed3 a3, StructStruct16BytesMixed3 a4, StructStruct16BytesMixed3 a5, StructStruct16BytesMixed3 a6, StructStruct16BytesMixed3 a7, StructStruct16BytesMixed3 a8, StructStruct16BytesMixed3 a9)
DART_EXPORT int64_t PassStruct9BytesInt4Or8ByteAlignedx10(Struct9BytesInt4Or8ByteAligned a0, Struct9BytesInt4Or8ByteAligned a1, Struct9BytesInt4Or8ByteAligned a2, Struct9BytesInt4Or8ByteAligned a3, Struct9BytesInt4Or8ByteAligned a4, Struct9BytesInt4Or8ByteAligned a5, Struct9BytesInt4Or8ByteAligned a6, Struct9BytesInt4Or8ByteAligned a7, Struct9BytesInt4Or8ByteAligned a8, Struct9BytesInt4Or8ByteAligned a9)
DART_EXPORT intptr_t TestPassStructStruct16BytesHomogeneousFloat2x5(float(*f)(StructStruct16BytesHomogeneousFloat2 a0, StructStruct16BytesHomogeneousFloat2 a1, StructStruct16BytesHomogeneousFloat2 a2, StructStruct16BytesHomogeneousFloat2 a3, StructStruct16BytesHomogeneousFloat2 a4))
DART_EXPORT void TestAsyncReturnStruct8BytesNestedInt(void(*f)(Struct4BytesHomogeneousInt16 a0, Struct4BytesHomogeneousInt16 a1))
DART_EXPORT intptr_t TestPassStruct15BytesInlineArrayMixed(double(*f)(Struct15BytesInlineArrayMixed a0))
DART_EXPORT intptr_t TestPassStructNestedIntStructAlignmentInt16(int64_t(*f)(StructNestedIntStructAlignmentInt16 a0))
DART_EXPORT intptr_t TestReturnUnion16BytesNestedFloat(Union16BytesNestedFloat(*f)(Struct8BytesHomogeneousFloat a0))
DART_EXPORT double VariadicAt1Doublex5(double a0,...)
DART_EXPORT void TestAsyncReturnStruct3BytesPackedInt(void(*f)(int8_t a0, int16_t a1))
DART_EXPORT intptr_t TestPassUnion8BytesNestedFloatx10(double(*f)(Union8BytesNestedFloat a0, Union8BytesNestedFloat a1, Union8BytesNestedFloat a2, Union8BytesNestedFloat a3, Union8BytesNestedFloat a4, Union8BytesNestedFloat a5, Union8BytesNestedFloat a6, Union8BytesNestedFloat a7, Union8BytesNestedFloat a8, Union8BytesNestedFloat a9))
DART_EXPORT intptr_t TestPassStruct32BytesNestedIntx2(int64_t(*f)(Struct32BytesNestedInt a0, Struct32BytesNestedInt a1))
DART_EXPORT intptr_t TestReturnStruct7BytesHomogeneousUint8(Struct7BytesHomogeneousUint8(*f)(uint8_t a0, uint8_t a1, uint8_t a2, uint8_t a3, uint8_t a4, uint8_t a5, uint8_t a6))
DART_EXPORT void TestAsyncPassUint8Struct1ByteBool(void(*f)(uint8_t a0, Struct1ByteBool a1))
DART_EXPORT void TestAsyncPassStruct3BytesInt2ByteAlignedx10(void(*f)(Struct3BytesInt2ByteAligned a0, Struct3BytesInt2ByteAligned a1, Struct3BytesInt2ByteAligned a2, Struct3BytesInt2ByteAligned a3, Struct3BytesInt2ByteAligned a4, Struct3BytesInt2ByteAligned a5, Struct3BytesInt2ByteAligned a6, Struct3BytesInt2ByteAligned a7, Struct3BytesInt2ByteAligned a8, Struct3BytesInt2ByteAligned a9))
DART_EXPORT void TestAsyncPassStruct9BytesInt4Or8ByteAlignedx10(void(*f)(Struct9BytesInt4Or8ByteAligned a0, Struct9BytesInt4Or8ByteAligned a1, Struct9BytesInt4Or8ByteAligned a2, Struct9BytesInt4Or8ByteAligned a3, Struct9BytesInt4Or8ByteAligned a4, Struct9BytesInt4Or8ByteAligned a5, Struct9BytesInt4Or8ByteAligned a6, Struct9BytesInt4Or8ByteAligned a7, Struct9BytesInt4Or8ByteAligned a8, Struct9BytesInt4Or8ByteAligned a9))
DART_EXPORT intptr_t TestPassStruct40BytesHomogeneousDoubleStruct4BytesHomo(double(*f)(Struct40BytesHomogeneousDouble a0, Struct4BytesHomogeneousInt16 a1, Struct8BytesHomogeneousFloat a2))
DART_EXPORT int64_t PassStruct8BytesIntx10(Struct8BytesInt a0, Struct8BytesInt a1, Struct8BytesInt a2, Struct8BytesInt a3, Struct8BytesInt a4, Struct8BytesInt a5, Struct8BytesInt a6, Struct8BytesInt a7, Struct8BytesInt a8, Struct8BytesInt a9)
DART_EXPORT void TestAsyncReturnStruct16BytesMixed(void(*f)(double a0, int64_t a1))
DART_EXPORT int64_t PassStruct32BytesNestedIntx2(Struct32BytesNestedInt a0, Struct32BytesNestedInt a1)
DART_EXPORT intptr_t TestPassStruct7BytesHomogeneousUint8x10(int64_t(*f)(Struct7BytesHomogeneousUint8 a0, Struct7BytesHomogeneousUint8 a1, Struct7BytesHomogeneousUint8 a2, Struct7BytesHomogeneousUint8 a3, Struct7BytesHomogeneousUint8 a4, Struct7BytesHomogeneousUint8 a5, Struct7BytesHomogeneousUint8 a6, Struct7BytesHomogeneousUint8 a7, Struct7BytesHomogeneousUint8 a8, Struct7BytesHomogeneousUint8 a9))
DART_EXPORT Struct19BytesHomogeneousUint8 ReturnStruct19BytesHomogeneousUint8(uint8_t a0, uint8_t a1, uint8_t a2, uint8_t a3, uint8_t a4, uint8_t a5, uint8_t a6, uint8_t a7, uint8_t a8, uint8_t a9, uint8_t a10, uint8_t a11, uint8_t a12, uint8_t a13, uint8_t a14, uint8_t a15, uint8_t a16, uint8_t a17, uint8_t a18)
DART_EXPORT intptr_t TestReturnStructNestedIntStructAlignmentInt16(StructNestedIntStructAlignmentInt16(*f)(StructAlignmentInt16 a0, StructAlignmentInt16 a1))
DART_EXPORT intptr_t TestPassStruct19BytesHomogeneousUint8x10(int64_t(*f)(Struct19BytesHomogeneousUint8 a0, Struct19BytesHomogeneousUint8 a1, Struct19BytesHomogeneousUint8 a2, Struct19BytesHomogeneousUint8 a3, Struct19BytesHomogeneousUint8 a4, Struct19BytesHomogeneousUint8 a5, Struct19BytesHomogeneousUint8 a6, Struct19BytesHomogeneousUint8 a7, Struct19BytesHomogeneousUint8 a8, Struct19BytesHomogeneousUint8 a9))
DART_EXPORT intptr_t TestVariadicAt1Int64x5(int64_t(*f)(int64_t a0,...))
DART_EXPORT double PassInt32x4Struct16BytesMixedx4Double(int32_t a0, int32_t a1, int32_t a2, int32_t a3, Struct16BytesMixed a4, Struct16BytesMixed a5, Struct16BytesMixed a6, Struct16BytesMixed a7, double a8)
DART_EXPORT int64_t PassStruct3BytesPackedIntx10(Struct3BytesPackedInt a0, Struct3BytesPackedInt a1, Struct3BytesPackedInt a2, Struct3BytesPackedInt a3, Struct3BytesPackedInt a4, Struct3BytesPackedInt a5, Struct3BytesPackedInt a6, Struct3BytesPackedInt a7, Struct3BytesPackedInt a8, Struct3BytesPackedInt a9)
DART_EXPORT void TestAsyncReturnUnion16BytesNestedFloat(void(*f)(Struct8BytesHomogeneousFloat a0))
DART_EXPORT int32_t VariadicAt2Int32Int64IntPtr(int32_t a0, int64_t a1,...)
DART_EXPORT intptr_t TestVariadicAt1Doublex5(double(*f)(double a0,...))
DART_EXPORT int32_t VariadicAt1Int32Struct20BytesHomogeneousInt32Int32(int32_t a0,...)
DART_EXPORT intptr_t TestReturnStruct8BytesPackedInt(Struct8BytesPackedInt(*f)(uint8_t a0, uint32_t a1, uint8_t a2, uint8_t a3, uint8_t a4))
DART_EXPORT intptr_t TestPassStruct8BytesInlineArrayIntx4(int32_t(*f)(Struct8BytesInlineArrayInt a0, Struct8BytesInlineArrayInt a1, Struct8BytesInlineArrayInt a2, Struct8BytesInlineArrayInt a3))
DART_EXPORT void TestAsyncPassStructStruct16BytesHomogeneousFloat2x5(void(*f)(StructStruct16BytesHomogeneousFloat2 a0, StructStruct16BytesHomogeneousFloat2 a1, StructStruct16BytesHomogeneousFloat2 a2, StructStruct16BytesHomogeneousFloat2 a3, StructStruct16BytesHomogeneousFloat2 a4))
DART_EXPORT void TestAsyncReturnStruct3BytesHomogeneousUint8(void(*f)(uint8_t a0, uint8_t a1, uint8_t a2))
DART_EXPORT Struct3BytesPackedInt ReturnStruct3BytesPackedInt(int8_t a0, int16_t a1)
DART_EXPORT double PassUnion16BytesNestedInlineArrayFloatx10(Union16BytesNestedInlineArrayFloat a0, Union16BytesNestedInlineArrayFloat a1, Union16BytesNestedInlineArrayFloat a2, Union16BytesNestedInlineArrayFloat a3, Union16BytesNestedInlineArrayFloat a4, Union16BytesNestedInlineArrayFloat a5, Union16BytesNestedInlineArrayFloat a6, Union16BytesNestedInlineArrayFloat a7, Union16BytesNestedInlineArrayFloat a8, Union16BytesNestedInlineArrayFloat a9)
DART_EXPORT double PassStruct6BytesInlineArrayInt(Struct6BytesInlineArrayInt a0)
DART_EXPORT intptr_t TestPassStruct8BytesNestedFloatx10(float(*f)(Struct8BytesNestedFloat a0, Struct8BytesNestedFloat a1, Struct8BytesNestedFloat a2, Struct8BytesNestedFloat a3, Struct8BytesNestedFloat a4, Struct8BytesNestedFloat a5, Struct8BytesNestedFloat a6, Struct8BytesNestedFloat a7, Struct8BytesNestedFloat a8, Struct8BytesNestedFloat a9))
DART_EXPORT double PassStruct8BytesNestedMixedx10(Struct8BytesNestedMixed a0, Struct8BytesNestedMixed a1, Struct8BytesNestedMixed a2, Struct8BytesNestedMixed a3, Struct8BytesNestedMixed a4, Struct8BytesNestedMixed a5, Struct8BytesNestedMixed a6, Struct8BytesNestedMixed a7, Struct8BytesNestedMixed a8, Struct8BytesNestedMixed a9)
DART_EXPORT StructStruct32BytesHomogeneousDouble2 ReturnStructArgumentStructStruct32BytesHomogeneous(StructStruct32BytesHomogeneousDouble2 a0)
DART_EXPORT Struct16BytesMixed ReturnStruct16BytesMixed(double a0, int64_t a1)
DART_EXPORT void TestAsyncPassStruct16BytesNestedIntx2(void(*f)(Struct16BytesNestedInt a0, Struct16BytesNestedInt a1))
DART_EXPORT intptr_t TestPassStructInlineArray100Bytes(int32_t(*f)(StructInlineArray100Bytes a0))
DART_EXPORT StructAlignmentInt32 ReturnStructAlignmentInt32(int8_t a0, int32_t a1, int8_t a2)
DART_EXPORT intptr_t TestReturnStruct4BytesHomogeneousInt16(Struct4BytesHomogeneousInt16(*f)(int16_t a0, int16_t a1))
DART_EXPORT uint64_t PassStruct1024BytesHomogeneousUint64(Struct1024BytesHomogeneousUint64 a0)
DART_EXPORT intptr_t TestReturnStruct3BytesHomogeneousUint8(Struct3BytesHomogeneousUint8(*f)(uint8_t a0, uint8_t a1, uint8_t a2))
DART_EXPORT Struct3BytesInt2ByteAligned ReturnStruct3BytesInt2ByteAligned(int16_t a0, int8_t a1)
DART_EXPORT intptr_t TestPassUint8Boolx9Struct10BytesInlineArrayBoolBool(int32_t(*f)(uint8_t a0, bool a1, bool a2, bool a3, bool a4, bool a5, bool a6, bool a7, bool a8, bool a9, Struct10BytesInlineArrayBool a10, bool a11))
DART_EXPORT intptr_t TestVariadicAt1Int64Int32Struct12BytesHomogeneousFloat(double(*f)(int64_t a0,...))
DART_EXPORT float PassStruct16BytesHomogeneousFloatx5(Struct16BytesHomogeneousFloat a0, Struct16BytesHomogeneousFloat a1, Struct16BytesHomogeneousFloat a2, Struct16BytesHomogeneousFloat a3, Struct16BytesHomogeneousFloat a4)
DART_EXPORT intptr_t TestPassStructAlignmentInt16(int64_t(*f)(StructAlignmentInt16 a0))
DART_EXPORT void TestAsyncReturnStruct7BytesInt4ByteAligned(void(*f)(int32_t a0, int16_t a1, int8_t a2))
DART_EXPORT intptr_t TestPassUint8Boolx9Struct10BytesHomogeneousBoolBool(int32_t(*f)(uint8_t a0, bool a1, bool a2, bool a3, bool a4, bool a5, bool a6, bool a7, bool a8, bool a9, Struct10BytesHomogeneousBool a10, bool a11))
DART_EXPORT void TestAsyncPassStructAlignmentInt32(void(*f)(StructAlignmentInt32 a0))
DART_EXPORT void TestAsyncPassStruct16BytesMixed2x10(void(*f)(Struct16BytesMixed2 a0, Struct16BytesMixed2 a1, Struct16BytesMixed2 a2, Struct16BytesMixed2 a3, Struct16BytesMixed2 a4, Struct16BytesMixed2 a5, Struct16BytesMixed2 a6, Struct16BytesMixed2 a7, Struct16BytesMixed2 a8, Struct16BytesMixed2 a9))
DART_EXPORT void TestAsyncPassStruct4BytesHomogeneousInt16x10(void(*f)(Struct4BytesHomogeneousInt16 a0, Struct4BytesHomogeneousInt16 a1, Struct4BytesHomogeneousInt16 a2, Struct4BytesHomogeneousInt16 a3, Struct4BytesHomogeneousInt16 a4, Struct4BytesHomogeneousInt16 a5, Struct4BytesHomogeneousInt16 a6, Struct4BytesHomogeneousInt16 a7, Struct4BytesHomogeneousInt16 a8, Struct4BytesHomogeneousInt16 a9))
DART_EXPORT double VariadicAt1DoubleStruct12BytesHomogeneousFloatDoub(double a0,...)
DART_EXPORT Struct1ByteInt ReturnStruct1ByteInt(int8_t a0)
DART_EXPORT void TestAsyncPassStructNestedIntStructAlignmentInt16(void(*f)(StructNestedIntStructAlignmentInt16 a0))
DART_EXPORT void TestAsyncReturnStruct16BytesHomogeneousFloat(void(*f)(float a0, float a1, float a2, float a3))
DART_EXPORT void TestAsyncReturnStruct9BytesHomogeneousUint8(void(*f)(uint8_t a0, uint8_t a1, uint8_t a2, uint8_t a3, uint8_t a4, uint8_t a5, uint8_t a6, uint8_t a7, uint8_t a8))
DART_EXPORT uint32_t PassUint8Struct4BytesInlineArrayMultiDimensionalIn(uint8_t a0, Struct4BytesInlineArrayMultiDimensionalInt a1, uint8_t a2)
DART_EXPORT intptr_t TestPassStruct8BytesNestedMixedx10(double(*f)(Struct8BytesNestedMixed a0, Struct8BytesNestedMixed a1, Struct8BytesNestedMixed a2, Struct8BytesNestedMixed a3, Struct8BytesNestedMixed a4, Struct8BytesNestedMixed a5, Struct8BytesNestedMixed a6, Struct8BytesNestedMixed a7, Struct8BytesNestedMixed a8, Struct8BytesNestedMixed a9))
DART_EXPORT void TestAsyncReturnStructArgumentStructStruct16BytesMixed3(void(*f)(StructStruct16BytesMixed3 a0))
DART_EXPORT Struct9BytesInt4Or8ByteAligned ReturnStruct9BytesInt4Or8ByteAligned(int64_t a0, int8_t a1)
DART_EXPORT intptr_t TestPassStruct9BytesHomogeneousUint8x10(int64_t(*f)(Struct9BytesHomogeneousUint8 a0, Struct9BytesHomogeneousUint8 a1, Struct9BytesHomogeneousUint8 a2, Struct9BytesHomogeneousUint8 a3, Struct9BytesHomogeneousUint8 a4, Struct9BytesHomogeneousUint8 a5, Struct9BytesHomogeneousUint8 a6, Struct9BytesHomogeneousUint8 a7, Struct9BytesHomogeneousUint8 a8, Struct9BytesHomogeneousUint8 a9))
DART_EXPORT void TestAsyncReturnStruct3BytesInt2ByteAligned(void(*f)(int16_t a0, int8_t a1))
DART_EXPORT intptr_t TestReturnStruct20BytesHomogeneousFloat(Struct20BytesHomogeneousFloat(*f)(float a0, float a1, float a2, float a3, float a4))
DART_EXPORT intptr_t TestPassStructStruct32BytesHomogeneousDouble2x5(double(*f)(StructStruct32BytesHomogeneousDouble2 a0, StructStruct32BytesHomogeneousDouble2 a1, StructStruct32BytesHomogeneousDouble2 a2, StructStruct32BytesHomogeneousDouble2 a3, StructStruct32BytesHomogeneousDouble2 a4))
DART_EXPORT void TestAsyncReturnStructAlignmentInt32(void(*f)(int8_t a0, int32_t a1, int8_t a2))
DART_EXPORT intptr_t TestPassStruct6BytesInlineArrayInt(double(*f)(Struct6BytesInlineArrayInt a0))
DART_EXPORT double VariadicAt1Int64Int32Struct12BytesHomogeneousFloat(int64_t a0,...)
DART_EXPORT Struct8BytesNestedFloat ReturnStruct8BytesNestedFloat(Struct4BytesFloat a0, Struct4BytesFloat a1)
DART_EXPORT void TestAsyncPassInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int(void(*f)(int32_t a0, int32_t a1, int32_t a2, int32_t a3, int32_t a4, int32_t a5, int32_t a6, int32_t a7, double a8, double a9, double a10, double a11, double a12, double a13, double a14, double a15, int64_t a16, int8_t a17, Struct1ByteInt a18, int64_t a19, int8_t a20, Struct4BytesHomogeneousInt16 a21, int64_t a22, int8_t a23, Struct8BytesInt a24, int64_t a25, int8_t a26, Struct8BytesHomogeneousFloat a27, int64_t a28, int8_t a29, Struct8BytesMixed a30, int64_t a31, int8_t a32, StructAlignmentInt16 a33, int64_t a34, int8_t a35, StructAlignmentInt32 a36, int64_t a37, int8_t a38, StructAlignmentInt64 a39))
DART_EXPORT void TestAsyncReturnStruct19BytesHomogeneousUint8(void(*f)(uint8_t a0, uint8_t a1, uint8_t a2, uint8_t a3, uint8_t a4, uint8_t a5, uint8_t a6, uint8_t a7, uint8_t a8, uint8_t a9, uint8_t a10, uint8_t a11, uint8_t a12, uint8_t a13, uint8_t a14, uint8_t a15, uint8_t a16, uint8_t a17, uint8_t a18))
DART_EXPORT float PassFloatStruct16BytesHomogeneousFloatFloatStruct1(float a0, Struct16BytesHomogeneousFloat a1, float a2, Struct16BytesHomogeneousFloat a3, float a4, Struct16BytesHomogeneousFloat a5, float a6, Struct16BytesHomogeneousFloat a7, float a8)
DART_EXPORT intptr_t TestReturnStruct9BytesPackedMixed(Struct9BytesPackedMixed(*f)(uint8_t a0, double a1))
DART_EXPORT void TestAsyncPassStructInlineArrayIrregularx4(void(*f)(StructInlineArrayIrregular a0, StructInlineArrayIrregular a1, StructInlineArrayIrregular a2, StructInlineArrayIrregular a3))
DART_EXPORT intptr_t TestPassStruct12BytesHomogeneousFloatx6(float(*f)(Struct12BytesHomogeneousFloat a0, Struct12BytesHomogeneousFloat a1, Struct12BytesHomogeneousFloat a2, Struct12BytesHomogeneousFloat a3, Struct12BytesHomogeneousFloat a4, Struct12BytesHomogeneousFloat a5))
DART_EXPORT intptr_t TestPassDoublex6Struct16BytesMixedx4Int32(double(*f)(double a0, double a1, double a2, double a3, double a4, double a5, Struct16BytesMixed a6, Struct16BytesMixed a7, Struct16BytesMixed a8, Struct16BytesMixed a9, int32_t a10))
DART_EXPORT uint32_t PassUint8Struct32BytesInlineArrayMultiDimensionalI(uint8_t a0, Struct32BytesInlineArrayMultiDimensionalInt a1, uint8_t a2, Struct8BytesInlineArrayMultiDimensionalInt a3, uint8_t a4, Struct8BytesInlineArrayMultiDimensionalInt a5, uint8_t a6)
DART_EXPORT void TestAsyncPassStruct8BytesNestedIntx10(void(*f)(Struct8BytesNestedInt a0, Struct8BytesNestedInt a1, Struct8BytesNestedInt a2, Struct8BytesNestedInt a3, Struct8BytesNestedInt a4, Struct8BytesNestedInt a5, Struct8BytesNestedInt a6, Struct8BytesNestedInt a7, Struct8BytesNestedInt a8, Struct8BytesNestedInt a9))
DART_EXPORT int32_t PassUint8Boolx9Struct10BytesInlineArrayBoolBool(uint8_t a0, bool a1, bool a2, bool a3, bool a4, bool a5, bool a6, bool a7, bool a8, bool a9, Struct10BytesInlineArrayBool a10, bool a11)
DART_EXPORT int64_t PassStructAlignmentInt32(StructAlignmentInt32 a0)
DART_EXPORT double PassStructNestedIrregularEvenBiggerx4(StructNestedIrregularEvenBigger a0, StructNestedIrregularEvenBigger a1, StructNestedIrregularEvenBigger a2, StructNestedIrregularEvenBigger a3)
DART_EXPORT void TestAsyncPassStruct3BytesPackedIntx10(void(*f)(Struct3BytesPackedInt a0, Struct3BytesPackedInt a1, Struct3BytesPackedInt a2, Struct3BytesPackedInt a3, Struct3BytesPackedInt a4, Struct3BytesPackedInt a5, Struct3BytesPackedInt a6, Struct3BytesPackedInt a7, Struct3BytesPackedInt a8, Struct3BytesPackedInt a9))
DART_EXPORT int64_t PassInt64x7Struct12BytesHomogeneousInt32(int64_t a0, int64_t a1, int64_t a2, int64_t a3, int64_t a4, int64_t a5, int64_t a6, Struct12BytesHomogeneousInt32 a7)
DART_EXPORT void TestAsyncReturnStruct7BytesHomogeneousUint8(void(*f)(uint8_t a0, uint8_t a1, uint8_t a2, uint8_t a3, uint8_t a4, uint8_t a5, uint8_t a6))
DART_EXPORT StructNestedIntStructAlignmentInt32 ReturnStructNestedIntStructAlignmentInt32(StructAlignmentInt32 a0, StructAlignmentInt32 a1)
DART_EXPORT intptr_t TestPassStruct4BytesHomogeneousInt16x10(int64_t(*f)(Struct4BytesHomogeneousInt16 a0, Struct4BytesHomogeneousInt16 a1, Struct4BytesHomogeneousInt16 a2, Struct4BytesHomogeneousInt16 a3, Struct4BytesHomogeneousInt16 a4, Struct4BytesHomogeneousInt16 a5, Struct4BytesHomogeneousInt16 a6, Struct4BytesHomogeneousInt16 a7, Struct4BytesHomogeneousInt16 a8, Struct4BytesHomogeneousInt16 a9))
DART_EXPORT void TestAsyncPassStruct40BytesHomogeneousDoubleStruct4BytesHomo(void(*f)(Struct40BytesHomogeneousDouble a0, Struct4BytesHomogeneousInt16 a1, Struct8BytesHomogeneousFloat a2))
DART_EXPORT intptr_t TestPassStruct20BytesHomogeneousInt32x10(int32_t(*f)(Struct20BytesHomogeneousInt32 a0, Struct20BytesHomogeneousInt32 a1, Struct20BytesHomogeneousInt32 a2, Struct20BytesHomogeneousInt32 a3, Struct20BytesHomogeneousInt32 a4, Struct20BytesHomogeneousInt32 a5, Struct20BytesHomogeneousInt32 a6, Struct20BytesHomogeneousInt32 a7, Struct20BytesHomogeneousInt32 a8, Struct20BytesHomogeneousInt32 a9))
DART_EXPORT intptr_t TestReturnStruct8BytesInt(Struct8BytesInt(*f)(int16_t a0, int16_t a1, int32_t a2))
DART_EXPORT intptr_t TestReturnStructArgumentStruct8BytesHomogeneousFloat(Struct8BytesHomogeneousFloat(*f)(Struct8BytesHomogeneousFloat a0))
DART_EXPORT intptr_t TestPassStruct16BytesMixedx10(double(*f)(Struct16BytesMixed a0, Struct16BytesMixed a1, Struct16BytesMixed a2, Struct16BytesMixed a3, Struct16BytesMixed a4, Struct16BytesMixed a5, Struct16BytesMixed a6, Struct16BytesMixed a7, Struct16BytesMixed a8, Struct16BytesMixed a9))
DART_EXPORT Struct20BytesHomogeneousInt32 ReturnStructArgumentStruct20BytesHomogeneousInt32(Struct20BytesHomogeneousInt32 a0)
DART_EXPORT intptr_t TestPassStruct8BytesNestedFloat2x10(float(*f)(Struct8BytesNestedFloat2 a0, Struct8BytesNestedFloat2 a1, Struct8BytesNestedFloat2 a2, Struct8BytesNestedFloat2 a3, Struct8BytesNestedFloat2 a4, Struct8BytesNestedFloat2 a5, Struct8BytesNestedFloat2 a6, Struct8BytesNestedFloat2 a7, Struct8BytesNestedFloat2 a8, Struct8BytesNestedFloat2 a9))
DART_EXPORT void TestAsyncPassStruct32BytesHomogeneousDoublex5(void(*f)(Struct32BytesHomogeneousDouble a0, Struct32BytesHomogeneousDouble a1, Struct32BytesHomogeneousDouble a2, Struct32BytesHomogeneousDouble a3, Struct32BytesHomogeneousDouble a4))
DART_EXPORT intptr_t TestReturnStruct17BytesInt(Struct17BytesInt(*f)(int64_t a0, int64_t a1, int8_t a2))
DART_EXPORT void TestAsyncPassStruct7BytesHomogeneousUint8x10(void(*f)(Struct7BytesHomogeneousUint8 a0, Struct7BytesHomogeneousUint8 a1, Struct7BytesHomogeneousUint8 a2, Struct7BytesHomogeneousUint8 a3, Struct7BytesHomogeneousUint8 a4, Struct7BytesHomogeneousUint8 a5, Struct7BytesHomogeneousUint8 a6, Struct7BytesHomogeneousUint8 a7, Struct7BytesHomogeneousUint8 a8, Struct7BytesHomogeneousUint8 a9))
DART_EXPORT double VariadicAt1DoubleInt64Int32Struct20BytesHomogeneou(double a0,...)
DART_EXPORT int64_t PassStruct16BytesNestedIntx2(Struct16BytesNestedInt a0, Struct16BytesNestedInt a1)
DART_EXPORT intptr_t TestReturnStruct20BytesHomogeneousInt32(Struct20BytesHomogeneousInt32(*f)(int32_t a0, int32_t a1, int32_t a2, int32_t a3, int32_t a4))
DART_EXPORT double PassInt8Struct16BytesMixedInt8Struct16BytesMixedIn(int8_t a0, Struct16BytesMixed a1, int8_t a2, Struct16BytesMixed a3, int8_t a4, Struct16BytesMixed a5, int8_t a6, Struct16BytesMixed a7, int8_t a8)
DART_EXPORT StructAlignmentInt64 ReturnStructAlignmentInt64(int8_t a0, int64_t a1, int8_t a2)
DART_EXPORT intptr_t TestVariadicAt1Int64x2(int64_t(*f)(int64_t a0,...))
DART_EXPORT Struct8BytesInlineArrayInt ReturnStructArgumentStruct8BytesInlineArrayInt(Struct8BytesInlineArrayInt a0)
DART_EXPORT intptr_t TestPassStructNestedAlignmentStruct5BytesPackedMixed(double(*f)(StructNestedAlignmentStruct5BytesPackedMixed a0))
DART_EXPORT intptr_t TestReturnUnion4BytesMixed(Union4BytesMixed(*f)(uint32_t a0))
DART_EXPORT void TestAsyncReturnStruct8BytesNestedFloat2(void(*f)(Struct4BytesFloat a0, float a1))
DART_EXPORT intptr_t TestPassStruct1ByteIntx10(int64_t(*f)(Struct1ByteInt a0, Struct1ByteInt a1, Struct1ByteInt a2, Struct1ByteInt a3, Struct1ByteInt a4, Struct1ByteInt a5, Struct1ByteInt a6, Struct1ByteInt a7, Struct1ByteInt a8, Struct1ByteInt a9))
DART_EXPORT intptr_t TestPassStruct3BytesInt2ByteAlignedx10(int64_t(*f)(Struct3BytesInt2ByteAligned a0, Struct3BytesInt2ByteAligned a1, Struct3BytesInt2ByteAligned a2, Struct3BytesInt2ByteAligned a3, Struct3BytesInt2ByteAligned a4, Struct3BytesInt2ByteAligned a5, Struct3BytesInt2ByteAligned a6, Struct3BytesInt2ByteAligned a7, Struct3BytesInt2ByteAligned a8, Struct3BytesInt2ByteAligned a9))
DART_EXPORT intptr_t TestPassStructAlignmentInt32(int64_t(*f)(StructAlignmentInt32 a0))
DART_EXPORT intptr_t TestReturnStructArgumentStruct8BytesInlineArrayInt(Struct8BytesInlineArrayInt(*f)(Struct8BytesInlineArrayInt a0))
DART_EXPORT int64_t PassStruct3BytesInt2ByteAlignedx10(Struct3BytesInt2ByteAligned a0, Struct3BytesInt2ByteAligned a1, Struct3BytesInt2ByteAligned a2, Struct3BytesInt2ByteAligned a3, Struct3BytesInt2ByteAligned a4, Struct3BytesInt2ByteAligned a5, Struct3BytesInt2ByteAligned a6, Struct3BytesInt2ByteAligned a7, Struct3BytesInt2ByteAligned a8, Struct3BytesInt2ByteAligned a9)
DART_EXPORT double VariadicAt1Doublex2Struct32BytesHomogeneousDoubleD(double a0,...)
DART_EXPORT float PassStruct8BytesNestedFloat2x10(Struct8BytesNestedFloat2 a0, Struct8BytesNestedFloat2 a1, Struct8BytesNestedFloat2 a2, Struct8BytesNestedFloat2 a3, Struct8BytesNestedFloat2 a4, Struct8BytesNestedFloat2 a5, Struct8BytesNestedFloat2 a6, Struct8BytesNestedFloat2 a7, Struct8BytesNestedFloat2 a8, Struct8BytesNestedFloat2 a9)
DART_EXPORT intptr_t TestVariadicAt1Doublex20(double(*f)(double a0,...))
DART_EXPORT void TestAsyncReturnStructNestedIntStructAlignmentInt16(void(*f)(StructAlignmentInt16 a0, StructAlignmentInt16 a1))
DART_EXPORT float PassStruct8BytesHomogeneousFloatx10(Struct8BytesHomogeneousFloat a0, Struct8BytesHomogeneousFloat a1, Struct8BytesHomogeneousFloat a2, Struct8BytesHomogeneousFloat a3, Struct8BytesHomogeneousFloat a4, Struct8BytesHomogeneousFloat a5, Struct8BytesHomogeneousFloat a6, Struct8BytesHomogeneousFloat a7, Struct8BytesHomogeneousFloat a8, Struct8BytesHomogeneousFloat a9)
DART_EXPORT intptr_t TestPassStruct32BytesHomogeneousDoublex5(double(*f)(Struct32BytesHomogeneousDouble a0, Struct32BytesHomogeneousDouble a1, Struct32BytesHomogeneousDouble a2, Struct32BytesHomogeneousDouble a3, Struct32BytesHomogeneousDouble a4))
DART_EXPORT void TestAsyncReturnStruct17BytesInt(void(*f)(int64_t a0, int64_t a1, int8_t a2))
DART_EXPORT Struct12BytesHomogeneousFloat ReturnStruct12BytesHomogeneousFloat(float a0, float a1, float a2)
DART_EXPORT double PassUnion16BytesNestedFloatx10(Union16BytesNestedFloat a0, Union16BytesNestedFloat a1, Union16BytesNestedFloat a2, Union16BytesNestedFloat a3, Union16BytesNestedFloat a4, Union16BytesNestedFloat a5, Union16BytesNestedFloat a6, Union16BytesNestedFloat a7, Union16BytesNestedFloat a8, Union16BytesNestedFloat a9)
DART_EXPORT intptr_t TestPassStruct5BytesPackedMixed(double(*f)(Struct5BytesPackedMixed a0))
DART_EXPORT int64_t VariadicAt1Int64x20(int64_t a0,...)
DART_EXPORT intptr_t TestPassStructInlineArrayIrregularx4(int32_t(*f)(StructInlineArrayIrregular a0, StructInlineArrayIrregular a1, StructInlineArrayIrregular a2, StructInlineArrayIrregular a3))
DART_EXPORT void TestAsyncPassUint8Boolx9Struct10BytesHomogeneousBoolBool(void(*f)(uint8_t a0, bool a1, bool a2, bool a3, bool a4, bool a5, bool a6, bool a7, bool a8, bool a9, Struct10BytesHomogeneousBool a10, bool a11))
DART_EXPORT void TestAsyncPassUnion16BytesNestedFloatx10(void(*f)(Union16BytesNestedFloat a0, Union16BytesNestedFloat a1, Union16BytesNestedFloat a2, Union16BytesNestedFloat a3, Union16BytesNestedFloat a4, Union16BytesNestedFloat a5, Union16BytesNestedFloat a6, Union16BytesNestedFloat a7, Union16BytesNestedFloat a8, Union16BytesNestedFloat a9))
DART_EXPORT void TestAsyncReturnStruct20BytesHomogeneousInt32(void(*f)(int32_t a0, int32_t a1, int32_t a2, int32_t a3, int32_t a4))
DART_EXPORT void TestAsyncReturnStruct8BytesInt(void(*f)(int16_t a0, int16_t a1, int32_t a2))
Struct3BytesPackedIntMembersAligned a0[2]