Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
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
378
383
388
393
398
403
408
413
418
428
435
442
444 uint8_t a0[8];
445};
446
448 bool a0[10];
449};
450
455
457 uint8_t a0[100];
458};
459
461 uint32_t a0;
462 uint32_t a1;
463 uint8_t a2[4000];
464};
465
471
477
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
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
525
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
550
552 uint32_t a0;
553 float a1;
554};
555
560
565
570
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" << "((" << static_cast<int>(a0.a0)
595 << "), (" << static_cast<int>(a1.a0) << "), ("
596 << static_cast<int>(a2.a0) << "), (" << static_cast<int>(a3.a0)
597 << "), (" << static_cast<int>(a4.a0) << "), ("
598 << static_cast<int>(a5.a0) << "), (" << static_cast<int>(a6.a0)
599 << "), (" << static_cast<int>(a7.a0) << "), ("
600 << static_cast<int>(a8.a0) << "), (" << static_cast<int>(a9.a0)
601 << "))" << "\n";
602
603 int64_t result = 0;
604
605 result += a0.a0;
606 result += a1.a0;
607 result += a2.a0;
608 result += a3.a0;
609 result += a4.a0;
610 result += a5.a0;
611 result += a6.a0;
612 result += a7.a0;
613 result += a8.a0;
614 result += a9.a0;
615
616 std::cout << "result = " << result << "\n";
617
618 return result;
619}
620
621// Used for testing structs and unions by value.
622// Not a multiple of word size, not a power of two.
623// 10 struct arguments will exhaust available registers.
624DART_EXPORT int64_t
635 std::cout << "PassStruct3BytesHomogeneousUint8x10" << "(("
636 << static_cast<int>(a0.a0) << ", " << static_cast<int>(a0.a1)
637 << ", " << static_cast<int>(a0.a2) << "), ("
638 << static_cast<int>(a1.a0) << ", " << static_cast<int>(a1.a1)
639 << ", " << static_cast<int>(a1.a2) << "), ("
640 << static_cast<int>(a2.a0) << ", " << static_cast<int>(a2.a1)
641 << ", " << static_cast<int>(a2.a2) << "), ("
642 << static_cast<int>(a3.a0) << ", " << static_cast<int>(a3.a1)
643 << ", " << static_cast<int>(a3.a2) << "), ("
644 << static_cast<int>(a4.a0) << ", " << static_cast<int>(a4.a1)
645 << ", " << static_cast<int>(a4.a2) << "), ("
646 << static_cast<int>(a5.a0) << ", " << static_cast<int>(a5.a1)
647 << ", " << static_cast<int>(a5.a2) << "), ("
648 << static_cast<int>(a6.a0) << ", " << static_cast<int>(a6.a1)
649 << ", " << static_cast<int>(a6.a2) << "), ("
650 << static_cast<int>(a7.a0) << ", " << static_cast<int>(a7.a1)
651 << ", " << static_cast<int>(a7.a2) << "), ("
652 << static_cast<int>(a8.a0) << ", " << static_cast<int>(a8.a1)
653 << ", " << static_cast<int>(a8.a2) << "), ("
654 << static_cast<int>(a9.a0) << ", " << static_cast<int>(a9.a1)
655 << ", " << static_cast<int>(a9.a2) << "))" << "\n";
656
657 int64_t result = 0;
658
659 result += a0.a0;
660 result += a0.a1;
661 result += a0.a2;
662 result += a1.a0;
663 result += a1.a1;
664 result += a1.a2;
665 result += a2.a0;
666 result += a2.a1;
667 result += a2.a2;
668 result += a3.a0;
669 result += a3.a1;
670 result += a3.a2;
671 result += a4.a0;
672 result += a4.a1;
673 result += a4.a2;
674 result += a5.a0;
675 result += a5.a1;
676 result += a5.a2;
677 result += a6.a0;
678 result += a6.a1;
679 result += a6.a2;
680 result += a7.a0;
681 result += a7.a1;
682 result += a7.a2;
683 result += a8.a0;
684 result += a8.a1;
685 result += a8.a2;
686 result += a9.a0;
687 result += a9.a1;
688 result += a9.a2;
689
690 std::cout << "result = " << result << "\n";
691
692 return result;
693}
694
695// Used for testing structs and unions by value.
696// Not a multiple of word size, not a power of two.
697// With alignment rules taken into account size is 4 bytes.
698// 10 struct arguments will exhaust available registers.
699DART_EXPORT int64_t
710 std::cout << "PassStruct3BytesInt2ByteAlignedx10" << "((" << a0.a0 << ", "
711 << static_cast<int>(a0.a1) << "), (" << a1.a0 << ", "
712 << static_cast<int>(a1.a1) << "), (" << a2.a0 << ", "
713 << static_cast<int>(a2.a1) << "), (" << a3.a0 << ", "
714 << static_cast<int>(a3.a1) << "), (" << a4.a0 << ", "
715 << static_cast<int>(a4.a1) << "), (" << a5.a0 << ", "
716 << static_cast<int>(a5.a1) << "), (" << a6.a0 << ", "
717 << static_cast<int>(a6.a1) << "), (" << a7.a0 << ", "
718 << static_cast<int>(a7.a1) << "), (" << a8.a0 << ", "
719 << static_cast<int>(a8.a1) << "), (" << a9.a0 << ", "
720 << static_cast<int>(a9.a1) << "))" << "\n";
721
722 int64_t result = 0;
723
724 result += a0.a0;
725 result += a0.a1;
726 result += a1.a0;
727 result += a1.a1;
728 result += a2.a0;
729 result += a2.a1;
730 result += a3.a0;
731 result += a3.a1;
732 result += a4.a0;
733 result += a4.a1;
734 result += a5.a0;
735 result += a5.a1;
736 result += a6.a0;
737 result += a6.a1;
738 result += a7.a0;
739 result += a7.a1;
740 result += a8.a0;
741 result += a8.a1;
742 result += a9.a0;
743 result += a9.a1;
744
745 std::cout << "result = " << result << "\n";
746
747 return result;
748}
749
750// Used for testing structs and unions by value.
751// Exactly word size on 32-bit architectures.
752// 10 struct arguments will exhaust available registers.
753DART_EXPORT int64_t
764 std::cout << "PassStruct4BytesHomogeneousInt16x10" << "((" << a0.a0 << ", "
765 << a0.a1 << "), (" << a1.a0 << ", " << a1.a1 << "), (" << a2.a0
766 << ", " << a2.a1 << "), (" << a3.a0 << ", " << a3.a1 << "), ("
767 << a4.a0 << ", " << a4.a1 << "), (" << a5.a0 << ", " << a5.a1
768 << "), (" << a6.a0 << ", " << a6.a1 << "), (" << a7.a0 << ", "
769 << a7.a1 << "), (" << a8.a0 << ", " << a8.a1 << "), (" << a9.a0
770 << ", " << a9.a1 << "))" << "\n";
771
772 int64_t result = 0;
773
774 result += a0.a0;
775 result += a0.a1;
776 result += a1.a0;
777 result += a1.a1;
778 result += a2.a0;
779 result += a2.a1;
780 result += a3.a0;
781 result += a3.a1;
782 result += a4.a0;
783 result += a4.a1;
784 result += a5.a0;
785 result += a5.a1;
786 result += a6.a0;
787 result += a6.a1;
788 result += a7.a0;
789 result += a7.a1;
790 result += a8.a0;
791 result += a8.a1;
792 result += a9.a0;
793 result += a9.a1;
794
795 std::cout << "result = " << result << "\n";
796
797 return result;
798}
799
800// Used for testing structs and unions by value.
801// Sub word size on 64 bit architectures.
802// 10 struct arguments will exhaust available registers.
803DART_EXPORT int64_t
814 std::cout
815 << "PassStruct7BytesHomogeneousUint8x10" << "(("
816 << static_cast<int>(a0.a0) << ", " << static_cast<int>(a0.a1) << ", "
817 << static_cast<int>(a0.a2) << ", " << static_cast<int>(a0.a3) << ", "
818 << static_cast<int>(a0.a4) << ", " << static_cast<int>(a0.a5) << ", "
819 << static_cast<int>(a0.a6) << "), (" << static_cast<int>(a1.a0) << ", "
820 << static_cast<int>(a1.a1) << ", " << static_cast<int>(a1.a2) << ", "
821 << static_cast<int>(a1.a3) << ", " << static_cast<int>(a1.a4) << ", "
822 << static_cast<int>(a1.a5) << ", " << static_cast<int>(a1.a6) << "), ("
823 << static_cast<int>(a2.a0) << ", " << static_cast<int>(a2.a1) << ", "
824 << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3) << ", "
825 << static_cast<int>(a2.a4) << ", " << static_cast<int>(a2.a5) << ", "
826 << static_cast<int>(a2.a6) << "), (" << static_cast<int>(a3.a0) << ", "
827 << static_cast<int>(a3.a1) << ", " << static_cast<int>(a3.a2) << ", "
828 << static_cast<int>(a3.a3) << ", " << static_cast<int>(a3.a4) << ", "
829 << static_cast<int>(a3.a5) << ", " << static_cast<int>(a3.a6) << "), ("
830 << static_cast<int>(a4.a0) << ", " << static_cast<int>(a4.a1) << ", "
831 << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3) << ", "
832 << static_cast<int>(a4.a4) << ", " << static_cast<int>(a4.a5) << ", "
833 << static_cast<int>(a4.a6) << "), (" << static_cast<int>(a5.a0) << ", "
834 << static_cast<int>(a5.a1) << ", " << static_cast<int>(a5.a2) << ", "
835 << static_cast<int>(a5.a3) << ", " << static_cast<int>(a5.a4) << ", "
836 << static_cast<int>(a5.a5) << ", " << static_cast<int>(a5.a6) << "), ("
837 << static_cast<int>(a6.a0) << ", " << static_cast<int>(a6.a1) << ", "
838 << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3) << ", "
839 << static_cast<int>(a6.a4) << ", " << static_cast<int>(a6.a5) << ", "
840 << static_cast<int>(a6.a6) << "), (" << static_cast<int>(a7.a0) << ", "
841 << static_cast<int>(a7.a1) << ", " << static_cast<int>(a7.a2) << ", "
842 << static_cast<int>(a7.a3) << ", " << static_cast<int>(a7.a4) << ", "
843 << static_cast<int>(a7.a5) << ", " << static_cast<int>(a7.a6) << "), ("
844 << static_cast<int>(a8.a0) << ", " << static_cast<int>(a8.a1) << ", "
845 << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3) << ", "
846 << static_cast<int>(a8.a4) << ", " << static_cast<int>(a8.a5) << ", "
847 << static_cast<int>(a8.a6) << "), (" << static_cast<int>(a9.a0) << ", "
848 << static_cast<int>(a9.a1) << ", " << static_cast<int>(a9.a2) << ", "
849 << static_cast<int>(a9.a3) << ", " << static_cast<int>(a9.a4) << ", "
850 << static_cast<int>(a9.a5) << ", " << static_cast<int>(a9.a6) << "))"
851 << "\n";
852
853 int64_t result = 0;
854
855 result += a0.a0;
856 result += a0.a1;
857 result += a0.a2;
858 result += a0.a3;
859 result += a0.a4;
860 result += a0.a5;
861 result += a0.a6;
862 result += a1.a0;
863 result += a1.a1;
864 result += a1.a2;
865 result += a1.a3;
866 result += a1.a4;
867 result += a1.a5;
868 result += a1.a6;
869 result += a2.a0;
870 result += a2.a1;
871 result += a2.a2;
872 result += a2.a3;
873 result += a2.a4;
874 result += a2.a5;
875 result += a2.a6;
876 result += a3.a0;
877 result += a3.a1;
878 result += a3.a2;
879 result += a3.a3;
880 result += a3.a4;
881 result += a3.a5;
882 result += a3.a6;
883 result += a4.a0;
884 result += a4.a1;
885 result += a4.a2;
886 result += a4.a3;
887 result += a4.a4;
888 result += a4.a5;
889 result += a4.a6;
890 result += a5.a0;
891 result += a5.a1;
892 result += a5.a2;
893 result += a5.a3;
894 result += a5.a4;
895 result += a5.a5;
896 result += a5.a6;
897 result += a6.a0;
898 result += a6.a1;
899 result += a6.a2;
900 result += a6.a3;
901 result += a6.a4;
902 result += a6.a5;
903 result += a6.a6;
904 result += a7.a0;
905 result += a7.a1;
906 result += a7.a2;
907 result += a7.a3;
908 result += a7.a4;
909 result += a7.a5;
910 result += a7.a6;
911 result += a8.a0;
912 result += a8.a1;
913 result += a8.a2;
914 result += a8.a3;
915 result += a8.a4;
916 result += a8.a5;
917 result += a8.a6;
918 result += a9.a0;
919 result += a9.a1;
920 result += a9.a2;
921 result += a9.a3;
922 result += a9.a4;
923 result += a9.a5;
924 result += a9.a6;
925
926 std::cout << "result = " << result << "\n";
927
928 return result;
929}
930
931// Used for testing structs and unions by value.
932// Sub word size on 64 bit architectures.
933// With alignment rules taken into account size is 8 bytes.
934// 10 struct arguments will exhaust available registers.
935DART_EXPORT int64_t
946 std::cout << "PassStruct7BytesInt4ByteAlignedx10" << "((" << a0.a0 << ", "
947 << a0.a1 << ", " << static_cast<int>(a0.a2) << "), (" << a1.a0
948 << ", " << a1.a1 << ", " << static_cast<int>(a1.a2) << "), ("
949 << a2.a0 << ", " << a2.a1 << ", " << static_cast<int>(a2.a2)
950 << "), (" << a3.a0 << ", " << a3.a1 << ", "
951 << static_cast<int>(a3.a2) << "), (" << a4.a0 << ", " << a4.a1
952 << ", " << static_cast<int>(a4.a2) << "), (" << a5.a0 << ", "
953 << a5.a1 << ", " << static_cast<int>(a5.a2) << "), (" << a6.a0
954 << ", " << a6.a1 << ", " << static_cast<int>(a6.a2) << "), ("
955 << a7.a0 << ", " << a7.a1 << ", " << static_cast<int>(a7.a2)
956 << "), (" << a8.a0 << ", " << a8.a1 << ", "
957 << static_cast<int>(a8.a2) << "), (" << a9.a0 << ", " << a9.a1
958 << ", " << static_cast<int>(a9.a2) << "))" << "\n";
959
960 int64_t result = 0;
961
962 result += a0.a0;
963 result += a0.a1;
964 result += a0.a2;
965 result += a1.a0;
966 result += a1.a1;
967 result += a1.a2;
968 result += a2.a0;
969 result += a2.a1;
970 result += a2.a2;
971 result += a3.a0;
972 result += a3.a1;
973 result += a3.a2;
974 result += a4.a0;
975 result += a4.a1;
976 result += a4.a2;
977 result += a5.a0;
978 result += a5.a1;
979 result += a5.a2;
980 result += a6.a0;
981 result += a6.a1;
982 result += a6.a2;
983 result += a7.a0;
984 result += a7.a1;
985 result += a7.a2;
986 result += a8.a0;
987 result += a8.a1;
988 result += a8.a2;
989 result += a9.a0;
990 result += a9.a1;
991 result += a9.a2;
992
993 std::cout << "result = " << result << "\n";
994
995 return result;
996}
997
998// Used for testing structs and unions by value.
999// Exactly word size struct on 64bit architectures.
1000// 10 struct arguments will exhaust available registers.
1002 Struct8BytesInt a1,
1003 Struct8BytesInt a2,
1004 Struct8BytesInt a3,
1005 Struct8BytesInt a4,
1006 Struct8BytesInt a5,
1007 Struct8BytesInt a6,
1008 Struct8BytesInt a7,
1009 Struct8BytesInt a8,
1010 Struct8BytesInt a9) {
1011 std::cout << "PassStruct8BytesIntx10" << "((" << a0.a0 << ", " << a0.a1
1012 << ", " << a0.a2 << "), (" << a1.a0 << ", " << a1.a1 << ", "
1013 << a1.a2 << "), (" << a2.a0 << ", " << a2.a1 << ", " << a2.a2
1014 << "), (" << a3.a0 << ", " << a3.a1 << ", " << a3.a2 << "), ("
1015 << a4.a0 << ", " << a4.a1 << ", " << a4.a2 << "), (" << a5.a0
1016 << ", " << a5.a1 << ", " << a5.a2 << "), (" << a6.a0 << ", "
1017 << a6.a1 << ", " << a6.a2 << "), (" << a7.a0 << ", " << a7.a1
1018 << ", " << a7.a2 << "), (" << a8.a0 << ", " << a8.a1 << ", "
1019 << a8.a2 << "), (" << a9.a0 << ", " << a9.a1 << ", " << a9.a2
1020 << "))" << "\n";
1021
1022 int64_t result = 0;
1023
1024 result += a0.a0;
1025 result += a0.a1;
1026 result += a0.a2;
1027 result += a1.a0;
1028 result += a1.a1;
1029 result += a1.a2;
1030 result += a2.a0;
1031 result += a2.a1;
1032 result += a2.a2;
1033 result += a3.a0;
1034 result += a3.a1;
1035 result += a3.a2;
1036 result += a4.a0;
1037 result += a4.a1;
1038 result += a4.a2;
1039 result += a5.a0;
1040 result += a5.a1;
1041 result += a5.a2;
1042 result += a6.a0;
1043 result += a6.a1;
1044 result += a6.a2;
1045 result += a7.a0;
1046 result += a7.a1;
1047 result += a7.a2;
1048 result += a8.a0;
1049 result += a8.a1;
1050 result += a8.a2;
1051 result += a9.a0;
1052 result += a9.a1;
1053 result += a9.a2;
1054
1055 std::cout << "result = " << result << "\n";
1056
1057 return result;
1058}
1059
1060// Used for testing structs and unions by value.
1061// Arguments passed in FP registers as long as they fit.
1062// 10 struct arguments will exhaust available registers.
1074 std::cout << "PassStruct8BytesHomogeneousFloatx10" << "((" << a0.a0 << ", "
1075 << a0.a1 << "), (" << a1.a0 << ", " << a1.a1 << "), (" << a2.a0
1076 << ", " << a2.a1 << "), (" << a3.a0 << ", " << a3.a1 << "), ("
1077 << a4.a0 << ", " << a4.a1 << "), (" << a5.a0 << ", " << a5.a1
1078 << "), (" << a6.a0 << ", " << a6.a1 << "), (" << a7.a0 << ", "
1079 << a7.a1 << "), (" << a8.a0 << ", " << a8.a1 << "), (" << a9.a0
1080 << ", " << a9.a1 << "))" << "\n";
1081
1082 float result = 0;
1083
1084 result += a0.a0;
1085 result += a0.a1;
1086 result += a1.a0;
1087 result += a1.a1;
1088 result += a2.a0;
1089 result += a2.a1;
1090 result += a3.a0;
1091 result += a3.a1;
1092 result += a4.a0;
1093 result += a4.a1;
1094 result += a5.a0;
1095 result += a5.a1;
1096 result += a6.a0;
1097 result += a6.a1;
1098 result += a7.a0;
1099 result += a7.a1;
1100 result += a8.a0;
1101 result += a8.a1;
1102 result += a9.a0;
1103 result += a9.a1;
1104
1105 std::cout << "result = " << result << "\n";
1106
1107 return result;
1108}
1109
1110// Used for testing structs and unions by value.
1111// On x64, arguments go in int registers because it is not only float.
1112// 10 struct arguments will exhaust available registers.
1122 Struct8BytesMixed a9) {
1123 std::cout << "PassStruct8BytesMixedx10" << "((" << a0.a0 << ", " << a0.a1
1124 << ", " << a0.a2 << "), (" << a1.a0 << ", " << a1.a1 << ", "
1125 << a1.a2 << "), (" << a2.a0 << ", " << a2.a1 << ", " << a2.a2
1126 << "), (" << a3.a0 << ", " << a3.a1 << ", " << a3.a2 << "), ("
1127 << a4.a0 << ", " << a4.a1 << ", " << a4.a2 << "), (" << a5.a0
1128 << ", " << a5.a1 << ", " << a5.a2 << "), (" << a6.a0 << ", "
1129 << a6.a1 << ", " << a6.a2 << "), (" << a7.a0 << ", " << a7.a1
1130 << ", " << a7.a2 << "), (" << a8.a0 << ", " << a8.a1 << ", "
1131 << a8.a2 << "), (" << a9.a0 << ", " << a9.a1 << ", " << a9.a2
1132 << "))" << "\n";
1133
1134 float result = 0;
1135
1136 result += a0.a0;
1137 result += a0.a1;
1138 result += a0.a2;
1139 result += a1.a0;
1140 result += a1.a1;
1141 result += a1.a2;
1142 result += a2.a0;
1143 result += a2.a1;
1144 result += a2.a2;
1145 result += a3.a0;
1146 result += a3.a1;
1147 result += a3.a2;
1148 result += a4.a0;
1149 result += a4.a1;
1150 result += a4.a2;
1151 result += a5.a0;
1152 result += a5.a1;
1153 result += a5.a2;
1154 result += a6.a0;
1155 result += a6.a1;
1156 result += a6.a2;
1157 result += a7.a0;
1158 result += a7.a1;
1159 result += a7.a2;
1160 result += a8.a0;
1161 result += a8.a1;
1162 result += a8.a2;
1163 result += a9.a0;
1164 result += a9.a1;
1165 result += a9.a2;
1166
1167 std::cout << "result = " << result << "\n";
1168
1169 return result;
1170}
1171
1172// Used for testing structs and unions by value.
1173// Argument is a single byte over a multiple of word size.
1174// 10 struct arguments will exhaust available registers.
1175// Struct only has 1-byte aligned fields to test struct alignment itself.
1176// Tests upper bytes in the integer registers that are partly filled.
1177// Tests stack alignment of non word size stack arguments.
1178DART_EXPORT int64_t
1189 std::cout
1190 << "PassStruct9BytesHomogeneousUint8x10" << "(("
1191 << static_cast<int>(a0.a0) << ", " << static_cast<int>(a0.a1) << ", "
1192 << static_cast<int>(a0.a2) << ", " << static_cast<int>(a0.a3) << ", "
1193 << static_cast<int>(a0.a4) << ", " << static_cast<int>(a0.a5) << ", "
1194 << static_cast<int>(a0.a6) << ", " << static_cast<int>(a0.a7) << ", "
1195 << static_cast<int>(a0.a8) << "), (" << static_cast<int>(a1.a0) << ", "
1196 << static_cast<int>(a1.a1) << ", " << static_cast<int>(a1.a2) << ", "
1197 << static_cast<int>(a1.a3) << ", " << static_cast<int>(a1.a4) << ", "
1198 << static_cast<int>(a1.a5) << ", " << static_cast<int>(a1.a6) << ", "
1199 << static_cast<int>(a1.a7) << ", " << static_cast<int>(a1.a8) << "), ("
1200 << static_cast<int>(a2.a0) << ", " << static_cast<int>(a2.a1) << ", "
1201 << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3) << ", "
1202 << static_cast<int>(a2.a4) << ", " << static_cast<int>(a2.a5) << ", "
1203 << static_cast<int>(a2.a6) << ", " << static_cast<int>(a2.a7) << ", "
1204 << static_cast<int>(a2.a8) << "), (" << static_cast<int>(a3.a0) << ", "
1205 << static_cast<int>(a3.a1) << ", " << static_cast<int>(a3.a2) << ", "
1206 << static_cast<int>(a3.a3) << ", " << static_cast<int>(a3.a4) << ", "
1207 << static_cast<int>(a3.a5) << ", " << static_cast<int>(a3.a6) << ", "
1208 << static_cast<int>(a3.a7) << ", " << static_cast<int>(a3.a8) << "), ("
1209 << static_cast<int>(a4.a0) << ", " << static_cast<int>(a4.a1) << ", "
1210 << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3) << ", "
1211 << static_cast<int>(a4.a4) << ", " << static_cast<int>(a4.a5) << ", "
1212 << static_cast<int>(a4.a6) << ", " << static_cast<int>(a4.a7) << ", "
1213 << static_cast<int>(a4.a8) << "), (" << static_cast<int>(a5.a0) << ", "
1214 << static_cast<int>(a5.a1) << ", " << static_cast<int>(a5.a2) << ", "
1215 << static_cast<int>(a5.a3) << ", " << static_cast<int>(a5.a4) << ", "
1216 << static_cast<int>(a5.a5) << ", " << static_cast<int>(a5.a6) << ", "
1217 << static_cast<int>(a5.a7) << ", " << static_cast<int>(a5.a8) << "), ("
1218 << static_cast<int>(a6.a0) << ", " << static_cast<int>(a6.a1) << ", "
1219 << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3) << ", "
1220 << static_cast<int>(a6.a4) << ", " << static_cast<int>(a6.a5) << ", "
1221 << static_cast<int>(a6.a6) << ", " << static_cast<int>(a6.a7) << ", "
1222 << static_cast<int>(a6.a8) << "), (" << static_cast<int>(a7.a0) << ", "
1223 << static_cast<int>(a7.a1) << ", " << static_cast<int>(a7.a2) << ", "
1224 << static_cast<int>(a7.a3) << ", " << static_cast<int>(a7.a4) << ", "
1225 << static_cast<int>(a7.a5) << ", " << static_cast<int>(a7.a6) << ", "
1226 << static_cast<int>(a7.a7) << ", " << static_cast<int>(a7.a8) << "), ("
1227 << static_cast<int>(a8.a0) << ", " << static_cast<int>(a8.a1) << ", "
1228 << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3) << ", "
1229 << static_cast<int>(a8.a4) << ", " << static_cast<int>(a8.a5) << ", "
1230 << static_cast<int>(a8.a6) << ", " << static_cast<int>(a8.a7) << ", "
1231 << static_cast<int>(a8.a8) << "), (" << static_cast<int>(a9.a0) << ", "
1232 << static_cast<int>(a9.a1) << ", " << static_cast<int>(a9.a2) << ", "
1233 << static_cast<int>(a9.a3) << ", " << static_cast<int>(a9.a4) << ", "
1234 << static_cast<int>(a9.a5) << ", " << static_cast<int>(a9.a6) << ", "
1235 << static_cast<int>(a9.a7) << ", " << static_cast<int>(a9.a8) << "))"
1236 << "\n";
1237
1238 int64_t result = 0;
1239
1240 result += a0.a0;
1241 result += a0.a1;
1242 result += a0.a2;
1243 result += a0.a3;
1244 result += a0.a4;
1245 result += a0.a5;
1246 result += a0.a6;
1247 result += a0.a7;
1248 result += a0.a8;
1249 result += a1.a0;
1250 result += a1.a1;
1251 result += a1.a2;
1252 result += a1.a3;
1253 result += a1.a4;
1254 result += a1.a5;
1255 result += a1.a6;
1256 result += a1.a7;
1257 result += a1.a8;
1258 result += a2.a0;
1259 result += a2.a1;
1260 result += a2.a2;
1261 result += a2.a3;
1262 result += a2.a4;
1263 result += a2.a5;
1264 result += a2.a6;
1265 result += a2.a7;
1266 result += a2.a8;
1267 result += a3.a0;
1268 result += a3.a1;
1269 result += a3.a2;
1270 result += a3.a3;
1271 result += a3.a4;
1272 result += a3.a5;
1273 result += a3.a6;
1274 result += a3.a7;
1275 result += a3.a8;
1276 result += a4.a0;
1277 result += a4.a1;
1278 result += a4.a2;
1279 result += a4.a3;
1280 result += a4.a4;
1281 result += a4.a5;
1282 result += a4.a6;
1283 result += a4.a7;
1284 result += a4.a8;
1285 result += a5.a0;
1286 result += a5.a1;
1287 result += a5.a2;
1288 result += a5.a3;
1289 result += a5.a4;
1290 result += a5.a5;
1291 result += a5.a6;
1292 result += a5.a7;
1293 result += a5.a8;
1294 result += a6.a0;
1295 result += a6.a1;
1296 result += a6.a2;
1297 result += a6.a3;
1298 result += a6.a4;
1299 result += a6.a5;
1300 result += a6.a6;
1301 result += a6.a7;
1302 result += a6.a8;
1303 result += a7.a0;
1304 result += a7.a1;
1305 result += a7.a2;
1306 result += a7.a3;
1307 result += a7.a4;
1308 result += a7.a5;
1309 result += a7.a6;
1310 result += a7.a7;
1311 result += a7.a8;
1312 result += a8.a0;
1313 result += a8.a1;
1314 result += a8.a2;
1315 result += a8.a3;
1316 result += a8.a4;
1317 result += a8.a5;
1318 result += a8.a6;
1319 result += a8.a7;
1320 result += a8.a8;
1321 result += a9.a0;
1322 result += a9.a1;
1323 result += a9.a2;
1324 result += a9.a3;
1325 result += a9.a4;
1326 result += a9.a5;
1327 result += a9.a6;
1328 result += a9.a7;
1329 result += a9.a8;
1330
1331 std::cout << "result = " << result << "\n";
1332
1333 return result;
1334}
1335
1336// Used for testing structs and unions by value.
1337// Argument is a single byte over a multiple of word size.
1338// With alignment rules taken into account size is 12 or 16 bytes.
1339// 10 struct arguments will exhaust available registers.
1340//
1341DART_EXPORT int64_t
1352 std::cout << "PassStruct9BytesInt4Or8ByteAlignedx10" << "((" << a0.a0 << ", "
1353 << static_cast<int>(a0.a1) << "), (" << a1.a0 << ", "
1354 << static_cast<int>(a1.a1) << "), (" << a2.a0 << ", "
1355 << static_cast<int>(a2.a1) << "), (" << a3.a0 << ", "
1356 << static_cast<int>(a3.a1) << "), (" << a4.a0 << ", "
1357 << static_cast<int>(a4.a1) << "), (" << a5.a0 << ", "
1358 << static_cast<int>(a5.a1) << "), (" << a6.a0 << ", "
1359 << static_cast<int>(a6.a1) << "), (" << a7.a0 << ", "
1360 << static_cast<int>(a7.a1) << "), (" << a8.a0 << ", "
1361 << static_cast<int>(a8.a1) << "), (" << a9.a0 << ", "
1362 << static_cast<int>(a9.a1) << "))" << "\n";
1363
1364 int64_t result = 0;
1365
1366 result += a0.a0;
1367 result += a0.a1;
1368 result += a1.a0;
1369 result += a1.a1;
1370 result += a2.a0;
1371 result += a2.a1;
1372 result += a3.a0;
1373 result += a3.a1;
1374 result += a4.a0;
1375 result += a4.a1;
1376 result += a5.a0;
1377 result += a5.a1;
1378 result += a6.a0;
1379 result += a6.a1;
1380 result += a7.a0;
1381 result += a7.a1;
1382 result += a8.a0;
1383 result += a8.a1;
1384 result += a9.a0;
1385 result += a9.a1;
1386
1387 std::cout << "result = " << result << "\n";
1388
1389 return result;
1390}
1391
1392// Used for testing structs and unions by value.
1393// Arguments in FPU registers on arm hardfp and arm64.
1394// Struct arguments will exhaust available registers, and leave some empty.
1395// The last argument is to test whether arguments are backfilled.
1403 std::cout << "PassStruct12BytesHomogeneousFloatx6" << "((" << a0.a0 << ", "
1404 << a0.a1 << ", " << a0.a2 << "), (" << a1.a0 << ", " << a1.a1
1405 << ", " << a1.a2 << "), (" << a2.a0 << ", " << a2.a1 << ", "
1406 << a2.a2 << "), (" << a3.a0 << ", " << a3.a1 << ", " << a3.a2
1407 << "), (" << a4.a0 << ", " << a4.a1 << ", " << a4.a2 << "), ("
1408 << a5.a0 << ", " << a5.a1 << ", " << a5.a2 << "))" << "\n";
1409
1410 float result = 0;
1411
1412 result += a0.a0;
1413 result += a0.a1;
1414 result += a0.a2;
1415 result += a1.a0;
1416 result += a1.a1;
1417 result += a1.a2;
1418 result += a2.a0;
1419 result += a2.a1;
1420 result += a2.a2;
1421 result += a3.a0;
1422 result += a3.a1;
1423 result += a3.a2;
1424 result += a4.a0;
1425 result += a4.a1;
1426 result += a4.a2;
1427 result += a5.a0;
1428 result += a5.a1;
1429 result += a5.a2;
1430
1431 std::cout << "result = " << result << "\n";
1432
1433 return result;
1434}
1435
1436// Used for testing structs and unions by value.
1437// On Linux x64 argument is transferred on stack because it is over 16 bytes.
1438// Arguments in FPU registers on arm hardfp and arm64.
1439// 5 struct arguments will exhaust available registers.
1446 std::cout << "PassStruct16BytesHomogeneousFloatx5" << "((" << a0.a0 << ", "
1447 << a0.a1 << ", " << a0.a2 << ", " << a0.a3 << "), (" << a1.a0
1448 << ", " << a1.a1 << ", " << a1.a2 << ", " << a1.a3 << "), ("
1449 << a2.a0 << ", " << a2.a1 << ", " << a2.a2 << ", " << a2.a3
1450 << "), (" << a3.a0 << ", " << a3.a1 << ", " << a3.a2 << ", "
1451 << a3.a3 << "), (" << a4.a0 << ", " << a4.a1 << ", " << a4.a2
1452 << ", " << a4.a3 << "))" << "\n";
1453
1454 float result = 0;
1455
1456 result += a0.a0;
1457 result += a0.a1;
1458 result += a0.a2;
1459 result += a0.a3;
1460 result += a1.a0;
1461 result += a1.a1;
1462 result += a1.a2;
1463 result += a1.a3;
1464 result += a2.a0;
1465 result += a2.a1;
1466 result += a2.a2;
1467 result += a2.a3;
1468 result += a3.a0;
1469 result += a3.a1;
1470 result += a3.a2;
1471 result += a3.a3;
1472 result += a4.a0;
1473 result += a4.a1;
1474 result += a4.a2;
1475 result += a4.a3;
1476
1477 std::cout << "result = " << result << "\n";
1478
1479 return result;
1480}
1481
1482// Used for testing structs and unions by value.
1483// On x64, arguments are split over FP and int registers.
1484// On x64, it will exhaust the integer registers with the 6th argument.
1485// The rest goes on the stack.
1486// On arm, arguments are 8 byte aligned.
1496 Struct16BytesMixed a9) {
1497 std::cout << "PassStruct16BytesMixedx10" << "((" << a0.a0 << ", " << a0.a1
1498 << "), (" << a1.a0 << ", " << a1.a1 << "), (" << a2.a0 << ", "
1499 << a2.a1 << "), (" << a3.a0 << ", " << a3.a1 << "), (" << a4.a0
1500 << ", " << a4.a1 << "), (" << a5.a0 << ", " << a5.a1 << "), ("
1501 << a6.a0 << ", " << a6.a1 << "), (" << a7.a0 << ", " << a7.a1
1502 << "), (" << a8.a0 << ", " << a8.a1 << "), (" << a9.a0 << ", "
1503 << a9.a1 << "))" << "\n";
1504
1505 double result = 0;
1506
1507 result += a0.a0;
1508 result += a0.a1;
1509 result += a1.a0;
1510 result += a1.a1;
1511 result += a2.a0;
1512 result += a2.a1;
1513 result += a3.a0;
1514 result += a3.a1;
1515 result += a4.a0;
1516 result += a4.a1;
1517 result += a5.a0;
1518 result += a5.a1;
1519 result += a6.a0;
1520 result += a6.a1;
1521 result += a7.a0;
1522 result += a7.a1;
1523 result += a8.a0;
1524 result += a8.a1;
1525 result += a9.a0;
1526 result += a9.a1;
1527
1528 std::cout << "result = " << result << "\n";
1529
1530 return result;
1531}
1532
1533// Used for testing structs and unions by value.
1534// On x64, arguments are split over FP and int registers.
1535// On x64, it will exhaust the integer registers with the 6th argument.
1536// The rest goes on the stack.
1537// On arm, arguments are 4 byte aligned.
1548 std::cout << "PassStruct16BytesMixed2x10" << "((" << a0.a0 << ", " << a0.a1
1549 << ", " << a0.a2 << ", " << a0.a3 << "), (" << a1.a0 << ", "
1550 << a1.a1 << ", " << a1.a2 << ", " << a1.a3 << "), (" << a2.a0
1551 << ", " << a2.a1 << ", " << a2.a2 << ", " << a2.a3 << "), ("
1552 << a3.a0 << ", " << a3.a1 << ", " << a3.a2 << ", " << a3.a3
1553 << "), (" << a4.a0 << ", " << a4.a1 << ", " << a4.a2 << ", "
1554 << a4.a3 << "), (" << a5.a0 << ", " << a5.a1 << ", " << a5.a2
1555 << ", " << a5.a3 << "), (" << a6.a0 << ", " << a6.a1 << ", "
1556 << a6.a2 << ", " << a6.a3 << "), (" << a7.a0 << ", " << a7.a1
1557 << ", " << a7.a2 << ", " << a7.a3 << "), (" << a8.a0 << ", "
1558 << a8.a1 << ", " << a8.a2 << ", " << a8.a3 << "), (" << a9.a0
1559 << ", " << a9.a1 << ", " << a9.a2 << ", " << a9.a3 << "))" << "\n";
1560
1561 float result = 0;
1562
1563 result += a0.a0;
1564 result += a0.a1;
1565 result += a0.a2;
1566 result += a0.a3;
1567 result += a1.a0;
1568 result += a1.a1;
1569 result += a1.a2;
1570 result += a1.a3;
1571 result += a2.a0;
1572 result += a2.a1;
1573 result += a2.a2;
1574 result += a2.a3;
1575 result += a3.a0;
1576 result += a3.a1;
1577 result += a3.a2;
1578 result += a3.a3;
1579 result += a4.a0;
1580 result += a4.a1;
1581 result += a4.a2;
1582 result += a4.a3;
1583 result += a5.a0;
1584 result += a5.a1;
1585 result += a5.a2;
1586 result += a5.a3;
1587 result += a6.a0;
1588 result += a6.a1;
1589 result += a6.a2;
1590 result += a6.a3;
1591 result += a7.a0;
1592 result += a7.a1;
1593 result += a7.a2;
1594 result += a7.a3;
1595 result += a8.a0;
1596 result += a8.a1;
1597 result += a8.a2;
1598 result += a8.a3;
1599 result += a9.a0;
1600 result += a9.a1;
1601 result += a9.a2;
1602 result += a9.a3;
1603
1604 std::cout << "result = " << result << "\n";
1605
1606 return result;
1607}
1608
1609// Used for testing structs and unions by value.
1610// Arguments are passed as pointer to copy on arm64.
1611// Tests that the memory allocated for copies are rounded up to word size.
1621 Struct17BytesInt a9) {
1622 std::cout << "PassStruct17BytesIntx10" << "((" << a0.a0 << ", " << a0.a1
1623 << ", " << static_cast<int>(a0.a2) << "), (" << a1.a0 << ", "
1624 << a1.a1 << ", " << static_cast<int>(a1.a2) << "), (" << a2.a0
1625 << ", " << a2.a1 << ", " << static_cast<int>(a2.a2) << "), ("
1626 << a3.a0 << ", " << a3.a1 << ", " << static_cast<int>(a3.a2)
1627 << "), (" << a4.a0 << ", " << a4.a1 << ", "
1628 << static_cast<int>(a4.a2) << "), (" << a5.a0 << ", " << a5.a1
1629 << ", " << static_cast<int>(a5.a2) << "), (" << a6.a0 << ", "
1630 << a6.a1 << ", " << static_cast<int>(a6.a2) << "), (" << a7.a0
1631 << ", " << a7.a1 << ", " << static_cast<int>(a7.a2) << "), ("
1632 << a8.a0 << ", " << a8.a1 << ", " << static_cast<int>(a8.a2)
1633 << "), (" << a9.a0 << ", " << a9.a1 << ", "
1634 << static_cast<int>(a9.a2) << "))" << "\n";
1635
1636 int64_t result = 0;
1637
1638 result += a0.a0;
1639 result += a0.a1;
1640 result += a0.a2;
1641 result += a1.a0;
1642 result += a1.a1;
1643 result += a1.a2;
1644 result += a2.a0;
1645 result += a2.a1;
1646 result += a2.a2;
1647 result += a3.a0;
1648 result += a3.a1;
1649 result += a3.a2;
1650 result += a4.a0;
1651 result += a4.a1;
1652 result += a4.a2;
1653 result += a5.a0;
1654 result += a5.a1;
1655 result += a5.a2;
1656 result += a6.a0;
1657 result += a6.a1;
1658 result += a6.a2;
1659 result += a7.a0;
1660 result += a7.a1;
1661 result += a7.a2;
1662 result += a8.a0;
1663 result += a8.a1;
1664 result += a8.a2;
1665 result += a9.a0;
1666 result += a9.a1;
1667 result += a9.a2;
1668
1669 std::cout << "result = " << result << "\n";
1670
1671 return result;
1672}
1673
1674// Used for testing structs and unions by value.
1675// The minimum alignment of this struct is only 1 byte based on its fields.
1676// Test that the memory backing these structs is extended to the right size.
1677//
1678DART_EXPORT int64_t
1689 std::cout
1690 << "PassStruct19BytesHomogeneousUint8x10" << "(("
1691 << static_cast<int>(a0.a0) << ", " << static_cast<int>(a0.a1) << ", "
1692 << static_cast<int>(a0.a2) << ", " << static_cast<int>(a0.a3) << ", "
1693 << static_cast<int>(a0.a4) << ", " << static_cast<int>(a0.a5) << ", "
1694 << static_cast<int>(a0.a6) << ", " << static_cast<int>(a0.a7) << ", "
1695 << static_cast<int>(a0.a8) << ", " << static_cast<int>(a0.a9) << ", "
1696 << static_cast<int>(a0.a10) << ", " << static_cast<int>(a0.a11) << ", "
1697 << static_cast<int>(a0.a12) << ", " << static_cast<int>(a0.a13) << ", "
1698 << static_cast<int>(a0.a14) << ", " << static_cast<int>(a0.a15) << ", "
1699 << static_cast<int>(a0.a16) << ", " << static_cast<int>(a0.a17) << ", "
1700 << static_cast<int>(a0.a18) << "), (" << static_cast<int>(a1.a0) << ", "
1701 << static_cast<int>(a1.a1) << ", " << static_cast<int>(a1.a2) << ", "
1702 << static_cast<int>(a1.a3) << ", " << static_cast<int>(a1.a4) << ", "
1703 << static_cast<int>(a1.a5) << ", " << static_cast<int>(a1.a6) << ", "
1704 << static_cast<int>(a1.a7) << ", " << static_cast<int>(a1.a8) << ", "
1705 << static_cast<int>(a1.a9) << ", " << static_cast<int>(a1.a10) << ", "
1706 << static_cast<int>(a1.a11) << ", " << static_cast<int>(a1.a12) << ", "
1707 << static_cast<int>(a1.a13) << ", " << static_cast<int>(a1.a14) << ", "
1708 << static_cast<int>(a1.a15) << ", " << static_cast<int>(a1.a16) << ", "
1709 << static_cast<int>(a1.a17) << ", " << static_cast<int>(a1.a18) << "), ("
1710 << static_cast<int>(a2.a0) << ", " << static_cast<int>(a2.a1) << ", "
1711 << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3) << ", "
1712 << static_cast<int>(a2.a4) << ", " << static_cast<int>(a2.a5) << ", "
1713 << static_cast<int>(a2.a6) << ", " << static_cast<int>(a2.a7) << ", "
1714 << static_cast<int>(a2.a8) << ", " << static_cast<int>(a2.a9) << ", "
1715 << static_cast<int>(a2.a10) << ", " << static_cast<int>(a2.a11) << ", "
1716 << static_cast<int>(a2.a12) << ", " << static_cast<int>(a2.a13) << ", "
1717 << static_cast<int>(a2.a14) << ", " << static_cast<int>(a2.a15) << ", "
1718 << static_cast<int>(a2.a16) << ", " << static_cast<int>(a2.a17) << ", "
1719 << static_cast<int>(a2.a18) << "), (" << static_cast<int>(a3.a0) << ", "
1720 << static_cast<int>(a3.a1) << ", " << static_cast<int>(a3.a2) << ", "
1721 << static_cast<int>(a3.a3) << ", " << static_cast<int>(a3.a4) << ", "
1722 << static_cast<int>(a3.a5) << ", " << static_cast<int>(a3.a6) << ", "
1723 << static_cast<int>(a3.a7) << ", " << static_cast<int>(a3.a8) << ", "
1724 << static_cast<int>(a3.a9) << ", " << static_cast<int>(a3.a10) << ", "
1725 << static_cast<int>(a3.a11) << ", " << static_cast<int>(a3.a12) << ", "
1726 << static_cast<int>(a3.a13) << ", " << static_cast<int>(a3.a14) << ", "
1727 << static_cast<int>(a3.a15) << ", " << static_cast<int>(a3.a16) << ", "
1728 << static_cast<int>(a3.a17) << ", " << static_cast<int>(a3.a18) << "), ("
1729 << static_cast<int>(a4.a0) << ", " << static_cast<int>(a4.a1) << ", "
1730 << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3) << ", "
1731 << static_cast<int>(a4.a4) << ", " << static_cast<int>(a4.a5) << ", "
1732 << static_cast<int>(a4.a6) << ", " << static_cast<int>(a4.a7) << ", "
1733 << static_cast<int>(a4.a8) << ", " << static_cast<int>(a4.a9) << ", "
1734 << static_cast<int>(a4.a10) << ", " << static_cast<int>(a4.a11) << ", "
1735 << static_cast<int>(a4.a12) << ", " << static_cast<int>(a4.a13) << ", "
1736 << static_cast<int>(a4.a14) << ", " << static_cast<int>(a4.a15) << ", "
1737 << static_cast<int>(a4.a16) << ", " << static_cast<int>(a4.a17) << ", "
1738 << static_cast<int>(a4.a18) << "), (" << static_cast<int>(a5.a0) << ", "
1739 << static_cast<int>(a5.a1) << ", " << static_cast<int>(a5.a2) << ", "
1740 << static_cast<int>(a5.a3) << ", " << static_cast<int>(a5.a4) << ", "
1741 << static_cast<int>(a5.a5) << ", " << static_cast<int>(a5.a6) << ", "
1742 << static_cast<int>(a5.a7) << ", " << static_cast<int>(a5.a8) << ", "
1743 << static_cast<int>(a5.a9) << ", " << static_cast<int>(a5.a10) << ", "
1744 << static_cast<int>(a5.a11) << ", " << static_cast<int>(a5.a12) << ", "
1745 << static_cast<int>(a5.a13) << ", " << static_cast<int>(a5.a14) << ", "
1746 << static_cast<int>(a5.a15) << ", " << static_cast<int>(a5.a16) << ", "
1747 << static_cast<int>(a5.a17) << ", " << static_cast<int>(a5.a18) << "), ("
1748 << static_cast<int>(a6.a0) << ", " << static_cast<int>(a6.a1) << ", "
1749 << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3) << ", "
1750 << static_cast<int>(a6.a4) << ", " << static_cast<int>(a6.a5) << ", "
1751 << static_cast<int>(a6.a6) << ", " << static_cast<int>(a6.a7) << ", "
1752 << static_cast<int>(a6.a8) << ", " << static_cast<int>(a6.a9) << ", "
1753 << static_cast<int>(a6.a10) << ", " << static_cast<int>(a6.a11) << ", "
1754 << static_cast<int>(a6.a12) << ", " << static_cast<int>(a6.a13) << ", "
1755 << static_cast<int>(a6.a14) << ", " << static_cast<int>(a6.a15) << ", "
1756 << static_cast<int>(a6.a16) << ", " << static_cast<int>(a6.a17) << ", "
1757 << static_cast<int>(a6.a18) << "), (" << static_cast<int>(a7.a0) << ", "
1758 << static_cast<int>(a7.a1) << ", " << static_cast<int>(a7.a2) << ", "
1759 << static_cast<int>(a7.a3) << ", " << static_cast<int>(a7.a4) << ", "
1760 << static_cast<int>(a7.a5) << ", " << static_cast<int>(a7.a6) << ", "
1761 << static_cast<int>(a7.a7) << ", " << static_cast<int>(a7.a8) << ", "
1762 << static_cast<int>(a7.a9) << ", " << static_cast<int>(a7.a10) << ", "
1763 << static_cast<int>(a7.a11) << ", " << static_cast<int>(a7.a12) << ", "
1764 << static_cast<int>(a7.a13) << ", " << static_cast<int>(a7.a14) << ", "
1765 << static_cast<int>(a7.a15) << ", " << static_cast<int>(a7.a16) << ", "
1766 << static_cast<int>(a7.a17) << ", " << static_cast<int>(a7.a18) << "), ("
1767 << static_cast<int>(a8.a0) << ", " << static_cast<int>(a8.a1) << ", "
1768 << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3) << ", "
1769 << static_cast<int>(a8.a4) << ", " << static_cast<int>(a8.a5) << ", "
1770 << static_cast<int>(a8.a6) << ", " << static_cast<int>(a8.a7) << ", "
1771 << static_cast<int>(a8.a8) << ", " << static_cast<int>(a8.a9) << ", "
1772 << static_cast<int>(a8.a10) << ", " << static_cast<int>(a8.a11) << ", "
1773 << static_cast<int>(a8.a12) << ", " << static_cast<int>(a8.a13) << ", "
1774 << static_cast<int>(a8.a14) << ", " << static_cast<int>(a8.a15) << ", "
1775 << static_cast<int>(a8.a16) << ", " << static_cast<int>(a8.a17) << ", "
1776 << static_cast<int>(a8.a18) << "), (" << static_cast<int>(a9.a0) << ", "
1777 << static_cast<int>(a9.a1) << ", " << static_cast<int>(a9.a2) << ", "
1778 << static_cast<int>(a9.a3) << ", " << static_cast<int>(a9.a4) << ", "
1779 << static_cast<int>(a9.a5) << ", " << static_cast<int>(a9.a6) << ", "
1780 << static_cast<int>(a9.a7) << ", " << static_cast<int>(a9.a8) << ", "
1781 << static_cast<int>(a9.a9) << ", " << static_cast<int>(a9.a10) << ", "
1782 << static_cast<int>(a9.a11) << ", " << static_cast<int>(a9.a12) << ", "
1783 << static_cast<int>(a9.a13) << ", " << static_cast<int>(a9.a14) << ", "
1784 << static_cast<int>(a9.a15) << ", " << static_cast<int>(a9.a16) << ", "
1785 << static_cast<int>(a9.a17) << ", " << static_cast<int>(a9.a18) << "))"
1786 << "\n";
1787
1788 int64_t result = 0;
1789
1790 result += a0.a0;
1791 result += a0.a1;
1792 result += a0.a2;
1793 result += a0.a3;
1794 result += a0.a4;
1795 result += a0.a5;
1796 result += a0.a6;
1797 result += a0.a7;
1798 result += a0.a8;
1799 result += a0.a9;
1800 result += a0.a10;
1801 result += a0.a11;
1802 result += a0.a12;
1803 result += a0.a13;
1804 result += a0.a14;
1805 result += a0.a15;
1806 result += a0.a16;
1807 result += a0.a17;
1808 result += a0.a18;
1809 result += a1.a0;
1810 result += a1.a1;
1811 result += a1.a2;
1812 result += a1.a3;
1813 result += a1.a4;
1814 result += a1.a5;
1815 result += a1.a6;
1816 result += a1.a7;
1817 result += a1.a8;
1818 result += a1.a9;
1819 result += a1.a10;
1820 result += a1.a11;
1821 result += a1.a12;
1822 result += a1.a13;
1823 result += a1.a14;
1824 result += a1.a15;
1825 result += a1.a16;
1826 result += a1.a17;
1827 result += a1.a18;
1828 result += a2.a0;
1829 result += a2.a1;
1830 result += a2.a2;
1831 result += a2.a3;
1832 result += a2.a4;
1833 result += a2.a5;
1834 result += a2.a6;
1835 result += a2.a7;
1836 result += a2.a8;
1837 result += a2.a9;
1838 result += a2.a10;
1839 result += a2.a11;
1840 result += a2.a12;
1841 result += a2.a13;
1842 result += a2.a14;
1843 result += a2.a15;
1844 result += a2.a16;
1845 result += a2.a17;
1846 result += a2.a18;
1847 result += a3.a0;
1848 result += a3.a1;
1849 result += a3.a2;
1850 result += a3.a3;
1851 result += a3.a4;
1852 result += a3.a5;
1853 result += a3.a6;
1854 result += a3.a7;
1855 result += a3.a8;
1856 result += a3.a9;
1857 result += a3.a10;
1858 result += a3.a11;
1859 result += a3.a12;
1860 result += a3.a13;
1861 result += a3.a14;
1862 result += a3.a15;
1863 result += a3.a16;
1864 result += a3.a17;
1865 result += a3.a18;
1866 result += a4.a0;
1867 result += a4.a1;
1868 result += a4.a2;
1869 result += a4.a3;
1870 result += a4.a4;
1871 result += a4.a5;
1872 result += a4.a6;
1873 result += a4.a7;
1874 result += a4.a8;
1875 result += a4.a9;
1876 result += a4.a10;
1877 result += a4.a11;
1878 result += a4.a12;
1879 result += a4.a13;
1880 result += a4.a14;
1881 result += a4.a15;
1882 result += a4.a16;
1883 result += a4.a17;
1884 result += a4.a18;
1885 result += a5.a0;
1886 result += a5.a1;
1887 result += a5.a2;
1888 result += a5.a3;
1889 result += a5.a4;
1890 result += a5.a5;
1891 result += a5.a6;
1892 result += a5.a7;
1893 result += a5.a8;
1894 result += a5.a9;
1895 result += a5.a10;
1896 result += a5.a11;
1897 result += a5.a12;
1898 result += a5.a13;
1899 result += a5.a14;
1900 result += a5.a15;
1901 result += a5.a16;
1902 result += a5.a17;
1903 result += a5.a18;
1904 result += a6.a0;
1905 result += a6.a1;
1906 result += a6.a2;
1907 result += a6.a3;
1908 result += a6.a4;
1909 result += a6.a5;
1910 result += a6.a6;
1911 result += a6.a7;
1912 result += a6.a8;
1913 result += a6.a9;
1914 result += a6.a10;
1915 result += a6.a11;
1916 result += a6.a12;
1917 result += a6.a13;
1918 result += a6.a14;
1919 result += a6.a15;
1920 result += a6.a16;
1921 result += a6.a17;
1922 result += a6.a18;
1923 result += a7.a0;
1924 result += a7.a1;
1925 result += a7.a2;
1926 result += a7.a3;
1927 result += a7.a4;
1928 result += a7.a5;
1929 result += a7.a6;
1930 result += a7.a7;
1931 result += a7.a8;
1932 result += a7.a9;
1933 result += a7.a10;
1934 result += a7.a11;
1935 result += a7.a12;
1936 result += a7.a13;
1937 result += a7.a14;
1938 result += a7.a15;
1939 result += a7.a16;
1940 result += a7.a17;
1941 result += a7.a18;
1942 result += a8.a0;
1943 result += a8.a1;
1944 result += a8.a2;
1945 result += a8.a3;
1946 result += a8.a4;
1947 result += a8.a5;
1948 result += a8.a6;
1949 result += a8.a7;
1950 result += a8.a8;
1951 result += a8.a9;
1952 result += a8.a10;
1953 result += a8.a11;
1954 result += a8.a12;
1955 result += a8.a13;
1956 result += a8.a14;
1957 result += a8.a15;
1958 result += a8.a16;
1959 result += a8.a17;
1960 result += a8.a18;
1961 result += a9.a0;
1962 result += a9.a1;
1963 result += a9.a2;
1964 result += a9.a3;
1965 result += a9.a4;
1966 result += a9.a5;
1967 result += a9.a6;
1968 result += a9.a7;
1969 result += a9.a8;
1970 result += a9.a9;
1971 result += a9.a10;
1972 result += a9.a11;
1973 result += a9.a12;
1974 result += a9.a13;
1975 result += a9.a14;
1976 result += a9.a15;
1977 result += a9.a16;
1978 result += a9.a17;
1979 result += a9.a18;
1980
1981 std::cout << "result = " << result << "\n";
1982
1983 return result;
1984}
1985
1986// Used for testing structs and unions by value.
1987// Argument too big to go into integer registers on arm64.
1988// The arguments are passed as pointers to copies.
1989// The amount of arguments exhausts the number of integer registers, such that
1990// pointers to copies are also passed on the stack.
1991DART_EXPORT int32_t
2002 std::cout << "PassStruct20BytesHomogeneousInt32x10" << "((" << a0.a0 << ", "
2003 << a0.a1 << ", " << a0.a2 << ", " << a0.a3 << ", " << a0.a4
2004 << "), (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", "
2005 << a1.a3 << ", " << a1.a4 << "), (" << a2.a0 << ", " << a2.a1
2006 << ", " << a2.a2 << ", " << a2.a3 << ", " << a2.a4 << "), ("
2007 << a3.a0 << ", " << a3.a1 << ", " << a3.a2 << ", " << a3.a3 << ", "
2008 << a3.a4 << "), (" << a4.a0 << ", " << a4.a1 << ", " << a4.a2
2009 << ", " << a4.a3 << ", " << a4.a4 << "), (" << a5.a0 << ", "
2010 << a5.a1 << ", " << a5.a2 << ", " << a5.a3 << ", " << a5.a4
2011 << "), (" << a6.a0 << ", " << a6.a1 << ", " << a6.a2 << ", "
2012 << a6.a3 << ", " << a6.a4 << "), (" << a7.a0 << ", " << a7.a1
2013 << ", " << a7.a2 << ", " << a7.a3 << ", " << a7.a4 << "), ("
2014 << a8.a0 << ", " << a8.a1 << ", " << a8.a2 << ", " << a8.a3 << ", "
2015 << a8.a4 << "), (" << a9.a0 << ", " << a9.a1 << ", " << a9.a2
2016 << ", " << a9.a3 << ", " << a9.a4 << "))" << "\n";
2017
2018 int32_t result = 0;
2019
2020 result += a0.a0;
2021 result += a0.a1;
2022 result += a0.a2;
2023 result += a0.a3;
2024 result += a0.a4;
2025 result += a1.a0;
2026 result += a1.a1;
2027 result += a1.a2;
2028 result += a1.a3;
2029 result += a1.a4;
2030 result += a2.a0;
2031 result += a2.a1;
2032 result += a2.a2;
2033 result += a2.a3;
2034 result += a2.a4;
2035 result += a3.a0;
2036 result += a3.a1;
2037 result += a3.a2;
2038 result += a3.a3;
2039 result += a3.a4;
2040 result += a4.a0;
2041 result += a4.a1;
2042 result += a4.a2;
2043 result += a4.a3;
2044 result += a4.a4;
2045 result += a5.a0;
2046 result += a5.a1;
2047 result += a5.a2;
2048 result += a5.a3;
2049 result += a5.a4;
2050 result += a6.a0;
2051 result += a6.a1;
2052 result += a6.a2;
2053 result += a6.a3;
2054 result += a6.a4;
2055 result += a7.a0;
2056 result += a7.a1;
2057 result += a7.a2;
2058 result += a7.a3;
2059 result += a7.a4;
2060 result += a8.a0;
2061 result += a8.a1;
2062 result += a8.a2;
2063 result += a8.a3;
2064 result += a8.a4;
2065 result += a9.a0;
2066 result += a9.a1;
2067 result += a9.a2;
2068 result += a9.a3;
2069 result += a9.a4;
2070
2071 std::cout << "result = " << result << "\n";
2072
2073 return result;
2074}
2075
2076// Used for testing structs and unions by value.
2077// Argument too big to go into FPU registers in hardfp and arm64.
2080 std::cout << "PassStruct20BytesHomogeneousFloat" << "((" << a0.a0 << ", "
2081 << a0.a1 << ", " << a0.a2 << ", " << a0.a3 << ", " << a0.a4 << "))"
2082 << "\n";
2083
2084 float result = 0;
2085
2086 result += a0.a0;
2087 result += a0.a1;
2088 result += a0.a2;
2089 result += a0.a3;
2090 result += a0.a4;
2091
2092 std::cout << "result = " << result << "\n";
2093
2094 return result;
2095}
2096
2097// Used for testing structs and unions by value.
2098// Arguments in FPU registers on arm64.
2099// 5 struct arguments will exhaust available registers.
2106 std::cout << "PassStruct32BytesHomogeneousDoublex5" << "((" << a0.a0 << ", "
2107 << a0.a1 << ", " << a0.a2 << ", " << a0.a3 << "), (" << a1.a0
2108 << ", " << a1.a1 << ", " << a1.a2 << ", " << a1.a3 << "), ("
2109 << a2.a0 << ", " << a2.a1 << ", " << a2.a2 << ", " << a2.a3
2110 << "), (" << a3.a0 << ", " << a3.a1 << ", " << a3.a2 << ", "
2111 << a3.a3 << "), (" << a4.a0 << ", " << a4.a1 << ", " << a4.a2
2112 << ", " << a4.a3 << "))" << "\n";
2113
2114 double result = 0;
2115
2116 result += a0.a0;
2117 result += a0.a1;
2118 result += a0.a2;
2119 result += a0.a3;
2120 result += a1.a0;
2121 result += a1.a1;
2122 result += a1.a2;
2123 result += a1.a3;
2124 result += a2.a0;
2125 result += a2.a1;
2126 result += a2.a2;
2127 result += a2.a3;
2128 result += a3.a0;
2129 result += a3.a1;
2130 result += a3.a2;
2131 result += a3.a3;
2132 result += a4.a0;
2133 result += a4.a1;
2134 result += a4.a2;
2135 result += a4.a3;
2136
2137 std::cout << "result = " << result << "\n";
2138
2139 return result;
2140}
2141
2142// Used for testing structs and unions by value.
2143// Argument too big to go into FPU registers in arm64.
2146 std::cout << "PassStruct40BytesHomogeneousDouble" << "((" << a0.a0 << ", "
2147 << a0.a1 << ", " << a0.a2 << ", " << a0.a3 << ", " << a0.a4 << "))"
2148 << "\n";
2149
2150 double result = 0;
2151
2152 result += a0.a0;
2153 result += a0.a1;
2154 result += a0.a2;
2155 result += a0.a3;
2156 result += a0.a4;
2157
2158 std::cout << "result = " << result << "\n";
2159
2160 return result;
2161}
2162
2163// Used for testing structs and unions by value.
2164// Test 1kb struct.
2165DART_EXPORT uint64_t
2167 std::cout << "PassStruct1024BytesHomogeneousUint64" << "((" << a0.a0 << ", "
2168 << a0.a1 << ", " << a0.a2 << ", " << a0.a3 << ", " << a0.a4 << ", "
2169 << a0.a5 << ", " << a0.a6 << ", " << a0.a7 << ", " << a0.a8 << ", "
2170 << a0.a9 << ", " << a0.a10 << ", " << a0.a11 << ", " << a0.a12
2171 << ", " << a0.a13 << ", " << a0.a14 << ", " << a0.a15 << ", "
2172 << a0.a16 << ", " << a0.a17 << ", " << a0.a18 << ", " << a0.a19
2173 << ", " << a0.a20 << ", " << a0.a21 << ", " << a0.a22 << ", "
2174 << a0.a23 << ", " << a0.a24 << ", " << a0.a25 << ", " << a0.a26
2175 << ", " << a0.a27 << ", " << a0.a28 << ", " << a0.a29 << ", "
2176 << a0.a30 << ", " << a0.a31 << ", " << a0.a32 << ", " << a0.a33
2177 << ", " << a0.a34 << ", " << a0.a35 << ", " << a0.a36 << ", "
2178 << a0.a37 << ", " << a0.a38 << ", " << a0.a39 << ", " << a0.a40
2179 << ", " << a0.a41 << ", " << a0.a42 << ", " << a0.a43 << ", "
2180 << a0.a44 << ", " << a0.a45 << ", " << a0.a46 << ", " << a0.a47
2181 << ", " << a0.a48 << ", " << a0.a49 << ", " << a0.a50 << ", "
2182 << a0.a51 << ", " << a0.a52 << ", " << a0.a53 << ", " << a0.a54
2183 << ", " << a0.a55 << ", " << a0.a56 << ", " << a0.a57 << ", "
2184 << a0.a58 << ", " << a0.a59 << ", " << a0.a60 << ", " << a0.a61
2185 << ", " << a0.a62 << ", " << a0.a63 << ", " << a0.a64 << ", "
2186 << a0.a65 << ", " << a0.a66 << ", " << a0.a67 << ", " << a0.a68
2187 << ", " << a0.a69 << ", " << a0.a70 << ", " << a0.a71 << ", "
2188 << a0.a72 << ", " << a0.a73 << ", " << a0.a74 << ", " << a0.a75
2189 << ", " << a0.a76 << ", " << a0.a77 << ", " << a0.a78 << ", "
2190 << a0.a79 << ", " << a0.a80 << ", " << a0.a81 << ", " << a0.a82
2191 << ", " << a0.a83 << ", " << a0.a84 << ", " << a0.a85 << ", "
2192 << a0.a86 << ", " << a0.a87 << ", " << a0.a88 << ", " << a0.a89
2193 << ", " << a0.a90 << ", " << a0.a91 << ", " << a0.a92 << ", "
2194 << a0.a93 << ", " << a0.a94 << ", " << a0.a95 << ", " << a0.a96
2195 << ", " << a0.a97 << ", " << a0.a98 << ", " << a0.a99 << ", "
2196 << a0.a100 << ", " << a0.a101 << ", " << a0.a102 << ", " << a0.a103
2197 << ", " << a0.a104 << ", " << a0.a105 << ", " << a0.a106 << ", "
2198 << a0.a107 << ", " << a0.a108 << ", " << a0.a109 << ", " << a0.a110
2199 << ", " << a0.a111 << ", " << a0.a112 << ", " << a0.a113 << ", "
2200 << a0.a114 << ", " << a0.a115 << ", " << a0.a116 << ", " << a0.a117
2201 << ", " << a0.a118 << ", " << a0.a119 << ", " << a0.a120 << ", "
2202 << a0.a121 << ", " << a0.a122 << ", " << a0.a123 << ", " << a0.a124
2203 << ", " << a0.a125 << ", " << a0.a126 << ", " << a0.a127 << "))"
2204 << "\n";
2205
2206 uint64_t result = 0;
2207
2208 result += a0.a0;
2209 result += a0.a1;
2210 result += a0.a2;
2211 result += a0.a3;
2212 result += a0.a4;
2213 result += a0.a5;
2214 result += a0.a6;
2215 result += a0.a7;
2216 result += a0.a8;
2217 result += a0.a9;
2218 result += a0.a10;
2219 result += a0.a11;
2220 result += a0.a12;
2221 result += a0.a13;
2222 result += a0.a14;
2223 result += a0.a15;
2224 result += a0.a16;
2225 result += a0.a17;
2226 result += a0.a18;
2227 result += a0.a19;
2228 result += a0.a20;
2229 result += a0.a21;
2230 result += a0.a22;
2231 result += a0.a23;
2232 result += a0.a24;
2233 result += a0.a25;
2234 result += a0.a26;
2235 result += a0.a27;
2236 result += a0.a28;
2237 result += a0.a29;
2238 result += a0.a30;
2239 result += a0.a31;
2240 result += a0.a32;
2241 result += a0.a33;
2242 result += a0.a34;
2243 result += a0.a35;
2244 result += a0.a36;
2245 result += a0.a37;
2246 result += a0.a38;
2247 result += a0.a39;
2248 result += a0.a40;
2249 result += a0.a41;
2250 result += a0.a42;
2251 result += a0.a43;
2252 result += a0.a44;
2253 result += a0.a45;
2254 result += a0.a46;
2255 result += a0.a47;
2256 result += a0.a48;
2257 result += a0.a49;
2258 result += a0.a50;
2259 result += a0.a51;
2260 result += a0.a52;
2261 result += a0.a53;
2262 result += a0.a54;
2263 result += a0.a55;
2264 result += a0.a56;
2265 result += a0.a57;
2266 result += a0.a58;
2267 result += a0.a59;
2268 result += a0.a60;
2269 result += a0.a61;
2270 result += a0.a62;
2271 result += a0.a63;
2272 result += a0.a64;
2273 result += a0.a65;
2274 result += a0.a66;
2275 result += a0.a67;
2276 result += a0.a68;
2277 result += a0.a69;
2278 result += a0.a70;
2279 result += a0.a71;
2280 result += a0.a72;
2281 result += a0.a73;
2282 result += a0.a74;
2283 result += a0.a75;
2284 result += a0.a76;
2285 result += a0.a77;
2286 result += a0.a78;
2287 result += a0.a79;
2288 result += a0.a80;
2289 result += a0.a81;
2290 result += a0.a82;
2291 result += a0.a83;
2292 result += a0.a84;
2293 result += a0.a85;
2294 result += a0.a86;
2295 result += a0.a87;
2296 result += a0.a88;
2297 result += a0.a89;
2298 result += a0.a90;
2299 result += a0.a91;
2300 result += a0.a92;
2301 result += a0.a93;
2302 result += a0.a94;
2303 result += a0.a95;
2304 result += a0.a96;
2305 result += a0.a97;
2306 result += a0.a98;
2307 result += a0.a99;
2308 result += a0.a100;
2309 result += a0.a101;
2310 result += a0.a102;
2311 result += a0.a103;
2312 result += a0.a104;
2313 result += a0.a105;
2314 result += a0.a106;
2315 result += a0.a107;
2316 result += a0.a108;
2317 result += a0.a109;
2318 result += a0.a110;
2319 result += a0.a111;
2320 result += a0.a112;
2321 result += a0.a113;
2322 result += a0.a114;
2323 result += a0.a115;
2324 result += a0.a116;
2325 result += a0.a117;
2326 result += a0.a118;
2327 result += a0.a119;
2328 result += a0.a120;
2329 result += a0.a121;
2330 result += a0.a122;
2331 result += a0.a123;
2332 result += a0.a124;
2333 result += a0.a125;
2334 result += a0.a126;
2335 result += a0.a127;
2336
2337 std::cout << "result = " << result << "\n";
2338
2339 return result;
2340}
2341
2342// Used for testing structs and unions by value.
2343// Tests the alignment of structs in FPU registers and backfilling.
2345 float a0,
2347 float a2,
2349 float a4,
2351 float a6,
2353 float a8) {
2354 std::cout << "PassFloatStruct16BytesHomogeneousFloatFloatStruct1" << "(" << a0
2355 << ", (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", " << a1.a3
2356 << "), " << a2 << ", (" << a3.a0 << ", " << a3.a1 << ", " << a3.a2
2357 << ", " << a3.a3 << "), " << a4 << ", (" << a5.a0 << ", " << a5.a1
2358 << ", " << a5.a2 << ", " << a5.a3 << "), " << a6 << ", (" << a7.a0
2359 << ", " << a7.a1 << ", " << a7.a2 << ", " << a7.a3 << "), " << a8
2360 << ")" << "\n";
2361
2362 float result = 0;
2363
2364 result += a0;
2365 result += a1.a0;
2366 result += a1.a1;
2367 result += a1.a2;
2368 result += a1.a3;
2369 result += a2;
2370 result += a3.a0;
2371 result += a3.a1;
2372 result += a3.a2;
2373 result += a3.a3;
2374 result += a4;
2375 result += a5.a0;
2376 result += a5.a1;
2377 result += a5.a2;
2378 result += a5.a3;
2379 result += a6;
2380 result += a7.a0;
2381 result += a7.a1;
2382 result += a7.a2;
2383 result += a7.a3;
2384 result += a8;
2385
2386 std::cout << "result = " << result << "\n";
2387
2388 return result;
2389}
2390
2391// Used for testing structs and unions by value.
2392// Tests the alignment of structs in FPU registers and backfilling.
2394 float a0,
2396 float a2,
2398 float a4,
2400 float a6,
2402 float a8) {
2403 std::cout << "PassFloatStruct32BytesHomogeneousDoubleFloatStruct" << "(" << a0
2404 << ", (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", " << a1.a3
2405 << "), " << a2 << ", (" << a3.a0 << ", " << a3.a1 << ", " << a3.a2
2406 << ", " << a3.a3 << "), " << a4 << ", (" << a5.a0 << ", " << a5.a1
2407 << ", " << a5.a2 << ", " << a5.a3 << "), " << a6 << ", (" << a7.a0
2408 << ", " << a7.a1 << ", " << a7.a2 << ", " << a7.a3 << "), " << a8
2409 << ")" << "\n";
2410
2411 double result = 0;
2412
2413 result += a0;
2414 result += a1.a0;
2415 result += a1.a1;
2416 result += a1.a2;
2417 result += a1.a3;
2418 result += a2;
2419 result += a3.a0;
2420 result += a3.a1;
2421 result += a3.a2;
2422 result += a3.a3;
2423 result += a4;
2424 result += a5.a0;
2425 result += a5.a1;
2426 result += a5.a2;
2427 result += a5.a3;
2428 result += a6;
2429 result += a7.a0;
2430 result += a7.a1;
2431 result += a7.a2;
2432 result += a7.a3;
2433 result += a8;
2434
2435 std::cout << "result = " << result << "\n";
2436
2437 return result;
2438}
2439
2440// Used for testing structs and unions by value.
2441// Tests the alignment of structs in integers registers and on the stack.
2442// Arm32 aligns this struct at 8.
2443// Also, arm32 allocates the second struct partially in registers, partially
2444// on stack.
2445// Test backfilling of integer registers.
2447 int8_t a0,
2449 int8_t a2,
2451 int8_t a4,
2453 int8_t a6,
2455 int8_t a8) {
2456 std::cout << "PassInt8Struct16BytesMixedInt8Struct16BytesMixedIn" << "("
2457 << static_cast<int>(a0) << ", (" << a1.a0 << ", " << a1.a1 << "), "
2458 << static_cast<int>(a2) << ", (" << a3.a0 << ", " << a3.a1 << "), "
2459 << static_cast<int>(a4) << ", (" << a5.a0 << ", " << a5.a1 << "), "
2460 << static_cast<int>(a6) << ", (" << a7.a0 << ", " << a7.a1 << "), "
2461 << static_cast<int>(a8) << ")" << "\n";
2462
2463 double result = 0;
2464
2465 result += a0;
2466 result += a1.a0;
2467 result += a1.a1;
2468 result += a2;
2469 result += a3.a0;
2470 result += a3.a1;
2471 result += a4;
2472 result += a5.a0;
2473 result += a5.a1;
2474 result += a6;
2475 result += a7.a0;
2476 result += a7.a1;
2477 result += a8;
2478
2479 std::cout << "result = " << result << "\n";
2480
2481 return result;
2482}
2483
2484// Used for testing structs and unions by value.
2485// On Linux x64, it will exhaust xmm registers first, after 6 doubles and 2
2486// structs. The rest of the structs will go on the stack.
2487// The int will be backfilled into the int register.
2489 double a1,
2490 double a2,
2491 double a3,
2492 double a4,
2493 double a5,
2498 int32_t a10) {
2499 std::cout << "PassDoublex6Struct16BytesMixedx4Int32" << "(" << a0 << ", "
2500 << a1 << ", " << a2 << ", " << a3 << ", " << a4 << ", " << a5
2501 << ", (" << a6.a0 << ", " << a6.a1 << "), (" << a7.a0 << ", "
2502 << a7.a1 << "), (" << a8.a0 << ", " << a8.a1 << "), (" << a9.a0
2503 << ", " << a9.a1 << "), " << a10 << ")" << "\n";
2504
2505 double result = 0;
2506
2507 result += a0;
2508 result += a1;
2509 result += a2;
2510 result += a3;
2511 result += a4;
2512 result += a5;
2513 result += a6.a0;
2514 result += a6.a1;
2515 result += a7.a0;
2516 result += a7.a1;
2517 result += a8.a0;
2518 result += a8.a1;
2519 result += a9.a0;
2520 result += a9.a1;
2521 result += a10;
2522
2523 std::cout << "result = " << result << "\n";
2524
2525 return result;
2526}
2527
2528// Used for testing structs and unions by value.
2529// On Linux x64, it will exhaust int registers first.
2530// The rest of the structs will go on the stack.
2531// The double will be backfilled into the xmm register.
2533 int32_t a1,
2534 int32_t a2,
2535 int32_t a3,
2540 double a8) {
2541 std::cout << "PassInt32x4Struct16BytesMixedx4Double" << "(" << a0 << ", "
2542 << a1 << ", " << a2 << ", " << a3 << ", (" << a4.a0 << ", " << a4.a1
2543 << "), (" << a5.a0 << ", " << a5.a1 << "), (" << a6.a0 << ", "
2544 << a6.a1 << "), (" << a7.a0 << ", " << a7.a1 << "), " << a8 << ")"
2545 << "\n";
2546
2547 double result = 0;
2548
2549 result += a0;
2550 result += a1;
2551 result += a2;
2552 result += a3;
2553 result += a4.a0;
2554 result += a4.a1;
2555 result += a5.a0;
2556 result += a5.a1;
2557 result += a6.a0;
2558 result += a6.a1;
2559 result += a7.a0;
2560 result += a7.a1;
2561 result += a8;
2562
2563 std::cout << "result = " << result << "\n";
2564
2565 return result;
2566}
2567
2568// Used for testing structs and unions by value.
2569// On various architectures, first struct is allocated on stack.
2570// Check that the other two arguments are allocated on registers.
2575 std::cout << "PassStruct40BytesHomogeneousDoubleStruct4BytesHomo" << "(("
2576 << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3 << ", "
2577 << a0.a4 << "), (" << a1.a0 << ", " << a1.a1 << "), (" << a2.a0
2578 << ", " << a2.a1 << "))" << "\n";
2579
2580 double result = 0;
2581
2582 result += a0.a0;
2583 result += a0.a1;
2584 result += a0.a2;
2585 result += a0.a3;
2586 result += a0.a4;
2587 result += a1.a0;
2588 result += a1.a1;
2589 result += a2.a0;
2590 result += a2.a1;
2591
2592 std::cout << "result = " << result << "\n";
2593
2594 return result;
2595}
2596
2597// Used for testing structs and unions by value.
2598// Test alignment and padding of 16 byte int within struct.
2600 int32_t a0,
2601 int32_t a1,
2602 int32_t a2,
2603 int32_t a3,
2604 int32_t a4,
2605 int32_t a5,
2606 int32_t a6,
2607 int32_t a7,
2608 double a8,
2609 double a9,
2610 double a10,
2611 double a11,
2612 double a12,
2613 double a13,
2614 double a14,
2615 double a15,
2616 int64_t a16,
2617 int8_t a17,
2618 Struct1ByteInt a18,
2619 int64_t a19,
2620 int8_t a20,
2622 int64_t a22,
2623 int8_t a23,
2624 Struct8BytesInt a24,
2625 int64_t a25,
2626 int8_t a26,
2628 int64_t a28,
2629 int8_t a29,
2631 int64_t a31,
2632 int8_t a32,
2634 int64_t a34,
2635 int8_t a35,
2637 int64_t a37,
2638 int8_t a38,
2640 std::cout << "PassInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int" << "(" << a0
2641 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4 << ", "
2642 << a5 << ", " << a6 << ", " << a7 << ", " << a8 << ", " << a9
2643 << ", " << a10 << ", " << a11 << ", " << a12 << ", " << a13 << ", "
2644 << a14 << ", " << a15 << ", " << a16 << ", "
2645 << static_cast<int>(a17) << ", (" << static_cast<int>(a18.a0)
2646 << "), " << a19 << ", " << static_cast<int>(a20) << ", (" << a21.a0
2647 << ", " << a21.a1 << "), " << a22 << ", " << static_cast<int>(a23)
2648 << ", (" << a24.a0 << ", " << a24.a1 << ", " << a24.a2 << "), "
2649 << a25 << ", " << static_cast<int>(a26) << ", (" << a27.a0 << ", "
2650 << a27.a1 << "), " << a28 << ", " << static_cast<int>(a29) << ", ("
2651 << a30.a0 << ", " << a30.a1 << ", " << a30.a2 << "), " << a31
2652 << ", " << static_cast<int>(a32) << ", ("
2653 << static_cast<int>(a33.a0) << ", " << a33.a1 << ", "
2654 << static_cast<int>(a33.a2) << "), " << a34 << ", "
2655 << static_cast<int>(a35) << ", (" << static_cast<int>(a36.a0)
2656 << ", " << a36.a1 << ", " << static_cast<int>(a36.a2) << "), "
2657 << a37 << ", " << static_cast<int>(a38) << ", ("
2658 << static_cast<int>(a39.a0) << ", " << a39.a1 << ", "
2659 << static_cast<int>(a39.a2) << "))" << "\n";
2660
2661 double result = 0;
2662
2663 result += a0;
2664 result += a1;
2665 result += a2;
2666 result += a3;
2667 result += a4;
2668 result += a5;
2669 result += a6;
2670 result += a7;
2671 result += a8;
2672 result += a9;
2673 result += a10;
2674 result += a11;
2675 result += a12;
2676 result += a13;
2677 result += a14;
2678 result += a15;
2679 result += a16;
2680 result += a17;
2681 result += a18.a0;
2682 result += a19;
2683 result += a20;
2684 result += a21.a0;
2685 result += a21.a1;
2686 result += a22;
2687 result += a23;
2688 result += a24.a0;
2689 result += a24.a1;
2690 result += a24.a2;
2691 result += a25;
2692 result += a26;
2693 result += a27.a0;
2694 result += a27.a1;
2695 result += a28;
2696 result += a29;
2697 result += a30.a0;
2698 result += a30.a1;
2699 result += a30.a2;
2700 result += a31;
2701 result += a32;
2702 result += a33.a0;
2703 result += a33.a1;
2704 result += a33.a2;
2705 result += a34;
2706 result += a35;
2707 result += a36.a0;
2708 result += a36.a1;
2709 result += a36.a2;
2710 result += a37;
2711 result += a38;
2712 result += a39.a0;
2713 result += a39.a1;
2714 result += a39.a2;
2715
2716 std::cout << "result = " << result << "\n";
2717
2718 return result;
2719}
2720
2721// Used for testing structs and unions by value.
2722// Test alignment and padding of 16 byte int within struct.
2724 std::cout << "PassStructAlignmentInt16" << "((" << static_cast<int>(a0.a0)
2725 << ", " << a0.a1 << ", " << static_cast<int>(a0.a2) << "))" << "\n";
2726
2727 int64_t result = 0;
2728
2729 result += a0.a0;
2730 result += a0.a1;
2731 result += a0.a2;
2732
2733 std::cout << "result = " << result << "\n";
2734
2735 return result;
2736}
2737
2738// Used for testing structs and unions by value.
2739// Test alignment and padding of 32 byte int within struct.
2741 std::cout << "PassStructAlignmentInt32" << "((" << static_cast<int>(a0.a0)
2742 << ", " << a0.a1 << ", " << static_cast<int>(a0.a2) << "))" << "\n";
2743
2744 int64_t result = 0;
2745
2746 result += a0.a0;
2747 result += a0.a1;
2748 result += a0.a2;
2749
2750 std::cout << "result = " << result << "\n";
2751
2752 return result;
2753}
2754
2755// Used for testing structs and unions by value.
2756// Test alignment and padding of 64 byte int within struct.
2758 std::cout << "PassStructAlignmentInt64" << "((" << static_cast<int>(a0.a0)
2759 << ", " << a0.a1 << ", " << static_cast<int>(a0.a2) << "))" << "\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// Simple nested struct. No alignment gaps on any architectures.
2774// 10 arguments exhaust registers on all platforms.
2785 std::cout << "PassStruct8BytesNestedIntx10" << "(((" << a0.a0.a0 << ", "
2786 << a0.a0.a1 << "), (" << a0.a1.a0 << ", " << a0.a1.a1 << ")), (("
2787 << a1.a0.a0 << ", " << a1.a0.a1 << "), (" << a1.a1.a0 << ", "
2788 << a1.a1.a1 << ")), ((" << a2.a0.a0 << ", " << a2.a0.a1 << "), ("
2789 << a2.a1.a0 << ", " << a2.a1.a1 << ")), ((" << a3.a0.a0 << ", "
2790 << a3.a0.a1 << "), (" << a3.a1.a0 << ", " << a3.a1.a1 << ")), (("
2791 << a4.a0.a0 << ", " << a4.a0.a1 << "), (" << a4.a1.a0 << ", "
2792 << a4.a1.a1 << ")), ((" << a5.a0.a0 << ", " << a5.a0.a1 << "), ("
2793 << a5.a1.a0 << ", " << a5.a1.a1 << ")), ((" << a6.a0.a0 << ", "
2794 << a6.a0.a1 << "), (" << a6.a1.a0 << ", " << a6.a1.a1 << ")), (("
2795 << a7.a0.a0 << ", " << a7.a0.a1 << "), (" << a7.a1.a0 << ", "
2796 << a7.a1.a1 << ")), ((" << a8.a0.a0 << ", " << a8.a0.a1 << "), ("
2797 << a8.a1.a0 << ", " << a8.a1.a1 << ")), ((" << a9.a0.a0 << ", "
2798 << a9.a0.a1 << "), (" << a9.a1.a0 << ", " << a9.a1.a1 << ")))"
2799 << "\n";
2800
2801 int64_t result = 0;
2802
2803 result += a0.a0.a0;
2804 result += a0.a0.a1;
2805 result += a0.a1.a0;
2806 result += a0.a1.a1;
2807 result += a1.a0.a0;
2808 result += a1.a0.a1;
2809 result += a1.a1.a0;
2810 result += a1.a1.a1;
2811 result += a2.a0.a0;
2812 result += a2.a0.a1;
2813 result += a2.a1.a0;
2814 result += a2.a1.a1;
2815 result += a3.a0.a0;
2816 result += a3.a0.a1;
2817 result += a3.a1.a0;
2818 result += a3.a1.a1;
2819 result += a4.a0.a0;
2820 result += a4.a0.a1;
2821 result += a4.a1.a0;
2822 result += a4.a1.a1;
2823 result += a5.a0.a0;
2824 result += a5.a0.a1;
2825 result += a5.a1.a0;
2826 result += a5.a1.a1;
2827 result += a6.a0.a0;
2828 result += a6.a0.a1;
2829 result += a6.a1.a0;
2830 result += a6.a1.a1;
2831 result += a7.a0.a0;
2832 result += a7.a0.a1;
2833 result += a7.a1.a0;
2834 result += a7.a1.a1;
2835 result += a8.a0.a0;
2836 result += a8.a0.a1;
2837 result += a8.a1.a0;
2838 result += a8.a1.a1;
2839 result += a9.a0.a0;
2840 result += a9.a0.a1;
2841 result += a9.a1.a0;
2842 result += a9.a1.a1;
2843
2844 std::cout << "result = " << result << "\n";
2845
2846 return result;
2847}
2848
2849// Used for testing structs and unions by value.
2850// Simple nested struct. No alignment gaps on any architectures.
2851// 10 arguments exhaust fpu registers on all platforms.
2862 std::cout << "PassStruct8BytesNestedFloatx10" << "(((" << a0.a0.a0 << "), ("
2863 << a0.a1.a0 << ")), ((" << a1.a0.a0 << "), (" << a1.a1.a0
2864 << ")), ((" << a2.a0.a0 << "), (" << a2.a1.a0 << ")), (("
2865 << a3.a0.a0 << "), (" << a3.a1.a0 << ")), ((" << a4.a0.a0 << "), ("
2866 << a4.a1.a0 << ")), ((" << a5.a0.a0 << "), (" << a5.a1.a0
2867 << ")), ((" << a6.a0.a0 << "), (" << a6.a1.a0 << ")), (("
2868 << a7.a0.a0 << "), (" << a7.a1.a0 << ")), ((" << a8.a0.a0 << "), ("
2869 << a8.a1.a0 << ")), ((" << a9.a0.a0 << "), (" << a9.a1.a0 << ")))"
2870 << "\n";
2871
2872 float result = 0;
2873
2874 result += a0.a0.a0;
2875 result += a0.a1.a0;
2876 result += a1.a0.a0;
2877 result += a1.a1.a0;
2878 result += a2.a0.a0;
2879 result += a2.a1.a0;
2880 result += a3.a0.a0;
2881 result += a3.a1.a0;
2882 result += a4.a0.a0;
2883 result += a4.a1.a0;
2884 result += a5.a0.a0;
2885 result += a5.a1.a0;
2886 result += a6.a0.a0;
2887 result += a6.a1.a0;
2888 result += a7.a0.a0;
2889 result += a7.a1.a0;
2890 result += a8.a0.a0;
2891 result += a8.a1.a0;
2892 result += a9.a0.a0;
2893 result += a9.a1.a0;
2894
2895 std::cout << "result = " << result << "\n";
2896
2897 return result;
2898}
2899
2900// Used for testing structs and unions by value.
2901// Simple nested struct. No alignment gaps on any architectures.
2902// 10 arguments exhaust fpu registers on all platforms.
2903// The nesting is irregular, testing homogenous float rules on arm and arm64,
2904// and the fpu register usage on x64.
2915 std::cout << "PassStruct8BytesNestedFloat2x10" << "(((" << a0.a0.a0 << "), "
2916 << a0.a1 << "), ((" << a1.a0.a0 << "), " << a1.a1 << "), (("
2917 << a2.a0.a0 << "), " << a2.a1 << "), ((" << a3.a0.a0 << "), "
2918 << a3.a1 << "), ((" << a4.a0.a0 << "), " << a4.a1 << "), (("
2919 << a5.a0.a0 << "), " << a5.a1 << "), ((" << a6.a0.a0 << "), "
2920 << a6.a1 << "), ((" << a7.a0.a0 << "), " << a7.a1 << "), (("
2921 << a8.a0.a0 << "), " << a8.a1 << "), ((" << a9.a0.a0 << "), "
2922 << a9.a1 << "))" << "\n";
2923
2924 float result = 0;
2925
2926 result += a0.a0.a0;
2927 result += a0.a1;
2928 result += a1.a0.a0;
2929 result += a1.a1;
2930 result += a2.a0.a0;
2931 result += a2.a1;
2932 result += a3.a0.a0;
2933 result += a3.a1;
2934 result += a4.a0.a0;
2935 result += a4.a1;
2936 result += a5.a0.a0;
2937 result += a5.a1;
2938 result += a6.a0.a0;
2939 result += a6.a1;
2940 result += a7.a0.a0;
2941 result += a7.a1;
2942 result += a8.a0.a0;
2943 result += a8.a1;
2944 result += a9.a0.a0;
2945 result += a9.a1;
2946
2947 std::cout << "result = " << result << "\n";
2948
2949 return result;
2950}
2951
2952// Used for testing structs and unions by value.
2953// Simple nested struct. No alignment gaps on any architectures.
2954// 10 arguments exhaust all registers on all platforms.
2965 std::cout << "PassStruct8BytesNestedMixedx10" << "(((" << a0.a0.a0 << ", "
2966 << a0.a0.a1 << "), (" << a0.a1.a0 << ")), ((" << a1.a0.a0 << ", "
2967 << a1.a0.a1 << "), (" << a1.a1.a0 << ")), ((" << a2.a0.a0 << ", "
2968 << a2.a0.a1 << "), (" << a2.a1.a0 << ")), ((" << a3.a0.a0 << ", "
2969 << a3.a0.a1 << "), (" << a3.a1.a0 << ")), ((" << a4.a0.a0 << ", "
2970 << a4.a0.a1 << "), (" << a4.a1.a0 << ")), ((" << a5.a0.a0 << ", "
2971 << a5.a0.a1 << "), (" << a5.a1.a0 << ")), ((" << a6.a0.a0 << ", "
2972 << a6.a0.a1 << "), (" << a6.a1.a0 << ")), ((" << a7.a0.a0 << ", "
2973 << a7.a0.a1 << "), (" << a7.a1.a0 << ")), ((" << a8.a0.a0 << ", "
2974 << a8.a0.a1 << "), (" << a8.a1.a0 << ")), ((" << a9.a0.a0 << ", "
2975 << a9.a0.a1 << "), (" << a9.a1.a0 << ")))" << "\n";
2976
2977 double result = 0;
2978
2979 result += a0.a0.a0;
2980 result += a0.a0.a1;
2981 result += a0.a1.a0;
2982 result += a1.a0.a0;
2983 result += a1.a0.a1;
2984 result += a1.a1.a0;
2985 result += a2.a0.a0;
2986 result += a2.a0.a1;
2987 result += a2.a1.a0;
2988 result += a3.a0.a0;
2989 result += a3.a0.a1;
2990 result += a3.a1.a0;
2991 result += a4.a0.a0;
2992 result += a4.a0.a1;
2993 result += a4.a1.a0;
2994 result += a5.a0.a0;
2995 result += a5.a0.a1;
2996 result += a5.a1.a0;
2997 result += a6.a0.a0;
2998 result += a6.a0.a1;
2999 result += a6.a1.a0;
3000 result += a7.a0.a0;
3001 result += a7.a0.a1;
3002 result += a7.a1.a0;
3003 result += a8.a0.a0;
3004 result += a8.a0.a1;
3005 result += a8.a1.a0;
3006 result += a9.a0.a0;
3007 result += a9.a0.a1;
3008 result += a9.a1.a0;
3009
3010 std::cout << "result = " << result << "\n";
3011
3012 return result;
3013}
3014
3015// Used for testing structs and unions by value.
3016// Deeper nested struct to test recursive member access.
3019 std::cout << "PassStruct16BytesNestedIntx2" << "((((" << a0.a0.a0.a0 << ", "
3020 << a0.a0.a0.a1 << "), (" << a0.a0.a1.a0 << ", " << a0.a0.a1.a1
3021 << ")), ((" << a0.a1.a0.a0 << ", " << a0.a1.a0.a1 << "), ("
3022 << a0.a1.a1.a0 << ", " << a0.a1.a1.a1 << "))), (((" << a1.a0.a0.a0
3023 << ", " << a1.a0.a0.a1 << "), (" << a1.a0.a1.a0 << ", "
3024 << a1.a0.a1.a1 << ")), ((" << a1.a1.a0.a0 << ", " << a1.a1.a0.a1
3025 << "), (" << a1.a1.a1.a0 << ", " << a1.a1.a1.a1 << "))))" << "\n";
3026
3027 int64_t result = 0;
3028
3029 result += a0.a0.a0.a0;
3030 result += a0.a0.a0.a1;
3031 result += a0.a0.a1.a0;
3032 result += a0.a0.a1.a1;
3033 result += a0.a1.a0.a0;
3034 result += a0.a1.a0.a1;
3035 result += a0.a1.a1.a0;
3036 result += a0.a1.a1.a1;
3037 result += a1.a0.a0.a0;
3038 result += a1.a0.a0.a1;
3039 result += a1.a0.a1.a0;
3040 result += a1.a0.a1.a1;
3041 result += a1.a1.a0.a0;
3042 result += a1.a1.a0.a1;
3043 result += a1.a1.a1.a0;
3044 result += a1.a1.a1.a1;
3045
3046 std::cout << "result = " << result << "\n";
3047
3048 return result;
3049}
3050
3051// Used for testing structs and unions by value.
3052// Even deeper nested struct to test recursive member access.
3055 std::cout << "PassStruct32BytesNestedIntx2" << "(((((" << a0.a0.a0.a0.a0
3056 << ", " << a0.a0.a0.a0.a1 << "), (" << a0.a0.a0.a1.a0 << ", "
3057 << a0.a0.a0.a1.a1 << ")), ((" << a0.a0.a1.a0.a0 << ", "
3058 << a0.a0.a1.a0.a1 << "), (" << a0.a0.a1.a1.a0 << ", "
3059 << a0.a0.a1.a1.a1 << "))), (((" << a0.a1.a0.a0.a0 << ", "
3060 << a0.a1.a0.a0.a1 << "), (" << a0.a1.a0.a1.a0 << ", "
3061 << a0.a1.a0.a1.a1 << ")), ((" << a0.a1.a1.a0.a0 << ", "
3062 << a0.a1.a1.a0.a1 << "), (" << a0.a1.a1.a1.a0 << ", "
3063 << a0.a1.a1.a1.a1 << ")))), ((((" << a1.a0.a0.a0.a0 << ", "
3064 << a1.a0.a0.a0.a1 << "), (" << a1.a0.a0.a1.a0 << ", "
3065 << a1.a0.a0.a1.a1 << ")), ((" << a1.a0.a1.a0.a0 << ", "
3066 << a1.a0.a1.a0.a1 << "), (" << a1.a0.a1.a1.a0 << ", "
3067 << a1.a0.a1.a1.a1 << "))), (((" << a1.a1.a0.a0.a0 << ", "
3068 << a1.a1.a0.a0.a1 << "), (" << a1.a1.a0.a1.a0 << ", "
3069 << a1.a1.a0.a1.a1 << ")), ((" << a1.a1.a1.a0.a0 << ", "
3070 << a1.a1.a1.a0.a1 << "), (" << a1.a1.a1.a1.a0 << ", "
3071 << a1.a1.a1.a1.a1 << ")))))" << "\n";
3072
3073 int64_t result = 0;
3074
3075 result += a0.a0.a0.a0.a0;
3076 result += a0.a0.a0.a0.a1;
3077 result += a0.a0.a0.a1.a0;
3078 result += a0.a0.a0.a1.a1;
3079 result += a0.a0.a1.a0.a0;
3080 result += a0.a0.a1.a0.a1;
3081 result += a0.a0.a1.a1.a0;
3082 result += a0.a0.a1.a1.a1;
3083 result += a0.a1.a0.a0.a0;
3084 result += a0.a1.a0.a0.a1;
3085 result += a0.a1.a0.a1.a0;
3086 result += a0.a1.a0.a1.a1;
3087 result += a0.a1.a1.a0.a0;
3088 result += a0.a1.a1.a0.a1;
3089 result += a0.a1.a1.a1.a0;
3090 result += a0.a1.a1.a1.a1;
3091 result += a1.a0.a0.a0.a0;
3092 result += a1.a0.a0.a0.a1;
3093 result += a1.a0.a0.a1.a0;
3094 result += a1.a0.a0.a1.a1;
3095 result += a1.a0.a1.a0.a0;
3096 result += a1.a0.a1.a0.a1;
3097 result += a1.a0.a1.a1.a0;
3098 result += a1.a0.a1.a1.a1;
3099 result += a1.a1.a0.a0.a0;
3100 result += a1.a1.a0.a0.a1;
3101 result += a1.a1.a0.a1.a0;
3102 result += a1.a1.a0.a1.a1;
3103 result += a1.a1.a1.a0.a0;
3104 result += a1.a1.a1.a0.a1;
3105 result += a1.a1.a1.a1.a0;
3106 result += a1.a1.a1.a1.a1;
3107
3108 std::cout << "result = " << result << "\n";
3109
3110 return result;
3111}
3112
3113// Used for testing structs and unions by value.
3114// Test alignment and padding of nested struct with 16 byte int.
3117 std::cout << "PassStructNestedIntStructAlignmentInt16" << "((("
3118 << static_cast<int>(a0.a0.a0) << ", " << a0.a0.a1 << ", "
3119 << static_cast<int>(a0.a0.a2) << "), ("
3120 << static_cast<int>(a0.a1.a0) << ", " << a0.a1.a1 << ", "
3121 << static_cast<int>(a0.a1.a2) << ")))" << "\n";
3122
3123 int64_t result = 0;
3124
3125 result += a0.a0.a0;
3126 result += a0.a0.a1;
3127 result += a0.a0.a2;
3128 result += a0.a1.a0;
3129 result += a0.a1.a1;
3130 result += a0.a1.a2;
3131
3132 std::cout << "result = " << result << "\n";
3133
3134 return result;
3135}
3136
3137// Used for testing structs and unions by value.
3138// Test alignment and padding of nested struct with 32 byte int.
3141 std::cout << "PassStructNestedIntStructAlignmentInt32" << "((("
3142 << static_cast<int>(a0.a0.a0) << ", " << a0.a0.a1 << ", "
3143 << static_cast<int>(a0.a0.a2) << "), ("
3144 << static_cast<int>(a0.a1.a0) << ", " << a0.a1.a1 << ", "
3145 << static_cast<int>(a0.a1.a2) << ")))" << "\n";
3146
3147 int64_t result = 0;
3148
3149 result += a0.a0.a0;
3150 result += a0.a0.a1;
3151 result += a0.a0.a2;
3152 result += a0.a1.a0;
3153 result += a0.a1.a1;
3154 result += a0.a1.a2;
3155
3156 std::cout << "result = " << result << "\n";
3157
3158 return result;
3159}
3160
3161// Used for testing structs and unions by value.
3162// Test alignment and padding of nested struct with 64 byte int.
3165 std::cout << "PassStructNestedIntStructAlignmentInt64" << "((("
3166 << static_cast<int>(a0.a0.a0) << ", " << a0.a0.a1 << ", "
3167 << static_cast<int>(a0.a0.a2) << "), ("
3168 << static_cast<int>(a0.a1.a0) << ", " << a0.a1.a1 << ", "
3169 << static_cast<int>(a0.a1.a2) << ")))" << "\n";
3170
3171 int64_t result = 0;
3172
3173 result += a0.a0.a0;
3174 result += a0.a0.a1;
3175 result += a0.a0.a2;
3176 result += a0.a1.a0;
3177 result += a0.a1.a1;
3178 result += a0.a1.a2;
3179
3180 std::cout << "result = " << result << "\n";
3181
3182 return result;
3183}
3184
3185// Used for testing structs and unions by value.
3186// Return big irregular struct as smoke test.
3192 std::cout
3193 << "PassStructNestedIrregularEvenBiggerx4" << "((" << a0.a0 << ", (("
3194 << a0.a1.a0.a0 << ", ((" << a0.a1.a0.a1.a0.a0 << ", " << a0.a1.a0.a1.a0.a1
3195 << "), (" << a0.a1.a0.a1.a1.a0 << ")), " << a0.a1.a0.a2 << ", (("
3196 << a0.a1.a0.a3.a0.a0 << "), " << a0.a1.a0.a3.a1 << "), " << a0.a1.a0.a4
3197 << ", ((" << a0.a1.a0.a5.a0.a0 << "), (" << a0.a1.a0.a5.a1.a0 << ")), "
3198 << a0.a1.a0.a6 << "), ((" << a0.a1.a1.a0.a0 << ", " << a0.a1.a1.a0.a1
3199 << "), (" << a0.a1.a1.a1.a0 << ")), " << a0.a1.a2 << ", " << a0.a1.a3
3200 << "), ((" << a0.a2.a0.a0 << ", ((" << a0.a2.a0.a1.a0.a0 << ", "
3201 << a0.a2.a0.a1.a0.a1 << "), (" << a0.a2.a0.a1.a1.a0 << ")), "
3202 << a0.a2.a0.a2 << ", ((" << a0.a2.a0.a3.a0.a0 << "), " << a0.a2.a0.a3.a1
3203 << "), " << a0.a2.a0.a4 << ", ((" << a0.a2.a0.a5.a0.a0 << "), ("
3204 << a0.a2.a0.a5.a1.a0 << ")), " << a0.a2.a0.a6 << "), ((" << a0.a2.a1.a0.a0
3205 << ", " << a0.a2.a1.a0.a1 << "), (" << a0.a2.a1.a1.a0 << ")), "
3206 << a0.a2.a2 << ", " << a0.a2.a3 << "), " << a0.a3 << "), (" << a1.a0
3207 << ", ((" << a1.a1.a0.a0 << ", ((" << a1.a1.a0.a1.a0.a0 << ", "
3208 << a1.a1.a0.a1.a0.a1 << "), (" << a1.a1.a0.a1.a1.a0 << ")), "
3209 << a1.a1.a0.a2 << ", ((" << a1.a1.a0.a3.a0.a0 << "), " << a1.a1.a0.a3.a1
3210 << "), " << a1.a1.a0.a4 << ", ((" << a1.a1.a0.a5.a0.a0 << "), ("
3211 << a1.a1.a0.a5.a1.a0 << ")), " << a1.a1.a0.a6 << "), ((" << a1.a1.a1.a0.a0
3212 << ", " << a1.a1.a1.a0.a1 << "), (" << a1.a1.a1.a1.a0 << ")), "
3213 << a1.a1.a2 << ", " << a1.a1.a3 << "), ((" << a1.a2.a0.a0 << ", (("
3214 << a1.a2.a0.a1.a0.a0 << ", " << a1.a2.a0.a1.a0.a1 << "), ("
3215 << a1.a2.a0.a1.a1.a0 << ")), " << a1.a2.a0.a2 << ", (("
3216 << a1.a2.a0.a3.a0.a0 << "), " << a1.a2.a0.a3.a1 << "), " << a1.a2.a0.a4
3217 << ", ((" << a1.a2.a0.a5.a0.a0 << "), (" << a1.a2.a0.a5.a1.a0 << ")), "
3218 << a1.a2.a0.a6 << "), ((" << a1.a2.a1.a0.a0 << ", " << a1.a2.a1.a0.a1
3219 << "), (" << a1.a2.a1.a1.a0 << ")), " << a1.a2.a2 << ", " << a1.a2.a3
3220 << "), " << a1.a3 << "), (" << a2.a0 << ", ((" << a2.a1.a0.a0 << ", (("
3221 << a2.a1.a0.a1.a0.a0 << ", " << a2.a1.a0.a1.a0.a1 << "), ("
3222 << a2.a1.a0.a1.a1.a0 << ")), " << a2.a1.a0.a2 << ", (("
3223 << a2.a1.a0.a3.a0.a0 << "), " << a2.a1.a0.a3.a1 << "), " << a2.a1.a0.a4
3224 << ", ((" << a2.a1.a0.a5.a0.a0 << "), (" << a2.a1.a0.a5.a1.a0 << ")), "
3225 << a2.a1.a0.a6 << "), ((" << a2.a1.a1.a0.a0 << ", " << a2.a1.a1.a0.a1
3226 << "), (" << a2.a1.a1.a1.a0 << ")), " << a2.a1.a2 << ", " << a2.a1.a3
3227 << "), ((" << a2.a2.a0.a0 << ", ((" << a2.a2.a0.a1.a0.a0 << ", "
3228 << a2.a2.a0.a1.a0.a1 << "), (" << a2.a2.a0.a1.a1.a0 << ")), "
3229 << a2.a2.a0.a2 << ", ((" << a2.a2.a0.a3.a0.a0 << "), " << a2.a2.a0.a3.a1
3230 << "), " << a2.a2.a0.a4 << ", ((" << a2.a2.a0.a5.a0.a0 << "), ("
3231 << a2.a2.a0.a5.a1.a0 << ")), " << a2.a2.a0.a6 << "), ((" << a2.a2.a1.a0.a0
3232 << ", " << a2.a2.a1.a0.a1 << "), (" << a2.a2.a1.a1.a0 << ")), "
3233 << a2.a2.a2 << ", " << a2.a2.a3 << "), " << a2.a3 << "), (" << a3.a0
3234 << ", ((" << a3.a1.a0.a0 << ", ((" << a3.a1.a0.a1.a0.a0 << ", "
3235 << a3.a1.a0.a1.a0.a1 << "), (" << a3.a1.a0.a1.a1.a0 << ")), "
3236 << a3.a1.a0.a2 << ", ((" << a3.a1.a0.a3.a0.a0 << "), " << a3.a1.a0.a3.a1
3237 << "), " << a3.a1.a0.a4 << ", ((" << a3.a1.a0.a5.a0.a0 << "), ("
3238 << a3.a1.a0.a5.a1.a0 << ")), " << a3.a1.a0.a6 << "), ((" << a3.a1.a1.a0.a0
3239 << ", " << a3.a1.a1.a0.a1 << "), (" << a3.a1.a1.a1.a0 << ")), "
3240 << a3.a1.a2 << ", " << a3.a1.a3 << "), ((" << a3.a2.a0.a0 << ", (("
3241 << a3.a2.a0.a1.a0.a0 << ", " << a3.a2.a0.a1.a0.a1 << "), ("
3242 << a3.a2.a0.a1.a1.a0 << ")), " << a3.a2.a0.a2 << ", (("
3243 << a3.a2.a0.a3.a0.a0 << "), " << a3.a2.a0.a3.a1 << "), " << a3.a2.a0.a4
3244 << ", ((" << a3.a2.a0.a5.a0.a0 << "), (" << a3.a2.a0.a5.a1.a0 << ")), "
3245 << a3.a2.a0.a6 << "), ((" << a3.a2.a1.a0.a0 << ", " << a3.a2.a1.a0.a1
3246 << "), (" << a3.a2.a1.a1.a0 << ")), " << a3.a2.a2 << ", " << a3.a2.a3
3247 << "), " << a3.a3 << "))" << "\n";
3248
3249 double result = 0;
3250
3251 result += a0.a0;
3252 result += a0.a1.a0.a0;
3253 result += a0.a1.a0.a1.a0.a0;
3254 result += a0.a1.a0.a1.a0.a1;
3255 result += a0.a1.a0.a1.a1.a0;
3256 result += a0.a1.a0.a2;
3257 result += a0.a1.a0.a3.a0.a0;
3258 result += a0.a1.a0.a3.a1;
3259 result += a0.a1.a0.a4;
3260 result += a0.a1.a0.a5.a0.a0;
3261 result += a0.a1.a0.a5.a1.a0;
3262 result += a0.a1.a0.a6;
3263 result += a0.a1.a1.a0.a0;
3264 result += a0.a1.a1.a0.a1;
3265 result += a0.a1.a1.a1.a0;
3266 result += a0.a1.a2;
3267 result += a0.a1.a3;
3268 result += a0.a2.a0.a0;
3269 result += a0.a2.a0.a1.a0.a0;
3270 result += a0.a2.a0.a1.a0.a1;
3271 result += a0.a2.a0.a1.a1.a0;
3272 result += a0.a2.a0.a2;
3273 result += a0.a2.a0.a3.a0.a0;
3274 result += a0.a2.a0.a3.a1;
3275 result += a0.a2.a0.a4;
3276 result += a0.a2.a0.a5.a0.a0;
3277 result += a0.a2.a0.a5.a1.a0;
3278 result += a0.a2.a0.a6;
3279 result += a0.a2.a1.a0.a0;
3280 result += a0.a2.a1.a0.a1;
3281 result += a0.a2.a1.a1.a0;
3282 result += a0.a2.a2;
3283 result += a0.a2.a3;
3284 result += a0.a3;
3285 result += a1.a0;
3286 result += a1.a1.a0.a0;
3287 result += a1.a1.a0.a1.a0.a0;
3288 result += a1.a1.a0.a1.a0.a1;
3289 result += a1.a1.a0.a1.a1.a0;
3290 result += a1.a1.a0.a2;
3291 result += a1.a1.a0.a3.a0.a0;
3292 result += a1.a1.a0.a3.a1;
3293 result += a1.a1.a0.a4;
3294 result += a1.a1.a0.a5.a0.a0;
3295 result += a1.a1.a0.a5.a1.a0;
3296 result += a1.a1.a0.a6;
3297 result += a1.a1.a1.a0.a0;
3298 result += a1.a1.a1.a0.a1;
3299 result += a1.a1.a1.a1.a0;
3300 result += a1.a1.a2;
3301 result += a1.a1.a3;
3302 result += a1.a2.a0.a0;
3303 result += a1.a2.a0.a1.a0.a0;
3304 result += a1.a2.a0.a1.a0.a1;
3305 result += a1.a2.a0.a1.a1.a0;
3306 result += a1.a2.a0.a2;
3307 result += a1.a2.a0.a3.a0.a0;
3308 result += a1.a2.a0.a3.a1;
3309 result += a1.a2.a0.a4;
3310 result += a1.a2.a0.a5.a0.a0;
3311 result += a1.a2.a0.a5.a1.a0;
3312 result += a1.a2.a0.a6;
3313 result += a1.a2.a1.a0.a0;
3314 result += a1.a2.a1.a0.a1;
3315 result += a1.a2.a1.a1.a0;
3316 result += a1.a2.a2;
3317 result += a1.a2.a3;
3318 result += a1.a3;
3319 result += a2.a0;
3320 result += a2.a1.a0.a0;
3321 result += a2.a1.a0.a1.a0.a0;
3322 result += a2.a1.a0.a1.a0.a1;
3323 result += a2.a1.a0.a1.a1.a0;
3324 result += a2.a1.a0.a2;
3325 result += a2.a1.a0.a3.a0.a0;
3326 result += a2.a1.a0.a3.a1;
3327 result += a2.a1.a0.a4;
3328 result += a2.a1.a0.a5.a0.a0;
3329 result += a2.a1.a0.a5.a1.a0;
3330 result += a2.a1.a0.a6;
3331 result += a2.a1.a1.a0.a0;
3332 result += a2.a1.a1.a0.a1;
3333 result += a2.a1.a1.a1.a0;
3334 result += a2.a1.a2;
3335 result += a2.a1.a3;
3336 result += a2.a2.a0.a0;
3337 result += a2.a2.a0.a1.a0.a0;
3338 result += a2.a2.a0.a1.a0.a1;
3339 result += a2.a2.a0.a1.a1.a0;
3340 result += a2.a2.a0.a2;
3341 result += a2.a2.a0.a3.a0.a0;
3342 result += a2.a2.a0.a3.a1;
3343 result += a2.a2.a0.a4;
3344 result += a2.a2.a0.a5.a0.a0;
3345 result += a2.a2.a0.a5.a1.a0;
3346 result += a2.a2.a0.a6;
3347 result += a2.a2.a1.a0.a0;
3348 result += a2.a2.a1.a0.a1;
3349 result += a2.a2.a1.a1.a0;
3350 result += a2.a2.a2;
3351 result += a2.a2.a3;
3352 result += a2.a3;
3353 result += a3.a0;
3354 result += a3.a1.a0.a0;
3355 result += a3.a1.a0.a1.a0.a0;
3356 result += a3.a1.a0.a1.a0.a1;
3357 result += a3.a1.a0.a1.a1.a0;
3358 result += a3.a1.a0.a2;
3359 result += a3.a1.a0.a3.a0.a0;
3360 result += a3.a1.a0.a3.a1;
3361 result += a3.a1.a0.a4;
3362 result += a3.a1.a0.a5.a0.a0;
3363 result += a3.a1.a0.a5.a1.a0;
3364 result += a3.a1.a0.a6;
3365 result += a3.a1.a1.a0.a0;
3366 result += a3.a1.a1.a0.a1;
3367 result += a3.a1.a1.a1.a0;
3368 result += a3.a1.a2;
3369 result += a3.a1.a3;
3370 result += a3.a2.a0.a0;
3371 result += a3.a2.a0.a1.a0.a0;
3372 result += a3.a2.a0.a1.a0.a1;
3373 result += a3.a2.a0.a1.a1.a0;
3374 result += a3.a2.a0.a2;
3375 result += a3.a2.a0.a3.a0.a0;
3376 result += a3.a2.a0.a3.a1;
3377 result += a3.a2.a0.a4;
3378 result += a3.a2.a0.a5.a0.a0;
3379 result += a3.a2.a0.a5.a1.a0;
3380 result += a3.a2.a0.a6;
3381 result += a3.a2.a1.a0.a0;
3382 result += a3.a2.a1.a0.a1;
3383 result += a3.a2.a1.a1.a0;
3384 result += a3.a2.a2;
3385 result += a3.a2.a3;
3386 result += a3.a3;
3387
3388 std::cout << "result = " << result << "\n";
3389
3390 return result;
3391}
3392
3393// Used for testing structs and unions by value.
3394// Simple struct with inline array.
3395DART_EXPORT int32_t
3400 std::cout << "PassStruct8BytesInlineArrayIntx4" << "((["
3401 << static_cast<int>(a0.a0[0]) << ", " << static_cast<int>(a0.a0[1])
3402 << ", " << static_cast<int>(a0.a0[2]) << ", "
3403 << static_cast<int>(a0.a0[3]) << ", " << static_cast<int>(a0.a0[4])
3404 << ", " << static_cast<int>(a0.a0[5]) << ", "
3405 << static_cast<int>(a0.a0[6]) << ", " << static_cast<int>(a0.a0[7])
3406 << "]), ([" << static_cast<int>(a1.a0[0]) << ", "
3407 << static_cast<int>(a1.a0[1]) << ", " << static_cast<int>(a1.a0[2])
3408 << ", " << static_cast<int>(a1.a0[3]) << ", "
3409 << static_cast<int>(a1.a0[4]) << ", " << static_cast<int>(a1.a0[5])
3410 << ", " << static_cast<int>(a1.a0[6]) << ", "
3411 << static_cast<int>(a1.a0[7]) << "]), (["
3412 << static_cast<int>(a2.a0[0]) << ", " << static_cast<int>(a2.a0[1])
3413 << ", " << static_cast<int>(a2.a0[2]) << ", "
3414 << static_cast<int>(a2.a0[3]) << ", " << static_cast<int>(a2.a0[4])
3415 << ", " << static_cast<int>(a2.a0[5]) << ", "
3416 << static_cast<int>(a2.a0[6]) << ", " << static_cast<int>(a2.a0[7])
3417 << "]), ([" << static_cast<int>(a3.a0[0]) << ", "
3418 << static_cast<int>(a3.a0[1]) << ", " << static_cast<int>(a3.a0[2])
3419 << ", " << static_cast<int>(a3.a0[3]) << ", "
3420 << static_cast<int>(a3.a0[4]) << ", " << static_cast<int>(a3.a0[5])
3421 << ", " << static_cast<int>(a3.a0[6]) << ", "
3422 << static_cast<int>(a3.a0[7]) << "]))" << "\n";
3423
3424 int32_t result = 0;
3425
3426 result += a0.a0[0];
3427 result += a0.a0[1];
3428 result += a0.a0[2];
3429 result += a0.a0[3];
3430 result += a0.a0[4];
3431 result += a0.a0[5];
3432 result += a0.a0[6];
3433 result += a0.a0[7];
3434 result += a1.a0[0];
3435 result += a1.a0[1];
3436 result += a1.a0[2];
3437 result += a1.a0[3];
3438 result += a1.a0[4];
3439 result += a1.a0[5];
3440 result += a1.a0[6];
3441 result += a1.a0[7];
3442 result += a2.a0[0];
3443 result += a2.a0[1];
3444 result += a2.a0[2];
3445 result += a2.a0[3];
3446 result += a2.a0[4];
3447 result += a2.a0[5];
3448 result += a2.a0[6];
3449 result += a2.a0[7];
3450 result += a3.a0[0];
3451 result += a3.a0[1];
3452 result += a3.a0[2];
3453 result += a3.a0[3];
3454 result += a3.a0[4];
3455 result += a3.a0[5];
3456 result += a3.a0[6];
3457 result += a3.a0[7];
3458
3459 std::cout << "result = " << result << "\n";
3460
3461 return result;
3462}
3463
3464// Used for testing structs and unions by value.
3465// Irregular struct with inline array.
3466DART_EXPORT int32_t
3471 std::cout << "PassStructInlineArrayIrregularx4" << "(([(" << a0.a0[0].a0
3472 << ", " << static_cast<int>(a0.a0[0].a1) << "), (" << a0.a0[1].a0
3473 << ", " << static_cast<int>(a0.a0[1].a1) << ")], "
3474 << static_cast<int>(a0.a1) << "), ([(" << a1.a0[0].a0 << ", "
3475 << static_cast<int>(a1.a0[0].a1) << "), (" << a1.a0[1].a0 << ", "
3476 << static_cast<int>(a1.a0[1].a1) << ")], "
3477 << static_cast<int>(a1.a1) << "), ([(" << a2.a0[0].a0 << ", "
3478 << static_cast<int>(a2.a0[0].a1) << "), (" << a2.a0[1].a0 << ", "
3479 << static_cast<int>(a2.a0[1].a1) << ")], "
3480 << static_cast<int>(a2.a1) << "), ([(" << a3.a0[0].a0 << ", "
3481 << static_cast<int>(a3.a0[0].a1) << "), (" << a3.a0[1].a0 << ", "
3482 << static_cast<int>(a3.a0[1].a1) << ")], "
3483 << static_cast<int>(a3.a1) << "))" << "\n";
3484
3485 int32_t result = 0;
3486
3487 result += a0.a0[0].a0;
3488 result += a0.a0[0].a1;
3489 result += a0.a0[1].a0;
3490 result += a0.a0[1].a1;
3491 result += a0.a1;
3492 result += a1.a0[0].a0;
3493 result += a1.a0[0].a1;
3494 result += a1.a0[1].a0;
3495 result += a1.a0[1].a1;
3496 result += a1.a1;
3497 result += a2.a0[0].a0;
3498 result += a2.a0[0].a1;
3499 result += a2.a0[1].a0;
3500 result += a2.a0[1].a1;
3501 result += a2.a1;
3502 result += a3.a0[0].a0;
3503 result += a3.a0[0].a1;
3504 result += a3.a0[1].a0;
3505 result += a3.a0[1].a1;
3506 result += a3.a1;
3507
3508 std::cout << "result = " << result << "\n";
3509
3510 return result;
3511}
3512
3513// Used for testing structs and unions by value.
3514// Regular larger struct with inline array.
3515DART_EXPORT int32_t
3517 std::cout
3518 << "PassStructInlineArray100Bytes" << "(([" << static_cast<int>(a0.a0[0])
3519 << ", " << static_cast<int>(a0.a0[1]) << ", "
3520 << static_cast<int>(a0.a0[2]) << ", " << static_cast<int>(a0.a0[3])
3521 << ", " << static_cast<int>(a0.a0[4]) << ", "
3522 << static_cast<int>(a0.a0[5]) << ", " << static_cast<int>(a0.a0[6])
3523 << ", " << static_cast<int>(a0.a0[7]) << ", "
3524 << static_cast<int>(a0.a0[8]) << ", " << static_cast<int>(a0.a0[9])
3525 << ", " << static_cast<int>(a0.a0[10]) << ", "
3526 << static_cast<int>(a0.a0[11]) << ", " << static_cast<int>(a0.a0[12])
3527 << ", " << static_cast<int>(a0.a0[13]) << ", "
3528 << static_cast<int>(a0.a0[14]) << ", " << static_cast<int>(a0.a0[15])
3529 << ", " << static_cast<int>(a0.a0[16]) << ", "
3530 << static_cast<int>(a0.a0[17]) << ", " << static_cast<int>(a0.a0[18])
3531 << ", " << static_cast<int>(a0.a0[19]) << ", "
3532 << static_cast<int>(a0.a0[20]) << ", " << static_cast<int>(a0.a0[21])
3533 << ", " << static_cast<int>(a0.a0[22]) << ", "
3534 << static_cast<int>(a0.a0[23]) << ", " << static_cast<int>(a0.a0[24])
3535 << ", " << static_cast<int>(a0.a0[25]) << ", "
3536 << static_cast<int>(a0.a0[26]) << ", " << static_cast<int>(a0.a0[27])
3537 << ", " << static_cast<int>(a0.a0[28]) << ", "
3538 << static_cast<int>(a0.a0[29]) << ", " << static_cast<int>(a0.a0[30])
3539 << ", " << static_cast<int>(a0.a0[31]) << ", "
3540 << static_cast<int>(a0.a0[32]) << ", " << static_cast<int>(a0.a0[33])
3541 << ", " << static_cast<int>(a0.a0[34]) << ", "
3542 << static_cast<int>(a0.a0[35]) << ", " << static_cast<int>(a0.a0[36])
3543 << ", " << static_cast<int>(a0.a0[37]) << ", "
3544 << static_cast<int>(a0.a0[38]) << ", " << static_cast<int>(a0.a0[39])
3545 << ", " << static_cast<int>(a0.a0[40]) << ", "
3546 << static_cast<int>(a0.a0[41]) << ", " << static_cast<int>(a0.a0[42])
3547 << ", " << static_cast<int>(a0.a0[43]) << ", "
3548 << static_cast<int>(a0.a0[44]) << ", " << static_cast<int>(a0.a0[45])
3549 << ", " << static_cast<int>(a0.a0[46]) << ", "
3550 << static_cast<int>(a0.a0[47]) << ", " << static_cast<int>(a0.a0[48])
3551 << ", " << static_cast<int>(a0.a0[49]) << ", "
3552 << static_cast<int>(a0.a0[50]) << ", " << static_cast<int>(a0.a0[51])
3553 << ", " << static_cast<int>(a0.a0[52]) << ", "
3554 << static_cast<int>(a0.a0[53]) << ", " << static_cast<int>(a0.a0[54])
3555 << ", " << static_cast<int>(a0.a0[55]) << ", "
3556 << static_cast<int>(a0.a0[56]) << ", " << static_cast<int>(a0.a0[57])
3557 << ", " << static_cast<int>(a0.a0[58]) << ", "
3558 << static_cast<int>(a0.a0[59]) << ", " << static_cast<int>(a0.a0[60])
3559 << ", " << static_cast<int>(a0.a0[61]) << ", "
3560 << static_cast<int>(a0.a0[62]) << ", " << static_cast<int>(a0.a0[63])
3561 << ", " << static_cast<int>(a0.a0[64]) << ", "
3562 << static_cast<int>(a0.a0[65]) << ", " << static_cast<int>(a0.a0[66])
3563 << ", " << static_cast<int>(a0.a0[67]) << ", "
3564 << static_cast<int>(a0.a0[68]) << ", " << static_cast<int>(a0.a0[69])
3565 << ", " << static_cast<int>(a0.a0[70]) << ", "
3566 << static_cast<int>(a0.a0[71]) << ", " << static_cast<int>(a0.a0[72])
3567 << ", " << static_cast<int>(a0.a0[73]) << ", "
3568 << static_cast<int>(a0.a0[74]) << ", " << static_cast<int>(a0.a0[75])
3569 << ", " << static_cast<int>(a0.a0[76]) << ", "
3570 << static_cast<int>(a0.a0[77]) << ", " << static_cast<int>(a0.a0[78])
3571 << ", " << static_cast<int>(a0.a0[79]) << ", "
3572 << static_cast<int>(a0.a0[80]) << ", " << static_cast<int>(a0.a0[81])
3573 << ", " << static_cast<int>(a0.a0[82]) << ", "
3574 << static_cast<int>(a0.a0[83]) << ", " << static_cast<int>(a0.a0[84])
3575 << ", " << static_cast<int>(a0.a0[85]) << ", "
3576 << static_cast<int>(a0.a0[86]) << ", " << static_cast<int>(a0.a0[87])
3577 << ", " << static_cast<int>(a0.a0[88]) << ", "
3578 << static_cast<int>(a0.a0[89]) << ", " << static_cast<int>(a0.a0[90])
3579 << ", " << static_cast<int>(a0.a0[91]) << ", "
3580 << static_cast<int>(a0.a0[92]) << ", " << static_cast<int>(a0.a0[93])
3581 << ", " << static_cast<int>(a0.a0[94]) << ", "
3582 << static_cast<int>(a0.a0[95]) << ", " << static_cast<int>(a0.a0[96])
3583 << ", " << static_cast<int>(a0.a0[97]) << ", "
3584 << static_cast<int>(a0.a0[98]) << ", " << static_cast<int>(a0.a0[99])
3585 << "]))" << "\n";
3586
3587 int32_t result = 0;
3588
3589 result += a0.a0[0];
3590 result += a0.a0[1];
3591 result += a0.a0[2];
3592 result += a0.a0[3];
3593 result += a0.a0[4];
3594 result += a0.a0[5];
3595 result += a0.a0[6];
3596 result += a0.a0[7];
3597 result += a0.a0[8];
3598 result += a0.a0[9];
3599 result += a0.a0[10];
3600 result += a0.a0[11];
3601 result += a0.a0[12];
3602 result += a0.a0[13];
3603 result += a0.a0[14];
3604 result += a0.a0[15];
3605 result += a0.a0[16];
3606 result += a0.a0[17];
3607 result += a0.a0[18];
3608 result += a0.a0[19];
3609 result += a0.a0[20];
3610 result += a0.a0[21];
3611 result += a0.a0[22];
3612 result += a0.a0[23];
3613 result += a0.a0[24];
3614 result += a0.a0[25];
3615 result += a0.a0[26];
3616 result += a0.a0[27];
3617 result += a0.a0[28];
3618 result += a0.a0[29];
3619 result += a0.a0[30];
3620 result += a0.a0[31];
3621 result += a0.a0[32];
3622 result += a0.a0[33];
3623 result += a0.a0[34];
3624 result += a0.a0[35];
3625 result += a0.a0[36];
3626 result += a0.a0[37];
3627 result += a0.a0[38];
3628 result += a0.a0[39];
3629 result += a0.a0[40];
3630 result += a0.a0[41];
3631 result += a0.a0[42];
3632 result += a0.a0[43];
3633 result += a0.a0[44];
3634 result += a0.a0[45];
3635 result += a0.a0[46];
3636 result += a0.a0[47];
3637 result += a0.a0[48];
3638 result += a0.a0[49];
3639 result += a0.a0[50];
3640 result += a0.a0[51];
3641 result += a0.a0[52];
3642 result += a0.a0[53];
3643 result += a0.a0[54];
3644 result += a0.a0[55];
3645 result += a0.a0[56];
3646 result += a0.a0[57];
3647 result += a0.a0[58];
3648 result += a0.a0[59];
3649 result += a0.a0[60];
3650 result += a0.a0[61];
3651 result += a0.a0[62];
3652 result += a0.a0[63];
3653 result += a0.a0[64];
3654 result += a0.a0[65];
3655 result += a0.a0[66];
3656 result += a0.a0[67];
3657 result += a0.a0[68];
3658 result += a0.a0[69];
3659 result += a0.a0[70];
3660 result += a0.a0[71];
3661 result += a0.a0[72];
3662 result += a0.a0[73];
3663 result += a0.a0[74];
3664 result += a0.a0[75];
3665 result += a0.a0[76];
3666 result += a0.a0[77];
3667 result += a0.a0[78];
3668 result += a0.a0[79];
3669 result += a0.a0[80];
3670 result += a0.a0[81];
3671 result += a0.a0[82];
3672 result += a0.a0[83];
3673 result += a0.a0[84];
3674 result += a0.a0[85];
3675 result += a0.a0[86];
3676 result += a0.a0[87];
3677 result += a0.a0[88];
3678 result += a0.a0[89];
3679 result += a0.a0[90];
3680 result += a0.a0[91];
3681 result += a0.a0[92];
3682 result += a0.a0[93];
3683 result += a0.a0[94];
3684 result += a0.a0[95];
3685 result += a0.a0[96];
3686 result += a0.a0[97];
3687 result += a0.a0[98];
3688 result += a0.a0[99];
3689
3690 std::cout << "result = " << result << "\n";
3691
3692 return result;
3693}
3694
3695// Used for testing structs and unions by value.
3696// Arguments in FPU registers on arm hardfp and arm64.
3697// 5 struct arguments will exhaust available registers.
3704 std::cout << "PassStructStruct16BytesHomogeneousFloat2x5" << "(((" << a0.a0.a0
3705 << "), [(" << a0.a1[0].a0 << "), (" << a0.a1[1].a0 << ")], "
3706 << a0.a2 << "), ((" << a1.a0.a0 << "), [(" << a1.a1[0].a0 << "), ("
3707 << a1.a1[1].a0 << ")], " << a1.a2 << "), ((" << a2.a0.a0 << "), [("
3708 << a2.a1[0].a0 << "), (" << a2.a1[1].a0 << ")], " << a2.a2
3709 << "), ((" << a3.a0.a0 << "), [(" << a3.a1[0].a0 << "), ("
3710 << a3.a1[1].a0 << ")], " << a3.a2 << "), ((" << a4.a0.a0 << "), [("
3711 << a4.a1[0].a0 << "), (" << a4.a1[1].a0 << ")], " << a4.a2 << "))"
3712 << "\n";
3713
3714 float result = 0;
3715
3716 result += a0.a0.a0;
3717 result += a0.a1[0].a0;
3718 result += a0.a1[1].a0;
3719 result += a0.a2;
3720 result += a1.a0.a0;
3721 result += a1.a1[0].a0;
3722 result += a1.a1[1].a0;
3723 result += a1.a2;
3724 result += a2.a0.a0;
3725 result += a2.a1[0].a0;
3726 result += a2.a1[1].a0;
3727 result += a2.a2;
3728 result += a3.a0.a0;
3729 result += a3.a1[0].a0;
3730 result += a3.a1[1].a0;
3731 result += a3.a2;
3732 result += a4.a0.a0;
3733 result += a4.a1[0].a0;
3734 result += a4.a1[1].a0;
3735 result += a4.a2;
3736
3737 std::cout << "result = " << result << "\n";
3738
3739 return result;
3740}
3741
3742// Used for testing structs and unions by value.
3743// Arguments in FPU registers on arm64.
3744// 5 struct arguments will exhaust available registers.
3751 std::cout << "PassStructStruct32BytesHomogeneousDouble2x5" << "((("
3752 << a0.a0.a0 << "), [(" << a0.a1[0].a0 << "), (" << a0.a1[1].a0
3753 << ")], " << a0.a2 << "), ((" << a1.a0.a0 << "), [(" << a1.a1[0].a0
3754 << "), (" << a1.a1[1].a0 << ")], " << a1.a2 << "), ((" << a2.a0.a0
3755 << "), [(" << a2.a1[0].a0 << "), (" << a2.a1[1].a0 << ")], "
3756 << a2.a2 << "), ((" << a3.a0.a0 << "), [(" << a3.a1[0].a0 << "), ("
3757 << a3.a1[1].a0 << ")], " << a3.a2 << "), ((" << a4.a0.a0 << "), [("
3758 << a4.a1[0].a0 << "), (" << a4.a1[1].a0 << ")], " << a4.a2 << "))"
3759 << "\n";
3760
3761 double result = 0;
3762
3763 result += a0.a0.a0;
3764 result += a0.a1[0].a0;
3765 result += a0.a1[1].a0;
3766 result += a0.a2;
3767 result += a1.a0.a0;
3768 result += a1.a1[0].a0;
3769 result += a1.a1[1].a0;
3770 result += a1.a2;
3771 result += a2.a0.a0;
3772 result += a2.a1[0].a0;
3773 result += a2.a1[1].a0;
3774 result += a2.a2;
3775 result += a3.a0.a0;
3776 result += a3.a1[0].a0;
3777 result += a3.a1[1].a0;
3778 result += a3.a2;
3779 result += a4.a0.a0;
3780 result += a4.a1[0].a0;
3781 result += a4.a1[1].a0;
3782 result += a4.a2;
3783
3784 std::cout << "result = " << result << "\n";
3785
3786 return result;
3787}
3788
3789// Used for testing structs and unions by value.
3790// On x64, arguments are split over FP and int registers.
3791// On x64, it will exhaust the integer registers with the 6th argument.
3792// The rest goes on the stack.
3793// On arm, arguments are 4 byte aligned.
3805 std::cout << "PassStructStruct16BytesMixed3x10" << "(((" << a0.a0.a0
3806 << "), [(" << a0.a1[0].a0 << ", " << a0.a1[0].a1 << ", "
3807 << a0.a1[0].a2 << ")], [" << a0.a2[0] << ", " << a0.a2[1]
3808 << "]), ((" << a1.a0.a0 << "), [(" << a1.a1[0].a0 << ", "
3809 << a1.a1[0].a1 << ", " << a1.a1[0].a2 << ")], [" << a1.a2[0] << ", "
3810 << a1.a2[1] << "]), ((" << a2.a0.a0 << "), [(" << a2.a1[0].a0
3811 << ", " << a2.a1[0].a1 << ", " << a2.a1[0].a2 << ")], [" << a2.a2[0]
3812 << ", " << a2.a2[1] << "]), ((" << a3.a0.a0 << "), [("
3813 << a3.a1[0].a0 << ", " << a3.a1[0].a1 << ", " << a3.a1[0].a2
3814 << ")], [" << a3.a2[0] << ", " << a3.a2[1] << "]), ((" << a4.a0.a0
3815 << "), [(" << a4.a1[0].a0 << ", " << a4.a1[0].a1 << ", "
3816 << a4.a1[0].a2 << ")], [" << a4.a2[0] << ", " << a4.a2[1]
3817 << "]), ((" << a5.a0.a0 << "), [(" << a5.a1[0].a0 << ", "
3818 << a5.a1[0].a1 << ", " << a5.a1[0].a2 << ")], [" << a5.a2[0] << ", "
3819 << a5.a2[1] << "]), ((" << a6.a0.a0 << "), [(" << a6.a1[0].a0
3820 << ", " << a6.a1[0].a1 << ", " << a6.a1[0].a2 << ")], [" << a6.a2[0]
3821 << ", " << a6.a2[1] << "]), ((" << a7.a0.a0 << "), [("
3822 << a7.a1[0].a0 << ", " << a7.a1[0].a1 << ", " << a7.a1[0].a2
3823 << ")], [" << a7.a2[0] << ", " << a7.a2[1] << "]), ((" << a8.a0.a0
3824 << "), [(" << a8.a1[0].a0 << ", " << a8.a1[0].a1 << ", "
3825 << a8.a1[0].a2 << ")], [" << a8.a2[0] << ", " << a8.a2[1]
3826 << "]), ((" << a9.a0.a0 << "), [(" << a9.a1[0].a0 << ", "
3827 << a9.a1[0].a1 << ", " << a9.a1[0].a2 << ")], [" << a9.a2[0] << ", "
3828 << a9.a2[1] << "]))" << "\n";
3829
3830 float result = 0;
3831
3832 result += a0.a0.a0;
3833 result += a0.a1[0].a0;
3834 result += a0.a1[0].a1;
3835 result += a0.a1[0].a2;
3836 result += a0.a2[0];
3837 result += a0.a2[1];
3838 result += a1.a0.a0;
3839 result += a1.a1[0].a0;
3840 result += a1.a1[0].a1;
3841 result += a1.a1[0].a2;
3842 result += a1.a2[0];
3843 result += a1.a2[1];
3844 result += a2.a0.a0;
3845 result += a2.a1[0].a0;
3846 result += a2.a1[0].a1;
3847 result += a2.a1[0].a2;
3848 result += a2.a2[0];
3849 result += a2.a2[1];
3850 result += a3.a0.a0;
3851 result += a3.a1[0].a0;
3852 result += a3.a1[0].a1;
3853 result += a3.a1[0].a2;
3854 result += a3.a2[0];
3855 result += a3.a2[1];
3856 result += a4.a0.a0;
3857 result += a4.a1[0].a0;
3858 result += a4.a1[0].a1;
3859 result += a4.a1[0].a2;
3860 result += a4.a2[0];
3861 result += a4.a2[1];
3862 result += a5.a0.a0;
3863 result += a5.a1[0].a0;
3864 result += a5.a1[0].a1;
3865 result += a5.a1[0].a2;
3866 result += a5.a2[0];
3867 result += a5.a2[1];
3868 result += a6.a0.a0;
3869 result += a6.a1[0].a0;
3870 result += a6.a1[0].a1;
3871 result += a6.a1[0].a2;
3872 result += a6.a2[0];
3873 result += a6.a2[1];
3874 result += a7.a0.a0;
3875 result += a7.a1[0].a0;
3876 result += a7.a1[0].a1;
3877 result += a7.a1[0].a2;
3878 result += a7.a2[0];
3879 result += a7.a2[1];
3880 result += a8.a0.a0;
3881 result += a8.a1[0].a0;
3882 result += a8.a1[0].a1;
3883 result += a8.a1[0].a2;
3884 result += a8.a2[0];
3885 result += a8.a2[1];
3886 result += a9.a0.a0;
3887 result += a9.a1[0].a0;
3888 result += a9.a1[0].a1;
3889 result += a9.a1[0].a2;
3890 result += a9.a2[0];
3891 result += a9.a2[1];
3892
3893 std::cout << "result = " << result << "\n";
3894
3895 return result;
3896}
3897
3898// Used for testing structs and unions by value.
3899// Test multi dimensional inline array struct as argument.
3901 uint8_t a0,
3903 uint8_t a2,
3905 uint8_t a4,
3907 uint8_t a6) {
3908 std::cout << "PassUint8Struct32BytesInlineArrayMultiDimensionalI" << "("
3909 << static_cast<int>(a0) << ", ([[[[["
3910 << static_cast<int>(a1.a0[0][0][0][0][0]) << ", "
3911 << static_cast<int>(a1.a0[0][0][0][0][1]) << "], ["
3912 << static_cast<int>(a1.a0[0][0][0][1][0]) << ", "
3913 << static_cast<int>(a1.a0[0][0][0][1][1]) << "]], [["
3914 << static_cast<int>(a1.a0[0][0][1][0][0]) << ", "
3915 << static_cast<int>(a1.a0[0][0][1][0][1]) << "], ["
3916 << static_cast<int>(a1.a0[0][0][1][1][0]) << ", "
3917 << static_cast<int>(a1.a0[0][0][1][1][1]) << "]]], [[["
3918 << static_cast<int>(a1.a0[0][1][0][0][0]) << ", "
3919 << static_cast<int>(a1.a0[0][1][0][0][1]) << "], ["
3920 << static_cast<int>(a1.a0[0][1][0][1][0]) << ", "
3921 << static_cast<int>(a1.a0[0][1][0][1][1]) << "]], [["
3922 << static_cast<int>(a1.a0[0][1][1][0][0]) << ", "
3923 << static_cast<int>(a1.a0[0][1][1][0][1]) << "], ["
3924 << static_cast<int>(a1.a0[0][1][1][1][0]) << ", "
3925 << static_cast<int>(a1.a0[0][1][1][1][1]) << "]]]], [[[["
3926 << static_cast<int>(a1.a0[1][0][0][0][0]) << ", "
3927 << static_cast<int>(a1.a0[1][0][0][0][1]) << "], ["
3928 << static_cast<int>(a1.a0[1][0][0][1][0]) << ", "
3929 << static_cast<int>(a1.a0[1][0][0][1][1]) << "]], [["
3930 << static_cast<int>(a1.a0[1][0][1][0][0]) << ", "
3931 << static_cast<int>(a1.a0[1][0][1][0][1]) << "], ["
3932 << static_cast<int>(a1.a0[1][0][1][1][0]) << ", "
3933 << static_cast<int>(a1.a0[1][0][1][1][1]) << "]]], [[["
3934 << static_cast<int>(a1.a0[1][1][0][0][0]) << ", "
3935 << static_cast<int>(a1.a0[1][1][0][0][1]) << "], ["
3936 << static_cast<int>(a1.a0[1][1][0][1][0]) << ", "
3937 << static_cast<int>(a1.a0[1][1][0][1][1]) << "]], [["
3938 << static_cast<int>(a1.a0[1][1][1][0][0]) << ", "
3939 << static_cast<int>(a1.a0[1][1][1][0][1]) << "], ["
3940 << static_cast<int>(a1.a0[1][1][1][1][0]) << ", "
3941 << static_cast<int>(a1.a0[1][1][1][1][1]) << "]]]]]), "
3942 << static_cast<int>(a2) << ", ([[["
3943 << static_cast<int>(a3.a0[0][0][0]) << ", "
3944 << static_cast<int>(a3.a0[0][0][1]) << "], ["
3945 << static_cast<int>(a3.a0[0][1][0]) << ", "
3946 << static_cast<int>(a3.a0[0][1][1]) << "]], [["
3947 << static_cast<int>(a3.a0[1][0][0]) << ", "
3948 << static_cast<int>(a3.a0[1][0][1]) << "], ["
3949 << static_cast<int>(a3.a0[1][1][0]) << ", "
3950 << static_cast<int>(a3.a0[1][1][1]) << "]]]), "
3951 << static_cast<int>(a4) << ", ([[["
3952 << static_cast<int>(a5.a0[0][0][0]) << ", "
3953 << static_cast<int>(a5.a0[0][0][1]) << "], ["
3954 << static_cast<int>(a5.a0[0][1][0]) << ", "
3955 << static_cast<int>(a5.a0[0][1][1]) << "]], [["
3956 << static_cast<int>(a5.a0[1][0][0]) << ", "
3957 << static_cast<int>(a5.a0[1][0][1]) << "], ["
3958 << static_cast<int>(a5.a0[1][1][0]) << ", "
3959 << static_cast<int>(a5.a0[1][1][1]) << "]]]), "
3960 << static_cast<int>(a6) << ")" << "\n";
3961
3962 uint32_t result = 0;
3963
3964 result += a0;
3965 result += a1.a0[0][0][0][0][0];
3966 result += a1.a0[0][0][0][0][1];
3967 result += a1.a0[0][0][0][1][0];
3968 result += a1.a0[0][0][0][1][1];
3969 result += a1.a0[0][0][1][0][0];
3970 result += a1.a0[0][0][1][0][1];
3971 result += a1.a0[0][0][1][1][0];
3972 result += a1.a0[0][0][1][1][1];
3973 result += a1.a0[0][1][0][0][0];
3974 result += a1.a0[0][1][0][0][1];
3975 result += a1.a0[0][1][0][1][0];
3976 result += a1.a0[0][1][0][1][1];
3977 result += a1.a0[0][1][1][0][0];
3978 result += a1.a0[0][1][1][0][1];
3979 result += a1.a0[0][1][1][1][0];
3980 result += a1.a0[0][1][1][1][1];
3981 result += a1.a0[1][0][0][0][0];
3982 result += a1.a0[1][0][0][0][1];
3983 result += a1.a0[1][0][0][1][0];
3984 result += a1.a0[1][0][0][1][1];
3985 result += a1.a0[1][0][1][0][0];
3986 result += a1.a0[1][0][1][0][1];
3987 result += a1.a0[1][0][1][1][0];
3988 result += a1.a0[1][0][1][1][1];
3989 result += a1.a0[1][1][0][0][0];
3990 result += a1.a0[1][1][0][0][1];
3991 result += a1.a0[1][1][0][1][0];
3992 result += a1.a0[1][1][0][1][1];
3993 result += a1.a0[1][1][1][0][0];
3994 result += a1.a0[1][1][1][0][1];
3995 result += a1.a0[1][1][1][1][0];
3996 result += a1.a0[1][1][1][1][1];
3997 result += a2;
3998 result += a3.a0[0][0][0];
3999 result += a3.a0[0][0][1];
4000 result += a3.a0[0][1][0];
4001 result += a3.a0[0][1][1];
4002 result += a3.a0[1][0][0];
4003 result += a3.a0[1][0][1];
4004 result += a3.a0[1][1][0];
4005 result += a3.a0[1][1][1];
4006 result += a4;
4007 result += a5.a0[0][0][0];
4008 result += a5.a0[0][0][1];
4009 result += a5.a0[0][1][0];
4010 result += a5.a0[0][1][1];
4011 result += a5.a0[1][0][0];
4012 result += a5.a0[1][0][1];
4013 result += a5.a0[1][1][0];
4014 result += a5.a0[1][1][1];
4015 result += a6;
4016
4017 std::cout << "result = " << result << "\n";
4018
4019 return result;
4020}
4021
4022// Used for testing structs and unions by value.
4023// Test struct in multi dimensional inline array.
4025 uint8_t a0,
4027 uint8_t a2) {
4028 std::cout << "PassUint8Struct4BytesInlineArrayMultiDimensionalIn" << "("
4029 << static_cast<int>(a0) << ", ([[("
4030 << static_cast<int>(a1.a0[0][0].a0) << "), ("
4031 << static_cast<int>(a1.a0[0][1].a0) << ")], [("
4032 << static_cast<int>(a1.a0[1][0].a0) << "), ("
4033 << static_cast<int>(a1.a0[1][1].a0) << ")]]), "
4034 << static_cast<int>(a2) << ")" << "\n";
4035
4036 uint32_t result = 0;
4037
4038 result += a0;
4039 result += a1.a0[0][0].a0;
4040 result += a1.a0[0][1].a0;
4041 result += a1.a0[1][0].a0;
4042 result += a1.a0[1][1].a0;
4043 result += a2;
4044
4045 std::cout << "result = " << result << "\n";
4046
4047 return result;
4048}
4049
4050// Used for testing structs and unions by value.
4051// Small struct with mis-aligned member.
4062 std::cout << "PassStruct3BytesPackedIntx10" << "((" << static_cast<int>(a0.a0)
4063 << ", " << a0.a1 << "), (" << static_cast<int>(a1.a0) << ", "
4064 << a1.a1 << "), (" << static_cast<int>(a2.a0) << ", " << a2.a1
4065 << "), (" << static_cast<int>(a3.a0) << ", " << a3.a1 << "), ("
4066 << static_cast<int>(a4.a0) << ", " << a4.a1 << "), ("
4067 << static_cast<int>(a5.a0) << ", " << a5.a1 << "), ("
4068 << static_cast<int>(a6.a0) << ", " << a6.a1 << "), ("
4069 << static_cast<int>(a7.a0) << ", " << a7.a1 << "), ("
4070 << static_cast<int>(a8.a0) << ", " << a8.a1 << "), ("
4071 << static_cast<int>(a9.a0) << ", " << a9.a1 << "))" << "\n";
4072
4073 int64_t result = 0;
4074
4075 result += a0.a0;
4076 result += a0.a1;
4077 result += a1.a0;
4078 result += a1.a1;
4079 result += a2.a0;
4080 result += a2.a1;
4081 result += a3.a0;
4082 result += a3.a1;
4083 result += a4.a0;
4084 result += a4.a1;
4085 result += a5.a0;
4086 result += a5.a1;
4087 result += a6.a0;
4088 result += a6.a1;
4089 result += a7.a0;
4090 result += a7.a1;
4091 result += a8.a0;
4092 result += a8.a1;
4093 result += a9.a0;
4094 result += a9.a1;
4095
4096 std::cout << "result = " << result << "\n";
4097
4098 return result;
4099}
4100
4101// Used for testing structs and unions by value.
4102// Struct with mis-aligned member.
4113 std::cout << "PassStruct8BytesPackedIntx10" << "((" << static_cast<int>(a0.a0)
4114 << ", " << a0.a1 << ", " << static_cast<int>(a0.a2) << ", "
4115 << static_cast<int>(a0.a3) << ", " << static_cast<int>(a0.a4)
4116 << "), (" << static_cast<int>(a1.a0) << ", " << a1.a1 << ", "
4117 << static_cast<int>(a1.a2) << ", " << static_cast<int>(a1.a3)
4118 << ", " << static_cast<int>(a1.a4) << "), ("
4119 << static_cast<int>(a2.a0) << ", " << a2.a1 << ", "
4120 << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3)
4121 << ", " << static_cast<int>(a2.a4) << "), ("
4122 << static_cast<int>(a3.a0) << ", " << a3.a1 << ", "
4123 << static_cast<int>(a3.a2) << ", " << static_cast<int>(a3.a3)
4124 << ", " << static_cast<int>(a3.a4) << "), ("
4125 << static_cast<int>(a4.a0) << ", " << a4.a1 << ", "
4126 << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3)
4127 << ", " << static_cast<int>(a4.a4) << "), ("
4128 << static_cast<int>(a5.a0) << ", " << a5.a1 << ", "
4129 << static_cast<int>(a5.a2) << ", " << static_cast<int>(a5.a3)
4130 << ", " << static_cast<int>(a5.a4) << "), ("
4131 << static_cast<int>(a6.a0) << ", " << a6.a1 << ", "
4132 << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3)
4133 << ", " << static_cast<int>(a6.a4) << "), ("
4134 << static_cast<int>(a7.a0) << ", " << a7.a1 << ", "
4135 << static_cast<int>(a7.a2) << ", " << static_cast<int>(a7.a3)
4136 << ", " << static_cast<int>(a7.a4) << "), ("
4137 << static_cast<int>(a8.a0) << ", " << a8.a1 << ", "
4138 << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3)
4139 << ", " << static_cast<int>(a8.a4) << "), ("
4140 << static_cast<int>(a9.a0) << ", " << a9.a1 << ", "
4141 << static_cast<int>(a9.a2) << ", " << static_cast<int>(a9.a3)
4142 << ", " << static_cast<int>(a9.a4) << "))" << "\n";
4143
4144 int64_t result = 0;
4145
4146 result += a0.a0;
4147 result += a0.a1;
4148 result += a0.a2;
4149 result += a0.a3;
4150 result += a0.a4;
4151 result += a1.a0;
4152 result += a1.a1;
4153 result += a1.a2;
4154 result += a1.a3;
4155 result += a1.a4;
4156 result += a2.a0;
4157 result += a2.a1;
4158 result += a2.a2;
4159 result += a2.a3;
4160 result += a2.a4;
4161 result += a3.a0;
4162 result += a3.a1;
4163 result += a3.a2;
4164 result += a3.a3;
4165 result += a3.a4;
4166 result += a4.a0;
4167 result += a4.a1;
4168 result += a4.a2;
4169 result += a4.a3;
4170 result += a4.a4;
4171 result += a5.a0;
4172 result += a5.a1;
4173 result += a5.a2;
4174 result += a5.a3;
4175 result += a5.a4;
4176 result += a6.a0;
4177 result += a6.a1;
4178 result += a6.a2;
4179 result += a6.a3;
4180 result += a6.a4;
4181 result += a7.a0;
4182 result += a7.a1;
4183 result += a7.a2;
4184 result += a7.a3;
4185 result += a7.a4;
4186 result += a8.a0;
4187 result += a8.a1;
4188 result += a8.a2;
4189 result += a8.a3;
4190 result += a8.a4;
4191 result += a9.a0;
4192 result += a9.a1;
4193 result += a9.a2;
4194 result += a9.a3;
4195 result += a9.a4;
4196
4197 std::cout << "result = " << result << "\n";
4198
4199 return result;
4200}
4201
4202// Used for testing structs and unions by value.
4203// Struct with mis-aligned member.
4204// Tests backfilling of CPU and FPU registers.
4216 double a10,
4217 int32_t a11,
4218 int32_t a12) {
4219 std::cout << "PassStruct9BytesPackedMixedx10DoubleInt32x2" << "(("
4220 << static_cast<int>(a0.a0) << ", " << a0.a1 << "), ("
4221 << static_cast<int>(a1.a0) << ", " << a1.a1 << "), ("
4222 << static_cast<int>(a2.a0) << ", " << a2.a1 << "), ("
4223 << static_cast<int>(a3.a0) << ", " << a3.a1 << "), ("
4224 << static_cast<int>(a4.a0) << ", " << a4.a1 << "), ("
4225 << static_cast<int>(a5.a0) << ", " << a5.a1 << "), ("
4226 << static_cast<int>(a6.a0) << ", " << a6.a1 << "), ("
4227 << static_cast<int>(a7.a0) << ", " << a7.a1 << "), ("
4228 << static_cast<int>(a8.a0) << ", " << a8.a1 << "), ("
4229 << static_cast<int>(a9.a0) << ", " << a9.a1 << "), " << a10 << ", "
4230 << a11 << ", " << a12 << ")" << "\n";
4231
4232 double result = 0;
4233
4234 result += a0.a0;
4235 result += a0.a1;
4236 result += a1.a0;
4237 result += a1.a1;
4238 result += a2.a0;
4239 result += a2.a1;
4240 result += a3.a0;
4241 result += a3.a1;
4242 result += a4.a0;
4243 result += a4.a1;
4244 result += a5.a0;
4245 result += a5.a1;
4246 result += a6.a0;
4247 result += a6.a1;
4248 result += a7.a0;
4249 result += a7.a1;
4250 result += a8.a0;
4251 result += a8.a1;
4252 result += a9.a0;
4253 result += a9.a1;
4254 result += a10;
4255 result += a11;
4256 result += a12;
4257
4258 std::cout << "result = " << result << "\n";
4259
4260 return result;
4261}
4262
4263// Used for testing structs and unions by value.
4264// This packed struct happens to have only aligned members.
4266 std::cout << "PassStruct5BytesPackedMixed" << "((" << a0.a0 << ", "
4267 << static_cast<int>(a0.a1) << "))" << "\n";
4268
4269 double result = 0;
4270
4271 result += a0.a0;
4272 result += a0.a1;
4273
4274 std::cout << "result = " << result << "\n";
4275
4276 return result;
4277}
4278
4279// Used for testing structs and unions by value.
4280// Check alignment of packed struct in non-packed struct.
4283 std::cout << "PassStructNestedAlignmentStruct5BytesPackedMixed" << "(("
4284 << static_cast<int>(a0.a0) << ", (" << a0.a1.a0 << ", "
4285 << static_cast<int>(a0.a1.a1) << ")))" << "\n";
4286
4287 double result = 0;
4288
4289 result += a0.a0;
4290 result += a0.a1.a0;
4291 result += a0.a1.a1;
4292
4293 std::cout << "result = " << result << "\n";
4294
4295 return result;
4296}
4297
4298// Used for testing structs and unions by value.
4299// Check alignment of packed struct array in non-packed struct.
4302 std::cout << "PassStruct6BytesInlineArrayInt" << "(([("
4303 << static_cast<int>(a0.a0[0].a0) << ", " << a0.a0[0].a1 << "), ("
4304 << static_cast<int>(a0.a0[1].a0) << ", " << a0.a0[1].a1 << ")]))"
4305 << "\n";
4306
4307 double result = 0;
4308
4309 result += a0.a0[0].a0;
4310 result += a0.a0[0].a1;
4311 result += a0.a0[1].a0;
4312 result += a0.a0[1].a1;
4313
4314 std::cout << "result = " << result << "\n";
4315
4316 return result;
4317}
4318
4319// Used for testing structs and unions by value.
4320// Check alignment of packed struct array in non-packed struct.
4323 std::cout << "PassStruct15BytesInlineArrayMixed" << "(([(" << a0.a0[0].a0
4324 << ", " << static_cast<int>(a0.a0[0].a1) << "), (" << a0.a0[1].a0
4325 << ", " << static_cast<int>(a0.a0[1].a1) << "), (" << a0.a0[2].a0
4326 << ", " << static_cast<int>(a0.a0[2].a1) << ")]))" << "\n";
4327
4328 double result = 0;
4329
4330 result += a0.a0[0].a0;
4331 result += a0.a0[0].a1;
4332 result += a0.a0[1].a0;
4333 result += a0.a0[1].a1;
4334 result += a0.a0[2].a0;
4335 result += a0.a0[2].a1;
4336
4337 std::cout << "result = " << result << "\n";
4338
4339 return result;
4340}
4341
4342// Used for testing structs and unions by value.
4343// Check placement of mixed integer/float union.
4353 Union4BytesMixed a9) {
4354 std::cout << "PassUnion4BytesMixedx10" << "((" << a0.a0 << "), (" << a1.a0
4355 << "), (" << a2.a0 << "), (" << a3.a0 << "), (" << a4.a0 << "), ("
4356 << a5.a0 << "), (" << a6.a0 << "), (" << a7.a0 << "), (" << a8.a0
4357 << "), (" << a9.a0 << "))" << "\n";
4358
4359 double result = 0;
4360
4361 result += a0.a0;
4362 result += a1.a0;
4363 result += a2.a0;
4364 result += a3.a0;
4365 result += a4.a0;
4366 result += a5.a0;
4367 result += a6.a0;
4368 result += a7.a0;
4369 result += a8.a0;
4370 result += a9.a0;
4371
4372 std::cout << "result = " << result << "\n";
4373
4374 return result;
4375}
4376
4377// Used for testing structs and unions by value.
4378// Check placement of mixed floats union.
4389 std::cout << "PassUnion8BytesNestedFloatx10" << "((" << a0.a0 << "), ("
4390 << a1.a0 << "), (" << a2.a0 << "), (" << a3.a0 << "), (" << a4.a0
4391 << "), (" << a5.a0 << "), (" << a6.a0 << "), (" << a7.a0 << "), ("
4392 << a8.a0 << "), (" << a9.a0 << "))" << "\n";
4393
4394 double result = 0;
4395
4396 result += a0.a0;
4397 result += a1.a0;
4398 result += a2.a0;
4399 result += a3.a0;
4400 result += a4.a0;
4401 result += a5.a0;
4402 result += a6.a0;
4403 result += a7.a0;
4404 result += a8.a0;
4405 result += a9.a0;
4406
4407 std::cout << "result = " << result << "\n";
4408
4409 return result;
4410}
4411
4412// Used for testing structs and unions by value.
4413// Mixed-size union argument.
4424 std::cout << "PassUnion9BytesNestedIntx10" << "(((" << a0.a0.a0 << ", "
4425 << a0.a0.a1 << ", " << a0.a0.a2 << ")), ((" << a1.a0.a0 << ", "
4426 << a1.a0.a1 << ", " << a1.a0.a2 << ")), ((" << a2.a0.a0 << ", "
4427 << a2.a0.a1 << ", " << a2.a0.a2 << ")), ((" << a3.a0.a0 << ", "
4428 << a3.a0.a1 << ", " << a3.a0.a2 << ")), ((" << a4.a0.a0 << ", "
4429 << a4.a0.a1 << ", " << a4.a0.a2 << ")), ((" << a5.a0.a0 << ", "
4430 << a5.a0.a1 << ", " << a5.a0.a2 << ")), ((" << a6.a0.a0 << ", "
4431 << a6.a0.a1 << ", " << a6.a0.a2 << ")), ((" << a7.a0.a0 << ", "
4432 << a7.a0.a1 << ", " << a7.a0.a2 << ")), ((" << a8.a0.a0 << ", "
4433 << a8.a0.a1 << ", " << a8.a0.a2 << ")), ((" << a9.a0.a0 << ", "
4434 << a9.a0.a1 << ", " << a9.a0.a2 << ")))" << "\n";
4435
4436 double result = 0;
4437
4438 result += a0.a0.a0;
4439 result += a0.a0.a1;
4440 result += a0.a0.a2;
4441 result += a1.a0.a0;
4442 result += a1.a0.a1;
4443 result += a1.a0.a2;
4444 result += a2.a0.a0;
4445 result += a2.a0.a1;
4446 result += a2.a0.a2;
4447 result += a3.a0.a0;
4448 result += a3.a0.a1;
4449 result += a3.a0.a2;
4450 result += a4.a0.a0;
4451 result += a4.a0.a1;
4452 result += a4.a0.a2;
4453 result += a5.a0.a0;
4454 result += a5.a0.a1;
4455 result += a5.a0.a2;
4456 result += a6.a0.a0;
4457 result += a6.a0.a1;
4458 result += a6.a0.a2;
4459 result += a7.a0.a0;
4460 result += a7.a0.a1;
4461 result += a7.a0.a2;
4462 result += a8.a0.a0;
4463 result += a8.a0.a1;
4464 result += a8.a0.a2;
4465 result += a9.a0.a0;
4466 result += a9.a0.a1;
4467 result += a9.a0.a2;
4468
4469 std::cout << "result = " << result << "\n";
4470
4471 return result;
4472}
4473
4474// Used for testing structs and unions by value.
4475// Union with homogenous floats.
4487 std::cout << "PassUnion16BytesNestedInlineArrayFloatx10" << "(([" << a0.a0[0]
4488 << ", " << a0.a0[1] << ", " << a0.a0[2] << ", " << a0.a0[3]
4489 << "]), ([" << a1.a0[0] << ", " << a1.a0[1] << ", " << a1.a0[2]
4490 << ", " << a1.a0[3] << "]), ([" << a2.a0[0] << ", " << a2.a0[1]
4491 << ", " << a2.a0[2] << ", " << a2.a0[3] << "]), ([" << a3.a0[0]
4492 << ", " << a3.a0[1] << ", " << a3.a0[2] << ", " << a3.a0[3]
4493 << "]), ([" << a4.a0[0] << ", " << a4.a0[1] << ", " << a4.a0[2]
4494 << ", " << a4.a0[3] << "]), ([" << a5.a0[0] << ", " << a5.a0[1]
4495 << ", " << a5.a0[2] << ", " << a5.a0[3] << "]), ([" << a6.a0[0]
4496 << ", " << a6.a0[1] << ", " << a6.a0[2] << ", " << a6.a0[3]
4497 << "]), ([" << a7.a0[0] << ", " << a7.a0[1] << ", " << a7.a0[2]
4498 << ", " << a7.a0[3] << "]), ([" << a8.a0[0] << ", " << a8.a0[1]
4499 << ", " << a8.a0[2] << ", " << a8.a0[3] << "]), ([" << a9.a0[0]
4500 << ", " << a9.a0[1] << ", " << a9.a0[2] << ", " << a9.a0[3] << "]))"
4501 << "\n";
4502
4503 double result = 0;
4504
4505 result += a0.a0[0];
4506 result += a0.a0[1];
4507 result += a0.a0[2];
4508 result += a0.a0[3];
4509 result += a1.a0[0];
4510 result += a1.a0[1];
4511 result += a1.a0[2];
4512 result += a1.a0[3];
4513 result += a2.a0[0];
4514 result += a2.a0[1];
4515 result += a2.a0[2];
4516 result += a2.a0[3];
4517 result += a3.a0[0];
4518 result += a3.a0[1];
4519 result += a3.a0[2];
4520 result += a3.a0[3];
4521 result += a4.a0[0];
4522 result += a4.a0[1];
4523 result += a4.a0[2];
4524 result += a4.a0[3];
4525 result += a5.a0[0];
4526 result += a5.a0[1];
4527 result += a5.a0[2];
4528 result += a5.a0[3];
4529 result += a6.a0[0];
4530 result += a6.a0[1];
4531 result += a6.a0[2];
4532 result += a6.a0[3];
4533 result += a7.a0[0];
4534 result += a7.a0[1];
4535 result += a7.a0[2];
4536 result += a7.a0[3];
4537 result += a8.a0[0];
4538 result += a8.a0[1];
4539 result += a8.a0[2];
4540 result += a8.a0[3];
4541 result += a9.a0[0];
4542 result += a9.a0[1];
4543 result += a9.a0[2];
4544 result += a9.a0[3];
4545
4546 std::cout << "result = " << result << "\n";
4547
4548 return result;
4549}
4550
4551// Used for testing structs and unions by value.
4552// Union with homogenous floats.
4563 std::cout << "PassUnion16BytesNestedFloatx10" << "(((" << a0.a0.a0 << ", "
4564 << a0.a0.a1 << ")), ((" << a1.a0.a0 << ", " << a1.a0.a1 << ")), (("
4565 << a2.a0.a0 << ", " << a2.a0.a1 << ")), ((" << a3.a0.a0 << ", "
4566 << a3.a0.a1 << ")), ((" << a4.a0.a0 << ", " << a4.a0.a1 << ")), (("
4567 << a5.a0.a0 << ", " << a5.a0.a1 << ")), ((" << a6.a0.a0 << ", "
4568 << a6.a0.a1 << ")), ((" << a7.a0.a0 << ", " << a7.a0.a1 << ")), (("
4569 << a8.a0.a0 << ", " << a8.a0.a1 << ")), ((" << a9.a0.a0 << ", "
4570 << a9.a0.a1 << ")))" << "\n";
4571
4572 double result = 0;
4573
4574 result += a0.a0.a0;
4575 result += a0.a0.a1;
4576 result += a1.a0.a0;
4577 result += a1.a0.a1;
4578 result += a2.a0.a0;
4579 result += a2.a0.a1;
4580 result += a3.a0.a0;
4581 result += a3.a0.a1;
4582 result += a4.a0.a0;
4583 result += a4.a0.a1;
4584 result += a5.a0.a0;
4585 result += a5.a0.a1;
4586 result += a6.a0.a0;
4587 result += a6.a0.a1;
4588 result += a7.a0.a0;
4589 result += a7.a0.a1;
4590 result += a8.a0.a0;
4591 result += a8.a0.a1;
4592 result += a9.a0.a0;
4593 result += a9.a0.a1;
4594
4595 std::cout << "result = " << result << "\n";
4596
4597 return result;
4598}
4599
4600// Used for testing structs and unions by value.
4601// Passing bools and a struct with bools.
4602// Exhausts the registers to test bools and the bool struct alignment on the
4603// stack.
4605 uint8_t a0,
4606 bool a1,
4607 bool a2,
4608 bool a3,
4609 bool a4,
4610 bool a5,
4611 bool a6,
4612 bool a7,
4613 bool a8,
4614 bool a9,
4616 bool a11) {
4617 std::cout << "PassUint8Boolx9Struct10BytesHomogeneousBoolBool" << "("
4618 << static_cast<int>(a0) << ", " << a1 << ", " << a2 << ", " << a3
4619 << ", " << a4 << ", " << a5 << ", " << a6 << ", " << a7 << ", "
4620 << a8 << ", " << a9 << ", (" << a10.a0 << ", " << a10.a1 << ", "
4621 << a10.a2 << ", " << a10.a3 << ", " << a10.a4 << ", " << a10.a5
4622 << ", " << a10.a6 << ", " << a10.a7 << ", " << a10.a8 << ", "
4623 << a10.a9 << "), " << a11 << ")" << "\n";
4624
4625 int32_t result = 0;
4626
4627 result += a0;
4628 result += a1 ? 1 : 0;
4629 result += a2 ? 1 : 0;
4630 result += a3 ? 1 : 0;
4631 result += a4 ? 1 : 0;
4632 result += a5 ? 1 : 0;
4633 result += a6 ? 1 : 0;
4634 result += a7 ? 1 : 0;
4635 result += a8 ? 1 : 0;
4636 result += a9 ? 1 : 0;
4637 result += a10.a0 ? 1 : 0;
4638 result += a10.a1 ? 1 : 0;
4639 result += a10.a2 ? 1 : 0;
4640 result += a10.a3 ? 1 : 0;
4641 result += a10.a4 ? 1 : 0;
4642 result += a10.a5 ? 1 : 0;
4643 result += a10.a6 ? 1 : 0;
4644 result += a10.a7 ? 1 : 0;
4645 result += a10.a8 ? 1 : 0;
4646 result += a10.a9 ? 1 : 0;
4647 result += a11 ? 1 : 0;
4648
4649 std::cout << "result = " << result << "\n";
4650
4651 return result;
4652}
4653
4654// Used for testing structs and unions by value.
4655// Passing bools and a struct with bools.
4656// Exhausts the registers to test bools and the bool struct alignment on the
4657// stack.
4659 uint8_t a0,
4660 bool a1,
4661 bool a2,
4662 bool a3,
4663 bool a4,
4664 bool a5,
4665 bool a6,
4666 bool a7,
4667 bool a8,
4668 bool a9,
4670 bool a11) {
4671 std::cout << "PassUint8Boolx9Struct10BytesInlineArrayBoolBool" << "("
4672 << static_cast<int>(a0) << ", " << a1 << ", " << a2 << ", " << a3
4673 << ", " << a4 << ", " << a5 << ", " << a6 << ", " << a7 << ", "
4674 << a8 << ", " << a9 << ", ([" << a10.a0[0] << ", " << a10.a0[1]
4675 << ", " << a10.a0[2] << ", " << a10.a0[3] << ", " << a10.a0[4]
4676 << ", " << a10.a0[5] << ", " << a10.a0[6] << ", " << a10.a0[7]
4677 << ", " << a10.a0[8] << ", " << a10.a0[9] << "]), " << a11 << ")"
4678 << "\n";
4679
4680 int32_t result = 0;
4681
4682 result += a0;
4683 result += a1 ? 1 : 0;
4684 result += a2 ? 1 : 0;
4685 result += a3 ? 1 : 0;
4686 result += a4 ? 1 : 0;
4687 result += a5 ? 1 : 0;
4688 result += a6 ? 1 : 0;
4689 result += a7 ? 1 : 0;
4690 result += a8 ? 1 : 0;
4691 result += a9 ? 1 : 0;
4692 result += a10.a0[0] ? 1 : 0;
4693 result += a10.a0[1] ? 1 : 0;
4694 result += a10.a0[2] ? 1 : 0;
4695 result += a10.a0[3] ? 1 : 0;
4696 result += a10.a0[4] ? 1 : 0;
4697 result += a10.a0[5] ? 1 : 0;
4698 result += a10.a0[6] ? 1 : 0;
4699 result += a10.a0[7] ? 1 : 0;
4700 result += a10.a0[8] ? 1 : 0;
4701 result += a10.a0[9] ? 1 : 0;
4702 result += a11 ? 1 : 0;
4703
4704 std::cout << "result = " << result << "\n";
4705
4706 return result;
4707}
4708
4709// Used for testing structs and unions by value.
4710// Returning a bool.
4712 std::cout << "PassUint8Struct1ByteBool" << "(" << static_cast<int>(a0)
4713 << ", (" << a1.a0 << "))" << "\n";
4714
4715 uint64_t result = 0;
4716
4717 result += a0;
4718 result += a1.a0 ? 1 : 0;
4719
4720 std::cout << "result = " << result << "\n";
4721
4722 return result % 2 != 0;
4723}
4724
4725// Used for testing structs and unions by value.
4726// Returning a wchar.
4728 wchar_t a0,
4730 uintptr_t a2,
4731 uintptr_t a3,
4732 /* NOLINT(runtime/int) */ long a4,
4733 /* NOLINT(runtime/int) */ unsigned long a5) {
4734 std::cout << "PassWCharStructInlineArrayIntUintPtrx2LongUnsigned" << "(" << a0
4735 << ", ([" << a1.a0[0] << ", " << a1.a0[1] << ", " << a1.a0[2]
4736 << ", " << a1.a0[3] << ", " << a1.a0[4] << ", " << a1.a0[5] << ", "
4737 << a1.a0[6] << ", " << a1.a0[7] << ", " << a1.a0[8] << ", "
4738 << a1.a0[9] << "]), " << a2 << ", " << a3 << ", " << a4 << ", "
4739 << a5 << ")" << "\n";
4740
4741 wchar_t result = 0;
4742
4743 result += a0;
4744 result += a1.a0[0];
4745 result += a1.a0[1];
4746 result += a1.a0[2];
4747 result += a1.a0[3];
4748 result += a1.a0[4];
4749 result += a1.a0[5];
4750 result += a1.a0[6];
4751 result += a1.a0[7];
4752 result += a1.a0[8];
4753 result += a1.a0[9];
4754 result += a2;
4755 result += a3;
4756 result += a4;
4757 result += a5;
4758
4759 std::cout << "result = " << result << "\n";
4760
4761 return result;
4762}
4763
4764// Used for testing structs and unions by value.
4765// Struct stradles last argument register
4766DART_EXPORT int64_t
4768 int64_t a1,
4769 int64_t a2,
4770 int64_t a3,
4771 int64_t a4,
4772 int64_t a5,
4773 int64_t a6,
4775 std::cout << "PassInt64x7Struct12BytesHomogeneousInt32" << "(" << a0 << ", "
4776 << a1 << ", " << a2 << ", " << a3 << ", " << a4 << ", " << a5
4777 << ", " << a6 << ", (" << a7.a0 << ", " << a7.a1 << ", " << a7.a2
4778 << "))" << "\n";
4779
4780 int64_t result = 0;
4781
4782 result += a0;
4783 result += a1;
4784 result += a2;
4785 result += a3;
4786 result += a4;
4787 result += a5;
4788 result += a6;
4789 result += a7.a0;
4790 result += a7.a1;
4791 result += a7.a2;
4792
4793 std::cout << "result = " << result << "\n";
4794
4795 return result;
4796}
4797
4798// Used for testing structs and unions by value.
4799// Smallest struct with data.
4801 std::cout << "ReturnStruct1ByteInt" << "(" << static_cast<int>(a0) << ")"
4802 << "\n";
4803
4805
4806 result.a0 = a0;
4807
4808 std::cout << "result = " << "(" << static_cast<int>(result.a0) << ")" << "\n";
4809
4810 return result;
4811}
4812
4813// Used for testing structs and unions by value.
4814// Smaller than word size return value on all architectures.
4815DART_EXPORT Struct3BytesHomogeneousUint8
4816ReturnStruct3BytesHomogeneousUint8(uint8_t a0, uint8_t a1, uint8_t a2) {
4817 std::cout << "ReturnStruct3BytesHomogeneousUint8" << "("
4818 << static_cast<int>(a0) << ", " << static_cast<int>(a1) << ", "
4819 << static_cast<int>(a2) << ")" << "\n";
4820
4822
4823 result.a0 = a0;
4824 result.a1 = a1;
4825 result.a2 = a2;
4826
4827 std::cout << "result = " << "(" << static_cast<int>(result.a0) << ", "
4828 << static_cast<int>(result.a1) << ", "
4829 << static_cast<int>(result.a2) << ")" << "\n";
4830
4831 return result;
4832}
4833
4834// Used for testing structs and unions by value.
4835// Smaller than word size return value on all architectures.
4836// With alignment rules taken into account size is 4 bytes.
4837DART_EXPORT Struct3BytesInt2ByteAligned
4839 std::cout << "ReturnStruct3BytesInt2ByteAligned" << "(" << a0 << ", "
4840 << static_cast<int>(a1) << ")" << "\n";
4841
4843
4844 result.a0 = a0;
4845 result.a1 = a1;
4846
4847 std::cout << "result = " << "(" << result.a0 << ", "
4848 << static_cast<int>(result.a1) << ")" << "\n";
4849
4850 return result;
4851}
4852
4853// Used for testing structs and unions by value.
4854// Word size return value on 32 bit architectures..
4855DART_EXPORT Struct4BytesHomogeneousInt16
4856ReturnStruct4BytesHomogeneousInt16(int16_t a0, int16_t a1) {
4857 std::cout << "ReturnStruct4BytesHomogeneousInt16" << "(" << a0 << ", " << a1
4858 << ")" << "\n";
4859
4861
4862 result.a0 = a0;
4863 result.a1 = a1;
4864
4865 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ")"
4866 << "\n";
4867
4868 return result;
4869}
4870
4871// Used for testing structs and unions by value.
4872// Non-wordsize return value.
4873DART_EXPORT Struct7BytesHomogeneousUint8
4875 uint8_t a1,
4876 uint8_t a2,
4877 uint8_t a3,
4878 uint8_t a4,
4879 uint8_t a5,
4880 uint8_t a6) {
4881 std::cout << "ReturnStruct7BytesHomogeneousUint8" << "("
4882 << static_cast<int>(a0) << ", " << static_cast<int>(a1) << ", "
4883 << static_cast<int>(a2) << ", " << static_cast<int>(a3) << ", "
4884 << static_cast<int>(a4) << ", " << static_cast<int>(a5) << ", "
4885 << static_cast<int>(a6) << ")" << "\n";
4886
4888
4889 result.a0 = a0;
4890 result.a1 = a1;
4891 result.a2 = a2;
4892 result.a3 = a3;
4893 result.a4 = a4;
4894 result.a5 = a5;
4895 result.a6 = a6;
4896
4897 std::cout << "result = " << "(" << static_cast<int>(result.a0) << ", "
4898 << static_cast<int>(result.a1) << ", "
4899 << static_cast<int>(result.a2) << ", "
4900 << static_cast<int>(result.a3) << ", "
4901 << static_cast<int>(result.a4) << ", "
4902 << static_cast<int>(result.a5) << ", "
4903 << static_cast<int>(result.a6) << ")" << "\n";
4904
4905 return result;
4906}
4907
4908// Used for testing structs and unions by value.
4909// Non-wordsize return value.
4910// With alignment rules taken into account size is 8 bytes.
4911DART_EXPORT Struct7BytesInt4ByteAligned
4912ReturnStruct7BytesInt4ByteAligned(int32_t a0, int16_t a1, int8_t a2) {
4913 std::cout << "ReturnStruct7BytesInt4ByteAligned" << "(" << a0 << ", " << a1
4914 << ", " << static_cast<int>(a2) << ")" << "\n";
4915
4917
4918 result.a0 = a0;
4919 result.a1 = a1;
4920 result.a2 = a2;
4921
4922 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ", "
4923 << static_cast<int>(result.a2) << ")" << "\n";
4924
4925 return result;
4926}
4927
4928// Used for testing structs and unions by value.
4929// Return value in integer registers on many architectures.
4931 int16_t a1,
4932 int32_t a2) {
4933 std::cout << "ReturnStruct8BytesInt" << "(" << a0 << ", " << a1 << ", " << a2
4934 << ")" << "\n";
4935
4937
4938 result.a0 = a0;
4939 result.a1 = a1;
4940 result.a2 = a2;
4941
4942 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ", "
4943 << result.a2 << ")" << "\n";
4944
4945 return result;
4946}
4947
4948// Used for testing structs and unions by value.
4949// Return value in FP registers on many architectures.
4950DART_EXPORT Struct8BytesHomogeneousFloat
4952 std::cout << "ReturnStruct8BytesHomogeneousFloat" << "(" << a0 << ", " << a1
4953 << ")" << "\n";
4954
4956
4957 result.a0 = a0;
4958 result.a1 = a1;
4959
4960 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ")"
4961 << "\n";
4962
4963 return result;
4964}
4965
4966// Used for testing structs and unions by value.
4967// Return value split over FP and integer register in x64.
4969 int16_t a1,
4970 int16_t a2) {
4971 std::cout << "ReturnStruct8BytesMixed" << "(" << a0 << ", " << a1 << ", "
4972 << a2 << ")" << "\n";
4973
4975
4976 result.a0 = a0;
4977 result.a1 = a1;
4978 result.a2 = a2;
4979
4980 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ", "
4981 << result.a2 << ")" << "\n";
4982
4983 return result;
4984}
4985
4986// Used for testing structs and unions by value.
4987// The minimum alignment of this struct is only 1 byte based on its fields.
4988// Test that the memory backing these structs is the right size and that
4989// dart:ffi trampolines do not write outside this size.
4990DART_EXPORT Struct9BytesHomogeneousUint8
4992 uint8_t a1,
4993 uint8_t a2,
4994 uint8_t a3,
4995 uint8_t a4,
4996 uint8_t a5,
4997 uint8_t a6,
4998 uint8_t a7,
4999 uint8_t a8) {
5000 std::cout << "ReturnStruct9BytesHomogeneousUint8" << "("
5001 << static_cast<int>(a0) << ", " << static_cast<int>(a1) << ", "
5002 << static_cast<int>(a2) << ", " << static_cast<int>(a3) << ", "
5003 << static_cast<int>(a4) << ", " << static_cast<int>(a5) << ", "
5004 << static_cast<int>(a6) << ", " << static_cast<int>(a7) << ", "
5005 << static_cast<int>(a8) << ")" << "\n";
5006
5008
5009 result.a0 = a0;
5010 result.a1 = a1;
5011 result.a2 = a2;
5012 result.a3 = a3;
5013 result.a4 = a4;
5014 result.a5 = a5;
5015 result.a6 = a6;
5016 result.a7 = a7;
5017 result.a8 = a8;
5018
5019 std::cout << "result = " << "(" << static_cast<int>(result.a0) << ", "
5020 << static_cast<int>(result.a1) << ", "
5021 << static_cast<int>(result.a2) << ", "
5022 << static_cast<int>(result.a3) << ", "
5023 << static_cast<int>(result.a4) << ", "
5024 << static_cast<int>(result.a5) << ", "
5025 << static_cast<int>(result.a6) << ", "
5026 << static_cast<int>(result.a7) << ", "
5027 << static_cast<int>(result.a8) << ")" << "\n";
5028
5029 return result;
5030}
5031
5032// Used for testing structs and unions by value.
5033// Return value in two integer registers on x64.
5034// With alignment rules taken into account size is 12 or 16 bytes.
5035DART_EXPORT Struct9BytesInt4Or8ByteAligned
5037 std::cout << "ReturnStruct9BytesInt4Or8ByteAligned" << "(" << a0 << ", "
5038 << static_cast<int>(a1) << ")" << "\n";
5039
5041
5042 result.a0 = a0;
5043 result.a1 = a1;
5044
5045 std::cout << "result = " << "(" << result.a0 << ", "
5046 << static_cast<int>(result.a1) << ")" << "\n";
5047
5048 return result;
5049}
5050
5051// Used for testing structs and unions by value.
5052// Return value in FPU registers, but does not use all registers on arm hardfp
5053// and arm64.
5054DART_EXPORT Struct12BytesHomogeneousFloat
5055ReturnStruct12BytesHomogeneousFloat(float a0, float a1, float a2) {
5056 std::cout << "ReturnStruct12BytesHomogeneousFloat" << "(" << a0 << ", " << a1
5057 << ", " << a2 << ")" << "\n";
5058
5060
5061 result.a0 = a0;
5062 result.a1 = a1;
5063 result.a2 = a2;
5064
5065 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ", "
5066 << result.a2 << ")" << "\n";
5067
5068 return result;
5069}
5070
5071// Used for testing structs and unions by value.
5072// Return value in FPU registers on arm hardfp and arm64.
5073DART_EXPORT Struct16BytesHomogeneousFloat
5074ReturnStruct16BytesHomogeneousFloat(float a0, float a1, float a2, float a3) {
5075 std::cout << "ReturnStruct16BytesHomogeneousFloat" << "(" << a0 << ", " << a1
5076 << ", " << a2 << ", " << a3 << ")" << "\n";
5077
5079
5080 result.a0 = a0;
5081 result.a1 = a1;
5082 result.a2 = a2;
5083 result.a3 = a3;
5084
5085 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ", "
5086 << result.a2 << ", " << result.a3 << ")" << "\n";
5087
5088 return result;
5089}
5090
5091// Used for testing structs and unions by value.
5092// Return value split over FP and integer register in x64.
5094 std::cout << "ReturnStruct16BytesMixed" << "(" << a0 << ", " << a1 << ")"
5095 << "\n";
5096
5098
5099 result.a0 = a0;
5100 result.a1 = a1;
5101
5102 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ")"
5103 << "\n";
5104
5105 return result;
5106}
5107
5108// Used for testing structs and unions by value.
5109// Return value split over FP and integer register in x64.
5110// The integer register contains half float half int.
5112 float a1,
5113 float a2,
5114 int32_t a3) {
5115 std::cout << "ReturnStruct16BytesMixed2" << "(" << a0 << ", " << a1 << ", "
5116 << a2 << ", " << a3 << ")" << "\n";
5117
5119
5120 result.a0 = a0;
5121 result.a1 = a1;
5122 result.a2 = a2;
5123 result.a3 = a3;
5124
5125 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ", "
5126 << result.a2 << ", " << result.a3 << ")" << "\n";
5127
5128 return result;
5129}
5130
5131// Used for testing structs and unions by value.
5132// Return value returned in preallocated space passed by pointer on most ABIs.
5133// Is non word size on purpose, to test that structs are rounded up to word size
5134// on all ABIs.
5136 int64_t a1,
5137 int8_t a2) {
5138 std::cout << "ReturnStruct17BytesInt" << "(" << a0 << ", " << a1 << ", "
5139 << static_cast<int>(a2) << ")" << "\n";
5140
5142
5143 result.a0 = a0;
5144 result.a1 = a1;
5145 result.a2 = a2;
5146
5147 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ", "
5148 << static_cast<int>(result.a2) << ")" << "\n";
5149
5150 return result;
5151}
5152
5153// Used for testing structs and unions by value.
5154// The minimum alignment of this struct is only 1 byte based on its fields.
5155// Test that the memory backing these structs is the right size and that
5156// dart:ffi trampolines do not write outside this size.
5157DART_EXPORT Struct19BytesHomogeneousUint8
5159 uint8_t a1,
5160 uint8_t a2,
5161 uint8_t a3,
5162 uint8_t a4,
5163 uint8_t a5,
5164 uint8_t a6,
5165 uint8_t a7,
5166 uint8_t a8,
5167 uint8_t a9,
5168 uint8_t a10,
5169 uint8_t a11,
5170 uint8_t a12,
5171 uint8_t a13,
5172 uint8_t a14,
5173 uint8_t a15,
5174 uint8_t a16,
5175 uint8_t a17,
5176 uint8_t a18) {
5177 std::cout << "ReturnStruct19BytesHomogeneousUint8" << "("
5178 << static_cast<int>(a0) << ", " << static_cast<int>(a1) << ", "
5179 << static_cast<int>(a2) << ", " << static_cast<int>(a3) << ", "
5180 << static_cast<int>(a4) << ", " << static_cast<int>(a5) << ", "
5181 << static_cast<int>(a6) << ", " << static_cast<int>(a7) << ", "
5182 << static_cast<int>(a8) << ", " << static_cast<int>(a9) << ", "
5183 << static_cast<int>(a10) << ", " << static_cast<int>(a11) << ", "
5184 << static_cast<int>(a12) << ", " << static_cast<int>(a13) << ", "
5185 << static_cast<int>(a14) << ", " << static_cast<int>(a15) << ", "
5186 << static_cast<int>(a16) << ", " << static_cast<int>(a17) << ", "
5187 << static_cast<int>(a18) << ")" << "\n";
5188
5190
5191 result.a0 = a0;
5192 result.a1 = a1;
5193 result.a2 = a2;
5194 result.a3 = a3;
5195 result.a4 = a4;
5196 result.a5 = a5;
5197 result.a6 = a6;
5198 result.a7 = a7;
5199 result.a8 = a8;
5200 result.a9 = a9;
5201 result.a10 = a10;
5202 result.a11 = a11;
5203 result.a12 = a12;
5204 result.a13 = a13;
5205 result.a14 = a14;
5206 result.a15 = a15;
5207 result.a16 = a16;
5208 result.a17 = a17;
5209 result.a18 = a18;
5210
5211 std::cout << "result = " << "(" << static_cast<int>(result.a0) << ", "
5212 << static_cast<int>(result.a1) << ", "
5213 << static_cast<int>(result.a2) << ", "
5214 << static_cast<int>(result.a3) << ", "
5215 << static_cast<int>(result.a4) << ", "
5216 << static_cast<int>(result.a5) << ", "
5217 << static_cast<int>(result.a6) << ", "
5218 << static_cast<int>(result.a7) << ", "
5219 << static_cast<int>(result.a8) << ", "
5220 << static_cast<int>(result.a9) << ", "
5221 << static_cast<int>(result.a10) << ", "
5222 << static_cast<int>(result.a11) << ", "
5223 << static_cast<int>(result.a12) << ", "
5224 << static_cast<int>(result.a13) << ", "
5225 << static_cast<int>(result.a14) << ", "
5226 << static_cast<int>(result.a15) << ", "
5227 << static_cast<int>(result.a16) << ", "
5228 << static_cast<int>(result.a17) << ", "
5229 << static_cast<int>(result.a18) << ")" << "\n";
5230
5231 return result;
5232}
5233
5234// Used for testing structs and unions by value.
5235// Return value too big to go in cpu registers on arm64.
5236DART_EXPORT Struct20BytesHomogeneousInt32
5238 int32_t a1,
5239 int32_t a2,
5240 int32_t a3,
5241 int32_t a4) {
5242 std::cout << "ReturnStruct20BytesHomogeneousInt32" << "(" << a0 << ", " << a1
5243 << ", " << a2 << ", " << a3 << ", " << a4 << ")" << "\n";
5244
5246
5247 result.a0 = a0;
5248 result.a1 = a1;
5249 result.a2 = a2;
5250 result.a3 = a3;
5251 result.a4 = a4;
5252
5253 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ", "
5254 << result.a2 << ", " << result.a3 << ", " << result.a4 << ")"
5255 << "\n";
5256
5257 return result;
5258}
5259
5260// Used for testing structs and unions by value.
5261// Return value too big to go in FPU registers on x64, arm hardfp and arm64.
5262DART_EXPORT Struct20BytesHomogeneousFloat
5264 float a1,
5265 float a2,
5266 float a3,
5267 float a4) {
5268 std::cout << "ReturnStruct20BytesHomogeneousFloat" << "(" << a0 << ", " << a1
5269 << ", " << a2 << ", " << a3 << ", " << a4 << ")" << "\n";
5270
5272
5273 result.a0 = a0;
5274 result.a1 = a1;
5275 result.a2 = a2;
5276 result.a3 = a3;
5277 result.a4 = a4;
5278
5279 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ", "
5280 << result.a2 << ", " << result.a3 << ", " << result.a4 << ")"
5281 << "\n";
5282
5283 return result;
5284}
5285
5286// Used for testing structs and unions by value.
5287// Return value in FPU registers on arm64.
5288DART_EXPORT Struct32BytesHomogeneousDouble
5290 double a1,
5291 double a2,
5292 double a3) {
5293 std::cout << "ReturnStruct32BytesHomogeneousDouble" << "(" << a0 << ", " << a1
5294 << ", " << a2 << ", " << a3 << ")" << "\n";
5295
5297
5298 result.a0 = a0;
5299 result.a1 = a1;
5300 result.a2 = a2;
5301 result.a3 = a3;
5302
5303 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ", "
5304 << result.a2 << ", " << result.a3 << ")" << "\n";
5305
5306 return result;
5307}
5308
5309// Used for testing structs and unions by value.
5310// Return value too big to go in FPU registers on arm64.
5311DART_EXPORT Struct40BytesHomogeneousDouble
5313 double a1,
5314 double a2,
5315 double a3,
5316 double a4) {
5317 std::cout << "ReturnStruct40BytesHomogeneousDouble" << "(" << a0 << ", " << a1
5318 << ", " << a2 << ", " << a3 << ", " << a4 << ")" << "\n";
5319
5321
5322 result.a0 = a0;
5323 result.a1 = a1;
5324 result.a2 = a2;
5325 result.a3 = a3;
5326 result.a4 = a4;
5327
5328 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ", "
5329 << result.a2 << ", " << result.a3 << ", " << result.a4 << ")"
5330 << "\n";
5331
5332 return result;
5333}
5334
5335// Used for testing structs and unions by value.
5336// Test 1kb struct.
5337DART_EXPORT Struct1024BytesHomogeneousUint64
5339 uint64_t a1,
5340 uint64_t a2,
5341 uint64_t a3,
5342 uint64_t a4,
5343 uint64_t a5,
5344 uint64_t a6,
5345 uint64_t a7,
5346 uint64_t a8,
5347 uint64_t a9,
5348 uint64_t a10,
5349 uint64_t a11,
5350 uint64_t a12,
5351 uint64_t a13,
5352 uint64_t a14,
5353 uint64_t a15,
5354 uint64_t a16,
5355 uint64_t a17,
5356 uint64_t a18,
5357 uint64_t a19,
5358 uint64_t a20,
5359 uint64_t a21,
5360 uint64_t a22,
5361 uint64_t a23,
5362 uint64_t a24,
5363 uint64_t a25,
5364 uint64_t a26,
5365 uint64_t a27,
5366 uint64_t a28,
5367 uint64_t a29,
5368 uint64_t a30,
5369 uint64_t a31,
5370 uint64_t a32,
5371 uint64_t a33,
5372 uint64_t a34,
5373 uint64_t a35,
5374 uint64_t a36,
5375 uint64_t a37,
5376 uint64_t a38,
5377 uint64_t a39,
5378 uint64_t a40,
5379 uint64_t a41,
5380 uint64_t a42,
5381 uint64_t a43,
5382 uint64_t a44,
5383 uint64_t a45,
5384 uint64_t a46,
5385 uint64_t a47,
5386 uint64_t a48,
5387 uint64_t a49,
5388 uint64_t a50,
5389 uint64_t a51,
5390 uint64_t a52,
5391 uint64_t a53,
5392 uint64_t a54,
5393 uint64_t a55,
5394 uint64_t a56,
5395 uint64_t a57,
5396 uint64_t a58,
5397 uint64_t a59,
5398 uint64_t a60,
5399 uint64_t a61,
5400 uint64_t a62,
5401 uint64_t a63,
5402 uint64_t a64,
5403 uint64_t a65,
5404 uint64_t a66,
5405 uint64_t a67,
5406 uint64_t a68,
5407 uint64_t a69,
5408 uint64_t a70,
5409 uint64_t a71,
5410 uint64_t a72,
5411 uint64_t a73,
5412 uint64_t a74,
5413 uint64_t a75,
5414 uint64_t a76,
5415 uint64_t a77,
5416 uint64_t a78,
5417 uint64_t a79,
5418 uint64_t a80,
5419 uint64_t a81,
5420 uint64_t a82,
5421 uint64_t a83,
5422 uint64_t a84,
5423 uint64_t a85,
5424 uint64_t a86,
5425 uint64_t a87,
5426 uint64_t a88,
5427 uint64_t a89,
5428 uint64_t a90,
5429 uint64_t a91,
5430 uint64_t a92,
5431 uint64_t a93,
5432 uint64_t a94,
5433 uint64_t a95,
5434 uint64_t a96,
5435 uint64_t a97,
5436 uint64_t a98,
5437 uint64_t a99,
5438 uint64_t a100,
5439 uint64_t a101,
5440 uint64_t a102,
5441 uint64_t a103,
5442 uint64_t a104,
5443 uint64_t a105,
5444 uint64_t a106,
5445 uint64_t a107,
5446 uint64_t a108,
5447 uint64_t a109,
5448 uint64_t a110,
5449 uint64_t a111,
5450 uint64_t a112,
5451 uint64_t a113,
5452 uint64_t a114,
5453 uint64_t a115,
5454 uint64_t a116,
5455 uint64_t a117,
5456 uint64_t a118,
5457 uint64_t a119,
5458 uint64_t a120,
5459 uint64_t a121,
5460 uint64_t a122,
5461 uint64_t a123,
5462 uint64_t a124,
5463 uint64_t a125,
5464 uint64_t a126,
5465 uint64_t a127) {
5466 std::cout << "ReturnStruct1024BytesHomogeneousUint64" << "(" << a0 << ", "
5467 << a1 << ", " << a2 << ", " << a3 << ", " << a4 << ", " << a5
5468 << ", " << a6 << ", " << a7 << ", " << a8 << ", " << a9 << ", "
5469 << a10 << ", " << a11 << ", " << a12 << ", " << a13 << ", " << a14
5470 << ", " << a15 << ", " << a16 << ", " << a17 << ", " << a18 << ", "
5471 << a19 << ", " << a20 << ", " << a21 << ", " << a22 << ", " << a23
5472 << ", " << a24 << ", " << a25 << ", " << a26 << ", " << a27 << ", "
5473 << a28 << ", " << a29 << ", " << a30 << ", " << a31 << ", " << a32
5474 << ", " << a33 << ", " << a34 << ", " << a35 << ", " << a36 << ", "
5475 << a37 << ", " << a38 << ", " << a39 << ", " << a40 << ", " << a41
5476 << ", " << a42 << ", " << a43 << ", " << a44 << ", " << a45 << ", "
5477 << a46 << ", " << a47 << ", " << a48 << ", " << a49 << ", " << a50
5478 << ", " << a51 << ", " << a52 << ", " << a53 << ", " << a54 << ", "
5479 << a55 << ", " << a56 << ", " << a57 << ", " << a58 << ", " << a59
5480 << ", " << a60 << ", " << a61 << ", " << a62 << ", " << a63 << ", "
5481 << a64 << ", " << a65 << ", " << a66 << ", " << a67 << ", " << a68
5482 << ", " << a69 << ", " << a70 << ", " << a71 << ", " << a72 << ", "
5483 << a73 << ", " << a74 << ", " << a75 << ", " << a76 << ", " << a77
5484 << ", " << a78 << ", " << a79 << ", " << a80 << ", " << a81 << ", "
5485 << a82 << ", " << a83 << ", " << a84 << ", " << a85 << ", " << a86
5486 << ", " << a87 << ", " << a88 << ", " << a89 << ", " << a90 << ", "
5487 << a91 << ", " << a92 << ", " << a93 << ", " << a94 << ", " << a95
5488 << ", " << a96 << ", " << a97 << ", " << a98 << ", " << a99 << ", "
5489 << a100 << ", " << a101 << ", " << a102 << ", " << a103 << ", "
5490 << a104 << ", " << a105 << ", " << a106 << ", " << a107 << ", "
5491 << a108 << ", " << a109 << ", " << a110 << ", " << a111 << ", "
5492 << a112 << ", " << a113 << ", " << a114 << ", " << a115 << ", "
5493 << a116 << ", " << a117 << ", " << a118 << ", " << a119 << ", "
5494 << a120 << ", " << a121 << ", " << a122 << ", " << a123 << ", "
5495 << a124 << ", " << a125 << ", " << a126 << ", " << a127 << ")"
5496 << "\n";
5497
5499
5500 result.a0 = a0;
5501 result.a1 = a1;
5502 result.a2 = a2;
5503 result.a3 = a3;
5504 result.a4 = a4;
5505 result.a5 = a5;
5506 result.a6 = a6;
5507 result.a7 = a7;
5508 result.a8 = a8;
5509 result.a9 = a9;
5510 result.a10 = a10;
5511 result.a11 = a11;
5512 result.a12 = a12;
5513 result.a13 = a13;
5514 result.a14 = a14;
5515 result.a15 = a15;
5516 result.a16 = a16;
5517 result.a17 = a17;
5518 result.a18 = a18;
5519 result.a19 = a19;
5520 result.a20 = a20;
5521 result.a21 = a21;
5522 result.a22 = a22;
5523 result.a23 = a23;
5524 result.a24 = a24;
5525 result.a25 = a25;
5526 result.a26 = a26;
5527 result.a27 = a27;
5528 result.a28 = a28;
5529 result.a29 = a29;
5530 result.a30 = a30;
5531 result.a31 = a31;
5532 result.a32 = a32;
5533 result.a33 = a33;
5534 result.a34 = a34;
5535 result.a35 = a35;
5536 result.a36 = a36;
5537 result.a37 = a37;
5538 result.a38 = a38;
5539 result.a39 = a39;
5540 result.a40 = a40;
5541 result.a41 = a41;
5542 result.a42 = a42;
5543 result.a43 = a43;
5544 result.a44 = a44;
5545 result.a45 = a45;
5546 result.a46 = a46;
5547 result.a47 = a47;
5548 result.a48 = a48;
5549 result.a49 = a49;
5550 result.a50 = a50;
5551 result.a51 = a51;
5552 result.a52 = a52;
5553 result.a53 = a53;
5554 result.a54 = a54;
5555 result.a55 = a55;
5556 result.a56 = a56;
5557 result.a57 = a57;
5558 result.a58 = a58;
5559 result.a59 = a59;
5560 result.a60 = a60;
5561 result.a61 = a61;
5562 result.a62 = a62;
5563 result.a63 = a63;
5564 result.a64 = a64;
5565 result.a65 = a65;
5566 result.a66 = a66;
5567 result.a67 = a67;
5568 result.a68 = a68;
5569 result.a69 = a69;
5570 result.a70 = a70;
5571 result.a71 = a71;
5572 result.a72 = a72;
5573 result.a73 = a73;
5574 result.a74 = a74;
5575 result.a75 = a75;
5576 result.a76 = a76;
5577 result.a77 = a77;
5578 result.a78 = a78;
5579 result.a79 = a79;
5580 result.a80 = a80;
5581 result.a81 = a81;
5582 result.a82 = a82;
5583 result.a83 = a83;
5584 result.a84 = a84;
5585 result.a85 = a85;
5586 result.a86 = a86;
5587 result.a87 = a87;
5588 result.a88 = a88;
5589 result.a89 = a89;
5590 result.a90 = a90;
5591 result.a91 = a91;
5592 result.a92 = a92;
5593 result.a93 = a93;
5594 result.a94 = a94;
5595 result.a95 = a95;
5596 result.a96 = a96;
5597 result.a97 = a97;
5598 result.a98 = a98;
5599 result.a99 = a99;
5600 result.a100 = a100;
5601 result.a101 = a101;
5602 result.a102 = a102;
5603 result.a103 = a103;
5604 result.a104 = a104;
5605 result.a105 = a105;
5606 result.a106 = a106;
5607 result.a107 = a107;
5608 result.a108 = a108;
5609 result.a109 = a109;
5610 result.a110 = a110;
5611 result.a111 = a111;
5612 result.a112 = a112;
5613 result.a113 = a113;
5614 result.a114 = a114;
5615 result.a115 = a115;
5616 result.a116 = a116;
5617 result.a117 = a117;
5618 result.a118 = a118;
5619 result.a119 = a119;
5620 result.a120 = a120;
5621 result.a121 = a121;
5622 result.a122 = a122;
5623 result.a123 = a123;
5624 result.a124 = a124;
5625 result.a125 = a125;
5626 result.a126 = a126;
5627 result.a127 = a127;
5628
5629 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ", "
5630 << result.a2 << ", " << result.a3 << ", " << result.a4 << ", "
5631 << result.a5 << ", " << result.a6 << ", " << result.a7 << ", "
5632 << result.a8 << ", " << result.a9 << ", " << result.a10 << ", "
5633 << result.a11 << ", " << result.a12 << ", " << result.a13 << ", "
5634 << result.a14 << ", " << result.a15 << ", " << result.a16 << ", "
5635 << result.a17 << ", " << result.a18 << ", " << result.a19 << ", "
5636 << result.a20 << ", " << result.a21 << ", " << result.a22 << ", "
5637 << result.a23 << ", " << result.a24 << ", " << result.a25 << ", "
5638 << result.a26 << ", " << result.a27 << ", " << result.a28 << ", "
5639 << result.a29 << ", " << result.a30 << ", " << result.a31 << ", "
5640 << result.a32 << ", " << result.a33 << ", " << result.a34 << ", "
5641 << result.a35 << ", " << result.a36 << ", " << result.a37 << ", "
5642 << result.a38 << ", " << result.a39 << ", " << result.a40 << ", "
5643 << result.a41 << ", " << result.a42 << ", " << result.a43 << ", "
5644 << result.a44 << ", " << result.a45 << ", " << result.a46 << ", "
5645 << result.a47 << ", " << result.a48 << ", " << result.a49 << ", "
5646 << result.a50 << ", " << result.a51 << ", " << result.a52 << ", "
5647 << result.a53 << ", " << result.a54 << ", " << result.a55 << ", "
5648 << result.a56 << ", " << result.a57 << ", " << result.a58 << ", "
5649 << result.a59 << ", " << result.a60 << ", " << result.a61 << ", "
5650 << result.a62 << ", " << result.a63 << ", " << result.a64 << ", "
5651 << result.a65 << ", " << result.a66 << ", " << result.a67 << ", "
5652 << result.a68 << ", " << result.a69 << ", " << result.a70 << ", "
5653 << result.a71 << ", " << result.a72 << ", " << result.a73 << ", "
5654 << result.a74 << ", " << result.a75 << ", " << result.a76 << ", "
5655 << result.a77 << ", " << result.a78 << ", " << result.a79 << ", "
5656 << result.a80 << ", " << result.a81 << ", " << result.a82 << ", "
5657 << result.a83 << ", " << result.a84 << ", " << result.a85 << ", "
5658 << result.a86 << ", " << result.a87 << ", " << result.a88 << ", "
5659 << result.a89 << ", " << result.a90 << ", " << result.a91 << ", "
5660 << result.a92 << ", " << result.a93 << ", " << result.a94 << ", "
5661 << result.a95 << ", " << result.a96 << ", " << result.a97 << ", "
5662 << result.a98 << ", " << result.a99 << ", " << result.a100 << ", "
5663 << result.a101 << ", " << result.a102 << ", " << result.a103 << ", "
5664 << result.a104 << ", " << result.a105 << ", " << result.a106 << ", "
5665 << result.a107 << ", " << result.a108 << ", " << result.a109 << ", "
5666 << result.a110 << ", " << result.a111 << ", " << result.a112 << ", "
5667 << result.a113 << ", " << result.a114 << ", " << result.a115 << ", "
5668 << result.a116 << ", " << result.a117 << ", " << result.a118 << ", "
5669 << result.a119 << ", " << result.a120 << ", " << result.a121 << ", "
5670 << result.a122 << ", " << result.a123 << ", " << result.a124 << ", "
5671 << result.a125 << ", " << result.a126 << ", " << result.a127 << ")"
5672 << "\n";
5673
5674 return result;
5675}
5676
5677// Used for testing structs and unions by value.
5678// Small struct with mis-aligned member.
5680 int16_t a1) {
5681 std::cout << "ReturnStruct3BytesPackedInt" << "(" << static_cast<int>(a0)
5682 << ", " << a1 << ")" << "\n";
5683
5685
5686 result.a0 = a0;
5687 result.a1 = a1;
5688
5689 std::cout << "result = " << "(" << static_cast<int>(result.a0) << ", "
5690 << result.a1 << ")" << "\n";
5691
5692 return result;
5693}
5694
5695// Used for testing structs and unions by value.
5696// Struct with mis-aligned member.
5698 uint32_t a1,
5699 uint8_t a2,
5700 uint8_t a3,
5701 uint8_t a4) {
5702 std::cout << "ReturnStruct8BytesPackedInt" << "(" << static_cast<int>(a0)
5703 << ", " << a1 << ", " << static_cast<int>(a2) << ", "
5704 << static_cast<int>(a3) << ", " << static_cast<int>(a4) << ")"
5705 << "\n";
5706
5708
5709 result.a0 = a0;
5710 result.a1 = a1;
5711 result.a2 = a2;
5712 result.a3 = a3;
5713 result.a4 = a4;
5714
5715 std::cout << "result = " << "(" << static_cast<int>(result.a0) << ", "
5716 << result.a1 << ", " << static_cast<int>(result.a2) << ", "
5717 << static_cast<int>(result.a3) << ", "
5718 << static_cast<int>(result.a4) << ")" << "\n";
5719
5720 return result;
5721}
5722
5723// Used for testing structs and unions by value.
5724// Struct with mis-aligned member.
5725// Tests backfilling of CPU and FPU registers.
5727 double a1) {
5728 std::cout << "ReturnStruct9BytesPackedMixed" << "(" << static_cast<int>(a0)
5729 << ", " << a1 << ")" << "\n";
5730
5732
5733 result.a0 = a0;
5734 result.a1 = a1;
5735
5736 std::cout << "result = " << "(" << static_cast<int>(result.a0) << ", "
5737 << result.a1 << ")" << "\n";
5738
5739 return result;
5740}
5741
5742// Used for testing structs and unions by value.
5743// Returning a mixed integer/float union.
5745 std::cout << "ReturnUnion4BytesMixed" << "(" << a0 << ")" << "\n";
5746
5748
5749 result.a0 = a0;
5750
5751 std::cout << "result = " << "(" << result.a0 << ")" << "\n";
5752
5753 return result;
5754}
5755
5756// Used for testing structs and unions by value.
5757// Returning a floating point only union.
5759 std::cout << "ReturnUnion8BytesNestedFloat" << "(" << a0 << ")" << "\n";
5760
5762
5763 result.a0 = a0;
5764
5765 std::cout << "result = " << "(" << result.a0 << ")" << "\n";
5766
5767 return result;
5768}
5769
5770// Used for testing structs and unions by value.
5771// Returning a mixed-size union.
5772DART_EXPORT Union9BytesNestedInt
5774 std::cout << "ReturnUnion9BytesNestedInt" << "((" << a0.a0 << ", " << a0.a1
5775 << ", " << a0.a2 << "))" << "\n";
5776
5778
5779 result.a0.a0 = a0.a0;
5780 result.a0.a1 = a0.a1;
5781 result.a0.a2 = a0.a2;
5782
5783 std::cout << "result = " << "((" << result.a0.a0 << ", " << result.a0.a1
5784 << ", " << result.a0.a2 << "))" << "\n";
5785
5786 return result;
5787}
5788
5789// Used for testing structs and unions by value.
5790// Returning union with homogenous floats.
5791DART_EXPORT Union16BytesNestedFloat
5793 std::cout << "ReturnUnion16BytesNestedFloat" << "((" << a0.a0 << ", " << a0.a1
5794 << "))" << "\n";
5795
5797
5798 result.a0.a0 = a0.a0;
5799 result.a0.a1 = a0.a1;
5800
5801 std::cout << "result = " << "((" << result.a0.a0 << ", " << result.a0.a1
5802 << "))" << "\n";
5803
5804 return result;
5805}
5806
5807// Used for testing structs and unions by value.
5808// Test that a struct passed in as argument can be returned.
5809// Especially for ffi callbacks.
5810// Struct is passed in int registers in most ABIs.
5811DART_EXPORT Struct1ByteInt
5813 std::cout << "ReturnStructArgumentStruct1ByteInt" << "(("
5814 << static_cast<int>(a0.a0) << "))" << "\n";
5815
5817
5818 std::cout << "result = " << "(" << static_cast<int>(result.a0) << ")" << "\n";
5819
5820 return result;
5821}
5822
5823// Used for testing structs and unions by value.
5824// Test that a struct passed in as argument can be returned.
5825// Especially for ffi callbacks.
5826// Struct is passed on stack on all ABIs.
5827DART_EXPORT Struct1ByteInt
5829 int32_t a1,
5830 int32_t a2,
5831 int32_t a3,
5832 int32_t a4,
5833 int32_t a5,
5834 int32_t a6,
5835 int32_t a7,
5836 Struct1ByteInt a8) {
5837 std::cout << "ReturnStructArgumentInt32x8Struct1ByteInt" << "(" << a0 << ", "
5838 << a1 << ", " << a2 << ", " << a3 << ", " << a4 << ", " << a5
5839 << ", " << a6 << ", " << a7 << ", (" << static_cast<int>(a8.a0)
5840 << "))" << "\n";
5841
5843
5844 std::cout << "result = " << "(" << static_cast<int>(result.a0) << ")" << "\n";
5845
5846 return result;
5847}
5848
5849// Used for testing structs and unions by value.
5850// Test that a struct passed in as argument can be returned.
5851// Especially for ffi callbacks.
5852// Struct is passed in float registers in most ABIs.
5853DART_EXPORT Struct8BytesHomogeneousFloat
5856 std::cout << "ReturnStructArgumentStruct8BytesHomogeneousFloat" << "(("
5857 << a0.a0 << ", " << a0.a1 << "))" << "\n";
5858
5860
5861 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ")"
5862 << "\n";
5863
5864 return result;
5865}
5866
5867// Used for testing structs and unions by value.
5868// On arm64, both argument and return value are passed in by pointer.
5869DART_EXPORT Struct20BytesHomogeneousInt32
5872 std::cout << "ReturnStructArgumentStruct20BytesHomogeneousInt32" << "(("
5873 << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3 << ", "
5874 << a0.a4 << "))" << "\n";
5875
5877
5878 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ", "
5879 << result.a2 << ", " << result.a3 << ", " << result.a4 << ")"
5880 << "\n";
5881
5882 return result;
5883}
5884
5885// Used for testing structs and unions by value.
5886// On arm64, both argument and return value are passed in by pointer.
5887// Ints exhaust registers, so that pointer is passed on stack.
5888DART_EXPORT Struct20BytesHomogeneousInt32
5890 int32_t a0,
5891 int32_t a1,
5892 int32_t a2,
5893 int32_t a3,
5894 int32_t a4,
5895 int32_t a5,
5896 int32_t a6,
5897 int32_t a7,
5899 std::cout << "ReturnStructArgumentInt32x8Struct20BytesHomogeneou" << "(" << a0
5900 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4 << ", "
5901 << a5 << ", " << a6 << ", " << a7 << ", (" << a8.a0 << ", " << a8.a1
5902 << ", " << a8.a2 << ", " << a8.a3 << ", " << a8.a4 << "))" << "\n";
5903
5905
5906 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ", "
5907 << result.a2 << ", " << result.a3 << ", " << result.a4 << ")"
5908 << "\n";
5909
5910 return result;
5911}
5912
5913// Used for testing structs and unions by value.
5914// Test returning struct with inline array.
5915DART_EXPORT Struct8BytesInlineArrayInt
5917 std::cout << "ReturnStructArgumentStruct8BytesInlineArrayInt" << "((["
5918 << static_cast<int>(a0.a0[0]) << ", " << static_cast<int>(a0.a0[1])
5919 << ", " << static_cast<int>(a0.a0[2]) << ", "
5920 << static_cast<int>(a0.a0[3]) << ", " << static_cast<int>(a0.a0[4])
5921 << ", " << static_cast<int>(a0.a0[5]) << ", "
5922 << static_cast<int>(a0.a0[6]) << ", " << static_cast<int>(a0.a0[7])
5923 << "]))" << "\n";
5924
5926
5927 std::cout << "result = " << "([" << static_cast<int>(result.a0[0]) << ", "
5928 << static_cast<int>(result.a0[1]) << ", "
5929 << static_cast<int>(result.a0[2]) << ", "
5930 << static_cast<int>(result.a0[3]) << ", "
5931 << static_cast<int>(result.a0[4]) << ", "
5932 << static_cast<int>(result.a0[5]) << ", "
5933 << static_cast<int>(result.a0[6]) << ", "
5934 << static_cast<int>(result.a0[7]) << "])" << "\n";
5935
5936 return result;
5937}
5938
5939// Used for testing structs and unions by value.
5940// Return value in FPU registers on arm hardfp and arm64.
5941DART_EXPORT StructStruct16BytesHomogeneousFloat2
5944 std::cout << "ReturnStructArgumentStructStruct16BytesHomogeneous" << "((("
5945 << a0.a0.a0 << "), [(" << a0.a1[0].a0 << "), (" << a0.a1[1].a0
5946 << ")], " << a0.a2 << "))" << "\n";
5947
5949
5950 std::cout << "result = " << "((" << result.a0.a0 << "), [(" << result.a1[0].a0
5951 << "), (" << result.a1[1].a0 << ")], " << result.a2 << ")" << "\n";
5952
5953 return result;
5954}
5955
5956// Used for testing structs and unions by value.
5957// Return value in FPU registers on arm64.
5958DART_EXPORT StructStruct32BytesHomogeneousDouble2
5961 std::cout << "ReturnStructArgumentStructStruct32BytesHomogeneous" << "((("
5962 << a0.a0.a0 << "), [(" << a0.a1[0].a0 << "), (" << a0.a1[1].a0
5963 << ")], " << a0.a2 << "))" << "\n";
5964
5966
5967 std::cout << "result = " << "((" << result.a0.a0 << "), [(" << result.a1[0].a0
5968 << "), (" << result.a1[1].a0 << ")], " << result.a2 << ")" << "\n";
5969
5970 return result;
5971}
5972
5973// Used for testing structs and unions by value.
5974// On x64 Linux, return value is split over FP and int registers.
5975DART_EXPORT StructStruct16BytesMixed3
5977 std::cout << "ReturnStructArgumentStructStruct16BytesMixed3" << "((("
5978 << a0.a0.a0 << "), [(" << a0.a1[0].a0 << ", " << a0.a1[0].a1 << ", "
5979 << a0.a1[0].a2 << ")], [" << a0.a2[0] << ", " << a0.a2[1] << "]))"
5980 << "\n";
5981
5983
5984 std::cout << "result = " << "((" << result.a0.a0 << "), [(" << result.a1[0].a0
5985 << ", " << result.a1[0].a1 << ", " << result.a1[0].a2 << ")], ["
5986 << result.a2[0] << ", " << result.a2[1] << "])" << "\n";
5987
5988 return result;
5989}
5990
5991// Used for testing structs and unions by value.
5992// Test alignment and padding of 16 byte int within struct.
5994 int16_t a1,
5995 int8_t a2) {
5996 std::cout << "ReturnStructAlignmentInt16" << "(" << static_cast<int>(a0)
5997 << ", " << a1 << ", " << static_cast<int>(a2) << ")" << "\n";
5998
6000
6001 result.a0 = a0;
6002 result.a1 = a1;
6003 result.a2 = a2;
6004
6005 std::cout << "result = " << "(" << static_cast<int>(result.a0) << ", "
6006 << result.a1 << ", " << static_cast<int>(result.a2) << ")" << "\n";
6007
6008 return result;
6009}
6010
6011// Used for testing structs and unions by value.
6012// Test alignment and padding of 32 byte int within struct.
6014 int32_t a1,
6015 int8_t a2) {
6016 std::cout << "ReturnStructAlignmentInt32" << "(" << static_cast<int>(a0)
6017 << ", " << a1 << ", " << static_cast<int>(a2) << ")" << "\n";
6018
6020
6021 result.a0 = a0;
6022 result.a1 = a1;
6023 result.a2 = a2;
6024
6025 std::cout << "result = " << "(" << static_cast<int>(result.a0) << ", "
6026 << result.a1 << ", " << static_cast<int>(result.a2) << ")" << "\n";
6027
6028 return result;
6029}
6030
6031// Used for testing structs and unions by value.
6032// Test alignment and padding of 64 byte int within struct.
6034 int64_t a1,
6035 int8_t a2) {
6036 std::cout << "ReturnStructAlignmentInt64" << "(" << static_cast<int>(a0)
6037 << ", " << a1 << ", " << static_cast<int>(a2) << ")" << "\n";
6038
6040
6041 result.a0 = a0;
6042 result.a1 = a1;
6043 result.a2 = a2;
6044
6045 std::cout << "result = " << "(" << static_cast<int>(result.a0) << ", "
6046 << result.a1 << ", " << static_cast<int>(result.a2) << ")" << "\n";
6047
6048 return result;
6049}
6050
6051// Used for testing structs and unions by value.
6052// Simple nested struct.
6053DART_EXPORT Struct8BytesNestedInt
6056 std::cout << "ReturnStruct8BytesNestedInt" << "((" << a0.a0 << ", " << a0.a1
6057 << "), (" << a1.a0 << ", " << a1.a1 << "))" << "\n";
6058
6060
6061 result.a0.a0 = a0.a0;
6062 result.a0.a1 = a0.a1;
6063 result.a1.a0 = a1.a0;
6064 result.a1.a1 = a1.a1;
6065
6066 std::cout << "result = " << "((" << result.a0.a0 << ", " << result.a0.a1
6067 << "), (" << result.a1.a0 << ", " << result.a1.a1 << "))" << "\n";
6068
6069 return result;
6070}
6071
6072// Used for testing structs and unions by value.
6073// Simple nested struct with floats.
6074DART_EXPORT Struct8BytesNestedFloat
6076 std::cout << "ReturnStruct8BytesNestedFloat" << "((" << a0.a0 << "), ("
6077 << a1.a0 << "))" << "\n";
6078
6080
6081 result.a0.a0 = a0.a0;
6082 result.a1.a0 = a1.a0;
6083
6084 std::cout << "result = " << "((" << result.a0.a0 << "), (" << result.a1.a0
6085 << "))" << "\n";
6086
6087 return result;
6088}
6089
6090// Used for testing structs and unions by value.
6091// The nesting is irregular, testing homogenous float rules on arm and arm64,
6092// and the fpu register usage on x64.
6093DART_EXPORT Struct8BytesNestedFloat2
6095 std::cout << "ReturnStruct8BytesNestedFloat2" << "((" << a0.a0 << "), " << a1
6096 << ")" << "\n";
6097
6099
6100 result.a0.a0 = a0.a0;
6101 result.a1 = a1;
6102
6103 std::cout << "result = " << "((" << result.a0.a0 << "), " << result.a1 << ")"
6104 << "\n";
6105
6106 return result;
6107}
6108
6109// Used for testing structs and unions by value.
6110// Simple nested struct with mixed members.
6111DART_EXPORT Struct8BytesNestedMixed
6113 Struct4BytesFloat a1) {
6114 std::cout << "ReturnStruct8BytesNestedMixed" << "((" << a0.a0 << ", " << a0.a1
6115 << "), (" << a1.a0 << "))" << "\n";
6116
6118
6119 result.a0.a0 = a0.a0;
6120 result.a0.a1 = a0.a1;
6121 result.a1.a0 = a1.a0;
6122
6123 std::cout << "result = " << "((" << result.a0.a0 << ", " << result.a0.a1
6124 << "), (" << result.a1.a0 << "))" << "\n";
6125
6126 return result;
6127}
6128
6129// Used for testing structs and unions by value.
6130// Deeper nested struct to test recursive member access.
6131DART_EXPORT Struct16BytesNestedInt
6134 std::cout << "ReturnStruct16BytesNestedInt" << "(((" << a0.a0.a0 << ", "
6135 << a0.a0.a1 << "), (" << a0.a1.a0 << ", " << a0.a1.a1 << ")), (("
6136 << a1.a0.a0 << ", " << a1.a0.a1 << "), (" << a1.a1.a0 << ", "
6137 << a1.a1.a1 << ")))" << "\n";
6138
6140
6141 result.a0.a0.a0 = a0.a0.a0;
6142 result.a0.a0.a1 = a0.a0.a1;
6143 result.a0.a1.a0 = a0.a1.a0;
6144 result.a0.a1.a1 = a0.a1.a1;
6145 result.a1.a0.a0 = a1.a0.a0;
6146 result.a1.a0.a1 = a1.a0.a1;
6147 result.a1.a1.a0 = a1.a1.a0;
6148 result.a1.a1.a1 = a1.a1.a1;
6149
6150 std::cout << "result = " << "(((" << result.a0.a0.a0 << ", "
6151 << result.a0.a0.a1 << "), (" << result.a0.a1.a0 << ", "
6152 << result.a0.a1.a1 << ")), ((" << result.a1.a0.a0 << ", "
6153 << result.a1.a0.a1 << "), (" << result.a1.a1.a0 << ", "
6154 << result.a1.a1.a1 << ")))" << "\n";
6155
6156 return result;
6157}
6158
6159// Used for testing structs and unions by value.
6160// Even deeper nested struct to test recursive member access.
6161DART_EXPORT Struct32BytesNestedInt
6164 std::cout << "ReturnStruct32BytesNestedInt" << "((((" << a0.a0.a0.a0 << ", "
6165 << a0.a0.a0.a1 << "), (" << a0.a0.a1.a0 << ", " << a0.a0.a1.a1
6166 << ")), ((" << a0.a1.a0.a0 << ", " << a0.a1.a0.a1 << "), ("
6167 << a0.a1.a1.a0 << ", " << a0.a1.a1.a1 << "))), (((" << a1.a0.a0.a0
6168 << ", " << a1.a0.a0.a1 << "), (" << a1.a0.a1.a0 << ", "
6169 << a1.a0.a1.a1 << ")), ((" << a1.a1.a0.a0 << ", " << a1.a1.a0.a1
6170 << "), (" << a1.a1.a1.a0 << ", " << a1.a1.a1.a1 << "))))" << "\n";
6171
6173
6174 result.a0.a0.a0.a0 = a0.a0.a0.a0;
6175 result.a0.a0.a0.a1 = a0.a0.a0.a1;
6176 result.a0.a0.a1.a0 = a0.a0.a1.a0;
6177 result.a0.a0.a1.a1 = a0.a0.a1.a1;
6178 result.a0.a1.a0.a0 = a0.a1.a0.a0;
6179 result.a0.a1.a0.a1 = a0.a1.a0.a1;
6180 result.a0.a1.a1.a0 = a0.a1.a1.a0;
6181 result.a0.a1.a1.a1 = a0.a1.a1.a1;
6182 result.a1.a0.a0.a0 = a1.a0.a0.a0;
6183 result.a1.a0.a0.a1 = a1.a0.a0.a1;
6184 result.a1.a0.a1.a0 = a1.a0.a1.a0;
6185 result.a1.a0.a1.a1 = a1.a0.a1.a1;
6186 result.a1.a1.a0.a0 = a1.a1.a0.a0;
6187 result.a1.a1.a0.a1 = a1.a1.a0.a1;
6188 result.a1.a1.a1.a0 = a1.a1.a1.a0;
6189 result.a1.a1.a1.a1 = a1.a1.a1.a1;
6190
6191 std::cout << "result = " << "((((" << result.a0.a0.a0.a0 << ", "
6192 << result.a0.a0.a0.a1 << "), (" << result.a0.a0.a1.a0 << ", "
6193 << result.a0.a0.a1.a1 << ")), ((" << result.a0.a1.a0.a0 << ", "
6194 << result.a0.a1.a0.a1 << "), (" << result.a0.a1.a1.a0 << ", "
6195 << result.a0.a1.a1.a1 << "))), (((" << result.a1.a0.a0.a0 << ", "
6196 << result.a1.a0.a0.a1 << "), (" << result.a1.a0.a1.a0 << ", "
6197 << result.a1.a0.a1.a1 << ")), ((" << result.a1.a1.a0.a0 << ", "
6198 << result.a1.a1.a0.a1 << "), (" << result.a1.a1.a1.a0 << ", "
6199 << result.a1.a1.a1.a1 << "))))" << "\n";
6200
6201 return result;
6202}
6203
6204// Used for testing structs and unions by value.
6205// Test alignment and padding of nested struct with 16 byte int.
6206DART_EXPORT StructNestedIntStructAlignmentInt16
6209 std::cout << "ReturnStructNestedIntStructAlignmentInt16" << "(("
6210 << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
6211 << static_cast<int>(a0.a2) << "), (" << static_cast<int>(a1.a0)
6212 << ", " << a1.a1 << ", " << static_cast<int>(a1.a2) << "))" << "\n";
6213
6215
6216 result.a0.a0 = a0.a0;
6217 result.a0.a1 = a0.a1;
6218 result.a0.a2 = a0.a2;
6219 result.a1.a0 = a1.a0;
6220 result.a1.a1 = a1.a1;
6221 result.a1.a2 = a1.a2;
6222
6223 std::cout << "result = " << "((" << static_cast<int>(result.a0.a0) << ", "
6224 << result.a0.a1 << ", " << static_cast<int>(result.a0.a2) << "), ("
6225 << static_cast<int>(result.a1.a0) << ", " << result.a1.a1 << ", "
6226 << static_cast<int>(result.a1.a2) << "))" << "\n";
6227
6228 return result;
6229}
6230
6231// Used for testing structs and unions by value.
6232// Test alignment and padding of nested struct with 32 byte int.
6233DART_EXPORT StructNestedIntStructAlignmentInt32
6236 std::cout << "ReturnStructNestedIntStructAlignmentInt32" << "(("
6237 << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
6238 << static_cast<int>(a0.a2) << "), (" << static_cast<int>(a1.a0)
6239 << ", " << a1.a1 << ", " << static_cast<int>(a1.a2) << "))" << "\n";
6240
6242
6243 result.a0.a0 = a0.a0;
6244 result.a0.a1 = a0.a1;
6245 result.a0.a2 = a0.a2;
6246 result.a1.a0 = a1.a0;
6247 result.a1.a1 = a1.a1;
6248 result.a1.a2 = a1.a2;
6249
6250 std::cout << "result = " << "((" << static_cast<int>(result.a0.a0) << ", "
6251 << result.a0.a1 << ", " << static_cast<int>(result.a0.a2) << "), ("
6252 << static_cast<int>(result.a1.a0) << ", " << result.a1.a1 << ", "
6253 << static_cast<int>(result.a1.a2) << "))" << "\n";
6254
6255 return result;
6256}
6257
6258// Used for testing structs and unions by value.
6259// Test alignment and padding of nested struct with 64 byte int.
6260DART_EXPORT StructNestedIntStructAlignmentInt64
6263 std::cout << "ReturnStructNestedIntStructAlignmentInt64" << "(("
6264 << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
6265 << static_cast<int>(a0.a2) << "), (" << static_cast<int>(a1.a0)
6266 << ", " << a1.a1 << ", " << static_cast<int>(a1.a2) << "))" << "\n";
6267
6269
6270 result.a0.a0 = a0.a0;
6271 result.a0.a1 = a0.a1;
6272 result.a0.a2 = a0.a2;
6273 result.a1.a0 = a1.a0;
6274 result.a1.a1 = a1.a1;
6275 result.a1.a2 = a1.a2;
6276
6277 std::cout << "result = " << "((" << static_cast<int>(result.a0.a0) << ", "
6278 << result.a0.a1 << ", " << static_cast<int>(result.a0.a2) << "), ("
6279 << static_cast<int>(result.a1.a0) << ", " << result.a1.a1 << ", "
6280 << static_cast<int>(result.a1.a2) << "))" << "\n";
6281
6282 return result;
6283}
6284
6285// Used for testing structs and unions by value.
6286// Return big irregular struct as smoke test.
6287DART_EXPORT StructNestedIrregularEvenBigger
6291 double a3) {
6292 std::cout << "ReturnStructNestedIrregularEvenBigger" << "(" << a0 << ", (("
6293 << a1.a0.a0 << ", ((" << a1.a0.a1.a0.a0 << ", " << a1.a0.a1.a0.a1
6294 << "), (" << a1.a0.a1.a1.a0 << ")), " << a1.a0.a2 << ", (("
6295 << a1.a0.a3.a0.a0 << "), " << a1.a0.a3.a1 << "), " << a1.a0.a4
6296 << ", ((" << a1.a0.a5.a0.a0 << "), (" << a1.a0.a5.a1.a0 << ")), "
6297 << a1.a0.a6 << "), ((" << a1.a1.a0.a0 << ", " << a1.a1.a0.a1
6298 << "), (" << a1.a1.a1.a0 << ")), " << a1.a2 << ", " << a1.a3
6299 << "), ((" << a2.a0.a0 << ", ((" << a2.a0.a1.a0.a0 << ", "
6300 << a2.a0.a1.a0.a1 << "), (" << a2.a0.a1.a1.a0 << ")), " << a2.a0.a2
6301 << ", ((" << a2.a0.a3.a0.a0 << "), " << a2.a0.a3.a1 << "), "
6302 << a2.a0.a4 << ", ((" << a2.a0.a5.a0.a0 << "), (" << a2.a0.a5.a1.a0
6303 << ")), " << a2.a0.a6 << "), ((" << a2.a1.a0.a0 << ", "
6304 << a2.a1.a0.a1 << "), (" << a2.a1.a1.a0 << ")), " << a2.a2 << ", "
6305 << a2.a3 << "), " << a3 << ")" << "\n";
6306
6308
6309 result.a0 = a0;
6310 result.a1.a0.a0 = a1.a0.a0;
6311 result.a1.a0.a1.a0.a0 = a1.a0.a1.a0.a0;
6312 result.a1.a0.a1.a0.a1 = a1.a0.a1.a0.a1;
6313 result.a1.a0.a1.a1.a0 = a1.a0.a1.a1.a0;
6314 result.a1.a0.a2 = a1.a0.a2;
6315 result.a1.a0.a3.a0.a0 = a1.a0.a3.a0.a0;
6316 result.a1.a0.a3.a1 = a1.a0.a3.a1;
6317 result.a1.a0.a4 = a1.a0.a4;
6318 result.a1.a0.a5.a0.a0 = a1.a0.a5.a0.a0;
6319 result.a1.a0.a5.a1.a0 = a1.a0.a5.a1.a0;
6320 result.a1.a0.a6 = a1.a0.a6;
6321 result.a1.a1.a0.a0 = a1.a1.a0.a0;
6322 result.a1.a1.a0.a1 = a1.a1.a0.a1;
6323 result.a1.a1.a1.a0 = a1.a1.a1.a0;
6324 result.a1.a2 = a1.a2;
6325 result.a1.a3 = a1.a3;
6326 result.a2.a0.a0 = a2.a0.a0;
6327 result.a2.a0.a1.a0.a0 = a2.a0.a1.a0.a0;
6328 result.a2.a0.a1.a0.a1 = a2.a0.a1.a0.a1;
6329 result.a2.a0.a1.a1.a0 = a2.a0.a1.a1.a0;
6330 result.a2.a0.a2 = a2.a0.a2;
6331 result.a2.a0.a3.a0.a0 = a2.a0.a3.a0.a0;
6332 result.a2.a0.a3.a1 = a2.a0.a3.a1;
6333 result.a2.a0.a4 = a2.a0.a4;
6334 result.a2.a0.a5.a0.a0 = a2.a0.a5.a0.a0;
6335 result.a2.a0.a5.a1.a0 = a2.a0.a5.a1.a0;
6336 result.a2.a0.a6 = a2.a0.a6;
6337 result.a2.a1.a0.a0 = a2.a1.a0.a0;
6338 result.a2.a1.a0.a1 = a2.a1.a0.a1;
6339 result.a2.a1.a1.a0 = a2.a1.a1.a0;
6340 result.a2.a2 = a2.a2;
6341 result.a2.a3 = a2.a3;
6342 result.a3 = a3;
6343
6344 std::cout << "result = " << "(" << result.a0 << ", ((" << result.a1.a0.a0
6345 << ", ((" << result.a1.a0.a1.a0.a0 << ", " << result.a1.a0.a1.a0.a1
6346 << "), (" << result.a1.a0.a1.a1.a0 << ")), " << result.a1.a0.a2
6347 << ", ((" << result.a1.a0.a3.a0.a0 << "), " << result.a1.a0.a3.a1
6348 << "), " << result.a1.a0.a4 << ", ((" << result.a1.a0.a5.a0.a0
6349 << "), (" << result.a1.a0.a5.a1.a0 << ")), " << result.a1.a0.a6
6350 << "), ((" << result.a1.a1.a0.a0 << ", " << result.a1.a1.a0.a1
6351 << "), (" << result.a1.a1.a1.a0 << ")), " << result.a1.a2 << ", "
6352 << result.a1.a3 << "), ((" << result.a2.a0.a0 << ", (("
6353 << result.a2.a0.a1.a0.a0 << ", " << result.a2.a0.a1.a0.a1 << "), ("
6354 << result.a2.a0.a1.a1.a0 << ")), " << result.a2.a0.a2 << ", (("
6355 << result.a2.a0.a3.a0.a0 << "), " << result.a2.a0.a3.a1 << "), "
6356 << result.a2.a0.a4 << ", ((" << result.a2.a0.a5.a0.a0 << "), ("
6357 << result.a2.a0.a5.a1.a0 << ")), " << result.a2.a0.a6 << "), (("
6358 << result.a2.a1.a0.a0 << ", " << result.a2.a1.a0.a1 << "), ("
6359 << result.a2.a1.a1.a0 << ")), " << result.a2.a2 << ", "
6360 << result.a2.a3 << "), " << result.a3 << ")" << "\n";
6361
6362 return result;
6363}
6364
6365// Used for testing structs and unions by value.
6366// Smallest struct with data.
6367// 10 struct arguments will exhaust available registers.
6369 // NOLINTNEXTLINE(whitespace/parens)
6370 int64_t (*f)(Struct1ByteInt a0,
6371 Struct1ByteInt a1,
6372 Struct1ByteInt a2,
6373 Struct1ByteInt a3,
6374 Struct1ByteInt a4,
6375 Struct1ByteInt a5,
6376 Struct1ByteInt a6,
6377 Struct1ByteInt a7,
6378 Struct1ByteInt a8,
6379 Struct1ByteInt a9)) {
6380 Struct1ByteInt a0 = {};
6381 Struct1ByteInt a1 = {};
6382 Struct1ByteInt a2 = {};
6383 Struct1ByteInt a3 = {};
6384 Struct1ByteInt a4 = {};
6385 Struct1ByteInt a5 = {};
6386 Struct1ByteInt a6 = {};
6387 Struct1ByteInt a7 = {};
6388 Struct1ByteInt a8 = {};
6389 Struct1ByteInt a9 = {};
6390
6391 a0.a0 = -1;
6392 a1.a0 = 2;
6393 a2.a0 = -3;
6394 a3.a0 = 4;
6395 a4.a0 = -5;
6396 a5.a0 = 6;
6397 a6.a0 = -7;
6398 a7.a0 = 8;
6399 a8.a0 = -9;
6400 a9.a0 = 10;
6401
6402 std::cout << "Calling TestPassStruct1ByteIntx10(" << "(("
6403 << static_cast<int>(a0.a0) << "), (" << static_cast<int>(a1.a0)
6404 << "), (" << static_cast<int>(a2.a0) << "), ("
6405 << static_cast<int>(a3.a0) << "), (" << static_cast<int>(a4.a0)
6406 << "), (" << static_cast<int>(a5.a0) << "), ("
6407 << static_cast<int>(a6.a0) << "), (" << static_cast<int>(a7.a0)
6408 << "), (" << static_cast<int>(a8.a0) << "), ("
6409 << static_cast<int>(a9.a0) << "))" << ")\n";
6410
6411 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6412
6413 std::cout << "result = " << result << "\n";
6414
6415 CHECK_EQ(5, result);
6416
6417 // Pass argument that will make the Dart callback throw.
6418 a0.a0 = 42;
6419
6420 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6421
6422 CHECK_EQ(0, result);
6423
6424 // Pass argument that will make the Dart callback return null.
6425 a0.a0 = 84;
6426
6427 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6428
6429 CHECK_EQ(0, result);
6430
6431 return 0;
6432}
6433
6434// Used for testing structs and unions by value.
6435// Not a multiple of word size, not a power of two.
6436// 10 struct arguments will exhaust available registers.
6438 // NOLINTNEXTLINE(whitespace/parens)
6439 int64_t (*f)(Struct3BytesHomogeneousUint8 a0,
6459
6460 a0.a0 = 1;
6461 a0.a1 = 2;
6462 a0.a2 = 3;
6463 a1.a0 = 4;
6464 a1.a1 = 5;
6465 a1.a2 = 6;
6466 a2.a0 = 7;
6467 a2.a1 = 8;
6468 a2.a2 = 9;
6469 a3.a0 = 10;
6470 a3.a1 = 11;
6471 a3.a2 = 12;
6472 a4.a0 = 13;
6473 a4.a1 = 14;
6474 a4.a2 = 15;
6475 a5.a0 = 16;
6476 a5.a1 = 17;
6477 a5.a2 = 18;
6478 a6.a0 = 19;
6479 a6.a1 = 20;
6480 a6.a2 = 21;
6481 a7.a0 = 22;
6482 a7.a1 = 23;
6483 a7.a2 = 24;
6484 a8.a0 = 25;
6485 a8.a1 = 26;
6486 a8.a2 = 27;
6487 a9.a0 = 28;
6488 a9.a1 = 29;
6489 a9.a2 = 30;
6490
6491 std::cout << "Calling TestPassStruct3BytesHomogeneousUint8x10(" << "(("
6492 << static_cast<int>(a0.a0) << ", " << static_cast<int>(a0.a1)
6493 << ", " << static_cast<int>(a0.a2) << "), ("
6494 << static_cast<int>(a1.a0) << ", " << static_cast<int>(a1.a1)
6495 << ", " << static_cast<int>(a1.a2) << "), ("
6496 << static_cast<int>(a2.a0) << ", " << static_cast<int>(a2.a1)
6497 << ", " << static_cast<int>(a2.a2) << "), ("
6498 << static_cast<int>(a3.a0) << ", " << static_cast<int>(a3.a1)
6499 << ", " << static_cast<int>(a3.a2) << "), ("
6500 << static_cast<int>(a4.a0) << ", " << static_cast<int>(a4.a1)
6501 << ", " << static_cast<int>(a4.a2) << "), ("
6502 << static_cast<int>(a5.a0) << ", " << static_cast<int>(a5.a1)
6503 << ", " << static_cast<int>(a5.a2) << "), ("
6504 << static_cast<int>(a6.a0) << ", " << static_cast<int>(a6.a1)
6505 << ", " << static_cast<int>(a6.a2) << "), ("
6506 << static_cast<int>(a7.a0) << ", " << static_cast<int>(a7.a1)
6507 << ", " << static_cast<int>(a7.a2) << "), ("
6508 << static_cast<int>(a8.a0) << ", " << static_cast<int>(a8.a1)
6509 << ", " << static_cast<int>(a8.a2) << "), ("
6510 << static_cast<int>(a9.a0) << ", " << static_cast<int>(a9.a1)
6511 << ", " << static_cast<int>(a9.a2) << "))" << ")\n";
6512
6513 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6514
6515 std::cout << "result = " << result << "\n";
6516
6517 CHECK_EQ(465, result);
6518
6519 // Pass argument that will make the Dart callback throw.
6520 a0.a0 = 42;
6521
6522 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6523
6524 CHECK_EQ(0, result);
6525
6526 // Pass argument that will make the Dart callback return null.
6527 a0.a0 = 84;
6528
6529 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6530
6531 CHECK_EQ(0, result);
6532
6533 return 0;
6534}
6535
6536// Used for testing structs and unions by value.
6537// Not a multiple of word size, not a power of two.
6538// With alignment rules taken into account size is 4 bytes.
6539// 10 struct arguments will exhaust available registers.
6541 // NOLINTNEXTLINE(whitespace/parens)
6542 int64_t (*f)(Struct3BytesInt2ByteAligned a0,
6562
6563 a0.a0 = -1;
6564 a0.a1 = 2;
6565 a1.a0 = -3;
6566 a1.a1 = 4;
6567 a2.a0 = -5;
6568 a2.a1 = 6;
6569 a3.a0 = -7;
6570 a3.a1 = 8;
6571 a4.a0 = -9;
6572 a4.a1 = 10;
6573 a5.a0 = -11;
6574 a5.a1 = 12;
6575 a6.a0 = -13;
6576 a6.a1 = 14;
6577 a7.a0 = -15;
6578 a7.a1 = 16;
6579 a8.a0 = -17;
6580 a8.a1 = 18;
6581 a9.a0 = -19;
6582 a9.a1 = 20;
6583
6584 std::cout << "Calling TestPassStruct3BytesInt2ByteAlignedx10(" << "(("
6585 << a0.a0 << ", " << static_cast<int>(a0.a1) << "), (" << a1.a0
6586 << ", " << static_cast<int>(a1.a1) << "), (" << a2.a0 << ", "
6587 << static_cast<int>(a2.a1) << "), (" << a3.a0 << ", "
6588 << static_cast<int>(a3.a1) << "), (" << a4.a0 << ", "
6589 << static_cast<int>(a4.a1) << "), (" << a5.a0 << ", "
6590 << static_cast<int>(a5.a1) << "), (" << a6.a0 << ", "
6591 << static_cast<int>(a6.a1) << "), (" << a7.a0 << ", "
6592 << static_cast<int>(a7.a1) << "), (" << a8.a0 << ", "
6593 << static_cast<int>(a8.a1) << "), (" << a9.a0 << ", "
6594 << static_cast<int>(a9.a1) << "))" << ")\n";
6595
6596 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6597
6598 std::cout << "result = " << result << "\n";
6599
6600 CHECK_EQ(10, result);
6601
6602 // Pass argument that will make the Dart callback throw.
6603 a0.a0 = 42;
6604
6605 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6606
6607 CHECK_EQ(0, result);
6608
6609 // Pass argument that will make the Dart callback return null.
6610 a0.a0 = 84;
6611
6612 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6613
6614 CHECK_EQ(0, result);
6615
6616 return 0;
6617}
6618
6619// Used for testing structs and unions by value.
6620// Exactly word size on 32-bit architectures.
6621// 10 struct arguments will exhaust available registers.
6623 // NOLINTNEXTLINE(whitespace/parens)
6624 int64_t (*f)(Struct4BytesHomogeneousInt16 a0,
6644
6645 a0.a0 = -1;
6646 a0.a1 = 2;
6647 a1.a0 = -3;
6648 a1.a1 = 4;
6649 a2.a0 = -5;
6650 a2.a1 = 6;
6651 a3.a0 = -7;
6652 a3.a1 = 8;
6653 a4.a0 = -9;
6654 a4.a1 = 10;
6655 a5.a0 = -11;
6656 a5.a1 = 12;
6657 a6.a0 = -13;
6658 a6.a1 = 14;
6659 a7.a0 = -15;
6660 a7.a1 = 16;
6661 a8.a0 = -17;
6662 a8.a1 = 18;
6663 a9.a0 = -19;
6664 a9.a1 = 20;
6665
6666 std::cout << "Calling TestPassStruct4BytesHomogeneousInt16x10(" << "(("
6667 << a0.a0 << ", " << a0.a1 << "), (" << a1.a0 << ", " << a1.a1
6668 << "), (" << a2.a0 << ", " << a2.a1 << "), (" << a3.a0 << ", "
6669 << a3.a1 << "), (" << a4.a0 << ", " << a4.a1 << "), (" << a5.a0
6670 << ", " << a5.a1 << "), (" << a6.a0 << ", " << a6.a1 << "), ("
6671 << a7.a0 << ", " << a7.a1 << "), (" << a8.a0 << ", " << a8.a1
6672 << "), (" << a9.a0 << ", " << a9.a1 << "))" << ")\n";
6673
6674 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6675
6676 std::cout << "result = " << result << "\n";
6677
6678 CHECK_EQ(10, result);
6679
6680 // Pass argument that will make the Dart callback throw.
6681 a0.a0 = 42;
6682
6683 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6684
6685 CHECK_EQ(0, result);
6686
6687 // Pass argument that will make the Dart callback return null.
6688 a0.a0 = 84;
6689
6690 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6691
6692 CHECK_EQ(0, result);
6693
6694 return 0;
6695}
6696
6697// Used for testing structs and unions by value.
6698// Sub word size on 64 bit architectures.
6699// 10 struct arguments will exhaust available registers.
6701 // NOLINTNEXTLINE(whitespace/parens)
6702 int64_t (*f)(Struct7BytesHomogeneousUint8 a0,
6722
6723 a0.a0 = 1;
6724 a0.a1 = 2;
6725 a0.a2 = 3;
6726 a0.a3 = 4;
6727 a0.a4 = 5;
6728 a0.a5 = 6;
6729 a0.a6 = 7;
6730 a1.a0 = 8;
6731 a1.a1 = 9;
6732 a1.a2 = 10;
6733 a1.a3 = 11;
6734 a1.a4 = 12;
6735 a1.a5 = 13;
6736 a1.a6 = 14;
6737 a2.a0 = 15;
6738 a2.a1 = 16;
6739 a2.a2 = 17;
6740 a2.a3 = 18;
6741 a2.a4 = 19;
6742 a2.a5 = 20;
6743 a2.a6 = 21;
6744 a3.a0 = 22;
6745 a3.a1 = 23;
6746 a3.a2 = 24;
6747 a3.a3 = 25;
6748 a3.a4 = 26;
6749 a3.a5 = 27;
6750 a3.a6 = 28;
6751 a4.a0 = 29;
6752 a4.a1 = 30;
6753 a4.a2 = 31;
6754 a4.a3 = 32;
6755 a4.a4 = 33;
6756 a4.a5 = 34;
6757 a4.a6 = 35;
6758 a5.a0 = 36;
6759 a5.a1 = 37;
6760 a5.a2 = 38;
6761 a5.a3 = 39;
6762 a5.a4 = 40;
6763 a5.a5 = 41;
6764 a5.a6 = 42;
6765 a6.a0 = 43;
6766 a6.a1 = 44;
6767 a6.a2 = 45;
6768 a6.a3 = 46;
6769 a6.a4 = 47;
6770 a6.a5 = 48;
6771 a6.a6 = 49;
6772 a7.a0 = 50;
6773 a7.a1 = 51;
6774 a7.a2 = 52;
6775 a7.a3 = 53;
6776 a7.a4 = 54;
6777 a7.a5 = 55;
6778 a7.a6 = 56;
6779 a8.a0 = 57;
6780 a8.a1 = 58;
6781 a8.a2 = 59;
6782 a8.a3 = 60;
6783 a8.a4 = 61;
6784 a8.a5 = 62;
6785 a8.a6 = 63;
6786 a9.a0 = 64;
6787 a9.a1 = 65;
6788 a9.a2 = 66;
6789 a9.a3 = 67;
6790 a9.a4 = 68;
6791 a9.a5 = 69;
6792 a9.a6 = 70;
6793
6794 std::cout
6795 << "Calling TestPassStruct7BytesHomogeneousUint8x10(" << "(("
6796 << static_cast<int>(a0.a0) << ", " << static_cast<int>(a0.a1) << ", "
6797 << static_cast<int>(a0.a2) << ", " << static_cast<int>(a0.a3) << ", "
6798 << static_cast<int>(a0.a4) << ", " << static_cast<int>(a0.a5) << ", "
6799 << static_cast<int>(a0.a6) << "), (" << static_cast<int>(a1.a0) << ", "
6800 << static_cast<int>(a1.a1) << ", " << static_cast<int>(a1.a2) << ", "
6801 << static_cast<int>(a1.a3) << ", " << static_cast<int>(a1.a4) << ", "
6802 << static_cast<int>(a1.a5) << ", " << static_cast<int>(a1.a6) << "), ("
6803 << static_cast<int>(a2.a0) << ", " << static_cast<int>(a2.a1) << ", "
6804 << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3) << ", "
6805 << static_cast<int>(a2.a4) << ", " << static_cast<int>(a2.a5) << ", "
6806 << static_cast<int>(a2.a6) << "), (" << static_cast<int>(a3.a0) << ", "
6807 << static_cast<int>(a3.a1) << ", " << static_cast<int>(a3.a2) << ", "
6808 << static_cast<int>(a3.a3) << ", " << static_cast<int>(a3.a4) << ", "
6809 << static_cast<int>(a3.a5) << ", " << static_cast<int>(a3.a6) << "), ("
6810 << static_cast<int>(a4.a0) << ", " << static_cast<int>(a4.a1) << ", "
6811 << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3) << ", "
6812 << static_cast<int>(a4.a4) << ", " << static_cast<int>(a4.a5) << ", "
6813 << static_cast<int>(a4.a6) << "), (" << static_cast<int>(a5.a0) << ", "
6814 << static_cast<int>(a5.a1) << ", " << static_cast<int>(a5.a2) << ", "
6815 << static_cast<int>(a5.a3) << ", " << static_cast<int>(a5.a4) << ", "
6816 << static_cast<int>(a5.a5) << ", " << static_cast<int>(a5.a6) << "), ("
6817 << static_cast<int>(a6.a0) << ", " << static_cast<int>(a6.a1) << ", "
6818 << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3) << ", "
6819 << static_cast<int>(a6.a4) << ", " << static_cast<int>(a6.a5) << ", "
6820 << static_cast<int>(a6.a6) << "), (" << static_cast<int>(a7.a0) << ", "
6821 << static_cast<int>(a7.a1) << ", " << static_cast<int>(a7.a2) << ", "
6822 << static_cast<int>(a7.a3) << ", " << static_cast<int>(a7.a4) << ", "
6823 << static_cast<int>(a7.a5) << ", " << static_cast<int>(a7.a6) << "), ("
6824 << static_cast<int>(a8.a0) << ", " << static_cast<int>(a8.a1) << ", "
6825 << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3) << ", "
6826 << static_cast<int>(a8.a4) << ", " << static_cast<int>(a8.a5) << ", "
6827 << static_cast<int>(a8.a6) << "), (" << static_cast<int>(a9.a0) << ", "
6828 << static_cast<int>(a9.a1) << ", " << static_cast<int>(a9.a2) << ", "
6829 << static_cast<int>(a9.a3) << ", " << static_cast<int>(a9.a4) << ", "
6830 << static_cast<int>(a9.a5) << ", " << static_cast<int>(a9.a6) << "))"
6831 << ")\n";
6832
6833 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6834
6835 std::cout << "result = " << result << "\n";
6836
6837 CHECK_EQ(2485, result);
6838
6839 // Pass argument that will make the Dart callback throw.
6840 a0.a0 = 42;
6841
6842 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6843
6844 CHECK_EQ(0, result);
6845
6846 // Pass argument that will make the Dart callback return null.
6847 a0.a0 = 84;
6848
6849 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6850
6851 CHECK_EQ(0, result);
6852
6853 return 0;
6854}
6855
6856// Used for testing structs and unions by value.
6857// Sub word size on 64 bit architectures.
6858// With alignment rules taken into account size is 8 bytes.
6859// 10 struct arguments will exhaust available registers.
6861 // NOLINTNEXTLINE(whitespace/parens)
6862 int64_t (*f)(Struct7BytesInt4ByteAligned a0,
6882
6883 a0.a0 = -1;
6884 a0.a1 = 2;
6885 a0.a2 = -3;
6886 a1.a0 = 4;
6887 a1.a1 = -5;
6888 a1.a2 = 6;
6889 a2.a0 = -7;
6890 a2.a1 = 8;
6891 a2.a2 = -9;
6892 a3.a0 = 10;
6893 a3.a1 = -11;
6894 a3.a2 = 12;
6895 a4.a0 = -13;
6896 a4.a1 = 14;
6897 a4.a2 = -15;
6898 a5.a0 = 16;
6899 a5.a1 = -17;
6900 a5.a2 = 18;
6901 a6.a0 = -19;
6902 a6.a1 = 20;
6903 a6.a2 = -21;
6904 a7.a0 = 22;
6905 a7.a1 = -23;
6906 a7.a2 = 24;
6907 a8.a0 = -25;
6908 a8.a1 = 26;
6909 a8.a2 = -27;
6910 a9.a0 = 28;
6911 a9.a1 = -29;
6912 a9.a2 = 30;
6913
6914 std::cout << "Calling TestPassStruct7BytesInt4ByteAlignedx10(" << "(("
6915 << a0.a0 << ", " << a0.a1 << ", " << static_cast<int>(a0.a2)
6916 << "), (" << a1.a0 << ", " << a1.a1 << ", "
6917 << static_cast<int>(a1.a2) << "), (" << a2.a0 << ", " << a2.a1
6918 << ", " << static_cast<int>(a2.a2) << "), (" << a3.a0 << ", "
6919 << a3.a1 << ", " << static_cast<int>(a3.a2) << "), (" << a4.a0
6920 << ", " << a4.a1 << ", " << static_cast<int>(a4.a2) << "), ("
6921 << a5.a0 << ", " << a5.a1 << ", " << static_cast<int>(a5.a2)
6922 << "), (" << a6.a0 << ", " << a6.a1 << ", "
6923 << static_cast<int>(a6.a2) << "), (" << a7.a0 << ", " << a7.a1
6924 << ", " << static_cast<int>(a7.a2) << "), (" << a8.a0 << ", "
6925 << a8.a1 << ", " << static_cast<int>(a8.a2) << "), (" << a9.a0
6926 << ", " << a9.a1 << ", " << static_cast<int>(a9.a2) << "))"
6927 << ")\n";
6928
6929 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6930
6931 std::cout << "result = " << result << "\n";
6932
6933 CHECK_EQ(15, result);
6934
6935 // Pass argument that will make the Dart callback throw.
6936 a0.a0 = 42;
6937
6938 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6939
6940 CHECK_EQ(0, result);
6941
6942 // Pass argument that will make the Dart callback return null.
6943 a0.a0 = 84;
6944
6945 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
6946
6947 CHECK_EQ(0, result);
6948
6949 return 0;
6950}
6951
6952// Used for testing structs and unions by value.
6953// Exactly word size struct on 64bit architectures.
6954// 10 struct arguments will exhaust available registers.
6956 // NOLINTNEXTLINE(whitespace/parens)
6957 int64_t (*f)(Struct8BytesInt a0,
6958 Struct8BytesInt a1,
6959 Struct8BytesInt a2,
6960 Struct8BytesInt a3,
6961 Struct8BytesInt a4,
6962 Struct8BytesInt a5,
6963 Struct8BytesInt a6,
6964 Struct8BytesInt a7,
6965 Struct8BytesInt a8,
6966 Struct8BytesInt a9)) {
6967 Struct8BytesInt a0 = {};
6968 Struct8BytesInt a1 = {};
6969 Struct8BytesInt a2 = {};
6970 Struct8BytesInt a3 = {};
6971 Struct8BytesInt a4 = {};
6972 Struct8BytesInt a5 = {};
6973 Struct8BytesInt a6 = {};
6974 Struct8BytesInt a7 = {};
6975 Struct8BytesInt a8 = {};
6976 Struct8BytesInt a9 = {};
6977
6978 a0.a0 = -1;
6979 a0.a1 = 2;
6980 a0.a2 = -3;
6981 a1.a0 = 4;
6982 a1.a1 = -5;
6983 a1.a2 = 6;
6984 a2.a0 = -7;
6985 a2.a1 = 8;
6986 a2.a2 = -9;
6987 a3.a0 = 10;
6988 a3.a1 = -11;
6989 a3.a2 = 12;
6990 a4.a0 = -13;
6991 a4.a1 = 14;
6992 a4.a2 = -15;
6993 a5.a0 = 16;
6994 a5.a1 = -17;
6995 a5.a2 = 18;
6996 a6.a0 = -19;
6997 a6.a1 = 20;
6998 a6.a2 = -21;
6999 a7.a0 = 22;
7000 a7.a1 = -23;
7001 a7.a2 = 24;
7002 a8.a0 = -25;
7003 a8.a1 = 26;
7004 a8.a2 = -27;
7005 a9.a0 = 28;
7006 a9.a1 = -29;
7007 a9.a2 = 30;
7008
7009 std::cout << "Calling TestPassStruct8BytesIntx10(" << "((" << a0.a0 << ", "
7010 << a0.a1 << ", " << a0.a2 << "), (" << a1.a0 << ", " << a1.a1
7011 << ", " << a1.a2 << "), (" << a2.a0 << ", " << a2.a1 << ", "
7012 << a2.a2 << "), (" << a3.a0 << ", " << a3.a1 << ", " << a3.a2
7013 << "), (" << a4.a0 << ", " << a4.a1 << ", " << a4.a2 << "), ("
7014 << a5.a0 << ", " << a5.a1 << ", " << a5.a2 << "), (" << a6.a0
7015 << ", " << a6.a1 << ", " << a6.a2 << "), (" << a7.a0 << ", "
7016 << a7.a1 << ", " << a7.a2 << "), (" << a8.a0 << ", " << a8.a1
7017 << ", " << a8.a2 << "), (" << a9.a0 << ", " << a9.a1 << ", "
7018 << a9.a2 << "))" << ")\n";
7019
7020 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7021
7022 std::cout << "result = " << result << "\n";
7023
7024 CHECK_EQ(15, result);
7025
7026 // Pass argument that will make the Dart callback throw.
7027 a0.a0 = 42;
7028
7029 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7030
7031 CHECK_EQ(0, result);
7032
7033 // Pass argument that will make the Dart callback return null.
7034 a0.a0 = 84;
7035
7036 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7037
7038 CHECK_EQ(0, result);
7039
7040 return 0;
7041}
7042
7043// Used for testing structs and unions by value.
7044// Arguments passed in FP registers as long as they fit.
7045// 10 struct arguments will exhaust available registers.
7047 // NOLINTNEXTLINE(whitespace/parens)
7048 float (*f)(Struct8BytesHomogeneousFloat a0,
7068
7069 a0.a0 = -1.0;
7070 a0.a1 = 2.0;
7071 a1.a0 = -3.0;
7072 a1.a1 = 4.0;
7073 a2.a0 = -5.0;
7074 a2.a1 = 6.0;
7075 a3.a0 = -7.0;
7076 a3.a1 = 8.0;
7077 a4.a0 = -9.0;
7078 a4.a1 = 10.0;
7079 a5.a0 = -11.0;
7080 a5.a1 = 12.0;
7081 a6.a0 = -13.0;
7082 a6.a1 = 14.0;
7083 a7.a0 = -15.0;
7084 a7.a1 = 16.0;
7085 a8.a0 = -17.0;
7086 a8.a1 = 18.0;
7087 a9.a0 = -19.0;
7088 a9.a1 = 20.0;
7089
7090 std::cout << "Calling TestPassStruct8BytesHomogeneousFloatx10(" << "(("
7091 << a0.a0 << ", " << a0.a1 << "), (" << a1.a0 << ", " << a1.a1
7092 << "), (" << a2.a0 << ", " << a2.a1 << "), (" << a3.a0 << ", "
7093 << a3.a1 << "), (" << a4.a0 << ", " << a4.a1 << "), (" << a5.a0
7094 << ", " << a5.a1 << "), (" << a6.a0 << ", " << a6.a1 << "), ("
7095 << a7.a0 << ", " << a7.a1 << "), (" << a8.a0 << ", " << a8.a1
7096 << "), (" << a9.a0 << ", " << a9.a1 << "))" << ")\n";
7097
7098 float result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7099
7100 std::cout << "result = " << result << "\n";
7101
7102 CHECK_APPROX(10.0, result);
7103
7104 // Pass argument that will make the Dart callback throw.
7105 a0.a0 = 42;
7106
7107 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7108
7109 CHECK_APPROX(0.0, result);
7110
7111 // Pass argument that will make the Dart callback return null.
7112 a0.a0 = 84;
7113
7114 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7115
7116 CHECK_APPROX(0.0, result);
7117
7118 return 0;
7119}
7120
7121// Used for testing structs and unions by value.
7122// On x64, arguments go in int registers because it is not only float.
7123// 10 struct arguments will exhaust available registers.
7125 // NOLINTNEXTLINE(whitespace/parens)
7126 float (*f)(Struct8BytesMixed a0,
7135 Struct8BytesMixed a9)) {
7136 Struct8BytesMixed a0 = {};
7137 Struct8BytesMixed a1 = {};
7138 Struct8BytesMixed a2 = {};
7139 Struct8BytesMixed a3 = {};
7140 Struct8BytesMixed a4 = {};
7141 Struct8BytesMixed a5 = {};
7142 Struct8BytesMixed a6 = {};
7143 Struct8BytesMixed a7 = {};
7144 Struct8BytesMixed a8 = {};
7145 Struct8BytesMixed a9 = {};
7146
7147 a0.a0 = -1.0;
7148 a0.a1 = 2;
7149 a0.a2 = -3;
7150 a1.a0 = 4.0;
7151 a1.a1 = -5;
7152 a1.a2 = 6;
7153 a2.a0 = -7.0;
7154 a2.a1 = 8;
7155 a2.a2 = -9;
7156 a3.a0 = 10.0;
7157 a3.a1 = -11;
7158 a3.a2 = 12;
7159 a4.a0 = -13.0;
7160 a4.a1 = 14;
7161 a4.a2 = -15;
7162 a5.a0 = 16.0;
7163 a5.a1 = -17;
7164 a5.a2 = 18;
7165 a6.a0 = -19.0;
7166 a6.a1 = 20;
7167 a6.a2 = -21;
7168 a7.a0 = 22.0;
7169 a7.a1 = -23;
7170 a7.a2 = 24;
7171 a8.a0 = -25.0;
7172 a8.a1 = 26;
7173 a8.a2 = -27;
7174 a9.a0 = 28.0;
7175 a9.a1 = -29;
7176 a9.a2 = 30;
7177
7178 std::cout << "Calling TestPassStruct8BytesMixedx10(" << "((" << a0.a0 << ", "
7179 << a0.a1 << ", " << a0.a2 << "), (" << a1.a0 << ", " << a1.a1
7180 << ", " << a1.a2 << "), (" << a2.a0 << ", " << a2.a1 << ", "
7181 << a2.a2 << "), (" << a3.a0 << ", " << a3.a1 << ", " << a3.a2
7182 << "), (" << a4.a0 << ", " << a4.a1 << ", " << a4.a2 << "), ("
7183 << a5.a0 << ", " << a5.a1 << ", " << a5.a2 << "), (" << a6.a0
7184 << ", " << a6.a1 << ", " << a6.a2 << "), (" << a7.a0 << ", "
7185 << a7.a1 << ", " << a7.a2 << "), (" << a8.a0 << ", " << a8.a1
7186 << ", " << a8.a2 << "), (" << a9.a0 << ", " << a9.a1 << ", "
7187 << a9.a2 << "))" << ")\n";
7188
7189 float result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7190
7191 std::cout << "result = " << result << "\n";
7192
7193 CHECK_APPROX(15.0, result);
7194
7195 // Pass argument that will make the Dart callback throw.
7196 a0.a0 = 42;
7197
7198 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7199
7200 CHECK_APPROX(0.0, result);
7201
7202 // Pass argument that will make the Dart callback return null.
7203 a0.a0 = 84;
7204
7205 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7206
7207 CHECK_APPROX(0.0, result);
7208
7209 return 0;
7210}
7211
7212// Used for testing structs and unions by value.
7213// Argument is a single byte over a multiple of word size.
7214// 10 struct arguments will exhaust available registers.
7215// Struct only has 1-byte aligned fields to test struct alignment itself.
7216// Tests upper bytes in the integer registers that are partly filled.
7217// Tests stack alignment of non word size stack arguments.
7219 // NOLINTNEXTLINE(whitespace/parens)
7220 int64_t (*f)(Struct9BytesHomogeneousUint8 a0,
7240
7241 a0.a0 = 1;
7242 a0.a1 = 2;
7243 a0.a2 = 3;
7244 a0.a3 = 4;
7245 a0.a4 = 5;
7246 a0.a5 = 6;
7247 a0.a6 = 7;
7248 a0.a7 = 8;
7249 a0.a8 = 9;
7250 a1.a0 = 10;
7251 a1.a1 = 11;
7252 a1.a2 = 12;
7253 a1.a3 = 13;
7254 a1.a4 = 14;
7255 a1.a5 = 15;
7256 a1.a6 = 16;
7257 a1.a7 = 17;
7258 a1.a8 = 18;
7259 a2.a0 = 19;
7260 a2.a1 = 20;
7261 a2.a2 = 21;
7262 a2.a3 = 22;
7263 a2.a4 = 23;
7264 a2.a5 = 24;
7265 a2.a6 = 25;
7266 a2.a7 = 26;
7267 a2.a8 = 27;
7268 a3.a0 = 28;
7269 a3.a1 = 29;
7270 a3.a2 = 30;
7271 a3.a3 = 31;
7272 a3.a4 = 32;
7273 a3.a5 = 33;
7274 a3.a6 = 34;
7275 a3.a7 = 35;
7276 a3.a8 = 36;
7277 a4.a0 = 37;
7278 a4.a1 = 38;
7279 a4.a2 = 39;
7280 a4.a3 = 40;
7281 a4.a4 = 41;
7282 a4.a5 = 42;
7283 a4.a6 = 43;
7284 a4.a7 = 44;
7285 a4.a8 = 45;
7286 a5.a0 = 46;
7287 a5.a1 = 47;
7288 a5.a2 = 48;
7289 a5.a3 = 49;
7290 a5.a4 = 50;
7291 a5.a5 = 51;
7292 a5.a6 = 52;
7293 a5.a7 = 53;
7294 a5.a8 = 54;
7295 a6.a0 = 55;
7296 a6.a1 = 56;
7297 a6.a2 = 57;
7298 a6.a3 = 58;
7299 a6.a4 = 59;
7300 a6.a5 = 60;
7301 a6.a6 = 61;
7302 a6.a7 = 62;
7303 a6.a8 = 63;
7304 a7.a0 = 64;
7305 a7.a1 = 65;
7306 a7.a2 = 66;
7307 a7.a3 = 67;
7308 a7.a4 = 68;
7309 a7.a5 = 69;
7310 a7.a6 = 70;
7311 a7.a7 = 71;
7312 a7.a8 = 72;
7313 a8.a0 = 73;
7314 a8.a1 = 74;
7315 a8.a2 = 75;
7316 a8.a3 = 76;
7317 a8.a4 = 77;
7318 a8.a5 = 78;
7319 a8.a6 = 79;
7320 a8.a7 = 80;
7321 a8.a8 = 81;
7322 a9.a0 = 82;
7323 a9.a1 = 83;
7324 a9.a2 = 84;
7325 a9.a3 = 85;
7326 a9.a4 = 86;
7327 a9.a5 = 87;
7328 a9.a6 = 88;
7329 a9.a7 = 89;
7330 a9.a8 = 90;
7331
7332 std::cout
7333 << "Calling TestPassStruct9BytesHomogeneousUint8x10(" << "(("
7334 << static_cast<int>(a0.a0) << ", " << static_cast<int>(a0.a1) << ", "
7335 << static_cast<int>(a0.a2) << ", " << static_cast<int>(a0.a3) << ", "
7336 << static_cast<int>(a0.a4) << ", " << static_cast<int>(a0.a5) << ", "
7337 << static_cast<int>(a0.a6) << ", " << static_cast<int>(a0.a7) << ", "
7338 << static_cast<int>(a0.a8) << "), (" << static_cast<int>(a1.a0) << ", "
7339 << static_cast<int>(a1.a1) << ", " << static_cast<int>(a1.a2) << ", "
7340 << static_cast<int>(a1.a3) << ", " << static_cast<int>(a1.a4) << ", "
7341 << static_cast<int>(a1.a5) << ", " << static_cast<int>(a1.a6) << ", "
7342 << static_cast<int>(a1.a7) << ", " << static_cast<int>(a1.a8) << "), ("
7343 << static_cast<int>(a2.a0) << ", " << static_cast<int>(a2.a1) << ", "
7344 << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3) << ", "
7345 << static_cast<int>(a2.a4) << ", " << static_cast<int>(a2.a5) << ", "
7346 << static_cast<int>(a2.a6) << ", " << static_cast<int>(a2.a7) << ", "
7347 << static_cast<int>(a2.a8) << "), (" << static_cast<int>(a3.a0) << ", "
7348 << static_cast<int>(a3.a1) << ", " << static_cast<int>(a3.a2) << ", "
7349 << static_cast<int>(a3.a3) << ", " << static_cast<int>(a3.a4) << ", "
7350 << static_cast<int>(a3.a5) << ", " << static_cast<int>(a3.a6) << ", "
7351 << static_cast<int>(a3.a7) << ", " << static_cast<int>(a3.a8) << "), ("
7352 << static_cast<int>(a4.a0) << ", " << static_cast<int>(a4.a1) << ", "
7353 << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3) << ", "
7354 << static_cast<int>(a4.a4) << ", " << static_cast<int>(a4.a5) << ", "
7355 << static_cast<int>(a4.a6) << ", " << static_cast<int>(a4.a7) << ", "
7356 << static_cast<int>(a4.a8) << "), (" << static_cast<int>(a5.a0) << ", "
7357 << static_cast<int>(a5.a1) << ", " << static_cast<int>(a5.a2) << ", "
7358 << static_cast<int>(a5.a3) << ", " << static_cast<int>(a5.a4) << ", "
7359 << static_cast<int>(a5.a5) << ", " << static_cast<int>(a5.a6) << ", "
7360 << static_cast<int>(a5.a7) << ", " << static_cast<int>(a5.a8) << "), ("
7361 << static_cast<int>(a6.a0) << ", " << static_cast<int>(a6.a1) << ", "
7362 << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3) << ", "
7363 << static_cast<int>(a6.a4) << ", " << static_cast<int>(a6.a5) << ", "
7364 << static_cast<int>(a6.a6) << ", " << static_cast<int>(a6.a7) << ", "
7365 << static_cast<int>(a6.a8) << "), (" << static_cast<int>(a7.a0) << ", "
7366 << static_cast<int>(a7.a1) << ", " << static_cast<int>(a7.a2) << ", "
7367 << static_cast<int>(a7.a3) << ", " << static_cast<int>(a7.a4) << ", "
7368 << static_cast<int>(a7.a5) << ", " << static_cast<int>(a7.a6) << ", "
7369 << static_cast<int>(a7.a7) << ", " << static_cast<int>(a7.a8) << "), ("
7370 << static_cast<int>(a8.a0) << ", " << static_cast<int>(a8.a1) << ", "
7371 << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3) << ", "
7372 << static_cast<int>(a8.a4) << ", " << static_cast<int>(a8.a5) << ", "
7373 << static_cast<int>(a8.a6) << ", " << static_cast<int>(a8.a7) << ", "
7374 << static_cast<int>(a8.a8) << "), (" << static_cast<int>(a9.a0) << ", "
7375 << static_cast<int>(a9.a1) << ", " << static_cast<int>(a9.a2) << ", "
7376 << static_cast<int>(a9.a3) << ", " << static_cast<int>(a9.a4) << ", "
7377 << static_cast<int>(a9.a5) << ", " << static_cast<int>(a9.a6) << ", "
7378 << static_cast<int>(a9.a7) << ", " << static_cast<int>(a9.a8) << "))"
7379 << ")\n";
7380
7381 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7382
7383 std::cout << "result = " << result << "\n";
7384
7385 CHECK_EQ(4095, result);
7386
7387 // Pass argument that will make the Dart callback throw.
7388 a0.a0 = 42;
7389
7390 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7391
7392 CHECK_EQ(0, result);
7393
7394 // Pass argument that will make the Dart callback return null.
7395 a0.a0 = 84;
7396
7397 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7398
7399 CHECK_EQ(0, result);
7400
7401 return 0;
7402}
7403
7404// Used for testing structs and unions by value.
7405// Argument is a single byte over a multiple of word size.
7406// With alignment rules taken into account size is 12 or 16 bytes.
7407// 10 struct arguments will exhaust available registers.
7408//
7410 // NOLINTNEXTLINE(whitespace/parens)
7411 int64_t (*f)(Struct9BytesInt4Or8ByteAligned a0,
7431
7432 a0.a0 = -1;
7433 a0.a1 = 2;
7434 a1.a0 = -3;
7435 a1.a1 = 4;
7436 a2.a0 = -5;
7437 a2.a1 = 6;
7438 a3.a0 = -7;
7439 a3.a1 = 8;
7440 a4.a0 = -9;
7441 a4.a1 = 10;
7442 a5.a0 = -11;
7443 a5.a1 = 12;
7444 a6.a0 = -13;
7445 a6.a1 = 14;
7446 a7.a0 = -15;
7447 a7.a1 = 16;
7448 a8.a0 = -17;
7449 a8.a1 = 18;
7450 a9.a0 = -19;
7451 a9.a1 = 20;
7452
7453 std::cout << "Calling TestPassStruct9BytesInt4Or8ByteAlignedx10(" << "(("
7454 << a0.a0 << ", " << static_cast<int>(a0.a1) << "), (" << a1.a0
7455 << ", " << static_cast<int>(a1.a1) << "), (" << a2.a0 << ", "
7456 << static_cast<int>(a2.a1) << "), (" << a3.a0 << ", "
7457 << static_cast<int>(a3.a1) << "), (" << a4.a0 << ", "
7458 << static_cast<int>(a4.a1) << "), (" << a5.a0 << ", "
7459 << static_cast<int>(a5.a1) << "), (" << a6.a0 << ", "
7460 << static_cast<int>(a6.a1) << "), (" << a7.a0 << ", "
7461 << static_cast<int>(a7.a1) << "), (" << a8.a0 << ", "
7462 << static_cast<int>(a8.a1) << "), (" << a9.a0 << ", "
7463 << static_cast<int>(a9.a1) << "))" << ")\n";
7464
7465 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7466
7467 std::cout << "result = " << result << "\n";
7468
7469 CHECK_EQ(10, result);
7470
7471 // Pass argument that will make the Dart callback throw.
7472 a0.a0 = 42;
7473
7474 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7475
7476 CHECK_EQ(0, result);
7477
7478 // Pass argument that will make the Dart callback return null.
7479 a0.a0 = 84;
7480
7481 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7482
7483 CHECK_EQ(0, result);
7484
7485 return 0;
7486}
7487
7488// Used for testing structs and unions by value.
7489// Arguments in FPU registers on arm hardfp and arm64.
7490// Struct arguments will exhaust available registers, and leave some empty.
7491// The last argument is to test whether arguments are backfilled.
7493 // NOLINTNEXTLINE(whitespace/parens)
7494 float (*f)(Struct12BytesHomogeneousFloat a0,
7506
7507 a0.a0 = -1.0;
7508 a0.a1 = 2.0;
7509 a0.a2 = -3.0;
7510 a1.a0 = 4.0;
7511 a1.a1 = -5.0;
7512 a1.a2 = 6.0;
7513 a2.a0 = -7.0;
7514 a2.a1 = 8.0;
7515 a2.a2 = -9.0;
7516 a3.a0 = 10.0;
7517 a3.a1 = -11.0;
7518 a3.a2 = 12.0;
7519 a4.a0 = -13.0;
7520 a4.a1 = 14.0;
7521 a4.a2 = -15.0;
7522 a5.a0 = 16.0;
7523 a5.a1 = -17.0;
7524 a5.a2 = 18.0;
7525
7526 std::cout << "Calling TestPassStruct12BytesHomogeneousFloatx6(" << "(("
7527 << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << "), (" << a1.a0
7528 << ", " << a1.a1 << ", " << a1.a2 << "), (" << a2.a0 << ", "
7529 << a2.a1 << ", " << a2.a2 << "), (" << a3.a0 << ", " << a3.a1
7530 << ", " << a3.a2 << "), (" << a4.a0 << ", " << a4.a1 << ", "
7531 << a4.a2 << "), (" << a5.a0 << ", " << a5.a1 << ", " << a5.a2
7532 << "))" << ")\n";
7533
7534 float result = f(a0, a1, a2, a3, a4, a5);
7535
7536 std::cout << "result = " << result << "\n";
7537
7538 CHECK_APPROX(9.0, result);
7539
7540 // Pass argument that will make the Dart callback throw.
7541 a0.a0 = 42;
7542
7543 result = f(a0, a1, a2, a3, a4, a5);
7544
7545 CHECK_APPROX(0.0, result);
7546
7547 // Pass argument that will make the Dart callback return null.
7548 a0.a0 = 84;
7549
7550 result = f(a0, a1, a2, a3, a4, a5);
7551
7552 CHECK_APPROX(0.0, result);
7553
7554 return 0;
7555}
7556
7557// Used for testing structs and unions by value.
7558// On Linux x64 argument is transferred on stack because it is over 16 bytes.
7559// Arguments in FPU registers on arm hardfp and arm64.
7560// 5 struct arguments will exhaust available registers.
7562 // NOLINTNEXTLINE(whitespace/parens)
7563 float (*f)(Struct16BytesHomogeneousFloat a0,
7573
7574 a0.a0 = -1.0;
7575 a0.a1 = 2.0;
7576 a0.a2 = -3.0;
7577 a0.a3 = 4.0;
7578 a1.a0 = -5.0;
7579 a1.a1 = 6.0;
7580 a1.a2 = -7.0;
7581 a1.a3 = 8.0;
7582 a2.a0 = -9.0;
7583 a2.a1 = 10.0;
7584 a2.a2 = -11.0;
7585 a2.a3 = 12.0;
7586 a3.a0 = -13.0;
7587 a3.a1 = 14.0;
7588 a3.a2 = -15.0;
7589 a3.a3 = 16.0;
7590 a4.a0 = -17.0;
7591 a4.a1 = 18.0;
7592 a4.a2 = -19.0;
7593 a4.a3 = 20.0;
7594
7595 std::cout << "Calling TestPassStruct16BytesHomogeneousFloatx5(" << "(("
7596 << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
7597 << "), (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", "
7598 << a1.a3 << "), (" << a2.a0 << ", " << a2.a1 << ", " << a2.a2
7599 << ", " << a2.a3 << "), (" << a3.a0 << ", " << a3.a1 << ", "
7600 << a3.a2 << ", " << a3.a3 << "), (" << a4.a0 << ", " << a4.a1
7601 << ", " << a4.a2 << ", " << a4.a3 << "))" << ")\n";
7602
7603 float result = f(a0, a1, a2, a3, a4);
7604
7605 std::cout << "result = " << result << "\n";
7606
7607 CHECK_APPROX(10.0, result);
7608
7609 // Pass argument that will make the Dart callback throw.
7610 a0.a0 = 42;
7611
7612 result = f(a0, a1, a2, a3, a4);
7613
7614 CHECK_APPROX(0.0, result);
7615
7616 // Pass argument that will make the Dart callback return null.
7617 a0.a0 = 84;
7618
7619 result = f(a0, a1, a2, a3, a4);
7620
7621 CHECK_APPROX(0.0, result);
7622
7623 return 0;
7624}
7625
7626// Used for testing structs and unions by value.
7627// On x64, arguments are split over FP and int registers.
7628// On x64, it will exhaust the integer registers with the 6th argument.
7629// The rest goes on the stack.
7630// On arm, arguments are 8 byte aligned.
7632 // NOLINTNEXTLINE(whitespace/parens)
7633 double (*f)(Struct16BytesMixed a0,
7642 Struct16BytesMixed a9)) {
7643 Struct16BytesMixed a0 = {};
7644 Struct16BytesMixed a1 = {};
7645 Struct16BytesMixed a2 = {};
7646 Struct16BytesMixed a3 = {};
7647 Struct16BytesMixed a4 = {};
7648 Struct16BytesMixed a5 = {};
7649 Struct16BytesMixed a6 = {};
7650 Struct16BytesMixed a7 = {};
7651 Struct16BytesMixed a8 = {};
7652 Struct16BytesMixed a9 = {};
7653
7654 a0.a0 = -1.0;
7655 a0.a1 = 2;
7656 a1.a0 = -3.0;
7657 a1.a1 = 4;
7658 a2.a0 = -5.0;
7659 a2.a1 = 6;
7660 a3.a0 = -7.0;
7661 a3.a1 = 8;
7662 a4.a0 = -9.0;
7663 a4.a1 = 10;
7664 a5.a0 = -11.0;
7665 a5.a1 = 12;
7666 a6.a0 = -13.0;
7667 a6.a1 = 14;
7668 a7.a0 = -15.0;
7669 a7.a1 = 16;
7670 a8.a0 = -17.0;
7671 a8.a1 = 18;
7672 a9.a0 = -19.0;
7673 a9.a1 = 20;
7674
7675 std::cout << "Calling TestPassStruct16BytesMixedx10(" << "((" << a0.a0 << ", "
7676 << a0.a1 << "), (" << a1.a0 << ", " << a1.a1 << "), (" << a2.a0
7677 << ", " << a2.a1 << "), (" << a3.a0 << ", " << a3.a1 << "), ("
7678 << a4.a0 << ", " << a4.a1 << "), (" << a5.a0 << ", " << a5.a1
7679 << "), (" << a6.a0 << ", " << a6.a1 << "), (" << a7.a0 << ", "
7680 << a7.a1 << "), (" << a8.a0 << ", " << a8.a1 << "), (" << a9.a0
7681 << ", " << a9.a1 << "))" << ")\n";
7682
7683 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7684
7685 std::cout << "result = " << result << "\n";
7686
7687 CHECK_APPROX(10.0, result);
7688
7689 // Pass argument that will make the Dart callback throw.
7690 a0.a0 = 42;
7691
7692 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7693
7694 CHECK_APPROX(0.0, result);
7695
7696 // Pass argument that will make the Dart callback return null.
7697 a0.a0 = 84;
7698
7699 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7700
7701 CHECK_APPROX(0.0, result);
7702
7703 return 0;
7704}
7705
7706// Used for testing structs and unions by value.
7707// On x64, arguments are split over FP and int registers.
7708// On x64, it will exhaust the integer registers with the 6th argument.
7709// The rest goes on the stack.
7710// On arm, arguments are 4 byte aligned.
7712 // NOLINTNEXTLINE(whitespace/parens)
7713 float (*f)(Struct16BytesMixed2 a0,
7722 Struct16BytesMixed2 a9)) {
7723 Struct16BytesMixed2 a0 = {};
7724 Struct16BytesMixed2 a1 = {};
7725 Struct16BytesMixed2 a2 = {};
7726 Struct16BytesMixed2 a3 = {};
7727 Struct16BytesMixed2 a4 = {};
7728 Struct16BytesMixed2 a5 = {};
7729 Struct16BytesMixed2 a6 = {};
7730 Struct16BytesMixed2 a7 = {};
7731 Struct16BytesMixed2 a8 = {};
7732 Struct16BytesMixed2 a9 = {};
7733
7734 a0.a0 = -1.0;
7735 a0.a1 = 2.0;
7736 a0.a2 = -3.0;
7737 a0.a3 = 4;
7738 a1.a0 = -5.0;
7739 a1.a1 = 6.0;
7740 a1.a2 = -7.0;
7741 a1.a3 = 8;
7742 a2.a0 = -9.0;
7743 a2.a1 = 10.0;
7744 a2.a2 = -11.0;
7745 a2.a3 = 12;
7746 a3.a0 = -13.0;
7747 a3.a1 = 14.0;
7748 a3.a2 = -15.0;
7749 a3.a3 = 16;
7750 a4.a0 = -17.0;
7751 a4.a1 = 18.0;
7752 a4.a2 = -19.0;
7753 a4.a3 = 20;
7754 a5.a0 = -21.0;
7755 a5.a1 = 22.0;
7756 a5.a2 = -23.0;
7757 a5.a3 = 24;
7758 a6.a0 = -25.0;
7759 a6.a1 = 26.0;
7760 a6.a2 = -27.0;
7761 a6.a3 = 28;
7762 a7.a0 = -29.0;
7763 a7.a1 = 30.0;
7764 a7.a2 = -31.0;
7765 a7.a3 = 32;
7766 a8.a0 = -33.0;
7767 a8.a1 = 34.0;
7768 a8.a2 = -35.0;
7769 a8.a3 = 36;
7770 a9.a0 = -37.0;
7771 a9.a1 = 38.0;
7772 a9.a2 = -39.0;
7773 a9.a3 = 40;
7774
7775 std::cout << "Calling TestPassStruct16BytesMixed2x10(" << "((" << a0.a0
7776 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3 << "), ("
7777 << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", " << a1.a3
7778 << "), (" << a2.a0 << ", " << a2.a1 << ", " << a2.a2 << ", "
7779 << a2.a3 << "), (" << a3.a0 << ", " << a3.a1 << ", " << a3.a2
7780 << ", " << a3.a3 << "), (" << a4.a0 << ", " << a4.a1 << ", "
7781 << a4.a2 << ", " << a4.a3 << "), (" << a5.a0 << ", " << a5.a1
7782 << ", " << a5.a2 << ", " << a5.a3 << "), (" << a6.a0 << ", "
7783 << a6.a1 << ", " << a6.a2 << ", " << a6.a3 << "), (" << a7.a0
7784 << ", " << a7.a1 << ", " << a7.a2 << ", " << a7.a3 << "), ("
7785 << a8.a0 << ", " << a8.a1 << ", " << a8.a2 << ", " << a8.a3
7786 << "), (" << a9.a0 << ", " << a9.a1 << ", " << a9.a2 << ", "
7787 << a9.a3 << "))" << ")\n";
7788
7789 float result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7790
7791 std::cout << "result = " << result << "\n";
7792
7793 CHECK_APPROX(20.0, result);
7794
7795 // Pass argument that will make the Dart callback throw.
7796 a0.a0 = 42;
7797
7798 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7799
7800 CHECK_APPROX(0.0, result);
7801
7802 // Pass argument that will make the Dart callback return null.
7803 a0.a0 = 84;
7804
7805 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7806
7807 CHECK_APPROX(0.0, result);
7808
7809 return 0;
7810}
7811
7812// Used for testing structs and unions by value.
7813// Arguments are passed as pointer to copy on arm64.
7814// Tests that the memory allocated for copies are rounded up to word size.
7816 // NOLINTNEXTLINE(whitespace/parens)
7817 int64_t (*f)(Struct17BytesInt a0,
7826 Struct17BytesInt a9)) {
7827 Struct17BytesInt a0 = {};
7828 Struct17BytesInt a1 = {};
7829 Struct17BytesInt a2 = {};
7830 Struct17BytesInt a3 = {};
7831 Struct17BytesInt a4 = {};
7832 Struct17BytesInt a5 = {};
7833 Struct17BytesInt a6 = {};
7834 Struct17BytesInt a7 = {};
7835 Struct17BytesInt a8 = {};
7836 Struct17BytesInt a9 = {};
7837
7838 a0.a0 = -1;
7839 a0.a1 = 2;
7840 a0.a2 = -3;
7841 a1.a0 = 4;
7842 a1.a1 = -5;
7843 a1.a2 = 6;
7844 a2.a0 = -7;
7845 a2.a1 = 8;
7846 a2.a2 = -9;
7847 a3.a0 = 10;
7848 a3.a1 = -11;
7849 a3.a2 = 12;
7850 a4.a0 = -13;
7851 a4.a1 = 14;
7852 a4.a2 = -15;
7853 a5.a0 = 16;
7854 a5.a1 = -17;
7855 a5.a2 = 18;
7856 a6.a0 = -19;
7857 a6.a1 = 20;
7858 a6.a2 = -21;
7859 a7.a0 = 22;
7860 a7.a1 = -23;
7861 a7.a2 = 24;
7862 a8.a0 = -25;
7863 a8.a1 = 26;
7864 a8.a2 = -27;
7865 a9.a0 = 28;
7866 a9.a1 = -29;
7867 a9.a2 = 30;
7868
7869 std::cout << "Calling TestPassStruct17BytesIntx10(" << "((" << a0.a0 << ", "
7870 << a0.a1 << ", " << static_cast<int>(a0.a2) << "), (" << a1.a0
7871 << ", " << a1.a1 << ", " << static_cast<int>(a1.a2) << "), ("
7872 << a2.a0 << ", " << a2.a1 << ", " << static_cast<int>(a2.a2)
7873 << "), (" << a3.a0 << ", " << a3.a1 << ", "
7874 << static_cast<int>(a3.a2) << "), (" << a4.a0 << ", " << a4.a1
7875 << ", " << static_cast<int>(a4.a2) << "), (" << a5.a0 << ", "
7876 << a5.a1 << ", " << static_cast<int>(a5.a2) << "), (" << a6.a0
7877 << ", " << a6.a1 << ", " << static_cast<int>(a6.a2) << "), ("
7878 << a7.a0 << ", " << a7.a1 << ", " << static_cast<int>(a7.a2)
7879 << "), (" << a8.a0 << ", " << a8.a1 << ", "
7880 << static_cast<int>(a8.a2) << "), (" << a9.a0 << ", " << a9.a1
7881 << ", " << static_cast<int>(a9.a2) << "))" << ")\n";
7882
7883 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7884
7885 std::cout << "result = " << result << "\n";
7886
7887 CHECK_EQ(15, result);
7888
7889 // Pass argument that will make the Dart callback throw.
7890 a0.a0 = 42;
7891
7892 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7893
7894 CHECK_EQ(0, result);
7895
7896 // Pass argument that will make the Dart callback return null.
7897 a0.a0 = 84;
7898
7899 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
7900
7901 CHECK_EQ(0, result);
7902
7903 return 0;
7904}
7905
7906// Used for testing structs and unions by value.
7907// The minimum alignment of this struct is only 1 byte based on its fields.
7908// Test that the memory backing these structs is extended to the right size.
7909//
7911 // NOLINTNEXTLINE(whitespace/parens)
7912 int64_t (*f)(Struct19BytesHomogeneousUint8 a0,
7932
7933 a0.a0 = 1;
7934 a0.a1 = 2;
7935 a0.a2 = 3;
7936 a0.a3 = 4;
7937 a0.a4 = 5;
7938 a0.a5 = 6;
7939 a0.a6 = 7;
7940 a0.a7 = 8;
7941 a0.a8 = 9;
7942 a0.a9 = 10;
7943 a0.a10 = 11;
7944 a0.a11 = 12;
7945 a0.a12 = 13;
7946 a0.a13 = 14;
7947 a0.a14 = 15;
7948 a0.a15 = 16;
7949 a0.a16 = 17;
7950 a0.a17 = 18;
7951 a0.a18 = 19;
7952 a1.a0 = 20;
7953 a1.a1 = 21;
7954 a1.a2 = 22;
7955 a1.a3 = 23;
7956 a1.a4 = 24;
7957 a1.a5 = 25;
7958 a1.a6 = 26;
7959 a1.a7 = 27;
7960 a1.a8 = 28;
7961 a1.a9 = 29;
7962 a1.a10 = 30;
7963 a1.a11 = 31;
7964 a1.a12 = 32;
7965 a1.a13 = 33;
7966 a1.a14 = 34;
7967 a1.a15 = 35;
7968 a1.a16 = 36;
7969 a1.a17 = 37;
7970 a1.a18 = 38;
7971 a2.a0 = 39;
7972 a2.a1 = 40;
7973 a2.a2 = 41;
7974 a2.a3 = 42;
7975 a2.a4 = 43;
7976 a2.a5 = 44;
7977 a2.a6 = 45;
7978 a2.a7 = 46;
7979 a2.a8 = 47;
7980 a2.a9 = 48;
7981 a2.a10 = 49;
7982 a2.a11 = 50;
7983 a2.a12 = 51;
7984 a2.a13 = 52;
7985 a2.a14 = 53;
7986 a2.a15 = 54;
7987 a2.a16 = 55;
7988 a2.a17 = 56;
7989 a2.a18 = 57;
7990 a3.a0 = 58;
7991 a3.a1 = 59;
7992 a3.a2 = 60;
7993 a3.a3 = 61;
7994 a3.a4 = 62;
7995 a3.a5 = 63;
7996 a3.a6 = 64;
7997 a3.a7 = 65;
7998 a3.a8 = 66;
7999 a3.a9 = 67;
8000 a3.a10 = 68;
8001 a3.a11 = 69;
8002 a3.a12 = 70;
8003 a3.a13 = 71;
8004 a3.a14 = 72;
8005 a3.a15 = 73;
8006 a3.a16 = 74;
8007 a3.a17 = 75;
8008 a3.a18 = 76;
8009 a4.a0 = 77;
8010 a4.a1 = 78;
8011 a4.a2 = 79;
8012 a4.a3 = 80;
8013 a4.a4 = 81;
8014 a4.a5 = 82;
8015 a4.a6 = 83;
8016 a4.a7 = 84;
8017 a4.a8 = 85;
8018 a4.a9 = 86;
8019 a4.a10 = 87;
8020 a4.a11 = 88;
8021 a4.a12 = 89;
8022 a4.a13 = 90;
8023 a4.a14 = 91;
8024 a4.a15 = 92;
8025 a4.a16 = 93;
8026 a4.a17 = 94;
8027 a4.a18 = 95;
8028 a5.a0 = 96;
8029 a5.a1 = 97;
8030 a5.a2 = 98;
8031 a5.a3 = 99;
8032 a5.a4 = 100;
8033 a5.a5 = 101;
8034 a5.a6 = 102;
8035 a5.a7 = 103;
8036 a5.a8 = 104;
8037 a5.a9 = 105;
8038 a5.a10 = 106;
8039 a5.a11 = 107;
8040 a5.a12 = 108;
8041 a5.a13 = 109;
8042 a5.a14 = 110;
8043 a5.a15 = 111;
8044 a5.a16 = 112;
8045 a5.a17 = 113;
8046 a5.a18 = 114;
8047 a6.a0 = 115;
8048 a6.a1 = 116;
8049 a6.a2 = 117;
8050 a6.a3 = 118;
8051 a6.a4 = 119;
8052 a6.a5 = 120;
8053 a6.a6 = 121;
8054 a6.a7 = 122;
8055 a6.a8 = 123;
8056 a6.a9 = 124;
8057 a6.a10 = 125;
8058 a6.a11 = 126;
8059 a6.a12 = 127;
8060 a6.a13 = 128;
8061 a6.a14 = 129;
8062 a6.a15 = 130;
8063 a6.a16 = 131;
8064 a6.a17 = 132;
8065 a6.a18 = 133;
8066 a7.a0 = 134;
8067 a7.a1 = 135;
8068 a7.a2 = 136;
8069 a7.a3 = 137;
8070 a7.a4 = 138;
8071 a7.a5 = 139;
8072 a7.a6 = 140;
8073 a7.a7 = 141;
8074 a7.a8 = 142;
8075 a7.a9 = 143;
8076 a7.a10 = 144;
8077 a7.a11 = 145;
8078 a7.a12 = 146;
8079 a7.a13 = 147;
8080 a7.a14 = 148;
8081 a7.a15 = 149;
8082 a7.a16 = 150;
8083 a7.a17 = 151;
8084 a7.a18 = 152;
8085 a8.a0 = 153;
8086 a8.a1 = 154;
8087 a8.a2 = 155;
8088 a8.a3 = 156;
8089 a8.a4 = 157;
8090 a8.a5 = 158;
8091 a8.a6 = 159;
8092 a8.a7 = 160;
8093 a8.a8 = 161;
8094 a8.a9 = 162;
8095 a8.a10 = 163;
8096 a8.a11 = 164;
8097 a8.a12 = 165;
8098 a8.a13 = 166;
8099 a8.a14 = 167;
8100 a8.a15 = 168;
8101 a8.a16 = 169;
8102 a8.a17 = 170;
8103 a8.a18 = 171;
8104 a9.a0 = 172;
8105 a9.a1 = 173;
8106 a9.a2 = 174;
8107 a9.a3 = 175;
8108 a9.a4 = 176;
8109 a9.a5 = 177;
8110 a9.a6 = 178;
8111 a9.a7 = 179;
8112 a9.a8 = 180;
8113 a9.a9 = 181;
8114 a9.a10 = 182;
8115 a9.a11 = 183;
8116 a9.a12 = 184;
8117 a9.a13 = 185;
8118 a9.a14 = 186;
8119 a9.a15 = 187;
8120 a9.a16 = 188;
8121 a9.a17 = 189;
8122 a9.a18 = 190;
8123
8124 std::cout
8125 << "Calling TestPassStruct19BytesHomogeneousUint8x10(" << "(("
8126 << static_cast<int>(a0.a0) << ", " << static_cast<int>(a0.a1) << ", "
8127 << static_cast<int>(a0.a2) << ", " << static_cast<int>(a0.a3) << ", "
8128 << static_cast<int>(a0.a4) << ", " << static_cast<int>(a0.a5) << ", "
8129 << static_cast<int>(a0.a6) << ", " << static_cast<int>(a0.a7) << ", "
8130 << static_cast<int>(a0.a8) << ", " << static_cast<int>(a0.a9) << ", "
8131 << static_cast<int>(a0.a10) << ", " << static_cast<int>(a0.a11) << ", "
8132 << static_cast<int>(a0.a12) << ", " << static_cast<int>(a0.a13) << ", "
8133 << static_cast<int>(a0.a14) << ", " << static_cast<int>(a0.a15) << ", "
8134 << static_cast<int>(a0.a16) << ", " << static_cast<int>(a0.a17) << ", "
8135 << static_cast<int>(a0.a18) << "), (" << static_cast<int>(a1.a0) << ", "
8136 << static_cast<int>(a1.a1) << ", " << static_cast<int>(a1.a2) << ", "
8137 << static_cast<int>(a1.a3) << ", " << static_cast<int>(a1.a4) << ", "
8138 << static_cast<int>(a1.a5) << ", " << static_cast<int>(a1.a6) << ", "
8139 << static_cast<int>(a1.a7) << ", " << static_cast<int>(a1.a8) << ", "
8140 << static_cast<int>(a1.a9) << ", " << static_cast<int>(a1.a10) << ", "
8141 << static_cast<int>(a1.a11) << ", " << static_cast<int>(a1.a12) << ", "
8142 << static_cast<int>(a1.a13) << ", " << static_cast<int>(a1.a14) << ", "
8143 << static_cast<int>(a1.a15) << ", " << static_cast<int>(a1.a16) << ", "
8144 << static_cast<int>(a1.a17) << ", " << static_cast<int>(a1.a18) << "), ("
8145 << static_cast<int>(a2.a0) << ", " << static_cast<int>(a2.a1) << ", "
8146 << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3) << ", "
8147 << static_cast<int>(a2.a4) << ", " << static_cast<int>(a2.a5) << ", "
8148 << static_cast<int>(a2.a6) << ", " << static_cast<int>(a2.a7) << ", "
8149 << static_cast<int>(a2.a8) << ", " << static_cast<int>(a2.a9) << ", "
8150 << static_cast<int>(a2.a10) << ", " << static_cast<int>(a2.a11) << ", "
8151 << static_cast<int>(a2.a12) << ", " << static_cast<int>(a2.a13) << ", "
8152 << static_cast<int>(a2.a14) << ", " << static_cast<int>(a2.a15) << ", "
8153 << static_cast<int>(a2.a16) << ", " << static_cast<int>(a2.a17) << ", "
8154 << static_cast<int>(a2.a18) << "), (" << static_cast<int>(a3.a0) << ", "
8155 << static_cast<int>(a3.a1) << ", " << static_cast<int>(a3.a2) << ", "
8156 << static_cast<int>(a3.a3) << ", " << static_cast<int>(a3.a4) << ", "
8157 << static_cast<int>(a3.a5) << ", " << static_cast<int>(a3.a6) << ", "
8158 << static_cast<int>(a3.a7) << ", " << static_cast<int>(a3.a8) << ", "
8159 << static_cast<int>(a3.a9) << ", " << static_cast<int>(a3.a10) << ", "
8160 << static_cast<int>(a3.a11) << ", " << static_cast<int>(a3.a12) << ", "
8161 << static_cast<int>(a3.a13) << ", " << static_cast<int>(a3.a14) << ", "
8162 << static_cast<int>(a3.a15) << ", " << static_cast<int>(a3.a16) << ", "
8163 << static_cast<int>(a3.a17) << ", " << static_cast<int>(a3.a18) << "), ("
8164 << static_cast<int>(a4.a0) << ", " << static_cast<int>(a4.a1) << ", "
8165 << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3) << ", "
8166 << static_cast<int>(a4.a4) << ", " << static_cast<int>(a4.a5) << ", "
8167 << static_cast<int>(a4.a6) << ", " << static_cast<int>(a4.a7) << ", "
8168 << static_cast<int>(a4.a8) << ", " << static_cast<int>(a4.a9) << ", "
8169 << static_cast<int>(a4.a10) << ", " << static_cast<int>(a4.a11) << ", "
8170 << static_cast<int>(a4.a12) << ", " << static_cast<int>(a4.a13) << ", "
8171 << static_cast<int>(a4.a14) << ", " << static_cast<int>(a4.a15) << ", "
8172 << static_cast<int>(a4.a16) << ", " << static_cast<int>(a4.a17) << ", "
8173 << static_cast<int>(a4.a18) << "), (" << static_cast<int>(a5.a0) << ", "
8174 << static_cast<int>(a5.a1) << ", " << static_cast<int>(a5.a2) << ", "
8175 << static_cast<int>(a5.a3) << ", " << static_cast<int>(a5.a4) << ", "
8176 << static_cast<int>(a5.a5) << ", " << static_cast<int>(a5.a6) << ", "
8177 << static_cast<int>(a5.a7) << ", " << static_cast<int>(a5.a8) << ", "
8178 << static_cast<int>(a5.a9) << ", " << static_cast<int>(a5.a10) << ", "
8179 << static_cast<int>(a5.a11) << ", " << static_cast<int>(a5.a12) << ", "
8180 << static_cast<int>(a5.a13) << ", " << static_cast<int>(a5.a14) << ", "
8181 << static_cast<int>(a5.a15) << ", " << static_cast<int>(a5.a16) << ", "
8182 << static_cast<int>(a5.a17) << ", " << static_cast<int>(a5.a18) << "), ("
8183 << static_cast<int>(a6.a0) << ", " << static_cast<int>(a6.a1) << ", "
8184 << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3) << ", "
8185 << static_cast<int>(a6.a4) << ", " << static_cast<int>(a6.a5) << ", "
8186 << static_cast<int>(a6.a6) << ", " << static_cast<int>(a6.a7) << ", "
8187 << static_cast<int>(a6.a8) << ", " << static_cast<int>(a6.a9) << ", "
8188 << static_cast<int>(a6.a10) << ", " << static_cast<int>(a6.a11) << ", "
8189 << static_cast<int>(a6.a12) << ", " << static_cast<int>(a6.a13) << ", "
8190 << static_cast<int>(a6.a14) << ", " << static_cast<int>(a6.a15) << ", "
8191 << static_cast<int>(a6.a16) << ", " << static_cast<int>(a6.a17) << ", "
8192 << static_cast<int>(a6.a18) << "), (" << static_cast<int>(a7.a0) << ", "
8193 << static_cast<int>(a7.a1) << ", " << static_cast<int>(a7.a2) << ", "
8194 << static_cast<int>(a7.a3) << ", " << static_cast<int>(a7.a4) << ", "
8195 << static_cast<int>(a7.a5) << ", " << static_cast<int>(a7.a6) << ", "
8196 << static_cast<int>(a7.a7) << ", " << static_cast<int>(a7.a8) << ", "
8197 << static_cast<int>(a7.a9) << ", " << static_cast<int>(a7.a10) << ", "
8198 << static_cast<int>(a7.a11) << ", " << static_cast<int>(a7.a12) << ", "
8199 << static_cast<int>(a7.a13) << ", " << static_cast<int>(a7.a14) << ", "
8200 << static_cast<int>(a7.a15) << ", " << static_cast<int>(a7.a16) << ", "
8201 << static_cast<int>(a7.a17) << ", " << static_cast<int>(a7.a18) << "), ("
8202 << static_cast<int>(a8.a0) << ", " << static_cast<int>(a8.a1) << ", "
8203 << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3) << ", "
8204 << static_cast<int>(a8.a4) << ", " << static_cast<int>(a8.a5) << ", "
8205 << static_cast<int>(a8.a6) << ", " << static_cast<int>(a8.a7) << ", "
8206 << static_cast<int>(a8.a8) << ", " << static_cast<int>(a8.a9) << ", "
8207 << static_cast<int>(a8.a10) << ", " << static_cast<int>(a8.a11) << ", "
8208 << static_cast<int>(a8.a12) << ", " << static_cast<int>(a8.a13) << ", "
8209 << static_cast<int>(a8.a14) << ", " << static_cast<int>(a8.a15) << ", "
8210 << static_cast<int>(a8.a16) << ", " << static_cast<int>(a8.a17) << ", "
8211 << static_cast<int>(a8.a18) << "), (" << static_cast<int>(a9.a0) << ", "
8212 << static_cast<int>(a9.a1) << ", " << static_cast<int>(a9.a2) << ", "
8213 << static_cast<int>(a9.a3) << ", " << static_cast<int>(a9.a4) << ", "
8214 << static_cast<int>(a9.a5) << ", " << static_cast<int>(a9.a6) << ", "
8215 << static_cast<int>(a9.a7) << ", " << static_cast<int>(a9.a8) << ", "
8216 << static_cast<int>(a9.a9) << ", " << static_cast<int>(a9.a10) << ", "
8217 << static_cast<int>(a9.a11) << ", " << static_cast<int>(a9.a12) << ", "
8218 << static_cast<int>(a9.a13) << ", " << static_cast<int>(a9.a14) << ", "
8219 << static_cast<int>(a9.a15) << ", " << static_cast<int>(a9.a16) << ", "
8220 << static_cast<int>(a9.a17) << ", " << static_cast<int>(a9.a18) << "))"
8221 << ")\n";
8222
8223 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
8224
8225 std::cout << "result = " << result << "\n";
8226
8227 CHECK_EQ(18145, result);
8228
8229 // Pass argument that will make the Dart callback throw.
8230 a0.a0 = 42;
8231
8232 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
8233
8234 CHECK_EQ(0, result);
8235
8236 // Pass argument that will make the Dart callback return null.
8237 a0.a0 = 84;
8238
8239 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
8240
8241 CHECK_EQ(0, result);
8242
8243 return 0;
8244}
8245
8246// Used for testing structs and unions by value.
8247// Argument too big to go into integer registers on arm64.
8248// The arguments are passed as pointers to copies.
8249// The amount of arguments exhausts the number of integer registers, such that
8250// pointers to copies are also passed on the stack.
8252 // NOLINTNEXTLINE(whitespace/parens)
8253 int32_t (*f)(Struct20BytesHomogeneousInt32 a0,
8273
8274 a0.a0 = -1;
8275 a0.a1 = 2;
8276 a0.a2 = -3;
8277 a0.a3 = 4;
8278 a0.a4 = -5;
8279 a1.a0 = 6;
8280 a1.a1 = -7;
8281 a1.a2 = 8;
8282 a1.a3 = -9;
8283 a1.a4 = 10;
8284 a2.a0 = -11;
8285 a2.a1 = 12;
8286 a2.a2 = -13;
8287 a2.a3 = 14;
8288 a2.a4 = -15;
8289 a3.a0 = 16;
8290 a3.a1 = -17;
8291 a3.a2 = 18;
8292 a3.a3 = -19;
8293 a3.a4 = 20;
8294 a4.a0 = -21;
8295 a4.a1 = 22;
8296 a4.a2 = -23;
8297 a4.a3 = 24;
8298 a4.a4 = -25;
8299 a5.a0 = 26;
8300 a5.a1 = -27;
8301 a5.a2 = 28;
8302 a5.a3 = -29;
8303 a5.a4 = 30;
8304 a6.a0 = -31;
8305 a6.a1 = 32;
8306 a6.a2 = -33;
8307 a6.a3 = 34;
8308 a6.a4 = -35;
8309 a7.a0 = 36;
8310 a7.a1 = -37;
8311 a7.a2 = 38;
8312 a7.a3 = -39;
8313 a7.a4 = 40;
8314 a8.a0 = -41;
8315 a8.a1 = 42;
8316 a8.a2 = -43;
8317 a8.a3 = 44;
8318 a8.a4 = -45;
8319 a9.a0 = 46;
8320 a9.a1 = -47;
8321 a9.a2 = 48;
8322 a9.a3 = -49;
8323 a9.a4 = 50;
8324
8325 std::cout << "Calling TestPassStruct20BytesHomogeneousInt32x10(" << "(("
8326 << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3 << ", "
8327 << a0.a4 << "), (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2
8328 << ", " << a1.a3 << ", " << a1.a4 << "), (" << a2.a0 << ", "
8329 << a2.a1 << ", " << a2.a2 << ", " << a2.a3 << ", " << a2.a4
8330 << "), (" << a3.a0 << ", " << a3.a1 << ", " << a3.a2 << ", "
8331 << a3.a3 << ", " << a3.a4 << "), (" << a4.a0 << ", " << a4.a1
8332 << ", " << a4.a2 << ", " << a4.a3 << ", " << a4.a4 << "), ("
8333 << a5.a0 << ", " << a5.a1 << ", " << a5.a2 << ", " << a5.a3 << ", "
8334 << a5.a4 << "), (" << a6.a0 << ", " << a6.a1 << ", " << a6.a2
8335 << ", " << a6.a3 << ", " << a6.a4 << "), (" << a7.a0 << ", "
8336 << a7.a1 << ", " << a7.a2 << ", " << a7.a3 << ", " << a7.a4
8337 << "), (" << a8.a0 << ", " << a8.a1 << ", " << a8.a2 << ", "
8338 << a8.a3 << ", " << a8.a4 << "), (" << a9.a0 << ", " << a9.a1
8339 << ", " << a9.a2 << ", " << a9.a3 << ", " << a9.a4 << "))" << ")\n";
8340
8341 int32_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
8342
8343 std::cout << "result = " << result << "\n";
8344
8345 CHECK_EQ(25, result);
8346
8347 // Pass argument that will make the Dart callback throw.
8348 a0.a0 = 42;
8349
8350 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
8351
8352 CHECK_EQ(0, result);
8353
8354 // Pass argument that will make the Dart callback return null.
8355 a0.a0 = 84;
8356
8357 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
8358
8359 CHECK_EQ(0, result);
8360
8361 return 0;
8362}
8363
8364// Used for testing structs and unions by value.
8365// Argument too big to go into FPU registers in hardfp and arm64.
8367 // NOLINTNEXTLINE(whitespace/parens)
8368 float (*f)(Struct20BytesHomogeneousFloat a0)) {
8370
8371 a0.a0 = -1.0;
8372 a0.a1 = 2.0;
8373 a0.a2 = -3.0;
8374 a0.a3 = 4.0;
8375 a0.a4 = -5.0;
8376
8377 std::cout << "Calling TestPassStruct20BytesHomogeneousFloat(" << "((" << a0.a0
8378 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3 << ", " << a0.a4
8379 << "))" << ")\n";
8380
8381 float result = f(a0);
8382
8383 std::cout << "result = " << result << "\n";
8384
8385 CHECK_APPROX(-3.0, result);
8386
8387 // Pass argument that will make the Dart callback throw.
8388 a0.a0 = 42;
8389
8390 result = f(a0);
8391
8392 CHECK_APPROX(0.0, result);
8393
8394 // Pass argument that will make the Dart callback return null.
8395 a0.a0 = 84;
8396
8397 result = f(a0);
8398
8399 CHECK_APPROX(0.0, result);
8400
8401 return 0;
8402}
8403
8404// Used for testing structs and unions by value.
8405// Arguments in FPU registers on arm64.
8406// 5 struct arguments will exhaust available registers.
8408 // NOLINTNEXTLINE(whitespace/parens)
8409 double (*f)(Struct32BytesHomogeneousDouble a0,
8419
8420 a0.a0 = -1.0;
8421 a0.a1 = 2.0;
8422 a0.a2 = -3.0;
8423 a0.a3 = 4.0;
8424 a1.a0 = -5.0;
8425 a1.a1 = 6.0;
8426 a1.a2 = -7.0;
8427 a1.a3 = 8.0;
8428 a2.a0 = -9.0;
8429 a2.a1 = 10.0;
8430 a2.a2 = -11.0;
8431 a2.a3 = 12.0;
8432 a3.a0 = -13.0;
8433 a3.a1 = 14.0;
8434 a3.a2 = -15.0;
8435 a3.a3 = 16.0;
8436 a4.a0 = -17.0;
8437 a4.a1 = 18.0;
8438 a4.a2 = -19.0;
8439 a4.a3 = 20.0;
8440
8441 std::cout << "Calling TestPassStruct32BytesHomogeneousDoublex5(" << "(("
8442 << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
8443 << "), (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", "
8444 << a1.a3 << "), (" << a2.a0 << ", " << a2.a1 << ", " << a2.a2
8445 << ", " << a2.a3 << "), (" << a3.a0 << ", " << a3.a1 << ", "
8446 << a3.a2 << ", " << a3.a3 << "), (" << a4.a0 << ", " << a4.a1
8447 << ", " << a4.a2 << ", " << a4.a3 << "))" << ")\n";
8448
8449 double result = f(a0, a1, a2, a3, a4);
8450
8451 std::cout << "result = " << result << "\n";
8452
8453 CHECK_APPROX(10.0, result);
8454
8455 // Pass argument that will make the Dart callback throw.
8456 a0.a0 = 42;
8457
8458 result = f(a0, a1, a2, a3, a4);
8459
8460 CHECK_APPROX(0.0, result);
8461
8462 // Pass argument that will make the Dart callback return null.
8463 a0.a0 = 84;
8464
8465 result = f(a0, a1, a2, a3, a4);
8466
8467 CHECK_APPROX(0.0, result);
8468
8469 return 0;
8470}
8471
8472// Used for testing structs and unions by value.
8473// Argument too big to go into FPU registers in arm64.
8475 // NOLINTNEXTLINE(whitespace/parens)
8476 double (*f)(Struct40BytesHomogeneousDouble a0)) {
8478
8479 a0.a0 = -1.0;
8480 a0.a1 = 2.0;
8481 a0.a2 = -3.0;
8482 a0.a3 = 4.0;
8483 a0.a4 = -5.0;
8484
8485 std::cout << "Calling TestPassStruct40BytesHomogeneousDouble(" << "(("
8486 << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3 << ", "
8487 << a0.a4 << "))" << ")\n";
8488
8489 double result = f(a0);
8490
8491 std::cout << "result = " << result << "\n";
8492
8493 CHECK_APPROX(-3.0, result);
8494
8495 // Pass argument that will make the Dart callback throw.
8496 a0.a0 = 42;
8497
8498 result = f(a0);
8499
8500 CHECK_APPROX(0.0, result);
8501
8502 // Pass argument that will make the Dart callback return null.
8503 a0.a0 = 84;
8504
8505 result = f(a0);
8506
8507 CHECK_APPROX(0.0, result);
8508
8509 return 0;
8510}
8511
8512// Used for testing structs and unions by value.
8513// Test 1kb struct.
8515 // NOLINTNEXTLINE(whitespace/parens)
8516 uint64_t (*f)(Struct1024BytesHomogeneousUint64 a0)) {
8518
8519 a0.a0 = 1;
8520 a0.a1 = 2;
8521 a0.a2 = 3;
8522 a0.a3 = 4;
8523 a0.a4 = 5;
8524 a0.a5 = 6;
8525 a0.a6 = 7;
8526 a0.a7 = 8;
8527 a0.a8 = 9;
8528 a0.a9 = 10;
8529 a0.a10 = 11;
8530 a0.a11 = 12;
8531 a0.a12 = 13;
8532 a0.a13 = 14;
8533 a0.a14 = 15;
8534 a0.a15 = 16;
8535 a0.a16 = 17;
8536 a0.a17 = 18;
8537 a0.a18 = 19;
8538 a0.a19 = 20;
8539 a0.a20 = 21;
8540 a0.a21 = 22;
8541 a0.a22 = 23;
8542 a0.a23 = 24;
8543 a0.a24 = 25;
8544 a0.a25 = 26;
8545 a0.a26 = 27;
8546 a0.a27 = 28;
8547 a0.a28 = 29;
8548 a0.a29 = 30;
8549 a0.a30 = 31;
8550 a0.a31 = 32;
8551 a0.a32 = 33;
8552 a0.a33 = 34;
8553 a0.a34 = 35;
8554 a0.a35 = 36;
8555 a0.a36 = 37;
8556 a0.a37 = 38;
8557 a0.a38 = 39;
8558 a0.a39 = 40;
8559 a0.a40 = 41;
8560 a0.a41 = 42;
8561 a0.a42 = 43;
8562 a0.a43 = 44;
8563 a0.a44 = 45;
8564 a0.a45 = 46;
8565 a0.a46 = 47;
8566 a0.a47 = 48;
8567 a0.a48 = 49;
8568 a0.a49 = 50;
8569 a0.a50 = 51;
8570 a0.a51 = 52;
8571 a0.a52 = 53;
8572 a0.a53 = 54;
8573 a0.a54 = 55;
8574 a0.a55 = 56;
8575 a0.a56 = 57;
8576 a0.a57 = 58;
8577 a0.a58 = 59;
8578 a0.a59 = 60;
8579 a0.a60 = 61;
8580 a0.a61 = 62;
8581 a0.a62 = 63;
8582 a0.a63 = 64;
8583 a0.a64 = 65;
8584 a0.a65 = 66;
8585 a0.a66 = 67;
8586 a0.a67 = 68;
8587 a0.a68 = 69;
8588 a0.a69 = 70;
8589 a0.a70 = 71;
8590 a0.a71 = 72;
8591 a0.a72 = 73;
8592 a0.a73 = 74;
8593 a0.a74 = 75;
8594 a0.a75 = 76;
8595 a0.a76 = 77;
8596 a0.a77 = 78;
8597 a0.a78 = 79;
8598 a0.a79 = 80;
8599 a0.a80 = 81;
8600 a0.a81 = 82;
8601 a0.a82 = 83;
8602 a0.a83 = 84;
8603 a0.a84 = 85;
8604 a0.a85 = 86;
8605 a0.a86 = 87;
8606 a0.a87 = 88;
8607 a0.a88 = 89;
8608 a0.a89 = 90;
8609 a0.a90 = 91;
8610 a0.a91 = 92;
8611 a0.a92 = 93;
8612 a0.a93 = 94;
8613 a0.a94 = 95;
8614 a0.a95 = 96;
8615 a0.a96 = 97;
8616 a0.a97 = 98;
8617 a0.a98 = 99;
8618 a0.a99 = 100;
8619 a0.a100 = 101;
8620 a0.a101 = 102;
8621 a0.a102 = 103;
8622 a0.a103 = 104;
8623 a0.a104 = 105;
8624 a0.a105 = 106;
8625 a0.a106 = 107;
8626 a0.a107 = 108;
8627 a0.a108 = 109;
8628 a0.a109 = 110;
8629 a0.a110 = 111;
8630 a0.a111 = 112;
8631 a0.a112 = 113;
8632 a0.a113 = 114;
8633 a0.a114 = 115;
8634 a0.a115 = 116;
8635 a0.a116 = 117;
8636 a0.a117 = 118;
8637 a0.a118 = 119;
8638 a0.a119 = 120;
8639 a0.a120 = 121;
8640 a0.a121 = 122;
8641 a0.a122 = 123;
8642 a0.a123 = 124;
8643 a0.a124 = 125;
8644 a0.a125 = 126;
8645 a0.a126 = 127;
8646 a0.a127 = 128;
8647
8648 std::cout << "Calling TestPassStruct1024BytesHomogeneousUint64(" << "(("
8649 << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3 << ", "
8650 << a0.a4 << ", " << a0.a5 << ", " << a0.a6 << ", " << a0.a7 << ", "
8651 << a0.a8 << ", " << a0.a9 << ", " << a0.a10 << ", " << a0.a11
8652 << ", " << a0.a12 << ", " << a0.a13 << ", " << a0.a14 << ", "
8653 << a0.a15 << ", " << a0.a16 << ", " << a0.a17 << ", " << a0.a18
8654 << ", " << a0.a19 << ", " << a0.a20 << ", " << a0.a21 << ", "
8655 << a0.a22 << ", " << a0.a23 << ", " << a0.a24 << ", " << a0.a25
8656 << ", " << a0.a26 << ", " << a0.a27 << ", " << a0.a28 << ", "
8657 << a0.a29 << ", " << a0.a30 << ", " << a0.a31 << ", " << a0.a32
8658 << ", " << a0.a33 << ", " << a0.a34 << ", " << a0.a35 << ", "
8659 << a0.a36 << ", " << a0.a37 << ", " << a0.a38 << ", " << a0.a39
8660 << ", " << a0.a40 << ", " << a0.a41 << ", " << a0.a42 << ", "
8661 << a0.a43 << ", " << a0.a44 << ", " << a0.a45 << ", " << a0.a46
8662 << ", " << a0.a47 << ", " << a0.a48 << ", " << a0.a49 << ", "
8663 << a0.a50 << ", " << a0.a51 << ", " << a0.a52 << ", " << a0.a53
8664 << ", " << a0.a54 << ", " << a0.a55 << ", " << a0.a56 << ", "
8665 << a0.a57 << ", " << a0.a58 << ", " << a0.a59 << ", " << a0.a60
8666 << ", " << a0.a61 << ", " << a0.a62 << ", " << a0.a63 << ", "
8667 << a0.a64 << ", " << a0.a65 << ", " << a0.a66 << ", " << a0.a67
8668 << ", " << a0.a68 << ", " << a0.a69 << ", " << a0.a70 << ", "
8669 << a0.a71 << ", " << a0.a72 << ", " << a0.a73 << ", " << a0.a74
8670 << ", " << a0.a75 << ", " << a0.a76 << ", " << a0.a77 << ", "
8671 << a0.a78 << ", " << a0.a79 << ", " << a0.a80 << ", " << a0.a81
8672 << ", " << a0.a82 << ", " << a0.a83 << ", " << a0.a84 << ", "
8673 << a0.a85 << ", " << a0.a86 << ", " << a0.a87 << ", " << a0.a88
8674 << ", " << a0.a89 << ", " << a0.a90 << ", " << a0.a91 << ", "
8675 << a0.a92 << ", " << a0.a93 << ", " << a0.a94 << ", " << a0.a95
8676 << ", " << a0.a96 << ", " << a0.a97 << ", " << a0.a98 << ", "
8677 << a0.a99 << ", " << a0.a100 << ", " << a0.a101 << ", " << a0.a102
8678 << ", " << a0.a103 << ", " << a0.a104 << ", " << a0.a105 << ", "
8679 << a0.a106 << ", " << a0.a107 << ", " << a0.a108 << ", " << a0.a109
8680 << ", " << a0.a110 << ", " << a0.a111 << ", " << a0.a112 << ", "
8681 << a0.a113 << ", " << a0.a114 << ", " << a0.a115 << ", " << a0.a116
8682 << ", " << a0.a117 << ", " << a0.a118 << ", " << a0.a119 << ", "
8683 << a0.a120 << ", " << a0.a121 << ", " << a0.a122 << ", " << a0.a123
8684 << ", " << a0.a124 << ", " << a0.a125 << ", " << a0.a126 << ", "
8685 << a0.a127 << "))" << ")\n";
8686
8687 uint64_t result = f(a0);
8688
8689 std::cout << "result = " << result << "\n";
8690
8691 CHECK_EQ(8256, result);
8692
8693 // Pass argument that will make the Dart callback throw.
8694 a0.a0 = 42;
8695
8696 result = f(a0);
8697
8698 CHECK_EQ(0, result);
8699
8700 // Pass argument that will make the Dart callback return null.
8701 a0.a0 = 84;
8702
8703 result = f(a0);
8704
8705 CHECK_EQ(0, result);
8706
8707 return 0;
8708}
8709
8710// Used for testing structs and unions by value.
8711// Tests the alignment of structs in FPU registers and backfilling.
8713 // NOLINTNEXTLINE(whitespace/parens)
8714 float (*f)(float a0,
8716 float a2,
8718 float a4,
8720 float a6,
8722 float a8)) {
8723 float a0;
8725 float a2;
8727 float a4;
8729 float a6;
8731 float a8;
8732
8733 a0 = -1.0;
8734 a1.a0 = 2.0;
8735 a1.a1 = -3.0;
8736 a1.a2 = 4.0;
8737 a1.a3 = -5.0;
8738 a2 = 6.0;
8739 a3.a0 = -7.0;
8740 a3.a1 = 8.0;
8741 a3.a2 = -9.0;
8742 a3.a3 = 10.0;
8743 a4 = -11.0;
8744 a5.a0 = 12.0;
8745 a5.a1 = -13.0;
8746 a5.a2 = 14.0;
8747 a5.a3 = -15.0;
8748 a6 = 16.0;
8749 a7.a0 = -17.0;
8750 a7.a1 = 18.0;
8751 a7.a2 = -19.0;
8752 a7.a3 = 20.0;
8753 a8 = -21.0;
8754
8755 std::cout << "Calling TestPassFloatStruct16BytesHomogeneousFloatFloatStruct1("
8756 << "(" << a0 << ", (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2
8757 << ", " << a1.a3 << "), " << a2 << ", (" << a3.a0 << ", " << a3.a1
8758 << ", " << a3.a2 << ", " << a3.a3 << "), " << a4 << ", (" << a5.a0
8759 << ", " << a5.a1 << ", " << a5.a2 << ", " << a5.a3 << "), " << a6
8760 << ", (" << a7.a0 << ", " << a7.a1 << ", " << a7.a2 << ", " << a7.a3
8761 << "), " << a8 << ")" << ")\n";
8762
8763 float result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
8764
8765 std::cout << "result = " << result << "\n";
8766
8767 CHECK_APPROX(-11.0, result);
8768
8769 // Pass argument that will make the Dart callback throw.
8770 a0 = 42;
8771
8772 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
8773
8774 CHECK_APPROX(0.0, result);
8775
8776 // Pass argument that will make the Dart callback return null.
8777 a0 = 84;
8778
8779 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
8780
8781 CHECK_APPROX(0.0, result);
8782
8783 return 0;
8784}
8785
8786// Used for testing structs and unions by value.
8787// Tests the alignment of structs in FPU registers and backfilling.
8789 // NOLINTNEXTLINE(whitespace/parens)
8790 double (*f)(float a0,
8792 float a2,
8794 float a4,
8796 float a6,
8798 float a8)) {
8799 float a0;
8801 float a2;
8803 float a4;
8805 float a6;
8807 float a8;
8808
8809 a0 = -1.0;
8810 a1.a0 = 2.0;
8811 a1.a1 = -3.0;
8812 a1.a2 = 4.0;
8813 a1.a3 = -5.0;
8814 a2 = 6.0;
8815 a3.a0 = -7.0;
8816 a3.a1 = 8.0;
8817 a3.a2 = -9.0;
8818 a3.a3 = 10.0;
8819 a4 = -11.0;
8820 a5.a0 = 12.0;
8821 a5.a1 = -13.0;
8822 a5.a2 = 14.0;
8823 a5.a3 = -15.0;
8824 a6 = 16.0;
8825 a7.a0 = -17.0;
8826 a7.a1 = 18.0;
8827 a7.a2 = -19.0;
8828 a7.a3 = 20.0;
8829 a8 = -21.0;
8830
8831 std::cout << "Calling TestPassFloatStruct32BytesHomogeneousDoubleFloatStruct("
8832 << "(" << a0 << ", (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2
8833 << ", " << a1.a3 << "), " << a2 << ", (" << a3.a0 << ", " << a3.a1
8834 << ", " << a3.a2 << ", " << a3.a3 << "), " << a4 << ", (" << a5.a0
8835 << ", " << a5.a1 << ", " << a5.a2 << ", " << a5.a3 << "), " << a6
8836 << ", (" << a7.a0 << ", " << a7.a1 << ", " << a7.a2 << ", " << a7.a3
8837 << "), " << a8 << ")" << ")\n";
8838
8839 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
8840
8841 std::cout << "result = " << result << "\n";
8842
8843 CHECK_APPROX(-11.0, result);
8844
8845 // Pass argument that will make the Dart callback throw.
8846 a0 = 42;
8847
8848 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
8849
8850 CHECK_APPROX(0.0, result);
8851
8852 // Pass argument that will make the Dart callback return null.
8853 a0 = 84;
8854
8855 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
8856
8857 CHECK_APPROX(0.0, result);
8858
8859 return 0;
8860}
8861
8862// Used for testing structs and unions by value.
8863// Tests the alignment of structs in integers registers and on the stack.
8864// Arm32 aligns this struct at 8.
8865// Also, arm32 allocates the second struct partially in registers, partially
8866// on stack.
8867// Test backfilling of integer registers.
8869 // NOLINTNEXTLINE(whitespace/parens)
8870 double (*f)(int8_t a0,
8872 int8_t a2,
8874 int8_t a4,
8876 int8_t a6,
8878 int8_t a8)) {
8879 int8_t a0;
8880 Struct16BytesMixed a1 = {};
8881 int8_t a2;
8882 Struct16BytesMixed a3 = {};
8883 int8_t a4;
8884 Struct16BytesMixed a5 = {};
8885 int8_t a6;
8886 Struct16BytesMixed a7 = {};
8887 int8_t a8;
8888
8889 a0 = -1;
8890 a1.a0 = 2.0;
8891 a1.a1 = -3;
8892 a2 = 4;
8893 a3.a0 = -5.0;
8894 a3.a1 = 6;
8895 a4 = -7;
8896 a5.a0 = 8.0;
8897 a5.a1 = -9;
8898 a6 = 10;
8899 a7.a0 = -11.0;
8900 a7.a1 = 12;
8901 a8 = -13;
8902
8903 std::cout << "Calling TestPassInt8Struct16BytesMixedInt8Struct16BytesMixedIn("
8904 << "(" << static_cast<int>(a0) << ", (" << a1.a0 << ", " << a1.a1
8905 << "), " << static_cast<int>(a2) << ", (" << a3.a0 << ", " << a3.a1
8906 << "), " << static_cast<int>(a4) << ", (" << a5.a0 << ", " << a5.a1
8907 << "), " << static_cast<int>(a6) << ", (" << a7.a0 << ", " << a7.a1
8908 << "), " << static_cast<int>(a8) << ")" << ")\n";
8909
8910 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
8911
8912 std::cout << "result = " << result << "\n";
8913
8914 CHECK_APPROX(-7.0, result);
8915
8916 // Pass argument that will make the Dart callback throw.
8917 a0 = 42;
8918
8919 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
8920
8921 CHECK_APPROX(0.0, result);
8922
8923 // Pass argument that will make the Dart callback return null.
8924 a0 = 84;
8925
8926 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
8927
8928 CHECK_APPROX(0.0, result);
8929
8930 return 0;
8931}
8932
8933// Used for testing structs and unions by value.
8934// On Linux x64, it will exhaust xmm registers first, after 6 doubles and 2
8935// structs. The rest of the structs will go on the stack.
8936// The int will be backfilled into the int register.
8938 // NOLINTNEXTLINE(whitespace/parens)
8939 double (*f)(double a0,
8940 double a1,
8941 double a2,
8942 double a3,
8943 double a4,
8944 double a5,
8949 int32_t a10)) {
8950 double a0;
8951 double a1;
8952 double a2;
8953 double a3;
8954 double a4;
8955 double a5;
8956 Struct16BytesMixed a6 = {};
8957 Struct16BytesMixed a7 = {};
8958 Struct16BytesMixed a8 = {};
8959 Struct16BytesMixed a9 = {};
8960 int32_t a10;
8961
8962 a0 = -1.0;
8963 a1 = 2.0;
8964 a2 = -3.0;
8965 a3 = 4.0;
8966 a4 = -5.0;
8967 a5 = 6.0;
8968 a6.a0 = -7.0;
8969 a6.a1 = 8;
8970 a7.a0 = -9.0;
8971 a7.a1 = 10;
8972 a8.a0 = -11.0;
8973 a8.a1 = 12;
8974 a9.a0 = -13.0;
8975 a9.a1 = 14;
8976 a10 = -15;
8977
8978 std::cout << "Calling TestPassDoublex6Struct16BytesMixedx4Int32(" << "(" << a0
8979 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4 << ", "
8980 << a5 << ", (" << a6.a0 << ", " << a6.a1 << "), (" << a7.a0 << ", "
8981 << a7.a1 << "), (" << a8.a0 << ", " << a8.a1 << "), (" << a9.a0
8982 << ", " << a9.a1 << "), " << a10 << ")" << ")\n";
8983
8984 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
8985
8986 std::cout << "result = " << result << "\n";
8987
8988 CHECK_APPROX(-8.0, result);
8989
8990 // Pass argument that will make the Dart callback throw.
8991 a0 = 42;
8992
8993 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
8994
8995 CHECK_APPROX(0.0, result);
8996
8997 // Pass argument that will make the Dart callback return null.
8998 a0 = 84;
8999
9000 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
9001
9002 CHECK_APPROX(0.0, result);
9003
9004 return 0;
9005}
9006
9007// Used for testing structs and unions by value.
9008// On Linux x64, it will exhaust int registers first.
9009// The rest of the structs will go on the stack.
9010// The double will be backfilled into the xmm register.
9012 // NOLINTNEXTLINE(whitespace/parens)
9013 double (*f)(int32_t a0,
9014 int32_t a1,
9015 int32_t a2,
9016 int32_t a3,
9021 double a8)) {
9022 int32_t a0;
9023 int32_t a1;
9024 int32_t a2;
9025 int32_t a3;
9026 Struct16BytesMixed a4 = {};
9027 Struct16BytesMixed a5 = {};
9028 Struct16BytesMixed a6 = {};
9029 Struct16BytesMixed a7 = {};
9030 double a8;
9031
9032 a0 = -1;
9033 a1 = 2;
9034 a2 = -3;
9035 a3 = 4;
9036 a4.a0 = -5.0;
9037 a4.a1 = 6;
9038 a5.a0 = -7.0;
9039 a5.a1 = 8;
9040 a6.a0 = -9.0;
9041 a6.a1 = 10;
9042 a7.a0 = -11.0;
9043 a7.a1 = 12;
9044 a8 = -13.0;
9045
9046 std::cout << "Calling TestPassInt32x4Struct16BytesMixedx4Double(" << "(" << a0
9047 << ", " << a1 << ", " << a2 << ", " << a3 << ", (" << a4.a0 << ", "
9048 << a4.a1 << "), (" << a5.a0 << ", " << a5.a1 << "), (" << a6.a0
9049 << ", " << a6.a1 << "), (" << a7.a0 << ", " << a7.a1 << "), " << a8
9050 << ")" << ")\n";
9051
9052 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
9053
9054 std::cout << "result = " << result << "\n";
9055
9056 CHECK_APPROX(-7.0, result);
9057
9058 // Pass argument that will make the Dart callback throw.
9059 a0 = 42;
9060
9061 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
9062
9063 CHECK_APPROX(0.0, result);
9064
9065 // Pass argument that will make the Dart callback return null.
9066 a0 = 84;
9067
9068 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
9069
9070 CHECK_APPROX(0.0, result);
9071
9072 return 0;
9073}
9074
9075// Used for testing structs and unions by value.
9076// On various architectures, first struct is allocated on stack.
9077// Check that the other two arguments are allocated on registers.
9079 // NOLINTNEXTLINE(whitespace/parens)
9080 double (*f)(Struct40BytesHomogeneousDouble a0,
9086
9087 a0.a0 = -1.0;
9088 a0.a1 = 2.0;
9089 a0.a2 = -3.0;
9090 a0.a3 = 4.0;
9091 a0.a4 = -5.0;
9092 a1.a0 = 6;
9093 a1.a1 = -7;
9094 a2.a0 = 8.0;
9095 a2.a1 = -9.0;
9096
9097 std::cout << "Calling TestPassStruct40BytesHomogeneousDoubleStruct4BytesHomo("
9098 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
9099 << ", " << a0.a4 << "), (" << a1.a0 << ", " << a1.a1 << "), ("
9100 << a2.a0 << ", " << a2.a1 << "))" << ")\n";
9101
9102 double result = f(a0, a1, a2);
9103
9104 std::cout << "result = " << result << "\n";
9105
9106 CHECK_APPROX(-5.0, result);
9107
9108 // Pass argument that will make the Dart callback throw.
9109 a0.a0 = 42;
9110
9111 result = f(a0, a1, a2);
9112
9113 CHECK_APPROX(0.0, result);
9114
9115 // Pass argument that will make the Dart callback return null.
9116 a0.a0 = 84;
9117
9118 result = f(a0, a1, a2);
9119
9120 CHECK_APPROX(0.0, result);
9121
9122 return 0;
9123}
9124
9125// Used for testing structs and unions by value.
9126// Test alignment and padding of 16 byte int within struct.
9128 // NOLINTNEXTLINE(whitespace/parens)
9129 double (*f)(int32_t a0,
9130 int32_t a1,
9131 int32_t a2,
9132 int32_t a3,
9133 int32_t a4,
9134 int32_t a5,
9135 int32_t a6,
9136 int32_t a7,
9137 double a8,
9138 double a9,
9139 double a10,
9140 double a11,
9141 double a12,
9142 double a13,
9143 double a14,
9144 double a15,
9145 int64_t a16,
9146 int8_t a17,
9147 Struct1ByteInt a18,
9148 int64_t a19,
9149 int8_t a20,
9151 int64_t a22,
9152 int8_t a23,
9153 Struct8BytesInt a24,
9154 int64_t a25,
9155 int8_t a26,
9157 int64_t a28,
9158 int8_t a29,
9160 int64_t a31,
9161 int8_t a32,
9163 int64_t a34,
9164 int8_t a35,
9166 int64_t a37,
9167 int8_t a38,
9168 StructAlignmentInt64 a39)) {
9169 int32_t a0;
9170 int32_t a1;
9171 int32_t a2;
9172 int32_t a3;
9173 int32_t a4;
9174 int32_t a5;
9175 int32_t a6;
9176 int32_t a7;
9177 double a8;
9178 double a9;
9179 double a10;
9180 double a11;
9181 double a12;
9182 double a13;
9183 double a14;
9184 double a15;
9185 int64_t a16;
9186 int8_t a17;
9187 Struct1ByteInt a18 = {};
9188 int64_t a19;
9189 int8_t a20;
9191 int64_t a22;
9192 int8_t a23;
9193 Struct8BytesInt a24 = {};
9194 int64_t a25;
9195 int8_t a26;
9197 int64_t a28;
9198 int8_t a29;
9199 Struct8BytesMixed a30 = {};
9200 int64_t a31;
9201 int8_t a32;
9202 StructAlignmentInt16 a33 = {};
9203 int64_t a34;
9204 int8_t a35;
9205 StructAlignmentInt32 a36 = {};
9206 int64_t a37;
9207 int8_t a38;
9208 StructAlignmentInt64 a39 = {};
9209
9210 a0 = -1;
9211 a1 = 2;
9212 a2 = -3;
9213 a3 = 4;
9214 a4 = -5;
9215 a5 = 6;
9216 a6 = -7;
9217 a7 = 8;
9218 a8 = -9.0;
9219 a9 = 10.0;
9220 a10 = -11.0;
9221 a11 = 12.0;
9222 a12 = -13.0;
9223 a13 = 14.0;
9224 a14 = -15.0;
9225 a15 = 16.0;
9226 a16 = -17;
9227 a17 = 18;
9228 a18.a0 = -19;
9229 a19 = 20;
9230 a20 = -21;
9231 a21.a0 = 22;
9232 a21.a1 = -23;
9233 a22 = 24;
9234 a23 = -25;
9235 a24.a0 = 26;
9236 a24.a1 = -27;
9237 a24.a2 = 28;
9238 a25 = -29;
9239 a26 = 30;
9240 a27.a0 = -31.0;
9241 a27.a1 = 32.0;
9242 a28 = -33;
9243 a29 = 34;
9244 a30.a0 = -35.0;
9245 a30.a1 = 36;
9246 a30.a2 = -37;
9247 a31 = 38;
9248 a32 = -39;
9249 a33.a0 = 40;
9250 a33.a1 = -41;
9251 a33.a2 = 42;
9252 a34 = -43;
9253 a35 = 44;
9254 a36.a0 = -45;
9255 a36.a1 = 46;
9256 a36.a2 = -47;
9257 a37 = 48;
9258 a38 = -49;
9259 a39.a0 = 50;
9260 a39.a1 = -51;
9261 a39.a2 = 52;
9262
9263 std::cout << "Calling TestPassInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int("
9264 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
9265 << ", " << a5 << ", " << a6 << ", " << a7 << ", " << a8 << ", "
9266 << a9 << ", " << a10 << ", " << a11 << ", " << a12 << ", " << a13
9267 << ", " << a14 << ", " << a15 << ", " << a16 << ", "
9268 << static_cast<int>(a17) << ", (" << static_cast<int>(a18.a0)
9269 << "), " << a19 << ", " << static_cast<int>(a20) << ", (" << a21.a0
9270 << ", " << a21.a1 << "), " << a22 << ", " << static_cast<int>(a23)
9271 << ", (" << a24.a0 << ", " << a24.a1 << ", " << a24.a2 << "), "
9272 << a25 << ", " << static_cast<int>(a26) << ", (" << a27.a0 << ", "
9273 << a27.a1 << "), " << a28 << ", " << static_cast<int>(a29) << ", ("
9274 << a30.a0 << ", " << a30.a1 << ", " << a30.a2 << "), " << a31
9275 << ", " << static_cast<int>(a32) << ", ("
9276 << static_cast<int>(a33.a0) << ", " << a33.a1 << ", "
9277 << static_cast<int>(a33.a2) << "), " << a34 << ", "
9278 << static_cast<int>(a35) << ", (" << static_cast<int>(a36.a0)
9279 << ", " << a36.a1 << ", " << static_cast<int>(a36.a2) << "), "
9280 << a37 << ", " << static_cast<int>(a38) << ", ("
9281 << static_cast<int>(a39.a0) << ", " << a39.a1 << ", "
9282 << static_cast<int>(a39.a2) << "))" << ")\n";
9283
9284 double result =
9285 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15,
9286 a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29,
9287 a30, a31, a32, a33, a34, a35, a36, a37, a38, a39);
9288
9289 std::cout << "result = " << result << "\n";
9290
9291 CHECK_APPROX(26.0, result);
9292
9293 // Pass argument that will make the Dart callback throw.
9294 a0 = 42;
9295
9296 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
9297 a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27,
9298 a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39);
9299
9300 CHECK_APPROX(0.0, result);
9301
9302 // Pass argument that will make the Dart callback return null.
9303 a0 = 84;
9304
9305 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
9306 a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27,
9307 a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39);
9308
9309 CHECK_APPROX(0.0, result);
9310
9311 return 0;
9312}
9313
9314// Used for testing structs and unions by value.
9315// Test alignment and padding of 16 byte int within struct.
9317 // NOLINTNEXTLINE(whitespace/parens)
9318 int64_t (*f)(StructAlignmentInt16 a0)) {
9319 StructAlignmentInt16 a0 = {};
9320
9321 a0.a0 = -1;
9322 a0.a1 = 2;
9323 a0.a2 = -3;
9324
9325 std::cout << "Calling TestPassStructAlignmentInt16(" << "(("
9326 << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
9327 << static_cast<int>(a0.a2) << "))" << ")\n";
9328
9329 int64_t result = f(a0);
9330
9331 std::cout << "result = " << result << "\n";
9332
9333 CHECK_EQ(-2, result);
9334
9335 // Pass argument that will make the Dart callback throw.
9336 a0.a0 = 42;
9337
9338 result = f(a0);
9339
9340 CHECK_EQ(0, result);
9341
9342 // Pass argument that will make the Dart callback return null.
9343 a0.a0 = 84;
9344
9345 result = f(a0);
9346
9347 CHECK_EQ(0, result);
9348
9349 return 0;
9350}
9351
9352// Used for testing structs and unions by value.
9353// Test alignment and padding of 32 byte int within struct.
9355 // NOLINTNEXTLINE(whitespace/parens)
9356 int64_t (*f)(StructAlignmentInt32 a0)) {
9357 StructAlignmentInt32 a0 = {};
9358
9359 a0.a0 = -1;
9360 a0.a1 = 2;
9361 a0.a2 = -3;
9362
9363 std::cout << "Calling TestPassStructAlignmentInt32(" << "(("
9364 << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
9365 << static_cast<int>(a0.a2) << "))" << ")\n";
9366
9367 int64_t result = f(a0);
9368
9369 std::cout << "result = " << result << "\n";
9370
9371 CHECK_EQ(-2, result);
9372
9373 // Pass argument that will make the Dart callback throw.
9374 a0.a0 = 42;
9375
9376 result = f(a0);
9377
9378 CHECK_EQ(0, result);
9379
9380 // Pass argument that will make the Dart callback return null.
9381 a0.a0 = 84;
9382
9383 result = f(a0);
9384
9385 CHECK_EQ(0, result);
9386
9387 return 0;
9388}
9389
9390// Used for testing structs and unions by value.
9391// Test alignment and padding of 64 byte int within struct.
9393 // NOLINTNEXTLINE(whitespace/parens)
9394 int64_t (*f)(StructAlignmentInt64 a0)) {
9395 StructAlignmentInt64 a0 = {};
9396
9397 a0.a0 = -1;
9398 a0.a1 = 2;
9399 a0.a2 = -3;
9400
9401 std::cout << "Calling TestPassStructAlignmentInt64(" << "(("
9402 << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
9403 << static_cast<int>(a0.a2) << "))" << ")\n";
9404
9405 int64_t result = f(a0);
9406
9407 std::cout << "result = " << result << "\n";
9408
9409 CHECK_EQ(-2, result);
9410
9411 // Pass argument that will make the Dart callback throw.
9412 a0.a0 = 42;
9413
9414 result = f(a0);
9415
9416 CHECK_EQ(0, result);
9417
9418 // Pass argument that will make the Dart callback return null.
9419 a0.a0 = 84;
9420
9421 result = f(a0);
9422
9423 CHECK_EQ(0, result);
9424
9425 return 0;
9426}
9427
9428// Used for testing structs and unions by value.
9429// Simple nested struct. No alignment gaps on any architectures.
9430// 10 arguments exhaust registers on all platforms.
9432 // NOLINTNEXTLINE(whitespace/parens)
9433 int64_t (*f)(Struct8BytesNestedInt a0,
9443 Struct8BytesNestedInt a0 = {};
9444 Struct8BytesNestedInt a1 = {};
9445 Struct8BytesNestedInt a2 = {};
9446 Struct8BytesNestedInt a3 = {};
9447 Struct8BytesNestedInt a4 = {};
9448 Struct8BytesNestedInt a5 = {};
9449 Struct8BytesNestedInt a6 = {};
9450 Struct8BytesNestedInt a7 = {};
9451 Struct8BytesNestedInt a8 = {};
9452 Struct8BytesNestedInt a9 = {};
9453
9454 a0.a0.a0 = -1;
9455 a0.a0.a1 = 2;
9456 a0.a1.a0 = -3;
9457 a0.a1.a1 = 4;
9458 a1.a0.a0 = -5;
9459 a1.a0.a1 = 6;
9460 a1.a1.a0 = -7;
9461 a1.a1.a1 = 8;
9462 a2.a0.a0 = -9;
9463 a2.a0.a1 = 10;
9464 a2.a1.a0 = -11;
9465 a2.a1.a1 = 12;
9466 a3.a0.a0 = -13;
9467 a3.a0.a1 = 14;
9468 a3.a1.a0 = -15;
9469 a3.a1.a1 = 16;
9470 a4.a0.a0 = -17;
9471 a4.a0.a1 = 18;
9472 a4.a1.a0 = -19;
9473 a4.a1.a1 = 20;
9474 a5.a0.a0 = -21;
9475 a5.a0.a1 = 22;
9476 a5.a1.a0 = -23;
9477 a5.a1.a1 = 24;
9478 a6.a0.a0 = -25;
9479 a6.a0.a1 = 26;
9480 a6.a1.a0 = -27;
9481 a6.a1.a1 = 28;
9482 a7.a0.a0 = -29;
9483 a7.a0.a1 = 30;
9484 a7.a1.a0 = -31;
9485 a7.a1.a1 = 32;
9486 a8.a0.a0 = -33;
9487 a8.a0.a1 = 34;
9488 a8.a1.a0 = -35;
9489 a8.a1.a1 = 36;
9490 a9.a0.a0 = -37;
9491 a9.a0.a1 = 38;
9492 a9.a1.a0 = -39;
9493 a9.a1.a1 = 40;
9494
9495 std::cout << "Calling TestPassStruct8BytesNestedIntx10(" << "(((" << a0.a0.a0
9496 << ", " << a0.a0.a1 << "), (" << a0.a1.a0 << ", " << a0.a1.a1
9497 << ")), ((" << a1.a0.a0 << ", " << a1.a0.a1 << "), (" << a1.a1.a0
9498 << ", " << a1.a1.a1 << ")), ((" << a2.a0.a0 << ", " << a2.a0.a1
9499 << "), (" << a2.a1.a0 << ", " << a2.a1.a1 << ")), ((" << a3.a0.a0
9500 << ", " << a3.a0.a1 << "), (" << a3.a1.a0 << ", " << a3.a1.a1
9501 << ")), ((" << a4.a0.a0 << ", " << a4.a0.a1 << "), (" << a4.a1.a0
9502 << ", " << a4.a1.a1 << ")), ((" << a5.a0.a0 << ", " << a5.a0.a1
9503 << "), (" << a5.a1.a0 << ", " << a5.a1.a1 << ")), ((" << a6.a0.a0
9504 << ", " << a6.a0.a1 << "), (" << a6.a1.a0 << ", " << a6.a1.a1
9505 << ")), ((" << a7.a0.a0 << ", " << a7.a0.a1 << "), (" << a7.a1.a0
9506 << ", " << a7.a1.a1 << ")), ((" << a8.a0.a0 << ", " << a8.a0.a1
9507 << "), (" << a8.a1.a0 << ", " << a8.a1.a1 << ")), ((" << a9.a0.a0
9508 << ", " << a9.a0.a1 << "), (" << a9.a1.a0 << ", " << a9.a1.a1
9509 << ")))" << ")\n";
9510
9511 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
9512
9513 std::cout << "result = " << result << "\n";
9514
9515 CHECK_EQ(20, result);
9516
9517 // Pass argument that will make the Dart callback throw.
9518 a0.a0.a0 = 42;
9519
9520 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
9521
9522 CHECK_EQ(0, result);
9523
9524 // Pass argument that will make the Dart callback return null.
9525 a0.a0.a0 = 84;
9526
9527 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
9528
9529 CHECK_EQ(0, result);
9530
9531 return 0;
9532}
9533
9534// Used for testing structs and unions by value.
9535// Simple nested struct. No alignment gaps on any architectures.
9536// 10 arguments exhaust fpu registers on all platforms.
9538 // NOLINTNEXTLINE(whitespace/parens)
9539 float (*f)(Struct8BytesNestedFloat a0,
9559
9560 a0.a0.a0 = -1.0;
9561 a0.a1.a0 = 2.0;
9562 a1.a0.a0 = -3.0;
9563 a1.a1.a0 = 4.0;
9564 a2.a0.a0 = -5.0;
9565 a2.a1.a0 = 6.0;
9566 a3.a0.a0 = -7.0;
9567 a3.a1.a0 = 8.0;
9568 a4.a0.a0 = -9.0;
9569 a4.a1.a0 = 10.0;
9570 a5.a0.a0 = -11.0;
9571 a5.a1.a0 = 12.0;
9572 a6.a0.a0 = -13.0;
9573 a6.a1.a0 = 14.0;
9574 a7.a0.a0 = -15.0;
9575 a7.a1.a0 = 16.0;
9576 a8.a0.a0 = -17.0;
9577 a8.a1.a0 = 18.0;
9578 a9.a0.a0 = -19.0;
9579 a9.a1.a0 = 20.0;
9580
9581 std::cout << "Calling TestPassStruct8BytesNestedFloatx10(" << "((("
9582 << a0.a0.a0 << "), (" << a0.a1.a0 << ")), ((" << a1.a0.a0 << "), ("
9583 << a1.a1.a0 << ")), ((" << a2.a0.a0 << "), (" << a2.a1.a0
9584 << ")), ((" << a3.a0.a0 << "), (" << a3.a1.a0 << ")), (("
9585 << a4.a0.a0 << "), (" << a4.a1.a0 << ")), ((" << a5.a0.a0 << "), ("
9586 << a5.a1.a0 << ")), ((" << a6.a0.a0 << "), (" << a6.a1.a0
9587 << ")), ((" << a7.a0.a0 << "), (" << a7.a1.a0 << ")), (("
9588 << a8.a0.a0 << "), (" << a8.a1.a0 << ")), ((" << a9.a0.a0 << "), ("
9589 << a9.a1.a0 << ")))" << ")\n";
9590
9591 float result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
9592
9593 std::cout << "result = " << result << "\n";
9594
9595 CHECK_APPROX(10.0, result);
9596
9597 // Pass argument that will make the Dart callback throw.
9598 a0.a0.a0 = 42;
9599
9600 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
9601
9602 CHECK_APPROX(0.0, result);
9603
9604 // Pass argument that will make the Dart callback return null.
9605 a0.a0.a0 = 84;
9606
9607 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
9608
9609 CHECK_APPROX(0.0, result);
9610
9611 return 0;
9612}
9613
9614// Used for testing structs and unions by value.
9615// Simple nested struct. No alignment gaps on any architectures.
9616// 10 arguments exhaust fpu registers on all platforms.
9617// The nesting is irregular, testing homogenous float rules on arm and arm64,
9618// and the fpu register usage on x64.
9620 // NOLINTNEXTLINE(whitespace/parens)
9621 float (*f)(Struct8BytesNestedFloat2 a0,
9641
9642 a0.a0.a0 = -1.0;
9643 a0.a1 = 2.0;
9644 a1.a0.a0 = -3.0;
9645 a1.a1 = 4.0;
9646 a2.a0.a0 = -5.0;
9647 a2.a1 = 6.0;
9648 a3.a0.a0 = -7.0;
9649 a3.a1 = 8.0;
9650 a4.a0.a0 = -9.0;
9651 a4.a1 = 10.0;
9652 a5.a0.a0 = -11.0;
9653 a5.a1 = 12.0;
9654 a6.a0.a0 = -13.0;
9655 a6.a1 = 14.0;
9656 a7.a0.a0 = -15.0;
9657 a7.a1 = 16.0;
9658 a8.a0.a0 = -17.0;
9659 a8.a1 = 18.0;
9660 a9.a0.a0 = -19.0;
9661 a9.a1 = 20.0;
9662
9663 std::cout << "Calling TestPassStruct8BytesNestedFloat2x10(" << "((("
9664 << a0.a0.a0 << "), " << a0.a1 << "), ((" << a1.a0.a0 << "), "
9665 << a1.a1 << "), ((" << a2.a0.a0 << "), " << a2.a1 << "), (("
9666 << a3.a0.a0 << "), " << a3.a1 << "), ((" << a4.a0.a0 << "), "
9667 << a4.a1 << "), ((" << a5.a0.a0 << "), " << a5.a1 << "), (("
9668 << a6.a0.a0 << "), " << a6.a1 << "), ((" << a7.a0.a0 << "), "
9669 << a7.a1 << "), ((" << a8.a0.a0 << "), " << a8.a1 << "), (("
9670 << a9.a0.a0 << "), " << a9.a1 << "))" << ")\n";
9671
9672 float result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
9673
9674 std::cout << "result = " << result << "\n";
9675
9676 CHECK_APPROX(10.0, result);
9677
9678 // Pass argument that will make the Dart callback throw.
9679 a0.a0.a0 = 42;
9680
9681 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
9682
9683 CHECK_APPROX(0.0, result);
9684
9685 // Pass argument that will make the Dart callback return null.
9686 a0.a0.a0 = 84;
9687
9688 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
9689
9690 CHECK_APPROX(0.0, result);
9691
9692 return 0;
9693}
9694
9695// Used for testing structs and unions by value.
9696// Simple nested struct. No alignment gaps on any architectures.
9697// 10 arguments exhaust all registers on all platforms.
9699 // NOLINTNEXTLINE(whitespace/parens)
9700 double (*f)(Struct8BytesNestedMixed a0,
9720
9721 a0.a0.a0 = -1;
9722 a0.a0.a1 = 2;
9723 a0.a1.a0 = -3.0;
9724 a1.a0.a0 = 4;
9725 a1.a0.a1 = -5;
9726 a1.a1.a0 = 6.0;
9727 a2.a0.a0 = -7;
9728 a2.a0.a1 = 8;
9729 a2.a1.a0 = -9.0;
9730 a3.a0.a0 = 10;
9731 a3.a0.a1 = -11;
9732 a3.a1.a0 = 12.0;
9733 a4.a0.a0 = -13;
9734 a4.a0.a1 = 14;
9735 a4.a1.a0 = -15.0;
9736 a5.a0.a0 = 16;
9737 a5.a0.a1 = -17;
9738 a5.a1.a0 = 18.0;
9739 a6.a0.a0 = -19;
9740 a6.a0.a1 = 20;
9741 a6.a1.a0 = -21.0;
9742 a7.a0.a0 = 22;
9743 a7.a0.a1 = -23;
9744 a7.a1.a0 = 24.0;
9745 a8.a0.a0 = -25;
9746 a8.a0.a1 = 26;
9747 a8.a1.a0 = -27.0;
9748 a9.a0.a0 = 28;
9749 a9.a0.a1 = -29;
9750 a9.a1.a0 = 30.0;
9751
9752 std::cout << "Calling TestPassStruct8BytesNestedMixedx10(" << "((("
9753 << a0.a0.a0 << ", " << a0.a0.a1 << "), (" << a0.a1.a0 << ")), (("
9754 << a1.a0.a0 << ", " << a1.a0.a1 << "), (" << a1.a1.a0 << ")), (("
9755 << a2.a0.a0 << ", " << a2.a0.a1 << "), (" << a2.a1.a0 << ")), (("
9756 << a3.a0.a0 << ", " << a3.a0.a1 << "), (" << a3.a1.a0 << ")), (("
9757 << a4.a0.a0 << ", " << a4.a0.a1 << "), (" << a4.a1.a0 << ")), (("
9758 << a5.a0.a0 << ", " << a5.a0.a1 << "), (" << a5.a1.a0 << ")), (("
9759 << a6.a0.a0 << ", " << a6.a0.a1 << "), (" << a6.a1.a0 << ")), (("
9760 << a7.a0.a0 << ", " << a7.a0.a1 << "), (" << a7.a1.a0 << ")), (("
9761 << a8.a0.a0 << ", " << a8.a0.a1 << "), (" << a8.a1.a0 << ")), (("
9762 << a9.a0.a0 << ", " << a9.a0.a1 << "), (" << a9.a1.a0 << ")))"
9763 << ")\n";
9764
9765 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
9766
9767 std::cout << "result = " << result << "\n";
9768
9769 CHECK_APPROX(15.0, result);
9770
9771 // Pass argument that will make the Dart callback throw.
9772 a0.a0.a0 = 42;
9773
9774 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
9775
9776 CHECK_APPROX(0.0, result);
9777
9778 // Pass argument that will make the Dart callback return null.
9779 a0.a0.a0 = 84;
9780
9781 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
9782
9783 CHECK_APPROX(0.0, result);
9784
9785 return 0;
9786}
9787
9788// Used for testing structs and unions by value.
9789// Deeper nested struct to test recursive member access.
9791 // NOLINTNEXTLINE(whitespace/parens)
9792 int64_t (*f)(Struct16BytesNestedInt a0, Struct16BytesNestedInt a1)) {
9793 Struct16BytesNestedInt a0 = {};
9794 Struct16BytesNestedInt a1 = {};
9795
9796 a0.a0.a0.a0 = -1;
9797 a0.a0.a0.a1 = 2;
9798 a0.a0.a1.a0 = -3;
9799 a0.a0.a1.a1 = 4;
9800 a0.a1.a0.a0 = -5;
9801 a0.a1.a0.a1 = 6;
9802 a0.a1.a1.a0 = -7;
9803 a0.a1.a1.a1 = 8;
9804 a1.a0.a0.a0 = -9;
9805 a1.a0.a0.a1 = 10;
9806 a1.a0.a1.a0 = -11;
9807 a1.a0.a1.a1 = 12;
9808 a1.a1.a0.a0 = -13;
9809 a1.a1.a0.a1 = 14;
9810 a1.a1.a1.a0 = -15;
9811 a1.a1.a1.a1 = 16;
9812
9813 std::cout << "Calling TestPassStruct16BytesNestedIntx2(" << "(((("
9814 << a0.a0.a0.a0 << ", " << a0.a0.a0.a1 << "), (" << a0.a0.a1.a0
9815 << ", " << a0.a0.a1.a1 << ")), ((" << a0.a1.a0.a0 << ", "
9816 << a0.a1.a0.a1 << "), (" << a0.a1.a1.a0 << ", " << a0.a1.a1.a1
9817 << "))), (((" << a1.a0.a0.a0 << ", " << a1.a0.a0.a1 << "), ("
9818 << a1.a0.a1.a0 << ", " << a1.a0.a1.a1 << ")), ((" << a1.a1.a0.a0
9819 << ", " << a1.a1.a0.a1 << "), (" << a1.a1.a1.a0 << ", "
9820 << a1.a1.a1.a1 << "))))" << ")\n";
9821
9822 int64_t result = f(a0, a1);
9823
9824 std::cout << "result = " << result << "\n";
9825
9826 CHECK_EQ(8, result);
9827
9828 // Pass argument that will make the Dart callback throw.
9829 a0.a0.a0.a0 = 42;
9830
9831 result = f(a0, a1);
9832
9833 CHECK_EQ(0, result);
9834
9835 // Pass argument that will make the Dart callback return null.
9836 a0.a0.a0.a0 = 84;
9837
9838 result = f(a0, a1);
9839
9840 CHECK_EQ(0, result);
9841
9842 return 0;
9843}
9844
9845// Used for testing structs and unions by value.
9846// Even deeper nested struct to test recursive member access.
9848 // NOLINTNEXTLINE(whitespace/parens)
9849 int64_t (*f)(Struct32BytesNestedInt a0, Struct32BytesNestedInt a1)) {
9850 Struct32BytesNestedInt a0 = {};
9851 Struct32BytesNestedInt a1 = {};
9852
9853 a0.a0.a0.a0.a0 = -1;
9854 a0.a0.a0.a0.a1 = 2;
9855 a0.a0.a0.a1.a0 = -3;
9856 a0.a0.a0.a1.a1 = 4;
9857 a0.a0.a1.a0.a0 = -5;
9858 a0.a0.a1.a0.a1 = 6;
9859 a0.a0.a1.a1.a0 = -7;
9860 a0.a0.a1.a1.a1 = 8;
9861 a0.a1.a0.a0.a0 = -9;
9862 a0.a1.a0.a0.a1 = 10;
9863 a0.a1.a0.a1.a0 = -11;
9864 a0.a1.a0.a1.a1 = 12;
9865 a0.a1.a1.a0.a0 = -13;
9866 a0.a1.a1.a0.a1 = 14;
9867 a0.a1.a1.a1.a0 = -15;
9868 a0.a1.a1.a1.a1 = 16;
9869 a1.a0.a0.a0.a0 = -17;
9870 a1.a0.a0.a0.a1 = 18;
9871 a1.a0.a0.a1.a0 = -19;
9872 a1.a0.a0.a1.a1 = 20;
9873 a1.a0.a1.a0.a0 = -21;
9874 a1.a0.a1.a0.a1 = 22;
9875 a1.a0.a1.a1.a0 = -23;
9876 a1.a0.a1.a1.a1 = 24;
9877 a1.a1.a0.a0.a0 = -25;
9878 a1.a1.a0.a0.a1 = 26;
9879 a1.a1.a0.a1.a0 = -27;
9880 a1.a1.a0.a1.a1 = 28;
9881 a1.a1.a1.a0.a0 = -29;
9882 a1.a1.a1.a0.a1 = 30;
9883 a1.a1.a1.a1.a0 = -31;
9884 a1.a1.a1.a1.a1 = 32;
9885
9886 std::cout << "Calling TestPassStruct32BytesNestedIntx2(" << "((((("
9887 << a0.a0.a0.a0.a0 << ", " << a0.a0.a0.a0.a1 << "), ("
9888 << a0.a0.a0.a1.a0 << ", " << a0.a0.a0.a1.a1 << ")), (("
9889 << a0.a0.a1.a0.a0 << ", " << a0.a0.a1.a0.a1 << "), ("
9890 << a0.a0.a1.a1.a0 << ", " << a0.a0.a1.a1.a1 << "))), ((("
9891 << a0.a1.a0.a0.a0 << ", " << a0.a1.a0.a0.a1 << "), ("
9892 << a0.a1.a0.a1.a0 << ", " << a0.a1.a0.a1.a1 << ")), (("
9893 << a0.a1.a1.a0.a0 << ", " << a0.a1.a1.a0.a1 << "), ("
9894 << a0.a1.a1.a1.a0 << ", " << a0.a1.a1.a1.a1 << ")))), (((("
9895 << a1.a0.a0.a0.a0 << ", " << a1.a0.a0.a0.a1 << "), ("
9896 << a1.a0.a0.a1.a0 << ", " << a1.a0.a0.a1.a1 << ")), (("
9897 << a1.a0.a1.a0.a0 << ", " << a1.a0.a1.a0.a1 << "), ("
9898 << a1.a0.a1.a1.a0 << ", " << a1.a0.a1.a1.a1 << "))), ((("
9899 << a1.a1.a0.a0.a0 << ", " << a1.a1.a0.a0.a1 << "), ("
9900 << a1.a1.a0.a1.a0 << ", " << a1.a1.a0.a1.a1 << ")), (("
9901 << a1.a1.a1.a0.a0 << ", " << a1.a1.a1.a0.a1 << "), ("
9902 << a1.a1.a1.a1.a0 << ", " << a1.a1.a1.a1.a1 << ")))))" << ")\n";
9903
9904 int64_t result = f(a0, a1);
9905
9906 std::cout << "result = " << result << "\n";
9907
9908 CHECK_EQ(16, result);
9909
9910 // Pass argument that will make the Dart callback throw.
9911 a0.a0.a0.a0.a0 = 42;
9912
9913 result = f(a0, a1);
9914
9915 CHECK_EQ(0, result);
9916
9917 // Pass argument that will make the Dart callback return null.
9918 a0.a0.a0.a0.a0 = 84;
9919
9920 result = f(a0, a1);
9921
9922 CHECK_EQ(0, result);
9923
9924 return 0;
9925}
9926
9927// Used for testing structs and unions by value.
9928// Test alignment and padding of nested struct with 16 byte int.
9930 // NOLINTNEXTLINE(whitespace/parens)
9931 int64_t (*f)(StructNestedIntStructAlignmentInt16 a0)) {
9933
9934 a0.a0.a0 = -1;
9935 a0.a0.a1 = 2;
9936 a0.a0.a2 = -3;
9937 a0.a1.a0 = 4;
9938 a0.a1.a1 = -5;
9939 a0.a1.a2 = 6;
9940
9941 std::cout << "Calling TestPassStructNestedIntStructAlignmentInt16(" << "((("
9942 << static_cast<int>(a0.a0.a0) << ", " << a0.a0.a1 << ", "
9943 << static_cast<int>(a0.a0.a2) << "), ("
9944 << static_cast<int>(a0.a1.a0) << ", " << a0.a1.a1 << ", "
9945 << static_cast<int>(a0.a1.a2) << ")))" << ")\n";
9946
9947 int64_t result = f(a0);
9948
9949 std::cout << "result = " << result << "\n";
9950
9951 CHECK_EQ(3, result);
9952
9953 // Pass argument that will make the Dart callback throw.
9954 a0.a0.a0 = 42;
9955
9956 result = f(a0);
9957
9958 CHECK_EQ(0, result);
9959
9960 // Pass argument that will make the Dart callback return null.
9961 a0.a0.a0 = 84;
9962
9963 result = f(a0);
9964
9965 CHECK_EQ(0, result);
9966
9967 return 0;
9968}
9969
9970// Used for testing structs and unions by value.
9971// Test alignment and padding of nested struct with 32 byte int.
9973 // NOLINTNEXTLINE(whitespace/parens)
9974 int64_t (*f)(StructNestedIntStructAlignmentInt32 a0)) {
9976
9977 a0.a0.a0 = -1;
9978 a0.a0.a1 = 2;
9979 a0.a0.a2 = -3;
9980 a0.a1.a0 = 4;
9981 a0.a1.a1 = -5;
9982 a0.a1.a2 = 6;
9983
9984 std::cout << "Calling TestPassStructNestedIntStructAlignmentInt32(" << "((("
9985 << static_cast<int>(a0.a0.a0) << ", " << a0.a0.a1 << ", "
9986 << static_cast<int>(a0.a0.a2) << "), ("
9987 << static_cast<int>(a0.a1.a0) << ", " << a0.a1.a1 << ", "
9988 << static_cast<int>(a0.a1.a2) << ")))" << ")\n";
9989
9990 int64_t result = f(a0);
9991
9992 std::cout << "result = " << result << "\n";
9993
9994 CHECK_EQ(3, result);
9995
9996 // Pass argument that will make the Dart callback throw.
9997 a0.a0.a0 = 42;
9998
9999 result = f(a0);
10000
10001 CHECK_EQ(0, result);
10002
10003 // Pass argument that will make the Dart callback return null.
10004 a0.a0.a0 = 84;
10005
10006 result = f(a0);
10007
10008 CHECK_EQ(0, result);
10009
10010 return 0;
10011}
10012
10013// Used for testing structs and unions by value.
10014// Test alignment and padding of nested struct with 64 byte int.
10016 // NOLINTNEXTLINE(whitespace/parens)
10017 int64_t (*f)(StructNestedIntStructAlignmentInt64 a0)) {
10019
10020 a0.a0.a0 = -1;
10021 a0.a0.a1 = 2;
10022 a0.a0.a2 = -3;
10023 a0.a1.a0 = 4;
10024 a0.a1.a1 = -5;
10025 a0.a1.a2 = 6;
10026
10027 std::cout << "Calling TestPassStructNestedIntStructAlignmentInt64(" << "((("
10028 << static_cast<int>(a0.a0.a0) << ", " << a0.a0.a1 << ", "
10029 << static_cast<int>(a0.a0.a2) << "), ("
10030 << static_cast<int>(a0.a1.a0) << ", " << a0.a1.a1 << ", "
10031 << static_cast<int>(a0.a1.a2) << ")))" << ")\n";
10032
10033 int64_t result = f(a0);
10034
10035 std::cout << "result = " << result << "\n";
10036
10037 CHECK_EQ(3, result);
10038
10039 // Pass argument that will make the Dart callback throw.
10040 a0.a0.a0 = 42;
10041
10042 result = f(a0);
10043
10044 CHECK_EQ(0, result);
10045
10046 // Pass argument that will make the Dart callback return null.
10047 a0.a0.a0 = 84;
10048
10049 result = f(a0);
10050
10051 CHECK_EQ(0, result);
10052
10053 return 0;
10054}
10055
10056// Used for testing structs and unions by value.
10057// Return big irregular struct as smoke test.
10059 // NOLINTNEXTLINE(whitespace/parens)
10060 double (*f)(StructNestedIrregularEvenBigger a0,
10068
10069 a0.a0 = 1;
10070 a0.a1.a0.a0 = 2;
10071 a0.a1.a0.a1.a0.a0 = -3;
10072 a0.a1.a0.a1.a0.a1 = 4;
10073 a0.a1.a0.a1.a1.a0 = -5.0;
10074 a0.a1.a0.a2 = 6;
10075 a0.a1.a0.a3.a0.a0 = -7.0;
10076 a0.a1.a0.a3.a1 = 8.0;
10077 a0.a1.a0.a4 = 9;
10078 a0.a1.a0.a5.a0.a0 = 10.0;
10079 a0.a1.a0.a5.a1.a0 = -11.0;
10080 a0.a1.a0.a6 = 12;
10081 a0.a1.a1.a0.a0 = -13;
10082 a0.a1.a1.a0.a1 = 14;
10083 a0.a1.a1.a1.a0 = -15.0;
10084 a0.a1.a2 = 16.0;
10085 a0.a1.a3 = -17.0;
10086 a0.a2.a0.a0 = 18;
10087 a0.a2.a0.a1.a0.a0 = -19;
10088 a0.a2.a0.a1.a0.a1 = 20;
10089 a0.a2.a0.a1.a1.a0 = -21.0;
10090 a0.a2.a0.a2 = 22;
10091 a0.a2.a0.a3.a0.a0 = -23.0;
10092 a0.a2.a0.a3.a1 = 24.0;
10093 a0.a2.a0.a4 = 25;
10094 a0.a2.a0.a5.a0.a0 = 26.0;
10095 a0.a2.a0.a5.a1.a0 = -27.0;
10096 a0.a2.a0.a6 = 28;
10097 a0.a2.a1.a0.a0 = -29;
10098 a0.a2.a1.a0.a1 = 30;
10099 a0.a2.a1.a1.a0 = -31.0;
10100 a0.a2.a2 = 32.0;
10101 a0.a2.a3 = -33.0;
10102 a0.a3 = 34.0;
10103 a1.a0 = 35;
10104 a1.a1.a0.a0 = 36;
10105 a1.a1.a0.a1.a0.a0 = -37;
10106 a1.a1.a0.a1.a0.a1 = 38;
10107 a1.a1.a0.a1.a1.a0 = -39.0;
10108 a1.a1.a0.a2 = 40;
10109 a1.a1.a0.a3.a0.a0 = -41.0;
10110 a1.a1.a0.a3.a1 = 42.0;
10111 a1.a1.a0.a4 = 43;
10112 a1.a1.a0.a5.a0.a0 = 44.0;
10113 a1.a1.a0.a5.a1.a0 = -45.0;
10114 a1.a1.a0.a6 = 46;
10115 a1.a1.a1.a0.a0 = -47;
10116 a1.a1.a1.a0.a1 = 48;
10117 a1.a1.a1.a1.a0 = -49.0;
10118 a1.a1.a2 = 50.0;
10119 a1.a1.a3 = -51.0;
10120 a1.a2.a0.a0 = 52;
10121 a1.a2.a0.a1.a0.a0 = -53;
10122 a1.a2.a0.a1.a0.a1 = 54;
10123 a1.a2.a0.a1.a1.a0 = -55.0;
10124 a1.a2.a0.a2 = 56;
10125 a1.a2.a0.a3.a0.a0 = -57.0;
10126 a1.a2.a0.a3.a1 = 58.0;
10127 a1.a2.a0.a4 = 59;
10128 a1.a2.a0.a5.a0.a0 = 60.0;
10129 a1.a2.a0.a5.a1.a0 = -61.0;
10130 a1.a2.a0.a6 = 62;
10131 a1.a2.a1.a0.a0 = -63;
10132 a1.a2.a1.a0.a1 = 64;
10133 a1.a2.a1.a1.a0 = -65.0;
10134 a1.a2.a2 = 66.0;
10135 a1.a2.a3 = -67.0;
10136 a1.a3 = 68.0;
10137 a2.a0 = 69;
10138 a2.a1.a0.a0 = 70;
10139 a2.a1.a0.a1.a0.a0 = -71;
10140 a2.a1.a0.a1.a0.a1 = 72;
10141 a2.a1.a0.a1.a1.a0 = -73.0;
10142 a2.a1.a0.a2 = 74;
10143 a2.a1.a0.a3.a0.a0 = -75.0;
10144 a2.a1.a0.a3.a1 = 76.0;
10145 a2.a1.a0.a4 = 77;
10146 a2.a1.a0.a5.a0.a0 = 78.0;
10147 a2.a1.a0.a5.a1.a0 = -79.0;
10148 a2.a1.a0.a6 = 80;
10149 a2.a1.a1.a0.a0 = -81;
10150 a2.a1.a1.a0.a1 = 82;
10151 a2.a1.a1.a1.a0 = -83.0;
10152 a2.a1.a2 = 84.0;
10153 a2.a1.a3 = -85.0;
10154 a2.a2.a0.a0 = 86;
10155 a2.a2.a0.a1.a0.a0 = -87;
10156 a2.a2.a0.a1.a0.a1 = 88;
10157 a2.a2.a0.a1.a1.a0 = -89.0;
10158 a2.a2.a0.a2 = 90;
10159 a2.a2.a0.a3.a0.a0 = -91.0;
10160 a2.a2.a0.a3.a1 = 92.0;
10161 a2.a2.a0.a4 = 93;
10162 a2.a2.a0.a5.a0.a0 = 94.0;
10163 a2.a2.a0.a5.a1.a0 = -95.0;
10164 a2.a2.a0.a6 = 96;
10165 a2.a2.a1.a0.a0 = -97;
10166 a2.a2.a1.a0.a1 = 98;
10167 a2.a2.a1.a1.a0 = -99.0;
10168 a2.a2.a2 = 100.0;
10169 a2.a2.a3 = -101.0;
10170 a2.a3 = 102.0;
10171 a3.a0 = 103;
10172 a3.a1.a0.a0 = 104;
10173 a3.a1.a0.a1.a0.a0 = -105;
10174 a3.a1.a0.a1.a0.a1 = 106;
10175 a3.a1.a0.a1.a1.a0 = -107.0;
10176 a3.a1.a0.a2 = 108;
10177 a3.a1.a0.a3.a0.a0 = -109.0;
10178 a3.a1.a0.a3.a1 = 110.0;
10179 a3.a1.a0.a4 = 111;
10180 a3.a1.a0.a5.a0.a0 = 112.0;
10181 a3.a1.a0.a5.a1.a0 = -113.0;
10182 a3.a1.a0.a6 = 114;
10183 a3.a1.a1.a0.a0 = -115;
10184 a3.a1.a1.a0.a1 = 116;
10185 a3.a1.a1.a1.a0 = -117.0;
10186 a3.a1.a2 = 118.0;
10187 a3.a1.a3 = -119.0;
10188 a3.a2.a0.a0 = 120;
10189 a3.a2.a0.a1.a0.a0 = -121;
10190 a3.a2.a0.a1.a0.a1 = 122;
10191 a3.a2.a0.a1.a1.a0 = -123.0;
10192 a3.a2.a0.a2 = 124;
10193 a3.a2.a0.a3.a0.a0 = -125.0;
10194 a3.a2.a0.a3.a1 = 126.0;
10195 a3.a2.a0.a4 = 127;
10196 a3.a2.a0.a5.a0.a0 = 128.0;
10197 a3.a2.a0.a5.a1.a0 = -129.0;
10198 a3.a2.a0.a6 = 130;
10199 a3.a2.a1.a0.a0 = -131;
10200 a3.a2.a1.a0.a1 = 132;
10201 a3.a2.a1.a1.a0 = -133.0;
10202 a3.a2.a2 = 134.0;
10203 a3.a2.a3 = -135.0;
10204 a3.a3 = 136.0;
10205
10206 std::cout
10207 << "Calling TestPassStructNestedIrregularEvenBiggerx4(" << "((" << a0.a0
10208 << ", ((" << a0.a1.a0.a0 << ", ((" << a0.a1.a0.a1.a0.a0 << ", "
10209 << a0.a1.a0.a1.a0.a1 << "), (" << a0.a1.a0.a1.a1.a0 << ")), "
10210 << a0.a1.a0.a2 << ", ((" << a0.a1.a0.a3.a0.a0 << "), " << a0.a1.a0.a3.a1
10211 << "), " << a0.a1.a0.a4 << ", ((" << a0.a1.a0.a5.a0.a0 << "), ("
10212 << a0.a1.a0.a5.a1.a0 << ")), " << a0.a1.a0.a6 << "), ((" << a0.a1.a1.a0.a0
10213 << ", " << a0.a1.a1.a0.a1 << "), (" << a0.a1.a1.a1.a0 << ")), "
10214 << a0.a1.a2 << ", " << a0.a1.a3 << "), ((" << a0.a2.a0.a0 << ", (("
10215 << a0.a2.a0.a1.a0.a0 << ", " << a0.a2.a0.a1.a0.a1 << "), ("
10216 << a0.a2.a0.a1.a1.a0 << ")), " << a0.a2.a0.a2 << ", (("
10217 << a0.a2.a0.a3.a0.a0 << "), " << a0.a2.a0.a3.a1 << "), " << a0.a2.a0.a4
10218 << ", ((" << a0.a2.a0.a5.a0.a0 << "), (" << a0.a2.a0.a5.a1.a0 << ")), "
10219 << a0.a2.a0.a6 << "), ((" << a0.a2.a1.a0.a0 << ", " << a0.a2.a1.a0.a1
10220 << "), (" << a0.a2.a1.a1.a0 << ")), " << a0.a2.a2 << ", " << a0.a2.a3
10221 << "), " << a0.a3 << "), (" << a1.a0 << ", ((" << a1.a1.a0.a0 << ", (("
10222 << a1.a1.a0.a1.a0.a0 << ", " << a1.a1.a0.a1.a0.a1 << "), ("
10223 << a1.a1.a0.a1.a1.a0 << ")), " << a1.a1.a0.a2 << ", (("
10224 << a1.a1.a0.a3.a0.a0 << "), " << a1.a1.a0.a3.a1 << "), " << a1.a1.a0.a4
10225 << ", ((" << a1.a1.a0.a5.a0.a0 << "), (" << a1.a1.a0.a5.a1.a0 << ")), "
10226 << a1.a1.a0.a6 << "), ((" << a1.a1.a1.a0.a0 << ", " << a1.a1.a1.a0.a1
10227 << "), (" << a1.a1.a1.a1.a0 << ")), " << a1.a1.a2 << ", " << a1.a1.a3
10228 << "), ((" << a1.a2.a0.a0 << ", ((" << a1.a2.a0.a1.a0.a0 << ", "
10229 << a1.a2.a0.a1.a0.a1 << "), (" << a1.a2.a0.a1.a1.a0 << ")), "
10230 << a1.a2.a0.a2 << ", ((" << a1.a2.a0.a3.a0.a0 << "), " << a1.a2.a0.a3.a1
10231 << "), " << a1.a2.a0.a4 << ", ((" << a1.a2.a0.a5.a0.a0 << "), ("
10232 << a1.a2.a0.a5.a1.a0 << ")), " << a1.a2.a0.a6 << "), ((" << a1.a2.a1.a0.a0
10233 << ", " << a1.a2.a1.a0.a1 << "), (" << a1.a2.a1.a1.a0 << ")), "
10234 << a1.a2.a2 << ", " << a1.a2.a3 << "), " << a1.a3 << "), (" << a2.a0
10235 << ", ((" << a2.a1.a0.a0 << ", ((" << a2.a1.a0.a1.a0.a0 << ", "
10236 << a2.a1.a0.a1.a0.a1 << "), (" << a2.a1.a0.a1.a1.a0 << ")), "
10237 << a2.a1.a0.a2 << ", ((" << a2.a1.a0.a3.a0.a0 << "), " << a2.a1.a0.a3.a1
10238 << "), " << a2.a1.a0.a4 << ", ((" << a2.a1.a0.a5.a0.a0 << "), ("
10239 << a2.a1.a0.a5.a1.a0 << ")), " << a2.a1.a0.a6 << "), ((" << a2.a1.a1.a0.a0
10240 << ", " << a2.a1.a1.a0.a1 << "), (" << a2.a1.a1.a1.a0 << ")), "
10241 << a2.a1.a2 << ", " << a2.a1.a3 << "), ((" << a2.a2.a0.a0 << ", (("
10242 << a2.a2.a0.a1.a0.a0 << ", " << a2.a2.a0.a1.a0.a1 << "), ("
10243 << a2.a2.a0.a1.a1.a0 << ")), " << a2.a2.a0.a2 << ", (("
10244 << a2.a2.a0.a3.a0.a0 << "), " << a2.a2.a0.a3.a1 << "), " << a2.a2.a0.a4
10245 << ", ((" << a2.a2.a0.a5.a0.a0 << "), (" << a2.a2.a0.a5.a1.a0 << ")), "
10246 << a2.a2.a0.a6 << "), ((" << a2.a2.a1.a0.a0 << ", " << a2.a2.a1.a0.a1
10247 << "), (" << a2.a2.a1.a1.a0 << ")), " << a2.a2.a2 << ", " << a2.a2.a3
10248 << "), " << a2.a3 << "), (" << a3.a0 << ", ((" << a3.a1.a0.a0 << ", (("
10249 << a3.a1.a0.a1.a0.a0 << ", " << a3.a1.a0.a1.a0.a1 << "), ("
10250 << a3.a1.a0.a1.a1.a0 << ")), " << a3.a1.a0.a2 << ", (("
10251 << a3.a1.a0.a3.a0.a0 << "), " << a3.a1.a0.a3.a1 << "), " << a3.a1.a0.a4
10252 << ", ((" << a3.a1.a0.a5.a0.a0 << "), (" << a3.a1.a0.a5.a1.a0 << ")), "
10253 << a3.a1.a0.a6 << "), ((" << a3.a1.a1.a0.a0 << ", " << a3.a1.a1.a0.a1
10254 << "), (" << a3.a1.a1.a1.a0 << ")), " << a3.a1.a2 << ", " << a3.a1.a3
10255 << "), ((" << a3.a2.a0.a0 << ", ((" << a3.a2.a0.a1.a0.a0 << ", "
10256 << a3.a2.a0.a1.a0.a1 << "), (" << a3.a2.a0.a1.a1.a0 << ")), "
10257 << a3.a2.a0.a2 << ", ((" << a3.a2.a0.a3.a0.a0 << "), " << a3.a2.a0.a3.a1
10258 << "), " << a3.a2.a0.a4 << ", ((" << a3.a2.a0.a5.a0.a0 << "), ("
10259 << a3.a2.a0.a5.a1.a0 << ")), " << a3.a2.a0.a6 << "), ((" << a3.a2.a1.a0.a0
10260 << ", " << a3.a2.a1.a0.a1 << "), (" << a3.a2.a1.a1.a0 << ")), "
10261 << a3.a2.a2 << ", " << a3.a2.a3 << "), " << a3.a3 << "))" << ")\n";
10262
10263 double result = f(a0, a1, a2, a3);
10264
10265 std::cout << "result = " << result << "\n";
10266
10267 CHECK_APPROX(1572.0, result);
10268
10269 // Pass argument that will make the Dart callback throw.
10270 a0.a0 = 42;
10271
10272 result = f(a0, a1, a2, a3);
10273
10274 CHECK_APPROX(0.0, result);
10275
10276 // Pass argument that will make the Dart callback return null.
10277 a0.a0 = 84;
10278
10279 result = f(a0, a1, a2, a3);
10280
10281 CHECK_APPROX(0.0, result);
10282
10283 return 0;
10284}
10285
10286// Used for testing structs and unions by value.
10287// Simple struct with inline array.
10289 // NOLINTNEXTLINE(whitespace/parens)
10290 int32_t (*f)(Struct8BytesInlineArrayInt a0,
10298
10299 a0.a0[0] = 1;
10300 a0.a0[1] = 2;
10301 a0.a0[2] = 3;
10302 a0.a0[3] = 4;
10303 a0.a0[4] = 5;
10304 a0.a0[5] = 6;
10305 a0.a0[6] = 7;
10306 a0.a0[7] = 8;
10307 a1.a0[0] = 9;
10308 a1.a0[1] = 10;
10309 a1.a0[2] = 11;
10310 a1.a0[3] = 12;
10311 a1.a0[4] = 13;
10312 a1.a0[5] = 14;
10313 a1.a0[6] = 15;
10314 a1.a0[7] = 16;
10315 a2.a0[0] = 17;
10316 a2.a0[1] = 18;
10317 a2.a0[2] = 19;
10318 a2.a0[3] = 20;
10319 a2.a0[4] = 21;
10320 a2.a0[5] = 22;
10321 a2.a0[6] = 23;
10322 a2.a0[7] = 24;
10323 a3.a0[0] = 25;
10324 a3.a0[1] = 26;
10325 a3.a0[2] = 27;
10326 a3.a0[3] = 28;
10327 a3.a0[4] = 29;
10328 a3.a0[5] = 30;
10329 a3.a0[6] = 31;
10330 a3.a0[7] = 32;
10331
10332 std::cout << "Calling TestPassStruct8BytesInlineArrayIntx4(" << "((["
10333 << static_cast<int>(a0.a0[0]) << ", " << static_cast<int>(a0.a0[1])
10334 << ", " << static_cast<int>(a0.a0[2]) << ", "
10335 << static_cast<int>(a0.a0[3]) << ", " << static_cast<int>(a0.a0[4])
10336 << ", " << static_cast<int>(a0.a0[5]) << ", "
10337 << static_cast<int>(a0.a0[6]) << ", " << static_cast<int>(a0.a0[7])
10338 << "]), ([" << static_cast<int>(a1.a0[0]) << ", "
10339 << static_cast<int>(a1.a0[1]) << ", " << static_cast<int>(a1.a0[2])
10340 << ", " << static_cast<int>(a1.a0[3]) << ", "
10341 << static_cast<int>(a1.a0[4]) << ", " << static_cast<int>(a1.a0[5])
10342 << ", " << static_cast<int>(a1.a0[6]) << ", "
10343 << static_cast<int>(a1.a0[7]) << "]), (["
10344 << static_cast<int>(a2.a0[0]) << ", " << static_cast<int>(a2.a0[1])
10345 << ", " << static_cast<int>(a2.a0[2]) << ", "
10346 << static_cast<int>(a2.a0[3]) << ", " << static_cast<int>(a2.a0[4])
10347 << ", " << static_cast<int>(a2.a0[5]) << ", "
10348 << static_cast<int>(a2.a0[6]) << ", " << static_cast<int>(a2.a0[7])
10349 << "]), ([" << static_cast<int>(a3.a0[0]) << ", "
10350 << static_cast<int>(a3.a0[1]) << ", " << static_cast<int>(a3.a0[2])
10351 << ", " << static_cast<int>(a3.a0[3]) << ", "
10352 << static_cast<int>(a3.a0[4]) << ", " << static_cast<int>(a3.a0[5])
10353 << ", " << static_cast<int>(a3.a0[6]) << ", "
10354 << static_cast<int>(a3.a0[7]) << "]))" << ")\n";
10355
10356 int32_t result = f(a0, a1, a2, a3);
10357
10358 std::cout << "result = " << result << "\n";
10359
10360 CHECK_EQ(528, result);
10361
10362 // Pass argument that will make the Dart callback throw.
10363 a0.a0[0] = 42;
10364
10365 result = f(a0, a1, a2, a3);
10366
10367 CHECK_EQ(0, result);
10368
10369 // Pass argument that will make the Dart callback return null.
10370 a0.a0[0] = 84;
10371
10372 result = f(a0, a1, a2, a3);
10373
10374 CHECK_EQ(0, result);
10375
10376 return 0;
10377}
10378
10379// Used for testing structs and unions by value.
10380// Irregular struct with inline array.
10382 // NOLINTNEXTLINE(whitespace/parens)
10383 int32_t (*f)(StructInlineArrayIrregular a0,
10391
10392 a0.a0[0].a0 = -1;
10393 a0.a0[0].a1 = 2;
10394 a0.a0[1].a0 = -3;
10395 a0.a0[1].a1 = 4;
10396 a0.a1 = 5;
10397 a1.a0[0].a0 = 6;
10398 a1.a0[0].a1 = -7;
10399 a1.a0[1].a0 = 8;
10400 a1.a0[1].a1 = -9;
10401 a1.a1 = 10;
10402 a2.a0[0].a0 = -11;
10403 a2.a0[0].a1 = 12;
10404 a2.a0[1].a0 = -13;
10405 a2.a0[1].a1 = 14;
10406 a2.a1 = 15;
10407 a3.a0[0].a0 = 16;
10408 a3.a0[0].a1 = -17;
10409 a3.a0[1].a0 = 18;
10410 a3.a0[1].a1 = -19;
10411 a3.a1 = 20;
10412
10413 std::cout << "Calling TestPassStructInlineArrayIrregularx4(" << "(([("
10414 << a0.a0[0].a0 << ", " << static_cast<int>(a0.a0[0].a1) << "), ("
10415 << a0.a0[1].a0 << ", " << static_cast<int>(a0.a0[1].a1) << ")], "
10416 << static_cast<int>(a0.a1) << "), ([(" << a1.a0[0].a0 << ", "
10417 << static_cast<int>(a1.a0[0].a1) << "), (" << a1.a0[1].a0 << ", "
10418 << static_cast<int>(a1.a0[1].a1) << ")], "
10419 << static_cast<int>(a1.a1) << "), ([(" << a2.a0[0].a0 << ", "
10420 << static_cast<int>(a2.a0[0].a1) << "), (" << a2.a0[1].a0 << ", "
10421 << static_cast<int>(a2.a0[1].a1) << ")], "
10422 << static_cast<int>(a2.a1) << "), ([(" << a3.a0[0].a0 << ", "
10423 << static_cast<int>(a3.a0[0].a1) << "), (" << a3.a0[1].a0 << ", "
10424 << static_cast<int>(a3.a0[1].a1) << ")], "
10425 << static_cast<int>(a3.a1) << "))" << ")\n";
10426
10427 int32_t result = f(a0, a1, a2, a3);
10428
10429 std::cout << "result = " << result << "\n";
10430
10431 CHECK_EQ(50, result);
10432
10433 // Pass argument that will make the Dart callback throw.
10434 a0.a0[0].a0 = 42;
10435
10436 result = f(a0, a1, a2, a3);
10437
10438 CHECK_EQ(0, result);
10439
10440 // Pass argument that will make the Dart callback return null.
10441 a0.a0[0].a0 = 84;
10442
10443 result = f(a0, a1, a2, a3);
10444
10445 CHECK_EQ(0, result);
10446
10447 return 0;
10448}
10449
10450// Used for testing structs and unions by value.
10451// Regular larger struct with inline array.
10453 // NOLINTNEXTLINE(whitespace/parens)
10454 int32_t (*f)(StructInlineArray100Bytes a0)) {
10456
10457 a0.a0[0] = 1;
10458 a0.a0[1] = 2;
10459 a0.a0[2] = 3;
10460 a0.a0[3] = 4;
10461 a0.a0[4] = 5;
10462 a0.a0[5] = 6;
10463 a0.a0[6] = 7;
10464 a0.a0[7] = 8;
10465 a0.a0[8] = 9;
10466 a0.a0[9] = 10;
10467 a0.a0[10] = 11;
10468 a0.a0[11] = 12;
10469 a0.a0[12] = 13;
10470 a0.a0[13] = 14;
10471 a0.a0[14] = 15;
10472 a0.a0[15] = 16;
10473 a0.a0[16] = 17;
10474 a0.a0[17] = 18;
10475 a0.a0[18] = 19;
10476 a0.a0[19] = 20;
10477 a0.a0[20] = 21;
10478 a0.a0[21] = 22;
10479 a0.a0[22] = 23;
10480 a0.a0[23] = 24;
10481 a0.a0[24] = 25;
10482 a0.a0[25] = 26;
10483 a0.a0[26] = 27;
10484 a0.a0[27] = 28;
10485 a0.a0[28] = 29;
10486 a0.a0[29] = 30;
10487 a0.a0[30] = 31;
10488 a0.a0[31] = 32;
10489 a0.a0[32] = 33;
10490 a0.a0[33] = 34;
10491 a0.a0[34] = 35;
10492 a0.a0[35] = 36;
10493 a0.a0[36] = 37;
10494 a0.a0[37] = 38;
10495 a0.a0[38] = 39;
10496 a0.a0[39] = 40;
10497 a0.a0[40] = 41;
10498 a0.a0[41] = 42;
10499 a0.a0[42] = 43;
10500 a0.a0[43] = 44;
10501 a0.a0[44] = 45;
10502 a0.a0[45] = 46;
10503 a0.a0[46] = 47;
10504 a0.a0[47] = 48;
10505 a0.a0[48] = 49;
10506 a0.a0[49] = 50;
10507 a0.a0[50] = 51;
10508 a0.a0[51] = 52;
10509 a0.a0[52] = 53;
10510 a0.a0[53] = 54;
10511 a0.a0[54] = 55;
10512 a0.a0[55] = 56;
10513 a0.a0[56] = 57;
10514 a0.a0[57] = 58;
10515 a0.a0[58] = 59;
10516 a0.a0[59] = 60;
10517 a0.a0[60] = 61;
10518 a0.a0[61] = 62;
10519 a0.a0[62] = 63;
10520 a0.a0[63] = 64;
10521 a0.a0[64] = 65;
10522 a0.a0[65] = 66;
10523 a0.a0[66] = 67;
10524 a0.a0[67] = 68;
10525 a0.a0[68] = 69;
10526 a0.a0[69] = 70;
10527 a0.a0[70] = 71;
10528 a0.a0[71] = 72;
10529 a0.a0[72] = 73;
10530 a0.a0[73] = 74;
10531 a0.a0[74] = 75;
10532 a0.a0[75] = 76;
10533 a0.a0[76] = 77;
10534 a0.a0[77] = 78;
10535 a0.a0[78] = 79;
10536 a0.a0[79] = 80;
10537 a0.a0[80] = 81;
10538 a0.a0[81] = 82;
10539 a0.a0[82] = 83;
10540 a0.a0[83] = 84;
10541 a0.a0[84] = 85;
10542 a0.a0[85] = 86;
10543 a0.a0[86] = 87;
10544 a0.a0[87] = 88;
10545 a0.a0[88] = 89;
10546 a0.a0[89] = 90;
10547 a0.a0[90] = 91;
10548 a0.a0[91] = 92;
10549 a0.a0[92] = 93;
10550 a0.a0[93] = 94;
10551 a0.a0[94] = 95;
10552 a0.a0[95] = 96;
10553 a0.a0[96] = 97;
10554 a0.a0[97] = 98;
10555 a0.a0[98] = 99;
10556 a0.a0[99] = 100;
10557
10558 std::cout
10559 << "Calling TestPassStructInlineArray100Bytes(" << "((["
10560 << static_cast<int>(a0.a0[0]) << ", " << static_cast<int>(a0.a0[1])
10561 << ", " << static_cast<int>(a0.a0[2]) << ", "
10562 << static_cast<int>(a0.a0[3]) << ", " << static_cast<int>(a0.a0[4])
10563 << ", " << static_cast<int>(a0.a0[5]) << ", "
10564 << static_cast<int>(a0.a0[6]) << ", " << static_cast<int>(a0.a0[7])
10565 << ", " << static_cast<int>(a0.a0[8]) << ", "
10566 << static_cast<int>(a0.a0[9]) << ", " << static_cast<int>(a0.a0[10])
10567 << ", " << static_cast<int>(a0.a0[11]) << ", "
10568 << static_cast<int>(a0.a0[12]) << ", " << static_cast<int>(a0.a0[13])
10569 << ", " << static_cast<int>(a0.a0[14]) << ", "
10570 << static_cast<int>(a0.a0[15]) << ", " << static_cast<int>(a0.a0[16])
10571 << ", " << static_cast<int>(a0.a0[17]) << ", "
10572 << static_cast<int>(a0.a0[18]) << ", " << static_cast<int>(a0.a0[19])
10573 << ", " << static_cast<int>(a0.a0[20]) << ", "
10574 << static_cast<int>(a0.a0[21]) << ", " << static_cast<int>(a0.a0[22])
10575 << ", " << static_cast<int>(a0.a0[23]) << ", "
10576 << static_cast<int>(a0.a0[24]) << ", " << static_cast<int>(a0.a0[25])
10577 << ", " << static_cast<int>(a0.a0[26]) << ", "
10578 << static_cast<int>(a0.a0[27]) << ", " << static_cast<int>(a0.a0[28])
10579 << ", " << static_cast<int>(a0.a0[29]) << ", "
10580 << static_cast<int>(a0.a0[30]) << ", " << static_cast<int>(a0.a0[31])
10581 << ", " << static_cast<int>(a0.a0[32]) << ", "
10582 << static_cast<int>(a0.a0[33]) << ", " << static_cast<int>(a0.a0[34])
10583 << ", " << static_cast<int>(a0.a0[35]) << ", "
10584 << static_cast<int>(a0.a0[36]) << ", " << static_cast<int>(a0.a0[37])
10585 << ", " << static_cast<int>(a0.a0[38]) << ", "
10586 << static_cast<int>(a0.a0[39]) << ", " << static_cast<int>(a0.a0[40])
10587 << ", " << static_cast<int>(a0.a0[41]) << ", "
10588 << static_cast<int>(a0.a0[42]) << ", " << static_cast<int>(a0.a0[43])
10589 << ", " << static_cast<int>(a0.a0[44]) << ", "
10590 << static_cast<int>(a0.a0[45]) << ", " << static_cast<int>(a0.a0[46])
10591 << ", " << static_cast<int>(a0.a0[47]) << ", "
10592 << static_cast<int>(a0.a0[48]) << ", " << static_cast<int>(a0.a0[49])
10593 << ", " << static_cast<int>(a0.a0[50]) << ", "
10594 << static_cast<int>(a0.a0[51]) << ", " << static_cast<int>(a0.a0[52])
10595 << ", " << static_cast<int>(a0.a0[53]) << ", "
10596 << static_cast<int>(a0.a0[54]) << ", " << static_cast<int>(a0.a0[55])
10597 << ", " << static_cast<int>(a0.a0[56]) << ", "
10598 << static_cast<int>(a0.a0[57]) << ", " << static_cast<int>(a0.a0[58])
10599 << ", " << static_cast<int>(a0.a0[59]) << ", "
10600 << static_cast<int>(a0.a0[60]) << ", " << static_cast<int>(a0.a0[61])
10601 << ", " << static_cast<int>(a0.a0[62]) << ", "
10602 << static_cast<int>(a0.a0[63]) << ", " << static_cast<int>(a0.a0[64])
10603 << ", " << static_cast<int>(a0.a0[65]) << ", "
10604 << static_cast<int>(a0.a0[66]) << ", " << static_cast<int>(a0.a0[67])
10605 << ", " << static_cast<int>(a0.a0[68]) << ", "
10606 << static_cast<int>(a0.a0[69]) << ", " << static_cast<int>(a0.a0[70])
10607 << ", " << static_cast<int>(a0.a0[71]) << ", "
10608 << static_cast<int>(a0.a0[72]) << ", " << static_cast<int>(a0.a0[73])
10609 << ", " << static_cast<int>(a0.a0[74]) << ", "
10610 << static_cast<int>(a0.a0[75]) << ", " << static_cast<int>(a0.a0[76])
10611 << ", " << static_cast<int>(a0.a0[77]) << ", "
10612 << static_cast<int>(a0.a0[78]) << ", " << static_cast<int>(a0.a0[79])
10613 << ", " << static_cast<int>(a0.a0[80]) << ", "
10614 << static_cast<int>(a0.a0[81]) << ", " << static_cast<int>(a0.a0[82])
10615 << ", " << static_cast<int>(a0.a0[83]) << ", "
10616 << static_cast<int>(a0.a0[84]) << ", " << static_cast<int>(a0.a0[85])
10617 << ", " << static_cast<int>(a0.a0[86]) << ", "
10618 << static_cast<int>(a0.a0[87]) << ", " << static_cast<int>(a0.a0[88])
10619 << ", " << static_cast<int>(a0.a0[89]) << ", "
10620 << static_cast<int>(a0.a0[90]) << ", " << static_cast<int>(a0.a0[91])
10621 << ", " << static_cast<int>(a0.a0[92]) << ", "
10622 << static_cast<int>(a0.a0[93]) << ", " << static_cast<int>(a0.a0[94])
10623 << ", " << static_cast<int>(a0.a0[95]) << ", "
10624 << static_cast<int>(a0.a0[96]) << ", " << static_cast<int>(a0.a0[97])
10625 << ", " << static_cast<int>(a0.a0[98]) << ", "
10626 << static_cast<int>(a0.a0[99]) << "]))" << ")\n";
10627
10628 int32_t result = f(a0);
10629
10630 std::cout << "result = " << result << "\n";
10631
10632 CHECK_EQ(5050, result);
10633
10634 // Pass argument that will make the Dart callback throw.
10635 a0.a0[0] = 42;
10636
10637 result = f(a0);
10638
10639 CHECK_EQ(0, result);
10640
10641 // Pass argument that will make the Dart callback return null.
10642 a0.a0[0] = 84;
10643
10644 result = f(a0);
10645
10646 CHECK_EQ(0, result);
10647
10648 return 0;
10649}
10650
10651// Used for testing structs and unions by value.
10652// Arguments in FPU registers on arm hardfp and arm64.
10653// 5 struct arguments will exhaust available registers.
10655 // NOLINTNEXTLINE(whitespace/parens)
10666
10667 a0.a0.a0 = -1.0;
10668 a0.a1[0].a0 = 2.0;
10669 a0.a1[1].a0 = -3.0;
10670 a0.a2 = 4.0;
10671 a1.a0.a0 = -5.0;
10672 a1.a1[0].a0 = 6.0;
10673 a1.a1[1].a0 = -7.0;
10674 a1.a2 = 8.0;
10675 a2.a0.a0 = -9.0;
10676 a2.a1[0].a0 = 10.0;
10677 a2.a1[1].a0 = -11.0;
10678 a2.a2 = 12.0;
10679 a3.a0.a0 = -13.0;
10680 a3.a1[0].a0 = 14.0;
10681 a3.a1[1].a0 = -15.0;
10682 a3.a2 = 16.0;
10683 a4.a0.a0 = -17.0;
10684 a4.a1[0].a0 = 18.0;
10685 a4.a1[1].a0 = -19.0;
10686 a4.a2 = 20.0;
10687
10688 std::cout << "Calling TestPassStructStruct16BytesHomogeneousFloat2x5("
10689 << "(((" << a0.a0.a0 << "), [(" << a0.a1[0].a0 << "), ("
10690 << a0.a1[1].a0 << ")], " << a0.a2 << "), ((" << a1.a0.a0 << "), [("
10691 << a1.a1[0].a0 << "), (" << a1.a1[1].a0 << ")], " << a1.a2
10692 << "), ((" << a2.a0.a0 << "), [(" << a2.a1[0].a0 << "), ("
10693 << a2.a1[1].a0 << ")], " << a2.a2 << "), ((" << a3.a0.a0 << "), [("
10694 << a3.a1[0].a0 << "), (" << a3.a1[1].a0 << ")], " << a3.a2
10695 << "), ((" << a4.a0.a0 << "), [(" << a4.a1[0].a0 << "), ("
10696 << a4.a1[1].a0 << ")], " << a4.a2 << "))" << ")\n";
10697
10698 float result = f(a0, a1, a2, a3, a4);
10699
10700 std::cout << "result = " << result << "\n";
10701
10702 CHECK_APPROX(10.0, result);
10703
10704 // Pass argument that will make the Dart callback throw.
10705 a0.a0.a0 = 42;
10706
10707 result = f(a0, a1, a2, a3, a4);
10708
10709 CHECK_APPROX(0.0, result);
10710
10711 // Pass argument that will make the Dart callback return null.
10712 a0.a0.a0 = 84;
10713
10714 result = f(a0, a1, a2, a3, a4);
10715
10716 CHECK_APPROX(0.0, result);
10717
10718 return 0;
10719}
10720
10721// Used for testing structs and unions by value.
10722// Arguments in FPU registers on arm64.
10723// 5 struct arguments will exhaust available registers.
10725 // NOLINTNEXTLINE(whitespace/parens)
10736
10737 a0.a0.a0 = -1.0;
10738 a0.a1[0].a0 = 2.0;
10739 a0.a1[1].a0 = -3.0;
10740 a0.a2 = 4.0;
10741 a1.a0.a0 = -5.0;
10742 a1.a1[0].a0 = 6.0;
10743 a1.a1[1].a0 = -7.0;
10744 a1.a2 = 8.0;
10745 a2.a0.a0 = -9.0;
10746 a2.a1[0].a0 = 10.0;
10747 a2.a1[1].a0 = -11.0;
10748 a2.a2 = 12.0;
10749 a3.a0.a0 = -13.0;
10750 a3.a1[0].a0 = 14.0;
10751 a3.a1[1].a0 = -15.0;
10752 a3.a2 = 16.0;
10753 a4.a0.a0 = -17.0;
10754 a4.a1[0].a0 = 18.0;
10755 a4.a1[1].a0 = -19.0;
10756 a4.a2 = 20.0;
10757
10758 std::cout << "Calling TestPassStructStruct32BytesHomogeneousDouble2x5("
10759 << "(((" << a0.a0.a0 << "), [(" << a0.a1[0].a0 << "), ("
10760 << a0.a1[1].a0 << ")], " << a0.a2 << "), ((" << a1.a0.a0 << "), [("
10761 << a1.a1[0].a0 << "), (" << a1.a1[1].a0 << ")], " << a1.a2
10762 << "), ((" << a2.a0.a0 << "), [(" << a2.a1[0].a0 << "), ("
10763 << a2.a1[1].a0 << ")], " << a2.a2 << "), ((" << a3.a0.a0 << "), [("
10764 << a3.a1[0].a0 << "), (" << a3.a1[1].a0 << ")], " << a3.a2
10765 << "), ((" << a4.a0.a0 << "), [(" << a4.a1[0].a0 << "), ("
10766 << a4.a1[1].a0 << ")], " << a4.a2 << "))" << ")\n";
10767
10768 double result = f(a0, a1, a2, a3, a4);
10769
10770 std::cout << "result = " << result << "\n";
10771
10772 CHECK_APPROX(10.0, result);
10773
10774 // Pass argument that will make the Dart callback throw.
10775 a0.a0.a0 = 42;
10776
10777 result = f(a0, a1, a2, a3, a4);
10778
10779 CHECK_APPROX(0.0, result);
10780
10781 // Pass argument that will make the Dart callback return null.
10782 a0.a0.a0 = 84;
10783
10784 result = f(a0, a1, a2, a3, a4);
10785
10786 CHECK_APPROX(0.0, result);
10787
10788 return 0;
10789}
10790
10791// Used for testing structs and unions by value.
10792// On x64, arguments are split over FP and int registers.
10793// On x64, it will exhaust the integer registers with the 6th argument.
10794// The rest goes on the stack.
10795// On arm, arguments are 4 byte aligned.
10797 // NOLINTNEXTLINE(whitespace/parens)
10798 float (*f)(StructStruct16BytesMixed3 a0,
10818
10819 a0.a0.a0 = -1.0;
10820 a0.a1[0].a0 = 2.0;
10821 a0.a1[0].a1 = -3;
10822 a0.a1[0].a2 = 4;
10823 a0.a2[0] = -5;
10824 a0.a2[1] = 6;
10825 a1.a0.a0 = -7.0;
10826 a1.a1[0].a0 = 8.0;
10827 a1.a1[0].a1 = -9;
10828 a1.a1[0].a2 = 10;
10829 a1.a2[0] = -11;
10830 a1.a2[1] = 12;
10831 a2.a0.a0 = -13.0;
10832 a2.a1[0].a0 = 14.0;
10833 a2.a1[0].a1 = -15;
10834 a2.a1[0].a2 = 16;
10835 a2.a2[0] = -17;
10836 a2.a2[1] = 18;
10837 a3.a0.a0 = -19.0;
10838 a3.a1[0].a0 = 20.0;
10839 a3.a1[0].a1 = -21;
10840 a3.a1[0].a2 = 22;
10841 a3.a2[0] = -23;
10842 a3.a2[1] = 24;
10843 a4.a0.a0 = -25.0;
10844 a4.a1[0].a0 = 26.0;
10845 a4.a1[0].a1 = -27;
10846 a4.a1[0].a2 = 28;
10847 a4.a2[0] = -29;
10848 a4.a2[1] = 30;
10849 a5.a0.a0 = -31.0;
10850 a5.a1[0].a0 = 32.0;
10851 a5.a1[0].a1 = -33;
10852 a5.a1[0].a2 = 34;
10853 a5.a2[0] = -35;
10854 a5.a2[1] = 36;
10855 a6.a0.a0 = -37.0;
10856 a6.a1[0].a0 = 38.0;
10857 a6.a1[0].a1 = -39;
10858 a6.a1[0].a2 = 40;
10859 a6.a2[0] = -41;
10860 a6.a2[1] = 42;
10861 a7.a0.a0 = -43.0;
10862 a7.a1[0].a0 = 44.0;
10863 a7.a1[0].a1 = -45;
10864 a7.a1[0].a2 = 46;
10865 a7.a2[0] = -47;
10866 a7.a2[1] = 48;
10867 a8.a0.a0 = -49.0;
10868 a8.a1[0].a0 = 50.0;
10869 a8.a1[0].a1 = -51;
10870 a8.a1[0].a2 = 52;
10871 a8.a2[0] = -53;
10872 a8.a2[1] = 54;
10873 a9.a0.a0 = -55.0;
10874 a9.a1[0].a0 = 56.0;
10875 a9.a1[0].a1 = -57;
10876 a9.a1[0].a2 = 58;
10877 a9.a2[0] = -59;
10878 a9.a2[1] = 60;
10879
10880 std::cout << "Calling TestPassStructStruct16BytesMixed3x10(" << "((("
10881 << a0.a0.a0 << "), [(" << a0.a1[0].a0 << ", " << a0.a1[0].a1 << ", "
10882 << a0.a1[0].a2 << ")], [" << a0.a2[0] << ", " << a0.a2[1]
10883 << "]), ((" << a1.a0.a0 << "), [(" << a1.a1[0].a0 << ", "
10884 << a1.a1[0].a1 << ", " << a1.a1[0].a2 << ")], [" << a1.a2[0] << ", "
10885 << a1.a2[1] << "]), ((" << a2.a0.a0 << "), [(" << a2.a1[0].a0
10886 << ", " << a2.a1[0].a1 << ", " << a2.a1[0].a2 << ")], [" << a2.a2[0]
10887 << ", " << a2.a2[1] << "]), ((" << a3.a0.a0 << "), [("
10888 << a3.a1[0].a0 << ", " << a3.a1[0].a1 << ", " << a3.a1[0].a2
10889 << ")], [" << a3.a2[0] << ", " << a3.a2[1] << "]), ((" << a4.a0.a0
10890 << "), [(" << a4.a1[0].a0 << ", " << a4.a1[0].a1 << ", "
10891 << a4.a1[0].a2 << ")], [" << a4.a2[0] << ", " << a4.a2[1]
10892 << "]), ((" << a5.a0.a0 << "), [(" << a5.a1[0].a0 << ", "
10893 << a5.a1[0].a1 << ", " << a5.a1[0].a2 << ")], [" << a5.a2[0] << ", "
10894 << a5.a2[1] << "]), ((" << a6.a0.a0 << "), [(" << a6.a1[0].a0
10895 << ", " << a6.a1[0].a1 << ", " << a6.a1[0].a2 << ")], [" << a6.a2[0]
10896 << ", " << a6.a2[1] << "]), ((" << a7.a0.a0 << "), [("
10897 << a7.a1[0].a0 << ", " << a7.a1[0].a1 << ", " << a7.a1[0].a2
10898 << ")], [" << a7.a2[0] << ", " << a7.a2[1] << "]), ((" << a8.a0.a0
10899 << "), [(" << a8.a1[0].a0 << ", " << a8.a1[0].a1 << ", "
10900 << a8.a1[0].a2 << ")], [" << a8.a2[0] << ", " << a8.a2[1]
10901 << "]), ((" << a9.a0.a0 << "), [(" << a9.a1[0].a0 << ", "
10902 << a9.a1[0].a1 << ", " << a9.a1[0].a2 << ")], [" << a9.a2[0] << ", "
10903 << a9.a2[1] << "]))" << ")\n";
10904
10905 float result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
10906
10907 std::cout << "result = " << result << "\n";
10908
10909 CHECK_APPROX(30.0, result);
10910
10911 // Pass argument that will make the Dart callback throw.
10912 a0.a0.a0 = 42;
10913
10914 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
10915
10916 CHECK_APPROX(0.0, result);
10917
10918 // Pass argument that will make the Dart callback return null.
10919 a0.a0.a0 = 84;
10920
10921 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
10922
10923 CHECK_APPROX(0.0, result);
10924
10925 return 0;
10926}
10927
10928// Used for testing structs and unions by value.
10929// Test multi dimensional inline array struct as argument.
10931 // NOLINTNEXTLINE(whitespace/parens)
10932 uint32_t (*f)(uint8_t a0,
10934 uint8_t a2,
10936 uint8_t a4,
10938 uint8_t a6)) {
10939 uint8_t a0;
10941 uint8_t a2;
10943 uint8_t a4;
10945 uint8_t a6;
10946
10947 a0 = 1;
10948 a1.a0[0][0][0][0][0] = 2;
10949 a1.a0[0][0][0][0][1] = 3;
10950 a1.a0[0][0][0][1][0] = 4;
10951 a1.a0[0][0][0][1][1] = 5;
10952 a1.a0[0][0][1][0][0] = 6;
10953 a1.a0[0][0][1][0][1] = 7;
10954 a1.a0[0][0][1][1][0] = 8;
10955 a1.a0[0][0][1][1][1] = 9;
10956 a1.a0[0][1][0][0][0] = 10;
10957 a1.a0[0][1][0][0][1] = 11;
10958 a1.a0[0][1][0][1][0] = 12;
10959 a1.a0[0][1][0][1][1] = 13;
10960 a1.a0[0][1][1][0][0] = 14;
10961 a1.a0[0][1][1][0][1] = 15;
10962 a1.a0[0][1][1][1][0] = 16;
10963 a1.a0[0][1][1][1][1] = 17;
10964 a1.a0[1][0][0][0][0] = 18;
10965 a1.a0[1][0][0][0][1] = 19;
10966 a1.a0[1][0][0][1][0] = 20;
10967 a1.a0[1][0][0][1][1] = 21;
10968 a1.a0[1][0][1][0][0] = 22;
10969 a1.a0[1][0][1][0][1] = 23;
10970 a1.a0[1][0][1][1][0] = 24;
10971 a1.a0[1][0][1][1][1] = 25;
10972 a1.a0[1][1][0][0][0] = 26;
10973 a1.a0[1][1][0][0][1] = 27;
10974 a1.a0[1][1][0][1][0] = 28;
10975 a1.a0[1][1][0][1][1] = 29;
10976 a1.a0[1][1][1][0][0] = 30;
10977 a1.a0[1][1][1][0][1] = 31;
10978 a1.a0[1][1][1][1][0] = 32;
10979 a1.a0[1][1][1][1][1] = 33;
10980 a2 = 34;
10981 a3.a0[0][0][0] = 35;
10982 a3.a0[0][0][1] = 36;
10983 a3.a0[0][1][0] = 37;
10984 a3.a0[0][1][1] = 38;
10985 a3.a0[1][0][0] = 39;
10986 a3.a0[1][0][1] = 40;
10987 a3.a0[1][1][0] = 41;
10988 a3.a0[1][1][1] = 42;
10989 a4 = 43;
10990 a5.a0[0][0][0] = 44;
10991 a5.a0[0][0][1] = 45;
10992 a5.a0[0][1][0] = 46;
10993 a5.a0[0][1][1] = 47;
10994 a5.a0[1][0][0] = 48;
10995 a5.a0[1][0][1] = 49;
10996 a5.a0[1][1][0] = 50;
10997 a5.a0[1][1][1] = 51;
10998 a6 = 52;
10999
11000 std::cout << "Calling TestPassUint8Struct32BytesInlineArrayMultiDimensionalI("
11001 << "(" << static_cast<int>(a0) << ", ([[[[["
11002 << static_cast<int>(a1.a0[0][0][0][0][0]) << ", "
11003 << static_cast<int>(a1.a0[0][0][0][0][1]) << "], ["
11004 << static_cast<int>(a1.a0[0][0][0][1][0]) << ", "
11005 << static_cast<int>(a1.a0[0][0][0][1][1]) << "]], [["
11006 << static_cast<int>(a1.a0[0][0][1][0][0]) << ", "
11007 << static_cast<int>(a1.a0[0][0][1][0][1]) << "], ["
11008 << static_cast<int>(a1.a0[0][0][1][1][0]) << ", "
11009 << static_cast<int>(a1.a0[0][0][1][1][1]) << "]]], [[["
11010 << static_cast<int>(a1.a0[0][1][0][0][0]) << ", "
11011 << static_cast<int>(a1.a0[0][1][0][0][1]) << "], ["
11012 << static_cast<int>(a1.a0[0][1][0][1][0]) << ", "
11013 << static_cast<int>(a1.a0[0][1][0][1][1]) << "]], [["
11014 << static_cast<int>(a1.a0[0][1][1][0][0]) << ", "
11015 << static_cast<int>(a1.a0[0][1][1][0][1]) << "], ["
11016 << static_cast<int>(a1.a0[0][1][1][1][0]) << ", "
11017 << static_cast<int>(a1.a0[0][1][1][1][1]) << "]]]], [[[["
11018 << static_cast<int>(a1.a0[1][0][0][0][0]) << ", "
11019 << static_cast<int>(a1.a0[1][0][0][0][1]) << "], ["
11020 << static_cast<int>(a1.a0[1][0][0][1][0]) << ", "
11021 << static_cast<int>(a1.a0[1][0][0][1][1]) << "]], [["
11022 << static_cast<int>(a1.a0[1][0][1][0][0]) << ", "
11023 << static_cast<int>(a1.a0[1][0][1][0][1]) << "], ["
11024 << static_cast<int>(a1.a0[1][0][1][1][0]) << ", "
11025 << static_cast<int>(a1.a0[1][0][1][1][1]) << "]]], [[["
11026 << static_cast<int>(a1.a0[1][1][0][0][0]) << ", "
11027 << static_cast<int>(a1.a0[1][1][0][0][1]) << "], ["
11028 << static_cast<int>(a1.a0[1][1][0][1][0]) << ", "
11029 << static_cast<int>(a1.a0[1][1][0][1][1]) << "]], [["
11030 << static_cast<int>(a1.a0[1][1][1][0][0]) << ", "
11031 << static_cast<int>(a1.a0[1][1][1][0][1]) << "], ["
11032 << static_cast<int>(a1.a0[1][1][1][1][0]) << ", "
11033 << static_cast<int>(a1.a0[1][1][1][1][1]) << "]]]]]), "
11034 << static_cast<int>(a2) << ", ([[["
11035 << static_cast<int>(a3.a0[0][0][0]) << ", "
11036 << static_cast<int>(a3.a0[0][0][1]) << "], ["
11037 << static_cast<int>(a3.a0[0][1][0]) << ", "
11038 << static_cast<int>(a3.a0[0][1][1]) << "]], [["
11039 << static_cast<int>(a3.a0[1][0][0]) << ", "
11040 << static_cast<int>(a3.a0[1][0][1]) << "], ["
11041 << static_cast<int>(a3.a0[1][1][0]) << ", "
11042 << static_cast<int>(a3.a0[1][1][1]) << "]]]), "
11043 << static_cast<int>(a4) << ", ([[["
11044 << static_cast<int>(a5.a0[0][0][0]) << ", "
11045 << static_cast<int>(a5.a0[0][0][1]) << "], ["
11046 << static_cast<int>(a5.a0[0][1][0]) << ", "
11047 << static_cast<int>(a5.a0[0][1][1]) << "]], [["
11048 << static_cast<int>(a5.a0[1][0][0]) << ", "
11049 << static_cast<int>(a5.a0[1][0][1]) << "], ["
11050 << static_cast<int>(a5.a0[1][1][0]) << ", "
11051 << static_cast<int>(a5.a0[1][1][1]) << "]]]), "
11052 << static_cast<int>(a6) << ")" << ")\n";
11053
11054 uint32_t result = f(a0, a1, a2, a3, a4, a5, a6);
11055
11056 std::cout << "result = " << result << "\n";
11057
11058 CHECK_EQ(1378, result);
11059
11060 // Pass argument that will make the Dart callback throw.
11061 a0 = 42;
11062
11063 result = f(a0, a1, a2, a3, a4, a5, a6);
11064
11065 CHECK_EQ(0, result);
11066
11067 // Pass argument that will make the Dart callback return null.
11068 a0 = 84;
11069
11070 result = f(a0, a1, a2, a3, a4, a5, a6);
11071
11072 CHECK_EQ(0, result);
11073
11074 return 0;
11075}
11076
11077// Used for testing structs and unions by value.
11078// Test struct in multi dimensional inline array.
11080 // NOLINTNEXTLINE(whitespace/parens)
11081 uint32_t (*f)(uint8_t a0,
11083 uint8_t a2)) {
11084 uint8_t a0;
11086 uint8_t a2;
11087
11088 a0 = 1;
11089 a1.a0[0][0].a0 = 2;
11090 a1.a0[0][1].a0 = -3;
11091 a1.a0[1][0].a0 = 4;
11092 a1.a0[1][1].a0 = -5;
11093 a2 = 6;
11094
11095 std::cout << "Calling TestPassUint8Struct4BytesInlineArrayMultiDimensionalIn("
11096 << "(" << static_cast<int>(a0) << ", ([[("
11097 << static_cast<int>(a1.a0[0][0].a0) << "), ("
11098 << static_cast<int>(a1.a0[0][1].a0) << ")], [("
11099 << static_cast<int>(a1.a0[1][0].a0) << "), ("
11100 << static_cast<int>(a1.a0[1][1].a0) << ")]]), "
11101 << static_cast<int>(a2) << ")" << ")\n";
11102
11103 uint32_t result = f(a0, a1, a2);
11104
11105 std::cout << "result = " << result << "\n";
11106
11107 CHECK_EQ(5, result);
11108
11109 // Pass argument that will make the Dart callback throw.
11110 a0 = 42;
11111
11112 result = f(a0, a1, a2);
11113
11114 CHECK_EQ(0, result);
11115
11116 // Pass argument that will make the Dart callback return null.
11117 a0 = 84;
11118
11119 result = f(a0, a1, a2);
11120
11121 CHECK_EQ(0, result);
11122
11123 return 0;
11124}
11125
11126// Used for testing structs and unions by value.
11127// Small struct with mis-aligned member.
11129 // NOLINTNEXTLINE(whitespace/parens)
11130 int64_t (*f)(Struct3BytesPackedInt a0,
11140 Struct3BytesPackedInt a0 = {};
11141 Struct3BytesPackedInt a1 = {};
11142 Struct3BytesPackedInt a2 = {};
11143 Struct3BytesPackedInt a3 = {};
11144 Struct3BytesPackedInt a4 = {};
11145 Struct3BytesPackedInt a5 = {};
11146 Struct3BytesPackedInt a6 = {};
11147 Struct3BytesPackedInt a7 = {};
11148 Struct3BytesPackedInt a8 = {};
11149 Struct3BytesPackedInt a9 = {};
11150
11151 a0.a0 = -1;
11152 a0.a1 = 2;
11153 a1.a0 = -3;
11154 a1.a1 = 4;
11155 a2.a0 = -5;
11156 a2.a1 = 6;
11157 a3.a0 = -7;
11158 a3.a1 = 8;
11159 a4.a0 = -9;
11160 a4.a1 = 10;
11161 a5.a0 = -11;
11162 a5.a1 = 12;
11163 a6.a0 = -13;
11164 a6.a1 = 14;
11165 a7.a0 = -15;
11166 a7.a1 = 16;
11167 a8.a0 = -17;
11168 a8.a1 = 18;
11169 a9.a0 = -19;
11170 a9.a1 = 20;
11171
11172 std::cout << "Calling TestPassStruct3BytesPackedIntx10(" << "(("
11173 << static_cast<int>(a0.a0) << ", " << a0.a1 << "), ("
11174 << static_cast<int>(a1.a0) << ", " << a1.a1 << "), ("
11175 << static_cast<int>(a2.a0) << ", " << a2.a1 << "), ("
11176 << static_cast<int>(a3.a0) << ", " << a3.a1 << "), ("
11177 << static_cast<int>(a4.a0) << ", " << a4.a1 << "), ("
11178 << static_cast<int>(a5.a0) << ", " << a5.a1 << "), ("
11179 << static_cast<int>(a6.a0) << ", " << a6.a1 << "), ("
11180 << static_cast<int>(a7.a0) << ", " << a7.a1 << "), ("
11181 << static_cast<int>(a8.a0) << ", " << a8.a1 << "), ("
11182 << static_cast<int>(a9.a0) << ", " << a9.a1 << "))" << ")\n";
11183
11184 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11185
11186 std::cout << "result = " << result << "\n";
11187
11188 CHECK_EQ(10, result);
11189
11190 // Pass argument that will make the Dart callback throw.
11191 a0.a0 = 42;
11192
11193 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11194
11195 CHECK_EQ(0, result);
11196
11197 // Pass argument that will make the Dart callback return null.
11198 a0.a0 = 84;
11199
11200 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11201
11202 CHECK_EQ(0, result);
11203
11204 return 0;
11205}
11206
11207// Used for testing structs and unions by value.
11208// Struct with mis-aligned member.
11210 // NOLINTNEXTLINE(whitespace/parens)
11211 int64_t (*f)(Struct8BytesPackedInt a0,
11221 Struct8BytesPackedInt a0 = {};
11222 Struct8BytesPackedInt a1 = {};
11223 Struct8BytesPackedInt a2 = {};
11224 Struct8BytesPackedInt a3 = {};
11225 Struct8BytesPackedInt a4 = {};
11226 Struct8BytesPackedInt a5 = {};
11227 Struct8BytesPackedInt a6 = {};
11228 Struct8BytesPackedInt a7 = {};
11229 Struct8BytesPackedInt a8 = {};
11230 Struct8BytesPackedInt a9 = {};
11231
11232 a0.a0 = 1;
11233 a0.a1 = 2;
11234 a0.a2 = 3;
11235 a0.a3 = 4;
11236 a0.a4 = 5;
11237 a1.a0 = 6;
11238 a1.a1 = 7;
11239 a1.a2 = 8;
11240 a1.a3 = 9;
11241 a1.a4 = 10;
11242 a2.a0 = 11;
11243 a2.a1 = 12;
11244 a2.a2 = 13;
11245 a2.a3 = 14;
11246 a2.a4 = 15;
11247 a3.a0 = 16;
11248 a3.a1 = 17;
11249 a3.a2 = 18;
11250 a3.a3 = 19;
11251 a3.a4 = 20;
11252 a4.a0 = 21;
11253 a4.a1 = 22;
11254 a4.a2 = 23;
11255 a4.a3 = 24;
11256 a4.a4 = 25;
11257 a5.a0 = 26;
11258 a5.a1 = 27;
11259 a5.a2 = 28;
11260 a5.a3 = 29;
11261 a5.a4 = 30;
11262 a6.a0 = 31;
11263 a6.a1 = 32;
11264 a6.a2 = 33;
11265 a6.a3 = 34;
11266 a6.a4 = 35;
11267 a7.a0 = 36;
11268 a7.a1 = 37;
11269 a7.a2 = 38;
11270 a7.a3 = 39;
11271 a7.a4 = 40;
11272 a8.a0 = 41;
11273 a8.a1 = 42;
11274 a8.a2 = 43;
11275 a8.a3 = 44;
11276 a8.a4 = 45;
11277 a9.a0 = 46;
11278 a9.a1 = 47;
11279 a9.a2 = 48;
11280 a9.a3 = 49;
11281 a9.a4 = 50;
11282
11283 std::cout << "Calling TestPassStruct8BytesPackedIntx10(" << "(("
11284 << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
11285 << static_cast<int>(a0.a2) << ", " << static_cast<int>(a0.a3)
11286 << ", " << static_cast<int>(a0.a4) << "), ("
11287 << static_cast<int>(a1.a0) << ", " << a1.a1 << ", "
11288 << static_cast<int>(a1.a2) << ", " << static_cast<int>(a1.a3)
11289 << ", " << static_cast<int>(a1.a4) << "), ("
11290 << static_cast<int>(a2.a0) << ", " << a2.a1 << ", "
11291 << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3)
11292 << ", " << static_cast<int>(a2.a4) << "), ("
11293 << static_cast<int>(a3.a0) << ", " << a3.a1 << ", "
11294 << static_cast<int>(a3.a2) << ", " << static_cast<int>(a3.a3)
11295 << ", " << static_cast<int>(a3.a4) << "), ("
11296 << static_cast<int>(a4.a0) << ", " << a4.a1 << ", "
11297 << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3)
11298 << ", " << static_cast<int>(a4.a4) << "), ("
11299 << static_cast<int>(a5.a0) << ", " << a5.a1 << ", "
11300 << static_cast<int>(a5.a2) << ", " << static_cast<int>(a5.a3)
11301 << ", " << static_cast<int>(a5.a4) << "), ("
11302 << static_cast<int>(a6.a0) << ", " << a6.a1 << ", "
11303 << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3)
11304 << ", " << static_cast<int>(a6.a4) << "), ("
11305 << static_cast<int>(a7.a0) << ", " << a7.a1 << ", "
11306 << static_cast<int>(a7.a2) << ", " << static_cast<int>(a7.a3)
11307 << ", " << static_cast<int>(a7.a4) << "), ("
11308 << static_cast<int>(a8.a0) << ", " << a8.a1 << ", "
11309 << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3)
11310 << ", " << static_cast<int>(a8.a4) << "), ("
11311 << static_cast<int>(a9.a0) << ", " << a9.a1 << ", "
11312 << static_cast<int>(a9.a2) << ", " << static_cast<int>(a9.a3)
11313 << ", " << static_cast<int>(a9.a4) << "))" << ")\n";
11314
11315 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11316
11317 std::cout << "result = " << result << "\n";
11318
11319 CHECK_EQ(1275, result);
11320
11321 // Pass argument that will make the Dart callback throw.
11322 a0.a0 = 42;
11323
11324 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11325
11326 CHECK_EQ(0, result);
11327
11328 // Pass argument that will make the Dart callback return null.
11329 a0.a0 = 84;
11330
11331 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11332
11333 CHECK_EQ(0, result);
11334
11335 return 0;
11336}
11337
11338// Used for testing structs and unions by value.
11339// Struct with mis-aligned member.
11340// Tests backfilling of CPU and FPU registers.
11342 // NOLINTNEXTLINE(whitespace/parens)
11343 double (*f)(Struct9BytesPackedMixed a0,
11353 double a10,
11354 int32_t a11,
11355 int32_t a12)) {
11366 double a10;
11367 int32_t a11;
11368 int32_t a12;
11369
11370 a0.a0 = 1;
11371 a0.a1 = 2.0;
11372 a1.a0 = 3;
11373 a1.a1 = 4.0;
11374 a2.a0 = 5;
11375 a2.a1 = 6.0;
11376 a3.a0 = 7;
11377 a3.a1 = 8.0;
11378 a4.a0 = 9;
11379 a4.a1 = 10.0;
11380 a5.a0 = 11;
11381 a5.a1 = 12.0;
11382 a6.a0 = 13;
11383 a6.a1 = 14.0;
11384 a7.a0 = 15;
11385 a7.a1 = 16.0;
11386 a8.a0 = 17;
11387 a8.a1 = 18.0;
11388 a9.a0 = 19;
11389 a9.a1 = 20.0;
11390 a10 = -21.0;
11391 a11 = 22;
11392 a12 = -23;
11393
11394 std::cout << "Calling TestPassStruct9BytesPackedMixedx10DoubleInt32x2("
11395 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << "), ("
11396 << static_cast<int>(a1.a0) << ", " << a1.a1 << "), ("
11397 << static_cast<int>(a2.a0) << ", " << a2.a1 << "), ("
11398 << static_cast<int>(a3.a0) << ", " << a3.a1 << "), ("
11399 << static_cast<int>(a4.a0) << ", " << a4.a1 << "), ("
11400 << static_cast<int>(a5.a0) << ", " << a5.a1 << "), ("
11401 << static_cast<int>(a6.a0) << ", " << a6.a1 << "), ("
11402 << static_cast<int>(a7.a0) << ", " << a7.a1 << "), ("
11403 << static_cast<int>(a8.a0) << ", " << a8.a1 << "), ("
11404 << static_cast<int>(a9.a0) << ", " << a9.a1 << "), " << a10 << ", "
11405 << a11 << ", " << a12 << ")" << ")\n";
11406
11407 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
11408
11409 std::cout << "result = " << result << "\n";
11410
11411 CHECK_APPROX(188.0, result);
11412
11413 // Pass argument that will make the Dart callback throw.
11414 a0.a0 = 42;
11415
11416 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
11417
11418 CHECK_APPROX(0.0, result);
11419
11420 // Pass argument that will make the Dart callback return null.
11421 a0.a0 = 84;
11422
11423 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
11424
11425 CHECK_APPROX(0.0, result);
11426
11427 return 0;
11428}
11429
11430// Used for testing structs and unions by value.
11431// This packed struct happens to have only aligned members.
11433 // NOLINTNEXTLINE(whitespace/parens)
11434 double (*f)(Struct5BytesPackedMixed a0)) {
11436
11437 a0.a0 = -1.0;
11438 a0.a1 = 2;
11439
11440 std::cout << "Calling TestPassStruct5BytesPackedMixed(" << "((" << a0.a0
11441 << ", " << static_cast<int>(a0.a1) << "))" << ")\n";
11442
11443 double result = f(a0);
11444
11445 std::cout << "result = " << result << "\n";
11446
11447 CHECK_APPROX(1.0, result);
11448
11449 // Pass argument that will make the Dart callback throw.
11450 a0.a0 = 42;
11451
11452 result = f(a0);
11453
11454 CHECK_APPROX(0.0, result);
11455
11456 // Pass argument that will make the Dart callback return null.
11457 a0.a0 = 84;
11458
11459 result = f(a0);
11460
11461 CHECK_APPROX(0.0, result);
11462
11463 return 0;
11464}
11465
11466// Used for testing structs and unions by value.
11467// Check alignment of packed struct in non-packed struct.
11469 // NOLINTNEXTLINE(whitespace/parens)
11472
11473 a0.a0 = 1;
11474 a0.a1.a0 = 2.0;
11475 a0.a1.a1 = 3;
11476
11477 std::cout << "Calling TestPassStructNestedAlignmentStruct5BytesPackedMixed("
11478 << "((" << static_cast<int>(a0.a0) << ", (" << a0.a1.a0 << ", "
11479 << static_cast<int>(a0.a1.a1) << ")))" << ")\n";
11480
11481 double result = f(a0);
11482
11483 std::cout << "result = " << result << "\n";
11484
11485 CHECK_APPROX(6.0, result);
11486
11487 // Pass argument that will make the Dart callback throw.
11488 a0.a0 = 42;
11489
11490 result = f(a0);
11491
11492 CHECK_APPROX(0.0, result);
11493
11494 // Pass argument that will make the Dart callback return null.
11495 a0.a0 = 84;
11496
11497 result = f(a0);
11498
11499 CHECK_APPROX(0.0, result);
11500
11501 return 0;
11502}
11503
11504// Used for testing structs and unions by value.
11505// Check alignment of packed struct array in non-packed struct.
11507 // NOLINTNEXTLINE(whitespace/parens)
11508 double (*f)(Struct6BytesInlineArrayInt a0)) {
11510
11511 a0.a0[0].a0 = -1;
11512 a0.a0[0].a1 = 2;
11513 a0.a0[1].a0 = -3;
11514 a0.a0[1].a1 = 4;
11515
11516 std::cout << "Calling TestPassStruct6BytesInlineArrayInt(" << "(([("
11517 << static_cast<int>(a0.a0[0].a0) << ", " << a0.a0[0].a1 << "), ("
11518 << static_cast<int>(a0.a0[1].a0) << ", " << a0.a0[1].a1 << ")]))"
11519 << ")\n";
11520
11521 double result = f(a0);
11522
11523 std::cout << "result = " << result << "\n";
11524
11525 CHECK_APPROX(2.0, result);
11526
11527 // Pass argument that will make the Dart callback throw.
11528 a0.a0[0].a0 = 42;
11529
11530 result = f(a0);
11531
11532 CHECK_APPROX(0.0, result);
11533
11534 // Pass argument that will make the Dart callback return null.
11535 a0.a0[0].a0 = 84;
11536
11537 result = f(a0);
11538
11539 CHECK_APPROX(0.0, result);
11540
11541 return 0;
11542}
11543
11544// Used for testing structs and unions by value.
11545// Check alignment of packed struct array in non-packed struct.
11547 // NOLINTNEXTLINE(whitespace/parens)
11548 double (*f)(Struct15BytesInlineArrayMixed a0)) {
11550
11551 a0.a0[0].a0 = -1.0;
11552 a0.a0[0].a1 = 2;
11553 a0.a0[1].a0 = -3.0;
11554 a0.a0[1].a1 = 4;
11555 a0.a0[2].a0 = -5.0;
11556 a0.a0[2].a1 = 6;
11557
11558 std::cout << "Calling TestPassStruct15BytesInlineArrayMixed(" << "(([("
11559 << a0.a0[0].a0 << ", " << static_cast<int>(a0.a0[0].a1) << "), ("
11560 << a0.a0[1].a0 << ", " << static_cast<int>(a0.a0[1].a1) << "), ("
11561 << a0.a0[2].a0 << ", " << static_cast<int>(a0.a0[2].a1) << ")]))"
11562 << ")\n";
11563
11564 double result = f(a0);
11565
11566 std::cout << "result = " << result << "\n";
11567
11568 CHECK_APPROX(3.0, result);
11569
11570 // Pass argument that will make the Dart callback throw.
11571 a0.a0[0].a0 = 42;
11572
11573 result = f(a0);
11574
11575 CHECK_APPROX(0.0, result);
11576
11577 // Pass argument that will make the Dart callback return null.
11578 a0.a0[0].a0 = 84;
11579
11580 result = f(a0);
11581
11582 CHECK_APPROX(0.0, result);
11583
11584 return 0;
11585}
11586
11587// Used for testing structs and unions by value.
11588// Check placement of mixed integer/float union.
11590 // NOLINTNEXTLINE(whitespace/parens)
11591 double (*f)(Union4BytesMixed a0,
11600 Union4BytesMixed a9)) {
11601 Union4BytesMixed a0 = {};
11602 Union4BytesMixed a1 = {};
11603 Union4BytesMixed a2 = {};
11604 Union4BytesMixed a3 = {};
11605 Union4BytesMixed a4 = {};
11606 Union4BytesMixed a5 = {};
11607 Union4BytesMixed a6 = {};
11608 Union4BytesMixed a7 = {};
11609 Union4BytesMixed a8 = {};
11610 Union4BytesMixed a9 = {};
11611
11612 a0.a0 = 1;
11613 a1.a0 = 2;
11614 a2.a0 = 3;
11615 a3.a0 = 4;
11616 a4.a0 = 5;
11617 a5.a0 = 6;
11618 a6.a0 = 7;
11619 a7.a0 = 8;
11620 a8.a0 = 9;
11621 a9.a0 = 10;
11622
11623 std::cout << "Calling TestPassUnion4BytesMixedx10(" << "((" << a0.a0 << "), ("
11624 << a1.a0 << "), (" << a2.a0 << "), (" << a3.a0 << "), (" << a4.a0
11625 << "), (" << a5.a0 << "), (" << a6.a0 << "), (" << a7.a0 << "), ("
11626 << a8.a0 << "), (" << a9.a0 << "))" << ")\n";
11627
11628 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11629
11630 std::cout << "result = " << result << "\n";
11631
11632 CHECK_APPROX(55.0, result);
11633
11634 // Pass argument that will make the Dart callback throw.
11635 a0.a0 = 42;
11636
11637 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11638
11639 CHECK_APPROX(0.0, result);
11640
11641 // Pass argument that will make the Dart callback return null.
11642 a0.a0 = 84;
11643
11644 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11645
11646 CHECK_APPROX(0.0, result);
11647
11648 return 0;
11649}
11650
11651// Used for testing structs and unions by value.
11652// Check placement of mixed floats union.
11654 // NOLINTNEXTLINE(whitespace/parens)
11655 double (*f)(Union8BytesNestedFloat a0,
11665 Union8BytesNestedFloat a0 = {};
11666 Union8BytesNestedFloat a1 = {};
11667 Union8BytesNestedFloat a2 = {};
11668 Union8BytesNestedFloat a3 = {};
11669 Union8BytesNestedFloat a4 = {};
11670 Union8BytesNestedFloat a5 = {};
11671 Union8BytesNestedFloat a6 = {};
11672 Union8BytesNestedFloat a7 = {};
11673 Union8BytesNestedFloat a8 = {};
11674 Union8BytesNestedFloat a9 = {};
11675
11676 a0.a0 = -1.0;
11677 a1.a0 = 2.0;
11678 a2.a0 = -3.0;
11679 a3.a0 = 4.0;
11680 a4.a0 = -5.0;
11681 a5.a0 = 6.0;
11682 a6.a0 = -7.0;
11683 a7.a0 = 8.0;
11684 a8.a0 = -9.0;
11685 a9.a0 = 10.0;
11686
11687 std::cout << "Calling TestPassUnion8BytesNestedFloatx10(" << "((" << a0.a0
11688 << "), (" << a1.a0 << "), (" << a2.a0 << "), (" << a3.a0 << "), ("
11689 << a4.a0 << "), (" << a5.a0 << "), (" << a6.a0 << "), (" << a7.a0
11690 << "), (" << a8.a0 << "), (" << a9.a0 << "))" << ")\n";
11691
11692 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11693
11694 std::cout << "result = " << result << "\n";
11695
11696 CHECK_APPROX(5.0, result);
11697
11698 // Pass argument that will make the Dart callback throw.
11699 a0.a0 = 42;
11700
11701 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11702
11703 CHECK_APPROX(0.0, result);
11704
11705 // Pass argument that will make the Dart callback return null.
11706 a0.a0 = 84;
11707
11708 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11709
11710 CHECK_APPROX(0.0, result);
11711
11712 return 0;
11713}
11714
11715// Used for testing structs and unions by value.
11716// Mixed-size union argument.
11718 // NOLINTNEXTLINE(whitespace/parens)
11719 double (*f)(Union9BytesNestedInt a0,
11729 Union9BytesNestedInt a0 = {};
11730 Union9BytesNestedInt a1 = {};
11731 Union9BytesNestedInt a2 = {};
11732 Union9BytesNestedInt a3 = {};
11733 Union9BytesNestedInt a4 = {};
11734 Union9BytesNestedInt a5 = {};
11735 Union9BytesNestedInt a6 = {};
11736 Union9BytesNestedInt a7 = {};
11737 Union9BytesNestedInt a8 = {};
11738 Union9BytesNestedInt a9 = {};
11739
11740 a0.a0.a0 = -1;
11741 a0.a0.a1 = 2;
11742 a0.a0.a2 = -3;
11743 a1.a0.a0 = 4;
11744 a1.a0.a1 = -5;
11745 a1.a0.a2 = 6;
11746 a2.a0.a0 = -7;
11747 a2.a0.a1 = 8;
11748 a2.a0.a2 = -9;
11749 a3.a0.a0 = 10;
11750 a3.a0.a1 = -11;
11751 a3.a0.a2 = 12;
11752 a4.a0.a0 = -13;
11753 a4.a0.a1 = 14;
11754 a4.a0.a2 = -15;
11755 a5.a0.a0 = 16;
11756 a5.a0.a1 = -17;
11757 a5.a0.a2 = 18;
11758 a6.a0.a0 = -19;
11759 a6.a0.a1 = 20;
11760 a6.a0.a2 = -21;
11761 a7.a0.a0 = 22;
11762 a7.a0.a1 = -23;
11763 a7.a0.a2 = 24;
11764 a8.a0.a0 = -25;
11765 a8.a0.a1 = 26;
11766 a8.a0.a2 = -27;
11767 a9.a0.a0 = 28;
11768 a9.a0.a1 = -29;
11769 a9.a0.a2 = 30;
11770
11771 std::cout << "Calling TestPassUnion9BytesNestedIntx10(" << "(((" << a0.a0.a0
11772 << ", " << a0.a0.a1 << ", " << a0.a0.a2 << ")), ((" << a1.a0.a0
11773 << ", " << a1.a0.a1 << ", " << a1.a0.a2 << ")), ((" << a2.a0.a0
11774 << ", " << a2.a0.a1 << ", " << a2.a0.a2 << ")), ((" << a3.a0.a0
11775 << ", " << a3.a0.a1 << ", " << a3.a0.a2 << ")), ((" << a4.a0.a0
11776 << ", " << a4.a0.a1 << ", " << a4.a0.a2 << ")), ((" << a5.a0.a0
11777 << ", " << a5.a0.a1 << ", " << a5.a0.a2 << ")), ((" << a6.a0.a0
11778 << ", " << a6.a0.a1 << ", " << a6.a0.a2 << ")), ((" << a7.a0.a0
11779 << ", " << a7.a0.a1 << ", " << a7.a0.a2 << ")), ((" << a8.a0.a0
11780 << ", " << a8.a0.a1 << ", " << a8.a0.a2 << ")), ((" << a9.a0.a0
11781 << ", " << a9.a0.a1 << ", " << a9.a0.a2 << ")))" << ")\n";
11782
11783 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11784
11785 std::cout << "result = " << result << "\n";
11786
11787 CHECK_APPROX(15.0, result);
11788
11789 // Pass argument that will make the Dart callback throw.
11790 a0.a0.a0 = 42;
11791
11792 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11793
11794 CHECK_APPROX(0.0, result);
11795
11796 // Pass argument that will make the Dart callback return null.
11797 a0.a0.a0 = 84;
11798
11799 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11800
11801 CHECK_APPROX(0.0, result);
11802
11803 return 0;
11804}
11805
11806// Used for testing structs and unions by value.
11807// Union with homogenous floats.
11809 // NOLINTNEXTLINE(whitespace/parens)
11830
11831 a0.a0[0] = -1.0;
11832 a0.a0[1] = 2.0;
11833 a0.a0[2] = -3.0;
11834 a0.a0[3] = 4.0;
11835 a1.a0[0] = -5.0;
11836 a1.a0[1] = 6.0;
11837 a1.a0[2] = -7.0;
11838 a1.a0[3] = 8.0;
11839 a2.a0[0] = -9.0;
11840 a2.a0[1] = 10.0;
11841 a2.a0[2] = -11.0;
11842 a2.a0[3] = 12.0;
11843 a3.a0[0] = -13.0;
11844 a3.a0[1] = 14.0;
11845 a3.a0[2] = -15.0;
11846 a3.a0[3] = 16.0;
11847 a4.a0[0] = -17.0;
11848 a4.a0[1] = 18.0;
11849 a4.a0[2] = -19.0;
11850 a4.a0[3] = 20.0;
11851 a5.a0[0] = -21.0;
11852 a5.a0[1] = 22.0;
11853 a5.a0[2] = -23.0;
11854 a5.a0[3] = 24.0;
11855 a6.a0[0] = -25.0;
11856 a6.a0[1] = 26.0;
11857 a6.a0[2] = -27.0;
11858 a6.a0[3] = 28.0;
11859 a7.a0[0] = -29.0;
11860 a7.a0[1] = 30.0;
11861 a7.a0[2] = -31.0;
11862 a7.a0[3] = 32.0;
11863 a8.a0[0] = -33.0;
11864 a8.a0[1] = 34.0;
11865 a8.a0[2] = -35.0;
11866 a8.a0[3] = 36.0;
11867 a9.a0[0] = -37.0;
11868 a9.a0[1] = 38.0;
11869 a9.a0[2] = -39.0;
11870 a9.a0[3] = 40.0;
11871
11872 std::cout << "Calling TestPassUnion16BytesNestedInlineArrayFloatx10(" << "((["
11873 << a0.a0[0] << ", " << a0.a0[1] << ", " << a0.a0[2] << ", "
11874 << a0.a0[3] << "]), ([" << a1.a0[0] << ", " << a1.a0[1] << ", "
11875 << a1.a0[2] << ", " << a1.a0[3] << "]), ([" << a2.a0[0] << ", "
11876 << a2.a0[1] << ", " << a2.a0[2] << ", " << a2.a0[3] << "]), (["
11877 << a3.a0[0] << ", " << a3.a0[1] << ", " << a3.a0[2] << ", "
11878 << a3.a0[3] << "]), ([" << a4.a0[0] << ", " << a4.a0[1] << ", "
11879 << a4.a0[2] << ", " << a4.a0[3] << "]), ([" << a5.a0[0] << ", "
11880 << a5.a0[1] << ", " << a5.a0[2] << ", " << a5.a0[3] << "]), (["
11881 << a6.a0[0] << ", " << a6.a0[1] << ", " << a6.a0[2] << ", "
11882 << a6.a0[3] << "]), ([" << a7.a0[0] << ", " << a7.a0[1] << ", "
11883 << a7.a0[2] << ", " << a7.a0[3] << "]), ([" << a8.a0[0] << ", "
11884 << a8.a0[1] << ", " << a8.a0[2] << ", " << a8.a0[3] << "]), (["
11885 << a9.a0[0] << ", " << a9.a0[1] << ", " << a9.a0[2] << ", "
11886 << a9.a0[3] << "]))" << ")\n";
11887
11888 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11889
11890 std::cout << "result = " << result << "\n";
11891
11892 CHECK_APPROX(20.0, result);
11893
11894 // Pass argument that will make the Dart callback throw.
11895 a0.a0[0] = 42;
11896
11897 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11898
11899 CHECK_APPROX(0.0, result);
11900
11901 // Pass argument that will make the Dart callback return null.
11902 a0.a0[0] = 84;
11903
11904 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11905
11906 CHECK_APPROX(0.0, result);
11907
11908 return 0;
11909}
11910
11911// Used for testing structs and unions by value.
11912// Union with homogenous floats.
11914 // NOLINTNEXTLINE(whitespace/parens)
11915 double (*f)(Union16BytesNestedFloat a0,
11935
11936 a0.a0.a0 = -1.0;
11937 a0.a0.a1 = 2.0;
11938 a1.a0.a0 = -3.0;
11939 a1.a0.a1 = 4.0;
11940 a2.a0.a0 = -5.0;
11941 a2.a0.a1 = 6.0;
11942 a3.a0.a0 = -7.0;
11943 a3.a0.a1 = 8.0;
11944 a4.a0.a0 = -9.0;
11945 a4.a0.a1 = 10.0;
11946 a5.a0.a0 = -11.0;
11947 a5.a0.a1 = 12.0;
11948 a6.a0.a0 = -13.0;
11949 a6.a0.a1 = 14.0;
11950 a7.a0.a0 = -15.0;
11951 a7.a0.a1 = 16.0;
11952 a8.a0.a0 = -17.0;
11953 a8.a0.a1 = 18.0;
11954 a9.a0.a0 = -19.0;
11955 a9.a0.a1 = 20.0;
11956
11957 std::cout << "Calling TestPassUnion16BytesNestedFloatx10(" << "((("
11958 << a0.a0.a0 << ", " << a0.a0.a1 << ")), ((" << a1.a0.a0 << ", "
11959 << a1.a0.a1 << ")), ((" << a2.a0.a0 << ", " << a2.a0.a1 << ")), (("
11960 << a3.a0.a0 << ", " << a3.a0.a1 << ")), ((" << a4.a0.a0 << ", "
11961 << a4.a0.a1 << ")), ((" << a5.a0.a0 << ", " << a5.a0.a1 << ")), (("
11962 << a6.a0.a0 << ", " << a6.a0.a1 << ")), ((" << a7.a0.a0 << ", "
11963 << a7.a0.a1 << ")), ((" << a8.a0.a0 << ", " << a8.a0.a1 << ")), (("
11964 << a9.a0.a0 << ", " << a9.a0.a1 << ")))" << ")\n";
11965
11966 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11967
11968 std::cout << "result = " << result << "\n";
11969
11970 CHECK_APPROX(10.0, result);
11971
11972 // Pass argument that will make the Dart callback throw.
11973 a0.a0.a0 = 42;
11974
11975 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11976
11977 CHECK_APPROX(0.0, result);
11978
11979 // Pass argument that will make the Dart callback return null.
11980 a0.a0.a0 = 84;
11981
11982 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
11983
11984 CHECK_APPROX(0.0, result);
11985
11986 return 0;
11987}
11988
11989// Used for testing structs and unions by value.
11990// Passing bools and a struct with bools.
11991// Exhausts the registers to test bools and the bool struct alignment on the
11992// stack.
11994 // NOLINTNEXTLINE(whitespace/parens)
11995 int32_t (*f)(uint8_t a0,
11996 bool a1,
11997 bool a2,
11998 bool a3,
11999 bool a4,
12000 bool a5,
12001 bool a6,
12002 bool a7,
12003 bool a8,
12004 bool a9,
12006 bool a11)) {
12007 uint8_t a0;
12008 bool a1;
12009 bool a2;
12010 bool a3;
12011 bool a4;
12012 bool a5;
12013 bool a6;
12014 bool a7;
12015 bool a8;
12016 bool a9;
12018 bool a11;
12019
12020 a0 = 1;
12021 a1 = false;
12022 a2 = true;
12023 a3 = false;
12024 a4 = true;
12025 a5 = false;
12026 a6 = true;
12027 a7 = false;
12028 a8 = true;
12029 a9 = false;
12030 a10.a0 = true;
12031 a10.a1 = false;
12032 a10.a2 = true;
12033 a10.a3 = false;
12034 a10.a4 = true;
12035 a10.a5 = false;
12036 a10.a6 = true;
12037 a10.a7 = false;
12038 a10.a8 = true;
12039 a10.a9 = false;
12040 a11 = true;
12041
12042 std::cout << "Calling TestPassUint8Boolx9Struct10BytesHomogeneousBoolBool("
12043 << "(" << static_cast<int>(a0) << ", " << a1 << ", " << a2 << ", "
12044 << a3 << ", " << a4 << ", " << a5 << ", " << a6 << ", " << a7
12045 << ", " << a8 << ", " << a9 << ", (" << a10.a0 << ", " << a10.a1
12046 << ", " << a10.a2 << ", " << a10.a3 << ", " << a10.a4 << ", "
12047 << a10.a5 << ", " << a10.a6 << ", " << a10.a7 << ", " << a10.a8
12048 << ", " << a10.a9 << "), " << a11 << ")" << ")\n";
12049
12050 int32_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
12051
12052 std::cout << "result = " << result << "\n";
12053
12054 CHECK_EQ(11, result);
12055
12056 // Pass argument that will make the Dart callback throw.
12057 a0 = 42;
12058
12059 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
12060
12061 CHECK_EQ(0, result);
12062
12063 // Pass argument that will make the Dart callback return null.
12064 a0 = 84;
12065
12066 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
12067
12068 CHECK_EQ(0, result);
12069
12070 return 0;
12071}
12072
12073// Used for testing structs and unions by value.
12074// Passing bools and a struct with bools.
12075// Exhausts the registers to test bools and the bool struct alignment on the
12076// stack.
12078 // NOLINTNEXTLINE(whitespace/parens)
12079 int32_t (*f)(uint8_t a0,
12080 bool a1,
12081 bool a2,
12082 bool a3,
12083 bool a4,
12084 bool a5,
12085 bool a6,
12086 bool a7,
12087 bool a8,
12088 bool a9,
12090 bool a11)) {
12091 uint8_t a0;
12092 bool a1;
12093 bool a2;
12094 bool a3;
12095 bool a4;
12096 bool a5;
12097 bool a6;
12098 bool a7;
12099 bool a8;
12100 bool a9;
12102 bool a11;
12103
12104 a0 = 1;
12105 a1 = false;
12106 a2 = true;
12107 a3 = false;
12108 a4 = true;
12109 a5 = false;
12110 a6 = true;
12111 a7 = false;
12112 a8 = true;
12113 a9 = false;
12114 a10.a0[0] = true;
12115 a10.a0[1] = false;
12116 a10.a0[2] = true;
12117 a10.a0[3] = false;
12118 a10.a0[4] = true;
12119 a10.a0[5] = false;
12120 a10.a0[6] = true;
12121 a10.a0[7] = false;
12122 a10.a0[8] = true;
12123 a10.a0[9] = false;
12124 a11 = true;
12125
12126 std::cout << "Calling TestPassUint8Boolx9Struct10BytesInlineArrayBoolBool("
12127 << "(" << static_cast<int>(a0) << ", " << a1 << ", " << a2 << ", "
12128 << a3 << ", " << a4 << ", " << a5 << ", " << a6 << ", " << a7
12129 << ", " << a8 << ", " << a9 << ", ([" << a10.a0[0] << ", "
12130 << a10.a0[1] << ", " << a10.a0[2] << ", " << a10.a0[3] << ", "
12131 << a10.a0[4] << ", " << a10.a0[5] << ", " << a10.a0[6] << ", "
12132 << a10.a0[7] << ", " << a10.a0[8] << ", " << a10.a0[9] << "]), "
12133 << a11 << ")" << ")\n";
12134
12135 int32_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
12136
12137 std::cout << "result = " << result << "\n";
12138
12139 CHECK_EQ(11, result);
12140
12141 // Pass argument that will make the Dart callback throw.
12142 a0 = 42;
12143
12144 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
12145
12146 CHECK_EQ(0, result);
12147
12148 // Pass argument that will make the Dart callback return null.
12149 a0 = 84;
12150
12151 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
12152
12153 CHECK_EQ(0, result);
12154
12155 return 0;
12156}
12157
12158// Used for testing structs and unions by value.
12159// Returning a bool.
12161 // NOLINTNEXTLINE(whitespace/parens)
12162 bool (*f)(uint8_t a0, Struct1ByteBool a1)) {
12163 uint8_t a0;
12164 Struct1ByteBool a1 = {};
12165
12166 a0 = 1;
12167 a1.a0 = false;
12168
12169 std::cout << "Calling TestPassUint8Struct1ByteBool(" << "("
12170 << static_cast<int>(a0) << ", (" << a1.a0 << "))" << ")\n";
12171
12172 bool result = f(a0, a1);
12173
12174 std::cout << "result = " << result << "\n";
12175
12176 CHECK_EQ(1, result);
12177
12178 // Pass argument that will make the Dart callback throw.
12179 a0 = 42;
12180
12181 result = f(a0, a1);
12182
12183 CHECK_EQ(0, result);
12184
12185 // Pass argument that will make the Dart callback return null.
12186 a0 = 84;
12187
12188 result = f(a0, a1);
12189
12190 CHECK_EQ(0, result);
12191
12192 return 0;
12193}
12194
12195// Used for testing structs and unions by value.
12196// Returning a wchar.
12198 // NOLINTNEXTLINE(whitespace/parens)
12199 wchar_t (*f)(wchar_t a0,
12201 uintptr_t a2,
12202 uintptr_t a3,
12203 /* NOLINT(runtime/int) */ long a4,
12204 /* NOLINT(runtime/int) */ unsigned long a5)) {
12205 wchar_t a0;
12206 StructInlineArrayInt a1 = {};
12207 uintptr_t a2;
12208 uintptr_t a3;
12209 /* NOLINT(runtime/int) */ long a4;
12210 /* NOLINT(runtime/int) */ unsigned long a5;
12211
12212 a0 = 1;
12213 a1.a0[0] = 2;
12214 a1.a0[1] = 3;
12215 a1.a0[2] = 4;
12216 a1.a0[3] = 5;
12217 a1.a0[4] = 6;
12218 a1.a0[5] = 7;
12219 a1.a0[6] = 8;
12220 a1.a0[7] = 9;
12221 a1.a0[8] = 10;
12222 a1.a0[9] = 11;
12223 a2 = 12;
12224 a3 = 13;
12225 a4 = 14;
12226 a5 = 15;
12227
12228 std::cout << "Calling TestPassWCharStructInlineArrayIntUintPtrx2LongUnsigned("
12229 << "(" << a0 << ", ([" << a1.a0[0] << ", " << a1.a0[1] << ", "
12230 << a1.a0[2] << ", " << a1.a0[3] << ", " << a1.a0[4] << ", "
12231 << a1.a0[5] << ", " << a1.a0[6] << ", " << a1.a0[7] << ", "
12232 << a1.a0[8] << ", " << a1.a0[9] << "]), " << a2 << ", " << a3
12233 << ", " << a4 << ", " << a5 << ")" << ")\n";
12234
12235 wchar_t result = f(a0, a1, a2, a3, a4, a5);
12236
12237 std::cout << "result = " << result << "\n";
12238
12239 CHECK_EQ(120, result);
12240
12241 // Pass argument that will make the Dart callback throw.
12242 a0 = 42;
12243
12244 result = f(a0, a1, a2, a3, a4, a5);
12245
12246 CHECK_EQ(0, result);
12247
12248 // Pass argument that will make the Dart callback return null.
12249 a0 = 84;
12250
12251 result = f(a0, a1, a2, a3, a4, a5);
12252
12253 CHECK_EQ(0, result);
12254
12255 return 0;
12256}
12257
12258// Used for testing structs and unions by value.
12259// Struct stradles last argument register
12261 // NOLINTNEXTLINE(whitespace/parens)
12262 int64_t (*f)(int64_t a0,
12263 int64_t a1,
12264 int64_t a2,
12265 int64_t a3,
12266 int64_t a4,
12267 int64_t a5,
12268 int64_t a6,
12270 int64_t a0;
12271 int64_t a1;
12272 int64_t a2;
12273 int64_t a3;
12274 int64_t a4;
12275 int64_t a5;
12276 int64_t a6;
12278
12279 a0 = -1;
12280 a1 = 2;
12281 a2 = -3;
12282 a3 = 4;
12283 a4 = -5;
12284 a5 = 6;
12285 a6 = -7;
12286 a7.a0 = 8;
12287 a7.a1 = -9;
12288 a7.a2 = 10;
12289
12290 std::cout << "Calling TestPassInt64x7Struct12BytesHomogeneousInt32(" << "("
12291 << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
12292 << ", " << a5 << ", " << a6 << ", (" << a7.a0 << ", " << a7.a1
12293 << ", " << a7.a2 << "))" << ")\n";
12294
12295 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7);
12296
12297 std::cout << "result = " << result << "\n";
12298
12299 CHECK_EQ(5, result);
12300
12301 // Pass argument that will make the Dart callback throw.
12302 a0 = 42;
12303
12304 result = f(a0, a1, a2, a3, a4, a5, a6, a7);
12305
12306 CHECK_EQ(0, result);
12307
12308 // Pass argument that will make the Dart callback return null.
12309 a0 = 84;
12310
12311 result = f(a0, a1, a2, a3, a4, a5, a6, a7);
12312
12313 CHECK_EQ(0, result);
12314
12315 return 0;
12316}
12317
12318// Used for testing structs and unions by value.
12319// Smallest struct with data.
12321 // NOLINTNEXTLINE(whitespace/parens)
12322 Struct1ByteInt (*f)(int8_t a0)) {
12323 int8_t a0;
12324
12325 a0 = -1;
12326
12327 std::cout << "Calling TestReturnStruct1ByteInt(" << "("
12328 << static_cast<int>(a0) << ")" << ")\n";
12329
12330 Struct1ByteInt result = f(a0);
12331
12332 std::cout << "result = " << "(" << static_cast<int>(result.a0) << ")" << "\n";
12333
12334 CHECK_EQ(a0, result.a0);
12335
12336 // Pass argument that will make the Dart callback throw.
12337 a0 = 42;
12338
12339 result = f(a0);
12340
12341 CHECK_EQ(0, result.a0);
12342
12343 // Pass argument that will make the Dart callback return null.
12344 a0 = 84;
12345
12346 result = f(a0);
12347
12348 CHECK_EQ(0, result.a0);
12349
12350 return 0;
12351}
12352
12353// Used for testing structs and unions by value.
12354// Smaller than word size return value on all architectures.
12356 // NOLINTNEXTLINE(whitespace/parens)
12357 Struct3BytesHomogeneousUint8 (*f)(uint8_t a0, uint8_t a1, uint8_t a2)) {
12358 uint8_t a0;
12359 uint8_t a1;
12360 uint8_t a2;
12361
12362 a0 = 1;
12363 a1 = 2;
12364 a2 = 3;
12365
12366 std::cout << "Calling TestReturnStruct3BytesHomogeneousUint8(" << "("
12367 << static_cast<int>(a0) << ", " << static_cast<int>(a1) << ", "
12368 << static_cast<int>(a2) << ")" << ")\n";
12369
12370 Struct3BytesHomogeneousUint8 result = f(a0, a1, a2);
12371
12372 std::cout << "result = " << "(" << static_cast<int>(result.a0) << ", "
12373 << static_cast<int>(result.a1) << ", "
12374 << static_cast<int>(result.a2) << ")" << "\n";
12375
12376 CHECK_EQ(a0, result.a0);
12377 CHECK_EQ(a1, result.a1);
12378 CHECK_EQ(a2, result.a2);
12379
12380 // Pass argument that will make the Dart callback throw.
12381 a0 = 42;
12382
12383 result = f(a0, a1, a2);
12384
12385 CHECK_EQ(0, result.a0);
12386 CHECK_EQ(0, result.a1);
12387 CHECK_EQ(0, result.a2);
12388
12389 // Pass argument that will make the Dart callback return null.
12390 a0 = 84;
12391
12392 result = f(a0, a1, a2);
12393
12394 CHECK_EQ(0, result.a0);
12395 CHECK_EQ(0, result.a1);
12396 CHECK_EQ(0, result.a2);
12397
12398 return 0;
12399}
12400
12401// Used for testing structs and unions by value.
12402// Smaller than word size return value on all architectures.
12403// With alignment rules taken into account size is 4 bytes.
12405 // NOLINTNEXTLINE(whitespace/parens)
12406 Struct3BytesInt2ByteAligned (*f)(int16_t a0, int8_t a1)) {
12407 int16_t a0;
12408 int8_t a1;
12409
12410 a0 = -1;
12411 a1 = 2;
12412
12413 std::cout << "Calling TestReturnStruct3BytesInt2ByteAligned(" << "(" << a0
12414 << ", " << static_cast<int>(a1) << ")" << ")\n";
12415
12417
12418 std::cout << "result = " << "(" << result.a0 << ", "
12419 << static_cast<int>(result.a1) << ")" << "\n";
12420
12421 CHECK_EQ(a0, result.a0);
12422 CHECK_EQ(a1, result.a1);
12423
12424 // Pass argument that will make the Dart callback throw.
12425 a0 = 42;
12426
12427 result = f(a0, a1);
12428
12429 CHECK_EQ(0, result.a0);
12430 CHECK_EQ(0, result.a1);
12431
12432 // Pass argument that will make the Dart callback return null.
12433 a0 = 84;
12434
12435 result = f(a0, a1);
12436
12437 CHECK_EQ(0, result.a0);
12438 CHECK_EQ(0, result.a1);
12439
12440 return 0;
12441}
12442
12443// Used for testing structs and unions by value.
12444// Word size return value on 32 bit architectures..
12446 // NOLINTNEXTLINE(whitespace/parens)
12447 Struct4BytesHomogeneousInt16 (*f)(int16_t a0, int16_t a1)) {
12448 int16_t a0;
12449 int16_t a1;
12450
12451 a0 = -1;
12452 a1 = 2;
12453
12454 std::cout << "Calling TestReturnStruct4BytesHomogeneousInt16(" << "(" << a0
12455 << ", " << a1 << ")" << ")\n";
12456
12458
12459 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ")"
12460 << "\n";
12461
12462 CHECK_EQ(a0, result.a0);
12463 CHECK_EQ(a1, result.a1);
12464
12465 // Pass argument that will make the Dart callback throw.
12466 a0 = 42;
12467
12468 result = f(a0, a1);
12469
12470 CHECK_EQ(0, result.a0);
12471 CHECK_EQ(0, result.a1);
12472
12473 // Pass argument that will make the Dart callback return null.
12474 a0 = 84;
12475
12476 result = f(a0, a1);
12477
12478 CHECK_EQ(0, result.a0);
12479 CHECK_EQ(0, result.a1);
12480
12481 return 0;
12482}
12483
12484// Used for testing structs and unions by value.
12485// Non-wordsize return value.
12487 // NOLINTNEXTLINE(whitespace/parens)
12488 Struct7BytesHomogeneousUint8 (*f)(uint8_t a0,
12489 uint8_t a1,
12490 uint8_t a2,
12491 uint8_t a3,
12492 uint8_t a4,
12493 uint8_t a5,
12494 uint8_t a6)) {
12495 uint8_t a0;
12496 uint8_t a1;
12497 uint8_t a2;
12498 uint8_t a3;
12499 uint8_t a4;
12500 uint8_t a5;
12501 uint8_t a6;
12502
12503 a0 = 1;
12504 a1 = 2;
12505 a2 = 3;
12506 a3 = 4;
12507 a4 = 5;
12508 a5 = 6;
12509 a6 = 7;
12510
12511 std::cout << "Calling TestReturnStruct7BytesHomogeneousUint8(" << "("
12512 << static_cast<int>(a0) << ", " << static_cast<int>(a1) << ", "
12513 << static_cast<int>(a2) << ", " << static_cast<int>(a3) << ", "
12514 << static_cast<int>(a4) << ", " << static_cast<int>(a5) << ", "
12515 << static_cast<int>(a6) << ")" << ")\n";
12516
12517 Struct7BytesHomogeneousUint8 result = f(a0, a1, a2, a3, a4, a5, a6);
12518
12519 std::cout << "result = " << "(" << static_cast<int>(result.a0) << ", "
12520 << static_cast<int>(result.a1) << ", "
12521 << static_cast<int>(result.a2) << ", "
12522 << static_cast<int>(result.a3) << ", "
12523 << static_cast<int>(result.a4) << ", "
12524 << static_cast<int>(result.a5) << ", "
12525 << static_cast<int>(result.a6) << ")" << "\n";
12526
12527 CHECK_EQ(a0, result.a0);
12528 CHECK_EQ(a1, result.a1);
12529 CHECK_EQ(a2, result.a2);
12530 CHECK_EQ(a3, result.a3);
12531 CHECK_EQ(a4, result.a4);
12532 CHECK_EQ(a5, result.a5);
12533 CHECK_EQ(a6, result.a6);
12534
12535 // Pass argument that will make the Dart callback throw.
12536 a0 = 42;
12537
12538 result = f(a0, a1, a2, a3, a4, a5, a6);
12539
12540 CHECK_EQ(0, result.a0);
12541 CHECK_EQ(0, result.a1);
12542 CHECK_EQ(0, result.a2);
12543 CHECK_EQ(0, result.a3);
12544 CHECK_EQ(0, result.a4);
12545 CHECK_EQ(0, result.a5);
12546 CHECK_EQ(0, result.a6);
12547
12548 // Pass argument that will make the Dart callback return null.
12549 a0 = 84;
12550
12551 result = f(a0, a1, a2, a3, a4, a5, a6);
12552
12553 CHECK_EQ(0, result.a0);
12554 CHECK_EQ(0, result.a1);
12555 CHECK_EQ(0, result.a2);
12556 CHECK_EQ(0, result.a3);
12557 CHECK_EQ(0, result.a4);
12558 CHECK_EQ(0, result.a5);
12559 CHECK_EQ(0, result.a6);
12560
12561 return 0;
12562}
12563
12564// Used for testing structs and unions by value.
12565// Non-wordsize return value.
12566// With alignment rules taken into account size is 8 bytes.
12568 // NOLINTNEXTLINE(whitespace/parens)
12569 Struct7BytesInt4ByteAligned (*f)(int32_t a0, int16_t a1, int8_t a2)) {
12570 int32_t a0;
12571 int16_t a1;
12572 int8_t a2;
12573
12574 a0 = -1;
12575 a1 = 2;
12576 a2 = -3;
12577
12578 std::cout << "Calling TestReturnStruct7BytesInt4ByteAligned(" << "(" << a0
12579 << ", " << a1 << ", " << static_cast<int>(a2) << ")" << ")\n";
12580
12581 Struct7BytesInt4ByteAligned result = f(a0, a1, a2);
12582
12583 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ", "
12584 << static_cast<int>(result.a2) << ")" << "\n";
12585
12586 CHECK_EQ(a0, result.a0);
12587 CHECK_EQ(a1, result.a1);
12588 CHECK_EQ(a2, result.a2);
12589
12590 // Pass argument that will make the Dart callback throw.
12591 a0 = 42;
12592
12593 result = f(a0, a1, a2);
12594
12595 CHECK_EQ(0, result.a0);
12596 CHECK_EQ(0, result.a1);
12597 CHECK_EQ(0, result.a2);
12598
12599 // Pass argument that will make the Dart callback return null.
12600 a0 = 84;
12601
12602 result = f(a0, a1, a2);
12603
12604 CHECK_EQ(0, result.a0);
12605 CHECK_EQ(0, result.a1);
12606 CHECK_EQ(0, result.a2);
12607
12608 return 0;
12609}
12610
12611// Used for testing structs and unions by value.
12612// Return value in integer registers on many architectures.
12614 // NOLINTNEXTLINE(whitespace/parens)
12615 Struct8BytesInt (*f)(int16_t a0, int16_t a1, int32_t a2)) {
12616 int16_t a0;
12617 int16_t a1;
12618 int32_t a2;
12619
12620 a0 = -1;
12621 a1 = 2;
12622 a2 = -3;
12623
12624 std::cout << "Calling TestReturnStruct8BytesInt(" << "(" << a0 << ", " << a1
12625 << ", " << a2 << ")" << ")\n";
12626
12627 Struct8BytesInt result = f(a0, a1, a2);
12628
12629 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ", "
12630 << result.a2 << ")" << "\n";
12631
12632 CHECK_EQ(a0, result.a0);
12633 CHECK_EQ(a1, result.a1);
12634 CHECK_EQ(a2, result.a2);
12635
12636 // Pass argument that will make the Dart callback throw.
12637 a0 = 42;
12638
12639 result = f(a0, a1, a2);
12640
12641 CHECK_EQ(0, result.a0);
12642 CHECK_EQ(0, result.a1);
12643 CHECK_EQ(0, result.a2);
12644
12645 // Pass argument that will make the Dart callback return null.
12646 a0 = 84;
12647
12648 result = f(a0, a1, a2);
12649
12650 CHECK_EQ(0, result.a0);
12651 CHECK_EQ(0, result.a1);
12652 CHECK_EQ(0, result.a2);
12653
12654 return 0;
12655}
12656
12657// Used for testing structs and unions by value.
12658// Return value in FP registers on many architectures.
12660 // NOLINTNEXTLINE(whitespace/parens)
12661 Struct8BytesHomogeneousFloat (*f)(float a0, float a1)) {
12662 float a0;
12663 float a1;
12664
12665 a0 = -1.0;
12666 a1 = 2.0;
12667
12668 std::cout << "Calling TestReturnStruct8BytesHomogeneousFloat(" << "(" << a0
12669 << ", " << a1 << ")" << ")\n";
12670
12672
12673 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ")"
12674 << "\n";
12675
12676 CHECK_APPROX(a0, result.a0);
12677 CHECK_APPROX(a1, result.a1);
12678
12679 // Pass argument that will make the Dart callback throw.
12680 a0 = 42;
12681
12682 result = f(a0, a1);
12683
12684 CHECK_APPROX(0.0, result.a0);
12685 CHECK_APPROX(0.0, result.a1);
12686
12687 // Pass argument that will make the Dart callback return null.
12688 a0 = 84;
12689
12690 result = f(a0, a1);
12691
12692 CHECK_APPROX(0.0, result.a0);
12693 CHECK_APPROX(0.0, result.a1);
12694
12695 return 0;
12696}
12697
12698// Used for testing structs and unions by value.
12699// Return value split over FP and integer register in x64.
12701 // NOLINTNEXTLINE(whitespace/parens)
12702 Struct8BytesMixed (*f)(float a0, int16_t a1, int16_t a2)) {
12703 float a0;
12704 int16_t a1;
12705 int16_t a2;
12706
12707 a0 = -1.0;
12708 a1 = 2;
12709 a2 = -3;
12710
12711 std::cout << "Calling TestReturnStruct8BytesMixed(" << "(" << a0 << ", " << a1
12712 << ", " << a2 << ")" << ")\n";
12713
12714 Struct8BytesMixed result = f(a0, a1, a2);
12715
12716 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ", "
12717 << result.a2 << ")" << "\n";
12718
12719 CHECK_APPROX(a0, result.a0);
12720 CHECK_EQ(a1, result.a1);
12721 CHECK_EQ(a2, result.a2);
12722
12723 // Pass argument that will make the Dart callback throw.
12724 a0 = 42;
12725
12726 result = f(a0, a1, a2);
12727
12728 CHECK_APPROX(0.0, result.a0);
12729 CHECK_EQ(0, result.a1);
12730 CHECK_EQ(0, result.a2);
12731
12732 // Pass argument that will make the Dart callback return null.
12733 a0 = 84;
12734
12735 result = f(a0, a1, a2);
12736
12737 CHECK_APPROX(0.0, result.a0);
12738 CHECK_EQ(0, result.a1);
12739 CHECK_EQ(0, result.a2);
12740
12741 return 0;
12742}
12743
12744// Used for testing structs and unions by value.
12745// The minimum alignment of this struct is only 1 byte based on its fields.
12746// Test that the memory backing these structs is the right size and that
12747// dart:ffi trampolines do not write outside this size.
12749 // NOLINTNEXTLINE(whitespace/parens)
12750 Struct9BytesHomogeneousUint8 (*f)(uint8_t a0,
12751 uint8_t a1,
12752 uint8_t a2,
12753 uint8_t a3,
12754 uint8_t a4,
12755 uint8_t a5,
12756 uint8_t a6,
12757 uint8_t a7,
12758 uint8_t a8)) {
12759 uint8_t a0;
12760 uint8_t a1;
12761 uint8_t a2;
12762 uint8_t a3;
12763 uint8_t a4;
12764 uint8_t a5;
12765 uint8_t a6;
12766 uint8_t a7;
12767 uint8_t a8;
12768
12769 a0 = 1;
12770 a1 = 2;
12771 a2 = 3;
12772 a3 = 4;
12773 a4 = 5;
12774 a5 = 6;
12775 a6 = 7;
12776 a7 = 8;
12777 a8 = 9;
12778
12779 std::cout << "Calling TestReturnStruct9BytesHomogeneousUint8(" << "("
12780 << static_cast<int>(a0) << ", " << static_cast<int>(a1) << ", "
12781 << static_cast<int>(a2) << ", " << static_cast<int>(a3) << ", "
12782 << static_cast<int>(a4) << ", " << static_cast<int>(a5) << ", "
12783 << static_cast<int>(a6) << ", " << static_cast<int>(a7) << ", "
12784 << static_cast<int>(a8) << ")" << ")\n";
12785
12786 Struct9BytesHomogeneousUint8 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
12787
12788 std::cout << "result = " << "(" << static_cast<int>(result.a0) << ", "
12789 << static_cast<int>(result.a1) << ", "
12790 << static_cast<int>(result.a2) << ", "
12791 << static_cast<int>(result.a3) << ", "
12792 << static_cast<int>(result.a4) << ", "
12793 << static_cast<int>(result.a5) << ", "
12794 << static_cast<int>(result.a6) << ", "
12795 << static_cast<int>(result.a7) << ", "
12796 << static_cast<int>(result.a8) << ")" << "\n";
12797
12798 CHECK_EQ(a0, result.a0);
12799 CHECK_EQ(a1, result.a1);
12800 CHECK_EQ(a2, result.a2);
12801 CHECK_EQ(a3, result.a3);
12802 CHECK_EQ(a4, result.a4);
12803 CHECK_EQ(a5, result.a5);
12804 CHECK_EQ(a6, result.a6);
12805 CHECK_EQ(a7, result.a7);
12806 CHECK_EQ(a8, result.a8);
12807
12808 // Pass argument that will make the Dart callback throw.
12809 a0 = 42;
12810
12811 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
12812
12813 CHECK_EQ(0, result.a0);
12814 CHECK_EQ(0, result.a1);
12815 CHECK_EQ(0, result.a2);
12816 CHECK_EQ(0, result.a3);
12817 CHECK_EQ(0, result.a4);
12818 CHECK_EQ(0, result.a5);
12819 CHECK_EQ(0, result.a6);
12820 CHECK_EQ(0, result.a7);
12821 CHECK_EQ(0, result.a8);
12822
12823 // Pass argument that will make the Dart callback return null.
12824 a0 = 84;
12825
12826 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
12827
12828 CHECK_EQ(0, result.a0);
12829 CHECK_EQ(0, result.a1);
12830 CHECK_EQ(0, result.a2);
12831 CHECK_EQ(0, result.a3);
12832 CHECK_EQ(0, result.a4);
12833 CHECK_EQ(0, result.a5);
12834 CHECK_EQ(0, result.a6);
12835 CHECK_EQ(0, result.a7);
12836 CHECK_EQ(0, result.a8);
12837
12838 return 0;
12839}
12840
12841// Used for testing structs and unions by value.
12842// Return value in two integer registers on x64.
12843// With alignment rules taken into account size is 12 or 16 bytes.
12845 // NOLINTNEXTLINE(whitespace/parens)
12846 Struct9BytesInt4Or8ByteAligned (*f)(int64_t a0, int8_t a1)) {
12847 int64_t a0;
12848 int8_t a1;
12849
12850 a0 = -1;
12851 a1 = 2;
12852
12853 std::cout << "Calling TestReturnStruct9BytesInt4Or8ByteAligned(" << "(" << a0
12854 << ", " << static_cast<int>(a1) << ")" << ")\n";
12855
12857
12858 std::cout << "result = " << "(" << result.a0 << ", "
12859 << static_cast<int>(result.a1) << ")" << "\n";
12860
12861 CHECK_EQ(a0, result.a0);
12862 CHECK_EQ(a1, result.a1);
12863
12864 // Pass argument that will make the Dart callback throw.
12865 a0 = 42;
12866
12867 result = f(a0, a1);
12868
12869 CHECK_EQ(0, result.a0);
12870 CHECK_EQ(0, result.a1);
12871
12872 // Pass argument that will make the Dart callback return null.
12873 a0 = 84;
12874
12875 result = f(a0, a1);
12876
12877 CHECK_EQ(0, result.a0);
12878 CHECK_EQ(0, result.a1);
12879
12880 return 0;
12881}
12882
12883// Used for testing structs and unions by value.
12884// Return value in FPU registers, but does not use all registers on arm hardfp
12885// and arm64.
12887 // NOLINTNEXTLINE(whitespace/parens)
12888 Struct12BytesHomogeneousFloat (*f)(float a0, float a1, float a2)) {
12889 float a0;
12890 float a1;
12891 float a2;
12892
12893 a0 = -1.0;
12894 a1 = 2.0;
12895 a2 = -3.0;
12896
12897 std::cout << "Calling TestReturnStruct12BytesHomogeneousFloat(" << "(" << a0
12898 << ", " << a1 << ", " << a2 << ")" << ")\n";
12899
12900 Struct12BytesHomogeneousFloat result = f(a0, a1, a2);
12901
12902 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ", "
12903 << result.a2 << ")" << "\n";
12904
12905 CHECK_APPROX(a0, result.a0);
12906 CHECK_APPROX(a1, result.a1);
12907 CHECK_APPROX(a2, result.a2);
12908
12909 // Pass argument that will make the Dart callback throw.
12910 a0 = 42;
12911
12912 result = f(a0, a1, a2);
12913
12914 CHECK_APPROX(0.0, result.a0);
12915 CHECK_APPROX(0.0, result.a1);
12916 CHECK_APPROX(0.0, result.a2);
12917
12918 // Pass argument that will make the Dart callback return null.
12919 a0 = 84;
12920
12921 result = f(a0, a1, a2);
12922
12923 CHECK_APPROX(0.0, result.a0);
12924 CHECK_APPROX(0.0, result.a1);
12925 CHECK_APPROX(0.0, result.a2);
12926
12927 return 0;
12928}
12929
12930// Used for testing structs and unions by value.
12931// Return value in FPU registers on arm hardfp and arm64.
12933 // NOLINTNEXTLINE(whitespace/parens)
12935 *f)(float a0, float a1, float a2, float a3)) {
12936 float a0;
12937 float a1;
12938 float a2;
12939 float a3;
12940
12941 a0 = -1.0;
12942 a1 = 2.0;
12943 a2 = -3.0;
12944 a3 = 4.0;
12945
12946 std::cout << "Calling TestReturnStruct16BytesHomogeneousFloat(" << "(" << a0
12947 << ", " << a1 << ", " << a2 << ", " << a3 << ")" << ")\n";
12948
12949 Struct16BytesHomogeneousFloat result = f(a0, a1, a2, a3);
12950
12951 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ", "
12952 << result.a2 << ", " << result.a3 << ")" << "\n";
12953
12954 CHECK_APPROX(a0, result.a0);
12955 CHECK_APPROX(a1, result.a1);
12956 CHECK_APPROX(a2, result.a2);
12957 CHECK_APPROX(a3, result.a3);
12958
12959 // Pass argument that will make the Dart callback throw.
12960 a0 = 42;
12961
12962 result = f(a0, a1, a2, a3);
12963
12964 CHECK_APPROX(0.0, result.a0);
12965 CHECK_APPROX(0.0, result.a1);
12966 CHECK_APPROX(0.0, result.a2);
12967 CHECK_APPROX(0.0, result.a3);
12968
12969 // Pass argument that will make the Dart callback return null.
12970 a0 = 84;
12971
12972 result = f(a0, a1, a2, a3);
12973
12974 CHECK_APPROX(0.0, result.a0);
12975 CHECK_APPROX(0.0, result.a1);
12976 CHECK_APPROX(0.0, result.a2);
12977 CHECK_APPROX(0.0, result.a3);
12978
12979 return 0;
12980}
12981
12982// Used for testing structs and unions by value.
12983// Return value split over FP and integer register in x64.
12985 // NOLINTNEXTLINE(whitespace/parens)
12986 Struct16BytesMixed (*f)(double a0, int64_t a1)) {
12987 double a0;
12988 int64_t a1;
12989
12990 a0 = -1.0;
12991 a1 = 2;
12992
12993 std::cout << "Calling TestReturnStruct16BytesMixed(" << "(" << a0 << ", "
12994 << a1 << ")" << ")\n";
12995
12996 Struct16BytesMixed result = f(a0, a1);
12997
12998 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ")"
12999 << "\n";
13000
13001 CHECK_APPROX(a0, result.a0);
13002 CHECK_EQ(a1, result.a1);
13003
13004 // Pass argument that will make the Dart callback throw.
13005 a0 = 42;
13006
13007 result = f(a0, a1);
13008
13009 CHECK_APPROX(0.0, result.a0);
13010 CHECK_EQ(0, result.a1);
13011
13012 // Pass argument that will make the Dart callback return null.
13013 a0 = 84;
13014
13015 result = f(a0, a1);
13016
13017 CHECK_APPROX(0.0, result.a0);
13018 CHECK_EQ(0, result.a1);
13019
13020 return 0;
13021}
13022
13023// Used for testing structs and unions by value.
13024// Return value split over FP and integer register in x64.
13025// The integer register contains half float half int.
13027 // NOLINTNEXTLINE(whitespace/parens)
13028 Struct16BytesMixed2 (*f)(float a0, float a1, float a2, int32_t a3)) {
13029 float a0;
13030 float a1;
13031 float a2;
13032 int32_t a3;
13033
13034 a0 = -1.0;
13035 a1 = 2.0;
13036 a2 = -3.0;
13037 a3 = 4;
13038
13039 std::cout << "Calling TestReturnStruct16BytesMixed2(" << "(" << a0 << ", "
13040 << a1 << ", " << a2 << ", " << a3 << ")" << ")\n";
13041
13042 Struct16BytesMixed2 result = f(a0, a1, a2, a3);
13043
13044 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ", "
13045 << result.a2 << ", " << result.a3 << ")" << "\n";
13046
13047 CHECK_APPROX(a0, result.a0);
13048 CHECK_APPROX(a1, result.a1);
13049 CHECK_APPROX(a2, result.a2);
13050 CHECK_EQ(a3, result.a3);
13051
13052 // Pass argument that will make the Dart callback throw.
13053 a0 = 42;
13054
13055 result = f(a0, a1, a2, a3);
13056
13057 CHECK_APPROX(0.0, result.a0);
13058 CHECK_APPROX(0.0, result.a1);
13059 CHECK_APPROX(0.0, result.a2);
13060 CHECK_EQ(0, result.a3);
13061
13062 // Pass argument that will make the Dart callback return null.
13063 a0 = 84;
13064
13065 result = f(a0, a1, a2, a3);
13066
13067 CHECK_APPROX(0.0, result.a0);
13068 CHECK_APPROX(0.0, result.a1);
13069 CHECK_APPROX(0.0, result.a2);
13070 CHECK_EQ(0, result.a3);
13071
13072 return 0;
13073}
13074
13075// Used for testing structs and unions by value.
13076// Return value returned in preallocated space passed by pointer on most ABIs.
13077// Is non word size on purpose, to test that structs are rounded up to word size
13078// on all ABIs.
13080 // NOLINTNEXTLINE(whitespace/parens)
13081 Struct17BytesInt (*f)(int64_t a0, int64_t a1, int8_t a2)) {
13082 int64_t a0;
13083 int64_t a1;
13084 int8_t a2;
13085
13086 a0 = -1;
13087 a1 = 2;
13088 a2 = -3;
13089
13090 std::cout << "Calling TestReturnStruct17BytesInt(" << "(" << a0 << ", " << a1
13091 << ", " << static_cast<int>(a2) << ")" << ")\n";
13092
13093 Struct17BytesInt result = f(a0, a1, a2);
13094
13095 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ", "
13096 << static_cast<int>(result.a2) << ")" << "\n";
13097
13098 CHECK_EQ(a0, result.a0);
13099 CHECK_EQ(a1, result.a1);
13100 CHECK_EQ(a2, result.a2);
13101
13102 // Pass argument that will make the Dart callback throw.
13103 a0 = 42;
13104
13105 result = f(a0, a1, a2);
13106
13107 CHECK_EQ(0, result.a0);
13108 CHECK_EQ(0, result.a1);
13109 CHECK_EQ(0, result.a2);
13110
13111 // Pass argument that will make the Dart callback return null.
13112 a0 = 84;
13113
13114 result = f(a0, a1, a2);
13115
13116 CHECK_EQ(0, result.a0);
13117 CHECK_EQ(0, result.a1);
13118 CHECK_EQ(0, result.a2);
13119
13120 return 0;
13121}
13122
13123// Used for testing structs and unions by value.
13124// The minimum alignment of this struct is only 1 byte based on its fields.
13125// Test that the memory backing these structs is the right size and that
13126// dart:ffi trampolines do not write outside this size.
13128 // NOLINTNEXTLINE(whitespace/parens)
13129 Struct19BytesHomogeneousUint8 (*f)(uint8_t a0,
13130 uint8_t a1,
13131 uint8_t a2,
13132 uint8_t a3,
13133 uint8_t a4,
13134 uint8_t a5,
13135 uint8_t a6,
13136 uint8_t a7,
13137 uint8_t a8,
13138 uint8_t a9,
13139 uint8_t a10,
13140 uint8_t a11,
13141 uint8_t a12,
13142 uint8_t a13,
13143 uint8_t a14,
13144 uint8_t a15,
13145 uint8_t a16,
13146 uint8_t a17,
13147 uint8_t a18)) {
13148 uint8_t a0;
13149 uint8_t a1;
13150 uint8_t a2;
13151 uint8_t a3;
13152 uint8_t a4;
13153 uint8_t a5;
13154 uint8_t a6;
13155 uint8_t a7;
13156 uint8_t a8;
13157 uint8_t a9;
13158 uint8_t a10;
13159 uint8_t a11;
13160 uint8_t a12;
13161 uint8_t a13;
13162 uint8_t a14;
13163 uint8_t a15;
13164 uint8_t a16;
13165 uint8_t a17;
13166 uint8_t a18;
13167
13168 a0 = 1;
13169 a1 = 2;
13170 a2 = 3;
13171 a3 = 4;
13172 a4 = 5;
13173 a5 = 6;
13174 a6 = 7;
13175 a7 = 8;
13176 a8 = 9;
13177 a9 = 10;
13178 a10 = 11;
13179 a11 = 12;
13180 a12 = 13;
13181 a13 = 14;
13182 a14 = 15;
13183 a15 = 16;
13184 a16 = 17;
13185 a17 = 18;
13186 a18 = 19;
13187
13188 std::cout << "Calling TestReturnStruct19BytesHomogeneousUint8(" << "("
13189 << static_cast<int>(a0) << ", " << static_cast<int>(a1) << ", "
13190 << static_cast<int>(a2) << ", " << static_cast<int>(a3) << ", "
13191 << static_cast<int>(a4) << ", " << static_cast<int>(a5) << ", "
13192 << static_cast<int>(a6) << ", " << static_cast<int>(a7) << ", "
13193 << static_cast<int>(a8) << ", " << static_cast<int>(a9) << ", "
13194 << static_cast<int>(a10) << ", " << static_cast<int>(a11) << ", "
13195 << static_cast<int>(a12) << ", " << static_cast<int>(a13) << ", "
13196 << static_cast<int>(a14) << ", " << static_cast<int>(a15) << ", "
13197 << static_cast<int>(a16) << ", " << static_cast<int>(a17) << ", "
13198 << static_cast<int>(a18) << ")" << ")\n";
13199
13201 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15,
13202 a16, a17, a18);
13203
13204 std::cout << "result = " << "(" << static_cast<int>(result.a0) << ", "
13205 << static_cast<int>(result.a1) << ", "
13206 << static_cast<int>(result.a2) << ", "
13207 << static_cast<int>(result.a3) << ", "
13208 << static_cast<int>(result.a4) << ", "
13209 << static_cast<int>(result.a5) << ", "
13210 << static_cast<int>(result.a6) << ", "
13211 << static_cast<int>(result.a7) << ", "
13212 << static_cast<int>(result.a8) << ", "
13213 << static_cast<int>(result.a9) << ", "
13214 << static_cast<int>(result.a10) << ", "
13215 << static_cast<int>(result.a11) << ", "
13216 << static_cast<int>(result.a12) << ", "
13217 << static_cast<int>(result.a13) << ", "
13218 << static_cast<int>(result.a14) << ", "
13219 << static_cast<int>(result.a15) << ", "
13220 << static_cast<int>(result.a16) << ", "
13221 << static_cast<int>(result.a17) << ", "
13222 << static_cast<int>(result.a18) << ")" << "\n";
13223
13224 CHECK_EQ(a0, result.a0);
13225 CHECK_EQ(a1, result.a1);
13226 CHECK_EQ(a2, result.a2);
13227 CHECK_EQ(a3, result.a3);
13228 CHECK_EQ(a4, result.a4);
13229 CHECK_EQ(a5, result.a5);
13230 CHECK_EQ(a6, result.a6);
13231 CHECK_EQ(a7, result.a7);
13232 CHECK_EQ(a8, result.a8);
13233 CHECK_EQ(a9, result.a9);
13234 CHECK_EQ(a10, result.a10);
13235 CHECK_EQ(a11, result.a11);
13236 CHECK_EQ(a12, result.a12);
13237 CHECK_EQ(a13, result.a13);
13238 CHECK_EQ(a14, result.a14);
13239 CHECK_EQ(a15, result.a15);
13240 CHECK_EQ(a16, result.a16);
13241 CHECK_EQ(a17, result.a17);
13242 CHECK_EQ(a18, result.a18);
13243
13244 // Pass argument that will make the Dart callback throw.
13245 a0 = 42;
13246
13247 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
13248 a15, a16, a17, a18);
13249
13250 CHECK_EQ(0, result.a0);
13251 CHECK_EQ(0, result.a1);
13252 CHECK_EQ(0, result.a2);
13253 CHECK_EQ(0, result.a3);
13254 CHECK_EQ(0, result.a4);
13255 CHECK_EQ(0, result.a5);
13256 CHECK_EQ(0, result.a6);
13257 CHECK_EQ(0, result.a7);
13258 CHECK_EQ(0, result.a8);
13259 CHECK_EQ(0, result.a9);
13260 CHECK_EQ(0, result.a10);
13261 CHECK_EQ(0, result.a11);
13262 CHECK_EQ(0, result.a12);
13263 CHECK_EQ(0, result.a13);
13264 CHECK_EQ(0, result.a14);
13265 CHECK_EQ(0, result.a15);
13266 CHECK_EQ(0, result.a16);
13267 CHECK_EQ(0, result.a17);
13268 CHECK_EQ(0, result.a18);
13269
13270 // Pass argument that will make the Dart callback return null.
13271 a0 = 84;
13272
13273 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
13274 a15, a16, a17, a18);
13275
13276 CHECK_EQ(0, result.a0);
13277 CHECK_EQ(0, result.a1);
13278 CHECK_EQ(0, result.a2);
13279 CHECK_EQ(0, result.a3);
13280 CHECK_EQ(0, result.a4);
13281 CHECK_EQ(0, result.a5);
13282 CHECK_EQ(0, result.a6);
13283 CHECK_EQ(0, result.a7);
13284 CHECK_EQ(0, result.a8);
13285 CHECK_EQ(0, result.a9);
13286 CHECK_EQ(0, result.a10);
13287 CHECK_EQ(0, result.a11);
13288 CHECK_EQ(0, result.a12);
13289 CHECK_EQ(0, result.a13);
13290 CHECK_EQ(0, result.a14);
13291 CHECK_EQ(0, result.a15);
13292 CHECK_EQ(0, result.a16);
13293 CHECK_EQ(0, result.a17);
13294 CHECK_EQ(0, result.a18);
13295
13296 return 0;
13297}
13298
13299// Used for testing structs and unions by value.
13300// Return value too big to go in cpu registers on arm64.
13302 // NOLINTNEXTLINE(whitespace/parens)
13304 *f)(int32_t a0, int32_t a1, int32_t a2, int32_t a3, int32_t a4)) {
13305 int32_t a0;
13306 int32_t a1;
13307 int32_t a2;
13308 int32_t a3;
13309 int32_t a4;
13310
13311 a0 = -1;
13312 a1 = 2;
13313 a2 = -3;
13314 a3 = 4;
13315 a4 = -5;
13316
13317 std::cout << "Calling TestReturnStruct20BytesHomogeneousInt32(" << "(" << a0
13318 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4 << ")"
13319 << ")\n";
13320
13321 Struct20BytesHomogeneousInt32 result = f(a0, a1, a2, a3, a4);
13322
13323 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ", "
13324 << result.a2 << ", " << result.a3 << ", " << result.a4 << ")"
13325 << "\n";
13326
13327 CHECK_EQ(a0, result.a0);
13328 CHECK_EQ(a1, result.a1);
13329 CHECK_EQ(a2, result.a2);
13330 CHECK_EQ(a3, result.a3);
13331 CHECK_EQ(a4, result.a4);
13332
13333 // Pass argument that will make the Dart callback throw.
13334 a0 = 42;
13335
13336 result = f(a0, a1, a2, a3, a4);
13337
13338 CHECK_EQ(0, result.a0);
13339 CHECK_EQ(0, result.a1);
13340 CHECK_EQ(0, result.a2);
13341 CHECK_EQ(0, result.a3);
13342 CHECK_EQ(0, result.a4);
13343
13344 // Pass argument that will make the Dart callback return null.
13345 a0 = 84;
13346
13347 result = f(a0, a1, a2, a3, a4);
13348
13349 CHECK_EQ(0, result.a0);
13350 CHECK_EQ(0, result.a1);
13351 CHECK_EQ(0, result.a2);
13352 CHECK_EQ(0, result.a3);
13353 CHECK_EQ(0, result.a4);
13354
13355 return 0;
13356}
13357
13358// Used for testing structs and unions by value.
13359// Return value too big to go in FPU registers on x64, arm hardfp and arm64.
13361 // NOLINTNEXTLINE(whitespace/parens)
13363 *f)(float a0, float a1, float a2, float a3, float a4)) {
13364 float a0;
13365 float a1;
13366 float a2;
13367 float a3;
13368 float a4;
13369
13370 a0 = -1.0;
13371 a1 = 2.0;
13372 a2 = -3.0;
13373 a3 = 4.0;
13374 a4 = -5.0;
13375
13376 std::cout << "Calling TestReturnStruct20BytesHomogeneousFloat(" << "(" << a0
13377 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4 << ")"
13378 << ")\n";
13379
13380 Struct20BytesHomogeneousFloat result = f(a0, a1, a2, a3, a4);
13381
13382 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ", "
13383 << result.a2 << ", " << result.a3 << ", " << result.a4 << ")"
13384 << "\n";
13385
13386 CHECK_APPROX(a0, result.a0);
13387 CHECK_APPROX(a1, result.a1);
13388 CHECK_APPROX(a2, result.a2);
13389 CHECK_APPROX(a3, result.a3);
13390 CHECK_APPROX(a4, result.a4);
13391
13392 // Pass argument that will make the Dart callback throw.
13393 a0 = 42;
13394
13395 result = f(a0, a1, a2, a3, a4);
13396
13397 CHECK_APPROX(0.0, result.a0);
13398 CHECK_APPROX(0.0, result.a1);
13399 CHECK_APPROX(0.0, result.a2);
13400 CHECK_APPROX(0.0, result.a3);
13401 CHECK_APPROX(0.0, result.a4);
13402
13403 // Pass argument that will make the Dart callback return null.
13404 a0 = 84;
13405
13406 result = f(a0, a1, a2, a3, a4);
13407
13408 CHECK_APPROX(0.0, result.a0);
13409 CHECK_APPROX(0.0, result.a1);
13410 CHECK_APPROX(0.0, result.a2);
13411 CHECK_APPROX(0.0, result.a3);
13412 CHECK_APPROX(0.0, result.a4);
13413
13414 return 0;
13415}
13416
13417// Used for testing structs and unions by value.
13418// Return value in FPU registers on arm64.
13420 // NOLINTNEXTLINE(whitespace/parens)
13422 *f)(double a0, double a1, double a2, double a3)) {
13423 double a0;
13424 double a1;
13425 double a2;
13426 double a3;
13427
13428 a0 = -1.0;
13429 a1 = 2.0;
13430 a2 = -3.0;
13431 a3 = 4.0;
13432
13433 std::cout << "Calling TestReturnStruct32BytesHomogeneousDouble(" << "(" << a0
13434 << ", " << a1 << ", " << a2 << ", " << a3 << ")" << ")\n";
13435
13436 Struct32BytesHomogeneousDouble result = f(a0, a1, a2, a3);
13437
13438 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ", "
13439 << result.a2 << ", " << result.a3 << ")" << "\n";
13440
13441 CHECK_APPROX(a0, result.a0);
13442 CHECK_APPROX(a1, result.a1);
13443 CHECK_APPROX(a2, result.a2);
13444 CHECK_APPROX(a3, result.a3);
13445
13446 // Pass argument that will make the Dart callback throw.
13447 a0 = 42;
13448
13449 result = f(a0, a1, a2, a3);
13450
13451 CHECK_APPROX(0.0, result.a0);
13452 CHECK_APPROX(0.0, result.a1);
13453 CHECK_APPROX(0.0, result.a2);
13454 CHECK_APPROX(0.0, result.a3);
13455
13456 // Pass argument that will make the Dart callback return null.
13457 a0 = 84;
13458
13459 result = f(a0, a1, a2, a3);
13460
13461 CHECK_APPROX(0.0, result.a0);
13462 CHECK_APPROX(0.0, result.a1);
13463 CHECK_APPROX(0.0, result.a2);
13464 CHECK_APPROX(0.0, result.a3);
13465
13466 return 0;
13467}
13468
13469// Used for testing structs and unions by value.
13470// Return value too big to go in FPU registers on arm64.
13472 // NOLINTNEXTLINE(whitespace/parens)
13474 *f)(double a0, double a1, double a2, double a3, double a4)) {
13475 double a0;
13476 double a1;
13477 double a2;
13478 double a3;
13479 double a4;
13480
13481 a0 = -1.0;
13482 a1 = 2.0;
13483 a2 = -3.0;
13484 a3 = 4.0;
13485 a4 = -5.0;
13486
13487 std::cout << "Calling TestReturnStruct40BytesHomogeneousDouble(" << "(" << a0
13488 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4 << ")"
13489 << ")\n";
13490
13491 Struct40BytesHomogeneousDouble result = f(a0, a1, a2, a3, a4);
13492
13493 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ", "
13494 << result.a2 << ", " << result.a3 << ", " << result.a4 << ")"
13495 << "\n";
13496
13497 CHECK_APPROX(a0, result.a0);
13498 CHECK_APPROX(a1, result.a1);
13499 CHECK_APPROX(a2, result.a2);
13500 CHECK_APPROX(a3, result.a3);
13501 CHECK_APPROX(a4, result.a4);
13502
13503 // Pass argument that will make the Dart callback throw.
13504 a0 = 42;
13505
13506 result = f(a0, a1, a2, a3, a4);
13507
13508 CHECK_APPROX(0.0, result.a0);
13509 CHECK_APPROX(0.0, result.a1);
13510 CHECK_APPROX(0.0, result.a2);
13511 CHECK_APPROX(0.0, result.a3);
13512 CHECK_APPROX(0.0, result.a4);
13513
13514 // Pass argument that will make the Dart callback return null.
13515 a0 = 84;
13516
13517 result = f(a0, a1, a2, a3, a4);
13518
13519 CHECK_APPROX(0.0, result.a0);
13520 CHECK_APPROX(0.0, result.a1);
13521 CHECK_APPROX(0.0, result.a2);
13522 CHECK_APPROX(0.0, result.a3);
13523 CHECK_APPROX(0.0, result.a4);
13524
13525 return 0;
13526}
13527
13528// Used for testing structs and unions by value.
13529// Test 1kb struct.
13531 // NOLINTNEXTLINE(whitespace/parens)
13532 Struct1024BytesHomogeneousUint64 (*f)(uint64_t a0,
13533 uint64_t a1,
13534 uint64_t a2,
13535 uint64_t a3,
13536 uint64_t a4,
13537 uint64_t a5,
13538 uint64_t a6,
13539 uint64_t a7,
13540 uint64_t a8,
13541 uint64_t a9,
13542 uint64_t a10,
13543 uint64_t a11,
13544 uint64_t a12,
13545 uint64_t a13,
13546 uint64_t a14,
13547 uint64_t a15,
13548 uint64_t a16,
13549 uint64_t a17,
13550 uint64_t a18,
13551 uint64_t a19,
13552 uint64_t a20,
13553 uint64_t a21,
13554 uint64_t a22,
13555 uint64_t a23,
13556 uint64_t a24,
13557 uint64_t a25,
13558 uint64_t a26,
13559 uint64_t a27,
13560 uint64_t a28,
13561 uint64_t a29,
13562 uint64_t a30,
13563 uint64_t a31,
13564 uint64_t a32,
13565 uint64_t a33,
13566 uint64_t a34,
13567 uint64_t a35,
13568 uint64_t a36,
13569 uint64_t a37,
13570 uint64_t a38,
13571 uint64_t a39,
13572 uint64_t a40,
13573 uint64_t a41,
13574 uint64_t a42,
13575 uint64_t a43,
13576 uint64_t a44,
13577 uint64_t a45,
13578 uint64_t a46,
13579 uint64_t a47,
13580 uint64_t a48,
13581 uint64_t a49,
13582 uint64_t a50,
13583 uint64_t a51,
13584 uint64_t a52,
13585 uint64_t a53,
13586 uint64_t a54,
13587 uint64_t a55,
13588 uint64_t a56,
13589 uint64_t a57,
13590 uint64_t a58,
13591 uint64_t a59,
13592 uint64_t a60,
13593 uint64_t a61,
13594 uint64_t a62,
13595 uint64_t a63,
13596 uint64_t a64,
13597 uint64_t a65,
13598 uint64_t a66,
13599 uint64_t a67,
13600 uint64_t a68,
13601 uint64_t a69,
13602 uint64_t a70,
13603 uint64_t a71,
13604 uint64_t a72,
13605 uint64_t a73,
13606 uint64_t a74,
13607 uint64_t a75,
13608 uint64_t a76,
13609 uint64_t a77,
13610 uint64_t a78,
13611 uint64_t a79,
13612 uint64_t a80,
13613 uint64_t a81,
13614 uint64_t a82,
13615 uint64_t a83,
13616 uint64_t a84,
13617 uint64_t a85,
13618 uint64_t a86,
13619 uint64_t a87,
13620 uint64_t a88,
13621 uint64_t a89,
13622 uint64_t a90,
13623 uint64_t a91,
13624 uint64_t a92,
13625 uint64_t a93,
13626 uint64_t a94,
13627 uint64_t a95,
13628 uint64_t a96,
13629 uint64_t a97,
13630 uint64_t a98,
13631 uint64_t a99,
13632 uint64_t a100,
13633 uint64_t a101,
13634 uint64_t a102,
13635 uint64_t a103,
13636 uint64_t a104,
13637 uint64_t a105,
13638 uint64_t a106,
13639 uint64_t a107,
13640 uint64_t a108,
13641 uint64_t a109,
13642 uint64_t a110,
13643 uint64_t a111,
13644 uint64_t a112,
13645 uint64_t a113,
13646 uint64_t a114,
13647 uint64_t a115,
13648 uint64_t a116,
13649 uint64_t a117,
13650 uint64_t a118,
13651 uint64_t a119,
13652 uint64_t a120,
13653 uint64_t a121,
13654 uint64_t a122,
13655 uint64_t a123,
13656 uint64_t a124,
13657 uint64_t a125,
13658 uint64_t a126,
13659 uint64_t a127)) {
13660 uint64_t a0;
13661 uint64_t a1;
13662 uint64_t a2;
13663 uint64_t a3;
13664 uint64_t a4;
13665 uint64_t a5;
13666 uint64_t a6;
13667 uint64_t a7;
13668 uint64_t a8;
13669 uint64_t a9;
13670 uint64_t a10;
13671 uint64_t a11;
13672 uint64_t a12;
13673 uint64_t a13;
13674 uint64_t a14;
13675 uint64_t a15;
13676 uint64_t a16;
13677 uint64_t a17;
13678 uint64_t a18;
13679 uint64_t a19;
13680 uint64_t a20;
13681 uint64_t a21;
13682 uint64_t a22;
13683 uint64_t a23;
13684 uint64_t a24;
13685 uint64_t a25;
13686 uint64_t a26;
13687 uint64_t a27;
13688 uint64_t a28;
13689 uint64_t a29;
13690 uint64_t a30;
13691 uint64_t a31;
13692 uint64_t a32;
13693 uint64_t a33;
13694 uint64_t a34;
13695 uint64_t a35;
13696 uint64_t a36;
13697 uint64_t a37;
13698 uint64_t a38;
13699 uint64_t a39;
13700 uint64_t a40;
13701 uint64_t a41;
13702 uint64_t a42;
13703 uint64_t a43;
13704 uint64_t a44;
13705 uint64_t a45;
13706 uint64_t a46;
13707 uint64_t a47;
13708 uint64_t a48;
13709 uint64_t a49;
13710 uint64_t a50;
13711 uint64_t a51;
13712 uint64_t a52;
13713 uint64_t a53;
13714 uint64_t a54;
13715 uint64_t a55;
13716 uint64_t a56;
13717 uint64_t a57;
13718 uint64_t a58;
13719 uint64_t a59;
13720 uint64_t a60;
13721 uint64_t a61;
13722 uint64_t a62;
13723 uint64_t a63;
13724 uint64_t a64;
13725 uint64_t a65;
13726 uint64_t a66;
13727 uint64_t a67;
13728 uint64_t a68;
13729 uint64_t a69;
13730 uint64_t a70;
13731 uint64_t a71;
13732 uint64_t a72;
13733 uint64_t a73;
13734 uint64_t a74;
13735 uint64_t a75;
13736 uint64_t a76;
13737 uint64_t a77;
13738 uint64_t a78;
13739 uint64_t a79;
13740 uint64_t a80;
13741 uint64_t a81;
13742 uint64_t a82;
13743 uint64_t a83;
13744 uint64_t a84;
13745 uint64_t a85;
13746 uint64_t a86;
13747 uint64_t a87;
13748 uint64_t a88;
13749 uint64_t a89;
13750 uint64_t a90;
13751 uint64_t a91;
13752 uint64_t a92;
13753 uint64_t a93;
13754 uint64_t a94;
13755 uint64_t a95;
13756 uint64_t a96;
13757 uint64_t a97;
13758 uint64_t a98;
13759 uint64_t a99;
13760 uint64_t a100;
13761 uint64_t a101;
13762 uint64_t a102;
13763 uint64_t a103;
13764 uint64_t a104;
13765 uint64_t a105;
13766 uint64_t a106;
13767 uint64_t a107;
13768 uint64_t a108;
13769 uint64_t a109;
13770 uint64_t a110;
13771 uint64_t a111;
13772 uint64_t a112;
13773 uint64_t a113;
13774 uint64_t a114;
13775 uint64_t a115;
13776 uint64_t a116;
13777 uint64_t a117;
13778 uint64_t a118;
13779 uint64_t a119;
13780 uint64_t a120;
13781 uint64_t a121;
13782 uint64_t a122;
13783 uint64_t a123;
13784 uint64_t a124;
13785 uint64_t a125;
13786 uint64_t a126;
13787 uint64_t a127;
13788
13789 a0 = 1;
13790 a1 = 2;
13791 a2 = 3;
13792 a3 = 4;
13793 a4 = 5;
13794 a5 = 6;
13795 a6 = 7;
13796 a7 = 8;
13797 a8 = 9;
13798 a9 = 10;
13799 a10 = 11;
13800 a11 = 12;
13801 a12 = 13;
13802 a13 = 14;
13803 a14 = 15;
13804 a15 = 16;
13805 a16 = 17;
13806 a17 = 18;
13807 a18 = 19;
13808 a19 = 20;
13809 a20 = 21;
13810 a21 = 22;
13811 a22 = 23;
13812 a23 = 24;
13813 a24 = 25;
13814 a25 = 26;
13815 a26 = 27;
13816 a27 = 28;
13817 a28 = 29;
13818 a29 = 30;
13819 a30 = 31;
13820 a31 = 32;
13821 a32 = 33;
13822 a33 = 34;
13823 a34 = 35;
13824 a35 = 36;
13825 a36 = 37;
13826 a37 = 38;
13827 a38 = 39;
13828 a39 = 40;
13829 a40 = 41;
13830 a41 = 42;
13831 a42 = 43;
13832 a43 = 44;
13833 a44 = 45;
13834 a45 = 46;
13835 a46 = 47;
13836 a47 = 48;
13837 a48 = 49;
13838 a49 = 50;
13839 a50 = 51;
13840 a51 = 52;
13841 a52 = 53;
13842 a53 = 54;
13843 a54 = 55;
13844 a55 = 56;
13845 a56 = 57;
13846 a57 = 58;
13847 a58 = 59;
13848 a59 = 60;
13849 a60 = 61;
13850 a61 = 62;
13851 a62 = 63;
13852 a63 = 64;
13853 a64 = 65;
13854 a65 = 66;
13855 a66 = 67;
13856 a67 = 68;
13857 a68 = 69;
13858 a69 = 70;
13859 a70 = 71;
13860 a71 = 72;
13861 a72 = 73;
13862 a73 = 74;
13863 a74 = 75;
13864 a75 = 76;
13865 a76 = 77;
13866 a77 = 78;
13867 a78 = 79;
13868 a79 = 80;
13869 a80 = 81;
13870 a81 = 82;
13871 a82 = 83;
13872 a83 = 84;
13873 a84 = 85;
13874 a85 = 86;
13875 a86 = 87;
13876 a87 = 88;
13877 a88 = 89;
13878 a89 = 90;
13879 a90 = 91;
13880 a91 = 92;
13881 a92 = 93;
13882 a93 = 94;
13883 a94 = 95;
13884 a95 = 96;
13885 a96 = 97;
13886 a97 = 98;
13887 a98 = 99;
13888 a99 = 100;
13889 a100 = 101;
13890 a101 = 102;
13891 a102 = 103;
13892 a103 = 104;
13893 a104 = 105;
13894 a105 = 106;
13895 a106 = 107;
13896 a107 = 108;
13897 a108 = 109;
13898 a109 = 110;
13899 a110 = 111;
13900 a111 = 112;
13901 a112 = 113;
13902 a113 = 114;
13903 a114 = 115;
13904 a115 = 116;
13905 a116 = 117;
13906 a117 = 118;
13907 a118 = 119;
13908 a119 = 120;
13909 a120 = 121;
13910 a121 = 122;
13911 a122 = 123;
13912 a123 = 124;
13913 a124 = 125;
13914 a125 = 126;
13915 a126 = 127;
13916 a127 = 128;
13917
13918 std::cout << "Calling TestReturnStruct1024BytesHomogeneousUint64(" << "("
13919 << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
13920 << ", " << a5 << ", " << a6 << ", " << a7 << ", " << a8 << ", "
13921 << a9 << ", " << a10 << ", " << a11 << ", " << a12 << ", " << a13
13922 << ", " << a14 << ", " << a15 << ", " << a16 << ", " << a17 << ", "
13923 << a18 << ", " << a19 << ", " << a20 << ", " << a21 << ", " << a22
13924 << ", " << a23 << ", " << a24 << ", " << a25 << ", " << a26 << ", "
13925 << a27 << ", " << a28 << ", " << a29 << ", " << a30 << ", " << a31
13926 << ", " << a32 << ", " << a33 << ", " << a34 << ", " << a35 << ", "
13927 << a36 << ", " << a37 << ", " << a38 << ", " << a39 << ", " << a40
13928 << ", " << a41 << ", " << a42 << ", " << a43 << ", " << a44 << ", "
13929 << a45 << ", " << a46 << ", " << a47 << ", " << a48 << ", " << a49
13930 << ", " << a50 << ", " << a51 << ", " << a52 << ", " << a53 << ", "
13931 << a54 << ", " << a55 << ", " << a56 << ", " << a57 << ", " << a58
13932 << ", " << a59 << ", " << a60 << ", " << a61 << ", " << a62 << ", "
13933 << a63 << ", " << a64 << ", " << a65 << ", " << a66 << ", " << a67
13934 << ", " << a68 << ", " << a69 << ", " << a70 << ", " << a71 << ", "
13935 << a72 << ", " << a73 << ", " << a74 << ", " << a75 << ", " << a76
13936 << ", " << a77 << ", " << a78 << ", " << a79 << ", " << a80 << ", "
13937 << a81 << ", " << a82 << ", " << a83 << ", " << a84 << ", " << a85
13938 << ", " << a86 << ", " << a87 << ", " << a88 << ", " << a89 << ", "
13939 << a90 << ", " << a91 << ", " << a92 << ", " << a93 << ", " << a94
13940 << ", " << a95 << ", " << a96 << ", " << a97 << ", " << a98 << ", "
13941 << a99 << ", " << a100 << ", " << a101 << ", " << a102 << ", "
13942 << a103 << ", " << a104 << ", " << a105 << ", " << a106 << ", "
13943 << a107 << ", " << a108 << ", " << a109 << ", " << a110 << ", "
13944 << a111 << ", " << a112 << ", " << a113 << ", " << a114 << ", "
13945 << a115 << ", " << a116 << ", " << a117 << ", " << a118 << ", "
13946 << a119 << ", " << a120 << ", " << a121 << ", " << a122 << ", "
13947 << a123 << ", " << a124 << ", " << a125 << ", " << a126 << ", "
13948 << a127 << ")" << ")\n";
13949
13951 a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16,
13952 a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31,
13953 a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, a45, a46,
13954 a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61,
13955 a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, a74, a75, a76,
13956 a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91,
13957 a92, a93, a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104,
13958 a105, a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116,
13959 a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127);
13960
13961 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ", "
13962 << result.a2 << ", " << result.a3 << ", " << result.a4 << ", "
13963 << result.a5 << ", " << result.a6 << ", " << result.a7 << ", "
13964 << result.a8 << ", " << result.a9 << ", " << result.a10 << ", "
13965 << result.a11 << ", " << result.a12 << ", " << result.a13 << ", "
13966 << result.a14 << ", " << result.a15 << ", " << result.a16 << ", "
13967 << result.a17 << ", " << result.a18 << ", " << result.a19 << ", "
13968 << result.a20 << ", " << result.a21 << ", " << result.a22 << ", "
13969 << result.a23 << ", " << result.a24 << ", " << result.a25 << ", "
13970 << result.a26 << ", " << result.a27 << ", " << result.a28 << ", "
13971 << result.a29 << ", " << result.a30 << ", " << result.a31 << ", "
13972 << result.a32 << ", " << result.a33 << ", " << result.a34 << ", "
13973 << result.a35 << ", " << result.a36 << ", " << result.a37 << ", "
13974 << result.a38 << ", " << result.a39 << ", " << result.a40 << ", "
13975 << result.a41 << ", " << result.a42 << ", " << result.a43 << ", "
13976 << result.a44 << ", " << result.a45 << ", " << result.a46 << ", "
13977 << result.a47 << ", " << result.a48 << ", " << result.a49 << ", "
13978 << result.a50 << ", " << result.a51 << ", " << result.a52 << ", "
13979 << result.a53 << ", " << result.a54 << ", " << result.a55 << ", "
13980 << result.a56 << ", " << result.a57 << ", " << result.a58 << ", "
13981 << result.a59 << ", " << result.a60 << ", " << result.a61 << ", "
13982 << result.a62 << ", " << result.a63 << ", " << result.a64 << ", "
13983 << result.a65 << ", " << result.a66 << ", " << result.a67 << ", "
13984 << result.a68 << ", " << result.a69 << ", " << result.a70 << ", "
13985 << result.a71 << ", " << result.a72 << ", " << result.a73 << ", "
13986 << result.a74 << ", " << result.a75 << ", " << result.a76 << ", "
13987 << result.a77 << ", " << result.a78 << ", " << result.a79 << ", "
13988 << result.a80 << ", " << result.a81 << ", " << result.a82 << ", "
13989 << result.a83 << ", " << result.a84 << ", " << result.a85 << ", "
13990 << result.a86 << ", " << result.a87 << ", " << result.a88 << ", "
13991 << result.a89 << ", " << result.a90 << ", " << result.a91 << ", "
13992 << result.a92 << ", " << result.a93 << ", " << result.a94 << ", "
13993 << result.a95 << ", " << result.a96 << ", " << result.a97 << ", "
13994 << result.a98 << ", " << result.a99 << ", " << result.a100 << ", "
13995 << result.a101 << ", " << result.a102 << ", " << result.a103 << ", "
13996 << result.a104 << ", " << result.a105 << ", " << result.a106 << ", "
13997 << result.a107 << ", " << result.a108 << ", " << result.a109 << ", "
13998 << result.a110 << ", " << result.a111 << ", " << result.a112 << ", "
13999 << result.a113 << ", " << result.a114 << ", " << result.a115 << ", "
14000 << result.a116 << ", " << result.a117 << ", " << result.a118 << ", "
14001 << result.a119 << ", " << result.a120 << ", " << result.a121 << ", "
14002 << result.a122 << ", " << result.a123 << ", " << result.a124 << ", "
14003 << result.a125 << ", " << result.a126 << ", " << result.a127 << ")"
14004 << "\n";
14005
14006 CHECK_EQ(a0, result.a0);
14007 CHECK_EQ(a1, result.a1);
14008 CHECK_EQ(a2, result.a2);
14009 CHECK_EQ(a3, result.a3);
14010 CHECK_EQ(a4, result.a4);
14011 CHECK_EQ(a5, result.a5);
14012 CHECK_EQ(a6, result.a6);
14013 CHECK_EQ(a7, result.a7);
14014 CHECK_EQ(a8, result.a8);
14015 CHECK_EQ(a9, result.a9);
14016 CHECK_EQ(a10, result.a10);
14017 CHECK_EQ(a11, result.a11);
14018 CHECK_EQ(a12, result.a12);
14019 CHECK_EQ(a13, result.a13);
14020 CHECK_EQ(a14, result.a14);
14021 CHECK_EQ(a15, result.a15);
14022 CHECK_EQ(a16, result.a16);
14023 CHECK_EQ(a17, result.a17);
14024 CHECK_EQ(a18, result.a18);
14025 CHECK_EQ(a19, result.a19);
14026 CHECK_EQ(a20, result.a20);
14027 CHECK_EQ(a21, result.a21);
14028 CHECK_EQ(a22, result.a22);
14029 CHECK_EQ(a23, result.a23);
14030 CHECK_EQ(a24, result.a24);
14031 CHECK_EQ(a25, result.a25);
14032 CHECK_EQ(a26, result.a26);
14033 CHECK_EQ(a27, result.a27);
14034 CHECK_EQ(a28, result.a28);
14035 CHECK_EQ(a29, result.a29);
14036 CHECK_EQ(a30, result.a30);
14037 CHECK_EQ(a31, result.a31);
14038 CHECK_EQ(a32, result.a32);
14039 CHECK_EQ(a33, result.a33);
14040 CHECK_EQ(a34, result.a34);
14041 CHECK_EQ(a35, result.a35);
14042 CHECK_EQ(a36, result.a36);
14043 CHECK_EQ(a37, result.a37);
14044 CHECK_EQ(a38, result.a38);
14045 CHECK_EQ(a39, result.a39);
14046 CHECK_EQ(a40, result.a40);
14047 CHECK_EQ(a41, result.a41);
14048 CHECK_EQ(a42, result.a42);
14049 CHECK_EQ(a43, result.a43);
14050 CHECK_EQ(a44, result.a44);
14051 CHECK_EQ(a45, result.a45);
14052 CHECK_EQ(a46, result.a46);
14053 CHECK_EQ(a47, result.a47);
14054 CHECK_EQ(a48, result.a48);
14055 CHECK_EQ(a49, result.a49);
14056 CHECK_EQ(a50, result.a50);
14057 CHECK_EQ(a51, result.a51);
14058 CHECK_EQ(a52, result.a52);
14059 CHECK_EQ(a53, result.a53);
14060 CHECK_EQ(a54, result.a54);
14061 CHECK_EQ(a55, result.a55);
14062 CHECK_EQ(a56, result.a56);
14063 CHECK_EQ(a57, result.a57);
14064 CHECK_EQ(a58, result.a58);
14065 CHECK_EQ(a59, result.a59);
14066 CHECK_EQ(a60, result.a60);
14067 CHECK_EQ(a61, result.a61);
14068 CHECK_EQ(a62, result.a62);
14069 CHECK_EQ(a63, result.a63);
14070 CHECK_EQ(a64, result.a64);
14071 CHECK_EQ(a65, result.a65);
14072 CHECK_EQ(a66, result.a66);
14073 CHECK_EQ(a67, result.a67);
14074 CHECK_EQ(a68, result.a68);
14075 CHECK_EQ(a69, result.a69);
14076 CHECK_EQ(a70, result.a70);
14077 CHECK_EQ(a71, result.a71);
14078 CHECK_EQ(a72, result.a72);
14079 CHECK_EQ(a73, result.a73);
14080 CHECK_EQ(a74, result.a74);
14081 CHECK_EQ(a75, result.a75);
14082 CHECK_EQ(a76, result.a76);
14083 CHECK_EQ(a77, result.a77);
14084 CHECK_EQ(a78, result.a78);
14085 CHECK_EQ(a79, result.a79);
14086 CHECK_EQ(a80, result.a80);
14087 CHECK_EQ(a81, result.a81);
14088 CHECK_EQ(a82, result.a82);
14089 CHECK_EQ(a83, result.a83);
14090 CHECK_EQ(a84, result.a84);
14091 CHECK_EQ(a85, result.a85);
14092 CHECK_EQ(a86, result.a86);
14093 CHECK_EQ(a87, result.a87);
14094 CHECK_EQ(a88, result.a88);
14095 CHECK_EQ(a89, result.a89);
14096 CHECK_EQ(a90, result.a90);
14097 CHECK_EQ(a91, result.a91);
14098 CHECK_EQ(a92, result.a92);
14099 CHECK_EQ(a93, result.a93);
14100 CHECK_EQ(a94, result.a94);
14101 CHECK_EQ(a95, result.a95);
14102 CHECK_EQ(a96, result.a96);
14103 CHECK_EQ(a97, result.a97);
14104 CHECK_EQ(a98, result.a98);
14105 CHECK_EQ(a99, result.a99);
14106 CHECK_EQ(a100, result.a100);
14107 CHECK_EQ(a101, result.a101);
14108 CHECK_EQ(a102, result.a102);
14109 CHECK_EQ(a103, result.a103);
14110 CHECK_EQ(a104, result.a104);
14111 CHECK_EQ(a105, result.a105);
14112 CHECK_EQ(a106, result.a106);
14113 CHECK_EQ(a107, result.a107);
14114 CHECK_EQ(a108, result.a108);
14115 CHECK_EQ(a109, result.a109);
14116 CHECK_EQ(a110, result.a110);
14117 CHECK_EQ(a111, result.a111);
14118 CHECK_EQ(a112, result.a112);
14119 CHECK_EQ(a113, result.a113);
14120 CHECK_EQ(a114, result.a114);
14121 CHECK_EQ(a115, result.a115);
14122 CHECK_EQ(a116, result.a116);
14123 CHECK_EQ(a117, result.a117);
14124 CHECK_EQ(a118, result.a118);
14125 CHECK_EQ(a119, result.a119);
14126 CHECK_EQ(a120, result.a120);
14127 CHECK_EQ(a121, result.a121);
14128 CHECK_EQ(a122, result.a122);
14129 CHECK_EQ(a123, result.a123);
14130 CHECK_EQ(a124, result.a124);
14131 CHECK_EQ(a125, result.a125);
14132 CHECK_EQ(a126, result.a126);
14133 CHECK_EQ(a127, result.a127);
14134
14135 // Pass argument that will make the Dart callback throw.
14136 a0 = 42;
14137
14138 result = f(
14139 a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16,
14140 a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31,
14141 a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, a45, a46,
14142 a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61,
14143 a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, a74, a75, a76,
14144 a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91,
14145 a92, a93, a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104,
14146 a105, a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116,
14147 a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127);
14148
14149 CHECK_EQ(0, result.a0);
14150 CHECK_EQ(0, result.a1);
14151 CHECK_EQ(0, result.a2);
14152 CHECK_EQ(0, result.a3);
14153 CHECK_EQ(0, result.a4);
14154 CHECK_EQ(0, result.a5);
14155 CHECK_EQ(0, result.a6);
14156 CHECK_EQ(0, result.a7);
14157 CHECK_EQ(0, result.a8);
14158 CHECK_EQ(0, result.a9);
14159 CHECK_EQ(0, result.a10);
14160 CHECK_EQ(0, result.a11);
14161 CHECK_EQ(0, result.a12);
14162 CHECK_EQ(0, result.a13);
14163 CHECK_EQ(0, result.a14);
14164 CHECK_EQ(0, result.a15);
14165 CHECK_EQ(0, result.a16);
14166 CHECK_EQ(0, result.a17);
14167 CHECK_EQ(0, result.a18);
14168 CHECK_EQ(0, result.a19);
14169 CHECK_EQ(0, result.a20);
14170 CHECK_EQ(0, result.a21);
14171 CHECK_EQ(0, result.a22);
14172 CHECK_EQ(0, result.a23);
14173 CHECK_EQ(0, result.a24);
14174 CHECK_EQ(0, result.a25);
14175 CHECK_EQ(0, result.a26);
14176 CHECK_EQ(0, result.a27);
14177 CHECK_EQ(0, result.a28);
14178 CHECK_EQ(0, result.a29);
14179 CHECK_EQ(0, result.a30);
14180 CHECK_EQ(0, result.a31);
14181 CHECK_EQ(0, result.a32);
14182 CHECK_EQ(0, result.a33);
14183 CHECK_EQ(0, result.a34);
14184 CHECK_EQ(0, result.a35);
14185 CHECK_EQ(0, result.a36);
14186 CHECK_EQ(0, result.a37);
14187 CHECK_EQ(0, result.a38);
14188 CHECK_EQ(0, result.a39);
14189 CHECK_EQ(0, result.a40);
14190 CHECK_EQ(0, result.a41);
14191 CHECK_EQ(0, result.a42);
14192 CHECK_EQ(0, result.a43);
14193 CHECK_EQ(0, result.a44);
14194 CHECK_EQ(0, result.a45);
14195 CHECK_EQ(0, result.a46);
14196 CHECK_EQ(0, result.a47);
14197 CHECK_EQ(0, result.a48);
14198 CHECK_EQ(0, result.a49);
14199 CHECK_EQ(0, result.a50);
14200 CHECK_EQ(0, result.a51);
14201 CHECK_EQ(0, result.a52);
14202 CHECK_EQ(0, result.a53);
14203 CHECK_EQ(0, result.a54);
14204 CHECK_EQ(0, result.a55);
14205 CHECK_EQ(0, result.a56);
14206 CHECK_EQ(0, result.a57);
14207 CHECK_EQ(0, result.a58);
14208 CHECK_EQ(0, result.a59);
14209 CHECK_EQ(0, result.a60);
14210 CHECK_EQ(0, result.a61);
14211 CHECK_EQ(0, result.a62);
14212 CHECK_EQ(0, result.a63);
14213 CHECK_EQ(0, result.a64);
14214 CHECK_EQ(0, result.a65);
14215 CHECK_EQ(0, result.a66);
14216 CHECK_EQ(0, result.a67);
14217 CHECK_EQ(0, result.a68);
14218 CHECK_EQ(0, result.a69);
14219 CHECK_EQ(0, result.a70);
14220 CHECK_EQ(0, result.a71);
14221 CHECK_EQ(0, result.a72);
14222 CHECK_EQ(0, result.a73);
14223 CHECK_EQ(0, result.a74);
14224 CHECK_EQ(0, result.a75);
14225 CHECK_EQ(0, result.a76);
14226 CHECK_EQ(0, result.a77);
14227 CHECK_EQ(0, result.a78);
14228 CHECK_EQ(0, result.a79);
14229 CHECK_EQ(0, result.a80);
14230 CHECK_EQ(0, result.a81);
14231 CHECK_EQ(0, result.a82);
14232 CHECK_EQ(0, result.a83);
14233 CHECK_EQ(0, result.a84);
14234 CHECK_EQ(0, result.a85);
14235 CHECK_EQ(0, result.a86);
14236 CHECK_EQ(0, result.a87);
14237 CHECK_EQ(0, result.a88);
14238 CHECK_EQ(0, result.a89);
14239 CHECK_EQ(0, result.a90);
14240 CHECK_EQ(0, result.a91);
14241 CHECK_EQ(0, result.a92);
14242 CHECK_EQ(0, result.a93);
14243 CHECK_EQ(0, result.a94);
14244 CHECK_EQ(0, result.a95);
14245 CHECK_EQ(0, result.a96);
14246 CHECK_EQ(0, result.a97);
14247 CHECK_EQ(0, result.a98);
14248 CHECK_EQ(0, result.a99);
14249 CHECK_EQ(0, result.a100);
14250 CHECK_EQ(0, result.a101);
14251 CHECK_EQ(0, result.a102);
14252 CHECK_EQ(0, result.a103);
14253 CHECK_EQ(0, result.a104);
14254 CHECK_EQ(0, result.a105);
14255 CHECK_EQ(0, result.a106);
14256 CHECK_EQ(0, result.a107);
14257 CHECK_EQ(0, result.a108);
14258 CHECK_EQ(0, result.a109);
14259 CHECK_EQ(0, result.a110);
14260 CHECK_EQ(0, result.a111);
14261 CHECK_EQ(0, result.a112);
14262 CHECK_EQ(0, result.a113);
14263 CHECK_EQ(0, result.a114);
14264 CHECK_EQ(0, result.a115);
14265 CHECK_EQ(0, result.a116);
14266 CHECK_EQ(0, result.a117);
14267 CHECK_EQ(0, result.a118);
14268 CHECK_EQ(0, result.a119);
14269 CHECK_EQ(0, result.a120);
14270 CHECK_EQ(0, result.a121);
14271 CHECK_EQ(0, result.a122);
14272 CHECK_EQ(0, result.a123);
14273 CHECK_EQ(0, result.a124);
14274 CHECK_EQ(0, result.a125);
14275 CHECK_EQ(0, result.a126);
14276 CHECK_EQ(0, result.a127);
14277
14278 // Pass argument that will make the Dart callback return null.
14279 a0 = 84;
14280
14281 result = f(
14282 a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16,
14283 a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31,
14284 a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, a45, a46,
14285 a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61,
14286 a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, a74, a75, a76,
14287 a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91,
14288 a92, a93, a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104,
14289 a105, a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116,
14290 a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127);
14291
14292 CHECK_EQ(0, result.a0);
14293 CHECK_EQ(0, result.a1);
14294 CHECK_EQ(0, result.a2);
14295 CHECK_EQ(0, result.a3);
14296 CHECK_EQ(0, result.a4);
14297 CHECK_EQ(0, result.a5);
14298 CHECK_EQ(0, result.a6);
14299 CHECK_EQ(0, result.a7);
14300 CHECK_EQ(0, result.a8);
14301 CHECK_EQ(0, result.a9);
14302 CHECK_EQ(0, result.a10);
14303 CHECK_EQ(0, result.a11);
14304 CHECK_EQ(0, result.a12);
14305 CHECK_EQ(0, result.a13);
14306 CHECK_EQ(0, result.a14);
14307 CHECK_EQ(0, result.a15);
14308 CHECK_EQ(0, result.a16);
14309 CHECK_EQ(0, result.a17);
14310 CHECK_EQ(0, result.a18);
14311 CHECK_EQ(0, result.a19);
14312 CHECK_EQ(0, result.a20);
14313 CHECK_EQ(0, result.a21);
14314 CHECK_EQ(0, result.a22);
14315 CHECK_EQ(0, result.a23);
14316 CHECK_EQ(0, result.a24);
14317 CHECK_EQ(0, result.a25);
14318 CHECK_EQ(0, result.a26);
14319 CHECK_EQ(0, result.a27);
14320 CHECK_EQ(0, result.a28);
14321 CHECK_EQ(0, result.a29);
14322 CHECK_EQ(0, result.a30);
14323 CHECK_EQ(0, result.a31);
14324 CHECK_EQ(0, result.a32);
14325 CHECK_EQ(0, result.a33);
14326 CHECK_EQ(0, result.a34);
14327 CHECK_EQ(0, result.a35);
14328 CHECK_EQ(0, result.a36);
14329 CHECK_EQ(0, result.a37);
14330 CHECK_EQ(0, result.a38);
14331 CHECK_EQ(0, result.a39);
14332 CHECK_EQ(0, result.a40);
14333 CHECK_EQ(0, result.a41);
14334 CHECK_EQ(0, result.a42);
14335 CHECK_EQ(0, result.a43);
14336 CHECK_EQ(0, result.a44);
14337 CHECK_EQ(0, result.a45);
14338 CHECK_EQ(0, result.a46);
14339 CHECK_EQ(0, result.a47);
14340 CHECK_EQ(0, result.a48);
14341 CHECK_EQ(0, result.a49);
14342 CHECK_EQ(0, result.a50);
14343 CHECK_EQ(0, result.a51);
14344 CHECK_EQ(0, result.a52);
14345 CHECK_EQ(0, result.a53);
14346 CHECK_EQ(0, result.a54);
14347 CHECK_EQ(0, result.a55);
14348 CHECK_EQ(0, result.a56);
14349 CHECK_EQ(0, result.a57);
14350 CHECK_EQ(0, result.a58);
14351 CHECK_EQ(0, result.a59);
14352 CHECK_EQ(0, result.a60);
14353 CHECK_EQ(0, result.a61);
14354 CHECK_EQ(0, result.a62);
14355 CHECK_EQ(0, result.a63);
14356 CHECK_EQ(0, result.a64);
14357 CHECK_EQ(0, result.a65);
14358 CHECK_EQ(0, result.a66);
14359 CHECK_EQ(0, result.a67);
14360 CHECK_EQ(0, result.a68);
14361 CHECK_EQ(0, result.a69);
14362 CHECK_EQ(0, result.a70);
14363 CHECK_EQ(0, result.a71);
14364 CHECK_EQ(0, result.a72);
14365 CHECK_EQ(0, result.a73);
14366 CHECK_EQ(0, result.a74);
14367 CHECK_EQ(0, result.a75);
14368 CHECK_EQ(0, result.a76);
14369 CHECK_EQ(0, result.a77);
14370 CHECK_EQ(0, result.a78);
14371 CHECK_EQ(0, result.a79);
14372 CHECK_EQ(0, result.a80);
14373 CHECK_EQ(0, result.a81);
14374 CHECK_EQ(0, result.a82);
14375 CHECK_EQ(0, result.a83);
14376 CHECK_EQ(0, result.a84);
14377 CHECK_EQ(0, result.a85);
14378 CHECK_EQ(0, result.a86);
14379 CHECK_EQ(0, result.a87);
14380 CHECK_EQ(0, result.a88);
14381 CHECK_EQ(0, result.a89);
14382 CHECK_EQ(0, result.a90);
14383 CHECK_EQ(0, result.a91);
14384 CHECK_EQ(0, result.a92);
14385 CHECK_EQ(0, result.a93);
14386 CHECK_EQ(0, result.a94);
14387 CHECK_EQ(0, result.a95);
14388 CHECK_EQ(0, result.a96);
14389 CHECK_EQ(0, result.a97);
14390 CHECK_EQ(0, result.a98);
14391 CHECK_EQ(0, result.a99);
14392 CHECK_EQ(0, result.a100);
14393 CHECK_EQ(0, result.a101);
14394 CHECK_EQ(0, result.a102);
14395 CHECK_EQ(0, result.a103);
14396 CHECK_EQ(0, result.a104);
14397 CHECK_EQ(0, result.a105);
14398 CHECK_EQ(0, result.a106);
14399 CHECK_EQ(0, result.a107);
14400 CHECK_EQ(0, result.a108);
14401 CHECK_EQ(0, result.a109);
14402 CHECK_EQ(0, result.a110);
14403 CHECK_EQ(0, result.a111);
14404 CHECK_EQ(0, result.a112);
14405 CHECK_EQ(0, result.a113);
14406 CHECK_EQ(0, result.a114);
14407 CHECK_EQ(0, result.a115);
14408 CHECK_EQ(0, result.a116);
14409 CHECK_EQ(0, result.a117);
14410 CHECK_EQ(0, result.a118);
14411 CHECK_EQ(0, result.a119);
14412 CHECK_EQ(0, result.a120);
14413 CHECK_EQ(0, result.a121);
14414 CHECK_EQ(0, result.a122);
14415 CHECK_EQ(0, result.a123);
14416 CHECK_EQ(0, result.a124);
14417 CHECK_EQ(0, result.a125);
14418 CHECK_EQ(0, result.a126);
14419 CHECK_EQ(0, result.a127);
14420
14421 return 0;
14422}
14423
14424// Used for testing structs and unions by value.
14425// Small struct with mis-aligned member.
14427 // NOLINTNEXTLINE(whitespace/parens)
14428 Struct3BytesPackedInt (*f)(int8_t a0, int16_t a1)) {
14429 int8_t a0;
14430 int16_t a1;
14431
14432 a0 = -1;
14433 a1 = 2;
14434
14435 std::cout << "Calling TestReturnStruct3BytesPackedInt(" << "("
14436 << static_cast<int>(a0) << ", " << a1 << ")" << ")\n";
14437
14438 Struct3BytesPackedInt result = f(a0, a1);
14439
14440 std::cout << "result = " << "(" << static_cast<int>(result.a0) << ", "
14441 << result.a1 << ")" << "\n";
14442
14443 CHECK_EQ(a0, result.a0);
14444 CHECK_EQ(a1, result.a1);
14445
14446 // Pass argument that will make the Dart callback throw.
14447 a0 = 42;
14448
14449 result = f(a0, a1);
14450
14451 CHECK_EQ(0, result.a0);
14452 CHECK_EQ(0, result.a1);
14453
14454 // Pass argument that will make the Dart callback return null.
14455 a0 = 84;
14456
14457 result = f(a0, a1);
14458
14459 CHECK_EQ(0, result.a0);
14460 CHECK_EQ(0, result.a1);
14461
14462 return 0;
14463}
14464
14465// Used for testing structs and unions by value.
14466// Struct with mis-aligned member.
14468 // NOLINTNEXTLINE(whitespace/parens)
14470 *f)(uint8_t a0, uint32_t a1, uint8_t a2, uint8_t a3, uint8_t a4)) {
14471 uint8_t a0;
14472 uint32_t a1;
14473 uint8_t a2;
14474 uint8_t a3;
14475 uint8_t a4;
14476
14477 a0 = 1;
14478 a1 = 2;
14479 a2 = 3;
14480 a3 = 4;
14481 a4 = 5;
14482
14483 std::cout << "Calling TestReturnStruct8BytesPackedInt(" << "("
14484 << static_cast<int>(a0) << ", " << a1 << ", "
14485 << static_cast<int>(a2) << ", " << static_cast<int>(a3) << ", "
14486 << static_cast<int>(a4) << ")" << ")\n";
14487
14488 Struct8BytesPackedInt result = f(a0, a1, a2, a3, a4);
14489
14490 std::cout << "result = " << "(" << static_cast<int>(result.a0) << ", "
14491 << result.a1 << ", " << static_cast<int>(result.a2) << ", "
14492 << static_cast<int>(result.a3) << ", "
14493 << static_cast<int>(result.a4) << ")" << "\n";
14494
14495 CHECK_EQ(a0, result.a0);
14496 CHECK_EQ(a1, result.a1);
14497 CHECK_EQ(a2, result.a2);
14498 CHECK_EQ(a3, result.a3);
14499 CHECK_EQ(a4, result.a4);
14500
14501 // Pass argument that will make the Dart callback throw.
14502 a0 = 42;
14503
14504 result = f(a0, a1, a2, a3, a4);
14505
14506 CHECK_EQ(0, result.a0);
14507 CHECK_EQ(0, result.a1);
14508 CHECK_EQ(0, result.a2);
14509 CHECK_EQ(0, result.a3);
14510 CHECK_EQ(0, result.a4);
14511
14512 // Pass argument that will make the Dart callback return null.
14513 a0 = 84;
14514
14515 result = f(a0, a1, a2, a3, a4);
14516
14517 CHECK_EQ(0, result.a0);
14518 CHECK_EQ(0, result.a1);
14519 CHECK_EQ(0, result.a2);
14520 CHECK_EQ(0, result.a3);
14521 CHECK_EQ(0, result.a4);
14522
14523 return 0;
14524}
14525
14526// Used for testing structs and unions by value.
14527// Struct with mis-aligned member.
14528// Tests backfilling of CPU and FPU registers.
14530 // NOLINTNEXTLINE(whitespace/parens)
14531 Struct9BytesPackedMixed (*f)(uint8_t a0, double a1)) {
14532 uint8_t a0;
14533 double a1;
14534
14535 a0 = 1;
14536 a1 = 2.0;
14537
14538 std::cout << "Calling TestReturnStruct9BytesPackedMixed(" << "("
14539 << static_cast<int>(a0) << ", " << a1 << ")" << ")\n";
14540
14541 Struct9BytesPackedMixed result = f(a0, a1);
14542
14543 std::cout << "result = " << "(" << static_cast<int>(result.a0) << ", "
14544 << result.a1 << ")" << "\n";
14545
14546 CHECK_EQ(a0, result.a0);
14547 CHECK_APPROX(a1, result.a1);
14548
14549 // Pass argument that will make the Dart callback throw.
14550 a0 = 42;
14551
14552 result = f(a0, a1);
14553
14554 CHECK_EQ(0, result.a0);
14555 CHECK_APPROX(0.0, result.a1);
14556
14557 // Pass argument that will make the Dart callback return null.
14558 a0 = 84;
14559
14560 result = f(a0, a1);
14561
14562 CHECK_EQ(0, result.a0);
14563 CHECK_APPROX(0.0, result.a1);
14564
14565 return 0;
14566}
14567
14568// Used for testing structs and unions by value.
14569// Returning a mixed integer/float union.
14571 // NOLINTNEXTLINE(whitespace/parens)
14572 Union4BytesMixed (*f)(uint32_t a0)) {
14573 uint32_t a0;
14574
14575 a0 = 1;
14576
14577 std::cout << "Calling TestReturnUnion4BytesMixed(" << "(" << a0 << ")"
14578 << ")\n";
14579
14580 Union4BytesMixed result = f(a0);
14581
14582 std::cout << "result = " << "(" << result.a0 << ")" << "\n";
14583
14584 CHECK_EQ(a0, result.a0);
14585
14586 // Pass argument that will make the Dart callback throw.
14587 a0 = 42;
14588
14589 result = f(a0);
14590
14591 CHECK_EQ(0, result.a0);
14592
14593 // Pass argument that will make the Dart callback return null.
14594 a0 = 84;
14595
14596 result = f(a0);
14597
14598 CHECK_EQ(0, result.a0);
14599
14600 return 0;
14601}
14602
14603// Used for testing structs and unions by value.
14604// Returning a floating point only union.
14606 // NOLINTNEXTLINE(whitespace/parens)
14607 Union8BytesNestedFloat (*f)(double a0)) {
14608 double a0;
14609
14610 a0 = -1.0;
14611
14612 std::cout << "Calling TestReturnUnion8BytesNestedFloat(" << "(" << a0 << ")"
14613 << ")\n";
14614
14616
14617 std::cout << "result = " << "(" << result.a0 << ")" << "\n";
14618
14619 CHECK_APPROX(a0, result.a0);
14620
14621 // Pass argument that will make the Dart callback throw.
14622 a0 = 42;
14623
14624 result = f(a0);
14625
14626 CHECK_APPROX(0.0, result.a0);
14627
14628 // Pass argument that will make the Dart callback return null.
14629 a0 = 84;
14630
14631 result = f(a0);
14632
14633 CHECK_APPROX(0.0, result.a0);
14634
14635 return 0;
14636}
14637
14638// Used for testing structs and unions by value.
14639// Returning a mixed-size union.
14641 // NOLINTNEXTLINE(whitespace/parens)
14643 Struct8BytesInt a0 = {};
14644
14645 a0.a0 = -1;
14646 a0.a1 = 2;
14647 a0.a2 = -3;
14648
14649 std::cout << "Calling TestReturnUnion9BytesNestedInt(" << "((" << a0.a0
14650 << ", " << a0.a1 << ", " << a0.a2 << "))" << ")\n";
14651
14653
14654 std::cout << "result = " << "((" << result.a0.a0 << ", " << result.a0.a1
14655 << ", " << result.a0.a2 << "))" << "\n";
14656
14657 CHECK_EQ(a0.a0, result.a0.a0);
14658 CHECK_EQ(a0.a1, result.a0.a1);
14659 CHECK_EQ(a0.a2, result.a0.a2);
14660
14661 // Pass argument that will make the Dart callback throw.
14662 a0.a0 = 42;
14663
14664 result = f(a0);
14665
14666 CHECK_EQ(0, result.a0.a0);
14667 CHECK_EQ(0, result.a0.a1);
14668 CHECK_EQ(0, result.a0.a2);
14669
14670 // Pass argument that will make the Dart callback return null.
14671 a0.a0 = 84;
14672
14673 result = f(a0);
14674
14675 CHECK_EQ(0, result.a0.a0);
14676 CHECK_EQ(0, result.a0.a1);
14677 CHECK_EQ(0, result.a0.a2);
14678
14679 return 0;
14680}
14681
14682// Used for testing structs and unions by value.
14683// Returning union with homogenous floats.
14685 // NOLINTNEXTLINE(whitespace/parens)
14688
14689 a0.a0 = -1.0;
14690 a0.a1 = 2.0;
14691
14692 std::cout << "Calling TestReturnUnion16BytesNestedFloat(" << "((" << a0.a0
14693 << ", " << a0.a1 << "))" << ")\n";
14694
14696
14697 std::cout << "result = " << "((" << result.a0.a0 << ", " << result.a0.a1
14698 << "))" << "\n";
14699
14700 CHECK_APPROX(a0.a0, result.a0.a0);
14701 CHECK_APPROX(a0.a1, result.a0.a1);
14702
14703 // Pass argument that will make the Dart callback throw.
14704 a0.a0 = 42;
14705
14706 result = f(a0);
14707
14708 CHECK_APPROX(0.0, result.a0.a0);
14709 CHECK_APPROX(0.0, result.a0.a1);
14710
14711 // Pass argument that will make the Dart callback return null.
14712 a0.a0 = 84;
14713
14714 result = f(a0);
14715
14716 CHECK_APPROX(0.0, result.a0.a0);
14717 CHECK_APPROX(0.0, result.a0.a1);
14718
14719 return 0;
14720}
14721
14722// Used for testing structs and unions by value.
14723// Test that a struct passed in as argument can be returned.
14724// Especially for ffi callbacks.
14725// Struct is passed in int registers in most ABIs.
14727 // NOLINTNEXTLINE(whitespace/parens)
14728 Struct1ByteInt (*f)(Struct1ByteInt a0)) {
14729 Struct1ByteInt a0 = {};
14730
14731 a0.a0 = -1;
14732
14733 std::cout << "Calling TestReturnStructArgumentStruct1ByteInt(" << "(("
14734 << static_cast<int>(a0.a0) << "))" << ")\n";
14735
14736 Struct1ByteInt result = f(a0);
14737
14738 std::cout << "result = " << "(" << static_cast<int>(result.a0) << ")" << "\n";
14739
14740 CHECK_EQ(a0.a0, result.a0);
14741
14742 // Pass argument that will make the Dart callback throw.
14743 a0.a0 = 42;
14744
14745 result = f(a0);
14746
14747 CHECK_EQ(0, result.a0);
14748
14749 // Pass argument that will make the Dart callback return null.
14750 a0.a0 = 84;
14751
14752 result = f(a0);
14753
14754 CHECK_EQ(0, result.a0);
14755
14756 return 0;
14757}
14758
14759// Used for testing structs and unions by value.
14760// Test that a struct passed in as argument can be returned.
14761// Especially for ffi callbacks.
14762// Struct is passed on stack on all ABIs.
14764 // NOLINTNEXTLINE(whitespace/parens)
14765 Struct1ByteInt (*f)(int32_t a0,
14766 int32_t a1,
14767 int32_t a2,
14768 int32_t a3,
14769 int32_t a4,
14770 int32_t a5,
14771 int32_t a6,
14772 int32_t a7,
14773 Struct1ByteInt a8)) {
14774 int32_t a0;
14775 int32_t a1;
14776 int32_t a2;
14777 int32_t a3;
14778 int32_t a4;
14779 int32_t a5;
14780 int32_t a6;
14781 int32_t a7;
14782 Struct1ByteInt a8 = {};
14783
14784 a0 = -1;
14785 a1 = 2;
14786 a2 = -3;
14787 a3 = 4;
14788 a4 = -5;
14789 a5 = 6;
14790 a6 = -7;
14791 a7 = 8;
14792 a8.a0 = -9;
14793
14794 std::cout << "Calling TestReturnStructArgumentInt32x8Struct1ByteInt(" << "("
14795 << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
14796 << ", " << a5 << ", " << a6 << ", " << a7 << ", ("
14797 << static_cast<int>(a8.a0) << "))" << ")\n";
14798
14799 Struct1ByteInt result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
14800
14801 std::cout << "result = " << "(" << static_cast<int>(result.a0) << ")" << "\n";
14802
14803 CHECK_EQ(a8.a0, result.a0);
14804
14805 // Pass argument that will make the Dart callback throw.
14806 a0 = 42;
14807
14808 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
14809
14810 CHECK_EQ(0, result.a0);
14811
14812 // Pass argument that will make the Dart callback return null.
14813 a0 = 84;
14814
14815 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
14816
14817 CHECK_EQ(0, result.a0);
14818
14819 return 0;
14820}
14821
14822// Used for testing structs and unions by value.
14823// Test that a struct passed in as argument can be returned.
14824// Especially for ffi callbacks.
14825// Struct is passed in float registers in most ABIs.
14827 // NOLINTNEXTLINE(whitespace/parens)
14830
14831 a0.a0 = -1.0;
14832 a0.a1 = 2.0;
14833
14834 std::cout << "Calling TestReturnStructArgumentStruct8BytesHomogeneousFloat("
14835 << "((" << a0.a0 << ", " << a0.a1 << "))" << ")\n";
14836
14838
14839 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ")"
14840 << "\n";
14841
14842 CHECK_APPROX(a0.a0, result.a0);
14843 CHECK_APPROX(a0.a1, result.a1);
14844
14845 // Pass argument that will make the Dart callback throw.
14846 a0.a0 = 42;
14847
14848 result = f(a0);
14849
14850 CHECK_APPROX(0.0, result.a0);
14851 CHECK_APPROX(0.0, result.a1);
14852
14853 // Pass argument that will make the Dart callback return null.
14854 a0.a0 = 84;
14855
14856 result = f(a0);
14857
14858 CHECK_APPROX(0.0, result.a0);
14859 CHECK_APPROX(0.0, result.a1);
14860
14861 return 0;
14862}
14863
14864// Used for testing structs and unions by value.
14865// On arm64, both argument and return value are passed in by pointer.
14867 // NOLINTNEXTLINE(whitespace/parens)
14870
14871 a0.a0 = -1;
14872 a0.a1 = 2;
14873 a0.a2 = -3;
14874 a0.a3 = 4;
14875 a0.a4 = -5;
14876
14877 std::cout << "Calling TestReturnStructArgumentStruct20BytesHomogeneousInt32("
14878 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
14879 << ", " << a0.a4 << "))" << ")\n";
14880
14882
14883 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ", "
14884 << result.a2 << ", " << result.a3 << ", " << result.a4 << ")"
14885 << "\n";
14886
14887 CHECK_EQ(a0.a0, result.a0);
14888 CHECK_EQ(a0.a1, result.a1);
14889 CHECK_EQ(a0.a2, result.a2);
14890 CHECK_EQ(a0.a3, result.a3);
14891 CHECK_EQ(a0.a4, result.a4);
14892
14893 // Pass argument that will make the Dart callback throw.
14894 a0.a0 = 42;
14895
14896 result = f(a0);
14897
14898 CHECK_EQ(0, result.a0);
14899 CHECK_EQ(0, result.a1);
14900 CHECK_EQ(0, result.a2);
14901 CHECK_EQ(0, result.a3);
14902 CHECK_EQ(0, result.a4);
14903
14904 // Pass argument that will make the Dart callback return null.
14905 a0.a0 = 84;
14906
14907 result = f(a0);
14908
14909 CHECK_EQ(0, result.a0);
14910 CHECK_EQ(0, result.a1);
14911 CHECK_EQ(0, result.a2);
14912 CHECK_EQ(0, result.a3);
14913 CHECK_EQ(0, result.a4);
14914
14915 return 0;
14916}
14917
14918// Used for testing structs and unions by value.
14919// On arm64, both argument and return value are passed in by pointer.
14920// Ints exhaust registers, so that pointer is passed on stack.
14922 // NOLINTNEXTLINE(whitespace/parens)
14923 Struct20BytesHomogeneousInt32 (*f)(int32_t a0,
14924 int32_t a1,
14925 int32_t a2,
14926 int32_t a3,
14927 int32_t a4,
14928 int32_t a5,
14929 int32_t a6,
14930 int32_t a7,
14932 int32_t a0;
14933 int32_t a1;
14934 int32_t a2;
14935 int32_t a3;
14936 int32_t a4;
14937 int32_t a5;
14938 int32_t a6;
14939 int32_t a7;
14941
14942 a0 = -1;
14943 a1 = 2;
14944 a2 = -3;
14945 a3 = 4;
14946 a4 = -5;
14947 a5 = 6;
14948 a6 = -7;
14949 a7 = 8;
14950 a8.a0 = -9;
14951 a8.a1 = 10;
14952 a8.a2 = -11;
14953 a8.a3 = 12;
14954 a8.a4 = -13;
14955
14956 std::cout << "Calling TestReturnStructArgumentInt32x8Struct20BytesHomogeneou("
14957 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
14958 << ", " << a5 << ", " << a6 << ", " << a7 << ", (" << a8.a0 << ", "
14959 << a8.a1 << ", " << a8.a2 << ", " << a8.a3 << ", " << a8.a4 << "))"
14960 << ")\n";
14961
14962 Struct20BytesHomogeneousInt32 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
14963
14964 std::cout << "result = " << "(" << result.a0 << ", " << result.a1 << ", "
14965 << result.a2 << ", " << result.a3 << ", " << result.a4 << ")"
14966 << "\n";
14967
14968 CHECK_EQ(a8.a0, result.a0);
14969 CHECK_EQ(a8.a1, result.a1);
14970 CHECK_EQ(a8.a2, result.a2);
14971 CHECK_EQ(a8.a3, result.a3);
14972 CHECK_EQ(a8.a4, result.a4);
14973
14974 // Pass argument that will make the Dart callback throw.
14975 a0 = 42;
14976
14977 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
14978
14979 CHECK_EQ(0, result.a0);
14980 CHECK_EQ(0, result.a1);
14981 CHECK_EQ(0, result.a2);
14982 CHECK_EQ(0, result.a3);
14983 CHECK_EQ(0, result.a4);
14984
14985 // Pass argument that will make the Dart callback return null.
14986 a0 = 84;
14987
14988 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
14989
14990 CHECK_EQ(0, result.a0);
14991 CHECK_EQ(0, result.a1);
14992 CHECK_EQ(0, result.a2);
14993 CHECK_EQ(0, result.a3);
14994 CHECK_EQ(0, result.a4);
14995
14996 return 0;
14997}
14998
14999// Used for testing structs and unions by value.
15000// Test returning struct with inline array.
15002 // NOLINTNEXTLINE(whitespace/parens)
15005
15006 a0.a0[0] = 1;
15007 a0.a0[1] = 2;
15008 a0.a0[2] = 3;
15009 a0.a0[3] = 4;
15010 a0.a0[4] = 5;
15011 a0.a0[5] = 6;
15012 a0.a0[6] = 7;
15013 a0.a0[7] = 8;
15014
15015 std::cout << "Calling TestReturnStructArgumentStruct8BytesInlineArrayInt("
15016 << "(([" << static_cast<int>(a0.a0[0]) << ", "
15017 << static_cast<int>(a0.a0[1]) << ", " << static_cast<int>(a0.a0[2])
15018 << ", " << static_cast<int>(a0.a0[3]) << ", "
15019 << static_cast<int>(a0.a0[4]) << ", " << static_cast<int>(a0.a0[5])
15020 << ", " << static_cast<int>(a0.a0[6]) << ", "
15021 << static_cast<int>(a0.a0[7]) << "]))" << ")\n";
15022
15024
15025 std::cout << "result = " << "([" << static_cast<int>(result.a0[0]) << ", "
15026 << static_cast<int>(result.a0[1]) << ", "
15027 << static_cast<int>(result.a0[2]) << ", "
15028 << static_cast<int>(result.a0[3]) << ", "
15029 << static_cast<int>(result.a0[4]) << ", "
15030 << static_cast<int>(result.a0[5]) << ", "
15031 << static_cast<int>(result.a0[6]) << ", "
15032 << static_cast<int>(result.a0[7]) << "])" << "\n";
15033
15034 for (intptr_t i = 0; i < 8; i++) {
15035 CHECK_EQ(a0.a0[i], result.a0[i]);
15036 }
15037
15038 // Pass argument that will make the Dart callback throw.
15039 a0.a0[0] = 42;
15040
15041 result = f(a0);
15042
15043 for (intptr_t i = 0; i < 8; i++) {
15044 CHECK_EQ(0, result.a0[i]);
15045 }
15046
15047 // Pass argument that will make the Dart callback return null.
15048 a0.a0[0] = 84;
15049
15050 result = f(a0);
15051
15052 for (intptr_t i = 0; i < 8; i++) {
15053 CHECK_EQ(0, result.a0[i]);
15054 }
15055
15056 return 0;
15057}
15058
15059// Used for testing structs and unions by value.
15060// Return value in FPU registers on arm hardfp and arm64.
15062 // NOLINTNEXTLINE(whitespace/parens)
15066
15067 a0.a0.a0 = -1.0;
15068 a0.a1[0].a0 = 2.0;
15069 a0.a1[1].a0 = -3.0;
15070 a0.a2 = 4.0;
15071
15072 std::cout << "Calling TestReturnStructArgumentStructStruct16BytesHomogeneous("
15073 << "(((" << a0.a0.a0 << "), [(" << a0.a1[0].a0 << "), ("
15074 << a0.a1[1].a0 << ")], " << a0.a2 << "))" << ")\n";
15075
15077
15078 std::cout << "result = " << "((" << result.a0.a0 << "), [(" << result.a1[0].a0
15079 << "), (" << result.a1[1].a0 << ")], " << result.a2 << ")" << "\n";
15080
15081 CHECK_APPROX(a0.a0.a0, result.a0.a0);
15082 for (intptr_t i = 0; i < 2; i++) {
15083 CHECK_APPROX(a0.a1[i].a0, result.a1[i].a0);
15084 }
15085 CHECK_APPROX(a0.a2, result.a2);
15086
15087 // Pass argument that will make the Dart callback throw.
15088 a0.a0.a0 = 42;
15089
15090 result = f(a0);
15091
15092 CHECK_APPROX(0.0, result.a0.a0);
15093 for (intptr_t i = 0; i < 2; i++) {
15094 CHECK_APPROX(0.0, result.a1[i].a0);
15095 }
15096 CHECK_APPROX(0.0, result.a2);
15097
15098 // Pass argument that will make the Dart callback return null.
15099 a0.a0.a0 = 84;
15100
15101 result = f(a0);
15102
15103 CHECK_APPROX(0.0, result.a0.a0);
15104 for (intptr_t i = 0; i < 2; i++) {
15105 CHECK_APPROX(0.0, result.a1[i].a0);
15106 }
15107 CHECK_APPROX(0.0, result.a2);
15108
15109 return 0;
15110}
15111
15112// Used for testing structs and unions by value.
15113// Return value in FPU registers on arm64.
15115 // NOLINTNEXTLINE(whitespace/parens)
15119
15120 a0.a0.a0 = -1.0;
15121 a0.a1[0].a0 = 2.0;
15122 a0.a1[1].a0 = -3.0;
15123 a0.a2 = 4.0;
15124
15125 std::cout << "Calling TestReturnStructArgumentStructStruct32BytesHomogeneous("
15126 << "(((" << a0.a0.a0 << "), [(" << a0.a1[0].a0 << "), ("
15127 << a0.a1[1].a0 << ")], " << a0.a2 << "))" << ")\n";
15128
15130
15131 std::cout << "result = " << "((" << result.a0.a0 << "), [(" << result.a1[0].a0
15132 << "), (" << result.a1[1].a0 << ")], " << result.a2 << ")" << "\n";
15133
15134 CHECK_APPROX(a0.a0.a0, result.a0.a0);
15135 for (intptr_t i = 0; i < 2; i++) {
15136 CHECK_APPROX(a0.a1[i].a0, result.a1[i].a0);
15137 }
15138 CHECK_APPROX(a0.a2, result.a2);
15139
15140 // Pass argument that will make the Dart callback throw.
15141 a0.a0.a0 = 42;
15142
15143 result = f(a0);
15144
15145 CHECK_APPROX(0.0, result.a0.a0);
15146 for (intptr_t i = 0; i < 2; i++) {
15147 CHECK_APPROX(0.0, result.a1[i].a0);
15148 }
15149 CHECK_APPROX(0.0, result.a2);
15150
15151 // Pass argument that will make the Dart callback return null.
15152 a0.a0.a0 = 84;
15153
15154 result = f(a0);
15155
15156 CHECK_APPROX(0.0, result.a0.a0);
15157 for (intptr_t i = 0; i < 2; i++) {
15158 CHECK_APPROX(0.0, result.a1[i].a0);
15159 }
15160 CHECK_APPROX(0.0, result.a2);
15161
15162 return 0;
15163}
15164
15165// Used for testing structs and unions by value.
15166// On x64 Linux, return value is split over FP and int registers.
15168 // NOLINTNEXTLINE(whitespace/parens)
15171
15172 a0.a0.a0 = -1.0;
15173 a0.a1[0].a0 = 2.0;
15174 a0.a1[0].a1 = -3;
15175 a0.a1[0].a2 = 4;
15176 a0.a2[0] = -5;
15177 a0.a2[1] = 6;
15178
15179 std::cout << "Calling TestReturnStructArgumentStructStruct16BytesMixed3("
15180 << "(((" << a0.a0.a0 << "), [(" << a0.a1[0].a0 << ", "
15181 << a0.a1[0].a1 << ", " << a0.a1[0].a2 << ")], [" << a0.a2[0] << ", "
15182 << a0.a2[1] << "]))" << ")\n";
15183
15185
15186 std::cout << "result = " << "((" << result.a0.a0 << "), [(" << result.a1[0].a0
15187 << ", " << result.a1[0].a1 << ", " << result.a1[0].a2 << ")], ["
15188 << result.a2[0] << ", " << result.a2[1] << "])" << "\n";
15189
15190 CHECK_APPROX(a0.a0.a0, result.a0.a0);
15191 for (intptr_t i = 0; i < 1; i++) {
15192 CHECK_APPROX(a0.a1[i].a0, result.a1[i].a0);
15193 CHECK_EQ(a0.a1[i].a1, result.a1[i].a1);
15194 CHECK_EQ(a0.a1[i].a2, result.a1[i].a2);
15195 }
15196 for (intptr_t i = 0; i < 2; i++) {
15197 CHECK_EQ(a0.a2[i], result.a2[i]);
15198 }
15199
15200 // Pass argument that will make the Dart callback throw.
15201 a0.a0.a0 = 42;
15202
15203 result = f(a0);
15204
15205 CHECK_APPROX(0.0, result.a0.a0);
15206 for (intptr_t i = 0; i < 1; i++) {
15207 CHECK_APPROX(0.0, result.a1[i].a0);
15208 CHECK_EQ(0, result.a1[i].a1);
15209 CHECK_EQ(0, result.a1[i].a2);
15210 }
15211 for (intptr_t i = 0; i < 2; i++) {
15212 CHECK_EQ(0, result.a2[i]);
15213 }
15214
15215 // Pass argument that will make the Dart callback return null.
15216 a0.a0.a0 = 84;
15217
15218 result = f(a0);
15219
15220 CHECK_APPROX(0.0, result.a0.a0);
15221 for (intptr_t i = 0; i < 1; i++) {
15222 CHECK_APPROX(0.0, result.a1[i].a0);
15223 CHECK_EQ(0, result.a1[i].a1);
15224 CHECK_EQ(0, result.a1[i].a2);
15225 }
15226 for (intptr_t i = 0; i < 2; i++) {
15227 CHECK_EQ(0, result.a2[i]);
15228 }
15229
15230 return 0;
15231}
15232
15233// Used for testing structs and unions by value.
15234// Test alignment and padding of 16 byte int within struct.
15236 // NOLINTNEXTLINE(whitespace/parens)
15237 StructAlignmentInt16 (*f)(int8_t a0, int16_t a1, int8_t a2)) {
15238 int8_t a0;
15239 int16_t a1;
15240 int8_t a2;
15241
15242 a0 = -1;
15243 a1 = 2;
15244 a2 = -3;
15245
15246 std::cout << "Calling TestReturnStructAlignmentInt16(" << "("
15247 << static_cast<int>(a0) << ", " << a1 << ", "
15248 << static_cast<int>(a2) << ")" << ")\n";
15249
15250 StructAlignmentInt16 result = f(a0, a1, a2);
15251
15252 std::cout << "result = " << "(" << static_cast<int>(result.a0) << ", "
15253 << result.a1 << ", " << static_cast<int>(result.a2) << ")" << "\n";
15254
15255 CHECK_EQ(a0, result.a0);
15256 CHECK_EQ(a1, result.a1);
15257 CHECK_EQ(a2, result.a2);
15258
15259 // Pass argument that will make the Dart callback throw.
15260 a0 = 42;
15261
15262 result = f(a0, a1, a2);
15263
15264 CHECK_EQ(0, result.a0);
15265 CHECK_EQ(0, result.a1);
15266 CHECK_EQ(0, result.a2);
15267
15268 // Pass argument that will make the Dart callback return null.
15269 a0 = 84;
15270
15271 result = f(a0, a1, a2);
15272
15273 CHECK_EQ(0, result.a0);
15274 CHECK_EQ(0, result.a1);
15275 CHECK_EQ(0, result.a2);
15276
15277 return 0;
15278}
15279
15280// Used for testing structs and unions by value.
15281// Test alignment and padding of 32 byte int within struct.
15283 // NOLINTNEXTLINE(whitespace/parens)
15284 StructAlignmentInt32 (*f)(int8_t a0, int32_t a1, int8_t a2)) {
15285 int8_t a0;
15286 int32_t a1;
15287 int8_t a2;
15288
15289 a0 = -1;
15290 a1 = 2;
15291 a2 = -3;
15292
15293 std::cout << "Calling TestReturnStructAlignmentInt32(" << "("
15294 << static_cast<int>(a0) << ", " << a1 << ", "
15295 << static_cast<int>(a2) << ")" << ")\n";
15296
15297 StructAlignmentInt32 result = f(a0, a1, a2);
15298
15299 std::cout << "result = " << "(" << static_cast<int>(result.a0) << ", "
15300 << result.a1 << ", " << static_cast<int>(result.a2) << ")" << "\n";
15301
15302 CHECK_EQ(a0, result.a0);
15303 CHECK_EQ(a1, result.a1);
15304 CHECK_EQ(a2, result.a2);
15305
15306 // Pass argument that will make the Dart callback throw.
15307 a0 = 42;
15308
15309 result = f(a0, a1, a2);
15310
15311 CHECK_EQ(0, result.a0);
15312 CHECK_EQ(0, result.a1);
15313 CHECK_EQ(0, result.a2);
15314
15315 // Pass argument that will make the Dart callback return null.
15316 a0 = 84;
15317
15318 result = f(a0, a1, a2);
15319
15320 CHECK_EQ(0, result.a0);
15321 CHECK_EQ(0, result.a1);
15322 CHECK_EQ(0, result.a2);
15323
15324 return 0;
15325}
15326
15327// Used for testing structs and unions by value.
15328// Test alignment and padding of 64 byte int within struct.
15330 // NOLINTNEXTLINE(whitespace/parens)
15331 StructAlignmentInt64 (*f)(int8_t a0, int64_t a1, int8_t a2)) {
15332 int8_t a0;
15333 int64_t a1;
15334 int8_t a2;
15335
15336 a0 = -1;
15337 a1 = 2;
15338 a2 = -3;
15339
15340 std::cout << "Calling TestReturnStructAlignmentInt64(" << "("
15341 << static_cast<int>(a0) << ", " << a1 << ", "
15342 << static_cast<int>(a2) << ")" << ")\n";
15343
15344 StructAlignmentInt64 result = f(a0, a1, a2);
15345
15346 std::cout << "result = " << "(" << static_cast<int>(result.a0) << ", "
15347 << result.a1 << ", " << static_cast<int>(result.a2) << ")" << "\n";
15348
15349 CHECK_EQ(a0, result.a0);
15350 CHECK_EQ(a1, result.a1);
15351 CHECK_EQ(a2, result.a2);
15352
15353 // Pass argument that will make the Dart callback throw.
15354 a0 = 42;
15355
15356 result = f(a0, a1, a2);
15357
15358 CHECK_EQ(0, result.a0);
15359 CHECK_EQ(0, result.a1);
15360 CHECK_EQ(0, result.a2);
15361
15362 // Pass argument that will make the Dart callback return null.
15363 a0 = 84;
15364
15365 result = f(a0, a1, a2);
15366
15367 CHECK_EQ(0, result.a0);
15368 CHECK_EQ(0, result.a1);
15369 CHECK_EQ(0, result.a2);
15370
15371 return 0;
15372}
15373
15374// Used for testing structs and unions by value.
15375// Simple nested struct.
15377 // NOLINTNEXTLINE(whitespace/parens)
15382
15383 a0.a0 = -1;
15384 a0.a1 = 2;
15385 a1.a0 = -3;
15386 a1.a1 = 4;
15387
15388 std::cout << "Calling TestReturnStruct8BytesNestedInt(" << "((" << a0.a0
15389 << ", " << a0.a1 << "), (" << a1.a0 << ", " << a1.a1 << "))"
15390 << ")\n";
15391
15392 Struct8BytesNestedInt result = f(a0, a1);
15393
15394 std::cout << "result = " << "((" << result.a0.a0 << ", " << result.a0.a1
15395 << "), (" << result.a1.a0 << ", " << result.a1.a1 << "))" << "\n";
15396
15397 CHECK_EQ(a0.a0, result.a0.a0);
15398 CHECK_EQ(a0.a1, result.a0.a1);
15399 CHECK_EQ(a1.a0, result.a1.a0);
15400 CHECK_EQ(a1.a1, result.a1.a1);
15401
15402 // Pass argument that will make the Dart callback throw.
15403 a0.a0 = 42;
15404
15405 result = f(a0, a1);
15406
15407 CHECK_EQ(0, result.a0.a0);
15408 CHECK_EQ(0, result.a0.a1);
15409 CHECK_EQ(0, result.a1.a0);
15410 CHECK_EQ(0, result.a1.a1);
15411
15412 // Pass argument that will make the Dart callback return null.
15413 a0.a0 = 84;
15414
15415 result = f(a0, a1);
15416
15417 CHECK_EQ(0, result.a0.a0);
15418 CHECK_EQ(0, result.a0.a1);
15419 CHECK_EQ(0, result.a1.a0);
15420 CHECK_EQ(0, result.a1.a1);
15421
15422 return 0;
15423}
15424
15425// Used for testing structs and unions by value.
15426// Simple nested struct with floats.
15428 // NOLINTNEXTLINE(whitespace/parens)
15430 Struct4BytesFloat a0 = {};
15431 Struct4BytesFloat a1 = {};
15432
15433 a0.a0 = -1.0;
15434 a1.a0 = 2.0;
15435
15436 std::cout << "Calling TestReturnStruct8BytesNestedFloat(" << "((" << a0.a0
15437 << "), (" << a1.a0 << "))" << ")\n";
15438
15439 Struct8BytesNestedFloat result = f(a0, a1);
15440
15441 std::cout << "result = " << "((" << result.a0.a0 << "), (" << result.a1.a0
15442 << "))" << "\n";
15443
15444 CHECK_APPROX(a0.a0, result.a0.a0);
15445 CHECK_APPROX(a1.a0, result.a1.a0);
15446
15447 // Pass argument that will make the Dart callback throw.
15448 a0.a0 = 42;
15449
15450 result = f(a0, a1);
15451
15452 CHECK_APPROX(0.0, result.a0.a0);
15453 CHECK_APPROX(0.0, result.a1.a0);
15454
15455 // Pass argument that will make the Dart callback return null.
15456 a0.a0 = 84;
15457
15458 result = f(a0, a1);
15459
15460 CHECK_APPROX(0.0, result.a0.a0);
15461 CHECK_APPROX(0.0, result.a1.a0);
15462
15463 return 0;
15464}
15465
15466// Used for testing structs and unions by value.
15467// The nesting is irregular, testing homogenous float rules on arm and arm64,
15468// and the fpu register usage on x64.
15470 // NOLINTNEXTLINE(whitespace/parens)
15471 Struct8BytesNestedFloat2 (*f)(Struct4BytesFloat a0, float a1)) {
15472 Struct4BytesFloat a0 = {};
15473 float a1;
15474
15475 a0.a0 = -1.0;
15476 a1 = 2.0;
15477
15478 std::cout << "Calling TestReturnStruct8BytesNestedFloat2(" << "((" << a0.a0
15479 << "), " << a1 << ")" << ")\n";
15480
15481 Struct8BytesNestedFloat2 result = f(a0, a1);
15482
15483 std::cout << "result = " << "((" << result.a0.a0 << "), " << result.a1 << ")"
15484 << "\n";
15485
15486 CHECK_APPROX(a0.a0, result.a0.a0);
15487 CHECK_APPROX(a1, result.a1);
15488
15489 // Pass argument that will make the Dart callback throw.
15490 a0.a0 = 42;
15491
15492 result = f(a0, a1);
15493
15494 CHECK_APPROX(0.0, result.a0.a0);
15495 CHECK_APPROX(0.0, result.a1);
15496
15497 // Pass argument that will make the Dart callback return null.
15498 a0.a0 = 84;
15499
15500 result = f(a0, a1);
15501
15502 CHECK_APPROX(0.0, result.a0.a0);
15503 CHECK_APPROX(0.0, result.a1);
15504
15505 return 0;
15506}
15507
15508// Used for testing structs and unions by value.
15509// Simple nested struct with mixed members.
15511 // NOLINTNEXTLINE(whitespace/parens)
15513 Struct4BytesFloat a1)) {
15515 Struct4BytesFloat a1 = {};
15516
15517 a0.a0 = -1;
15518 a0.a1 = 2;
15519 a1.a0 = -3.0;
15520
15521 std::cout << "Calling TestReturnStruct8BytesNestedMixed(" << "((" << a0.a0
15522 << ", " << a0.a1 << "), (" << a1.a0 << "))" << ")\n";
15523
15524 Struct8BytesNestedMixed result = f(a0, a1);
15525
15526 std::cout << "result = " << "((" << result.a0.a0 << ", " << result.a0.a1
15527 << "), (" << result.a1.a0 << "))" << "\n";
15528
15529 CHECK_EQ(a0.a0, result.a0.a0);
15530 CHECK_EQ(a0.a1, result.a0.a1);
15531 CHECK_APPROX(a1.a0, result.a1.a0);
15532
15533 // Pass argument that will make the Dart callback throw.
15534 a0.a0 = 42;
15535
15536 result = f(a0, a1);
15537
15538 CHECK_EQ(0, result.a0.a0);
15539 CHECK_EQ(0, result.a0.a1);
15540 CHECK_APPROX(0.0, result.a1.a0);
15541
15542 // Pass argument that will make the Dart callback return null.
15543 a0.a0 = 84;
15544
15545 result = f(a0, a1);
15546
15547 CHECK_EQ(0, result.a0.a0);
15548 CHECK_EQ(0, result.a0.a1);
15549 CHECK_APPROX(0.0, result.a1.a0);
15550
15551 return 0;
15552}
15553
15554// Used for testing structs and unions by value.
15555// Deeper nested struct to test recursive member access.
15557 // NOLINTNEXTLINE(whitespace/parens)
15560 Struct8BytesNestedInt a0 = {};
15561 Struct8BytesNestedInt a1 = {};
15562
15563 a0.a0.a0 = -1;
15564 a0.a0.a1 = 2;
15565 a0.a1.a0 = -3;
15566 a0.a1.a1 = 4;
15567 a1.a0.a0 = -5;
15568 a1.a0.a1 = 6;
15569 a1.a1.a0 = -7;
15570 a1.a1.a1 = 8;
15571
15572 std::cout << "Calling TestReturnStruct16BytesNestedInt(" << "(((" << a0.a0.a0
15573 << ", " << a0.a0.a1 << "), (" << a0.a1.a0 << ", " << a0.a1.a1
15574 << ")), ((" << a1.a0.a0 << ", " << a1.a0.a1 << "), (" << a1.a1.a0
15575 << ", " << a1.a1.a1 << ")))" << ")\n";
15576
15577 Struct16BytesNestedInt result = f(a0, a1);
15578
15579 std::cout << "result = " << "(((" << result.a0.a0.a0 << ", "
15580 << result.a0.a0.a1 << "), (" << result.a0.a1.a0 << ", "
15581 << result.a0.a1.a1 << ")), ((" << result.a1.a0.a0 << ", "
15582 << result.a1.a0.a1 << "), (" << result.a1.a1.a0 << ", "
15583 << result.a1.a1.a1 << ")))" << "\n";
15584
15585 CHECK_EQ(a0.a0.a0, result.a0.a0.a0);
15586 CHECK_EQ(a0.a0.a1, result.a0.a0.a1);
15587 CHECK_EQ(a0.a1.a0, result.a0.a1.a0);
15588 CHECK_EQ(a0.a1.a1, result.a0.a1.a1);
15589 CHECK_EQ(a1.a0.a0, result.a1.a0.a0);
15590 CHECK_EQ(a1.a0.a1, result.a1.a0.a1);
15591 CHECK_EQ(a1.a1.a0, result.a1.a1.a0);
15592 CHECK_EQ(a1.a1.a1, result.a1.a1.a1);
15593
15594 // Pass argument that will make the Dart callback throw.
15595 a0.a0.a0 = 42;
15596
15597 result = f(a0, a1);
15598
15599 CHECK_EQ(0, result.a0.a0.a0);
15600 CHECK_EQ(0, result.a0.a0.a1);
15601 CHECK_EQ(0, result.a0.a1.a0);
15602 CHECK_EQ(0, result.a0.a1.a1);
15603 CHECK_EQ(0, result.a1.a0.a0);
15604 CHECK_EQ(0, result.a1.a0.a1);
15605 CHECK_EQ(0, result.a1.a1.a0);
15606 CHECK_EQ(0, result.a1.a1.a1);
15607
15608 // Pass argument that will make the Dart callback return null.
15609 a0.a0.a0 = 84;
15610
15611 result = f(a0, a1);
15612
15613 CHECK_EQ(0, result.a0.a0.a0);
15614 CHECK_EQ(0, result.a0.a0.a1);
15615 CHECK_EQ(0, result.a0.a1.a0);
15616 CHECK_EQ(0, result.a0.a1.a1);
15617 CHECK_EQ(0, result.a1.a0.a0);
15618 CHECK_EQ(0, result.a1.a0.a1);
15619 CHECK_EQ(0, result.a1.a1.a0);
15620 CHECK_EQ(0, result.a1.a1.a1);
15621
15622 return 0;
15623}
15624
15625// Used for testing structs and unions by value.
15626// Even deeper nested struct to test recursive member access.
15628 // NOLINTNEXTLINE(whitespace/parens)
15631 Struct16BytesNestedInt a0 = {};
15632 Struct16BytesNestedInt a1 = {};
15633
15634 a0.a0.a0.a0 = -1;
15635 a0.a0.a0.a1 = 2;
15636 a0.a0.a1.a0 = -3;
15637 a0.a0.a1.a1 = 4;
15638 a0.a1.a0.a0 = -5;
15639 a0.a1.a0.a1 = 6;
15640 a0.a1.a1.a0 = -7;
15641 a0.a1.a1.a1 = 8;
15642 a1.a0.a0.a0 = -9;
15643 a1.a0.a0.a1 = 10;
15644 a1.a0.a1.a0 = -11;
15645 a1.a0.a1.a1 = 12;
15646 a1.a1.a0.a0 = -13;
15647 a1.a1.a0.a1 = 14;
15648 a1.a1.a1.a0 = -15;
15649 a1.a1.a1.a1 = 16;
15650
15651 std::cout << "Calling TestReturnStruct32BytesNestedInt(" << "(((("
15652 << a0.a0.a0.a0 << ", " << a0.a0.a0.a1 << "), (" << a0.a0.a1.a0
15653 << ", " << a0.a0.a1.a1 << ")), ((" << a0.a1.a0.a0 << ", "
15654 << a0.a1.a0.a1 << "), (" << a0.a1.a1.a0 << ", " << a0.a1.a1.a1
15655 << "))), (((" << a1.a0.a0.a0 << ", " << a1.a0.a0.a1 << "), ("
15656 << a1.a0.a1.a0 << ", " << a1.a0.a1.a1 << ")), ((" << a1.a1.a0.a0
15657 << ", " << a1.a1.a0.a1 << "), (" << a1.a1.a1.a0 << ", "
15658 << a1.a1.a1.a1 << "))))" << ")\n";
15659
15660 Struct32BytesNestedInt result = f(a0, a1);
15661
15662 std::cout << "result = " << "((((" << result.a0.a0.a0.a0 << ", "
15663 << result.a0.a0.a0.a1 << "), (" << result.a0.a0.a1.a0 << ", "
15664 << result.a0.a0.a1.a1 << ")), ((" << result.a0.a1.a0.a0 << ", "
15665 << result.a0.a1.a0.a1 << "), (" << result.a0.a1.a1.a0 << ", "
15666 << result.a0.a1.a1.a1 << "))), (((" << result.a1.a0.a0.a0 << ", "
15667 << result.a1.a0.a0.a1 << "), (" << result.a1.a0.a1.a0 << ", "
15668 << result.a1.a0.a1.a1 << ")), ((" << result.a1.a1.a0.a0 << ", "
15669 << result.a1.a1.a0.a1 << "), (" << result.a1.a1.a1.a0 << ", "
15670 << result.a1.a1.a1.a1 << "))))" << "\n";
15671
15672 CHECK_EQ(a0.a0.a0.a0, result.a0.a0.a0.a0);
15673 CHECK_EQ(a0.a0.a0.a1, result.a0.a0.a0.a1);
15674 CHECK_EQ(a0.a0.a1.a0, result.a0.a0.a1.a0);
15675 CHECK_EQ(a0.a0.a1.a1, result.a0.a0.a1.a1);
15676 CHECK_EQ(a0.a1.a0.a0, result.a0.a1.a0.a0);
15677 CHECK_EQ(a0.a1.a0.a1, result.a0.a1.a0.a1);
15678 CHECK_EQ(a0.a1.a1.a0, result.a0.a1.a1.a0);
15679 CHECK_EQ(a0.a1.a1.a1, result.a0.a1.a1.a1);
15680 CHECK_EQ(a1.a0.a0.a0, result.a1.a0.a0.a0);
15681 CHECK_EQ(a1.a0.a0.a1, result.a1.a0.a0.a1);
15682 CHECK_EQ(a1.a0.a1.a0, result.a1.a0.a1.a0);
15683 CHECK_EQ(a1.a0.a1.a1, result.a1.a0.a1.a1);
15684 CHECK_EQ(a1.a1.a0.a0, result.a1.a1.a0.a0);
15685 CHECK_EQ(a1.a1.a0.a1, result.a1.a1.a0.a1);
15686 CHECK_EQ(a1.a1.a1.a0, result.a1.a1.a1.a0);
15687 CHECK_EQ(a1.a1.a1.a1, result.a1.a1.a1.a1);
15688
15689 // Pass argument that will make the Dart callback throw.
15690 a0.a0.a0.a0 = 42;
15691
15692 result = f(a0, a1);
15693
15694 CHECK_EQ(0, result.a0.a0.a0.a0);
15695 CHECK_EQ(0, result.a0.a0.a0.a1);
15696 CHECK_EQ(0, result.a0.a0.a1.a0);
15697 CHECK_EQ(0, result.a0.a0.a1.a1);
15698 CHECK_EQ(0, result.a0.a1.a0.a0);
15699 CHECK_EQ(0, result.a0.a1.a0.a1);
15700 CHECK_EQ(0, result.a0.a1.a1.a0);
15701 CHECK_EQ(0, result.a0.a1.a1.a1);
15702 CHECK_EQ(0, result.a1.a0.a0.a0);
15703 CHECK_EQ(0, result.a1.a0.a0.a1);
15704 CHECK_EQ(0, result.a1.a0.a1.a0);
15705 CHECK_EQ(0, result.a1.a0.a1.a1);
15706 CHECK_EQ(0, result.a1.a1.a0.a0);
15707 CHECK_EQ(0, result.a1.a1.a0.a1);
15708 CHECK_EQ(0, result.a1.a1.a1.a0);
15709 CHECK_EQ(0, result.a1.a1.a1.a1);
15710
15711 // Pass argument that will make the Dart callback return null.
15712 a0.a0.a0.a0 = 84;
15713
15714 result = f(a0, a1);
15715
15716 CHECK_EQ(0, result.a0.a0.a0.a0);
15717 CHECK_EQ(0, result.a0.a0.a0.a1);
15718 CHECK_EQ(0, result.a0.a0.a1.a0);
15719 CHECK_EQ(0, result.a0.a0.a1.a1);
15720 CHECK_EQ(0, result.a0.a1.a0.a0);
15721 CHECK_EQ(0, result.a0.a1.a0.a1);
15722 CHECK_EQ(0, result.a0.a1.a1.a0);
15723 CHECK_EQ(0, result.a0.a1.a1.a1);
15724 CHECK_EQ(0, result.a1.a0.a0.a0);
15725 CHECK_EQ(0, result.a1.a0.a0.a1);
15726 CHECK_EQ(0, result.a1.a0.a1.a0);
15727 CHECK_EQ(0, result.a1.a0.a1.a1);
15728 CHECK_EQ(0, result.a1.a1.a0.a0);
15729 CHECK_EQ(0, result.a1.a1.a0.a1);
15730 CHECK_EQ(0, result.a1.a1.a1.a0);
15731 CHECK_EQ(0, result.a1.a1.a1.a1);
15732
15733 return 0;
15734}
15735
15736// Used for testing structs and unions by value.
15737// Test alignment and padding of nested struct with 16 byte int.
15739 // NOLINTNEXTLINE(whitespace/parens)
15742 StructAlignmentInt16 a0 = {};
15743 StructAlignmentInt16 a1 = {};
15744
15745 a0.a0 = -1;
15746 a0.a1 = 2;
15747 a0.a2 = -3;
15748 a1.a0 = 4;
15749 a1.a1 = -5;
15750 a1.a2 = 6;
15751
15752 std::cout << "Calling TestReturnStructNestedIntStructAlignmentInt16(" << "(("
15753 << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
15754 << static_cast<int>(a0.a2) << "), (" << static_cast<int>(a1.a0)
15755 << ", " << a1.a1 << ", " << static_cast<int>(a1.a2) << "))"
15756 << ")\n";
15757
15759
15760 std::cout << "result = " << "((" << static_cast<int>(result.a0.a0) << ", "
15761 << result.a0.a1 << ", " << static_cast<int>(result.a0.a2) << "), ("
15762 << static_cast<int>(result.a1.a0) << ", " << result.a1.a1 << ", "
15763 << static_cast<int>(result.a1.a2) << "))" << "\n";
15764
15765 CHECK_EQ(a0.a0, result.a0.a0);
15766 CHECK_EQ(a0.a1, result.a0.a1);
15767 CHECK_EQ(a0.a2, result.a0.a2);
15768 CHECK_EQ(a1.a0, result.a1.a0);
15769 CHECK_EQ(a1.a1, result.a1.a1);
15770 CHECK_EQ(a1.a2, result.a1.a2);
15771
15772 // Pass argument that will make the Dart callback throw.
15773 a0.a0 = 42;
15774
15775 result = f(a0, a1);
15776
15777 CHECK_EQ(0, result.a0.a0);
15778 CHECK_EQ(0, result.a0.a1);
15779 CHECK_EQ(0, result.a0.a2);
15780 CHECK_EQ(0, result.a1.a0);
15781 CHECK_EQ(0, result.a1.a1);
15782 CHECK_EQ(0, result.a1.a2);
15783
15784 // Pass argument that will make the Dart callback return null.
15785 a0.a0 = 84;
15786
15787 result = f(a0, a1);
15788
15789 CHECK_EQ(0, result.a0.a0);
15790 CHECK_EQ(0, result.a0.a1);
15791 CHECK_EQ(0, result.a0.a2);
15792 CHECK_EQ(0, result.a1.a0);
15793 CHECK_EQ(0, result.a1.a1);
15794 CHECK_EQ(0, result.a1.a2);
15795
15796 return 0;
15797}
15798
15799// Used for testing structs and unions by value.
15800// Test alignment and padding of nested struct with 32 byte int.
15802 // NOLINTNEXTLINE(whitespace/parens)
15805 StructAlignmentInt32 a0 = {};
15806 StructAlignmentInt32 a1 = {};
15807
15808 a0.a0 = -1;
15809 a0.a1 = 2;
15810 a0.a2 = -3;
15811 a1.a0 = 4;
15812 a1.a1 = -5;
15813 a1.a2 = 6;
15814
15815 std::cout << "Calling TestReturnStructNestedIntStructAlignmentInt32(" << "(("
15816 << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
15817 << static_cast<int>(a0.a2) << "), (" << static_cast<int>(a1.a0)
15818 << ", " << a1.a1 << ", " << static_cast<int>(a1.a2) << "))"
15819 << ")\n";
15820
15822
15823 std::cout << "result = " << "((" << static_cast<int>(result.a0.a0) << ", "
15824 << result.a0.a1 << ", " << static_cast<int>(result.a0.a2) << "), ("
15825 << static_cast<int>(result.a1.a0) << ", " << result.a1.a1 << ", "
15826 << static_cast<int>(result.a1.a2) << "))" << "\n";
15827
15828 CHECK_EQ(a0.a0, result.a0.a0);
15829 CHECK_EQ(a0.a1, result.a0.a1);
15830 CHECK_EQ(a0.a2, result.a0.a2);
15831 CHECK_EQ(a1.a0, result.a1.a0);
15832 CHECK_EQ(a1.a1, result.a1.a1);
15833 CHECK_EQ(a1.a2, result.a1.a2);
15834
15835 // Pass argument that will make the Dart callback throw.
15836 a0.a0 = 42;
15837
15838 result = f(a0, a1);
15839
15840 CHECK_EQ(0, result.a0.a0);
15841 CHECK_EQ(0, result.a0.a1);
15842 CHECK_EQ(0, result.a0.a2);
15843 CHECK_EQ(0, result.a1.a0);
15844 CHECK_EQ(0, result.a1.a1);
15845 CHECK_EQ(0, result.a1.a2);
15846
15847 // Pass argument that will make the Dart callback return null.
15848 a0.a0 = 84;
15849
15850 result = f(a0, a1);
15851
15852 CHECK_EQ(0, result.a0.a0);
15853 CHECK_EQ(0, result.a0.a1);
15854 CHECK_EQ(0, result.a0.a2);
15855 CHECK_EQ(0, result.a1.a0);
15856 CHECK_EQ(0, result.a1.a1);
15857 CHECK_EQ(0, result.a1.a2);
15858
15859 return 0;
15860}
15861
15862// Used for testing structs and unions by value.
15863// Test alignment and padding of nested struct with 64 byte int.
15865 // NOLINTNEXTLINE(whitespace/parens)
15868 StructAlignmentInt64 a0 = {};
15869 StructAlignmentInt64 a1 = {};
15870
15871 a0.a0 = -1;
15872 a0.a1 = 2;
15873 a0.a2 = -3;
15874 a1.a0 = 4;
15875 a1.a1 = -5;
15876 a1.a2 = 6;
15877
15878 std::cout << "Calling TestReturnStructNestedIntStructAlignmentInt64(" << "(("
15879 << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
15880 << static_cast<int>(a0.a2) << "), (" << static_cast<int>(a1.a0)
15881 << ", " << a1.a1 << ", " << static_cast<int>(a1.a2) << "))"
15882 << ")\n";
15883
15885
15886 std::cout << "result = " << "((" << static_cast<int>(result.a0.a0) << ", "
15887 << result.a0.a1 << ", " << static_cast<int>(result.a0.a2) << "), ("
15888 << static_cast<int>(result.a1.a0) << ", " << result.a1.a1 << ", "
15889 << static_cast<int>(result.a1.a2) << "))" << "\n";
15890
15891 CHECK_EQ(a0.a0, result.a0.a0);
15892 CHECK_EQ(a0.a1, result.a0.a1);
15893 CHECK_EQ(a0.a2, result.a0.a2);
15894 CHECK_EQ(a1.a0, result.a1.a0);
15895 CHECK_EQ(a1.a1, result.a1.a1);
15896 CHECK_EQ(a1.a2, result.a1.a2);
15897
15898 // Pass argument that will make the Dart callback throw.
15899 a0.a0 = 42;
15900
15901 result = f(a0, a1);
15902
15903 CHECK_EQ(0, result.a0.a0);
15904 CHECK_EQ(0, result.a0.a1);
15905 CHECK_EQ(0, result.a0.a2);
15906 CHECK_EQ(0, result.a1.a0);
15907 CHECK_EQ(0, result.a1.a1);
15908 CHECK_EQ(0, result.a1.a2);
15909
15910 // Pass argument that will make the Dart callback return null.
15911 a0.a0 = 84;
15912
15913 result = f(a0, a1);
15914
15915 CHECK_EQ(0, result.a0.a0);
15916 CHECK_EQ(0, result.a0.a1);
15917 CHECK_EQ(0, result.a0.a2);
15918 CHECK_EQ(0, result.a1.a0);
15919 CHECK_EQ(0, result.a1.a1);
15920 CHECK_EQ(0, result.a1.a2);
15921
15922 return 0;
15923}
15924
15925// Used for testing structs and unions by value.
15926// Return big irregular struct as smoke test.
15928 // NOLINTNEXTLINE(whitespace/parens)
15929 StructNestedIrregularEvenBigger (*f)(uint64_t a0,
15932 double a3)) {
15933 uint64_t a0;
15936 double a3;
15937
15938 a0 = 1;
15939 a1.a0.a0 = 2;
15940 a1.a0.a1.a0.a0 = -3;
15941 a1.a0.a1.a0.a1 = 4;
15942 a1.a0.a1.a1.a0 = -5.0;
15943 a1.a0.a2 = 6;
15944 a1.a0.a3.a0.a0 = -7.0;
15945 a1.a0.a3.a1 = 8.0;
15946 a1.a0.a4 = 9;
15947 a1.a0.a5.a0.a0 = 10.0;
15948 a1.a0.a5.a1.a0 = -11.0;
15949 a1.a0.a6 = 12;
15950 a1.a1.a0.a0 = -13;
15951 a1.a1.a0.a1 = 14;
15952 a1.a1.a1.a0 = -15.0;
15953 a1.a2 = 16.0;
15954 a1.a3 = -17.0;
15955 a2.a0.a0 = 18;
15956 a2.a0.a1.a0.a0 = -19;
15957 a2.a0.a1.a0.a1 = 20;
15958 a2.a0.a1.a1.a0 = -21.0;
15959 a2.a0.a2 = 22;
15960 a2.a0.a3.a0.a0 = -23.0;
15961 a2.a0.a3.a1 = 24.0;
15962 a2.a0.a4 = 25;
15963 a2.a0.a5.a0.a0 = 26.0;
15964 a2.a0.a5.a1.a0 = -27.0;
15965 a2.a0.a6 = 28;
15966 a2.a1.a0.a0 = -29;
15967 a2.a1.a0.a1 = 30;
15968 a2.a1.a1.a0 = -31.0;
15969 a2.a2 = 32.0;
15970 a2.a3 = -33.0;
15971 a3 = 34.0;
15972
15973 std::cout << "Calling TestReturnStructNestedIrregularEvenBigger(" << "(" << a0
15974 << ", ((" << a1.a0.a0 << ", ((" << a1.a0.a1.a0.a0 << ", "
15975 << a1.a0.a1.a0.a1 << "), (" << a1.a0.a1.a1.a0 << ")), " << a1.a0.a2
15976 << ", ((" << a1.a0.a3.a0.a0 << "), " << a1.a0.a3.a1 << "), "
15977 << a1.a0.a4 << ", ((" << a1.a0.a5.a0.a0 << "), (" << a1.a0.a5.a1.a0
15978 << ")), " << a1.a0.a6 << "), ((" << a1.a1.a0.a0 << ", "
15979 << a1.a1.a0.a1 << "), (" << a1.a1.a1.a0 << ")), " << a1.a2 << ", "
15980 << a1.a3 << "), ((" << a2.a0.a0 << ", ((" << a2.a0.a1.a0.a0 << ", "
15981 << a2.a0.a1.a0.a1 << "), (" << a2.a0.a1.a1.a0 << ")), " << a2.a0.a2
15982 << ", ((" << a2.a0.a3.a0.a0 << "), " << a2.a0.a3.a1 << "), "
15983 << a2.a0.a4 << ", ((" << a2.a0.a5.a0.a0 << "), (" << a2.a0.a5.a1.a0
15984 << ")), " << a2.a0.a6 << "), ((" << a2.a1.a0.a0 << ", "
15985 << a2.a1.a0.a1 << "), (" << a2.a1.a1.a0 << ")), " << a2.a2 << ", "
15986 << a2.a3 << "), " << a3 << ")" << ")\n";
15987
15988 StructNestedIrregularEvenBigger result = f(a0, a1, a2, a3);
15989
15990 std::cout << "result = " << "(" << result.a0 << ", ((" << result.a1.a0.a0
15991 << ", ((" << result.a1.a0.a1.a0.a0 << ", " << result.a1.a0.a1.a0.a1
15992 << "), (" << result.a1.a0.a1.a1.a0 << ")), " << result.a1.a0.a2
15993 << ", ((" << result.a1.a0.a3.a0.a0 << "), " << result.a1.a0.a3.a1
15994 << "), " << result.a1.a0.a4 << ", ((" << result.a1.a0.a5.a0.a0
15995 << "), (" << result.a1.a0.a5.a1.a0 << ")), " << result.a1.a0.a6
15996 << "), ((" << result.a1.a1.a0.a0 << ", " << result.a1.a1.a0.a1
15997 << "), (" << result.a1.a1.a1.a0 << ")), " << result.a1.a2 << ", "
15998 << result.a1.a3 << "), ((" << result.a2.a0.a0 << ", (("
15999 << result.a2.a0.a1.a0.a0 << ", " << result.a2.a0.a1.a0.a1 << "), ("
16000 << result.a2.a0.a1.a1.a0 << ")), " << result.a2.a0.a2 << ", (("
16001 << result.a2.a0.a3.a0.a0 << "), " << result.a2.a0.a3.a1 << "), "
16002 << result.a2.a0.a4 << ", ((" << result.a2.a0.a5.a0.a0 << "), ("
16003 << result.a2.a0.a5.a1.a0 << ")), " << result.a2.a0.a6 << "), (("
16004 << result.a2.a1.a0.a0 << ", " << result.a2.a1.a0.a1 << "), ("
16005 << result.a2.a1.a1.a0 << ")), " << result.a2.a2 << ", "
16006 << result.a2.a3 << "), " << result.a3 << ")" << "\n";
16007
16008 CHECK_EQ(a0, result.a0);
16009 CHECK_EQ(a1.a0.a0, result.a1.a0.a0);
16010 CHECK_EQ(a1.a0.a1.a0.a0, result.a1.a0.a1.a0.a0);
16011 CHECK_EQ(a1.a0.a1.a0.a1, result.a1.a0.a1.a0.a1);
16012 CHECK_APPROX(a1.a0.a1.a1.a0, result.a1.a0.a1.a1.a0);
16013 CHECK_EQ(a1.a0.a2, result.a1.a0.a2);
16014 CHECK_APPROX(a1.a0.a3.a0.a0, result.a1.a0.a3.a0.a0);
16015 CHECK_APPROX(a1.a0.a3.a1, result.a1.a0.a3.a1);
16016 CHECK_EQ(a1.a0.a4, result.a1.a0.a4);
16017 CHECK_APPROX(a1.a0.a5.a0.a0, result.a1.a0.a5.a0.a0);
16018 CHECK_APPROX(a1.a0.a5.a1.a0, result.a1.a0.a5.a1.a0);
16019 CHECK_EQ(a1.a0.a6, result.a1.a0.a6);
16020 CHECK_EQ(a1.a1.a0.a0, result.a1.a1.a0.a0);
16021 CHECK_EQ(a1.a1.a0.a1, result.a1.a1.a0.a1);
16022 CHECK_APPROX(a1.a1.a1.a0, result.a1.a1.a1.a0);
16023 CHECK_APPROX(a1.a2, result.a1.a2);
16024 CHECK_APPROX(a1.a3, result.a1.a3);
16025 CHECK_EQ(a2.a0.a0, result.a2.a0.a0);
16026 CHECK_EQ(a2.a0.a1.a0.a0, result.a2.a0.a1.a0.a0);
16027 CHECK_EQ(a2.a0.a1.a0.a1, result.a2.a0.a1.a0.a1);
16028 CHECK_APPROX(a2.a0.a1.a1.a0, result.a2.a0.a1.a1.a0);
16029 CHECK_EQ(a2.a0.a2, result.a2.a0.a2);
16030 CHECK_APPROX(a2.a0.a3.a0.a0, result.a2.a0.a3.a0.a0);
16031 CHECK_APPROX(a2.a0.a3.a1, result.a2.a0.a3.a1);
16032 CHECK_EQ(a2.a0.a4, result.a2.a0.a4);
16033 CHECK_APPROX(a2.a0.a5.a0.a0, result.a2.a0.a5.a0.a0);
16034 CHECK_APPROX(a2.a0.a5.a1.a0, result.a2.a0.a5.a1.a0);
16035 CHECK_EQ(a2.a0.a6, result.a2.a0.a6);
16036 CHECK_EQ(a2.a1.a0.a0, result.a2.a1.a0.a0);
16037 CHECK_EQ(a2.a1.a0.a1, result.a2.a1.a0.a1);
16038 CHECK_APPROX(a2.a1.a1.a0, result.a2.a1.a1.a0);
16039 CHECK_APPROX(a2.a2, result.a2.a2);
16040 CHECK_APPROX(a2.a3, result.a2.a3);
16041 CHECK_APPROX(a3, result.a3);
16042
16043 // Pass argument that will make the Dart callback throw.
16044 a0 = 42;
16045
16046 result = f(a0, a1, a2, a3);
16047
16048 CHECK_EQ(0, result.a0);
16049 CHECK_EQ(0, result.a1.a0.a0);
16050 CHECK_EQ(0, result.a1.a0.a1.a0.a0);
16051 CHECK_EQ(0, result.a1.a0.a1.a0.a1);
16052 CHECK_APPROX(0.0, result.a1.a0.a1.a1.a0);
16053 CHECK_EQ(0, result.a1.a0.a2);
16054 CHECK_APPROX(0.0, result.a1.a0.a3.a0.a0);
16055 CHECK_APPROX(0.0, result.a1.a0.a3.a1);
16056 CHECK_EQ(0, result.a1.a0.a4);
16057 CHECK_APPROX(0.0, result.a1.a0.a5.a0.a0);
16058 CHECK_APPROX(0.0, result.a1.a0.a5.a1.a0);
16059 CHECK_EQ(0, result.a1.a0.a6);
16060 CHECK_EQ(0, result.a1.a1.a0.a0);
16061 CHECK_EQ(0, result.a1.a1.a0.a1);
16062 CHECK_APPROX(0.0, result.a1.a1.a1.a0);
16063 CHECK_APPROX(0.0, result.a1.a2);
16064 CHECK_APPROX(0.0, result.a1.a3);
16065 CHECK_EQ(0, result.a2.a0.a0);
16066 CHECK_EQ(0, result.a2.a0.a1.a0.a0);
16067 CHECK_EQ(0, result.a2.a0.a1.a0.a1);
16068 CHECK_APPROX(0.0, result.a2.a0.a1.a1.a0);
16069 CHECK_EQ(0, result.a2.a0.a2);
16070 CHECK_APPROX(0.0, result.a2.a0.a3.a0.a0);
16071 CHECK_APPROX(0.0, result.a2.a0.a3.a1);
16072 CHECK_EQ(0, result.a2.a0.a4);
16073 CHECK_APPROX(0.0, result.a2.a0.a5.a0.a0);
16074 CHECK_APPROX(0.0, result.a2.a0.a5.a1.a0);
16075 CHECK_EQ(0, result.a2.a0.a6);
16076 CHECK_EQ(0, result.a2.a1.a0.a0);
16077 CHECK_EQ(0, result.a2.a1.a0.a1);
16078 CHECK_APPROX(0.0, result.a2.a1.a1.a0);
16079 CHECK_APPROX(0.0, result.a2.a2);
16080 CHECK_APPROX(0.0, result.a2.a3);
16081 CHECK_APPROX(0.0, result.a3);
16082
16083 // Pass argument that will make the Dart callback return null.
16084 a0 = 84;
16085
16086 result = f(a0, a1, a2, a3);
16087
16088 CHECK_EQ(0, result.a0);
16089 CHECK_EQ(0, result.a1.a0.a0);
16090 CHECK_EQ(0, result.a1.a0.a1.a0.a0);
16091 CHECK_EQ(0, result.a1.a0.a1.a0.a1);
16092 CHECK_APPROX(0.0, result.a1.a0.a1.a1.a0);
16093 CHECK_EQ(0, result.a1.a0.a2);
16094 CHECK_APPROX(0.0, result.a1.a0.a3.a0.a0);
16095 CHECK_APPROX(0.0, result.a1.a0.a3.a1);
16096 CHECK_EQ(0, result.a1.a0.a4);
16097 CHECK_APPROX(0.0, result.a1.a0.a5.a0.a0);
16098 CHECK_APPROX(0.0, result.a1.a0.a5.a1.a0);
16099 CHECK_EQ(0, result.a1.a0.a6);
16100 CHECK_EQ(0, result.a1.a1.a0.a0);
16101 CHECK_EQ(0, result.a1.a1.a0.a1);
16102 CHECK_APPROX(0.0, result.a1.a1.a1.a0);
16103 CHECK_APPROX(0.0, result.a1.a2);
16104 CHECK_APPROX(0.0, result.a1.a3);
16105 CHECK_EQ(0, result.a2.a0.a0);
16106 CHECK_EQ(0, result.a2.a0.a1.a0.a0);
16107 CHECK_EQ(0, result.a2.a0.a1.a0.a1);
16108 CHECK_APPROX(0.0, result.a2.a0.a1.a1.a0);
16109 CHECK_EQ(0, result.a2.a0.a2);
16110 CHECK_APPROX(0.0, result.a2.a0.a3.a0.a0);
16111 CHECK_APPROX(0.0, result.a2.a0.a3.a1);
16112 CHECK_EQ(0, result.a2.a0.a4);
16113 CHECK_APPROX(0.0, result.a2.a0.a5.a0.a0);
16114 CHECK_APPROX(0.0, result.a2.a0.a5.a1.a0);
16115 CHECK_EQ(0, result.a2.a0.a6);
16116 CHECK_EQ(0, result.a2.a1.a0.a0);
16117 CHECK_EQ(0, result.a2.a1.a0.a1);
16118 CHECK_APPROX(0.0, result.a2.a1.a1.a0);
16119 CHECK_APPROX(0.0, result.a2.a2);
16120 CHECK_APPROX(0.0, result.a2.a3);
16121 CHECK_APPROX(0.0, result.a3);
16122
16123 return 0;
16124}
16125
16126// Used for testing structs and unions by value.
16127// Smallest struct with data.
16128// 10 struct arguments will exhaust available registers.
16130 // NOLINTNEXTLINE(whitespace/parens)
16131 void (*f)(Struct1ByteInt a0,
16132 Struct1ByteInt a1,
16133 Struct1ByteInt a2,
16134 Struct1ByteInt a3,
16135 Struct1ByteInt a4,
16136 Struct1ByteInt a5,
16137 Struct1ByteInt a6,
16138 Struct1ByteInt a7,
16139 Struct1ByteInt a8,
16140 Struct1ByteInt a9)) {
16141 Struct1ByteInt a0 = {};
16142 Struct1ByteInt a1 = {};
16143 Struct1ByteInt a2 = {};
16144 Struct1ByteInt a3 = {};
16145 Struct1ByteInt a4 = {};
16146 Struct1ByteInt a5 = {};
16147 Struct1ByteInt a6 = {};
16148 Struct1ByteInt a7 = {};
16149 Struct1ByteInt a8 = {};
16150 Struct1ByteInt a9 = {};
16151
16152 a0.a0 = -1;
16153 a1.a0 = 2;
16154 a2.a0 = -3;
16155 a3.a0 = 4;
16156 a4.a0 = -5;
16157 a5.a0 = 6;
16158 a6.a0 = -7;
16159 a7.a0 = 8;
16160 a8.a0 = -9;
16161 a9.a0 = 10;
16162
16163 std::cout << "Calling TestAsyncPassStruct1ByteIntx10(" << "(("
16164 << static_cast<int>(a0.a0) << "), (" << static_cast<int>(a1.a0)
16165 << "), (" << static_cast<int>(a2.a0) << "), ("
16166 << static_cast<int>(a3.a0) << "), (" << static_cast<int>(a4.a0)
16167 << "), (" << static_cast<int>(a5.a0) << "), ("
16168 << static_cast<int>(a6.a0) << "), (" << static_cast<int>(a7.a0)
16169 << "), (" << static_cast<int>(a8.a0) << "), ("
16170 << static_cast<int>(a9.a0) << "))" << ")\n";
16171
16172 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
16173}
16174
16175// Used for testing structs and unions by value.
16176// Not a multiple of word size, not a power of two.
16177// 10 struct arguments will exhaust available registers.
16179 // NOLINTNEXTLINE(whitespace/parens)
16180 void (*f)(Struct3BytesHomogeneousUint8 a0,
16200
16201 a0.a0 = 1;
16202 a0.a1 = 2;
16203 a0.a2 = 3;
16204 a1.a0 = 4;
16205 a1.a1 = 5;
16206 a1.a2 = 6;
16207 a2.a0 = 7;
16208 a2.a1 = 8;
16209 a2.a2 = 9;
16210 a3.a0 = 10;
16211 a3.a1 = 11;
16212 a3.a2 = 12;
16213 a4.a0 = 13;
16214 a4.a1 = 14;
16215 a4.a2 = 15;
16216 a5.a0 = 16;
16217 a5.a1 = 17;
16218 a5.a2 = 18;
16219 a6.a0 = 19;
16220 a6.a1 = 20;
16221 a6.a2 = 21;
16222 a7.a0 = 22;
16223 a7.a1 = 23;
16224 a7.a2 = 24;
16225 a8.a0 = 25;
16226 a8.a1 = 26;
16227 a8.a2 = 27;
16228 a9.a0 = 28;
16229 a9.a1 = 29;
16230 a9.a2 = 30;
16231
16232 std::cout << "Calling TestAsyncPassStruct3BytesHomogeneousUint8x10(" << "(("
16233 << static_cast<int>(a0.a0) << ", " << static_cast<int>(a0.a1)
16234 << ", " << static_cast<int>(a0.a2) << "), ("
16235 << static_cast<int>(a1.a0) << ", " << static_cast<int>(a1.a1)
16236 << ", " << static_cast<int>(a1.a2) << "), ("
16237 << static_cast<int>(a2.a0) << ", " << static_cast<int>(a2.a1)
16238 << ", " << static_cast<int>(a2.a2) << "), ("
16239 << static_cast<int>(a3.a0) << ", " << static_cast<int>(a3.a1)
16240 << ", " << static_cast<int>(a3.a2) << "), ("
16241 << static_cast<int>(a4.a0) << ", " << static_cast<int>(a4.a1)
16242 << ", " << static_cast<int>(a4.a2) << "), ("
16243 << static_cast<int>(a5.a0) << ", " << static_cast<int>(a5.a1)
16244 << ", " << static_cast<int>(a5.a2) << "), ("
16245 << static_cast<int>(a6.a0) << ", " << static_cast<int>(a6.a1)
16246 << ", " << static_cast<int>(a6.a2) << "), ("
16247 << static_cast<int>(a7.a0) << ", " << static_cast<int>(a7.a1)
16248 << ", " << static_cast<int>(a7.a2) << "), ("
16249 << static_cast<int>(a8.a0) << ", " << static_cast<int>(a8.a1)
16250 << ", " << static_cast<int>(a8.a2) << "), ("
16251 << static_cast<int>(a9.a0) << ", " << static_cast<int>(a9.a1)
16252 << ", " << static_cast<int>(a9.a2) << "))" << ")\n";
16253
16254 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
16255}
16256
16257// Used for testing structs and unions by value.
16258// Not a multiple of word size, not a power of two.
16259// With alignment rules taken into account size is 4 bytes.
16260// 10 struct arguments will exhaust available registers.
16262 // NOLINTNEXTLINE(whitespace/parens)
16263 void (*f)(Struct3BytesInt2ByteAligned a0,
16283
16284 a0.a0 = -1;
16285 a0.a1 = 2;
16286 a1.a0 = -3;
16287 a1.a1 = 4;
16288 a2.a0 = -5;
16289 a2.a1 = 6;
16290 a3.a0 = -7;
16291 a3.a1 = 8;
16292 a4.a0 = -9;
16293 a4.a1 = 10;
16294 a5.a0 = -11;
16295 a5.a1 = 12;
16296 a6.a0 = -13;
16297 a6.a1 = 14;
16298 a7.a0 = -15;
16299 a7.a1 = 16;
16300 a8.a0 = -17;
16301 a8.a1 = 18;
16302 a9.a0 = -19;
16303 a9.a1 = 20;
16304
16305 std::cout << "Calling TestAsyncPassStruct3BytesInt2ByteAlignedx10(" << "(("
16306 << a0.a0 << ", " << static_cast<int>(a0.a1) << "), (" << a1.a0
16307 << ", " << static_cast<int>(a1.a1) << "), (" << a2.a0 << ", "
16308 << static_cast<int>(a2.a1) << "), (" << a3.a0 << ", "
16309 << static_cast<int>(a3.a1) << "), (" << a4.a0 << ", "
16310 << static_cast<int>(a4.a1) << "), (" << a5.a0 << ", "
16311 << static_cast<int>(a5.a1) << "), (" << a6.a0 << ", "
16312 << static_cast<int>(a6.a1) << "), (" << a7.a0 << ", "
16313 << static_cast<int>(a7.a1) << "), (" << a8.a0 << ", "
16314 << static_cast<int>(a8.a1) << "), (" << a9.a0 << ", "
16315 << static_cast<int>(a9.a1) << "))" << ")\n";
16316
16317 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
16318}
16319
16320// Used for testing structs and unions by value.
16321// Exactly word size on 32-bit architectures.
16322// 10 struct arguments will exhaust available registers.
16324 // NOLINTNEXTLINE(whitespace/parens)
16325 void (*f)(Struct4BytesHomogeneousInt16 a0,
16345
16346 a0.a0 = -1;
16347 a0.a1 = 2;
16348 a1.a0 = -3;
16349 a1.a1 = 4;
16350 a2.a0 = -5;
16351 a2.a1 = 6;
16352 a3.a0 = -7;
16353 a3.a1 = 8;
16354 a4.a0 = -9;
16355 a4.a1 = 10;
16356 a5.a0 = -11;
16357 a5.a1 = 12;
16358 a6.a0 = -13;
16359 a6.a1 = 14;
16360 a7.a0 = -15;
16361 a7.a1 = 16;
16362 a8.a0 = -17;
16363 a8.a1 = 18;
16364 a9.a0 = -19;
16365 a9.a1 = 20;
16366
16367 std::cout << "Calling TestAsyncPassStruct4BytesHomogeneousInt16x10(" << "(("
16368 << a0.a0 << ", " << a0.a1 << "), (" << a1.a0 << ", " << a1.a1
16369 << "), (" << a2.a0 << ", " << a2.a1 << "), (" << a3.a0 << ", "
16370 << a3.a1 << "), (" << a4.a0 << ", " << a4.a1 << "), (" << a5.a0
16371 << ", " << a5.a1 << "), (" << a6.a0 << ", " << a6.a1 << "), ("
16372 << a7.a0 << ", " << a7.a1 << "), (" << a8.a0 << ", " << a8.a1
16373 << "), (" << a9.a0 << ", " << a9.a1 << "))" << ")\n";
16374
16375 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
16376}
16377
16378// Used for testing structs and unions by value.
16379// Sub word size on 64 bit architectures.
16380// 10 struct arguments will exhaust available registers.
16382 // NOLINTNEXTLINE(whitespace/parens)
16383 void (*f)(Struct7BytesHomogeneousUint8 a0,
16403
16404 a0.a0 = 1;
16405 a0.a1 = 2;
16406 a0.a2 = 3;
16407 a0.a3 = 4;
16408 a0.a4 = 5;
16409 a0.a5 = 6;
16410 a0.a6 = 7;
16411 a1.a0 = 8;
16412 a1.a1 = 9;
16413 a1.a2 = 10;
16414 a1.a3 = 11;
16415 a1.a4 = 12;
16416 a1.a5 = 13;
16417 a1.a6 = 14;
16418 a2.a0 = 15;
16419 a2.a1 = 16;
16420 a2.a2 = 17;
16421 a2.a3 = 18;
16422 a2.a4 = 19;
16423 a2.a5 = 20;
16424 a2.a6 = 21;
16425 a3.a0 = 22;
16426 a3.a1 = 23;
16427 a3.a2 = 24;
16428 a3.a3 = 25;
16429 a3.a4 = 26;
16430 a3.a5 = 27;
16431 a3.a6 = 28;
16432 a4.a0 = 29;
16433 a4.a1 = 30;
16434 a4.a2 = 31;
16435 a4.a3 = 32;
16436 a4.a4 = 33;
16437 a4.a5 = 34;
16438 a4.a6 = 35;
16439 a5.a0 = 36;
16440 a5.a1 = 37;
16441 a5.a2 = 38;
16442 a5.a3 = 39;
16443 a5.a4 = 40;
16444 a5.a5 = 41;
16445 a5.a6 = 42;
16446 a6.a0 = 43;
16447 a6.a1 = 44;
16448 a6.a2 = 45;
16449 a6.a3 = 46;
16450 a6.a4 = 47;
16451 a6.a5 = 48;
16452 a6.a6 = 49;
16453 a7.a0 = 50;
16454 a7.a1 = 51;
16455 a7.a2 = 52;
16456 a7.a3 = 53;
16457 a7.a4 = 54;
16458 a7.a5 = 55;
16459 a7.a6 = 56;
16460 a8.a0 = 57;
16461 a8.a1 = 58;
16462 a8.a2 = 59;
16463 a8.a3 = 60;
16464 a8.a4 = 61;
16465 a8.a5 = 62;
16466 a8.a6 = 63;
16467 a9.a0 = 64;
16468 a9.a1 = 65;
16469 a9.a2 = 66;
16470 a9.a3 = 67;
16471 a9.a4 = 68;
16472 a9.a5 = 69;
16473 a9.a6 = 70;
16474
16475 std::cout
16476 << "Calling TestAsyncPassStruct7BytesHomogeneousUint8x10(" << "(("
16477 << static_cast<int>(a0.a0) << ", " << static_cast<int>(a0.a1) << ", "
16478 << static_cast<int>(a0.a2) << ", " << static_cast<int>(a0.a3) << ", "
16479 << static_cast<int>(a0.a4) << ", " << static_cast<int>(a0.a5) << ", "
16480 << static_cast<int>(a0.a6) << "), (" << static_cast<int>(a1.a0) << ", "
16481 << static_cast<int>(a1.a1) << ", " << static_cast<int>(a1.a2) << ", "
16482 << static_cast<int>(a1.a3) << ", " << static_cast<int>(a1.a4) << ", "
16483 << static_cast<int>(a1.a5) << ", " << static_cast<int>(a1.a6) << "), ("
16484 << static_cast<int>(a2.a0) << ", " << static_cast<int>(a2.a1) << ", "
16485 << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3) << ", "
16486 << static_cast<int>(a2.a4) << ", " << static_cast<int>(a2.a5) << ", "
16487 << static_cast<int>(a2.a6) << "), (" << static_cast<int>(a3.a0) << ", "
16488 << static_cast<int>(a3.a1) << ", " << static_cast<int>(a3.a2) << ", "
16489 << static_cast<int>(a3.a3) << ", " << static_cast<int>(a3.a4) << ", "
16490 << static_cast<int>(a3.a5) << ", " << static_cast<int>(a3.a6) << "), ("
16491 << static_cast<int>(a4.a0) << ", " << static_cast<int>(a4.a1) << ", "
16492 << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3) << ", "
16493 << static_cast<int>(a4.a4) << ", " << static_cast<int>(a4.a5) << ", "
16494 << static_cast<int>(a4.a6) << "), (" << static_cast<int>(a5.a0) << ", "
16495 << static_cast<int>(a5.a1) << ", " << static_cast<int>(a5.a2) << ", "
16496 << static_cast<int>(a5.a3) << ", " << static_cast<int>(a5.a4) << ", "
16497 << static_cast<int>(a5.a5) << ", " << static_cast<int>(a5.a6) << "), ("
16498 << static_cast<int>(a6.a0) << ", " << static_cast<int>(a6.a1) << ", "
16499 << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3) << ", "
16500 << static_cast<int>(a6.a4) << ", " << static_cast<int>(a6.a5) << ", "
16501 << static_cast<int>(a6.a6) << "), (" << static_cast<int>(a7.a0) << ", "
16502 << static_cast<int>(a7.a1) << ", " << static_cast<int>(a7.a2) << ", "
16503 << static_cast<int>(a7.a3) << ", " << static_cast<int>(a7.a4) << ", "
16504 << static_cast<int>(a7.a5) << ", " << static_cast<int>(a7.a6) << "), ("
16505 << static_cast<int>(a8.a0) << ", " << static_cast<int>(a8.a1) << ", "
16506 << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3) << ", "
16507 << static_cast<int>(a8.a4) << ", " << static_cast<int>(a8.a5) << ", "
16508 << static_cast<int>(a8.a6) << "), (" << static_cast<int>(a9.a0) << ", "
16509 << static_cast<int>(a9.a1) << ", " << static_cast<int>(a9.a2) << ", "
16510 << static_cast<int>(a9.a3) << ", " << static_cast<int>(a9.a4) << ", "
16511 << static_cast<int>(a9.a5) << ", " << static_cast<int>(a9.a6) << "))"
16512 << ")\n";
16513
16514 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
16515}
16516
16517// Used for testing structs and unions by value.
16518// Sub word size on 64 bit architectures.
16519// With alignment rules taken into account size is 8 bytes.
16520// 10 struct arguments will exhaust available registers.
16522 // NOLINTNEXTLINE(whitespace/parens)
16523 void (*f)(Struct7BytesInt4ByteAligned a0,
16543
16544 a0.a0 = -1;
16545 a0.a1 = 2;
16546 a0.a2 = -3;
16547 a1.a0 = 4;
16548 a1.a1 = -5;
16549 a1.a2 = 6;
16550 a2.a0 = -7;
16551 a2.a1 = 8;
16552 a2.a2 = -9;
16553 a3.a0 = 10;
16554 a3.a1 = -11;
16555 a3.a2 = 12;
16556 a4.a0 = -13;
16557 a4.a1 = 14;
16558 a4.a2 = -15;
16559 a5.a0 = 16;
16560 a5.a1 = -17;
16561 a5.a2 = 18;
16562 a6.a0 = -19;
16563 a6.a1 = 20;
16564 a6.a2 = -21;
16565 a7.a0 = 22;
16566 a7.a1 = -23;
16567 a7.a2 = 24;
16568 a8.a0 = -25;
16569 a8.a1 = 26;
16570 a8.a2 = -27;
16571 a9.a0 = 28;
16572 a9.a1 = -29;
16573 a9.a2 = 30;
16574
16575 std::cout << "Calling TestAsyncPassStruct7BytesInt4ByteAlignedx10(" << "(("
16576 << a0.a0 << ", " << a0.a1 << ", " << static_cast<int>(a0.a2)
16577 << "), (" << a1.a0 << ", " << a1.a1 << ", "
16578 << static_cast<int>(a1.a2) << "), (" << a2.a0 << ", " << a2.a1
16579 << ", " << static_cast<int>(a2.a2) << "), (" << a3.a0 << ", "
16580 << a3.a1 << ", " << static_cast<int>(a3.a2) << "), (" << a4.a0
16581 << ", " << a4.a1 << ", " << static_cast<int>(a4.a2) << "), ("
16582 << a5.a0 << ", " << a5.a1 << ", " << static_cast<int>(a5.a2)
16583 << "), (" << a6.a0 << ", " << a6.a1 << ", "
16584 << static_cast<int>(a6.a2) << "), (" << a7.a0 << ", " << a7.a1
16585 << ", " << static_cast<int>(a7.a2) << "), (" << a8.a0 << ", "
16586 << a8.a1 << ", " << static_cast<int>(a8.a2) << "), (" << a9.a0
16587 << ", " << a9.a1 << ", " << static_cast<int>(a9.a2) << "))"
16588 << ")\n";
16589
16590 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
16591}
16592
16593// Used for testing structs and unions by value.
16594// Exactly word size struct on 64bit architectures.
16595// 10 struct arguments will exhaust available registers.
16597 // NOLINTNEXTLINE(whitespace/parens)
16598 void (*f)(Struct8BytesInt a0,
16599 Struct8BytesInt a1,
16600 Struct8BytesInt a2,
16601 Struct8BytesInt a3,
16602 Struct8BytesInt a4,
16603 Struct8BytesInt a5,
16604 Struct8BytesInt a6,
16605 Struct8BytesInt a7,
16606 Struct8BytesInt a8,
16607 Struct8BytesInt a9)) {
16608 Struct8BytesInt a0 = {};
16609 Struct8BytesInt a1 = {};
16610 Struct8BytesInt a2 = {};
16611 Struct8BytesInt a3 = {};
16612 Struct8BytesInt a4 = {};
16613 Struct8BytesInt a5 = {};
16614 Struct8BytesInt a6 = {};
16615 Struct8BytesInt a7 = {};
16616 Struct8BytesInt a8 = {};
16617 Struct8BytesInt a9 = {};
16618
16619 a0.a0 = -1;
16620 a0.a1 = 2;
16621 a0.a2 = -3;
16622 a1.a0 = 4;
16623 a1.a1 = -5;
16624 a1.a2 = 6;
16625 a2.a0 = -7;
16626 a2.a1 = 8;
16627 a2.a2 = -9;
16628 a3.a0 = 10;
16629 a3.a1 = -11;
16630 a3.a2 = 12;
16631 a4.a0 = -13;
16632 a4.a1 = 14;
16633 a4.a2 = -15;
16634 a5.a0 = 16;
16635 a5.a1 = -17;
16636 a5.a2 = 18;
16637 a6.a0 = -19;
16638 a6.a1 = 20;
16639 a6.a2 = -21;
16640 a7.a0 = 22;
16641 a7.a1 = -23;
16642 a7.a2 = 24;
16643 a8.a0 = -25;
16644 a8.a1 = 26;
16645 a8.a2 = -27;
16646 a9.a0 = 28;
16647 a9.a1 = -29;
16648 a9.a2 = 30;
16649
16650 std::cout << "Calling TestAsyncPassStruct8BytesIntx10(" << "((" << a0.a0
16651 << ", " << a0.a1 << ", " << a0.a2 << "), (" << a1.a0 << ", "
16652 << a1.a1 << ", " << a1.a2 << "), (" << a2.a0 << ", " << a2.a1
16653 << ", " << a2.a2 << "), (" << a3.a0 << ", " << a3.a1 << ", "
16654 << a3.a2 << "), (" << a4.a0 << ", " << a4.a1 << ", " << a4.a2
16655 << "), (" << a5.a0 << ", " << a5.a1 << ", " << a5.a2 << "), ("
16656 << a6.a0 << ", " << a6.a1 << ", " << a6.a2 << "), (" << a7.a0
16657 << ", " << a7.a1 << ", " << a7.a2 << "), (" << a8.a0 << ", "
16658 << a8.a1 << ", " << a8.a2 << "), (" << a9.a0 << ", " << a9.a1
16659 << ", " << a9.a2 << "))" << ")\n";
16660
16661 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
16662}
16663
16664// Used for testing structs and unions by value.
16665// Arguments passed in FP registers as long as they fit.
16666// 10 struct arguments will exhaust available registers.
16668 // NOLINTNEXTLINE(whitespace/parens)
16669 void (*f)(Struct8BytesHomogeneousFloat a0,
16689
16690 a0.a0 = -1.0;
16691 a0.a1 = 2.0;
16692 a1.a0 = -3.0;
16693 a1.a1 = 4.0;
16694 a2.a0 = -5.0;
16695 a2.a1 = 6.0;
16696 a3.a0 = -7.0;
16697 a3.a1 = 8.0;
16698 a4.a0 = -9.0;
16699 a4.a1 = 10.0;
16700 a5.a0 = -11.0;
16701 a5.a1 = 12.0;
16702 a6.a0 = -13.0;
16703 a6.a1 = 14.0;
16704 a7.a0 = -15.0;
16705 a7.a1 = 16.0;
16706 a8.a0 = -17.0;
16707 a8.a1 = 18.0;
16708 a9.a0 = -19.0;
16709 a9.a1 = 20.0;
16710
16711 std::cout << "Calling TestAsyncPassStruct8BytesHomogeneousFloatx10(" << "(("
16712 << a0.a0 << ", " << a0.a1 << "), (" << a1.a0 << ", " << a1.a1
16713 << "), (" << a2.a0 << ", " << a2.a1 << "), (" << a3.a0 << ", "
16714 << a3.a1 << "), (" << a4.a0 << ", " << a4.a1 << "), (" << a5.a0
16715 << ", " << a5.a1 << "), (" << a6.a0 << ", " << a6.a1 << "), ("
16716 << a7.a0 << ", " << a7.a1 << "), (" << a8.a0 << ", " << a8.a1
16717 << "), (" << a9.a0 << ", " << a9.a1 << "))" << ")\n";
16718
16719 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
16720}
16721
16722// Used for testing structs and unions by value.
16723// On x64, arguments go in int registers because it is not only float.
16724// 10 struct arguments will exhaust available registers.
16726 // NOLINTNEXTLINE(whitespace/parens)
16727 void (*f)(Struct8BytesMixed a0,
16736 Struct8BytesMixed a9)) {
16737 Struct8BytesMixed a0 = {};
16738 Struct8BytesMixed a1 = {};
16739 Struct8BytesMixed a2 = {};
16740 Struct8BytesMixed a3 = {};
16741 Struct8BytesMixed a4 = {};
16742 Struct8BytesMixed a5 = {};
16743 Struct8BytesMixed a6 = {};
16744 Struct8BytesMixed a7 = {};
16745 Struct8BytesMixed a8 = {};
16746 Struct8BytesMixed a9 = {};
16747
16748 a0.a0 = -1.0;
16749 a0.a1 = 2;
16750 a0.a2 = -3;
16751 a1.a0 = 4.0;
16752 a1.a1 = -5;
16753 a1.a2 = 6;
16754 a2.a0 = -7.0;
16755 a2.a1 = 8;
16756 a2.a2 = -9;
16757 a3.a0 = 10.0;
16758 a3.a1 = -11;
16759 a3.a2 = 12;
16760 a4.a0 = -13.0;
16761 a4.a1 = 14;
16762 a4.a2 = -15;
16763 a5.a0 = 16.0;
16764 a5.a1 = -17;
16765 a5.a2 = 18;
16766 a6.a0 = -19.0;
16767 a6.a1 = 20;
16768 a6.a2 = -21;
16769 a7.a0 = 22.0;
16770 a7.a1 = -23;
16771 a7.a2 = 24;
16772 a8.a0 = -25.0;
16773 a8.a1 = 26;
16774 a8.a2 = -27;
16775 a9.a0 = 28.0;
16776 a9.a1 = -29;
16777 a9.a2 = 30;
16778
16779 std::cout << "Calling TestAsyncPassStruct8BytesMixedx10(" << "((" << a0.a0
16780 << ", " << a0.a1 << ", " << a0.a2 << "), (" << a1.a0 << ", "
16781 << a1.a1 << ", " << a1.a2 << "), (" << a2.a0 << ", " << a2.a1
16782 << ", " << a2.a2 << "), (" << a3.a0 << ", " << a3.a1 << ", "
16783 << a3.a2 << "), (" << a4.a0 << ", " << a4.a1 << ", " << a4.a2
16784 << "), (" << a5.a0 << ", " << a5.a1 << ", " << a5.a2 << "), ("
16785 << a6.a0 << ", " << a6.a1 << ", " << a6.a2 << "), (" << a7.a0
16786 << ", " << a7.a1 << ", " << a7.a2 << "), (" << a8.a0 << ", "
16787 << a8.a1 << ", " << a8.a2 << "), (" << a9.a0 << ", " << a9.a1
16788 << ", " << a9.a2 << "))" << ")\n";
16789
16790 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
16791}
16792
16793// Used for testing structs and unions by value.
16794// Argument is a single byte over a multiple of word size.
16795// 10 struct arguments will exhaust available registers.
16796// Struct only has 1-byte aligned fields to test struct alignment itself.
16797// Tests upper bytes in the integer registers that are partly filled.
16798// Tests stack alignment of non word size stack arguments.
16800 // NOLINTNEXTLINE(whitespace/parens)
16801 void (*f)(Struct9BytesHomogeneousUint8 a0,
16821
16822 a0.a0 = 1;
16823 a0.a1 = 2;
16824 a0.a2 = 3;
16825 a0.a3 = 4;
16826 a0.a4 = 5;
16827 a0.a5 = 6;
16828 a0.a6 = 7;
16829 a0.a7 = 8;
16830 a0.a8 = 9;
16831 a1.a0 = 10;
16832 a1.a1 = 11;
16833 a1.a2 = 12;
16834 a1.a3 = 13;
16835 a1.a4 = 14;
16836 a1.a5 = 15;
16837 a1.a6 = 16;
16838 a1.a7 = 17;
16839 a1.a8 = 18;
16840 a2.a0 = 19;
16841 a2.a1 = 20;
16842 a2.a2 = 21;
16843 a2.a3 = 22;
16844 a2.a4 = 23;
16845 a2.a5 = 24;
16846 a2.a6 = 25;
16847 a2.a7 = 26;
16848 a2.a8 = 27;
16849 a3.a0 = 28;
16850 a3.a1 = 29;
16851 a3.a2 = 30;
16852 a3.a3 = 31;
16853 a3.a4 = 32;
16854 a3.a5 = 33;
16855 a3.a6 = 34;
16856 a3.a7 = 35;
16857 a3.a8 = 36;
16858 a4.a0 = 37;
16859 a4.a1 = 38;
16860 a4.a2 = 39;
16861 a4.a3 = 40;
16862 a4.a4 = 41;
16863 a4.a5 = 42;
16864 a4.a6 = 43;
16865 a4.a7 = 44;
16866 a4.a8 = 45;
16867 a5.a0 = 46;
16868 a5.a1 = 47;
16869 a5.a2 = 48;
16870 a5.a3 = 49;
16871 a5.a4 = 50;
16872 a5.a5 = 51;
16873 a5.a6 = 52;
16874 a5.a7 = 53;
16875 a5.a8 = 54;
16876 a6.a0 = 55;
16877 a6.a1 = 56;
16878 a6.a2 = 57;
16879 a6.a3 = 58;
16880 a6.a4 = 59;
16881 a6.a5 = 60;
16882 a6.a6 = 61;
16883 a6.a7 = 62;
16884 a6.a8 = 63;
16885 a7.a0 = 64;
16886 a7.a1 = 65;
16887 a7.a2 = 66;
16888 a7.a3 = 67;
16889 a7.a4 = 68;
16890 a7.a5 = 69;
16891 a7.a6 = 70;
16892 a7.a7 = 71;
16893 a7.a8 = 72;
16894 a8.a0 = 73;
16895 a8.a1 = 74;
16896 a8.a2 = 75;
16897 a8.a3 = 76;
16898 a8.a4 = 77;
16899 a8.a5 = 78;
16900 a8.a6 = 79;
16901 a8.a7 = 80;
16902 a8.a8 = 81;
16903 a9.a0 = 82;
16904 a9.a1 = 83;
16905 a9.a2 = 84;
16906 a9.a3 = 85;
16907 a9.a4 = 86;
16908 a9.a5 = 87;
16909 a9.a6 = 88;
16910 a9.a7 = 89;
16911 a9.a8 = 90;
16912
16913 std::cout
16914 << "Calling TestAsyncPassStruct9BytesHomogeneousUint8x10(" << "(("
16915 << static_cast<int>(a0.a0) << ", " << static_cast<int>(a0.a1) << ", "
16916 << static_cast<int>(a0.a2) << ", " << static_cast<int>(a0.a3) << ", "
16917 << static_cast<int>(a0.a4) << ", " << static_cast<int>(a0.a5) << ", "
16918 << static_cast<int>(a0.a6) << ", " << static_cast<int>(a0.a7) << ", "
16919 << static_cast<int>(a0.a8) << "), (" << static_cast<int>(a1.a0) << ", "
16920 << static_cast<int>(a1.a1) << ", " << static_cast<int>(a1.a2) << ", "
16921 << static_cast<int>(a1.a3) << ", " << static_cast<int>(a1.a4) << ", "
16922 << static_cast<int>(a1.a5) << ", " << static_cast<int>(a1.a6) << ", "
16923 << static_cast<int>(a1.a7) << ", " << static_cast<int>(a1.a8) << "), ("
16924 << static_cast<int>(a2.a0) << ", " << static_cast<int>(a2.a1) << ", "
16925 << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3) << ", "
16926 << static_cast<int>(a2.a4) << ", " << static_cast<int>(a2.a5) << ", "
16927 << static_cast<int>(a2.a6) << ", " << static_cast<int>(a2.a7) << ", "
16928 << static_cast<int>(a2.a8) << "), (" << static_cast<int>(a3.a0) << ", "
16929 << static_cast<int>(a3.a1) << ", " << static_cast<int>(a3.a2) << ", "
16930 << static_cast<int>(a3.a3) << ", " << static_cast<int>(a3.a4) << ", "
16931 << static_cast<int>(a3.a5) << ", " << static_cast<int>(a3.a6) << ", "
16932 << static_cast<int>(a3.a7) << ", " << static_cast<int>(a3.a8) << "), ("
16933 << static_cast<int>(a4.a0) << ", " << static_cast<int>(a4.a1) << ", "
16934 << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3) << ", "
16935 << static_cast<int>(a4.a4) << ", " << static_cast<int>(a4.a5) << ", "
16936 << static_cast<int>(a4.a6) << ", " << static_cast<int>(a4.a7) << ", "
16937 << static_cast<int>(a4.a8) << "), (" << static_cast<int>(a5.a0) << ", "
16938 << static_cast<int>(a5.a1) << ", " << static_cast<int>(a5.a2) << ", "
16939 << static_cast<int>(a5.a3) << ", " << static_cast<int>(a5.a4) << ", "
16940 << static_cast<int>(a5.a5) << ", " << static_cast<int>(a5.a6) << ", "
16941 << static_cast<int>(a5.a7) << ", " << static_cast<int>(a5.a8) << "), ("
16942 << static_cast<int>(a6.a0) << ", " << static_cast<int>(a6.a1) << ", "
16943 << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3) << ", "
16944 << static_cast<int>(a6.a4) << ", " << static_cast<int>(a6.a5) << ", "
16945 << static_cast<int>(a6.a6) << ", " << static_cast<int>(a6.a7) << ", "
16946 << static_cast<int>(a6.a8) << "), (" << static_cast<int>(a7.a0) << ", "
16947 << static_cast<int>(a7.a1) << ", " << static_cast<int>(a7.a2) << ", "
16948 << static_cast<int>(a7.a3) << ", " << static_cast<int>(a7.a4) << ", "
16949 << static_cast<int>(a7.a5) << ", " << static_cast<int>(a7.a6) << ", "
16950 << static_cast<int>(a7.a7) << ", " << static_cast<int>(a7.a8) << "), ("
16951 << static_cast<int>(a8.a0) << ", " << static_cast<int>(a8.a1) << ", "
16952 << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3) << ", "
16953 << static_cast<int>(a8.a4) << ", " << static_cast<int>(a8.a5) << ", "
16954 << static_cast<int>(a8.a6) << ", " << static_cast<int>(a8.a7) << ", "
16955 << static_cast<int>(a8.a8) << "), (" << static_cast<int>(a9.a0) << ", "
16956 << static_cast<int>(a9.a1) << ", " << static_cast<int>(a9.a2) << ", "
16957 << static_cast<int>(a9.a3) << ", " << static_cast<int>(a9.a4) << ", "
16958 << static_cast<int>(a9.a5) << ", " << static_cast<int>(a9.a6) << ", "
16959 << static_cast<int>(a9.a7) << ", " << static_cast<int>(a9.a8) << "))"
16960 << ")\n";
16961
16962 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
16963}
16964
16965// Used for testing structs and unions by value.
16966// Argument is a single byte over a multiple of word size.
16967// With alignment rules taken into account size is 12 or 16 bytes.
16968// 10 struct arguments will exhaust available registers.
16969//
16971 // NOLINTNEXTLINE(whitespace/parens)
16972 void (*f)(Struct9BytesInt4Or8ByteAligned a0,
16992
16993 a0.a0 = -1;
16994 a0.a1 = 2;
16995 a1.a0 = -3;
16996 a1.a1 = 4;
16997 a2.a0 = -5;
16998 a2.a1 = 6;
16999 a3.a0 = -7;
17000 a3.a1 = 8;
17001 a4.a0 = -9;
17002 a4.a1 = 10;
17003 a5.a0 = -11;
17004 a5.a1 = 12;
17005 a6.a0 = -13;
17006 a6.a1 = 14;
17007 a7.a0 = -15;
17008 a7.a1 = 16;
17009 a8.a0 = -17;
17010 a8.a1 = 18;
17011 a9.a0 = -19;
17012 a9.a1 = 20;
17013
17014 std::cout << "Calling TestAsyncPassStruct9BytesInt4Or8ByteAlignedx10(" << "(("
17015 << a0.a0 << ", " << static_cast<int>(a0.a1) << "), (" << a1.a0
17016 << ", " << static_cast<int>(a1.a1) << "), (" << a2.a0 << ", "
17017 << static_cast<int>(a2.a1) << "), (" << a3.a0 << ", "
17018 << static_cast<int>(a3.a1) << "), (" << a4.a0 << ", "
17019 << static_cast<int>(a4.a1) << "), (" << a5.a0 << ", "
17020 << static_cast<int>(a5.a1) << "), (" << a6.a0 << ", "
17021 << static_cast<int>(a6.a1) << "), (" << a7.a0 << ", "
17022 << static_cast<int>(a7.a1) << "), (" << a8.a0 << ", "
17023 << static_cast<int>(a8.a1) << "), (" << a9.a0 << ", "
17024 << static_cast<int>(a9.a1) << "))" << ")\n";
17025
17026 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
17027}
17028
17029// Used for testing structs and unions by value.
17030// Arguments in FPU registers on arm hardfp and arm64.
17031// Struct arguments will exhaust available registers, and leave some empty.
17032// The last argument is to test whether arguments are backfilled.
17034 // NOLINTNEXTLINE(whitespace/parens)
17035 void (*f)(Struct12BytesHomogeneousFloat a0,
17047
17048 a0.a0 = -1.0;
17049 a0.a1 = 2.0;
17050 a0.a2 = -3.0;
17051 a1.a0 = 4.0;
17052 a1.a1 = -5.0;
17053 a1.a2 = 6.0;
17054 a2.a0 = -7.0;
17055 a2.a1 = 8.0;
17056 a2.a2 = -9.0;
17057 a3.a0 = 10.0;
17058 a3.a1 = -11.0;
17059 a3.a2 = 12.0;
17060 a4.a0 = -13.0;
17061 a4.a1 = 14.0;
17062 a4.a2 = -15.0;
17063 a5.a0 = 16.0;
17064 a5.a1 = -17.0;
17065 a5.a2 = 18.0;
17066
17067 std::cout << "Calling TestAsyncPassStruct12BytesHomogeneousFloatx6(" << "(("
17068 << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << "), (" << a1.a0
17069 << ", " << a1.a1 << ", " << a1.a2 << "), (" << a2.a0 << ", "
17070 << a2.a1 << ", " << a2.a2 << "), (" << a3.a0 << ", " << a3.a1
17071 << ", " << a3.a2 << "), (" << a4.a0 << ", " << a4.a1 << ", "
17072 << a4.a2 << "), (" << a5.a0 << ", " << a5.a1 << ", " << a5.a2
17073 << "))" << ")\n";
17074
17075 f(a0, a1, a2, a3, a4, a5);
17076}
17077
17078// Used for testing structs and unions by value.
17079// On Linux x64 argument is transferred on stack because it is over 16 bytes.
17080// Arguments in FPU registers on arm hardfp and arm64.
17081// 5 struct arguments will exhaust available registers.
17083 // NOLINTNEXTLINE(whitespace/parens)
17084 void (*f)(Struct16BytesHomogeneousFloat a0,
17094
17095 a0.a0 = -1.0;
17096 a0.a1 = 2.0;
17097 a0.a2 = -3.0;
17098 a0.a3 = 4.0;
17099 a1.a0 = -5.0;
17100 a1.a1 = 6.0;
17101 a1.a2 = -7.0;
17102 a1.a3 = 8.0;
17103 a2.a0 = -9.0;
17104 a2.a1 = 10.0;
17105 a2.a2 = -11.0;
17106 a2.a3 = 12.0;
17107 a3.a0 = -13.0;
17108 a3.a1 = 14.0;
17109 a3.a2 = -15.0;
17110 a3.a3 = 16.0;
17111 a4.a0 = -17.0;
17112 a4.a1 = 18.0;
17113 a4.a2 = -19.0;
17114 a4.a3 = 20.0;
17115
17116 std::cout << "Calling TestAsyncPassStruct16BytesHomogeneousFloatx5(" << "(("
17117 << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
17118 << "), (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", "
17119 << a1.a3 << "), (" << a2.a0 << ", " << a2.a1 << ", " << a2.a2
17120 << ", " << a2.a3 << "), (" << a3.a0 << ", " << a3.a1 << ", "
17121 << a3.a2 << ", " << a3.a3 << "), (" << a4.a0 << ", " << a4.a1
17122 << ", " << a4.a2 << ", " << a4.a3 << "))" << ")\n";
17123
17124 f(a0, a1, a2, a3, a4);
17125}
17126
17127// Used for testing structs and unions by value.
17128// On x64, arguments are split over FP and int registers.
17129// On x64, it will exhaust the integer registers with the 6th argument.
17130// The rest goes on the stack.
17131// On arm, arguments are 8 byte aligned.
17133 // NOLINTNEXTLINE(whitespace/parens)
17134 void (*f)(Struct16BytesMixed a0,
17143 Struct16BytesMixed a9)) {
17144 Struct16BytesMixed a0 = {};
17145 Struct16BytesMixed a1 = {};
17146 Struct16BytesMixed a2 = {};
17147 Struct16BytesMixed a3 = {};
17148 Struct16BytesMixed a4 = {};
17149 Struct16BytesMixed a5 = {};
17150 Struct16BytesMixed a6 = {};
17151 Struct16BytesMixed a7 = {};
17152 Struct16BytesMixed a8 = {};
17153 Struct16BytesMixed a9 = {};
17154
17155 a0.a0 = -1.0;
17156 a0.a1 = 2;
17157 a1.a0 = -3.0;
17158 a1.a1 = 4;
17159 a2.a0 = -5.0;
17160 a2.a1 = 6;
17161 a3.a0 = -7.0;
17162 a3.a1 = 8;
17163 a4.a0 = -9.0;
17164 a4.a1 = 10;
17165 a5.a0 = -11.0;
17166 a5.a1 = 12;
17167 a6.a0 = -13.0;
17168 a6.a1 = 14;
17169 a7.a0 = -15.0;
17170 a7.a1 = 16;
17171 a8.a0 = -17.0;
17172 a8.a1 = 18;
17173 a9.a0 = -19.0;
17174 a9.a1 = 20;
17175
17176 std::cout << "Calling TestAsyncPassStruct16BytesMixedx10(" << "((" << a0.a0
17177 << ", " << a0.a1 << "), (" << a1.a0 << ", " << a1.a1 << "), ("
17178 << a2.a0 << ", " << a2.a1 << "), (" << a3.a0 << ", " << a3.a1
17179 << "), (" << a4.a0 << ", " << a4.a1 << "), (" << a5.a0 << ", "
17180 << a5.a1 << "), (" << a6.a0 << ", " << a6.a1 << "), (" << a7.a0
17181 << ", " << a7.a1 << "), (" << a8.a0 << ", " << a8.a1 << "), ("
17182 << a9.a0 << ", " << a9.a1 << "))" << ")\n";
17183
17184 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
17185}
17186
17187// Used for testing structs and unions by value.
17188// On x64, arguments are split over FP and int registers.
17189// On x64, it will exhaust the integer registers with the 6th argument.
17190// The rest goes on the stack.
17191// On arm, arguments are 4 byte aligned.
17193 // NOLINTNEXTLINE(whitespace/parens)
17194 void (*f)(Struct16BytesMixed2 a0,
17203 Struct16BytesMixed2 a9)) {
17204 Struct16BytesMixed2 a0 = {};
17205 Struct16BytesMixed2 a1 = {};
17206 Struct16BytesMixed2 a2 = {};
17207 Struct16BytesMixed2 a3 = {};
17208 Struct16BytesMixed2 a4 = {};
17209 Struct16BytesMixed2 a5 = {};
17210 Struct16BytesMixed2 a6 = {};
17211 Struct16BytesMixed2 a7 = {};
17212 Struct16BytesMixed2 a8 = {};
17213 Struct16BytesMixed2 a9 = {};
17214
17215 a0.a0 = -1.0;
17216 a0.a1 = 2.0;
17217 a0.a2 = -3.0;
17218 a0.a3 = 4;
17219 a1.a0 = -5.0;
17220 a1.a1 = 6.0;
17221 a1.a2 = -7.0;
17222 a1.a3 = 8;
17223 a2.a0 = -9.0;
17224 a2.a1 = 10.0;
17225 a2.a2 = -11.0;
17226 a2.a3 = 12;
17227 a3.a0 = -13.0;
17228 a3.a1 = 14.0;
17229 a3.a2 = -15.0;
17230 a3.a3 = 16;
17231 a4.a0 = -17.0;
17232 a4.a1 = 18.0;
17233 a4.a2 = -19.0;
17234 a4.a3 = 20;
17235 a5.a0 = -21.0;
17236 a5.a1 = 22.0;
17237 a5.a2 = -23.0;
17238 a5.a3 = 24;
17239 a6.a0 = -25.0;
17240 a6.a1 = 26.0;
17241 a6.a2 = -27.0;
17242 a6.a3 = 28;
17243 a7.a0 = -29.0;
17244 a7.a1 = 30.0;
17245 a7.a2 = -31.0;
17246 a7.a3 = 32;
17247 a8.a0 = -33.0;
17248 a8.a1 = 34.0;
17249 a8.a2 = -35.0;
17250 a8.a3 = 36;
17251 a9.a0 = -37.0;
17252 a9.a1 = 38.0;
17253 a9.a2 = -39.0;
17254 a9.a3 = 40;
17255
17256 std::cout << "Calling TestAsyncPassStruct16BytesMixed2x10(" << "((" << a0.a0
17257 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3 << "), ("
17258 << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", " << a1.a3
17259 << "), (" << a2.a0 << ", " << a2.a1 << ", " << a2.a2 << ", "
17260 << a2.a3 << "), (" << a3.a0 << ", " << a3.a1 << ", " << a3.a2
17261 << ", " << a3.a3 << "), (" << a4.a0 << ", " << a4.a1 << ", "
17262 << a4.a2 << ", " << a4.a3 << "), (" << a5.a0 << ", " << a5.a1
17263 << ", " << a5.a2 << ", " << a5.a3 << "), (" << a6.a0 << ", "
17264 << a6.a1 << ", " << a6.a2 << ", " << a6.a3 << "), (" << a7.a0
17265 << ", " << a7.a1 << ", " << a7.a2 << ", " << a7.a3 << "), ("
17266 << a8.a0 << ", " << a8.a1 << ", " << a8.a2 << ", " << a8.a3
17267 << "), (" << a9.a0 << ", " << a9.a1 << ", " << a9.a2 << ", "
17268 << a9.a3 << "))" << ")\n";
17269
17270 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
17271}
17272
17273// Used for testing structs and unions by value.
17274// Arguments are passed as pointer to copy on arm64.
17275// Tests that the memory allocated for copies are rounded up to word size.
17277 // NOLINTNEXTLINE(whitespace/parens)
17278 void (*f)(Struct17BytesInt a0,
17287 Struct17BytesInt a9)) {
17288 Struct17BytesInt a0 = {};
17289 Struct17BytesInt a1 = {};
17290 Struct17BytesInt a2 = {};
17291 Struct17BytesInt a3 = {};
17292 Struct17BytesInt a4 = {};
17293 Struct17BytesInt a5 = {};
17294 Struct17BytesInt a6 = {};
17295 Struct17BytesInt a7 = {};
17296 Struct17BytesInt a8 = {};
17297 Struct17BytesInt a9 = {};
17298
17299 a0.a0 = -1;
17300 a0.a1 = 2;
17301 a0.a2 = -3;
17302 a1.a0 = 4;
17303 a1.a1 = -5;
17304 a1.a2 = 6;
17305 a2.a0 = -7;
17306 a2.a1 = 8;
17307 a2.a2 = -9;
17308 a3.a0 = 10;
17309 a3.a1 = -11;
17310 a3.a2 = 12;
17311 a4.a0 = -13;
17312 a4.a1 = 14;
17313 a4.a2 = -15;
17314 a5.a0 = 16;
17315 a5.a1 = -17;
17316 a5.a2 = 18;
17317 a6.a0 = -19;
17318 a6.a1 = 20;
17319 a6.a2 = -21;
17320 a7.a0 = 22;
17321 a7.a1 = -23;
17322 a7.a2 = 24;
17323 a8.a0 = -25;
17324 a8.a1 = 26;
17325 a8.a2 = -27;
17326 a9.a0 = 28;
17327 a9.a1 = -29;
17328 a9.a2 = 30;
17329
17330 std::cout << "Calling TestAsyncPassStruct17BytesIntx10(" << "((" << a0.a0
17331 << ", " << a0.a1 << ", " << static_cast<int>(a0.a2) << "), ("
17332 << a1.a0 << ", " << a1.a1 << ", " << static_cast<int>(a1.a2)
17333 << "), (" << a2.a0 << ", " << a2.a1 << ", "
17334 << static_cast<int>(a2.a2) << "), (" << a3.a0 << ", " << a3.a1
17335 << ", " << static_cast<int>(a3.a2) << "), (" << a4.a0 << ", "
17336 << a4.a1 << ", " << static_cast<int>(a4.a2) << "), (" << a5.a0
17337 << ", " << a5.a1 << ", " << static_cast<int>(a5.a2) << "), ("
17338 << a6.a0 << ", " << a6.a1 << ", " << static_cast<int>(a6.a2)
17339 << "), (" << a7.a0 << ", " << a7.a1 << ", "
17340 << static_cast<int>(a7.a2) << "), (" << a8.a0 << ", " << a8.a1
17341 << ", " << static_cast<int>(a8.a2) << "), (" << a9.a0 << ", "
17342 << a9.a1 << ", " << static_cast<int>(a9.a2) << "))" << ")\n";
17343
17344 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
17345}
17346
17347// Used for testing structs and unions by value.
17348// The minimum alignment of this struct is only 1 byte based on its fields.
17349// Test that the memory backing these structs is extended to the right size.
17350//
17352 // NOLINTNEXTLINE(whitespace/parens)
17353 void (*f)(Struct19BytesHomogeneousUint8 a0,
17373
17374 a0.a0 = 1;
17375 a0.a1 = 2;
17376 a0.a2 = 3;
17377 a0.a3 = 4;
17378 a0.a4 = 5;
17379 a0.a5 = 6;
17380 a0.a6 = 7;
17381 a0.a7 = 8;
17382 a0.a8 = 9;
17383 a0.a9 = 10;
17384 a0.a10 = 11;
17385 a0.a11 = 12;
17386 a0.a12 = 13;
17387 a0.a13 = 14;
17388 a0.a14 = 15;
17389 a0.a15 = 16;
17390 a0.a16 = 17;
17391 a0.a17 = 18;
17392 a0.a18 = 19;
17393 a1.a0 = 20;
17394 a1.a1 = 21;
17395 a1.a2 = 22;
17396 a1.a3 = 23;
17397 a1.a4 = 24;
17398 a1.a5 = 25;
17399 a1.a6 = 26;
17400 a1.a7 = 27;
17401 a1.a8 = 28;
17402 a1.a9 = 29;
17403 a1.a10 = 30;
17404 a1.a11 = 31;
17405 a1.a12 = 32;
17406 a1.a13 = 33;
17407 a1.a14 = 34;
17408 a1.a15 = 35;
17409 a1.a16 = 36;
17410 a1.a17 = 37;
17411 a1.a18 = 38;
17412 a2.a0 = 39;
17413 a2.a1 = 40;
17414 a2.a2 = 41;
17415 a2.a3 = 42;
17416 a2.a4 = 43;
17417 a2.a5 = 44;
17418 a2.a6 = 45;
17419 a2.a7 = 46;
17420 a2.a8 = 47;
17421 a2.a9 = 48;
17422 a2.a10 = 49;
17423 a2.a11 = 50;
17424 a2.a12 = 51;
17425 a2.a13 = 52;
17426 a2.a14 = 53;
17427 a2.a15 = 54;
17428 a2.a16 = 55;
17429 a2.a17 = 56;
17430 a2.a18 = 57;
17431 a3.a0 = 58;
17432 a3.a1 = 59;
17433 a3.a2 = 60;
17434 a3.a3 = 61;
17435 a3.a4 = 62;
17436 a3.a5 = 63;
17437 a3.a6 = 64;
17438 a3.a7 = 65;
17439 a3.a8 = 66;
17440 a3.a9 = 67;
17441 a3.a10 = 68;
17442 a3.a11 = 69;
17443 a3.a12 = 70;
17444 a3.a13 = 71;
17445 a3.a14 = 72;
17446 a3.a15 = 73;
17447 a3.a16 = 74;
17448 a3.a17 = 75;
17449 a3.a18 = 76;
17450 a4.a0 = 77;
17451 a4.a1 = 78;
17452 a4.a2 = 79;
17453 a4.a3 = 80;
17454 a4.a4 = 81;
17455 a4.a5 = 82;
17456 a4.a6 = 83;
17457 a4.a7 = 84;
17458 a4.a8 = 85;
17459 a4.a9 = 86;
17460 a4.a10 = 87;
17461 a4.a11 = 88;
17462 a4.a12 = 89;
17463 a4.a13 = 90;
17464 a4.a14 = 91;
17465 a4.a15 = 92;
17466 a4.a16 = 93;
17467 a4.a17 = 94;
17468 a4.a18 = 95;
17469 a5.a0 = 96;
17470 a5.a1 = 97;
17471 a5.a2 = 98;
17472 a5.a3 = 99;
17473 a5.a4 = 100;
17474 a5.a5 = 101;
17475 a5.a6 = 102;
17476 a5.a7 = 103;
17477 a5.a8 = 104;
17478 a5.a9 = 105;
17479 a5.a10 = 106;
17480 a5.a11 = 107;
17481 a5.a12 = 108;
17482 a5.a13 = 109;
17483 a5.a14 = 110;
17484 a5.a15 = 111;
17485 a5.a16 = 112;
17486 a5.a17 = 113;
17487 a5.a18 = 114;
17488 a6.a0 = 115;
17489 a6.a1 = 116;
17490 a6.a2 = 117;
17491 a6.a3 = 118;
17492 a6.a4 = 119;
17493 a6.a5 = 120;
17494 a6.a6 = 121;
17495 a6.a7 = 122;
17496 a6.a8 = 123;
17497 a6.a9 = 124;
17498 a6.a10 = 125;
17499 a6.a11 = 126;
17500 a6.a12 = 127;
17501 a6.a13 = 128;
17502 a6.a14 = 129;
17503 a6.a15 = 130;
17504 a6.a16 = 131;
17505 a6.a17 = 132;
17506 a6.a18 = 133;
17507 a7.a0 = 134;
17508 a7.a1 = 135;
17509 a7.a2 = 136;
17510 a7.a3 = 137;
17511 a7.a4 = 138;
17512 a7.a5 = 139;
17513 a7.a6 = 140;
17514 a7.a7 = 141;
17515 a7.a8 = 142;
17516 a7.a9 = 143;
17517 a7.a10 = 144;
17518 a7.a11 = 145;
17519 a7.a12 = 146;
17520 a7.a13 = 147;
17521 a7.a14 = 148;
17522 a7.a15 = 149;
17523 a7.a16 = 150;
17524 a7.a17 = 151;
17525 a7.a18 = 152;
17526 a8.a0 = 153;
17527 a8.a1 = 154;
17528 a8.a2 = 155;
17529 a8.a3 = 156;
17530 a8.a4 = 157;
17531 a8.a5 = 158;
17532 a8.a6 = 159;
17533 a8.a7 = 160;
17534 a8.a8 = 161;
17535 a8.a9 = 162;
17536 a8.a10 = 163;
17537 a8.a11 = 164;
17538 a8.a12 = 165;
17539 a8.a13 = 166;
17540 a8.a14 = 167;
17541 a8.a15 = 168;
17542 a8.a16 = 169;
17543 a8.a17 = 170;
17544 a8.a18 = 171;
17545 a9.a0 = 172;
17546 a9.a1 = 173;
17547 a9.a2 = 174;
17548 a9.a3 = 175;
17549 a9.a4 = 176;
17550 a9.a5 = 177;
17551 a9.a6 = 178;
17552 a9.a7 = 179;
17553 a9.a8 = 180;
17554 a9.a9 = 181;
17555 a9.a10 = 182;
17556 a9.a11 = 183;
17557 a9.a12 = 184;
17558 a9.a13 = 185;
17559 a9.a14 = 186;
17560 a9.a15 = 187;
17561 a9.a16 = 188;
17562 a9.a17 = 189;
17563 a9.a18 = 190;
17564
17565 std::cout
17566 << "Calling TestAsyncPassStruct19BytesHomogeneousUint8x10(" << "(("
17567 << static_cast<int>(a0.a0) << ", " << static_cast<int>(a0.a1) << ", "
17568 << static_cast<int>(a0.a2) << ", " << static_cast<int>(a0.a3) << ", "
17569 << static_cast<int>(a0.a4) << ", " << static_cast<int>(a0.a5) << ", "
17570 << static_cast<int>(a0.a6) << ", " << static_cast<int>(a0.a7) << ", "
17571 << static_cast<int>(a0.a8) << ", " << static_cast<int>(a0.a9) << ", "
17572 << static_cast<int>(a0.a10) << ", " << static_cast<int>(a0.a11) << ", "
17573 << static_cast<int>(a0.a12) << ", " << static_cast<int>(a0.a13) << ", "
17574 << static_cast<int>(a0.a14) << ", " << static_cast<int>(a0.a15) << ", "
17575 << static_cast<int>(a0.a16) << ", " << static_cast<int>(a0.a17) << ", "
17576 << static_cast<int>(a0.a18) << "), (" << static_cast<int>(a1.a0) << ", "
17577 << static_cast<int>(a1.a1) << ", " << static_cast<int>(a1.a2) << ", "
17578 << static_cast<int>(a1.a3) << ", " << static_cast<int>(a1.a4) << ", "
17579 << static_cast<int>(a1.a5) << ", " << static_cast<int>(a1.a6) << ", "
17580 << static_cast<int>(a1.a7) << ", " << static_cast<int>(a1.a8) << ", "
17581 << static_cast<int>(a1.a9) << ", " << static_cast<int>(a1.a10) << ", "
17582 << static_cast<int>(a1.a11) << ", " << static_cast<int>(a1.a12) << ", "
17583 << static_cast<int>(a1.a13) << ", " << static_cast<int>(a1.a14) << ", "
17584 << static_cast<int>(a1.a15) << ", " << static_cast<int>(a1.a16) << ", "
17585 << static_cast<int>(a1.a17) << ", " << static_cast<int>(a1.a18) << "), ("
17586 << static_cast<int>(a2.a0) << ", " << static_cast<int>(a2.a1) << ", "
17587 << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3) << ", "
17588 << static_cast<int>(a2.a4) << ", " << static_cast<int>(a2.a5) << ", "
17589 << static_cast<int>(a2.a6) << ", " << static_cast<int>(a2.a7) << ", "
17590 << static_cast<int>(a2.a8) << ", " << static_cast<int>(a2.a9) << ", "
17591 << static_cast<int>(a2.a10) << ", " << static_cast<int>(a2.a11) << ", "
17592 << static_cast<int>(a2.a12) << ", " << static_cast<int>(a2.a13) << ", "
17593 << static_cast<int>(a2.a14) << ", " << static_cast<int>(a2.a15) << ", "
17594 << static_cast<int>(a2.a16) << ", " << static_cast<int>(a2.a17) << ", "
17595 << static_cast<int>(a2.a18) << "), (" << static_cast<int>(a3.a0) << ", "
17596 << static_cast<int>(a3.a1) << ", " << static_cast<int>(a3.a2) << ", "
17597 << static_cast<int>(a3.a3) << ", " << static_cast<int>(a3.a4) << ", "
17598 << static_cast<int>(a3.a5) << ", " << static_cast<int>(a3.a6) << ", "
17599 << static_cast<int>(a3.a7) << ", " << static_cast<int>(a3.a8) << ", "
17600 << static_cast<int>(a3.a9) << ", " << static_cast<int>(a3.a10) << ", "
17601 << static_cast<int>(a3.a11) << ", " << static_cast<int>(a3.a12) << ", "
17602 << static_cast<int>(a3.a13) << ", " << static_cast<int>(a3.a14) << ", "
17603 << static_cast<int>(a3.a15) << ", " << static_cast<int>(a3.a16) << ", "
17604 << static_cast<int>(a3.a17) << ", " << static_cast<int>(a3.a18) << "), ("
17605 << static_cast<int>(a4.a0) << ", " << static_cast<int>(a4.a1) << ", "
17606 << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3) << ", "
17607 << static_cast<int>(a4.a4) << ", " << static_cast<int>(a4.a5) << ", "
17608 << static_cast<int>(a4.a6) << ", " << static_cast<int>(a4.a7) << ", "
17609 << static_cast<int>(a4.a8) << ", " << static_cast<int>(a4.a9) << ", "
17610 << static_cast<int>(a4.a10) << ", " << static_cast<int>(a4.a11) << ", "
17611 << static_cast<int>(a4.a12) << ", " << static_cast<int>(a4.a13) << ", "
17612 << static_cast<int>(a4.a14) << ", " << static_cast<int>(a4.a15) << ", "
17613 << static_cast<int>(a4.a16) << ", " << static_cast<int>(a4.a17) << ", "
17614 << static_cast<int>(a4.a18) << "), (" << static_cast<int>(a5.a0) << ", "
17615 << static_cast<int>(a5.a1) << ", " << static_cast<int>(a5.a2) << ", "
17616 << static_cast<int>(a5.a3) << ", " << static_cast<int>(a5.a4) << ", "
17617 << static_cast<int>(a5.a5) << ", " << static_cast<int>(a5.a6) << ", "
17618 << static_cast<int>(a5.a7) << ", " << static_cast<int>(a5.a8) << ", "
17619 << static_cast<int>(a5.a9) << ", " << static_cast<int>(a5.a10) << ", "
17620 << static_cast<int>(a5.a11) << ", " << static_cast<int>(a5.a12) << ", "
17621 << static_cast<int>(a5.a13) << ", " << static_cast<int>(a5.a14) << ", "
17622 << static_cast<int>(a5.a15) << ", " << static_cast<int>(a5.a16) << ", "
17623 << static_cast<int>(a5.a17) << ", " << static_cast<int>(a5.a18) << "), ("
17624 << static_cast<int>(a6.a0) << ", " << static_cast<int>(a6.a1) << ", "
17625 << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3) << ", "
17626 << static_cast<int>(a6.a4) << ", " << static_cast<int>(a6.a5) << ", "
17627 << static_cast<int>(a6.a6) << ", " << static_cast<int>(a6.a7) << ", "
17628 << static_cast<int>(a6.a8) << ", " << static_cast<int>(a6.a9) << ", "
17629 << static_cast<int>(a6.a10) << ", " << static_cast<int>(a6.a11) << ", "
17630 << static_cast<int>(a6.a12) << ", " << static_cast<int>(a6.a13) << ", "
17631 << static_cast<int>(a6.a14) << ", " << static_cast<int>(a6.a15) << ", "
17632 << static_cast<int>(a6.a16) << ", " << static_cast<int>(a6.a17) << ", "
17633 << static_cast<int>(a6.a18) << "), (" << static_cast<int>(a7.a0) << ", "
17634 << static_cast<int>(a7.a1) << ", " << static_cast<int>(a7.a2) << ", "
17635 << static_cast<int>(a7.a3) << ", " << static_cast<int>(a7.a4) << ", "
17636 << static_cast<int>(a7.a5) << ", " << static_cast<int>(a7.a6) << ", "
17637 << static_cast<int>(a7.a7) << ", " << static_cast<int>(a7.a8) << ", "
17638 << static_cast<int>(a7.a9) << ", " << static_cast<int>(a7.a10) << ", "
17639 << static_cast<int>(a7.a11) << ", " << static_cast<int>(a7.a12) << ", "
17640 << static_cast<int>(a7.a13) << ", " << static_cast<int>(a7.a14) << ", "
17641 << static_cast<int>(a7.a15) << ", " << static_cast<int>(a7.a16) << ", "
17642 << static_cast<int>(a7.a17) << ", " << static_cast<int>(a7.a18) << "), ("
17643 << static_cast<int>(a8.a0) << ", " << static_cast<int>(a8.a1) << ", "
17644 << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3) << ", "
17645 << static_cast<int>(a8.a4) << ", " << static_cast<int>(a8.a5) << ", "
17646 << static_cast<int>(a8.a6) << ", " << static_cast<int>(a8.a7) << ", "
17647 << static_cast<int>(a8.a8) << ", " << static_cast<int>(a8.a9) << ", "
17648 << static_cast<int>(a8.a10) << ", " << static_cast<int>(a8.a11) << ", "
17649 << static_cast<int>(a8.a12) << ", " << static_cast<int>(a8.a13) << ", "
17650 << static_cast<int>(a8.a14) << ", " << static_cast<int>(a8.a15) << ", "
17651 << static_cast<int>(a8.a16) << ", " << static_cast<int>(a8.a17) << ", "
17652 << static_cast<int>(a8.a18) << "), (" << static_cast<int>(a9.a0) << ", "
17653 << static_cast<int>(a9.a1) << ", " << static_cast<int>(a9.a2) << ", "
17654 << static_cast<int>(a9.a3) << ", " << static_cast<int>(a9.a4) << ", "
17655 << static_cast<int>(a9.a5) << ", " << static_cast<int>(a9.a6) << ", "
17656 << static_cast<int>(a9.a7) << ", " << static_cast<int>(a9.a8) << ", "
17657 << static_cast<int>(a9.a9) << ", " << static_cast<int>(a9.a10) << ", "
17658 << static_cast<int>(a9.a11) << ", " << static_cast<int>(a9.a12) << ", "
17659 << static_cast<int>(a9.a13) << ", " << static_cast<int>(a9.a14) << ", "
17660 << static_cast<int>(a9.a15) << ", " << static_cast<int>(a9.a16) << ", "
17661 << static_cast<int>(a9.a17) << ", " << static_cast<int>(a9.a18) << "))"
17662 << ")\n";
17663
17664 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
17665}
17666
17667// Used for testing structs and unions by value.
17668// Argument too big to go into integer registers on arm64.
17669// The arguments are passed as pointers to copies.
17670// The amount of arguments exhausts the number of integer registers, such that
17671// pointers to copies are also passed on the stack.
17673 // NOLINTNEXTLINE(whitespace/parens)
17674 void (*f)(Struct20BytesHomogeneousInt32 a0,
17694
17695 a0.a0 = -1;
17696 a0.a1 = 2;
17697 a0.a2 = -3;
17698 a0.a3 = 4;
17699 a0.a4 = -5;
17700 a1.a0 = 6;
17701 a1.a1 = -7;
17702 a1.a2 = 8;
17703 a1.a3 = -9;
17704 a1.a4 = 10;
17705 a2.a0 = -11;
17706 a2.a1 = 12;
17707 a2.a2 = -13;
17708 a2.a3 = 14;
17709 a2.a4 = -15;
17710 a3.a0 = 16;
17711 a3.a1 = -17;
17712 a3.a2 = 18;
17713 a3.a3 = -19;
17714 a3.a4 = 20;
17715 a4.a0 = -21;
17716 a4.a1 = 22;
17717 a4.a2 = -23;
17718 a4.a3 = 24;
17719 a4.a4 = -25;
17720 a5.a0 = 26;
17721 a5.a1 = -27;
17722 a5.a2 = 28;
17723 a5.a3 = -29;
17724 a5.a4 = 30;
17725 a6.a0 = -31;
17726 a6.a1 = 32;
17727 a6.a2 = -33;
17728 a6.a3 = 34;
17729 a6.a4 = -35;
17730 a7.a0 = 36;
17731 a7.a1 = -37;
17732 a7.a2 = 38;
17733 a7.a3 = -39;
17734 a7.a4 = 40;
17735 a8.a0 = -41;
17736 a8.a1 = 42;
17737 a8.a2 = -43;
17738 a8.a3 = 44;
17739 a8.a4 = -45;
17740 a9.a0 = 46;
17741 a9.a1 = -47;
17742 a9.a2 = 48;
17743 a9.a3 = -49;
17744 a9.a4 = 50;
17745
17746 std::cout << "Calling TestAsyncPassStruct20BytesHomogeneousInt32x10(" << "(("
17747 << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3 << ", "
17748 << a0.a4 << "), (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2
17749 << ", " << a1.a3 << ", " << a1.a4 << "), (" << a2.a0 << ", "
17750 << a2.a1 << ", " << a2.a2 << ", " << a2.a3 << ", " << a2.a4
17751 << "), (" << a3.a0 << ", " << a3.a1 << ", " << a3.a2 << ", "
17752 << a3.a3 << ", " << a3.a4 << "), (" << a4.a0 << ", " << a4.a1
17753 << ", " << a4.a2 << ", " << a4.a3 << ", " << a4.a4 << "), ("
17754 << a5.a0 << ", " << a5.a1 << ", " << a5.a2 << ", " << a5.a3 << ", "
17755 << a5.a4 << "), (" << a6.a0 << ", " << a6.a1 << ", " << a6.a2
17756 << ", " << a6.a3 << ", " << a6.a4 << "), (" << a7.a0 << ", "
17757 << a7.a1 << ", " << a7.a2 << ", " << a7.a3 << ", " << a7.a4
17758 << "), (" << a8.a0 << ", " << a8.a1 << ", " << a8.a2 << ", "
17759 << a8.a3 << ", " << a8.a4 << "), (" << a9.a0 << ", " << a9.a1
17760 << ", " << a9.a2 << ", " << a9.a3 << ", " << a9.a4 << "))" << ")\n";
17761
17762 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
17763}
17764
17765// Used for testing structs and unions by value.
17766// Argument too big to go into FPU registers in hardfp and arm64.
17768 // NOLINTNEXTLINE(whitespace/parens)
17769 void (*f)(Struct20BytesHomogeneousFloat a0)) {
17771
17772 a0.a0 = -1.0;
17773 a0.a1 = 2.0;
17774 a0.a2 = -3.0;
17775 a0.a3 = 4.0;
17776 a0.a4 = -5.0;
17777
17778 std::cout << "Calling TestAsyncPassStruct20BytesHomogeneousFloat(" << "(("
17779 << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3 << ", "
17780 << a0.a4 << "))" << ")\n";
17781
17782 f(a0);
17783}
17784
17785// Used for testing structs and unions by value.
17786// Arguments in FPU registers on arm64.
17787// 5 struct arguments will exhaust available registers.
17789 // NOLINTNEXTLINE(whitespace/parens)
17790 void (*f)(Struct32BytesHomogeneousDouble a0,
17800
17801 a0.a0 = -1.0;
17802 a0.a1 = 2.0;
17803 a0.a2 = -3.0;
17804 a0.a3 = 4.0;
17805 a1.a0 = -5.0;
17806 a1.a1 = 6.0;
17807 a1.a2 = -7.0;
17808 a1.a3 = 8.0;
17809 a2.a0 = -9.0;
17810 a2.a1 = 10.0;
17811 a2.a2 = -11.0;
17812 a2.a3 = 12.0;
17813 a3.a0 = -13.0;
17814 a3.a1 = 14.0;
17815 a3.a2 = -15.0;
17816 a3.a3 = 16.0;
17817 a4.a0 = -17.0;
17818 a4.a1 = 18.0;
17819 a4.a2 = -19.0;
17820 a4.a3 = 20.0;
17821
17822 std::cout << "Calling TestAsyncPassStruct32BytesHomogeneousDoublex5(" << "(("
17823 << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
17824 << "), (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", "
17825 << a1.a3 << "), (" << a2.a0 << ", " << a2.a1 << ", " << a2.a2
17826 << ", " << a2.a3 << "), (" << a3.a0 << ", " << a3.a1 << ", "
17827 << a3.a2 << ", " << a3.a3 << "), (" << a4.a0 << ", " << a4.a1
17828 << ", " << a4.a2 << ", " << a4.a3 << "))" << ")\n";
17829
17830 f(a0, a1, a2, a3, a4);
17831}
17832
17833// Used for testing structs and unions by value.
17834// Argument too big to go into FPU registers in arm64.
17836 // NOLINTNEXTLINE(whitespace/parens)
17837 void (*f)(Struct40BytesHomogeneousDouble a0)) {
17839
17840 a0.a0 = -1.0;
17841 a0.a1 = 2.0;
17842 a0.a2 = -3.0;
17843 a0.a3 = 4.0;
17844 a0.a4 = -5.0;
17845
17846 std::cout << "Calling TestAsyncPassStruct40BytesHomogeneousDouble(" << "(("
17847 << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3 << ", "
17848 << a0.a4 << "))" << ")\n";
17849
17850 f(a0);
17851}
17852
17853// Used for testing structs and unions by value.
17854// Test 1kb struct.
17856 // NOLINTNEXTLINE(whitespace/parens)
17857 void (*f)(Struct1024BytesHomogeneousUint64 a0)) {
17859
17860 a0.a0 = 1;
17861 a0.a1 = 2;
17862 a0.a2 = 3;
17863 a0.a3 = 4;
17864 a0.a4 = 5;
17865 a0.a5 = 6;
17866 a0.a6 = 7;
17867 a0.a7 = 8;
17868 a0.a8 = 9;
17869 a0.a9 = 10;
17870 a0.a10 = 11;
17871 a0.a11 = 12;
17872 a0.a12 = 13;
17873 a0.a13 = 14;
17874 a0.a14 = 15;
17875 a0.a15 = 16;
17876 a0.a16 = 17;
17877 a0.a17 = 18;
17878 a0.a18 = 19;
17879 a0.a19 = 20;
17880 a0.a20 = 21;
17881 a0.a21 = 22;
17882 a0.a22 = 23;
17883 a0.a23 = 24;
17884 a0.a24 = 25;
17885 a0.a25 = 26;
17886 a0.a26 = 27;
17887 a0.a27 = 28;
17888 a0.a28 = 29;
17889 a0.a29 = 30;
17890 a0.a30 = 31;
17891 a0.a31 = 32;
17892 a0.a32 = 33;
17893 a0.a33 = 34;
17894 a0.a34 = 35;
17895 a0.a35 = 36;
17896 a0.a36 = 37;
17897 a0.a37 = 38;
17898 a0.a38 = 39;
17899 a0.a39 = 40;
17900 a0.a40 = 41;
17901 a0.a41 = 42;
17902 a0.a42 = 43;
17903 a0.a43 = 44;
17904 a0.a44 = 45;
17905 a0.a45 = 46;
17906 a0.a46 = 47;
17907 a0.a47 = 48;
17908 a0.a48 = 49;
17909 a0.a49 = 50;
17910 a0.a50 = 51;
17911 a0.a51 = 52;
17912 a0.a52 = 53;
17913 a0.a53 = 54;
17914 a0.a54 = 55;
17915 a0.a55 = 56;
17916 a0.a56 = 57;
17917 a0.a57 = 58;
17918 a0.a58 = 59;
17919 a0.a59 = 60;
17920 a0.a60 = 61;
17921 a0.a61 = 62;
17922 a0.a62 = 63;
17923 a0.a63 = 64;
17924 a0.a64 = 65;
17925 a0.a65 = 66;
17926 a0.a66 = 67;
17927 a0.a67 = 68;
17928 a0.a68 = 69;
17929 a0.a69 = 70;
17930 a0.a70 = 71;
17931 a0.a71 = 72;
17932 a0.a72 = 73;
17933 a0.a73 = 74;
17934 a0.a74 = 75;
17935 a0.a75 = 76;
17936 a0.a76 = 77;
17937 a0.a77 = 78;
17938 a0.a78 = 79;
17939 a0.a79 = 80;
17940 a0.a80 = 81;
17941 a0.a81 = 82;
17942 a0.a82 = 83;
17943 a0.a83 = 84;
17944 a0.a84 = 85;
17945 a0.a85 = 86;
17946 a0.a86 = 87;
17947 a0.a87 = 88;
17948 a0.a88 = 89;
17949 a0.a89 = 90;
17950 a0.a90 = 91;
17951 a0.a91 = 92;
17952 a0.a92 = 93;
17953 a0.a93 = 94;
17954 a0.a94 = 95;
17955 a0.a95 = 96;
17956 a0.a96 = 97;
17957 a0.a97 = 98;
17958 a0.a98 = 99;
17959 a0.a99 = 100;
17960 a0.a100 = 101;
17961 a0.a101 = 102;
17962 a0.a102 = 103;
17963 a0.a103 = 104;
17964 a0.a104 = 105;
17965 a0.a105 = 106;
17966 a0.a106 = 107;
17967 a0.a107 = 108;
17968 a0.a108 = 109;
17969 a0.a109 = 110;
17970 a0.a110 = 111;
17971 a0.a111 = 112;
17972 a0.a112 = 113;
17973 a0.a113 = 114;
17974 a0.a114 = 115;
17975 a0.a115 = 116;
17976 a0.a116 = 117;
17977 a0.a117 = 118;
17978 a0.a118 = 119;
17979 a0.a119 = 120;
17980 a0.a120 = 121;
17981 a0.a121 = 122;
17982 a0.a122 = 123;
17983 a0.a123 = 124;
17984 a0.a124 = 125;
17985 a0.a125 = 126;
17986 a0.a126 = 127;
17987 a0.a127 = 128;
17988
17989 std::cout << "Calling TestAsyncPassStruct1024BytesHomogeneousUint64(" << "(("
17990 << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3 << ", "
17991 << a0.a4 << ", " << a0.a5 << ", " << a0.a6 << ", " << a0.a7 << ", "
17992 << a0.a8 << ", " << a0.a9 << ", " << a0.a10 << ", " << a0.a11
17993 << ", " << a0.a12 << ", " << a0.a13 << ", " << a0.a14 << ", "
17994 << a0.a15 << ", " << a0.a16 << ", " << a0.a17 << ", " << a0.a18
17995 << ", " << a0.a19 << ", " << a0.a20 << ", " << a0.a21 << ", "
17996 << a0.a22 << ", " << a0.a23 << ", " << a0.a24 << ", " << a0.a25
17997 << ", " << a0.a26 << ", " << a0.a27 << ", " << a0.a28 << ", "
17998 << a0.a29 << ", " << a0.a30 << ", " << a0.a31 << ", " << a0.a32
17999 << ", " << a0.a33 << ", " << a0.a34 << ", " << a0.a35 << ", "
18000 << a0.a36 << ", " << a0.a37 << ", " << a0.a38 << ", " << a0.a39
18001 << ", " << a0.a40 << ", " << a0.a41 << ", " << a0.a42 << ", "
18002 << a0.a43 << ", " << a0.a44 << ", " << a0.a45 << ", " << a0.a46
18003 << ", " << a0.a47 << ", " << a0.a48 << ", " << a0.a49 << ", "
18004 << a0.a50 << ", " << a0.a51 << ", " << a0.a52 << ", " << a0.a53
18005 << ", " << a0.a54 << ", " << a0.a55 << ", " << a0.a56 << ", "
18006 << a0.a57 << ", " << a0.a58 << ", " << a0.a59 << ", " << a0.a60
18007 << ", " << a0.a61 << ", " << a0.a62 << ", " << a0.a63 << ", "
18008 << a0.a64 << ", " << a0.a65 << ", " << a0.a66 << ", " << a0.a67
18009 << ", " << a0.a68 << ", " << a0.a69 << ", " << a0.a70 << ", "
18010 << a0.a71 << ", " << a0.a72 << ", " << a0.a73 << ", " << a0.a74
18011 << ", " << a0.a75 << ", " << a0.a76 << ", " << a0.a77 << ", "
18012 << a0.a78 << ", " << a0.a79 << ", " << a0.a80 << ", " << a0.a81
18013 << ", " << a0.a82 << ", " << a0.a83 << ", " << a0.a84 << ", "
18014 << a0.a85 << ", " << a0.a86 << ", " << a0.a87 << ", " << a0.a88
18015 << ", " << a0.a89 << ", " << a0.a90 << ", " << a0.a91 << ", "
18016 << a0.a92 << ", " << a0.a93 << ", " << a0.a94 << ", " << a0.a95
18017 << ", " << a0.a96 << ", " << a0.a97 << ", " << a0.a98 << ", "
18018 << a0.a99 << ", " << a0.a100 << ", " << a0.a101 << ", " << a0.a102
18019 << ", " << a0.a103 << ", " << a0.a104 << ", " << a0.a105 << ", "
18020 << a0.a106 << ", " << a0.a107 << ", " << a0.a108 << ", " << a0.a109
18021 << ", " << a0.a110 << ", " << a0.a111 << ", " << a0.a112 << ", "
18022 << a0.a113 << ", " << a0.a114 << ", " << a0.a115 << ", " << a0.a116
18023 << ", " << a0.a117 << ", " << a0.a118 << ", " << a0.a119 << ", "
18024 << a0.a120 << ", " << a0.a121 << ", " << a0.a122 << ", " << a0.a123
18025 << ", " << a0.a124 << ", " << a0.a125 << ", " << a0.a126 << ", "
18026 << a0.a127 << "))" << ")\n";
18027
18028 f(a0);
18029}
18030
18031// Used for testing structs and unions by value.
18032// Tests the alignment of structs in FPU registers and backfilling.
18034 // NOLINTNEXTLINE(whitespace/parens)
18035 void (*f)(float a0,
18037 float a2,
18039 float a4,
18041 float a6,
18043 float a8)) {
18044 float a0;
18046 float a2;
18048 float a4;
18050 float a6;
18052 float a8;
18053
18054 a0 = -1.0;
18055 a1.a0 = 2.0;
18056 a1.a1 = -3.0;
18057 a1.a2 = 4.0;
18058 a1.a3 = -5.0;
18059 a2 = 6.0;
18060 a3.a0 = -7.0;
18061 a3.a1 = 8.0;
18062 a3.a2 = -9.0;
18063 a3.a3 = 10.0;
18064 a4 = -11.0;
18065 a5.a0 = 12.0;
18066 a5.a1 = -13.0;
18067 a5.a2 = 14.0;
18068 a5.a3 = -15.0;
18069 a6 = 16.0;
18070 a7.a0 = -17.0;
18071 a7.a1 = 18.0;
18072 a7.a2 = -19.0;
18073 a7.a3 = 20.0;
18074 a8 = -21.0;
18075
18076 std::cout
18077 << "Calling TestAsyncPassFloatStruct16BytesHomogeneousFloatFloatStruct1("
18078 << "(" << a0 << ", (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", "
18079 << a1.a3 << "), " << a2 << ", (" << a3.a0 << ", " << a3.a1 << ", "
18080 << a3.a2 << ", " << a3.a3 << "), " << a4 << ", (" << a5.a0 << ", "
18081 << a5.a1 << ", " << a5.a2 << ", " << a5.a3 << "), " << a6 << ", ("
18082 << a7.a0 << ", " << a7.a1 << ", " << a7.a2 << ", " << a7.a3 << "), " << a8
18083 << ")" << ")\n";
18084
18085 f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
18086}
18087
18088// Used for testing structs and unions by value.
18089// Tests the alignment of structs in FPU registers and backfilling.
18091 // NOLINTNEXTLINE(whitespace/parens)
18092 void (*f)(float a0,
18094 float a2,
18096 float a4,
18098 float a6,
18100 float a8)) {
18101 float a0;
18103 float a2;
18105 float a4;
18107 float a6;
18109 float a8;
18110
18111 a0 = -1.0;
18112 a1.a0 = 2.0;
18113 a1.a1 = -3.0;
18114 a1.a2 = 4.0;
18115 a1.a3 = -5.0;
18116 a2 = 6.0;
18117 a3.a0 = -7.0;
18118 a3.a1 = 8.0;
18119 a3.a2 = -9.0;
18120 a3.a3 = 10.0;
18121 a4 = -11.0;
18122 a5.a0 = 12.0;
18123 a5.a1 = -13.0;
18124 a5.a2 = 14.0;
18125 a5.a3 = -15.0;
18126 a6 = 16.0;
18127 a7.a0 = -17.0;
18128 a7.a1 = 18.0;
18129 a7.a2 = -19.0;
18130 a7.a3 = 20.0;
18131 a8 = -21.0;
18132
18133 std::cout
18134 << "Calling TestAsyncPassFloatStruct32BytesHomogeneousDoubleFloatStruct("
18135 << "(" << a0 << ", (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", "
18136 << a1.a3 << "), " << a2 << ", (" << a3.a0 << ", " << a3.a1 << ", "
18137 << a3.a2 << ", " << a3.a3 << "), " << a4 << ", (" << a5.a0 << ", "
18138 << a5.a1 << ", " << a5.a2 << ", " << a5.a3 << "), " << a6 << ", ("
18139 << a7.a0 << ", " << a7.a1 << ", " << a7.a2 << ", " << a7.a3 << "), " << a8
18140 << ")" << ")\n";
18141
18142 f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
18143}
18144
18145// Used for testing structs and unions by value.
18146// Tests the alignment of structs in integers registers and on the stack.
18147// Arm32 aligns this struct at 8.
18148// Also, arm32 allocates the second struct partially in registers, partially
18149// on stack.
18150// Test backfilling of integer registers.
18152 // NOLINTNEXTLINE(whitespace/parens)
18153 void (*f)(int8_t a0,
18155 int8_t a2,
18157 int8_t a4,
18159 int8_t a6,
18161 int8_t a8)) {
18162 int8_t a0;
18163 Struct16BytesMixed a1 = {};
18164 int8_t a2;
18165 Struct16BytesMixed a3 = {};
18166 int8_t a4;
18167 Struct16BytesMixed a5 = {};
18168 int8_t a6;
18169 Struct16BytesMixed a7 = {};
18170 int8_t a8;
18171
18172 a0 = -1;
18173 a1.a0 = 2.0;
18174 a1.a1 = -3;
18175 a2 = 4;
18176 a3.a0 = -5.0;
18177 a3.a1 = 6;
18178 a4 = -7;
18179 a5.a0 = 8.0;
18180 a5.a1 = -9;
18181 a6 = 10;
18182 a7.a0 = -11.0;
18183 a7.a1 = 12;
18184 a8 = -13;
18185
18186 std::cout
18187 << "Calling TestAsyncPassInt8Struct16BytesMixedInt8Struct16BytesMixedIn("
18188 << "(" << static_cast<int>(a0) << ", (" << a1.a0 << ", " << a1.a1 << "), "
18189 << static_cast<int>(a2) << ", (" << a3.a0 << ", " << a3.a1 << "), "
18190 << static_cast<int>(a4) << ", (" << a5.a0 << ", " << a5.a1 << "), "
18191 << static_cast<int>(a6) << ", (" << a7.a0 << ", " << a7.a1 << "), "
18192 << static_cast<int>(a8) << ")" << ")\n";
18193
18194 f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
18195}
18196
18197// Used for testing structs and unions by value.
18198// On Linux x64, it will exhaust xmm registers first, after 6 doubles and 2
18199// structs. The rest of the structs will go on the stack.
18200// The int will be backfilled into the int register.
18202 // NOLINTNEXTLINE(whitespace/parens)
18203 void (*f)(double a0,
18204 double a1,
18205 double a2,
18206 double a3,
18207 double a4,
18208 double a5,
18213 int32_t a10)) {
18214 double a0;
18215 double a1;
18216 double a2;
18217 double a3;
18218 double a4;
18219 double a5;
18220 Struct16BytesMixed a6 = {};
18221 Struct16BytesMixed a7 = {};
18222 Struct16BytesMixed a8 = {};
18223 Struct16BytesMixed a9 = {};
18224 int32_t a10;
18225
18226 a0 = -1.0;
18227 a1 = 2.0;
18228 a2 = -3.0;
18229 a3 = 4.0;
18230 a4 = -5.0;
18231 a5 = 6.0;
18232 a6.a0 = -7.0;
18233 a6.a1 = 8;
18234 a7.a0 = -9.0;
18235 a7.a1 = 10;
18236 a8.a0 = -11.0;
18237 a8.a1 = 12;
18238 a9.a0 = -13.0;
18239 a9.a1 = 14;
18240 a10 = -15;
18241
18242 std::cout << "Calling TestAsyncPassDoublex6Struct16BytesMixedx4Int32(" << "("
18243 << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
18244 << ", " << a5 << ", (" << a6.a0 << ", " << a6.a1 << "), (" << a7.a0
18245 << ", " << a7.a1 << "), (" << a8.a0 << ", " << a8.a1 << "), ("
18246 << a9.a0 << ", " << a9.a1 << "), " << a10 << ")" << ")\n";
18247
18248 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
18249}
18250
18251// Used for testing structs and unions by value.
18252// On Linux x64, it will exhaust int registers first.
18253// The rest of the structs will go on the stack.
18254// The double will be backfilled into the xmm register.
18256 // NOLINTNEXTLINE(whitespace/parens)
18257 void (*f)(int32_t a0,
18258 int32_t a1,
18259 int32_t a2,
18260 int32_t a3,
18265 double a8)) {
18266 int32_t a0;
18267 int32_t a1;
18268 int32_t a2;
18269 int32_t a3;
18270 Struct16BytesMixed a4 = {};
18271 Struct16BytesMixed a5 = {};
18272 Struct16BytesMixed a6 = {};
18273 Struct16BytesMixed a7 = {};
18274 double a8;
18275
18276 a0 = -1;
18277 a1 = 2;
18278 a2 = -3;
18279 a3 = 4;
18280 a4.a0 = -5.0;
18281 a4.a1 = 6;
18282 a5.a0 = -7.0;
18283 a5.a1 = 8;
18284 a6.a0 = -9.0;
18285 a6.a1 = 10;
18286 a7.a0 = -11.0;
18287 a7.a1 = 12;
18288 a8 = -13.0;
18289
18290 std::cout << "Calling TestAsyncPassInt32x4Struct16BytesMixedx4Double(" << "("
18291 << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", (" << a4.a0
18292 << ", " << a4.a1 << "), (" << a5.a0 << ", " << a5.a1 << "), ("
18293 << a6.a0 << ", " << a6.a1 << "), (" << a7.a0 << ", " << a7.a1
18294 << "), " << a8 << ")" << ")\n";
18295
18296 f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
18297}
18298
18299// Used for testing structs and unions by value.
18300// On various architectures, first struct is allocated on stack.
18301// Check that the other two arguments are allocated on registers.
18303 // NOLINTNEXTLINE(whitespace/parens)
18304 void (*f)(Struct40BytesHomogeneousDouble a0,
18310
18311 a0.a0 = -1.0;
18312 a0.a1 = 2.0;
18313 a0.a2 = -3.0;
18314 a0.a3 = 4.0;
18315 a0.a4 = -5.0;
18316 a1.a0 = 6;
18317 a1.a1 = -7;
18318 a2.a0 = 8.0;
18319 a2.a1 = -9.0;
18320
18321 std::cout
18322 << "Calling TestAsyncPassStruct40BytesHomogeneousDoubleStruct4BytesHomo("
18323 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
18324 << ", " << a0.a4 << "), (" << a1.a0 << ", " << a1.a1 << "), (" << a2.a0
18325 << ", " << a2.a1 << "))" << ")\n";
18326
18327 f(a0, a1, a2);
18328}
18329
18330// Used for testing structs and unions by value.
18331// Test alignment and padding of 16 byte int within struct.
18333 // NOLINTNEXTLINE(whitespace/parens)
18334 void (*f)(int32_t a0,
18335 int32_t a1,
18336 int32_t a2,
18337 int32_t a3,
18338 int32_t a4,
18339 int32_t a5,
18340 int32_t a6,
18341 int32_t a7,
18342 double a8,
18343 double a9,
18344 double a10,
18345 double a11,
18346 double a12,
18347 double a13,
18348 double a14,
18349 double a15,
18350 int64_t a16,
18351 int8_t a17,
18352 Struct1ByteInt a18,
18353 int64_t a19,
18354 int8_t a20,
18356 int64_t a22,
18357 int8_t a23,
18358 Struct8BytesInt a24,
18359 int64_t a25,
18360 int8_t a26,
18362 int64_t a28,
18363 int8_t a29,
18365 int64_t a31,
18366 int8_t a32,
18368 int64_t a34,
18369 int8_t a35,
18371 int64_t a37,
18372 int8_t a38,
18373 StructAlignmentInt64 a39)) {
18374 int32_t a0;
18375 int32_t a1;
18376 int32_t a2;
18377 int32_t a3;
18378 int32_t a4;
18379 int32_t a5;
18380 int32_t a6;
18381 int32_t a7;
18382 double a8;
18383 double a9;
18384 double a10;
18385 double a11;
18386 double a12;
18387 double a13;
18388 double a14;
18389 double a15;
18390 int64_t a16;
18391 int8_t a17;
18392 Struct1ByteInt a18 = {};
18393 int64_t a19;
18394 int8_t a20;
18396 int64_t a22;
18397 int8_t a23;
18398 Struct8BytesInt a24 = {};
18399 int64_t a25;
18400 int8_t a26;
18402 int64_t a28;
18403 int8_t a29;
18404 Struct8BytesMixed a30 = {};
18405 int64_t a31;
18406 int8_t a32;
18407 StructAlignmentInt16 a33 = {};
18408 int64_t a34;
18409 int8_t a35;
18410 StructAlignmentInt32 a36 = {};
18411 int64_t a37;
18412 int8_t a38;
18413 StructAlignmentInt64 a39 = {};
18414
18415 a0 = -1;
18416 a1 = 2;
18417 a2 = -3;
18418 a3 = 4;
18419 a4 = -5;
18420 a5 = 6;
18421 a6 = -7;
18422 a7 = 8;
18423 a8 = -9.0;
18424 a9 = 10.0;
18425 a10 = -11.0;
18426 a11 = 12.0;
18427 a12 = -13.0;
18428 a13 = 14.0;
18429 a14 = -15.0;
18430 a15 = 16.0;
18431 a16 = -17;
18432 a17 = 18;
18433 a18.a0 = -19;
18434 a19 = 20;
18435 a20 = -21;
18436 a21.a0 = 22;
18437 a21.a1 = -23;
18438 a22 = 24;
18439 a23 = -25;
18440 a24.a0 = 26;
18441 a24.a1 = -27;
18442 a24.a2 = 28;
18443 a25 = -29;
18444 a26 = 30;
18445 a27.a0 = -31.0;
18446 a27.a1 = 32.0;
18447 a28 = -33;
18448 a29 = 34;
18449 a30.a0 = -35.0;
18450 a30.a1 = 36;
18451 a30.a2 = -37;
18452 a31 = 38;
18453 a32 = -39;
18454 a33.a0 = 40;
18455 a33.a1 = -41;
18456 a33.a2 = 42;
18457 a34 = -43;
18458 a35 = 44;
18459 a36.a0 = -45;
18460 a36.a1 = 46;
18461 a36.a2 = -47;
18462 a37 = 48;
18463 a38 = -49;
18464 a39.a0 = 50;
18465 a39.a1 = -51;
18466 a39.a2 = 52;
18467
18468 std::cout
18469 << "Calling TestAsyncPassInt32x8Doublex8Int64Int8Struct1ByteIntInt64Int("
18470 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
18471 << ", " << a5 << ", " << a6 << ", " << a7 << ", " << a8 << ", " << a9
18472 << ", " << a10 << ", " << a11 << ", " << a12 << ", " << a13 << ", " << a14
18473 << ", " << a15 << ", " << a16 << ", " << static_cast<int>(a17) << ", ("
18474 << static_cast<int>(a18.a0) << "), " << a19 << ", "
18475 << static_cast<int>(a20) << ", (" << a21.a0 << ", " << a21.a1 << "), "
18476 << a22 << ", " << static_cast<int>(a23) << ", (" << a24.a0 << ", "
18477 << a24.a1 << ", " << a24.a2 << "), " << a25 << ", "
18478 << static_cast<int>(a26) << ", (" << a27.a0 << ", " << a27.a1 << "), "
18479 << a28 << ", " << static_cast<int>(a29) << ", (" << a30.a0 << ", "
18480 << a30.a1 << ", " << a30.a2 << "), " << a31 << ", "
18481 << static_cast<int>(a32) << ", (" << static_cast<int>(a33.a0) << ", "
18482 << a33.a1 << ", " << static_cast<int>(a33.a2) << "), " << a34 << ", "
18483 << static_cast<int>(a35) << ", (" << static_cast<int>(a36.a0) << ", "
18484 << a36.a1 << ", " << static_cast<int>(a36.a2) << "), " << a37 << ", "
18485 << static_cast<int>(a38) << ", (" << static_cast<int>(a39.a0) << ", "
18486 << a39.a1 << ", " << static_cast<int>(a39.a2) << "))" << ")\n";
18487
18488 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16,
18489 a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31,
18490 a32, a33, a34, a35, a36, a37, a38, a39);
18491}
18492
18493// Used for testing structs and unions by value.
18494// Test alignment and padding of 16 byte int within struct.
18496 // NOLINTNEXTLINE(whitespace/parens)
18497 void (*f)(StructAlignmentInt16 a0)) {
18498 StructAlignmentInt16 a0 = {};
18499
18500 a0.a0 = -1;
18501 a0.a1 = 2;
18502 a0.a2 = -3;
18503
18504 std::cout << "Calling TestAsyncPassStructAlignmentInt16(" << "(("
18505 << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
18506 << static_cast<int>(a0.a2) << "))" << ")\n";
18507
18508 f(a0);
18509}
18510
18511// Used for testing structs and unions by value.
18512// Test alignment and padding of 32 byte int within struct.
18514 // NOLINTNEXTLINE(whitespace/parens)
18515 void (*f)(StructAlignmentInt32 a0)) {
18516 StructAlignmentInt32 a0 = {};
18517
18518 a0.a0 = -1;
18519 a0.a1 = 2;
18520 a0.a2 = -3;
18521
18522 std::cout << "Calling TestAsyncPassStructAlignmentInt32(" << "(("
18523 << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
18524 << static_cast<int>(a0.a2) << "))" << ")\n";
18525
18526 f(a0);
18527}
18528
18529// Used for testing structs and unions by value.
18530// Test alignment and padding of 64 byte int within struct.
18532 // NOLINTNEXTLINE(whitespace/parens)
18533 void (*f)(StructAlignmentInt64 a0)) {
18534 StructAlignmentInt64 a0 = {};
18535
18536 a0.a0 = -1;
18537 a0.a1 = 2;
18538 a0.a2 = -3;
18539
18540 std::cout << "Calling TestAsyncPassStructAlignmentInt64(" << "(("
18541 << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
18542 << static_cast<int>(a0.a2) << "))" << ")\n";
18543
18544 f(a0);
18545}
18546
18547// Used for testing structs and unions by value.
18548// Simple nested struct. No alignment gaps on any architectures.
18549// 10 arguments exhaust registers on all platforms.
18551 // NOLINTNEXTLINE(whitespace/parens)
18552 void (*f)(Struct8BytesNestedInt a0,
18562 Struct8BytesNestedInt a0 = {};
18563 Struct8BytesNestedInt a1 = {};
18564 Struct8BytesNestedInt a2 = {};
18565 Struct8BytesNestedInt a3 = {};
18566 Struct8BytesNestedInt a4 = {};
18567 Struct8BytesNestedInt a5 = {};
18568 Struct8BytesNestedInt a6 = {};
18569 Struct8BytesNestedInt a7 = {};
18570 Struct8BytesNestedInt a8 = {};
18571 Struct8BytesNestedInt a9 = {};
18572
18573 a0.a0.a0 = -1;
18574 a0.a0.a1 = 2;
18575 a0.a1.a0 = -3;
18576 a0.a1.a1 = 4;
18577 a1.a0.a0 = -5;
18578 a1.a0.a1 = 6;
18579 a1.a1.a0 = -7;
18580 a1.a1.a1 = 8;
18581 a2.a0.a0 = -9;
18582 a2.a0.a1 = 10;
18583 a2.a1.a0 = -11;
18584 a2.a1.a1 = 12;
18585 a3.a0.a0 = -13;
18586 a3.a0.a1 = 14;
18587 a3.a1.a0 = -15;
18588 a3.a1.a1 = 16;
18589 a4.a0.a0 = -17;
18590 a4.a0.a1 = 18;
18591 a4.a1.a0 = -19;
18592 a4.a1.a1 = 20;
18593 a5.a0.a0 = -21;
18594 a5.a0.a1 = 22;
18595 a5.a1.a0 = -23;
18596 a5.a1.a1 = 24;
18597 a6.a0.a0 = -25;
18598 a6.a0.a1 = 26;
18599 a6.a1.a0 = -27;
18600 a6.a1.a1 = 28;
18601 a7.a0.a0 = -29;
18602 a7.a0.a1 = 30;
18603 a7.a1.a0 = -31;
18604 a7.a1.a1 = 32;
18605 a8.a0.a0 = -33;
18606 a8.a0.a1 = 34;
18607 a8.a1.a0 = -35;
18608 a8.a1.a1 = 36;
18609 a9.a0.a0 = -37;
18610 a9.a0.a1 = 38;
18611 a9.a1.a0 = -39;
18612 a9.a1.a1 = 40;
18613
18614 std::cout << "Calling TestAsyncPassStruct8BytesNestedIntx10(" << "((("
18615 << a0.a0.a0 << ", " << a0.a0.a1 << "), (" << a0.a1.a0 << ", "
18616 << a0.a1.a1 << ")), ((" << a1.a0.a0 << ", " << a1.a0.a1 << "), ("
18617 << a1.a1.a0 << ", " << a1.a1.a1 << ")), ((" << a2.a0.a0 << ", "
18618 << a2.a0.a1 << "), (" << a2.a1.a0 << ", " << a2.a1.a1 << ")), (("
18619 << a3.a0.a0 << ", " << a3.a0.a1 << "), (" << a3.a1.a0 << ", "
18620 << a3.a1.a1 << ")), ((" << a4.a0.a0 << ", " << a4.a0.a1 << "), ("
18621 << a4.a1.a0 << ", " << a4.a1.a1 << ")), ((" << a5.a0.a0 << ", "
18622 << a5.a0.a1 << "), (" << a5.a1.a0 << ", " << a5.a1.a1 << ")), (("
18623 << a6.a0.a0 << ", " << a6.a0.a1 << "), (" << a6.a1.a0 << ", "
18624 << a6.a1.a1 << ")), ((" << a7.a0.a0 << ", " << a7.a0.a1 << "), ("
18625 << a7.a1.a0 << ", " << a7.a1.a1 << ")), ((" << a8.a0.a0 << ", "
18626 << a8.a0.a1 << "), (" << a8.a1.a0 << ", " << a8.a1.a1 << ")), (("
18627 << a9.a0.a0 << ", " << a9.a0.a1 << "), (" << a9.a1.a0 << ", "
18628 << a9.a1.a1 << ")))" << ")\n";
18629
18630 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
18631}
18632
18633// Used for testing structs and unions by value.
18634// Simple nested struct. No alignment gaps on any architectures.
18635// 10 arguments exhaust fpu registers on all platforms.
18637 // NOLINTNEXTLINE(whitespace/parens)
18638 void (*f)(Struct8BytesNestedFloat a0,
18658
18659 a0.a0.a0 = -1.0;
18660 a0.a1.a0 = 2.0;
18661 a1.a0.a0 = -3.0;
18662 a1.a1.a0 = 4.0;
18663 a2.a0.a0 = -5.0;
18664 a2.a1.a0 = 6.0;
18665 a3.a0.a0 = -7.0;
18666 a3.a1.a0 = 8.0;
18667 a4.a0.a0 = -9.0;
18668 a4.a1.a0 = 10.0;
18669 a5.a0.a0 = -11.0;
18670 a5.a1.a0 = 12.0;
18671 a6.a0.a0 = -13.0;
18672 a6.a1.a0 = 14.0;
18673 a7.a0.a0 = -15.0;
18674 a7.a1.a0 = 16.0;
18675 a8.a0.a0 = -17.0;
18676 a8.a1.a0 = 18.0;
18677 a9.a0.a0 = -19.0;
18678 a9.a1.a0 = 20.0;
18679
18680 std::cout << "Calling TestAsyncPassStruct8BytesNestedFloatx10(" << "((("
18681 << a0.a0.a0 << "), (" << a0.a1.a0 << ")), ((" << a1.a0.a0 << "), ("
18682 << a1.a1.a0 << ")), ((" << a2.a0.a0 << "), (" << a2.a1.a0
18683 << ")), ((" << a3.a0.a0 << "), (" << a3.a1.a0 << ")), (("
18684 << a4.a0.a0 << "), (" << a4.a1.a0 << ")), ((" << a5.a0.a0 << "), ("
18685 << a5.a1.a0 << ")), ((" << a6.a0.a0 << "), (" << a6.a1.a0
18686 << ")), ((" << a7.a0.a0 << "), (" << a7.a1.a0 << ")), (("
18687 << a8.a0.a0 << "), (" << a8.a1.a0 << ")), ((" << a9.a0.a0 << "), ("
18688 << a9.a1.a0 << ")))" << ")\n";
18689
18690 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
18691}
18692
18693// Used for testing structs and unions by value.
18694// Simple nested struct. No alignment gaps on any architectures.
18695// 10 arguments exhaust fpu registers on all platforms.
18696// The nesting is irregular, testing homogenous float rules on arm and arm64,
18697// and the fpu register usage on x64.
18699 // NOLINTNEXTLINE(whitespace/parens)
18700 void (*f)(Struct8BytesNestedFloat2 a0,
18720
18721 a0.a0.a0 = -1.0;
18722 a0.a1 = 2.0;
18723 a1.a0.a0 = -3.0;
18724 a1.a1 = 4.0;
18725 a2.a0.a0 = -5.0;
18726 a2.a1 = 6.0;
18727 a3.a0.a0 = -7.0;
18728 a3.a1 = 8.0;
18729 a4.a0.a0 = -9.0;
18730 a4.a1 = 10.0;
18731 a5.a0.a0 = -11.0;
18732 a5.a1 = 12.0;
18733 a6.a0.a0 = -13.0;
18734 a6.a1 = 14.0;
18735 a7.a0.a0 = -15.0;
18736 a7.a1 = 16.0;
18737 a8.a0.a0 = -17.0;
18738 a8.a1 = 18.0;
18739 a9.a0.a0 = -19.0;
18740 a9.a1 = 20.0;
18741
18742 std::cout << "Calling TestAsyncPassStruct8BytesNestedFloat2x10(" << "((("
18743 << a0.a0.a0 << "), " << a0.a1 << "), ((" << a1.a0.a0 << "), "
18744 << a1.a1 << "), ((" << a2.a0.a0 << "), " << a2.a1 << "), (("
18745 << a3.a0.a0 << "), " << a3.a1 << "), ((" << a4.a0.a0 << "), "
18746 << a4.a1 << "), ((" << a5.a0.a0 << "), " << a5.a1 << "), (("
18747 << a6.a0.a0 << "), " << a6.a1 << "), ((" << a7.a0.a0 << "), "
18748 << a7.a1 << "), ((" << a8.a0.a0 << "), " << a8.a1 << "), (("
18749 << a9.a0.a0 << "), " << a9.a1 << "))" << ")\n";
18750
18751 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
18752}
18753
18754// Used for testing structs and unions by value.
18755// Simple nested struct. No alignment gaps on any architectures.
18756// 10 arguments exhaust all registers on all platforms.
18758 // NOLINTNEXTLINE(whitespace/parens)
18759 void (*f)(Struct8BytesNestedMixed a0,
18779
18780 a0.a0.a0 = -1;
18781 a0.a0.a1 = 2;
18782 a0.a1.a0 = -3.0;
18783 a1.a0.a0 = 4;
18784 a1.a0.a1 = -5;
18785 a1.a1.a0 = 6.0;
18786 a2.a0.a0 = -7;
18787 a2.a0.a1 = 8;
18788 a2.a1.a0 = -9.0;
18789 a3.a0.a0 = 10;
18790 a3.a0.a1 = -11;
18791 a3.a1.a0 = 12.0;
18792 a4.a0.a0 = -13;
18793 a4.a0.a1 = 14;
18794 a4.a1.a0 = -15.0;
18795 a5.a0.a0 = 16;
18796 a5.a0.a1 = -17;
18797 a5.a1.a0 = 18.0;
18798 a6.a0.a0 = -19;
18799 a6.a0.a1 = 20;
18800 a6.a1.a0 = -21.0;
18801 a7.a0.a0 = 22;
18802 a7.a0.a1 = -23;
18803 a7.a1.a0 = 24.0;
18804 a8.a0.a0 = -25;
18805 a8.a0.a1 = 26;
18806 a8.a1.a0 = -27.0;
18807 a9.a0.a0 = 28;
18808 a9.a0.a1 = -29;
18809 a9.a1.a0 = 30.0;
18810
18811 std::cout << "Calling TestAsyncPassStruct8BytesNestedMixedx10(" << "((("
18812 << a0.a0.a0 << ", " << a0.a0.a1 << "), (" << a0.a1.a0 << ")), (("
18813 << a1.a0.a0 << ", " << a1.a0.a1 << "), (" << a1.a1.a0 << ")), (("
18814 << a2.a0.a0 << ", " << a2.a0.a1 << "), (" << a2.a1.a0 << ")), (("
18815 << a3.a0.a0 << ", " << a3.a0.a1 << "), (" << a3.a1.a0 << ")), (("
18816 << a4.a0.a0 << ", " << a4.a0.a1 << "), (" << a4.a1.a0 << ")), (("
18817 << a5.a0.a0 << ", " << a5.a0.a1 << "), (" << a5.a1.a0 << ")), (("
18818 << a6.a0.a0 << ", " << a6.a0.a1 << "), (" << a6.a1.a0 << ")), (("
18819 << a7.a0.a0 << ", " << a7.a0.a1 << "), (" << a7.a1.a0 << ")), (("
18820 << a8.a0.a0 << ", " << a8.a0.a1 << "), (" << a8.a1.a0 << ")), (("
18821 << a9.a0.a0 << ", " << a9.a0.a1 << "), (" << a9.a1.a0 << ")))"
18822 << ")\n";
18823
18824 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
18825}
18826
18827// Used for testing structs and unions by value.
18828// Deeper nested struct to test recursive member access.
18830 // NOLINTNEXTLINE(whitespace/parens)
18832 Struct16BytesNestedInt a0 = {};
18833 Struct16BytesNestedInt a1 = {};
18834
18835 a0.a0.a0.a0 = -1;
18836 a0.a0.a0.a1 = 2;
18837 a0.a0.a1.a0 = -3;
18838 a0.a0.a1.a1 = 4;
18839 a0.a1.a0.a0 = -5;
18840 a0.a1.a0.a1 = 6;
18841 a0.a1.a1.a0 = -7;
18842 a0.a1.a1.a1 = 8;
18843 a1.a0.a0.a0 = -9;
18844 a1.a0.a0.a1 = 10;
18845 a1.a0.a1.a0 = -11;
18846 a1.a0.a1.a1 = 12;
18847 a1.a1.a0.a0 = -13;
18848 a1.a1.a0.a1 = 14;
18849 a1.a1.a1.a0 = -15;
18850 a1.a1.a1.a1 = 16;
18851
18852 std::cout << "Calling TestAsyncPassStruct16BytesNestedIntx2(" << "(((("
18853 << a0.a0.a0.a0 << ", " << a0.a0.a0.a1 << "), (" << a0.a0.a1.a0
18854 << ", " << a0.a0.a1.a1 << ")), ((" << a0.a1.a0.a0 << ", "
18855 << a0.a1.a0.a1 << "), (" << a0.a1.a1.a0 << ", " << a0.a1.a1.a1
18856 << "))), (((" << a1.a0.a0.a0 << ", " << a1.a0.a0.a1 << "), ("
18857 << a1.a0.a1.a0 << ", " << a1.a0.a1.a1 << ")), ((" << a1.a1.a0.a0
18858 << ", " << a1.a1.a0.a1 << "), (" << a1.a1.a1.a0 << ", "
18859 << a1.a1.a1.a1 << "))))" << ")\n";
18860
18861 f(a0, a1);
18862}
18863
18864// Used for testing structs and unions by value.
18865// Even deeper nested struct to test recursive member access.
18867 // NOLINTNEXTLINE(whitespace/parens)
18869 Struct32BytesNestedInt a0 = {};
18870 Struct32BytesNestedInt a1 = {};
18871
18872 a0.a0.a0.a0.a0 = -1;
18873 a0.a0.a0.a0.a1 = 2;
18874 a0.a0.a0.a1.a0 = -3;
18875 a0.a0.a0.a1.a1 = 4;
18876 a0.a0.a1.a0.a0 = -5;
18877 a0.a0.a1.a0.a1 = 6;
18878 a0.a0.a1.a1.a0 = -7;
18879 a0.a0.a1.a1.a1 = 8;
18880 a0.a1.a0.a0.a0 = -9;
18881 a0.a1.a0.a0.a1 = 10;
18882 a0.a1.a0.a1.a0 = -11;
18883 a0.a1.a0.a1.a1 = 12;
18884 a0.a1.a1.a0.a0 = -13;
18885 a0.a1.a1.a0.a1 = 14;
18886 a0.a1.a1.a1.a0 = -15;
18887 a0.a1.a1.a1.a1 = 16;
18888 a1.a0.a0.a0.a0 = -17;
18889 a1.a0.a0.a0.a1 = 18;
18890 a1.a0.a0.a1.a0 = -19;
18891 a1.a0.a0.a1.a1 = 20;
18892 a1.a0.a1.a0.a0 = -21;
18893 a1.a0.a1.a0.a1 = 22;
18894 a1.a0.a1.a1.a0 = -23;
18895 a1.a0.a1.a1.a1 = 24;
18896 a1.a1.a0.a0.a0 = -25;
18897 a1.a1.a0.a0.a1 = 26;
18898 a1.a1.a0.a1.a0 = -27;
18899 a1.a1.a0.a1.a1 = 28;
18900 a1.a1.a1.a0.a0 = -29;
18901 a1.a1.a1.a0.a1 = 30;
18902 a1.a1.a1.a1.a0 = -31;
18903 a1.a1.a1.a1.a1 = 32;
18904
18905 std::cout << "Calling TestAsyncPassStruct32BytesNestedIntx2(" << "((((("
18906 << a0.a0.a0.a0.a0 << ", " << a0.a0.a0.a0.a1 << "), ("
18907 << a0.a0.a0.a1.a0 << ", " << a0.a0.a0.a1.a1 << ")), (("
18908 << a0.a0.a1.a0.a0 << ", " << a0.a0.a1.a0.a1 << "), ("
18909 << a0.a0.a1.a1.a0 << ", " << a0.a0.a1.a1.a1 << "))), ((("
18910 << a0.a1.a0.a0.a0 << ", " << a0.a1.a0.a0.a1 << "), ("
18911 << a0.a1.a0.a1.a0 << ", " << a0.a1.a0.a1.a1 << ")), (("
18912 << a0.a1.a1.a0.a0 << ", " << a0.a1.a1.a0.a1 << "), ("
18913 << a0.a1.a1.a1.a0 << ", " << a0.a1.a1.a1.a1 << ")))), (((("
18914 << a1.a0.a0.a0.a0 << ", " << a1.a0.a0.a0.a1 << "), ("
18915 << a1.a0.a0.a1.a0 << ", " << a1.a0.a0.a1.a1 << ")), (("
18916 << a1.a0.a1.a0.a0 << ", " << a1.a0.a1.a0.a1 << "), ("
18917 << a1.a0.a1.a1.a0 << ", " << a1.a0.a1.a1.a1 << "))), ((("
18918 << a1.a1.a0.a0.a0 << ", " << a1.a1.a0.a0.a1 << "), ("
18919 << a1.a1.a0.a1.a0 << ", " << a1.a1.a0.a1.a1 << ")), (("
18920 << a1.a1.a1.a0.a0 << ", " << a1.a1.a1.a0.a1 << "), ("
18921 << a1.a1.a1.a1.a0 << ", " << a1.a1.a1.a1.a1 << ")))))" << ")\n";
18922
18923 f(a0, a1);
18924}
18925
18926// Used for testing structs and unions by value.
18927// Test alignment and padding of nested struct with 16 byte int.
18929 // NOLINTNEXTLINE(whitespace/parens)
18932
18933 a0.a0.a0 = -1;
18934 a0.a0.a1 = 2;
18935 a0.a0.a2 = -3;
18936 a0.a1.a0 = 4;
18937 a0.a1.a1 = -5;
18938 a0.a1.a2 = 6;
18939
18940 std::cout << "Calling TestAsyncPassStructNestedIntStructAlignmentInt16("
18941 << "(((" << static_cast<int>(a0.a0.a0) << ", " << a0.a0.a1 << ", "
18942 << static_cast<int>(a0.a0.a2) << "), ("
18943 << static_cast<int>(a0.a1.a0) << ", " << a0.a1.a1 << ", "
18944 << static_cast<int>(a0.a1.a2) << ")))" << ")\n";
18945
18946 f(a0);
18947}
18948
18949// Used for testing structs and unions by value.
18950// Test alignment and padding of nested struct with 32 byte int.
18952 // NOLINTNEXTLINE(whitespace/parens)
18955
18956 a0.a0.a0 = -1;
18957 a0.a0.a1 = 2;
18958 a0.a0.a2 = -3;
18959 a0.a1.a0 = 4;
18960 a0.a1.a1 = -5;
18961 a0.a1.a2 = 6;
18962
18963 std::cout << "Calling TestAsyncPassStructNestedIntStructAlignmentInt32("
18964 << "(((" << static_cast<int>(a0.a0.a0) << ", " << a0.a0.a1 << ", "
18965 << static_cast<int>(a0.a0.a2) << "), ("
18966 << static_cast<int>(a0.a1.a0) << ", " << a0.a1.a1 << ", "
18967 << static_cast<int>(a0.a1.a2) << ")))" << ")\n";
18968
18969 f(a0);
18970}
18971
18972// Used for testing structs and unions by value.
18973// Test alignment and padding of nested struct with 64 byte int.
18975 // NOLINTNEXTLINE(whitespace/parens)
18978
18979 a0.a0.a0 = -1;
18980 a0.a0.a1 = 2;
18981 a0.a0.a2 = -3;
18982 a0.a1.a0 = 4;
18983 a0.a1.a1 = -5;
18984 a0.a1.a2 = 6;
18985
18986 std::cout << "Calling TestAsyncPassStructNestedIntStructAlignmentInt64("
18987 << "(((" << static_cast<int>(a0.a0.a0) << ", " << a0.a0.a1 << ", "
18988 << static_cast<int>(a0.a0.a2) << "), ("
18989 << static_cast<int>(a0.a1.a0) << ", " << a0.a1.a1 << ", "
18990 << static_cast<int>(a0.a1.a2) << ")))" << ")\n";
18991
18992 f(a0);
18993}
18994
18995// Used for testing structs and unions by value.
18996// Return big irregular struct as smoke test.
18998 // NOLINTNEXTLINE(whitespace/parens)
19007
19008 a0.a0 = 1;
19009 a0.a1.a0.a0 = 2;
19010 a0.a1.a0.a1.a0.a0 = -3;
19011 a0.a1.a0.a1.a0.a1 = 4;
19012 a0.a1.a0.a1.a1.a0 = -5.0;
19013 a0.a1.a0.a2 = 6;
19014 a0.a1.a0.a3.a0.a0 = -7.0;
19015 a0.a1.a0.a3.a1 = 8.0;
19016 a0.a1.a0.a4 = 9;
19017 a0.a1.a0.a5.a0.a0 = 10.0;
19018 a0.a1.a0.a5.a1.a0 = -11.0;
19019 a0.a1.a0.a6 = 12;
19020 a0.a1.a1.a0.a0 = -13;
19021 a0.a1.a1.a0.a1 = 14;
19022 a0.a1.a1.a1.a0 = -15.0;
19023 a0.a1.a2 = 16.0;
19024 a0.a1.a3 = -17.0;
19025 a0.a2.a0.a0 = 18;
19026 a0.a2.a0.a1.a0.a0 = -19;
19027 a0.a2.a0.a1.a0.a1 = 20;
19028 a0.a2.a0.a1.a1.a0 = -21.0;
19029 a0.a2.a0.a2 = 22;
19030 a0.a2.a0.a3.a0.a0 = -23.0;
19031 a0.a2.a0.a3.a1 = 24.0;
19032 a0.a2.a0.a4 = 25;
19033 a0.a2.a0.a5.a0.a0 = 26.0;
19034 a0.a2.a0.a5.a1.a0 = -27.0;
19035 a0.a2.a0.a6 = 28;
19036 a0.a2.a1.a0.a0 = -29;
19037 a0.a2.a1.a0.a1 = 30;
19038 a0.a2.a1.a1.a0 = -31.0;
19039 a0.a2.a2 = 32.0;
19040 a0.a2.a3 = -33.0;
19041 a0.a3 = 34.0;
19042 a1.a0 = 35;
19043 a1.a1.a0.a0 = 36;
19044 a1.a1.a0.a1.a0.a0 = -37;
19045 a1.a1.a0.a1.a0.a1 = 38;
19046 a1.a1.a0.a1.a1.a0 = -39.0;
19047 a1.a1.a0.a2 = 40;
19048 a1.a1.a0.a3.a0.a0 = -41.0;
19049 a1.a1.a0.a3.a1 = 42.0;
19050 a1.a1.a0.a4 = 43;
19051 a1.a1.a0.a5.a0.a0 = 44.0;
19052 a1.a1.a0.a5.a1.a0 = -45.0;
19053 a1.a1.a0.a6 = 46;
19054 a1.a1.a1.a0.a0 = -47;
19055 a1.a1.a1.a0.a1 = 48;
19056 a1.a1.a1.a1.a0 = -49.0;
19057 a1.a1.a2 = 50.0;
19058 a1.a1.a3 = -51.0;
19059 a1.a2.a0.a0 = 52;
19060 a1.a2.a0.a1.a0.a0 = -53;
19061 a1.a2.a0.a1.a0.a1 = 54;
19062 a1.a2.a0.a1.a1.a0 = -55.0;
19063 a1.a2.a0.a2 = 56;
19064 a1.a2.a0.a3.a0.a0 = -57.0;
19065 a1.a2.a0.a3.a1 = 58.0;
19066 a1.a2.a0.a4 = 59;
19067 a1.a2.a0.a5.a0.a0 = 60.0;
19068 a1.a2.a0.a5.a1.a0 = -61.0;
19069 a1.a2.a0.a6 = 62;
19070 a1.a2.a1.a0.a0 = -63;
19071 a1.a2.a1.a0.a1 = 64;
19072 a1.a2.a1.a1.a0 = -65.0;
19073 a1.a2.a2 = 66.0;
19074 a1.a2.a3 = -67.0;
19075 a1.a3 = 68.0;
19076 a2.a0 = 69;
19077 a2.a1.a0.a0 = 70;
19078 a2.a1.a0.a1.a0.a0 = -71;
19079 a2.a1.a0.a1.a0.a1 = 72;
19080 a2.a1.a0.a1.a1.a0 = -73.0;
19081 a2.a1.a0.a2 = 74;
19082 a2.a1.a0.a3.a0.a0 = -75.0;
19083 a2.a1.a0.a3.a1 = 76.0;
19084 a2.a1.a0.a4 = 77;
19085 a2.a1.a0.a5.a0.a0 = 78.0;
19086 a2.a1.a0.a5.a1.a0 = -79.0;
19087 a2.a1.a0.a6 = 80;
19088 a2.a1.a1.a0.a0 = -81;
19089 a2.a1.a1.a0.a1 = 82;
19090 a2.a1.a1.a1.a0 = -83.0;
19091 a2.a1.a2 = 84.0;
19092 a2.a1.a3 = -85.0;
19093 a2.a2.a0.a0 = 86;
19094 a2.a2.a0.a1.a0.a0 = -87;
19095 a2.a2.a0.a1.a0.a1 = 88;
19096 a2.a2.a0.a1.a1.a0 = -89.0;
19097 a2.a2.a0.a2 = 90;
19098 a2.a2.a0.a3.a0.a0 = -91.0;
19099 a2.a2.a0.a3.a1 = 92.0;
19100 a2.a2.a0.a4 = 93;
19101 a2.a2.a0.a5.a0.a0 = 94.0;
19102 a2.a2.a0.a5.a1.a0 = -95.0;
19103 a2.a2.a0.a6 = 96;
19104 a2.a2.a1.a0.a0 = -97;
19105 a2.a2.a1.a0.a1 = 98;
19106 a2.a2.a1.a1.a0 = -99.0;
19107 a2.a2.a2 = 100.0;
19108 a2.a2.a3 = -101.0;
19109 a2.a3 = 102.0;
19110 a3.a0 = 103;
19111 a3.a1.a0.a0 = 104;
19112 a3.a1.a0.a1.a0.a0 = -105;
19113 a3.a1.a0.a1.a0.a1 = 106;
19114 a3.a1.a0.a1.a1.a0 = -107.0;
19115 a3.a1.a0.a2 = 108;
19116 a3.a1.a0.a3.a0.a0 = -109.0;
19117 a3.a1.a0.a3.a1 = 110.0;
19118 a3.a1.a0.a4 = 111;
19119 a3.a1.a0.a5.a0.a0 = 112.0;
19120 a3.a1.a0.a5.a1.a0 = -113.0;
19121 a3.a1.a0.a6 = 114;
19122 a3.a1.a1.a0.a0 = -115;
19123 a3.a1.a1.a0.a1 = 116;
19124 a3.a1.a1.a1.a0 = -117.0;
19125 a3.a1.a2 = 118.0;
19126 a3.a1.a3 = -119.0;
19127 a3.a2.a0.a0 = 120;
19128 a3.a2.a0.a1.a0.a0 = -121;
19129 a3.a2.a0.a1.a0.a1 = 122;
19130 a3.a2.a0.a1.a1.a0 = -123.0;
19131 a3.a2.a0.a2 = 124;
19132 a3.a2.a0.a3.a0.a0 = -125.0;
19133 a3.a2.a0.a3.a1 = 126.0;
19134 a3.a2.a0.a4 = 127;
19135 a3.a2.a0.a5.a0.a0 = 128.0;
19136 a3.a2.a0.a5.a1.a0 = -129.0;
19137 a3.a2.a0.a6 = 130;
19138 a3.a2.a1.a0.a0 = -131;
19139 a3.a2.a1.a0.a1 = 132;
19140 a3.a2.a1.a1.a0 = -133.0;
19141 a3.a2.a2 = 134.0;
19142 a3.a2.a3 = -135.0;
19143 a3.a3 = 136.0;
19144
19145 std::cout
19146 << "Calling TestAsyncPassStructNestedIrregularEvenBiggerx4(" << "(("
19147 << a0.a0 << ", ((" << a0.a1.a0.a0 << ", ((" << a0.a1.a0.a1.a0.a0 << ", "
19148 << a0.a1.a0.a1.a0.a1 << "), (" << a0.a1.a0.a1.a1.a0 << ")), "
19149 << a0.a1.a0.a2 << ", ((" << a0.a1.a0.a3.a0.a0 << "), " << a0.a1.a0.a3.a1
19150 << "), " << a0.a1.a0.a4 << ", ((" << a0.a1.a0.a5.a0.a0 << "), ("
19151 << a0.a1.a0.a5.a1.a0 << ")), " << a0.a1.a0.a6 << "), ((" << a0.a1.a1.a0.a0
19152 << ", " << a0.a1.a1.a0.a1 << "), (" << a0.a1.a1.a1.a0 << ")), "
19153 << a0.a1.a2 << ", " << a0.a1.a3 << "), ((" << a0.a2.a0.a0 << ", (("
19154 << a0.a2.a0.a1.a0.a0 << ", " << a0.a2.a0.a1.a0.a1 << "), ("
19155 << a0.a2.a0.a1.a1.a0 << ")), " << a0.a2.a0.a2 << ", (("
19156 << a0.a2.a0.a3.a0.a0 << "), " << a0.a2.a0.a3.a1 << "), " << a0.a2.a0.a4
19157 << ", ((" << a0.a2.a0.a5.a0.a0 << "), (" << a0.a2.a0.a5.a1.a0 << ")), "
19158 << a0.a2.a0.a6 << "), ((" << a0.a2.a1.a0.a0 << ", " << a0.a2.a1.a0.a1
19159 << "), (" << a0.a2.a1.a1.a0 << ")), " << a0.a2.a2 << ", " << a0.a2.a3
19160 << "), " << a0.a3 << "), (" << a1.a0 << ", ((" << a1.a1.a0.a0 << ", (("
19161 << a1.a1.a0.a1.a0.a0 << ", " << a1.a1.a0.a1.a0.a1 << "), ("
19162 << a1.a1.a0.a1.a1.a0 << ")), " << a1.a1.a0.a2 << ", (("
19163 << a1.a1.a0.a3.a0.a0 << "), " << a1.a1.a0.a3.a1 << "), " << a1.a1.a0.a4
19164 << ", ((" << a1.a1.a0.a5.a0.a0 << "), (" << a1.a1.a0.a5.a1.a0 << ")), "
19165 << a1.a1.a0.a6 << "), ((" << a1.a1.a1.a0.a0 << ", " << a1.a1.a1.a0.a1
19166 << "), (" << a1.a1.a1.a1.a0 << ")), " << a1.a1.a2 << ", " << a1.a1.a3
19167 << "), ((" << a1.a2.a0.a0 << ", ((" << a1.a2.a0.a1.a0.a0 << ", "
19168 << a1.a2.a0.a1.a0.a1 << "), (" << a1.a2.a0.a1.a1.a0 << ")), "
19169 << a1.a2.a0.a2 << ", ((" << a1.a2.a0.a3.a0.a0 << "), " << a1.a2.a0.a3.a1
19170 << "), " << a1.a2.a0.a4 << ", ((" << a1.a2.a0.a5.a0.a0 << "), ("
19171 << a1.a2.a0.a5.a1.a0 << ")), " << a1.a2.a0.a6 << "), ((" << a1.a2.a1.a0.a0
19172 << ", " << a1.a2.a1.a0.a1 << "), (" << a1.a2.a1.a1.a0 << ")), "
19173 << a1.a2.a2 << ", " << a1.a2.a3 << "), " << a1.a3 << "), (" << a2.a0
19174 << ", ((" << a2.a1.a0.a0 << ", ((" << a2.a1.a0.a1.a0.a0 << ", "
19175 << a2.a1.a0.a1.a0.a1 << "), (" << a2.a1.a0.a1.a1.a0 << ")), "
19176 << a2.a1.a0.a2 << ", ((" << a2.a1.a0.a3.a0.a0 << "), " << a2.a1.a0.a3.a1
19177 << "), " << a2.a1.a0.a4 << ", ((" << a2.a1.a0.a5.a0.a0 << "), ("
19178 << a2.a1.a0.a5.a1.a0 << ")), " << a2.a1.a0.a6 << "), ((" << a2.a1.a1.a0.a0
19179 << ", " << a2.a1.a1.a0.a1 << "), (" << a2.a1.a1.a1.a0 << ")), "
19180 << a2.a1.a2 << ", " << a2.a1.a3 << "), ((" << a2.a2.a0.a0 << ", (("
19181 << a2.a2.a0.a1.a0.a0 << ", " << a2.a2.a0.a1.a0.a1 << "), ("
19182 << a2.a2.a0.a1.a1.a0 << ")), " << a2.a2.a0.a2 << ", (("
19183 << a2.a2.a0.a3.a0.a0 << "), " << a2.a2.a0.a3.a1 << "), " << a2.a2.a0.a4
19184 << ", ((" << a2.a2.a0.a5.a0.a0 << "), (" << a2.a2.a0.a5.a1.a0 << ")), "
19185 << a2.a2.a0.a6 << "), ((" << a2.a2.a1.a0.a0 << ", " << a2.a2.a1.a0.a1
19186 << "), (" << a2.a2.a1.a1.a0 << ")), " << a2.a2.a2 << ", " << a2.a2.a3
19187 << "), " << a2.a3 << "), (" << a3.a0 << ", ((" << a3.a1.a0.a0 << ", (("
19188 << a3.a1.a0.a1.a0.a0 << ", " << a3.a1.a0.a1.a0.a1 << "), ("
19189 << a3.a1.a0.a1.a1.a0 << ")), " << a3.a1.a0.a2 << ", (("
19190 << a3.a1.a0.a3.a0.a0 << "), " << a3.a1.a0.a3.a1 << "), " << a3.a1.a0.a4
19191 << ", ((" << a3.a1.a0.a5.a0.a0 << "), (" << a3.a1.a0.a5.a1.a0 << ")), "
19192 << a3.a1.a0.a6 << "), ((" << a3.a1.a1.a0.a0 << ", " << a3.a1.a1.a0.a1
19193 << "), (" << a3.a1.a1.a1.a0 << ")), " << a3.a1.a2 << ", " << a3.a1.a3
19194 << "), ((" << a3.a2.a0.a0 << ", ((" << a3.a2.a0.a1.a0.a0 << ", "
19195 << a3.a2.a0.a1.a0.a1 << "), (" << a3.a2.a0.a1.a1.a0 << ")), "
19196 << a3.a2.a0.a2 << ", ((" << a3.a2.a0.a3.a0.a0 << "), " << a3.a2.a0.a3.a1
19197 << "), " << a3.a2.a0.a4 << ", ((" << a3.a2.a0.a5.a0.a0 << "), ("
19198 << a3.a2.a0.a5.a1.a0 << ")), " << a3.a2.a0.a6 << "), ((" << a3.a2.a1.a0.a0
19199 << ", " << a3.a2.a1.a0.a1 << "), (" << a3.a2.a1.a1.a0 << ")), "
19200 << a3.a2.a2 << ", " << a3.a2.a3 << "), " << a3.a3 << "))" << ")\n";
19201
19202 f(a0, a1, a2, a3);
19203}
19204
19205// Used for testing structs and unions by value.
19206// Simple struct with inline array.
19208 // NOLINTNEXTLINE(whitespace/parens)
19209 void (*f)(Struct8BytesInlineArrayInt a0,
19217
19218 a0.a0[0] = 1;
19219 a0.a0[1] = 2;
19220 a0.a0[2] = 3;
19221 a0.a0[3] = 4;
19222 a0.a0[4] = 5;
19223 a0.a0[5] = 6;
19224 a0.a0[6] = 7;
19225 a0.a0[7] = 8;
19226 a1.a0[0] = 9;
19227 a1.a0[1] = 10;
19228 a1.a0[2] = 11;
19229 a1.a0[3] = 12;
19230 a1.a0[4] = 13;
19231 a1.a0[5] = 14;
19232 a1.a0[6] = 15;
19233 a1.a0[7] = 16;
19234 a2.a0[0] = 17;
19235 a2.a0[1] = 18;
19236 a2.a0[2] = 19;
19237 a2.a0[3] = 20;
19238 a2.a0[4] = 21;
19239 a2.a0[5] = 22;
19240 a2.a0[6] = 23;
19241 a2.a0[7] = 24;
19242 a3.a0[0] = 25;
19243 a3.a0[1] = 26;
19244 a3.a0[2] = 27;
19245 a3.a0[3] = 28;
19246 a3.a0[4] = 29;
19247 a3.a0[5] = 30;
19248 a3.a0[6] = 31;
19249 a3.a0[7] = 32;
19250
19251 std::cout << "Calling TestAsyncPassStruct8BytesInlineArrayIntx4(" << "((["
19252 << static_cast<int>(a0.a0[0]) << ", " << static_cast<int>(a0.a0[1])
19253 << ", " << static_cast<int>(a0.a0[2]) << ", "
19254 << static_cast<int>(a0.a0[3]) << ", " << static_cast<int>(a0.a0[4])
19255 << ", " << static_cast<int>(a0.a0[5]) << ", "
19256 << static_cast<int>(a0.a0[6]) << ", " << static_cast<int>(a0.a0[7])
19257 << "]), ([" << static_cast<int>(a1.a0[0]) << ", "
19258 << static_cast<int>(a1.a0[1]) << ", " << static_cast<int>(a1.a0[2])
19259 << ", " << static_cast<int>(a1.a0[3]) << ", "
19260 << static_cast<int>(a1.a0[4]) << ", " << static_cast<int>(a1.a0[5])
19261 << ", " << static_cast<int>(a1.a0[6]) << ", "
19262 << static_cast<int>(a1.a0[7]) << "]), (["
19263 << static_cast<int>(a2.a0[0]) << ", " << static_cast<int>(a2.a0[1])
19264 << ", " << static_cast<int>(a2.a0[2]) << ", "
19265 << static_cast<int>(a2.a0[3]) << ", " << static_cast<int>(a2.a0[4])
19266 << ", " << static_cast<int>(a2.a0[5]) << ", "
19267 << static_cast<int>(a2.a0[6]) << ", " << static_cast<int>(a2.a0[7])
19268 << "]), ([" << static_cast<int>(a3.a0[0]) << ", "
19269 << static_cast<int>(a3.a0[1]) << ", " << static_cast<int>(a3.a0[2])
19270 << ", " << static_cast<int>(a3.a0[3]) << ", "
19271 << static_cast<int>(a3.a0[4]) << ", " << static_cast<int>(a3.a0[5])
19272 << ", " << static_cast<int>(a3.a0[6]) << ", "
19273 << static_cast<int>(a3.a0[7]) << "]))" << ")\n";
19274
19275 f(a0, a1, a2, a3);
19276}
19277
19278// Used for testing structs and unions by value.
19279// Irregular struct with inline array.
19281 // NOLINTNEXTLINE(whitespace/parens)
19282 void (*f)(StructInlineArrayIrregular a0,
19290
19291 a0.a0[0].a0 = -1;
19292 a0.a0[0].a1 = 2;
19293 a0.a0[1].a0 = -3;
19294 a0.a0[1].a1 = 4;
19295 a0.a1 = 5;
19296 a1.a0[0].a0 = 6;
19297 a1.a0[0].a1 = -7;
19298 a1.a0[1].a0 = 8;
19299 a1.a0[1].a1 = -9;
19300 a1.a1 = 10;
19301 a2.a0[0].a0 = -11;
19302 a2.a0[0].a1 = 12;
19303 a2.a0[1].a0 = -13;
19304 a2.a0[1].a1 = 14;
19305 a2.a1 = 15;
19306 a3.a0[0].a0 = 16;
19307 a3.a0[0].a1 = -17;
19308 a3.a0[1].a0 = 18;
19309 a3.a0[1].a1 = -19;
19310 a3.a1 = 20;
19311
19312 std::cout << "Calling TestAsyncPassStructInlineArrayIrregularx4(" << "(([("
19313 << a0.a0[0].a0 << ", " << static_cast<int>(a0.a0[0].a1) << "), ("
19314 << a0.a0[1].a0 << ", " << static_cast<int>(a0.a0[1].a1) << ")], "
19315 << static_cast<int>(a0.a1) << "), ([(" << a1.a0[0].a0 << ", "
19316 << static_cast<int>(a1.a0[0].a1) << "), (" << a1.a0[1].a0 << ", "
19317 << static_cast<int>(a1.a0[1].a1) << ")], "
19318 << static_cast<int>(a1.a1) << "), ([(" << a2.a0[0].a0 << ", "
19319 << static_cast<int>(a2.a0[0].a1) << "), (" << a2.a0[1].a0 << ", "
19320 << static_cast<int>(a2.a0[1].a1) << ")], "
19321 << static_cast<int>(a2.a1) << "), ([(" << a3.a0[0].a0 << ", "
19322 << static_cast<int>(a3.a0[0].a1) << "), (" << a3.a0[1].a0 << ", "
19323 << static_cast<int>(a3.a0[1].a1) << ")], "
19324 << static_cast<int>(a3.a1) << "))" << ")\n";
19325
19326 f(a0, a1, a2, a3);
19327}
19328
19329// Used for testing structs and unions by value.
19330// Regular larger struct with inline array.
19332 // NOLINTNEXTLINE(whitespace/parens)
19333 void (*f)(StructInlineArray100Bytes a0)) {
19335
19336 a0.a0[0] = 1;
19337 a0.a0[1] = 2;
19338 a0.a0[2] = 3;
19339 a0.a0[3] = 4;
19340 a0.a0[4] = 5;
19341 a0.a0[5] = 6;
19342 a0.a0[6] = 7;
19343 a0.a0[7] = 8;
19344 a0.a0[8] = 9;
19345 a0.a0[9] = 10;
19346 a0.a0[10] = 11;
19347 a0.a0[11] = 12;
19348 a0.a0[12] = 13;
19349 a0.a0[13] = 14;
19350 a0.a0[14] = 15;
19351 a0.a0[15] = 16;
19352 a0.a0[16] = 17;
19353 a0.a0[17] = 18;
19354 a0.a0[18] = 19;
19355 a0.a0[19] = 20;
19356 a0.a0[20] = 21;
19357 a0.a0[21] = 22;
19358 a0.a0[22] = 23;
19359 a0.a0[23] = 24;
19360 a0.a0[24] = 25;
19361 a0.a0[25] = 26;
19362 a0.a0[26] = 27;
19363 a0.a0[27] = 28;
19364 a0.a0[28] = 29;
19365 a0.a0[29] = 30;
19366 a0.a0[30] = 31;
19367 a0.a0[31] = 32;
19368 a0.a0[32] = 33;
19369 a0.a0[33] = 34;
19370 a0.a0[34] = 35;
19371 a0.a0[35] = 36;
19372 a0.a0[36] = 37;
19373 a0.a0[37] = 38;
19374 a0.a0[38] = 39;
19375 a0.a0[39] = 40;
19376 a0.a0[40] = 41;
19377 a0.a0[41] = 42;
19378 a0.a0[42] = 43;
19379 a0.a0[43] = 44;
19380 a0.a0[44] = 45;
19381 a0.a0[45] = 46;
19382 a0.a0[46] = 47;
19383 a0.a0[47] = 48;
19384 a0.a0[48] = 49;
19385 a0.a0[49] = 50;
19386 a0.a0[50] = 51;
19387 a0.a0[51] = 52;
19388 a0.a0[52] = 53;
19389 a0.a0[53] = 54;
19390 a0.a0[54] = 55;
19391 a0.a0[55] = 56;
19392 a0.a0[56] = 57;
19393 a0.a0[57] = 58;
19394 a0.a0[58] = 59;
19395 a0.a0[59] = 60;
19396 a0.a0[60] = 61;
19397 a0.a0[61] = 62;
19398 a0.a0[62] = 63;
19399 a0.a0[63] = 64;
19400 a0.a0[64] = 65;
19401 a0.a0[65] = 66;
19402 a0.a0[66] = 67;
19403 a0.a0[67] = 68;
19404 a0.a0[68] = 69;
19405 a0.a0[69] = 70;
19406 a0.a0[70] = 71;
19407 a0.a0[71] = 72;
19408 a0.a0[72] = 73;
19409 a0.a0[73] = 74;
19410 a0.a0[74] = 75;
19411 a0.a0[75] = 76;
19412 a0.a0[76] = 77;
19413 a0.a0[77] = 78;
19414 a0.a0[78] = 79;
19415 a0.a0[79] = 80;
19416 a0.a0[80] = 81;
19417 a0.a0[81] = 82;
19418 a0.a0[82] = 83;
19419 a0.a0[83] = 84;
19420 a0.a0[84] = 85;
19421 a0.a0[85] = 86;
19422 a0.a0[86] = 87;
19423 a0.a0[87] = 88;
19424 a0.a0[88] = 89;
19425 a0.a0[89] = 90;
19426 a0.a0[90] = 91;
19427 a0.a0[91] = 92;
19428 a0.a0[92] = 93;
19429 a0.a0[93] = 94;
19430 a0.a0[94] = 95;
19431 a0.a0[95] = 96;
19432 a0.a0[96] = 97;
19433 a0.a0[97] = 98;
19434 a0.a0[98] = 99;
19435 a0.a0[99] = 100;
19436
19437 std::cout
19438 << "Calling TestAsyncPassStructInlineArray100Bytes(" << "((["
19439 << static_cast<int>(a0.a0[0]) << ", " << static_cast<int>(a0.a0[1])
19440 << ", " << static_cast<int>(a0.a0[2]) << ", "
19441 << static_cast<int>(a0.a0[3]) << ", " << static_cast<int>(a0.a0[4])
19442 << ", " << static_cast<int>(a0.a0[5]) << ", "
19443 << static_cast<int>(a0.a0[6]) << ", " << static_cast<int>(a0.a0[7])
19444 << ", " << static_cast<int>(a0.a0[8]) << ", "
19445 << static_cast<int>(a0.a0[9]) << ", " << static_cast<int>(a0.a0[10])
19446 << ", " << static_cast<int>(a0.a0[11]) << ", "
19447 << static_cast<int>(a0.a0[12]) << ", " << static_cast<int>(a0.a0[13])
19448 << ", " << static_cast<int>(a0.a0[14]) << ", "
19449 << static_cast<int>(a0.a0[15]) << ", " << static_cast<int>(a0.a0[16])
19450 << ", " << static_cast<int>(a0.a0[17]) << ", "
19451 << static_cast<int>(a0.a0[18]) << ", " << static_cast<int>(a0.a0[19])
19452 << ", " << static_cast<int>(a0.a0[20]) << ", "
19453 << static_cast<int>(a0.a0[21]) << ", " << static_cast<int>(a0.a0[22])
19454 << ", " << static_cast<int>(a0.a0[23]) << ", "
19455 << static_cast<int>(a0.a0[24]) << ", " << static_cast<int>(a0.a0[25])
19456 << ", " << static_cast<int>(a0.a0[26]) << ", "
19457 << static_cast<int>(a0.a0[27]) << ", " << static_cast<int>(a0.a0[28])
19458 << ", " << static_cast<int>(a0.a0[29]) << ", "
19459 << static_cast<int>(a0.a0[30]) << ", " << static_cast<int>(a0.a0[31])
19460 << ", " << static_cast<int>(a0.a0[32]) << ", "
19461 << static_cast<int>(a0.a0[33]) << ", " << static_cast<int>(a0.a0[34])
19462 << ", " << static_cast<int>(a0.a0[35]) << ", "
19463 << static_cast<int>(a0.a0[36]) << ", " << static_cast<int>(a0.a0[37])
19464 << ", " << static_cast<int>(a0.a0[38]) << ", "
19465 << static_cast<int>(a0.a0[39]) << ", " << static_cast<int>(a0.a0[40])
19466 << ", " << static_cast<int>(a0.a0[41]) << ", "
19467 << static_cast<int>(a0.a0[42]) << ", " << static_cast<int>(a0.a0[43])
19468 << ", " << static_cast<int>(a0.a0[44]) << ", "
19469 << static_cast<int>(a0.a0[45]) << ", " << static_cast<int>(a0.a0[46])
19470 << ", " << static_cast<int>(a0.a0[47]) << ", "
19471 << static_cast<int>(a0.a0[48]) << ", " << static_cast<int>(a0.a0[49])
19472 << ", " << static_cast<int>(a0.a0[50]) << ", "
19473 << static_cast<int>(a0.a0[51]) << ", " << static_cast<int>(a0.a0[52])
19474 << ", " << static_cast<int>(a0.a0[53]) << ", "
19475 << static_cast<int>(a0.a0[54]) << ", " << static_cast<int>(a0.a0[55])
19476 << ", " << static_cast<int>(a0.a0[56]) << ", "
19477 << static_cast<int>(a0.a0[57]) << ", " << static_cast<int>(a0.a0[58])
19478 << ", " << static_cast<int>(a0.a0[59]) << ", "
19479 << static_cast<int>(a0.a0[60]) << ", " << static_cast<int>(a0.a0[61])
19480 << ", " << static_cast<int>(a0.a0[62]) << ", "
19481 << static_cast<int>(a0.a0[63]) << ", " << static_cast<int>(a0.a0[64])
19482 << ", " << static_cast<int>(a0.a0[65]) << ", "
19483 << static_cast<int>(a0.a0[66]) << ", " << static_cast<int>(a0.a0[67])
19484 << ", " << static_cast<int>(a0.a0[68]) << ", "
19485 << static_cast<int>(a0.a0[69]) << ", " << static_cast<int>(a0.a0[70])
19486 << ", " << static_cast<int>(a0.a0[71]) << ", "
19487 << static_cast<int>(a0.a0[72]) << ", " << static_cast<int>(a0.a0[73])
19488 << ", " << static_cast<int>(a0.a0[74]) << ", "
19489 << static_cast<int>(a0.a0[75]) << ", " << static_cast<int>(a0.a0[76])
19490 << ", " << static_cast<int>(a0.a0[77]) << ", "
19491 << static_cast<int>(a0.a0[78]) << ", " << static_cast<int>(a0.a0[79])
19492 << ", " << static_cast<int>(a0.a0[80]) << ", "
19493 << static_cast<int>(a0.a0[81]) << ", " << static_cast<int>(a0.a0[82])
19494 << ", " << static_cast<int>(a0.a0[83]) << ", "
19495 << static_cast<int>(a0.a0[84]) << ", " << static_cast<int>(a0.a0[85])
19496 << ", " << static_cast<int>(a0.a0[86]) << ", "
19497 << static_cast<int>(a0.a0[87]) << ", " << static_cast<int>(a0.a0[88])
19498 << ", " << static_cast<int>(a0.a0[89]) << ", "
19499 << static_cast<int>(a0.a0[90]) << ", " << static_cast<int>(a0.a0[91])
19500 << ", " << static_cast<int>(a0.a0[92]) << ", "
19501 << static_cast<int>(a0.a0[93]) << ", " << static_cast<int>(a0.a0[94])
19502 << ", " << static_cast<int>(a0.a0[95]) << ", "
19503 << static_cast<int>(a0.a0[96]) << ", " << static_cast<int>(a0.a0[97])
19504 << ", " << static_cast<int>(a0.a0[98]) << ", "
19505 << static_cast<int>(a0.a0[99]) << "]))" << ")\n";
19506
19507 f(a0);
19508}
19509
19510// Used for testing structs and unions by value.
19511// Arguments in FPU registers on arm hardfp and arm64.
19512// 5 struct arguments will exhaust available registers.
19514 // NOLINTNEXTLINE(whitespace/parens)
19525
19526 a0.a0.a0 = -1.0;
19527 a0.a1[0].a0 = 2.0;
19528 a0.a1[1].a0 = -3.0;
19529 a0.a2 = 4.0;
19530 a1.a0.a0 = -5.0;
19531 a1.a1[0].a0 = 6.0;
19532 a1.a1[1].a0 = -7.0;
19533 a1.a2 = 8.0;
19534 a2.a0.a0 = -9.0;
19535 a2.a1[0].a0 = 10.0;
19536 a2.a1[1].a0 = -11.0;
19537 a2.a2 = 12.0;
19538 a3.a0.a0 = -13.0;
19539 a3.a1[0].a0 = 14.0;
19540 a3.a1[1].a0 = -15.0;
19541 a3.a2 = 16.0;
19542 a4.a0.a0 = -17.0;
19543 a4.a1[0].a0 = 18.0;
19544 a4.a1[1].a0 = -19.0;
19545 a4.a2 = 20.0;
19546
19547 std::cout << "Calling TestAsyncPassStructStruct16BytesHomogeneousFloat2x5("
19548 << "(((" << a0.a0.a0 << "), [(" << a0.a1[0].a0 << "), ("
19549 << a0.a1[1].a0 << ")], " << a0.a2 << "), ((" << a1.a0.a0 << "), [("
19550 << a1.a1[0].a0 << "), (" << a1.a1[1].a0 << ")], " << a1.a2
19551 << "), ((" << a2.a0.a0 << "), [(" << a2.a1[0].a0 << "), ("
19552 << a2.a1[1].a0 << ")], " << a2.a2 << "), ((" << a3.a0.a0 << "), [("
19553 << a3.a1[0].a0 << "), (" << a3.a1[1].a0 << ")], " << a3.a2
19554 << "), ((" << a4.a0.a0 << "), [(" << a4.a1[0].a0 << "), ("
19555 << a4.a1[1].a0 << ")], " << a4.a2 << "))" << ")\n";
19556
19557 f(a0, a1, a2, a3, a4);
19558}
19559
19560// Used for testing structs and unions by value.
19561// Arguments in FPU registers on arm64.
19562// 5 struct arguments will exhaust available registers.
19564 // NOLINTNEXTLINE(whitespace/parens)
19575
19576 a0.a0.a0 = -1.0;
19577 a0.a1[0].a0 = 2.0;
19578 a0.a1[1].a0 = -3.0;
19579 a0.a2 = 4.0;
19580 a1.a0.a0 = -5.0;
19581 a1.a1[0].a0 = 6.0;
19582 a1.a1[1].a0 = -7.0;
19583 a1.a2 = 8.0;
19584 a2.a0.a0 = -9.0;
19585 a2.a1[0].a0 = 10.0;
19586 a2.a1[1].a0 = -11.0;
19587 a2.a2 = 12.0;
19588 a3.a0.a0 = -13.0;
19589 a3.a1[0].a0 = 14.0;
19590 a3.a1[1].a0 = -15.0;
19591 a3.a2 = 16.0;
19592 a4.a0.a0 = -17.0;
19593 a4.a1[0].a0 = 18.0;
19594 a4.a1[1].a0 = -19.0;
19595 a4.a2 = 20.0;
19596
19597 std::cout << "Calling TestAsyncPassStructStruct32BytesHomogeneousDouble2x5("
19598 << "(((" << a0.a0.a0 << "), [(" << a0.a1[0].a0 << "), ("
19599 << a0.a1[1].a0 << ")], " << a0.a2 << "), ((" << a1.a0.a0 << "), [("
19600 << a1.a1[0].a0 << "), (" << a1.a1[1].a0 << ")], " << a1.a2
19601 << "), ((" << a2.a0.a0 << "), [(" << a2.a1[0].a0 << "), ("
19602 << a2.a1[1].a0 << ")], " << a2.a2 << "), ((" << a3.a0.a0 << "), [("
19603 << a3.a1[0].a0 << "), (" << a3.a1[1].a0 << ")], " << a3.a2
19604 << "), ((" << a4.a0.a0 << "), [(" << a4.a1[0].a0 << "), ("
19605 << a4.a1[1].a0 << ")], " << a4.a2 << "))" << ")\n";
19606
19607 f(a0, a1, a2, a3, a4);
19608}
19609
19610// Used for testing structs and unions by value.
19611// On x64, arguments are split over FP and int registers.
19612// On x64, it will exhaust the integer registers with the 6th argument.
19613// The rest goes on the stack.
19614// On arm, arguments are 4 byte aligned.
19616 // NOLINTNEXTLINE(whitespace/parens)
19617 void (*f)(StructStruct16BytesMixed3 a0,
19637
19638 a0.a0.a0 = -1.0;
19639 a0.a1[0].a0 = 2.0;
19640 a0.a1[0].a1 = -3;
19641 a0.a1[0].a2 = 4;
19642 a0.a2[0] = -5;
19643 a0.a2[1] = 6;
19644 a1.a0.a0 = -7.0;
19645 a1.a1[0].a0 = 8.0;
19646 a1.a1[0].a1 = -9;
19647 a1.a1[0].a2 = 10;
19648 a1.a2[0] = -11;
19649 a1.a2[1] = 12;
19650 a2.a0.a0 = -13.0;
19651 a2.a1[0].a0 = 14.0;
19652 a2.a1[0].a1 = -15;
19653 a2.a1[0].a2 = 16;
19654 a2.a2[0] = -17;
19655 a2.a2[1] = 18;
19656 a3.a0.a0 = -19.0;
19657 a3.a1[0].a0 = 20.0;
19658 a3.a1[0].a1 = -21;
19659 a3.a1[0].a2 = 22;
19660 a3.a2[0] = -23;
19661 a3.a2[1] = 24;
19662 a4.a0.a0 = -25.0;
19663 a4.a1[0].a0 = 26.0;
19664 a4.a1[0].a1 = -27;
19665 a4.a1[0].a2 = 28;
19666 a4.a2[0] = -29;
19667 a4.a2[1] = 30;
19668 a5.a0.a0 = -31.0;
19669 a5.a1[0].a0 = 32.0;
19670 a5.a1[0].a1 = -33;
19671 a5.a1[0].a2 = 34;
19672 a5.a2[0] = -35;
19673 a5.a2[1] = 36;
19674 a6.a0.a0 = -37.0;
19675 a6.a1[0].a0 = 38.0;
19676 a6.a1[0].a1 = -39;
19677 a6.a1[0].a2 = 40;
19678 a6.a2[0] = -41;
19679 a6.a2[1] = 42;
19680 a7.a0.a0 = -43.0;
19681 a7.a1[0].a0 = 44.0;
19682 a7.a1[0].a1 = -45;
19683 a7.a1[0].a2 = 46;
19684 a7.a2[0] = -47;
19685 a7.a2[1] = 48;
19686 a8.a0.a0 = -49.0;
19687 a8.a1[0].a0 = 50.0;
19688 a8.a1[0].a1 = -51;
19689 a8.a1[0].a2 = 52;
19690 a8.a2[0] = -53;
19691 a8.a2[1] = 54;
19692 a9.a0.a0 = -55.0;
19693 a9.a1[0].a0 = 56.0;
19694 a9.a1[0].a1 = -57;
19695 a9.a1[0].a2 = 58;
19696 a9.a2[0] = -59;
19697 a9.a2[1] = 60;
19698
19699 std::cout << "Calling TestAsyncPassStructStruct16BytesMixed3x10(" << "((("
19700 << a0.a0.a0 << "), [(" << a0.a1[0].a0 << ", " << a0.a1[0].a1 << ", "
19701 << a0.a1[0].a2 << ")], [" << a0.a2[0] << ", " << a0.a2[1]
19702 << "]), ((" << a1.a0.a0 << "), [(" << a1.a1[0].a0 << ", "
19703 << a1.a1[0].a1 << ", " << a1.a1[0].a2 << ")], [" << a1.a2[0] << ", "
19704 << a1.a2[1] << "]), ((" << a2.a0.a0 << "), [(" << a2.a1[0].a0
19705 << ", " << a2.a1[0].a1 << ", " << a2.a1[0].a2 << ")], [" << a2.a2[0]
19706 << ", " << a2.a2[1] << "]), ((" << a3.a0.a0 << "), [("
19707 << a3.a1[0].a0 << ", " << a3.a1[0].a1 << ", " << a3.a1[0].a2
19708 << ")], [" << a3.a2[0] << ", " << a3.a2[1] << "]), ((" << a4.a0.a0
19709 << "), [(" << a4.a1[0].a0 << ", " << a4.a1[0].a1 << ", "
19710 << a4.a1[0].a2 << ")], [" << a4.a2[0] << ", " << a4.a2[1]
19711 << "]), ((" << a5.a0.a0 << "), [(" << a5.a1[0].a0 << ", "
19712 << a5.a1[0].a1 << ", " << a5.a1[0].a2 << ")], [" << a5.a2[0] << ", "
19713 << a5.a2[1] << "]), ((" << a6.a0.a0 << "), [(" << a6.a1[0].a0
19714 << ", " << a6.a1[0].a1 << ", " << a6.a1[0].a2 << ")], [" << a6.a2[0]
19715 << ", " << a6.a2[1] << "]), ((" << a7.a0.a0 << "), [("
19716 << a7.a1[0].a0 << ", " << a7.a1[0].a1 << ", " << a7.a1[0].a2
19717 << ")], [" << a7.a2[0] << ", " << a7.a2[1] << "]), ((" << a8.a0.a0
19718 << "), [(" << a8.a1[0].a0 << ", " << a8.a1[0].a1 << ", "
19719 << a8.a1[0].a2 << ")], [" << a8.a2[0] << ", " << a8.a2[1]
19720 << "]), ((" << a9.a0.a0 << "), [(" << a9.a1[0].a0 << ", "
19721 << a9.a1[0].a1 << ", " << a9.a1[0].a2 << ")], [" << a9.a2[0] << ", "
19722 << a9.a2[1] << "]))" << ")\n";
19723
19724 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
19725}
19726
19727// Used for testing structs and unions by value.
19728// Test multi dimensional inline array struct as argument.
19730 // NOLINTNEXTLINE(whitespace/parens)
19731 void (*f)(uint8_t a0,
19733 uint8_t a2,
19735 uint8_t a4,
19737 uint8_t a6)) {
19738 uint8_t a0;
19740 uint8_t a2;
19742 uint8_t a4;
19744 uint8_t a6;
19745
19746 a0 = 1;
19747 a1.a0[0][0][0][0][0] = 2;
19748 a1.a0[0][0][0][0][1] = 3;
19749 a1.a0[0][0][0][1][0] = 4;
19750 a1.a0[0][0][0][1][1] = 5;
19751 a1.a0[0][0][1][0][0] = 6;
19752 a1.a0[0][0][1][0][1] = 7;
19753 a1.a0[0][0][1][1][0] = 8;
19754 a1.a0[0][0][1][1][1] = 9;
19755 a1.a0[0][1][0][0][0] = 10;
19756 a1.a0[0][1][0][0][1] = 11;
19757 a1.a0[0][1][0][1][0] = 12;
19758 a1.a0[0][1][0][1][1] = 13;
19759 a1.a0[0][1][1][0][0] = 14;
19760 a1.a0[0][1][1][0][1] = 15;
19761 a1.a0[0][1][1][1][0] = 16;
19762 a1.a0[0][1][1][1][1] = 17;
19763 a1.a0[1][0][0][0][0] = 18;
19764 a1.a0[1][0][0][0][1] = 19;
19765 a1.a0[1][0][0][1][0] = 20;
19766 a1.a0[1][0][0][1][1] = 21;
19767 a1.a0[1][0][1][0][0] = 22;
19768 a1.a0[1][0][1][0][1] = 23;
19769 a1.a0[1][0][1][1][0] = 24;
19770 a1.a0[1][0][1][1][1] = 25;
19771 a1.a0[1][1][0][0][0] = 26;
19772 a1.a0[1][1][0][0][1] = 27;
19773 a1.a0[1][1][0][1][0] = 28;
19774 a1.a0[1][1][0][1][1] = 29;
19775 a1.a0[1][1][1][0][0] = 30;
19776 a1.a0[1][1][1][0][1] = 31;
19777 a1.a0[1][1][1][1][0] = 32;
19778 a1.a0[1][1][1][1][1] = 33;
19779 a2 = 34;
19780 a3.a0[0][0][0] = 35;
19781 a3.a0[0][0][1] = 36;
19782 a3.a0[0][1][0] = 37;
19783 a3.a0[0][1][1] = 38;
19784 a3.a0[1][0][0] = 39;
19785 a3.a0[1][0][1] = 40;
19786 a3.a0[1][1][0] = 41;
19787 a3.a0[1][1][1] = 42;
19788 a4 = 43;
19789 a5.a0[0][0][0] = 44;
19790 a5.a0[0][0][1] = 45;
19791 a5.a0[0][1][0] = 46;
19792 a5.a0[0][1][1] = 47;
19793 a5.a0[1][0][0] = 48;
19794 a5.a0[1][0][1] = 49;
19795 a5.a0[1][1][0] = 50;
19796 a5.a0[1][1][1] = 51;
19797 a6 = 52;
19798
19799 std::cout
19800 << "Calling TestAsyncPassUint8Struct32BytesInlineArrayMultiDimensionalI("
19801 << "(" << static_cast<int>(a0) << ", ([[[[["
19802 << static_cast<int>(a1.a0[0][0][0][0][0]) << ", "
19803 << static_cast<int>(a1.a0[0][0][0][0][1]) << "], ["
19804 << static_cast<int>(a1.a0[0][0][0][1][0]) << ", "
19805 << static_cast<int>(a1.a0[0][0][0][1][1]) << "]], [["
19806 << static_cast<int>(a1.a0[0][0][1][0][0]) << ", "
19807 << static_cast<int>(a1.a0[0][0][1][0][1]) << "], ["
19808 << static_cast<int>(a1.a0[0][0][1][1][0]) << ", "
19809 << static_cast<int>(a1.a0[0][0][1][1][1]) << "]]], [[["
19810 << static_cast<int>(a1.a0[0][1][0][0][0]) << ", "
19811 << static_cast<int>(a1.a0[0][1][0][0][1]) << "], ["
19812 << static_cast<int>(a1.a0[0][1][0][1][0]) << ", "
19813 << static_cast<int>(a1.a0[0][1][0][1][1]) << "]], [["
19814 << static_cast<int>(a1.a0[0][1][1][0][0]) << ", "
19815 << static_cast<int>(a1.a0[0][1][1][0][1]) << "], ["
19816 << static_cast<int>(a1.a0[0][1][1][1][0]) << ", "
19817 << static_cast<int>(a1.a0[0][1][1][1][1]) << "]]]], [[[["
19818 << static_cast<int>(a1.a0[1][0][0][0][0]) << ", "
19819 << static_cast<int>(a1.a0[1][0][0][0][1]) << "], ["
19820 << static_cast<int>(a1.a0[1][0][0][1][0]) << ", "
19821 << static_cast<int>(a1.a0[1][0][0][1][1]) << "]], [["
19822 << static_cast<int>(a1.a0[1][0][1][0][0]) << ", "
19823 << static_cast<int>(a1.a0[1][0][1][0][1]) << "], ["
19824 << static_cast<int>(a1.a0[1][0][1][1][0]) << ", "
19825 << static_cast<int>(a1.a0[1][0][1][1][1]) << "]]], [[["
19826 << static_cast<int>(a1.a0[1][1][0][0][0]) << ", "
19827 << static_cast<int>(a1.a0[1][1][0][0][1]) << "], ["
19828 << static_cast<int>(a1.a0[1][1][0][1][0]) << ", "
19829 << static_cast<int>(a1.a0[1][1][0][1][1]) << "]], [["
19830 << static_cast<int>(a1.a0[1][1][1][0][0]) << ", "
19831 << static_cast<int>(a1.a0[1][1][1][0][1]) << "], ["
19832 << static_cast<int>(a1.a0[1][1][1][1][0]) << ", "
19833 << static_cast<int>(a1.a0[1][1][1][1][1]) << "]]]]]), "
19834 << static_cast<int>(a2) << ", ([[[" << static_cast<int>(a3.a0[0][0][0])
19835 << ", " << static_cast<int>(a3.a0[0][0][1]) << "], ["
19836 << static_cast<int>(a3.a0[0][1][0]) << ", "
19837 << static_cast<int>(a3.a0[0][1][1]) << "]], [["
19838 << static_cast<int>(a3.a0[1][0][0]) << ", "
19839 << static_cast<int>(a3.a0[1][0][1]) << "], ["
19840 << static_cast<int>(a3.a0[1][1][0]) << ", "
19841 << static_cast<int>(a3.a0[1][1][1]) << "]]]), " << static_cast<int>(a4)
19842 << ", ([[[" << static_cast<int>(a5.a0[0][0][0]) << ", "
19843 << static_cast<int>(a5.a0[0][0][1]) << "], ["
19844 << static_cast<int>(a5.a0[0][1][0]) << ", "
19845 << static_cast<int>(a5.a0[0][1][1]) << "]], [["
19846 << static_cast<int>(a5.a0[1][0][0]) << ", "
19847 << static_cast<int>(a5.a0[1][0][1]) << "], ["
19848 << static_cast<int>(a5.a0[1][1][0]) << ", "
19849 << static_cast<int>(a5.a0[1][1][1]) << "]]]), " << static_cast<int>(a6)
19850 << ")" << ")\n";
19851
19852 f(a0, a1, a2, a3, a4, a5, a6);
19853}
19854
19855// Used for testing structs and unions by value.
19856// Test struct in multi dimensional inline array.
19858 // NOLINTNEXTLINE(whitespace/parens)
19859 void (*f)(uint8_t a0,
19861 uint8_t a2)) {
19862 uint8_t a0;
19864 uint8_t a2;
19865
19866 a0 = 1;
19867 a1.a0[0][0].a0 = 2;
19868 a1.a0[0][1].a0 = -3;
19869 a1.a0[1][0].a0 = 4;
19870 a1.a0[1][1].a0 = -5;
19871 a2 = 6;
19872
19873 std::cout
19874 << "Calling TestAsyncPassUint8Struct4BytesInlineArrayMultiDimensionalIn("
19875 << "(" << static_cast<int>(a0) << ", ([[("
19876 << static_cast<int>(a1.a0[0][0].a0) << "), ("
19877 << static_cast<int>(a1.a0[0][1].a0) << ")], [("
19878 << static_cast<int>(a1.a0[1][0].a0) << "), ("
19879 << static_cast<int>(a1.a0[1][1].a0) << ")]]), " << static_cast<int>(a2)
19880 << ")" << ")\n";
19881
19882 f(a0, a1, a2);
19883}
19884
19885// Used for testing structs and unions by value.
19886// Small struct with mis-aligned member.
19888 // NOLINTNEXTLINE(whitespace/parens)
19889 void (*f)(Struct3BytesPackedInt a0,
19899 Struct3BytesPackedInt a0 = {};
19900 Struct3BytesPackedInt a1 = {};
19901 Struct3BytesPackedInt a2 = {};
19902 Struct3BytesPackedInt a3 = {};
19903 Struct3BytesPackedInt a4 = {};
19904 Struct3BytesPackedInt a5 = {};
19905 Struct3BytesPackedInt a6 = {};
19906 Struct3BytesPackedInt a7 = {};
19907 Struct3BytesPackedInt a8 = {};
19908 Struct3BytesPackedInt a9 = {};
19909
19910 a0.a0 = -1;
19911 a0.a1 = 2;
19912 a1.a0 = -3;
19913 a1.a1 = 4;
19914 a2.a0 = -5;
19915 a2.a1 = 6;
19916 a3.a0 = -7;
19917 a3.a1 = 8;
19918 a4.a0 = -9;
19919 a4.a1 = 10;
19920 a5.a0 = -11;
19921 a5.a1 = 12;
19922 a6.a0 = -13;
19923 a6.a1 = 14;
19924 a7.a0 = -15;
19925 a7.a1 = 16;
19926 a8.a0 = -17;
19927 a8.a1 = 18;
19928 a9.a0 = -19;
19929 a9.a1 = 20;
19930
19931 std::cout << "Calling TestAsyncPassStruct3BytesPackedIntx10(" << "(("
19932 << static_cast<int>(a0.a0) << ", " << a0.a1 << "), ("
19933 << static_cast<int>(a1.a0) << ", " << a1.a1 << "), ("
19934 << static_cast<int>(a2.a0) << ", " << a2.a1 << "), ("
19935 << static_cast<int>(a3.a0) << ", " << a3.a1 << "), ("
19936 << static_cast<int>(a4.a0) << ", " << a4.a1 << "), ("
19937 << static_cast<int>(a5.a0) << ", " << a5.a1 << "), ("
19938 << static_cast<int>(a6.a0) << ", " << a6.a1 << "), ("
19939 << static_cast<int>(a7.a0) << ", " << a7.a1 << "), ("
19940 << static_cast<int>(a8.a0) << ", " << a8.a1 << "), ("
19941 << static_cast<int>(a9.a0) << ", " << a9.a1 << "))" << ")\n";
19942
19943 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
19944}
19945
19946// Used for testing structs and unions by value.
19947// Struct with mis-aligned member.
19949 // NOLINTNEXTLINE(whitespace/parens)
19950 void (*f)(Struct8BytesPackedInt a0,
19960 Struct8BytesPackedInt a0 = {};
19961 Struct8BytesPackedInt a1 = {};
19962 Struct8BytesPackedInt a2 = {};
19963 Struct8BytesPackedInt a3 = {};
19964 Struct8BytesPackedInt a4 = {};
19965 Struct8BytesPackedInt a5 = {};
19966 Struct8BytesPackedInt a6 = {};
19967 Struct8BytesPackedInt a7 = {};
19968 Struct8BytesPackedInt a8 = {};
19969 Struct8BytesPackedInt a9 = {};
19970
19971 a0.a0 = 1;
19972 a0.a1 = 2;
19973 a0.a2 = 3;
19974 a0.a3 = 4;
19975 a0.a4 = 5;
19976 a1.a0 = 6;
19977 a1.a1 = 7;
19978 a1.a2 = 8;
19979 a1.a3 = 9;
19980 a1.a4 = 10;
19981 a2.a0 = 11;
19982 a2.a1 = 12;
19983 a2.a2 = 13;
19984 a2.a3 = 14;
19985 a2.a4 = 15;
19986 a3.a0 = 16;
19987 a3.a1 = 17;
19988 a3.a2 = 18;
19989 a3.a3 = 19;
19990 a3.a4 = 20;
19991 a4.a0 = 21;
19992 a4.a1 = 22;
19993 a4.a2 = 23;
19994 a4.a3 = 24;
19995 a4.a4 = 25;
19996 a5.a0 = 26;
19997 a5.a1 = 27;
19998 a5.a2 = 28;
19999 a5.a3 = 29;
20000 a5.a4 = 30;
20001 a6.a0 = 31;
20002 a6.a1 = 32;
20003 a6.a2 = 33;
20004 a6.a3 = 34;
20005 a6.a4 = 35;
20006 a7.a0 = 36;
20007 a7.a1 = 37;
20008 a7.a2 = 38;
20009 a7.a3 = 39;
20010 a7.a4 = 40;
20011 a8.a0 = 41;
20012 a8.a1 = 42;
20013 a8.a2 = 43;
20014 a8.a3 = 44;
20015 a8.a4 = 45;
20016 a9.a0 = 46;
20017 a9.a1 = 47;
20018 a9.a2 = 48;
20019 a9.a3 = 49;
20020 a9.a4 = 50;
20021
20022 std::cout << "Calling TestAsyncPassStruct8BytesPackedIntx10(" << "(("
20023 << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
20024 << static_cast<int>(a0.a2) << ", " << static_cast<int>(a0.a3)
20025 << ", " << static_cast<int>(a0.a4) << "), ("
20026 << static_cast<int>(a1.a0) << ", " << a1.a1 << ", "
20027 << static_cast<int>(a1.a2) << ", " << static_cast<int>(a1.a3)
20028 << ", " << static_cast<int>(a1.a4) << "), ("
20029 << static_cast<int>(a2.a0) << ", " << a2.a1 << ", "
20030 << static_cast<int>(a2.a2) << ", " << static_cast<int>(a2.a3)
20031 << ", " << static_cast<int>(a2.a4) << "), ("
20032 << static_cast<int>(a3.a0) << ", " << a3.a1 << ", "
20033 << static_cast<int>(a3.a2) << ", " << static_cast<int>(a3.a3)
20034 << ", " << static_cast<int>(a3.a4) << "), ("
20035 << static_cast<int>(a4.a0) << ", " << a4.a1 << ", "
20036 << static_cast<int>(a4.a2) << ", " << static_cast<int>(a4.a3)
20037 << ", " << static_cast<int>(a4.a4) << "), ("
20038 << static_cast<int>(a5.a0) << ", " << a5.a1 << ", "
20039 << static_cast<int>(a5.a2) << ", " << static_cast<int>(a5.a3)
20040 << ", " << static_cast<int>(a5.a4) << "), ("
20041 << static_cast<int>(a6.a0) << ", " << a6.a1 << ", "
20042 << static_cast<int>(a6.a2) << ", " << static_cast<int>(a6.a3)
20043 << ", " << static_cast<int>(a6.a4) << "), ("
20044 << static_cast<int>(a7.a0) << ", " << a7.a1 << ", "
20045 << static_cast<int>(a7.a2) << ", " << static_cast<int>(a7.a3)
20046 << ", " << static_cast<int>(a7.a4) << "), ("
20047 << static_cast<int>(a8.a0) << ", " << a8.a1 << ", "
20048 << static_cast<int>(a8.a2) << ", " << static_cast<int>(a8.a3)
20049 << ", " << static_cast<int>(a8.a4) << "), ("
20050 << static_cast<int>(a9.a0) << ", " << a9.a1 << ", "
20051 << static_cast<int>(a9.a2) << ", " << static_cast<int>(a9.a3)
20052 << ", " << static_cast<int>(a9.a4) << "))" << ")\n";
20053
20054 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
20055}
20056
20057// Used for testing structs and unions by value.
20058// Struct with mis-aligned member.
20059// Tests backfilling of CPU and FPU registers.
20061 // NOLINTNEXTLINE(whitespace/parens)
20062 void (*f)(Struct9BytesPackedMixed a0,
20072 double a10,
20073 int32_t a11,
20074 int32_t a12)) {
20085 double a10;
20086 int32_t a11;
20087 int32_t a12;
20088
20089 a0.a0 = 1;
20090 a0.a1 = 2.0;
20091 a1.a0 = 3;
20092 a1.a1 = 4.0;
20093 a2.a0 = 5;
20094 a2.a1 = 6.0;
20095 a3.a0 = 7;
20096 a3.a1 = 8.0;
20097 a4.a0 = 9;
20098 a4.a1 = 10.0;
20099 a5.a0 = 11;
20100 a5.a1 = 12.0;
20101 a6.a0 = 13;
20102 a6.a1 = 14.0;
20103 a7.a0 = 15;
20104 a7.a1 = 16.0;
20105 a8.a0 = 17;
20106 a8.a1 = 18.0;
20107 a9.a0 = 19;
20108 a9.a1 = 20.0;
20109 a10 = -21.0;
20110 a11 = 22;
20111 a12 = -23;
20112
20113 std::cout << "Calling TestAsyncPassStruct9BytesPackedMixedx10DoubleInt32x2("
20114 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << "), ("
20115 << static_cast<int>(a1.a0) << ", " << a1.a1 << "), ("
20116 << static_cast<int>(a2.a0) << ", " << a2.a1 << "), ("
20117 << static_cast<int>(a3.a0) << ", " << a3.a1 << "), ("
20118 << static_cast<int>(a4.a0) << ", " << a4.a1 << "), ("
20119 << static_cast<int>(a5.a0) << ", " << a5.a1 << "), ("
20120 << static_cast<int>(a6.a0) << ", " << a6.a1 << "), ("
20121 << static_cast<int>(a7.a0) << ", " << a7.a1 << "), ("
20122 << static_cast<int>(a8.a0) << ", " << a8.a1 << "), ("
20123 << static_cast<int>(a9.a0) << ", " << a9.a1 << "), " << a10 << ", "
20124 << a11 << ", " << a12 << ")" << ")\n";
20125
20126 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
20127}
20128
20129// Used for testing structs and unions by value.
20130// This packed struct happens to have only aligned members.
20132 // NOLINTNEXTLINE(whitespace/parens)
20133 void (*f)(Struct5BytesPackedMixed a0)) {
20135
20136 a0.a0 = -1.0;
20137 a0.a1 = 2;
20138
20139 std::cout << "Calling TestAsyncPassStruct5BytesPackedMixed(" << "((" << a0.a0
20140 << ", " << static_cast<int>(a0.a1) << "))" << ")\n";
20141
20142 f(a0);
20143}
20144
20145// Used for testing structs and unions by value.
20146// Check alignment of packed struct in non-packed struct.
20148 // NOLINTNEXTLINE(whitespace/parens)
20151
20152 a0.a0 = 1;
20153 a0.a1.a0 = 2.0;
20154 a0.a1.a1 = 3;
20155
20156 std::cout
20157 << "Calling TestAsyncPassStructNestedAlignmentStruct5BytesPackedMixed("
20158 << "((" << static_cast<int>(a0.a0) << ", (" << a0.a1.a0 << ", "
20159 << static_cast<int>(a0.a1.a1) << ")))" << ")\n";
20160
20161 f(a0);
20162}
20163
20164// Used for testing structs and unions by value.
20165// Check alignment of packed struct array in non-packed struct.
20167 // NOLINTNEXTLINE(whitespace/parens)
20168 void (*f)(Struct6BytesInlineArrayInt a0)) {
20170
20171 a0.a0[0].a0 = -1;
20172 a0.a0[0].a1 = 2;
20173 a0.a0[1].a0 = -3;
20174 a0.a0[1].a1 = 4;
20175
20176 std::cout << "Calling TestAsyncPassStruct6BytesInlineArrayInt(" << "(([("
20177 << static_cast<int>(a0.a0[0].a0) << ", " << a0.a0[0].a1 << "), ("
20178 << static_cast<int>(a0.a0[1].a0) << ", " << a0.a0[1].a1 << ")]))"
20179 << ")\n";
20180
20181 f(a0);
20182}
20183
20184// Used for testing structs and unions by value.
20185// Check alignment of packed struct array in non-packed struct.
20187 // NOLINTNEXTLINE(whitespace/parens)
20188 void (*f)(Struct15BytesInlineArrayMixed a0)) {
20190
20191 a0.a0[0].a0 = -1.0;
20192 a0.a0[0].a1 = 2;
20193 a0.a0[1].a0 = -3.0;
20194 a0.a0[1].a1 = 4;
20195 a0.a0[2].a0 = -5.0;
20196 a0.a0[2].a1 = 6;
20197
20198 std::cout << "Calling TestAsyncPassStruct15BytesInlineArrayMixed(" << "(([("
20199 << a0.a0[0].a0 << ", " << static_cast<int>(a0.a0[0].a1) << "), ("
20200 << a0.a0[1].a0 << ", " << static_cast<int>(a0.a0[1].a1) << "), ("
20201 << a0.a0[2].a0 << ", " << static_cast<int>(a0.a0[2].a1) << ")]))"
20202 << ")\n";
20203
20204 f(a0);
20205}
20206
20207// Used for testing structs and unions by value.
20208// Check placement of mixed integer/float union.
20210 // NOLINTNEXTLINE(whitespace/parens)
20211 void (*f)(Union4BytesMixed a0,
20220 Union4BytesMixed a9)) {
20221 Union4BytesMixed a0 = {};
20222 Union4BytesMixed a1 = {};
20223 Union4BytesMixed a2 = {};
20224 Union4BytesMixed a3 = {};
20225 Union4BytesMixed a4 = {};
20226 Union4BytesMixed a5 = {};
20227 Union4BytesMixed a6 = {};
20228 Union4BytesMixed a7 = {};
20229 Union4BytesMixed a8 = {};
20230 Union4BytesMixed a9 = {};
20231
20232 a0.a0 = 1;
20233 a1.a0 = 2;
20234 a2.a0 = 3;
20235 a3.a0 = 4;
20236 a4.a0 = 5;
20237 a5.a0 = 6;
20238 a6.a0 = 7;
20239 a7.a0 = 8;
20240 a8.a0 = 9;
20241 a9.a0 = 10;
20242
20243 std::cout << "Calling TestAsyncPassUnion4BytesMixedx10(" << "((" << a0.a0
20244 << "), (" << a1.a0 << "), (" << a2.a0 << "), (" << a3.a0 << "), ("
20245 << a4.a0 << "), (" << a5.a0 << "), (" << a6.a0 << "), (" << a7.a0
20246 << "), (" << a8.a0 << "), (" << a9.a0 << "))" << ")\n";
20247
20248 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
20249}
20250
20251// Used for testing structs and unions by value.
20252// Check placement of mixed floats union.
20254 // NOLINTNEXTLINE(whitespace/parens)
20255 void (*f)(Union8BytesNestedFloat a0,
20265 Union8BytesNestedFloat a0 = {};
20266 Union8BytesNestedFloat a1 = {};
20267 Union8BytesNestedFloat a2 = {};
20268 Union8BytesNestedFloat a3 = {};
20269 Union8BytesNestedFloat a4 = {};
20270 Union8BytesNestedFloat a5 = {};
20271 Union8BytesNestedFloat a6 = {};
20272 Union8BytesNestedFloat a7 = {};
20273 Union8BytesNestedFloat a8 = {};
20274 Union8BytesNestedFloat a9 = {};
20275
20276 a0.a0 = -1.0;
20277 a1.a0 = 2.0;
20278 a2.a0 = -3.0;
20279 a3.a0 = 4.0;
20280 a4.a0 = -5.0;
20281 a5.a0 = 6.0;
20282 a6.a0 = -7.0;
20283 a7.a0 = 8.0;
20284 a8.a0 = -9.0;
20285 a9.a0 = 10.0;
20286
20287 std::cout << "Calling TestAsyncPassUnion8BytesNestedFloatx10(" << "(("
20288 << a0.a0 << "), (" << a1.a0 << "), (" << a2.a0 << "), (" << a3.a0
20289 << "), (" << a4.a0 << "), (" << a5.a0 << "), (" << a6.a0 << "), ("
20290 << a7.a0 << "), (" << a8.a0 << "), (" << a9.a0 << "))" << ")\n";
20291
20292 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
20293}
20294
20295// Used for testing structs and unions by value.
20296// Mixed-size union argument.
20298 // NOLINTNEXTLINE(whitespace/parens)
20299 void (*f)(Union9BytesNestedInt a0,
20309 Union9BytesNestedInt a0 = {};
20310 Union9BytesNestedInt a1 = {};
20311 Union9BytesNestedInt a2 = {};
20312 Union9BytesNestedInt a3 = {};
20313 Union9BytesNestedInt a4 = {};
20314 Union9BytesNestedInt a5 = {};
20315 Union9BytesNestedInt a6 = {};
20316 Union9BytesNestedInt a7 = {};
20317 Union9BytesNestedInt a8 = {};
20318 Union9BytesNestedInt a9 = {};
20319
20320 a0.a0.a0 = -1;
20321 a0.a0.a1 = 2;
20322 a0.a0.a2 = -3;
20323 a1.a0.a0 = 4;
20324 a1.a0.a1 = -5;
20325 a1.a0.a2 = 6;
20326 a2.a0.a0 = -7;
20327 a2.a0.a1 = 8;
20328 a2.a0.a2 = -9;
20329 a3.a0.a0 = 10;
20330 a3.a0.a1 = -11;
20331 a3.a0.a2 = 12;
20332 a4.a0.a0 = -13;
20333 a4.a0.a1 = 14;
20334 a4.a0.a2 = -15;
20335 a5.a0.a0 = 16;
20336 a5.a0.a1 = -17;
20337 a5.a0.a2 = 18;
20338 a6.a0.a0 = -19;
20339 a6.a0.a1 = 20;
20340 a6.a0.a2 = -21;
20341 a7.a0.a0 = 22;
20342 a7.a0.a1 = -23;
20343 a7.a0.a2 = 24;
20344 a8.a0.a0 = -25;
20345 a8.a0.a1 = 26;
20346 a8.a0.a2 = -27;
20347 a9.a0.a0 = 28;
20348 a9.a0.a1 = -29;
20349 a9.a0.a2 = 30;
20350
20351 std::cout << "Calling TestAsyncPassUnion9BytesNestedIntx10(" << "((("
20352 << a0.a0.a0 << ", " << a0.a0.a1 << ", " << a0.a0.a2 << ")), (("
20353 << a1.a0.a0 << ", " << a1.a0.a1 << ", " << a1.a0.a2 << ")), (("
20354 << a2.a0.a0 << ", " << a2.a0.a1 << ", " << a2.a0.a2 << ")), (("
20355 << a3.a0.a0 << ", " << a3.a0.a1 << ", " << a3.a0.a2 << ")), (("
20356 << a4.a0.a0 << ", " << a4.a0.a1 << ", " << a4.a0.a2 << ")), (("
20357 << a5.a0.a0 << ", " << a5.a0.a1 << ", " << a5.a0.a2 << ")), (("
20358 << a6.a0.a0 << ", " << a6.a0.a1 << ", " << a6.a0.a2 << ")), (("
20359 << a7.a0.a0 << ", " << a7.a0.a1 << ", " << a7.a0.a2 << ")), (("
20360 << a8.a0.a0 << ", " << a8.a0.a1 << ", " << a8.a0.a2 << ")), (("
20361 << a9.a0.a0 << ", " << a9.a0.a1 << ", " << a9.a0.a2 << ")))"
20362 << ")\n";
20363
20364 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
20365}
20366
20367// Used for testing structs and unions by value.
20368// Union with homogenous floats.
20370 // NOLINTNEXTLINE(whitespace/parens)
20391
20392 a0.a0[0] = -1.0;
20393 a0.a0[1] = 2.0;
20394 a0.a0[2] = -3.0;
20395 a0.a0[3] = 4.0;
20396 a1.a0[0] = -5.0;
20397 a1.a0[1] = 6.0;
20398 a1.a0[2] = -7.0;
20399 a1.a0[3] = 8.0;
20400 a2.a0[0] = -9.0;
20401 a2.a0[1] = 10.0;
20402 a2.a0[2] = -11.0;
20403 a2.a0[3] = 12.0;
20404 a3.a0[0] = -13.0;
20405 a3.a0[1] = 14.0;
20406 a3.a0[2] = -15.0;
20407 a3.a0[3] = 16.0;
20408 a4.a0[0] = -17.0;
20409 a4.a0[1] = 18.0;
20410 a4.a0[2] = -19.0;
20411 a4.a0[3] = 20.0;
20412 a5.a0[0] = -21.0;
20413 a5.a0[1] = 22.0;
20414 a5.a0[2] = -23.0;
20415 a5.a0[3] = 24.0;
20416 a6.a0[0] = -25.0;
20417 a6.a0[1] = 26.0;
20418 a6.a0[2] = -27.0;
20419 a6.a0[3] = 28.0;
20420 a7.a0[0] = -29.0;
20421 a7.a0[1] = 30.0;
20422 a7.a0[2] = -31.0;
20423 a7.a0[3] = 32.0;
20424 a8.a0[0] = -33.0;
20425 a8.a0[1] = 34.0;
20426 a8.a0[2] = -35.0;
20427 a8.a0[3] = 36.0;
20428 a9.a0[0] = -37.0;
20429 a9.a0[1] = 38.0;
20430 a9.a0[2] = -39.0;
20431 a9.a0[3] = 40.0;
20432
20433 std::cout << "Calling TestAsyncPassUnion16BytesNestedInlineArrayFloatx10("
20434 << "(([" << a0.a0[0] << ", " << a0.a0[1] << ", " << a0.a0[2] << ", "
20435 << a0.a0[3] << "]), ([" << a1.a0[0] << ", " << a1.a0[1] << ", "
20436 << a1.a0[2] << ", " << a1.a0[3] << "]), ([" << a2.a0[0] << ", "
20437 << a2.a0[1] << ", " << a2.a0[2] << ", " << a2.a0[3] << "]), (["
20438 << a3.a0[0] << ", " << a3.a0[1] << ", " << a3.a0[2] << ", "
20439 << a3.a0[3] << "]), ([" << a4.a0[0] << ", " << a4.a0[1] << ", "
20440 << a4.a0[2] << ", " << a4.a0[3] << "]), ([" << a5.a0[0] << ", "
20441 << a5.a0[1] << ", " << a5.a0[2] << ", " << a5.a0[3] << "]), (["
20442 << a6.a0[0] << ", " << a6.a0[1] << ", " << a6.a0[2] << ", "
20443 << a6.a0[3] << "]), ([" << a7.a0[0] << ", " << a7.a0[1] << ", "
20444 << a7.a0[2] << ", " << a7.a0[3] << "]), ([" << a8.a0[0] << ", "
20445 << a8.a0[1] << ", " << a8.a0[2] << ", " << a8.a0[3] << "]), (["
20446 << a9.a0[0] << ", " << a9.a0[1] << ", " << a9.a0[2] << ", "
20447 << a9.a0[3] << "]))" << ")\n";
20448
20449 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
20450}
20451
20452// Used for testing structs and unions by value.
20453// Union with homogenous floats.
20455 // NOLINTNEXTLINE(whitespace/parens)
20456 void (*f)(Union16BytesNestedFloat a0,
20476
20477 a0.a0.a0 = -1.0;
20478 a0.a0.a1 = 2.0;
20479 a1.a0.a0 = -3.0;
20480 a1.a0.a1 = 4.0;
20481 a2.a0.a0 = -5.0;
20482 a2.a0.a1 = 6.0;
20483 a3.a0.a0 = -7.0;
20484 a3.a0.a1 = 8.0;
20485 a4.a0.a0 = -9.0;
20486 a4.a0.a1 = 10.0;
20487 a5.a0.a0 = -11.0;
20488 a5.a0.a1 = 12.0;
20489 a6.a0.a0 = -13.0;
20490 a6.a0.a1 = 14.0;
20491 a7.a0.a0 = -15.0;
20492 a7.a0.a1 = 16.0;
20493 a8.a0.a0 = -17.0;
20494 a8.a0.a1 = 18.0;
20495 a9.a0.a0 = -19.0;
20496 a9.a0.a1 = 20.0;
20497
20498 std::cout << "Calling TestAsyncPassUnion16BytesNestedFloatx10(" << "((("
20499 << a0.a0.a0 << ", " << a0.a0.a1 << ")), ((" << a1.a0.a0 << ", "
20500 << a1.a0.a1 << ")), ((" << a2.a0.a0 << ", " << a2.a0.a1 << ")), (("
20501 << a3.a0.a0 << ", " << a3.a0.a1 << ")), ((" << a4.a0.a0 << ", "
20502 << a4.a0.a1 << ")), ((" << a5.a0.a0 << ", " << a5.a0.a1 << ")), (("
20503 << a6.a0.a0 << ", " << a6.a0.a1 << ")), ((" << a7.a0.a0 << ", "
20504 << a7.a0.a1 << ")), ((" << a8.a0.a0 << ", " << a8.a0.a1 << ")), (("
20505 << a9.a0.a0 << ", " << a9.a0.a1 << ")))" << ")\n";
20506
20507 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
20508}
20509
20510// Used for testing structs and unions by value.
20511// Passing bools and a struct with bools.
20512// Exhausts the registers to test bools and the bool struct alignment on the
20513// stack.
20515 // NOLINTNEXTLINE(whitespace/parens)
20516 void (*f)(uint8_t a0,
20517 bool a1,
20518 bool a2,
20519 bool a3,
20520 bool a4,
20521 bool a5,
20522 bool a6,
20523 bool a7,
20524 bool a8,
20525 bool a9,
20527 bool a11)) {
20528 uint8_t a0;
20529 bool a1;
20530 bool a2;
20531 bool a3;
20532 bool a4;
20533 bool a5;
20534 bool a6;
20535 bool a7;
20536 bool a8;
20537 bool a9;
20539 bool a11;
20540
20541 a0 = 1;
20542 a1 = false;
20543 a2 = true;
20544 a3 = false;
20545 a4 = true;
20546 a5 = false;
20547 a6 = true;
20548 a7 = false;
20549 a8 = true;
20550 a9 = false;
20551 a10.a0 = true;
20552 a10.a1 = false;
20553 a10.a2 = true;
20554 a10.a3 = false;
20555 a10.a4 = true;
20556 a10.a5 = false;
20557 a10.a6 = true;
20558 a10.a7 = false;
20559 a10.a8 = true;
20560 a10.a9 = false;
20561 a11 = true;
20562
20563 std::cout
20564 << "Calling TestAsyncPassUint8Boolx9Struct10BytesHomogeneousBoolBool("
20565 << "(" << static_cast<int>(a0) << ", " << a1 << ", " << a2 << ", " << a3
20566 << ", " << a4 << ", " << a5 << ", " << a6 << ", " << a7 << ", " << a8
20567 << ", " << a9 << ", (" << a10.a0 << ", " << a10.a1 << ", " << a10.a2
20568 << ", " << a10.a3 << ", " << a10.a4 << ", " << a10.a5 << ", " << a10.a6
20569 << ", " << a10.a7 << ", " << a10.a8 << ", " << a10.a9 << "), " << a11
20570 << ")" << ")\n";
20571
20572 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
20573}
20574
20575// Used for testing structs and unions by value.
20576// Passing bools and a struct with bools.
20577// Exhausts the registers to test bools and the bool struct alignment on the
20578// stack.
20580 // NOLINTNEXTLINE(whitespace/parens)
20581 void (*f)(uint8_t a0,
20582 bool a1,
20583 bool a2,
20584 bool a3,
20585 bool a4,
20586 bool a5,
20587 bool a6,
20588 bool a7,
20589 bool a8,
20590 bool a9,
20592 bool a11)) {
20593 uint8_t a0;
20594 bool a1;
20595 bool a2;
20596 bool a3;
20597 bool a4;
20598 bool a5;
20599 bool a6;
20600 bool a7;
20601 bool a8;
20602 bool a9;
20604 bool a11;
20605
20606 a0 = 1;
20607 a1 = false;
20608 a2 = true;
20609 a3 = false;
20610 a4 = true;
20611 a5 = false;
20612 a6 = true;
20613 a7 = false;
20614 a8 = true;
20615 a9 = false;
20616 a10.a0[0] = true;
20617 a10.a0[1] = false;
20618 a10.a0[2] = true;
20619 a10.a0[3] = false;
20620 a10.a0[4] = true;
20621 a10.a0[5] = false;
20622 a10.a0[6] = true;
20623 a10.a0[7] = false;
20624 a10.a0[8] = true;
20625 a10.a0[9] = false;
20626 a11 = true;
20627
20628 std::cout
20629 << "Calling TestAsyncPassUint8Boolx9Struct10BytesInlineArrayBoolBool("
20630 << "(" << static_cast<int>(a0) << ", " << a1 << ", " << a2 << ", " << a3
20631 << ", " << a4 << ", " << a5 << ", " << a6 << ", " << a7 << ", " << a8
20632 << ", " << a9 << ", ([" << a10.a0[0] << ", " << a10.a0[1] << ", "
20633 << a10.a0[2] << ", " << a10.a0[3] << ", " << a10.a0[4] << ", "
20634 << a10.a0[5] << ", " << a10.a0[6] << ", " << a10.a0[7] << ", "
20635 << a10.a0[8] << ", " << a10.a0[9] << "]), " << a11 << ")" << ")\n";
20636
20637 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
20638}
20639
20640// Used for testing structs and unions by value.
20641// Returning a bool.
20643 // NOLINTNEXTLINE(whitespace/parens)
20644 void (*f)(uint8_t a0, Struct1ByteBool a1)) {
20645 uint8_t a0;
20646 Struct1ByteBool a1 = {};
20647
20648 a0 = 1;
20649 a1.a0 = false;
20650
20651 std::cout << "Calling TestAsyncPassUint8Struct1ByteBool(" << "("
20652 << static_cast<int>(a0) << ", (" << a1.a0 << "))" << ")\n";
20653
20654 f(a0, a1);
20655}
20656
20657// Used for testing structs and unions by value.
20658// Returning a wchar.
20660 // NOLINTNEXTLINE(whitespace/parens)
20661 void (*f)(wchar_t a0,
20663 uintptr_t a2,
20664 uintptr_t a3,
20665 /* NOLINT(runtime/int) */ long a4,
20666 /* NOLINT(runtime/int) */ unsigned long a5)) {
20667 wchar_t a0;
20668 StructInlineArrayInt a1 = {};
20669 uintptr_t a2;
20670 uintptr_t a3;
20671 /* NOLINT(runtime/int) */ long a4;
20672 /* NOLINT(runtime/int) */ unsigned long a5;
20673
20674 a0 = 1;
20675 a1.a0[0] = 2;
20676 a1.a0[1] = 3;
20677 a1.a0[2] = 4;
20678 a1.a0[3] = 5;
20679 a1.a0[4] = 6;
20680 a1.a0[5] = 7;
20681 a1.a0[6] = 8;
20682 a1.a0[7] = 9;
20683 a1.a0[8] = 10;
20684 a1.a0[9] = 11;
20685 a2 = 12;
20686 a3 = 13;
20687 a4 = 14;
20688 a5 = 15;
20689
20690 std::cout
20691 << "Calling TestAsyncPassWCharStructInlineArrayIntUintPtrx2LongUnsigned("
20692 << "(" << a0 << ", ([" << a1.a0[0] << ", " << a1.a0[1] << ", " << a1.a0[2]
20693 << ", " << a1.a0[3] << ", " << a1.a0[4] << ", " << a1.a0[5] << ", "
20694 << a1.a0[6] << ", " << a1.a0[7] << ", " << a1.a0[8] << ", " << a1.a0[9]
20695 << "]), " << a2 << ", " << a3 << ", " << a4 << ", " << a5 << ")" << ")\n";
20696
20697 f(a0, a1, a2, a3, a4, a5);
20698}
20699
20700// Used for testing structs and unions by value.
20701// Struct stradles last argument register
20703 // NOLINTNEXTLINE(whitespace/parens)
20704 void (*f)(int64_t a0,
20705 int64_t a1,
20706 int64_t a2,
20707 int64_t a3,
20708 int64_t a4,
20709 int64_t a5,
20710 int64_t a6,
20712 int64_t a0;
20713 int64_t a1;
20714 int64_t a2;
20715 int64_t a3;
20716 int64_t a4;
20717 int64_t a5;
20718 int64_t a6;
20720
20721 a0 = -1;
20722 a1 = 2;
20723 a2 = -3;
20724 a3 = 4;
20725 a4 = -5;
20726 a5 = 6;
20727 a6 = -7;
20728 a7.a0 = 8;
20729 a7.a1 = -9;
20730 a7.a2 = 10;
20731
20732 std::cout << "Calling TestAsyncPassInt64x7Struct12BytesHomogeneousInt32("
20733 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
20734 << ", " << a5 << ", " << a6 << ", (" << a7.a0 << ", " << a7.a1
20735 << ", " << a7.a2 << "))" << ")\n";
20736
20737 f(a0, a1, a2, a3, a4, a5, a6, a7);
20738}
20739
20740// Used for testing structs and unions by value.
20741// Smallest struct with data.
20743 // NOLINTNEXTLINE(whitespace/parens)
20744 void (*f)(int8_t a0)) {
20745 int8_t a0;
20746
20747 a0 = -1;
20748
20749 std::cout << "Calling TestAsyncReturnStruct1ByteInt(" << "("
20750 << static_cast<int>(a0) << ")" << ")\n";
20751
20752 f(a0);
20753}
20754
20755// Used for testing structs and unions by value.
20756// Smaller than word size return value on all architectures.
20758 // NOLINTNEXTLINE(whitespace/parens)
20759 void (*f)(uint8_t a0, uint8_t a1, uint8_t a2)) {
20760 uint8_t a0;
20761 uint8_t a1;
20762 uint8_t a2;
20763
20764 a0 = 1;
20765 a1 = 2;
20766 a2 = 3;
20767
20768 std::cout << "Calling TestAsyncReturnStruct3BytesHomogeneousUint8(" << "("
20769 << static_cast<int>(a0) << ", " << static_cast<int>(a1) << ", "
20770 << static_cast<int>(a2) << ")" << ")\n";
20771
20772 f(a0, a1, a2);
20773}
20774
20775// Used for testing structs and unions by value.
20776// Smaller than word size return value on all architectures.
20777// With alignment rules taken into account size is 4 bytes.
20779 // NOLINTNEXTLINE(whitespace/parens)
20780 void (*f)(int16_t a0, int8_t a1)) {
20781 int16_t a0;
20782 int8_t a1;
20783
20784 a0 = -1;
20785 a1 = 2;
20786
20787 std::cout << "Calling TestAsyncReturnStruct3BytesInt2ByteAligned(" << "("
20788 << a0 << ", " << static_cast<int>(a1) << ")" << ")\n";
20789
20790 f(a0, a1);
20791}
20792
20793// Used for testing structs and unions by value.
20794// Word size return value on 32 bit architectures..
20796 // NOLINTNEXTLINE(whitespace/parens)
20797 void (*f)(int16_t a0, int16_t a1)) {
20798 int16_t a0;
20799 int16_t a1;
20800
20801 a0 = -1;
20802 a1 = 2;
20803
20804 std::cout << "Calling TestAsyncReturnStruct4BytesHomogeneousInt16(" << "("
20805 << a0 << ", " << a1 << ")" << ")\n";
20806
20807 f(a0, a1);
20808}
20809
20810// Used for testing structs and unions by value.
20811// Non-wordsize return value.
20813 // NOLINTNEXTLINE(whitespace/parens)
20814 void (*f)(uint8_t a0,
20815 uint8_t a1,
20816 uint8_t a2,
20817 uint8_t a3,
20818 uint8_t a4,
20819 uint8_t a5,
20820 uint8_t a6)) {
20821 uint8_t a0;
20822 uint8_t a1;
20823 uint8_t a2;
20824 uint8_t a3;
20825 uint8_t a4;
20826 uint8_t a5;
20827 uint8_t a6;
20828
20829 a0 = 1;
20830 a1 = 2;
20831 a2 = 3;
20832 a3 = 4;
20833 a4 = 5;
20834 a5 = 6;
20835 a6 = 7;
20836
20837 std::cout << "Calling TestAsyncReturnStruct7BytesHomogeneousUint8(" << "("
20838 << static_cast<int>(a0) << ", " << static_cast<int>(a1) << ", "
20839 << static_cast<int>(a2) << ", " << static_cast<int>(a3) << ", "
20840 << static_cast<int>(a4) << ", " << static_cast<int>(a5) << ", "
20841 << static_cast<int>(a6) << ")" << ")\n";
20842
20843 f(a0, a1, a2, a3, a4, a5, a6);
20844}
20845
20846// Used for testing structs and unions by value.
20847// Non-wordsize return value.
20848// With alignment rules taken into account size is 8 bytes.
20850 // NOLINTNEXTLINE(whitespace/parens)
20851 void (*f)(int32_t a0, int16_t a1, int8_t a2)) {
20852 int32_t a0;
20853 int16_t a1;
20854 int8_t a2;
20855
20856 a0 = -1;
20857 a1 = 2;
20858 a2 = -3;
20859
20860 std::cout << "Calling TestAsyncReturnStruct7BytesInt4ByteAligned(" << "("
20861 << a0 << ", " << a1 << ", " << static_cast<int>(a2) << ")" << ")\n";
20862
20863 f(a0, a1, a2);
20864}
20865
20866// Used for testing structs and unions by value.
20867// Return value in integer registers on many architectures.
20869 // NOLINTNEXTLINE(whitespace/parens)
20870 void (*f)(int16_t a0, int16_t a1, int32_t a2)) {
20871 int16_t a0;
20872 int16_t a1;
20873 int32_t a2;
20874
20875 a0 = -1;
20876 a1 = 2;
20877 a2 = -3;
20878
20879 std::cout << "Calling TestAsyncReturnStruct8BytesInt(" << "(" << a0 << ", "
20880 << a1 << ", " << a2 << ")" << ")\n";
20881
20882 f(a0, a1, a2);
20883}
20884
20885// Used for testing structs and unions by value.
20886// Return value in FP registers on many architectures.
20888 // NOLINTNEXTLINE(whitespace/parens)
20889 void (*f)(float a0, float a1)) {
20890 float a0;
20891 float a1;
20892
20893 a0 = -1.0;
20894 a1 = 2.0;
20895
20896 std::cout << "Calling TestAsyncReturnStruct8BytesHomogeneousFloat(" << "("
20897 << a0 << ", " << a1 << ")" << ")\n";
20898
20899 f(a0, a1);
20900}
20901
20902// Used for testing structs and unions by value.
20903// Return value split over FP and integer register in x64.
20905 // NOLINTNEXTLINE(whitespace/parens)
20906 void (*f)(float a0, int16_t a1, int16_t a2)) {
20907 float a0;
20908 int16_t a1;
20909 int16_t a2;
20910
20911 a0 = -1.0;
20912 a1 = 2;
20913 a2 = -3;
20914
20915 std::cout << "Calling TestAsyncReturnStruct8BytesMixed(" << "(" << a0 << ", "
20916 << a1 << ", " << a2 << ")" << ")\n";
20917
20918 f(a0, a1, a2);
20919}
20920
20921// Used for testing structs and unions by value.
20922// The minimum alignment of this struct is only 1 byte based on its fields.
20923// Test that the memory backing these structs is the right size and that
20924// dart:ffi trampolines do not write outside this size.
20926 // NOLINTNEXTLINE(whitespace/parens)
20927 void (*f)(uint8_t a0,
20928 uint8_t a1,
20929 uint8_t a2,
20930 uint8_t a3,
20931 uint8_t a4,
20932 uint8_t a5,
20933 uint8_t a6,
20934 uint8_t a7,
20935 uint8_t a8)) {
20936 uint8_t a0;
20937 uint8_t a1;
20938 uint8_t a2;
20939 uint8_t a3;
20940 uint8_t a4;
20941 uint8_t a5;
20942 uint8_t a6;
20943 uint8_t a7;
20944 uint8_t a8;
20945
20946 a0 = 1;
20947 a1 = 2;
20948 a2 = 3;
20949 a3 = 4;
20950 a4 = 5;
20951 a5 = 6;
20952 a6 = 7;
20953 a7 = 8;
20954 a8 = 9;
20955
20956 std::cout << "Calling TestAsyncReturnStruct9BytesHomogeneousUint8(" << "("
20957 << static_cast<int>(a0) << ", " << static_cast<int>(a1) << ", "
20958 << static_cast<int>(a2) << ", " << static_cast<int>(a3) << ", "
20959 << static_cast<int>(a4) << ", " << static_cast<int>(a5) << ", "
20960 << static_cast<int>(a6) << ", " << static_cast<int>(a7) << ", "
20961 << static_cast<int>(a8) << ")" << ")\n";
20962
20963 f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
20964}
20965
20966// Used for testing structs and unions by value.
20967// Return value in two integer registers on x64.
20968// With alignment rules taken into account size is 12 or 16 bytes.
20970 // NOLINTNEXTLINE(whitespace/parens)
20971 void (*f)(int64_t a0, int8_t a1)) {
20972 int64_t a0;
20973 int8_t a1;
20974
20975 a0 = -1;
20976 a1 = 2;
20977
20978 std::cout << "Calling TestAsyncReturnStruct9BytesInt4Or8ByteAligned(" << "("
20979 << a0 << ", " << static_cast<int>(a1) << ")" << ")\n";
20980
20981 f(a0, a1);
20982}
20983
20984// Used for testing structs and unions by value.
20985// Return value in FPU registers, but does not use all registers on arm hardfp
20986// and arm64.
20988 // NOLINTNEXTLINE(whitespace/parens)
20989 void (*f)(float a0, float a1, float a2)) {
20990 float a0;
20991 float a1;
20992 float a2;
20993
20994 a0 = -1.0;
20995 a1 = 2.0;
20996 a2 = -3.0;
20997
20998 std::cout << "Calling TestAsyncReturnStruct12BytesHomogeneousFloat(" << "("
20999 << a0 << ", " << a1 << ", " << a2 << ")" << ")\n";
21000
21001 f(a0, a1, a2);
21002}
21003
21004// Used for testing structs and unions by value.
21005// Return value in FPU registers on arm hardfp and arm64.
21007 // NOLINTNEXTLINE(whitespace/parens)
21008 void (*f)(float a0, float a1, float a2, float a3)) {
21009 float a0;
21010 float a1;
21011 float a2;
21012 float a3;
21013
21014 a0 = -1.0;
21015 a1 = 2.0;
21016 a2 = -3.0;
21017 a3 = 4.0;
21018
21019 std::cout << "Calling TestAsyncReturnStruct16BytesHomogeneousFloat(" << "("
21020 << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ")" << ")\n";
21021
21022 f(a0, a1, a2, a3);
21023}
21024
21025// Used for testing structs and unions by value.
21026// Return value split over FP and integer register in x64.
21028 // NOLINTNEXTLINE(whitespace/parens)
21029 void (*f)(double a0, int64_t a1)) {
21030 double a0;
21031 int64_t a1;
21032
21033 a0 = -1.0;
21034 a1 = 2;
21035
21036 std::cout << "Calling TestAsyncReturnStruct16BytesMixed(" << "(" << a0 << ", "
21037 << a1 << ")" << ")\n";
21038
21039 f(a0, a1);
21040}
21041
21042// Used for testing structs and unions by value.
21043// Return value split over FP and integer register in x64.
21044// The integer register contains half float half int.
21046 // NOLINTNEXTLINE(whitespace/parens)
21047 void (*f)(float a0, float a1, float a2, int32_t a3)) {
21048 float a0;
21049 float a1;
21050 float a2;
21051 int32_t a3;
21052
21053 a0 = -1.0;
21054 a1 = 2.0;
21055 a2 = -3.0;
21056 a3 = 4;
21057
21058 std::cout << "Calling TestAsyncReturnStruct16BytesMixed2(" << "(" << a0
21059 << ", " << a1 << ", " << a2 << ", " << a3 << ")" << ")\n";
21060
21061 f(a0, a1, a2, a3);
21062}
21063
21064// Used for testing structs and unions by value.
21065// Return value returned in preallocated space passed by pointer on most ABIs.
21066// Is non word size on purpose, to test that structs are rounded up to word size
21067// on all ABIs.
21069 // NOLINTNEXTLINE(whitespace/parens)
21070 void (*f)(int64_t a0, int64_t a1, int8_t a2)) {
21071 int64_t a0;
21072 int64_t a1;
21073 int8_t a2;
21074
21075 a0 = -1;
21076 a1 = 2;
21077 a2 = -3;
21078
21079 std::cout << "Calling TestAsyncReturnStruct17BytesInt(" << "(" << a0 << ", "
21080 << a1 << ", " << static_cast<int>(a2) << ")" << ")\n";
21081
21082 f(a0, a1, a2);
21083}
21084
21085// Used for testing structs and unions by value.
21086// The minimum alignment of this struct is only 1 byte based on its fields.
21087// Test that the memory backing these structs is the right size and that
21088// dart:ffi trampolines do not write outside this size.
21090 // NOLINTNEXTLINE(whitespace/parens)
21091 void (*f)(uint8_t a0,
21092 uint8_t a1,
21093 uint8_t a2,
21094 uint8_t a3,
21095 uint8_t a4,
21096 uint8_t a5,
21097 uint8_t a6,
21098 uint8_t a7,
21099 uint8_t a8,
21100 uint8_t a9,
21101 uint8_t a10,
21102 uint8_t a11,
21103 uint8_t a12,
21104 uint8_t a13,
21105 uint8_t a14,
21106 uint8_t a15,
21107 uint8_t a16,
21108 uint8_t a17,
21109 uint8_t a18)) {
21110 uint8_t a0;
21111 uint8_t a1;
21112 uint8_t a2;
21113 uint8_t a3;
21114 uint8_t a4;
21115 uint8_t a5;
21116 uint8_t a6;
21117 uint8_t a7;
21118 uint8_t a8;
21119 uint8_t a9;
21120 uint8_t a10;
21121 uint8_t a11;
21122 uint8_t a12;
21123 uint8_t a13;
21124 uint8_t a14;
21125 uint8_t a15;
21126 uint8_t a16;
21127 uint8_t a17;
21128 uint8_t a18;
21129
21130 a0 = 1;
21131 a1 = 2;
21132 a2 = 3;
21133 a3 = 4;
21134 a4 = 5;
21135 a5 = 6;
21136 a6 = 7;
21137 a7 = 8;
21138 a8 = 9;
21139 a9 = 10;
21140 a10 = 11;
21141 a11 = 12;
21142 a12 = 13;
21143 a13 = 14;
21144 a14 = 15;
21145 a15 = 16;
21146 a16 = 17;
21147 a17 = 18;
21148 a18 = 19;
21149
21150 std::cout << "Calling TestAsyncReturnStruct19BytesHomogeneousUint8(" << "("
21151 << static_cast<int>(a0) << ", " << static_cast<int>(a1) << ", "
21152 << static_cast<int>(a2) << ", " << static_cast<int>(a3) << ", "
21153 << static_cast<int>(a4) << ", " << static_cast<int>(a5) << ", "
21154 << static_cast<int>(a6) << ", " << static_cast<int>(a7) << ", "
21155 << static_cast<int>(a8) << ", " << static_cast<int>(a9) << ", "
21156 << static_cast<int>(a10) << ", " << static_cast<int>(a11) << ", "
21157 << static_cast<int>(a12) << ", " << static_cast<int>(a13) << ", "
21158 << static_cast<int>(a14) << ", " << static_cast<int>(a15) << ", "
21159 << static_cast<int>(a16) << ", " << static_cast<int>(a17) << ", "
21160 << static_cast<int>(a18) << ")" << ")\n";
21161
21162 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16,
21163 a17, a18);
21164}
21165
21166// Used for testing structs and unions by value.
21167// Return value too big to go in cpu registers on arm64.
21169 // NOLINTNEXTLINE(whitespace/parens)
21170 void (*f)(int32_t a0, int32_t a1, int32_t a2, int32_t a3, int32_t a4)) {
21171 int32_t a0;
21172 int32_t a1;
21173 int32_t a2;
21174 int32_t a3;
21175 int32_t a4;
21176
21177 a0 = -1;
21178 a1 = 2;
21179 a2 = -3;
21180 a3 = 4;
21181 a4 = -5;
21182
21183 std::cout << "Calling TestAsyncReturnStruct20BytesHomogeneousInt32(" << "("
21184 << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4 << ")"
21185 << ")\n";
21186
21187 f(a0, a1, a2, a3, a4);
21188}
21189
21190// Used for testing structs and unions by value.
21191// Return value too big to go in FPU registers on x64, arm hardfp and arm64.
21193 // NOLINTNEXTLINE(whitespace/parens)
21194 void (*f)(float a0, float a1, float a2, float a3, float a4)) {
21195 float a0;
21196 float a1;
21197 float a2;
21198 float a3;
21199 float a4;
21200
21201 a0 = -1.0;
21202 a1 = 2.0;
21203 a2 = -3.0;
21204 a3 = 4.0;
21205 a4 = -5.0;
21206
21207 std::cout << "Calling TestAsyncReturnStruct20BytesHomogeneousFloat(" << "("
21208 << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4 << ")"
21209 << ")\n";
21210
21211 f(a0, a1, a2, a3, a4);
21212}
21213
21214// Used for testing structs and unions by value.
21215// Return value in FPU registers on arm64.
21217 // NOLINTNEXTLINE(whitespace/parens)
21218 void (*f)(double a0, double a1, double a2, double a3)) {
21219 double a0;
21220 double a1;
21221 double a2;
21222 double a3;
21223
21224 a0 = -1.0;
21225 a1 = 2.0;
21226 a2 = -3.0;
21227 a3 = 4.0;
21228
21229 std::cout << "Calling TestAsyncReturnStruct32BytesHomogeneousDouble(" << "("
21230 << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ")" << ")\n";
21231
21232 f(a0, a1, a2, a3);
21233}
21234
21235// Used for testing structs and unions by value.
21236// Return value too big to go in FPU registers on arm64.
21238 // NOLINTNEXTLINE(whitespace/parens)
21239 void (*f)(double a0, double a1, double a2, double a3, double a4)) {
21240 double a0;
21241 double a1;
21242 double a2;
21243 double a3;
21244 double a4;
21245
21246 a0 = -1.0;
21247 a1 = 2.0;
21248 a2 = -3.0;
21249 a3 = 4.0;
21250 a4 = -5.0;
21251
21252 std::cout << "Calling TestAsyncReturnStruct40BytesHomogeneousDouble(" << "("
21253 << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4 << ")"
21254 << ")\n";
21255
21256 f(a0, a1, a2, a3, a4);
21257}
21258
21259// Used for testing structs and unions by value.
21260// Test 1kb struct.
21262 // NOLINTNEXTLINE(whitespace/parens)
21263 void (*f)(uint64_t a0,
21264 uint64_t a1,
21265 uint64_t a2,
21266 uint64_t a3,
21267 uint64_t a4,
21268 uint64_t a5,
21269 uint64_t a6,
21270 uint64_t a7,
21271 uint64_t a8,
21272 uint64_t a9,
21273 uint64_t a10,
21274 uint64_t a11,
21275 uint64_t a12,
21276 uint64_t a13,
21277 uint64_t a14,
21278 uint64_t a15,
21279 uint64_t a16,
21280 uint64_t a17,
21281 uint64_t a18,
21282 uint64_t a19,
21283 uint64_t a20,
21284 uint64_t a21,
21285 uint64_t a22,
21286 uint64_t a23,
21287 uint64_t a24,
21288 uint64_t a25,
21289 uint64_t a26,
21290 uint64_t a27,
21291 uint64_t a28,
21292 uint64_t a29,
21293 uint64_t a30,
21294 uint64_t a31,
21295 uint64_t a32,
21296 uint64_t a33,
21297 uint64_t a34,
21298 uint64_t a35,
21299 uint64_t a36,
21300 uint64_t a37,
21301 uint64_t a38,
21302 uint64_t a39,
21303 uint64_t a40,
21304 uint64_t a41,
21305 uint64_t a42,
21306 uint64_t a43,
21307 uint64_t a44,
21308 uint64_t a45,
21309 uint64_t a46,
21310 uint64_t a47,
21311 uint64_t a48,
21312 uint64_t a49,
21313 uint64_t a50,
21314 uint64_t a51,
21315 uint64_t a52,
21316 uint64_t a53,
21317 uint64_t a54,
21318 uint64_t a55,
21319 uint64_t a56,
21320 uint64_t a57,
21321 uint64_t a58,
21322 uint64_t a59,
21323 uint64_t a60,
21324 uint64_t a61,
21325 uint64_t a62,
21326 uint64_t a63,
21327 uint64_t a64,
21328 uint64_t a65,
21329 uint64_t a66,
21330 uint64_t a67,
21331 uint64_t a68,
21332 uint64_t a69,
21333 uint64_t a70,
21334 uint64_t a71,
21335 uint64_t a72,
21336 uint64_t a73,
21337 uint64_t a74,
21338 uint64_t a75,
21339 uint64_t a76,
21340 uint64_t a77,
21341 uint64_t a78,
21342 uint64_t a79,
21343 uint64_t a80,
21344 uint64_t a81,
21345 uint64_t a82,
21346 uint64_t a83,
21347 uint64_t a84,
21348 uint64_t a85,
21349 uint64_t a86,
21350 uint64_t a87,
21351 uint64_t a88,
21352 uint64_t a89,
21353 uint64_t a90,
21354 uint64_t a91,
21355 uint64_t a92,
21356 uint64_t a93,
21357 uint64_t a94,
21358 uint64_t a95,
21359 uint64_t a96,
21360 uint64_t a97,
21361 uint64_t a98,
21362 uint64_t a99,
21363 uint64_t a100,
21364 uint64_t a101,
21365 uint64_t a102,
21366 uint64_t a103,
21367 uint64_t a104,
21368 uint64_t a105,
21369 uint64_t a106,
21370 uint64_t a107,
21371 uint64_t a108,
21372 uint64_t a109,
21373 uint64_t a110,
21374 uint64_t a111,
21375 uint64_t a112,
21376 uint64_t a113,
21377 uint64_t a114,
21378 uint64_t a115,
21379 uint64_t a116,
21380 uint64_t a117,
21381 uint64_t a118,
21382 uint64_t a119,
21383 uint64_t a120,
21384 uint64_t a121,
21385 uint64_t a122,
21386 uint64_t a123,
21387 uint64_t a124,
21388 uint64_t a125,
21389 uint64_t a126,
21390 uint64_t a127)) {
21391 uint64_t a0;
21392 uint64_t a1;
21393 uint64_t a2;
21394 uint64_t a3;
21395 uint64_t a4;
21396 uint64_t a5;
21397 uint64_t a6;
21398 uint64_t a7;
21399 uint64_t a8;
21400 uint64_t a9;
21401 uint64_t a10;
21402 uint64_t a11;
21403 uint64_t a12;
21404 uint64_t a13;
21405 uint64_t a14;
21406 uint64_t a15;
21407 uint64_t a16;
21408 uint64_t a17;
21409 uint64_t a18;
21410 uint64_t a19;
21411 uint64_t a20;
21412 uint64_t a21;
21413 uint64_t a22;
21414 uint64_t a23;
21415 uint64_t a24;
21416 uint64_t a25;
21417 uint64_t a26;
21418 uint64_t a27;
21419 uint64_t a28;
21420 uint64_t a29;
21421 uint64_t a30;
21422 uint64_t a31;
21423 uint64_t a32;
21424 uint64_t a33;
21425 uint64_t a34;
21426 uint64_t a35;
21427 uint64_t a36;
21428 uint64_t a37;
21429 uint64_t a38;
21430 uint64_t a39;
21431 uint64_t a40;
21432 uint64_t a41;
21433 uint64_t a42;
21434 uint64_t a43;
21435 uint64_t a44;
21436 uint64_t a45;
21437 uint64_t a46;
21438 uint64_t a47;
21439 uint64_t a48;
21440 uint64_t a49;
21441 uint64_t a50;
21442 uint64_t a51;
21443 uint64_t a52;
21444 uint64_t a53;
21445 uint64_t a54;
21446 uint64_t a55;
21447 uint64_t a56;
21448 uint64_t a57;
21449 uint64_t a58;
21450 uint64_t a59;
21451 uint64_t a60;
21452 uint64_t a61;
21453 uint64_t a62;
21454 uint64_t a63;
21455 uint64_t a64;
21456 uint64_t a65;
21457 uint64_t a66;
21458 uint64_t a67;
21459 uint64_t a68;
21460 uint64_t a69;
21461 uint64_t a70;
21462 uint64_t a71;
21463 uint64_t a72;
21464 uint64_t a73;
21465 uint64_t a74;
21466 uint64_t a75;
21467 uint64_t a76;
21468 uint64_t a77;
21469 uint64_t a78;
21470 uint64_t a79;
21471 uint64_t a80;
21472 uint64_t a81;
21473 uint64_t a82;
21474 uint64_t a83;
21475 uint64_t a84;
21476 uint64_t a85;
21477 uint64_t a86;
21478 uint64_t a87;
21479 uint64_t a88;
21480 uint64_t a89;
21481 uint64_t a90;
21482 uint64_t a91;
21483 uint64_t a92;
21484 uint64_t a93;
21485 uint64_t a94;
21486 uint64_t a95;
21487 uint64_t a96;
21488 uint64_t a97;
21489 uint64_t a98;
21490 uint64_t a99;
21491 uint64_t a100;
21492 uint64_t a101;
21493 uint64_t a102;
21494 uint64_t a103;
21495 uint64_t a104;
21496 uint64_t a105;
21497 uint64_t a106;
21498 uint64_t a107;
21499 uint64_t a108;
21500 uint64_t a109;
21501 uint64_t a110;
21502 uint64_t a111;
21503 uint64_t a112;
21504 uint64_t a113;
21505 uint64_t a114;
21506 uint64_t a115;
21507 uint64_t a116;
21508 uint64_t a117;
21509 uint64_t a118;
21510 uint64_t a119;
21511 uint64_t a120;
21512 uint64_t a121;
21513 uint64_t a122;
21514 uint64_t a123;
21515 uint64_t a124;
21516 uint64_t a125;
21517 uint64_t a126;
21518 uint64_t a127;
21519
21520 a0 = 1;
21521 a1 = 2;
21522 a2 = 3;
21523 a3 = 4;
21524 a4 = 5;
21525 a5 = 6;
21526 a6 = 7;
21527 a7 = 8;
21528 a8 = 9;
21529 a9 = 10;
21530 a10 = 11;
21531 a11 = 12;
21532 a12 = 13;
21533 a13 = 14;
21534 a14 = 15;
21535 a15 = 16;
21536 a16 = 17;
21537 a17 = 18;
21538 a18 = 19;
21539 a19 = 20;
21540 a20 = 21;
21541 a21 = 22;
21542 a22 = 23;
21543 a23 = 24;
21544 a24 = 25;
21545 a25 = 26;
21546 a26 = 27;
21547 a27 = 28;
21548 a28 = 29;
21549 a29 = 30;
21550 a30 = 31;
21551 a31 = 32;
21552 a32 = 33;
21553 a33 = 34;
21554 a34 = 35;
21555 a35 = 36;
21556 a36 = 37;
21557 a37 = 38;
21558 a38 = 39;
21559 a39 = 40;
21560 a40 = 41;
21561 a41 = 42;
21562 a42 = 43;
21563 a43 = 44;
21564 a44 = 45;
21565 a45 = 46;
21566 a46 = 47;
21567 a47 = 48;
21568 a48 = 49;
21569 a49 = 50;
21570 a50 = 51;
21571 a51 = 52;
21572 a52 = 53;
21573 a53 = 54;
21574 a54 = 55;
21575 a55 = 56;
21576 a56 = 57;
21577 a57 = 58;
21578 a58 = 59;
21579 a59 = 60;
21580 a60 = 61;
21581 a61 = 62;
21582 a62 = 63;
21583 a63 = 64;
21584 a64 = 65;
21585 a65 = 66;
21586 a66 = 67;
21587 a67 = 68;
21588 a68 = 69;
21589 a69 = 70;
21590 a70 = 71;
21591 a71 = 72;
21592 a72 = 73;
21593 a73 = 74;
21594 a74 = 75;
21595 a75 = 76;
21596 a76 = 77;
21597 a77 = 78;
21598 a78 = 79;
21599 a79 = 80;
21600 a80 = 81;
21601 a81 = 82;
21602 a82 = 83;
21603 a83 = 84;
21604 a84 = 85;
21605 a85 = 86;
21606 a86 = 87;
21607 a87 = 88;
21608 a88 = 89;
21609 a89 = 90;
21610 a90 = 91;
21611 a91 = 92;
21612 a92 = 93;
21613 a93 = 94;
21614 a94 = 95;
21615 a95 = 96;
21616 a96 = 97;
21617 a97 = 98;
21618 a98 = 99;
21619 a99 = 100;
21620 a100 = 101;
21621 a101 = 102;
21622 a102 = 103;
21623 a103 = 104;
21624 a104 = 105;
21625 a105 = 106;
21626 a106 = 107;
21627 a107 = 108;
21628 a108 = 109;
21629 a109 = 110;
21630 a110 = 111;
21631 a111 = 112;
21632 a112 = 113;
21633 a113 = 114;
21634 a114 = 115;
21635 a115 = 116;
21636 a116 = 117;
21637 a117 = 118;
21638 a118 = 119;
21639 a119 = 120;
21640 a120 = 121;
21641 a121 = 122;
21642 a122 = 123;
21643 a123 = 124;
21644 a124 = 125;
21645 a125 = 126;
21646 a126 = 127;
21647 a127 = 128;
21648
21649 std::cout << "Calling TestAsyncReturnStruct1024BytesHomogeneousUint64(" << "("
21650 << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
21651 << ", " << a5 << ", " << a6 << ", " << a7 << ", " << a8 << ", "
21652 << a9 << ", " << a10 << ", " << a11 << ", " << a12 << ", " << a13
21653 << ", " << a14 << ", " << a15 << ", " << a16 << ", " << a17 << ", "
21654 << a18 << ", " << a19 << ", " << a20 << ", " << a21 << ", " << a22
21655 << ", " << a23 << ", " << a24 << ", " << a25 << ", " << a26 << ", "
21656 << a27 << ", " << a28 << ", " << a29 << ", " << a30 << ", " << a31
21657 << ", " << a32 << ", " << a33 << ", " << a34 << ", " << a35 << ", "
21658 << a36 << ", " << a37 << ", " << a38 << ", " << a39 << ", " << a40
21659 << ", " << a41 << ", " << a42 << ", " << a43 << ", " << a44 << ", "
21660 << a45 << ", " << a46 << ", " << a47 << ", " << a48 << ", " << a49
21661 << ", " << a50 << ", " << a51 << ", " << a52 << ", " << a53 << ", "
21662 << a54 << ", " << a55 << ", " << a56 << ", " << a57 << ", " << a58
21663 << ", " << a59 << ", " << a60 << ", " << a61 << ", " << a62 << ", "
21664 << a63 << ", " << a64 << ", " << a65 << ", " << a66 << ", " << a67
21665 << ", " << a68 << ", " << a69 << ", " << a70 << ", " << a71 << ", "
21666 << a72 << ", " << a73 << ", " << a74 << ", " << a75 << ", " << a76
21667 << ", " << a77 << ", " << a78 << ", " << a79 << ", " << a80 << ", "
21668 << a81 << ", " << a82 << ", " << a83 << ", " << a84 << ", " << a85
21669 << ", " << a86 << ", " << a87 << ", " << a88 << ", " << a89 << ", "
21670 << a90 << ", " << a91 << ", " << a92 << ", " << a93 << ", " << a94
21671 << ", " << a95 << ", " << a96 << ", " << a97 << ", " << a98 << ", "
21672 << a99 << ", " << a100 << ", " << a101 << ", " << a102 << ", "
21673 << a103 << ", " << a104 << ", " << a105 << ", " << a106 << ", "
21674 << a107 << ", " << a108 << ", " << a109 << ", " << a110 << ", "
21675 << a111 << ", " << a112 << ", " << a113 << ", " << a114 << ", "
21676 << a115 << ", " << a116 << ", " << a117 << ", " << a118 << ", "
21677 << a119 << ", " << a120 << ", " << a121 << ", " << a122 << ", "
21678 << a123 << ", " << a124 << ", " << a125 << ", " << a126 << ", "
21679 << a127 << ")" << ")\n";
21680
21681 f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16,
21682 a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31,
21683 a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, a45, a46,
21684 a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61,
21685 a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, a74, a75, a76,
21686 a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91,
21687 a92, a93, a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105,
21688 a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, a117,
21689 a118, a119, a120, a121, a122, a123, a124, a125, a126, a127);
21690}
21691
21692// Used for testing structs and unions by value.
21693// Small struct with mis-aligned member.
21695 // NOLINTNEXTLINE(whitespace/parens)
21696 void (*f)(int8_t a0, int16_t a1)) {
21697 int8_t a0;
21698 int16_t a1;
21699
21700 a0 = -1;
21701 a1 = 2;
21702
21703 std::cout << "Calling TestAsyncReturnStruct3BytesPackedInt(" << "("
21704 << static_cast<int>(a0) << ", " << a1 << ")" << ")\n";
21705
21706 f(a0, a1);
21707}
21708
21709// Used for testing structs and unions by value.
21710// Struct with mis-aligned member.
21712 // NOLINTNEXTLINE(whitespace/parens)
21713 void (*f)(uint8_t a0, uint32_t a1, uint8_t a2, uint8_t a3, uint8_t a4)) {
21714 uint8_t a0;
21715 uint32_t a1;
21716 uint8_t a2;
21717 uint8_t a3;
21718 uint8_t a4;
21719
21720 a0 = 1;
21721 a1 = 2;
21722 a2 = 3;
21723 a3 = 4;
21724 a4 = 5;
21725
21726 std::cout << "Calling TestAsyncReturnStruct8BytesPackedInt(" << "("
21727 << static_cast<int>(a0) << ", " << a1 << ", "
21728 << static_cast<int>(a2) << ", " << static_cast<int>(a3) << ", "
21729 << static_cast<int>(a4) << ")" << ")\n";
21730
21731 f(a0, a1, a2, a3, a4);
21732}
21733
21734// Used for testing structs and unions by value.
21735// Struct with mis-aligned member.
21736// Tests backfilling of CPU and FPU registers.
21738 // NOLINTNEXTLINE(whitespace/parens)
21739 void (*f)(uint8_t a0, double a1)) {
21740 uint8_t a0;
21741 double a1;
21742
21743 a0 = 1;
21744 a1 = 2.0;
21745
21746 std::cout << "Calling TestAsyncReturnStruct9BytesPackedMixed(" << "("
21747 << static_cast<int>(a0) << ", " << a1 << ")" << ")\n";
21748
21749 f(a0, a1);
21750}
21751
21752// Used for testing structs and unions by value.
21753// Returning a mixed integer/float union.
21755 // NOLINTNEXTLINE(whitespace/parens)
21756 void (*f)(uint32_t a0)) {
21757 uint32_t a0;
21758
21759 a0 = 1;
21760
21761 std::cout << "Calling TestAsyncReturnUnion4BytesMixed(" << "(" << a0 << ")"
21762 << ")\n";
21763
21764 f(a0);
21765}
21766
21767// Used for testing structs and unions by value.
21768// Returning a floating point only union.
21770 // NOLINTNEXTLINE(whitespace/parens)
21771 void (*f)(double a0)) {
21772 double a0;
21773
21774 a0 = -1.0;
21775
21776 std::cout << "Calling TestAsyncReturnUnion8BytesNestedFloat(" << "(" << a0
21777 << ")" << ")\n";
21778
21779 f(a0);
21780}
21781
21782// Used for testing structs and unions by value.
21783// Returning a mixed-size union.
21785 // NOLINTNEXTLINE(whitespace/parens)
21786 void (*f)(Struct8BytesInt a0)) {
21787 Struct8BytesInt a0 = {};
21788
21789 a0.a0 = -1;
21790 a0.a1 = 2;
21791 a0.a2 = -3;
21792
21793 std::cout << "Calling TestAsyncReturnUnion9BytesNestedInt(" << "((" << a0.a0
21794 << ", " << a0.a1 << ", " << a0.a2 << "))" << ")\n";
21795
21796 f(a0);
21797}
21798
21799// Used for testing structs and unions by value.
21800// Returning union with homogenous floats.
21802 // NOLINTNEXTLINE(whitespace/parens)
21803 void (*f)(Struct8BytesHomogeneousFloat a0)) {
21805
21806 a0.a0 = -1.0;
21807 a0.a1 = 2.0;
21808
21809 std::cout << "Calling TestAsyncReturnUnion16BytesNestedFloat(" << "(("
21810 << a0.a0 << ", " << a0.a1 << "))" << ")\n";
21811
21812 f(a0);
21813}
21814
21815// Used for testing structs and unions by value.
21816// Test that a struct passed in as argument can be returned.
21817// Especially for ffi callbacks.
21818// Struct is passed in int registers in most ABIs.
21820 // NOLINTNEXTLINE(whitespace/parens)
21821 void (*f)(Struct1ByteInt a0)) {
21822 Struct1ByteInt a0 = {};
21823
21824 a0.a0 = -1;
21825
21826 std::cout << "Calling TestAsyncReturnStructArgumentStruct1ByteInt(" << "(("
21827 << static_cast<int>(a0.a0) << "))" << ")\n";
21828
21829 f(a0);
21830}
21831
21832// Used for testing structs and unions by value.
21833// Test that a struct passed in as argument can be returned.
21834// Especially for ffi callbacks.
21835// Struct is passed on stack on all ABIs.
21837 // NOLINTNEXTLINE(whitespace/parens)
21838 void (*f)(int32_t a0,
21839 int32_t a1,
21840 int32_t a2,
21841 int32_t a3,
21842 int32_t a4,
21843 int32_t a5,
21844 int32_t a6,
21845 int32_t a7,
21846 Struct1ByteInt a8)) {
21847 int32_t a0;
21848 int32_t a1;
21849 int32_t a2;
21850 int32_t a3;
21851 int32_t a4;
21852 int32_t a5;
21853 int32_t a6;
21854 int32_t a7;
21855 Struct1ByteInt a8 = {};
21856
21857 a0 = -1;
21858 a1 = 2;
21859 a2 = -3;
21860 a3 = 4;
21861 a4 = -5;
21862 a5 = 6;
21863 a6 = -7;
21864 a7 = 8;
21865 a8.a0 = -9;
21866
21867 std::cout << "Calling TestAsyncReturnStructArgumentInt32x8Struct1ByteInt("
21868 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
21869 << ", " << a5 << ", " << a6 << ", " << a7 << ", ("
21870 << static_cast<int>(a8.a0) << "))" << ")\n";
21871
21872 f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
21873}
21874
21875// Used for testing structs and unions by value.
21876// Test that a struct passed in as argument can be returned.
21877// Especially for ffi callbacks.
21878// Struct is passed in float registers in most ABIs.
21880 // NOLINTNEXTLINE(whitespace/parens)
21881 void (*f)(Struct8BytesHomogeneousFloat a0)) {
21883
21884 a0.a0 = -1.0;
21885 a0.a1 = 2.0;
21886
21887 std::cout
21888 << "Calling TestAsyncReturnStructArgumentStruct8BytesHomogeneousFloat("
21889 << "((" << a0.a0 << ", " << a0.a1 << "))" << ")\n";
21890
21891 f(a0);
21892}
21893
21894// Used for testing structs and unions by value.
21895// On arm64, both argument and return value are passed in by pointer.
21897 // NOLINTNEXTLINE(whitespace/parens)
21898 void (*f)(Struct20BytesHomogeneousInt32 a0)) {
21900
21901 a0.a0 = -1;
21902 a0.a1 = 2;
21903 a0.a2 = -3;
21904 a0.a3 = 4;
21905 a0.a4 = -5;
21906
21907 std::cout
21908 << "Calling TestAsyncReturnStructArgumentStruct20BytesHomogeneousInt32("
21909 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << ", " << a0.a3
21910 << ", " << a0.a4 << "))" << ")\n";
21911
21912 f(a0);
21913}
21914
21915// Used for testing structs and unions by value.
21916// On arm64, both argument and return value are passed in by pointer.
21917// Ints exhaust registers, so that pointer is passed on stack.
21919 // NOLINTNEXTLINE(whitespace/parens)
21920 void (*f)(int32_t a0,
21921 int32_t a1,
21922 int32_t a2,
21923 int32_t a3,
21924 int32_t a4,
21925 int32_t a5,
21926 int32_t a6,
21927 int32_t a7,
21929 int32_t a0;
21930 int32_t a1;
21931 int32_t a2;
21932 int32_t a3;
21933 int32_t a4;
21934 int32_t a5;
21935 int32_t a6;
21936 int32_t a7;
21938
21939 a0 = -1;
21940 a1 = 2;
21941 a2 = -3;
21942 a3 = 4;
21943 a4 = -5;
21944 a5 = 6;
21945 a6 = -7;
21946 a7 = 8;
21947 a8.a0 = -9;
21948 a8.a1 = 10;
21949 a8.a2 = -11;
21950 a8.a3 = 12;
21951 a8.a4 = -13;
21952
21953 std::cout
21954 << "Calling TestAsyncReturnStructArgumentInt32x8Struct20BytesHomogeneou("
21955 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
21956 << ", " << a5 << ", " << a6 << ", " << a7 << ", (" << a8.a0 << ", "
21957 << a8.a1 << ", " << a8.a2 << ", " << a8.a3 << ", " << a8.a4 << "))"
21958 << ")\n";
21959
21960 f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
21961}
21962
21963// Used for testing structs and unions by value.
21964// Test returning struct with inline array.
21966 // NOLINTNEXTLINE(whitespace/parens)
21967 void (*f)(Struct8BytesInlineArrayInt a0)) {
21969
21970 a0.a0[0] = 1;
21971 a0.a0[1] = 2;
21972 a0.a0[2] = 3;
21973 a0.a0[3] = 4;
21974 a0.a0[4] = 5;
21975 a0.a0[5] = 6;
21976 a0.a0[6] = 7;
21977 a0.a0[7] = 8;
21978
21979 std::cout
21980 << "Calling TestAsyncReturnStructArgumentStruct8BytesInlineArrayInt("
21981 << "(([" << static_cast<int>(a0.a0[0]) << ", "
21982 << static_cast<int>(a0.a0[1]) << ", " << static_cast<int>(a0.a0[2])
21983 << ", " << static_cast<int>(a0.a0[3]) << ", "
21984 << static_cast<int>(a0.a0[4]) << ", " << static_cast<int>(a0.a0[5])
21985 << ", " << static_cast<int>(a0.a0[6]) << ", "
21986 << static_cast<int>(a0.a0[7]) << "]))" << ")\n";
21987
21988 f(a0);
21989}
21990
21991// Used for testing structs and unions by value.
21992// Return value in FPU registers on arm hardfp and arm64.
21994 // NOLINTNEXTLINE(whitespace/parens)
21997
21998 a0.a0.a0 = -1.0;
21999 a0.a1[0].a0 = 2.0;
22000 a0.a1[1].a0 = -3.0;
22001 a0.a2 = 4.0;
22002
22003 std::cout
22004 << "Calling TestAsyncReturnStructArgumentStructStruct16BytesHomogeneous("
22005 << "(((" << a0.a0.a0 << "), [(" << a0.a1[0].a0 << "), (" << a0.a1[1].a0
22006 << ")], " << a0.a2 << "))" << ")\n";
22007
22008 f(a0);
22009}
22010
22011// Used for testing structs and unions by value.
22012// Return value in FPU registers on arm64.
22014 // NOLINTNEXTLINE(whitespace/parens)
22017
22018 a0.a0.a0 = -1.0;
22019 a0.a1[0].a0 = 2.0;
22020 a0.a1[1].a0 = -3.0;
22021 a0.a2 = 4.0;
22022
22023 std::cout
22024 << "Calling TestAsyncReturnStructArgumentStructStruct32BytesHomogeneous("
22025 << "(((" << a0.a0.a0 << "), [(" << a0.a1[0].a0 << "), (" << a0.a1[1].a0
22026 << ")], " << a0.a2 << "))" << ")\n";
22027
22028 f(a0);
22029}
22030
22031// Used for testing structs and unions by value.
22032// On x64 Linux, return value is split over FP and int registers.
22034 // NOLINTNEXTLINE(whitespace/parens)
22035 void (*f)(StructStruct16BytesMixed3 a0)) {
22037
22038 a0.a0.a0 = -1.0;
22039 a0.a1[0].a0 = 2.0;
22040 a0.a1[0].a1 = -3;
22041 a0.a1[0].a2 = 4;
22042 a0.a2[0] = -5;
22043 a0.a2[1] = 6;
22044
22045 std::cout << "Calling TestAsyncReturnStructArgumentStructStruct16BytesMixed3("
22046 << "(((" << a0.a0.a0 << "), [(" << a0.a1[0].a0 << ", "
22047 << a0.a1[0].a1 << ", " << a0.a1[0].a2 << ")], [" << a0.a2[0] << ", "
22048 << a0.a2[1] << "]))" << ")\n";
22049
22050 f(a0);
22051}
22052
22053// Used for testing structs and unions by value.
22054// Test alignment and padding of 16 byte int within struct.
22056 // NOLINTNEXTLINE(whitespace/parens)
22057 void (*f)(int8_t a0, int16_t a1, int8_t a2)) {
22058 int8_t a0;
22059 int16_t a1;
22060 int8_t a2;
22061
22062 a0 = -1;
22063 a1 = 2;
22064 a2 = -3;
22065
22066 std::cout << "Calling TestAsyncReturnStructAlignmentInt16(" << "("
22067 << static_cast<int>(a0) << ", " << a1 << ", "
22068 << static_cast<int>(a2) << ")" << ")\n";
22069
22070 f(a0, a1, a2);
22071}
22072
22073// Used for testing structs and unions by value.
22074// Test alignment and padding of 32 byte int within struct.
22076 // NOLINTNEXTLINE(whitespace/parens)
22077 void (*f)(int8_t a0, int32_t a1, int8_t a2)) {
22078 int8_t a0;
22079 int32_t a1;
22080 int8_t a2;
22081
22082 a0 = -1;
22083 a1 = 2;
22084 a2 = -3;
22085
22086 std::cout << "Calling TestAsyncReturnStructAlignmentInt32(" << "("
22087 << static_cast<int>(a0) << ", " << a1 << ", "
22088 << static_cast<int>(a2) << ")" << ")\n";
22089
22090 f(a0, a1, a2);
22091}
22092
22093// Used for testing structs and unions by value.
22094// Test alignment and padding of 64 byte int within struct.
22096 // NOLINTNEXTLINE(whitespace/parens)
22097 void (*f)(int8_t a0, int64_t a1, int8_t a2)) {
22098 int8_t a0;
22099 int64_t a1;
22100 int8_t a2;
22101
22102 a0 = -1;
22103 a1 = 2;
22104 a2 = -3;
22105
22106 std::cout << "Calling TestAsyncReturnStructAlignmentInt64(" << "("
22107 << static_cast<int>(a0) << ", " << a1 << ", "
22108 << static_cast<int>(a2) << ")" << ")\n";
22109
22110 f(a0, a1, a2);
22111}
22112
22113// Used for testing structs and unions by value.
22114// Simple nested struct.
22116 // NOLINTNEXTLINE(whitespace/parens)
22117 void (*f)(Struct4BytesHomogeneousInt16 a0,
22121
22122 a0.a0 = -1;
22123 a0.a1 = 2;
22124 a1.a0 = -3;
22125 a1.a1 = 4;
22126
22127 std::cout << "Calling TestAsyncReturnStruct8BytesNestedInt(" << "((" << a0.a0
22128 << ", " << a0.a1 << "), (" << a1.a0 << ", " << a1.a1 << "))"
22129 << ")\n";
22130
22131 f(a0, a1);
22132}
22133
22134// Used for testing structs and unions by value.
22135// Simple nested struct with floats.
22137 // NOLINTNEXTLINE(whitespace/parens)
22138 void (*f)(Struct4BytesFloat a0, Struct4BytesFloat a1)) {
22139 Struct4BytesFloat a0 = {};
22140 Struct4BytesFloat a1 = {};
22141
22142 a0.a0 = -1.0;
22143 a1.a0 = 2.0;
22144
22145 std::cout << "Calling TestAsyncReturnStruct8BytesNestedFloat(" << "(("
22146 << a0.a0 << "), (" << a1.a0 << "))" << ")\n";
22147
22148 f(a0, a1);
22149}
22150
22151// Used for testing structs and unions by value.
22152// The nesting is irregular, testing homogenous float rules on arm and arm64,
22153// and the fpu register usage on x64.
22155 // NOLINTNEXTLINE(whitespace/parens)
22156 void (*f)(Struct4BytesFloat a0, float a1)) {
22157 Struct4BytesFloat a0 = {};
22158 float a1;
22159
22160 a0.a0 = -1.0;
22161 a1 = 2.0;
22162
22163 std::cout << "Calling TestAsyncReturnStruct8BytesNestedFloat2(" << "(("
22164 << a0.a0 << "), " << a1 << ")" << ")\n";
22165
22166 f(a0, a1);
22167}
22168
22169// Used for testing structs and unions by value.
22170// Simple nested struct with mixed members.
22172 // NOLINTNEXTLINE(whitespace/parens)
22175 Struct4BytesFloat a1 = {};
22176
22177 a0.a0 = -1;
22178 a0.a1 = 2;
22179 a1.a0 = -3.0;
22180
22181 std::cout << "Calling TestAsyncReturnStruct8BytesNestedMixed(" << "(("
22182 << a0.a0 << ", " << a0.a1 << "), (" << a1.a0 << "))" << ")\n";
22183
22184 f(a0, a1);
22185}
22186
22187// Used for testing structs and unions by value.
22188// Deeper nested struct to test recursive member access.
22190 // NOLINTNEXTLINE(whitespace/parens)
22191 void (*f)(Struct8BytesNestedInt a0, Struct8BytesNestedInt a1)) {
22192 Struct8BytesNestedInt a0 = {};
22193 Struct8BytesNestedInt a1 = {};
22194
22195 a0.a0.a0 = -1;
22196 a0.a0.a1 = 2;
22197 a0.a1.a0 = -3;
22198 a0.a1.a1 = 4;
22199 a1.a0.a0 = -5;
22200 a1.a0.a1 = 6;
22201 a1.a1.a0 = -7;
22202 a1.a1.a1 = 8;
22203
22204 std::cout << "Calling TestAsyncReturnStruct16BytesNestedInt(" << "((("
22205 << a0.a0.a0 << ", " << a0.a0.a1 << "), (" << a0.a1.a0 << ", "
22206 << a0.a1.a1 << ")), ((" << a1.a0.a0 << ", " << a1.a0.a1 << "), ("
22207 << a1.a1.a0 << ", " << a1.a1.a1 << ")))" << ")\n";
22208
22209 f(a0, a1);
22210}
22211
22212// Used for testing structs and unions by value.
22213// Even deeper nested struct to test recursive member access.
22215 // NOLINTNEXTLINE(whitespace/parens)
22217 Struct16BytesNestedInt a0 = {};
22218 Struct16BytesNestedInt a1 = {};
22219
22220 a0.a0.a0.a0 = -1;
22221 a0.a0.a0.a1 = 2;
22222 a0.a0.a1.a0 = -3;
22223 a0.a0.a1.a1 = 4;
22224 a0.a1.a0.a0 = -5;
22225 a0.a1.a0.a1 = 6;
22226 a0.a1.a1.a0 = -7;
22227 a0.a1.a1.a1 = 8;
22228 a1.a0.a0.a0 = -9;
22229 a1.a0.a0.a1 = 10;
22230 a1.a0.a1.a0 = -11;
22231 a1.a0.a1.a1 = 12;
22232 a1.a1.a0.a0 = -13;
22233 a1.a1.a0.a1 = 14;
22234 a1.a1.a1.a0 = -15;
22235 a1.a1.a1.a1 = 16;
22236
22237 std::cout << "Calling TestAsyncReturnStruct32BytesNestedInt(" << "(((("
22238 << a0.a0.a0.a0 << ", " << a0.a0.a0.a1 << "), (" << a0.a0.a1.a0
22239 << ", " << a0.a0.a1.a1 << ")), ((" << a0.a1.a0.a0 << ", "
22240 << a0.a1.a0.a1 << "), (" << a0.a1.a1.a0 << ", " << a0.a1.a1.a1
22241 << "))), (((" << a1.a0.a0.a0 << ", " << a1.a0.a0.a1 << "), ("
22242 << a1.a0.a1.a0 << ", " << a1.a0.a1.a1 << ")), ((" << a1.a1.a0.a0
22243 << ", " << a1.a1.a0.a1 << "), (" << a1.a1.a1.a0 << ", "
22244 << a1.a1.a1.a1 << "))))" << ")\n";
22245
22246 f(a0, a1);
22247}
22248
22249// Used for testing structs and unions by value.
22250// Test alignment and padding of nested struct with 16 byte int.
22252 // NOLINTNEXTLINE(whitespace/parens)
22253 void (*f)(StructAlignmentInt16 a0, StructAlignmentInt16 a1)) {
22254 StructAlignmentInt16 a0 = {};
22255 StructAlignmentInt16 a1 = {};
22256
22257 a0.a0 = -1;
22258 a0.a1 = 2;
22259 a0.a2 = -3;
22260 a1.a0 = 4;
22261 a1.a1 = -5;
22262 a1.a2 = 6;
22263
22264 std::cout << "Calling TestAsyncReturnStructNestedIntStructAlignmentInt16("
22265 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
22266 << static_cast<int>(a0.a2) << "), (" << static_cast<int>(a1.a0)
22267 << ", " << a1.a1 << ", " << static_cast<int>(a1.a2) << "))"
22268 << ")\n";
22269
22270 f(a0, a1);
22271}
22272
22273// Used for testing structs and unions by value.
22274// Test alignment and padding of nested struct with 32 byte int.
22276 // NOLINTNEXTLINE(whitespace/parens)
22277 void (*f)(StructAlignmentInt32 a0, StructAlignmentInt32 a1)) {
22278 StructAlignmentInt32 a0 = {};
22279 StructAlignmentInt32 a1 = {};
22280
22281 a0.a0 = -1;
22282 a0.a1 = 2;
22283 a0.a2 = -3;
22284 a1.a0 = 4;
22285 a1.a1 = -5;
22286 a1.a2 = 6;
22287
22288 std::cout << "Calling TestAsyncReturnStructNestedIntStructAlignmentInt32("
22289 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
22290 << static_cast<int>(a0.a2) << "), (" << static_cast<int>(a1.a0)
22291 << ", " << a1.a1 << ", " << static_cast<int>(a1.a2) << "))"
22292 << ")\n";
22293
22294 f(a0, a1);
22295}
22296
22297// Used for testing structs and unions by value.
22298// Test alignment and padding of nested struct with 64 byte int.
22300 // NOLINTNEXTLINE(whitespace/parens)
22301 void (*f)(StructAlignmentInt64 a0, StructAlignmentInt64 a1)) {
22302 StructAlignmentInt64 a0 = {};
22303 StructAlignmentInt64 a1 = {};
22304
22305 a0.a0 = -1;
22306 a0.a1 = 2;
22307 a0.a2 = -3;
22308 a1.a0 = 4;
22309 a1.a1 = -5;
22310 a1.a2 = 6;
22311
22312 std::cout << "Calling TestAsyncReturnStructNestedIntStructAlignmentInt64("
22313 << "((" << static_cast<int>(a0.a0) << ", " << a0.a1 << ", "
22314 << static_cast<int>(a0.a2) << "), (" << static_cast<int>(a1.a0)
22315 << ", " << a1.a1 << ", " << static_cast<int>(a1.a2) << "))"
22316 << ")\n";
22317
22318 f(a0, a1);
22319}
22320
22321// Used for testing structs and unions by value.
22322// Return big irregular struct as smoke test.
22324 // NOLINTNEXTLINE(whitespace/parens)
22325 void (*f)(uint64_t a0,
22328 double a3)) {
22329 uint64_t a0;
22332 double a3;
22333
22334 a0 = 1;
22335 a1.a0.a0 = 2;
22336 a1.a0.a1.a0.a0 = -3;
22337 a1.a0.a1.a0.a1 = 4;
22338 a1.a0.a1.a1.a0 = -5.0;
22339 a1.a0.a2 = 6;
22340 a1.a0.a3.a0.a0 = -7.0;
22341 a1.a0.a3.a1 = 8.0;
22342 a1.a0.a4 = 9;
22343 a1.a0.a5.a0.a0 = 10.0;
22344 a1.a0.a5.a1.a0 = -11.0;
22345 a1.a0.a6 = 12;
22346 a1.a1.a0.a0 = -13;
22347 a1.a1.a0.a1 = 14;
22348 a1.a1.a1.a0 = -15.0;
22349 a1.a2 = 16.0;
22350 a1.a3 = -17.0;
22351 a2.a0.a0 = 18;
22352 a2.a0.a1.a0.a0 = -19;
22353 a2.a0.a1.a0.a1 = 20;
22354 a2.a0.a1.a1.a0 = -21.0;
22355 a2.a0.a2 = 22;
22356 a2.a0.a3.a0.a0 = -23.0;
22357 a2.a0.a3.a1 = 24.0;
22358 a2.a0.a4 = 25;
22359 a2.a0.a5.a0.a0 = 26.0;
22360 a2.a0.a5.a1.a0 = -27.0;
22361 a2.a0.a6 = 28;
22362 a2.a1.a0.a0 = -29;
22363 a2.a1.a0.a1 = 30;
22364 a2.a1.a1.a0 = -31.0;
22365 a2.a2 = 32.0;
22366 a2.a3 = -33.0;
22367 a3 = 34.0;
22368
22369 std::cout << "Calling TestAsyncReturnStructNestedIrregularEvenBigger(" << "("
22370 << a0 << ", ((" << a1.a0.a0 << ", ((" << a1.a0.a1.a0.a0 << ", "
22371 << a1.a0.a1.a0.a1 << "), (" << a1.a0.a1.a1.a0 << ")), " << a1.a0.a2
22372 << ", ((" << a1.a0.a3.a0.a0 << "), " << a1.a0.a3.a1 << "), "
22373 << a1.a0.a4 << ", ((" << a1.a0.a5.a0.a0 << "), (" << a1.a0.a5.a1.a0
22374 << ")), " << a1.a0.a6 << "), ((" << a1.a1.a0.a0 << ", "
22375 << a1.a1.a0.a1 << "), (" << a1.a1.a1.a0 << ")), " << a1.a2 << ", "
22376 << a1.a3 << "), ((" << a2.a0.a0 << ", ((" << a2.a0.a1.a0.a0 << ", "
22377 << a2.a0.a1.a0.a1 << "), (" << a2.a0.a1.a1.a0 << ")), " << a2.a0.a2
22378 << ", ((" << a2.a0.a3.a0.a0 << "), " << a2.a0.a3.a1 << "), "
22379 << a2.a0.a4 << ", ((" << a2.a0.a5.a0.a0 << "), (" << a2.a0.a5.a1.a0
22380 << ")), " << a2.a0.a6 << "), ((" << a2.a1.a0.a0 << ", "
22381 << a2.a1.a0.a1 << "), (" << a2.a1.a1.a0 << ")), " << a2.a2 << ", "
22382 << a2.a3 << "), " << a3 << ")" << ")\n";
22383
22384 f(a0, a1, a2, a3);
22385}
22386
22387// Used for testing structs and unions by value.
22388// Single variadic argument.
22389DART_EXPORT int64_t VariadicAt1Int64x2(int64_t a0, ...) {
22390 va_list var_args;
22391 va_start(var_args, a0);
22392 int64_t a1 = va_arg(var_args, int64_t);
22393 va_end(var_args);
22394
22395 std::cout << "VariadicAt1Int64x2" << "(" << a0 << ", " << a1 << ")" << "\n";
22396
22397 int64_t result = 0;
22398
22399 result += a0;
22400 result += a1;
22401
22402 std::cout << "result = " << result << "\n";
22403
22404 return result;
22405}
22406
22407// Used for testing structs and unions by value.
22408// Single variadic argument.
22409DART_EXPORT double VariadicAt1Doublex2(double a0, ...) {
22410 va_list var_args;
22411 va_start(var_args, a0);
22412 double a1 = va_arg(var_args, double);
22413 va_end(var_args);
22414
22415 std::cout << "VariadicAt1Doublex2" << "(" << a0 << ", " << a1 << ")" << "\n";
22416
22417 double result = 0;
22418
22419 result += a0;
22420 result += a1;
22421
22422 std::cout << "result = " << result << "\n";
22423
22424 return result;
22425}
22426
22427// Used for testing structs and unions by value.
22428// Variadic arguments.
22429DART_EXPORT int64_t VariadicAt1Int64x5(int64_t a0, ...) {
22430 va_list var_args;
22431 va_start(var_args, a0);
22432 int64_t a1 = va_arg(var_args, int64_t);
22433 int64_t a2 = va_arg(var_args, int64_t);
22434 int64_t a3 = va_arg(var_args, int64_t);
22435 int64_t a4 = va_arg(var_args, int64_t);
22436 va_end(var_args);
22437
22438 std::cout << "VariadicAt1Int64x5" << "(" << a0 << ", " << a1 << ", " << a2
22439 << ", " << a3 << ", " << a4 << ")" << "\n";
22440
22441 int64_t result = 0;
22442
22443 result += a0;
22444 result += a1;
22445 result += a2;
22446 result += a3;
22447 result += a4;
22448
22449 std::cout << "result = " << result << "\n";
22450
22451 return result;
22452}
22453
22454// Used for testing structs and unions by value.
22455// Variadic arguments.
22456DART_EXPORT double VariadicAt1Doublex5(double a0, ...) {
22457 va_list var_args;
22458 va_start(var_args, a0);
22459 double a1 = va_arg(var_args, double);
22460 double a2 = va_arg(var_args, double);
22461 double a3 = va_arg(var_args, double);
22462 double a4 = va_arg(var_args, double);
22463 va_end(var_args);
22464
22465 std::cout << "VariadicAt1Doublex5" << "(" << a0 << ", " << a1 << ", " << a2
22466 << ", " << a3 << ", " << a4 << ")" << "\n";
22467
22468 double result = 0;
22469
22470 result += a0;
22471 result += a1;
22472 result += a2;
22473 result += a3;
22474 result += a4;
22475
22476 std::cout << "result = " << result << "\n";
22477
22478 return result;
22479}
22480
22481// Used for testing structs and unions by value.
22482// Variadic arguments exhaust registers.
22483DART_EXPORT int64_t VariadicAt1Int64x20(int64_t a0, ...) {
22484 va_list var_args;
22485 va_start(var_args, a0);
22486 int64_t a1 = va_arg(var_args, int64_t);
22487 int64_t a2 = va_arg(var_args, int64_t);
22488 int64_t a3 = va_arg(var_args, int64_t);
22489 int64_t a4 = va_arg(var_args, int64_t);
22490 int64_t a5 = va_arg(var_args, int64_t);
22491 int64_t a6 = va_arg(var_args, int64_t);
22492 int64_t a7 = va_arg(var_args, int64_t);
22493 int64_t a8 = va_arg(var_args, int64_t);
22494 int64_t a9 = va_arg(var_args, int64_t);
22495 int64_t a10 = va_arg(var_args, int64_t);
22496 int64_t a11 = va_arg(var_args, int64_t);
22497 int64_t a12 = va_arg(var_args, int64_t);
22498 int64_t a13 = va_arg(var_args, int64_t);
22499 int64_t a14 = va_arg(var_args, int64_t);
22500 int64_t a15 = va_arg(var_args, int64_t);
22501 int64_t a16 = va_arg(var_args, int64_t);
22502 int64_t a17 = va_arg(var_args, int64_t);
22503 int64_t a18 = va_arg(var_args, int64_t);
22504 int64_t a19 = va_arg(var_args, int64_t);
22505 va_end(var_args);
22506
22507 std::cout << "VariadicAt1Int64x20" << "(" << a0 << ", " << a1 << ", " << a2
22508 << ", " << a3 << ", " << a4 << ", " << a5 << ", " << a6 << ", "
22509 << a7 << ", " << a8 << ", " << a9 << ", " << a10 << ", " << a11
22510 << ", " << a12 << ", " << a13 << ", " << a14 << ", " << a15 << ", "
22511 << a16 << ", " << a17 << ", " << a18 << ", " << a19 << ")" << "\n";
22512
22513 int64_t result = 0;
22514
22515 result += a0;
22516 result += a1;
22517 result += a2;
22518 result += a3;
22519 result += a4;
22520 result += a5;
22521 result += a6;
22522 result += a7;
22523 result += a8;
22524 result += a9;
22525 result += a10;
22526 result += a11;
22527 result += a12;
22528 result += a13;
22529 result += a14;
22530 result += a15;
22531 result += a16;
22532 result += a17;
22533 result += a18;
22534 result += a19;
22535
22536 std::cout << "result = " << result << "\n";
22537
22538 return result;
22539}
22540
22541// Used for testing structs and unions by value.
22542// Variadic arguments exhaust registers.
22543DART_EXPORT double VariadicAt1Doublex20(double a0, ...) {
22544 va_list var_args;
22545 va_start(var_args, a0);
22546 double a1 = va_arg(var_args, double);
22547 double a2 = va_arg(var_args, double);
22548 double a3 = va_arg(var_args, double);
22549 double a4 = va_arg(var_args, double);
22550 double a5 = va_arg(var_args, double);
22551 double a6 = va_arg(var_args, double);
22552 double a7 = va_arg(var_args, double);
22553 double a8 = va_arg(var_args, double);
22554 double a9 = va_arg(var_args, double);
22555 double a10 = va_arg(var_args, double);
22556 double a11 = va_arg(var_args, double);
22557 double a12 = va_arg(var_args, double);
22558 double a13 = va_arg(var_args, double);
22559 double a14 = va_arg(var_args, double);
22560 double a15 = va_arg(var_args, double);
22561 double a16 = va_arg(var_args, double);
22562 double a17 = va_arg(var_args, double);
22563 double a18 = va_arg(var_args, double);
22564 double a19 = va_arg(var_args, double);
22565 va_end(var_args);
22566
22567 std::cout << "VariadicAt1Doublex20" << "(" << a0 << ", " << a1 << ", " << a2
22568 << ", " << a3 << ", " << a4 << ", " << a5 << ", " << a6 << ", "
22569 << a7 << ", " << a8 << ", " << a9 << ", " << a10 << ", " << a11
22570 << ", " << a12 << ", " << a13 << ", " << a14 << ", " << a15 << ", "
22571 << a16 << ", " << a17 << ", " << a18 << ", " << a19 << ")" << "\n";
22572
22573 double result = 0;
22574
22575 result += a0;
22576 result += a1;
22577 result += a2;
22578 result += a3;
22579 result += a4;
22580 result += a5;
22581 result += a6;
22582 result += a7;
22583 result += a8;
22584 result += a9;
22585 result += a10;
22586 result += a11;
22587 result += a12;
22588 result += a13;
22589 result += a14;
22590 result += a15;
22591 result += a16;
22592 result += a17;
22593 result += a18;
22594 result += a19;
22595
22596 std::cout << "result = " << result << "\n";
22597
22598 return result;
22599}
22600
22601// Used for testing structs and unions by value.
22602// Variadic arguments including struct.
22604 va_list var_args;
22605 va_start(var_args, a0);
22606 int64_t a1 = va_arg(var_args, int64_t);
22607 Struct8BytesInt a2 = va_arg(var_args, Struct8BytesInt);
22608 int64_t a3 = va_arg(var_args, int64_t);
22609 va_end(var_args);
22610
22611 std::cout << "VariadicAt1Int64x2Struct8BytesIntInt64" << "(" << a0 << ", "
22612 << a1 << ", (" << a2.a0 << ", " << a2.a1 << ", " << a2.a2 << "), "
22613 << a3 << ")" << "\n";
22614
22615 int64_t result = 0;
22616
22617 result += a0;
22618 result += a1;
22619 result += a2.a0;
22620 result += a2.a1;
22621 result += a2.a2;
22622 result += a3;
22623
22624 std::cout << "result = " << result << "\n";
22625
22626 return result;
22627}
22628
22629// Used for testing structs and unions by value.
22630// Variadic arguments including struct.
22632 ...) {
22633 va_list var_args;
22634 va_start(var_args, a0);
22635 double a1 = va_arg(var_args, double);
22637 va_arg(var_args, Struct32BytesHomogeneousDouble);
22638 double a3 = va_arg(var_args, double);
22639 va_end(var_args);
22640
22641 std::cout << "VariadicAt1Doublex2Struct32BytesHomogeneousDoubleD" << "(" << a0
22642 << ", " << a1 << ", (" << a2.a0 << ", " << a2.a1 << ", " << a2.a2
22643 << ", " << a2.a3 << "), " << a3 << ")" << "\n";
22644
22645 double result = 0;
22646
22647 result += a0;
22648 result += a1;
22649 result += a2.a0;
22650 result += a2.a1;
22651 result += a2.a2;
22652 result += a2.a3;
22653 result += a3;
22654
22655 std::cout << "result = " << result << "\n";
22656
22657 return result;
22658}
22659
22660// Used for testing structs and unions by value.
22661// Variadic arguments including struct.
22663 ...) {
22664 va_list var_args;
22665 va_start(var_args, a0);
22667 va_arg(var_args, Struct12BytesHomogeneousFloat);
22668 double a2 = va_arg(var_args, double);
22669 va_end(var_args);
22670
22671 std::cout << "VariadicAt1DoubleStruct12BytesHomogeneousFloatDoub" << "(" << a0
22672 << ", (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << "), " << a2
22673 << ")" << "\n";
22674
22675 double result = 0;
22676
22677 result += a0;
22678 result += a1.a0;
22679 result += a1.a1;
22680 result += a1.a2;
22681 result += a2;
22682
22683 std::cout << "result = " << result << "\n";
22684
22685 return result;
22686}
22687
22688// Used for testing structs and unions by value.
22689// Variadic arguments including struct.
22690DART_EXPORT int32_t
22692 va_list var_args;
22693 va_start(var_args, a0);
22695 va_arg(var_args, Struct20BytesHomogeneousInt32);
22696 int32_t a2 = va_arg(var_args, int32_t);
22697 va_end(var_args);
22698
22699 std::cout << "VariadicAt1Int32Struct20BytesHomogeneousInt32Int32" << "(" << a0
22700 << ", (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", " << a1.a3
22701 << ", " << a1.a4 << "), " << a2 << ")" << "\n";
22702
22703 int32_t result = 0;
22704
22705 result += a0;
22706 result += a1.a0;
22707 result += a1.a1;
22708 result += a1.a2;
22709 result += a1.a3;
22710 result += a1.a4;
22711 result += a2;
22712
22713 std::cout << "result = " << result << "\n";
22714
22715 return result;
22716}
22717
22718// Used for testing structs and unions by value.
22719// Variadic arguments including struct.
22721 ...) {
22722 va_list var_args;
22723 va_start(var_args, a0);
22725 va_arg(var_args, Struct20BytesHomogeneousFloat);
22726 double a2 = va_arg(var_args, double);
22727 va_end(var_args);
22728
22729 std::cout << "VariadicAt1DoubleStruct20BytesHomogeneousFloatDoub" << "(" << a0
22730 << ", (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2 << ", " << a1.a3
22731 << ", " << a1.a4 << "), " << a2 << ")" << "\n";
22732
22733 double result = 0;
22734
22735 result += a0;
22736 result += a1.a0;
22737 result += a1.a1;
22738 result += a1.a2;
22739 result += a1.a3;
22740 result += a1.a4;
22741 result += a2;
22742
22743 std::cout << "result = " << result << "\n";
22744
22745 return result;
22746}
22747
22748// Used for testing structs and unions by value.
22749// Regression test for variadic arguments.
22750// https://github.com/dart-lang/sdk/issues/49460
22751DART_EXPORT int32_t VariadicAt2Int32Int64IntPtr(int32_t a0, int64_t a1, ...) {
22752 va_list var_args;
22753 va_start(var_args, a1);
22754 intptr_t a2 = va_arg(var_args, intptr_t);
22755 va_end(var_args);
22756
22757 std::cout << "VariadicAt2Int32Int64IntPtr" << "(" << a0 << ", " << a1 << ", "
22758 << a2 << ")" << "\n";
22759
22760 int32_t result = 0;
22761
22762 result += a0;
22763 result += a1;
22764 result += a2;
22765
22766 std::cout << "result = " << result << "\n";
22767
22768 return result;
22769}
22770
22771// Used for testing structs and unions by value.
22772// Variadic arguments mixed.
22774 va_list var_args;
22775 va_start(var_args, a0);
22776 int64_t a1 = va_arg(var_args, int64_t);
22777 int32_t a2 = va_arg(var_args, int32_t);
22778 double a3 = va_arg(var_args, double);
22779 int64_t a4 = va_arg(var_args, int64_t);
22780 int32_t a5 = va_arg(var_args, int32_t);
22781 va_end(var_args);
22782
22783 std::cout << "VariadicAt1DoubleInt64Int32DoubleInt64Int32" << "(" << a0
22784 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4 << ", "
22785 << a5 << ")" << "\n";
22786
22787 double result = 0;
22788
22789 result += a0;
22790 result += a1;
22791 result += a2;
22792 result += a3;
22793 result += a4;
22794 result += a5;
22795
22796 std::cout << "result = " << result << "\n";
22797
22798 return result;
22799}
22800
22801// Used for testing structs and unions by value.
22802// Variadic arguments homogenous struct stack alignment on macos_arm64.
22804 int64_t a0,
22805 ...) {
22806 va_list var_args;
22807 va_start(var_args, a0);
22808 int32_t a1 = va_arg(var_args, int32_t);
22810 va_arg(var_args, Struct12BytesHomogeneousFloat);
22811 va_end(var_args);
22812
22813 std::cout << "VariadicAt1Int64Int32Struct12BytesHomogeneousFloat" << "(" << a0
22814 << ", " << a1 << ", (" << a2.a0 << ", " << a2.a1 << ", " << a2.a2
22815 << "))" << "\n";
22816
22817 double result = 0;
22818
22819 result += a0;
22820 result += a1;
22821 result += a2.a0;
22822 result += a2.a1;
22823 result += a2.a2;
22824
22825 std::cout << "result = " << result << "\n";
22826
22827 return result;
22828}
22829
22830// Used for testing structs and unions by value.
22831// Variadic arguments homogenous struct stack alignment on macos_arm64.
22833 double a0,
22834 double a1,
22835 double a2,
22836 double a3,
22837 double a4,
22838 double a5,
22839 double a6,
22840 double a7,
22841 float a8,
22843 int64_t a10,
22844 ...) {
22845 va_list var_args;
22846 va_start(var_args, a10);
22847 int32_t a11 = va_arg(var_args, int32_t);
22849 va_arg(var_args, Struct12BytesHomogeneousFloat);
22850 va_end(var_args);
22851
22852 std::cout << "VariadicAt11Doublex8FloatStruct12BytesHomogeneousF" << "(" << a0
22853 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4 << ", "
22854 << a5 << ", " << a6 << ", " << a7 << ", " << a8 << ", (" << a9.a0
22855 << ", " << a9.a1 << ", " << a9.a2 << "), " << a10 << ", " << a11
22856 << ", (" << a12.a0 << ", " << a12.a1 << ", " << a12.a2 << "))"
22857 << "\n";
22858
22859 double result = 0;
22860
22861 result += a0;
22862 result += a1;
22863 result += a2;
22864 result += a3;
22865 result += a4;
22866 result += a5;
22867 result += a6;
22868 result += a7;
22869 result += a8;
22870 result += a9.a0;
22871 result += a9.a1;
22872 result += a9.a2;
22873 result += a10;
22874 result += a11;
22875 result += a12.a0;
22876 result += a12.a1;
22877 result += a12.a2;
22878
22879 std::cout << "result = " << result << "\n";
22880
22881 return result;
22882}
22883
22884// Used for testing structs and unions by value.
22885// Variadic arguments mixed.
22887 ...) {
22888 va_list var_args;
22889 va_start(var_args, a0);
22890 int64_t a1 = va_arg(var_args, int64_t);
22891 int32_t a2 = va_arg(var_args, int32_t);
22893 va_arg(var_args, Struct20BytesHomogeneousInt32);
22894 double a4 = va_arg(var_args, double);
22895 int64_t a5 = va_arg(var_args, int64_t);
22896 int32_t a6 = va_arg(var_args, int32_t);
22898 va_arg(var_args, Struct12BytesHomogeneousFloat);
22899 int64_t a8 = va_arg(var_args, int64_t);
22900 va_end(var_args);
22901
22902 std::cout << "VariadicAt1DoubleInt64Int32Struct20BytesHomogeneou" << "(" << a0
22903 << ", " << a1 << ", " << a2 << ", (" << a3.a0 << ", " << a3.a1
22904 << ", " << a3.a2 << ", " << a3.a3 << ", " << a3.a4 << "), " << a4
22905 << ", " << a5 << ", " << a6 << ", (" << a7.a0 << ", " << a7.a1
22906 << ", " << a7.a2 << "), " << a8 << ")" << "\n";
22907
22908 double result = 0;
22909
22910 result += a0;
22911 result += a1;
22912 result += a2;
22913 result += a3.a0;
22914 result += a3.a1;
22915 result += a3.a2;
22916 result += a3.a3;
22917 result += a3.a4;
22918 result += a4;
22919 result += a5;
22920 result += a6;
22921 result += a7.a0;
22922 result += a7.a1;
22923 result += a7.a2;
22924 result += a8;
22925
22926 std::cout << "result = " << result << "\n";
22927
22928 return result;
22929}
22930
22931// Used for testing structs and unions by value.
22932// Variadic arguments function definition, but not passing any.
22934 double a1,
22935 double a2,
22936 double a3,
22937 double a4,
22938 ...) {
22939 va_list var_args;
22940 va_start(var_args, a4);
22941
22942 va_end(var_args);
22943
22944 std::cout << "VariadicAt5Doublex5" << "(" << a0 << ", " << a1 << ", " << a2
22945 << ", " << a3 << ", " << a4 << ")" << "\n";
22946
22947 double result = 0;
22948
22949 result += a0;
22950 result += a1;
22951 result += a2;
22952 result += a3;
22953 result += a4;
22954
22955 std::cout << "result = " << result << "\n";
22956
22957 return result;
22958}
22959
22960// Used for testing structs and unions by value.
22961// Struct stradles last argument register, variadic
22963 ...) {
22964 va_list var_args;
22965 va_start(var_args, a0);
22966 int64_t a1 = va_arg(var_args, int64_t);
22967 int64_t a2 = va_arg(var_args, int64_t);
22968 int64_t a3 = va_arg(var_args, int64_t);
22969 int64_t a4 = va_arg(var_args, int64_t);
22970 int64_t a5 = va_arg(var_args, int64_t);
22971 int64_t a6 = va_arg(var_args, int64_t);
22973 va_arg(var_args, Struct12BytesHomogeneousInt32);
22974 va_end(var_args);
22975
22976 std::cout << "VariadicAt1Int64x7Struct12BytesHomogeneousInt32" << "(" << a0
22977 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4 << ", "
22978 << a5 << ", " << a6 << ", (" << a7.a0 << ", " << a7.a1 << ", "
22979 << a7.a2 << "))" << "\n";
22980
22981 int64_t result = 0;
22982
22983 result += a0;
22984 result += a1;
22985 result += a2;
22986 result += a3;
22987 result += a4;
22988 result += a5;
22989 result += a6;
22990 result += a7.a0;
22991 result += a7.a1;
22992 result += a7.a2;
22993
22994 std::cout << "result = " << result << "\n";
22995
22996 return result;
22997}
22998
22999// Used for testing structs and unions by value.
23000// Variadic arguments test on macos_arm64.
23003 ...) {
23004 va_list var_args;
23005 va_start(var_args, a0);
23006 int32_t a1 = va_arg(var_args, int32_t);
23007 int32_t a2 = va_arg(var_args, int32_t);
23008 int32_t a3 = va_arg(var_args, int32_t);
23009 int32_t a4 = va_arg(var_args, int32_t);
23010 va_end(var_args);
23011
23012 std::cout << "VariadicAt1Struct12BytesHomogeneousInt32Int32x4" << "(("
23013 << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << "), " << a1 << ", "
23014 << a2 << ", " << a3 << ", " << a4 << ")" << "\n";
23015
23016 int32_t result = 0;
23017
23018 result += a0.a0;
23019 result += a0.a1;
23020 result += a0.a2;
23021 result += a1;
23022 result += a2;
23023 result += a3;
23024 result += a4;
23025
23026 std::cout << "result = " << result << "\n";
23027
23028 return result;
23029}
23030
23031// Used for testing structs and unions by value.
23032// Single variadic argument.
23034 // NOLINTNEXTLINE(whitespace/parens)
23035 int64_t (*f)(int64_t a0, ...)) {
23036 int64_t a0;
23037 int64_t a1;
23038
23039 a0 = -1;
23040 a1 = 2;
23041
23042 std::cout << "Calling TestVariadicAt1Int64x2(" << "(" << a0 << ", " << a1
23043 << ")" << ")\n";
23044
23045 int64_t result = f(a0, a1);
23046
23047 std::cout << "result = " << result << "\n";
23048
23049 CHECK_EQ(1, result);
23050
23051 // Pass argument that will make the Dart callback throw.
23052 a0 = 42;
23053
23054 result = f(a0, a1);
23055
23056 CHECK_EQ(0, result);
23057
23058 // Pass argument that will make the Dart callback return null.
23059 a0 = 84;
23060
23061 result = f(a0, a1);
23062
23063 CHECK_EQ(0, result);
23064
23065 return 0;
23066}
23067
23068// Used for testing structs and unions by value.
23069// Single variadic argument.
23071 // NOLINTNEXTLINE(whitespace/parens)
23072 double (*f)(double a0, ...)) {
23073 double a0;
23074 double a1;
23075
23076 a0 = -1.0;
23077 a1 = 2.0;
23078
23079 std::cout << "Calling TestVariadicAt1Doublex2(" << "(" << a0 << ", " << a1
23080 << ")" << ")\n";
23081
23082 double result = f(a0, a1);
23083
23084 std::cout << "result = " << result << "\n";
23085
23086 CHECK_APPROX(1.0, result);
23087
23088 // Pass argument that will make the Dart callback throw.
23089 a0 = 42;
23090
23091 result = f(a0, a1);
23092
23093 CHECK_APPROX(0.0, result);
23094
23095 // Pass argument that will make the Dart callback return null.
23096 a0 = 84;
23097
23098 result = f(a0, a1);
23099
23100 CHECK_APPROX(0.0, result);
23101
23102 return 0;
23103}
23104
23105// Used for testing structs and unions by value.
23106// Variadic arguments.
23108 // NOLINTNEXTLINE(whitespace/parens)
23109 int64_t (*f)(int64_t a0, ...)) {
23110 int64_t a0;
23111 int64_t a1;
23112 int64_t a2;
23113 int64_t a3;
23114 int64_t a4;
23115
23116 a0 = -1;
23117 a1 = 2;
23118 a2 = -3;
23119 a3 = 4;
23120 a4 = -5;
23121
23122 std::cout << "Calling TestVariadicAt1Int64x5(" << "(" << a0 << ", " << a1
23123 << ", " << a2 << ", " << a3 << ", " << a4 << ")" << ")\n";
23124
23125 int64_t result = f(a0, a1, a2, a3, a4);
23126
23127 std::cout << "result = " << result << "\n";
23128
23129 CHECK_EQ(-3, result);
23130
23131 // Pass argument that will make the Dart callback throw.
23132 a0 = 42;
23133
23134 result = f(a0, a1, a2, a3, a4);
23135
23136 CHECK_EQ(0, result);
23137
23138 // Pass argument that will make the Dart callback return null.
23139 a0 = 84;
23140
23141 result = f(a0, a1, a2, a3, a4);
23142
23143 CHECK_EQ(0, result);
23144
23145 return 0;
23146}
23147
23148// Used for testing structs and unions by value.
23149// Variadic arguments.
23151 // NOLINTNEXTLINE(whitespace/parens)
23152 double (*f)(double a0, ...)) {
23153 double a0;
23154 double a1;
23155 double a2;
23156 double a3;
23157 double a4;
23158
23159 a0 = -1.0;
23160 a1 = 2.0;
23161 a2 = -3.0;
23162 a3 = 4.0;
23163 a4 = -5.0;
23164
23165 std::cout << "Calling TestVariadicAt1Doublex5(" << "(" << a0 << ", " << a1
23166 << ", " << a2 << ", " << a3 << ", " << a4 << ")" << ")\n";
23167
23168 double result = f(a0, a1, a2, a3, a4);
23169
23170 std::cout << "result = " << result << "\n";
23171
23172 CHECK_APPROX(-3.0, result);
23173
23174 // Pass argument that will make the Dart callback throw.
23175 a0 = 42;
23176
23177 result = f(a0, a1, a2, a3, a4);
23178
23179 CHECK_APPROX(0.0, result);
23180
23181 // Pass argument that will make the Dart callback return null.
23182 a0 = 84;
23183
23184 result = f(a0, a1, a2, a3, a4);
23185
23186 CHECK_APPROX(0.0, result);
23187
23188 return 0;
23189}
23190
23191// Used for testing structs and unions by value.
23192// Variadic arguments exhaust registers.
23194 // NOLINTNEXTLINE(whitespace/parens)
23195 int64_t (*f)(int64_t a0, ...)) {
23196 int64_t a0;
23197 int64_t a1;
23198 int64_t a2;
23199 int64_t a3;
23200 int64_t a4;
23201 int64_t a5;
23202 int64_t a6;
23203 int64_t a7;
23204 int64_t a8;
23205 int64_t a9;
23206 int64_t a10;
23207 int64_t a11;
23208 int64_t a12;
23209 int64_t a13;
23210 int64_t a14;
23211 int64_t a15;
23212 int64_t a16;
23213 int64_t a17;
23214 int64_t a18;
23215 int64_t a19;
23216
23217 a0 = -1;
23218 a1 = 2;
23219 a2 = -3;
23220 a3 = 4;
23221 a4 = -5;
23222 a5 = 6;
23223 a6 = -7;
23224 a7 = 8;
23225 a8 = -9;
23226 a9 = 10;
23227 a10 = -11;
23228 a11 = 12;
23229 a12 = -13;
23230 a13 = 14;
23231 a14 = -15;
23232 a15 = 16;
23233 a16 = -17;
23234 a17 = 18;
23235 a18 = -19;
23236 a19 = 20;
23237
23238 std::cout << "Calling TestVariadicAt1Int64x20(" << "(" << a0 << ", " << a1
23239 << ", " << a2 << ", " << a3 << ", " << a4 << ", " << a5 << ", "
23240 << a6 << ", " << a7 << ", " << a8 << ", " << a9 << ", " << a10
23241 << ", " << a11 << ", " << a12 << ", " << a13 << ", " << a14 << ", "
23242 << a15 << ", " << a16 << ", " << a17 << ", " << a18 << ", " << a19
23243 << ")" << ")\n";
23244
23245 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13,
23246 a14, a15, a16, a17, a18, a19);
23247
23248 std::cout << "result = " << result << "\n";
23249
23250 CHECK_EQ(10, result);
23251
23252 // Pass argument that will make the Dart callback throw.
23253 a0 = 42;
23254
23255 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
23256 a15, a16, a17, a18, a19);
23257
23258 CHECK_EQ(0, result);
23259
23260 // Pass argument that will make the Dart callback return null.
23261 a0 = 84;
23262
23263 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
23264 a15, a16, a17, a18, a19);
23265
23266 CHECK_EQ(0, result);
23267
23268 return 0;
23269}
23270
23271// Used for testing structs and unions by value.
23272// Variadic arguments exhaust registers.
23274 // NOLINTNEXTLINE(whitespace/parens)
23275 double (*f)(double a0, ...)) {
23276 double a0;
23277 double a1;
23278 double a2;
23279 double a3;
23280 double a4;
23281 double a5;
23282 double a6;
23283 double a7;
23284 double a8;
23285 double a9;
23286 double a10;
23287 double a11;
23288 double a12;
23289 double a13;
23290 double a14;
23291 double a15;
23292 double a16;
23293 double a17;
23294 double a18;
23295 double a19;
23296
23297 a0 = -1.0;
23298 a1 = 2.0;
23299 a2 = -3.0;
23300 a3 = 4.0;
23301 a4 = -5.0;
23302 a5 = 6.0;
23303 a6 = -7.0;
23304 a7 = 8.0;
23305 a8 = -9.0;
23306 a9 = 10.0;
23307 a10 = -11.0;
23308 a11 = 12.0;
23309 a12 = -13.0;
23310 a13 = 14.0;
23311 a14 = -15.0;
23312 a15 = 16.0;
23313 a16 = -17.0;
23314 a17 = 18.0;
23315 a18 = -19.0;
23316 a19 = 20.0;
23317
23318 std::cout << "Calling TestVariadicAt1Doublex20(" << "(" << a0 << ", " << a1
23319 << ", " << a2 << ", " << a3 << ", " << a4 << ", " << a5 << ", "
23320 << a6 << ", " << a7 << ", " << a8 << ", " << a9 << ", " << a10
23321 << ", " << a11 << ", " << a12 << ", " << a13 << ", " << a14 << ", "
23322 << a15 << ", " << a16 << ", " << a17 << ", " << a18 << ", " << a19
23323 << ")" << ")\n";
23324
23325 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13,
23326 a14, a15, a16, a17, a18, a19);
23327
23328 std::cout << "result = " << result << "\n";
23329
23330 CHECK_APPROX(10.0, result);
23331
23332 // Pass argument that will make the Dart callback throw.
23333 a0 = 42;
23334
23335 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
23336 a15, a16, a17, a18, a19);
23337
23338 CHECK_APPROX(0.0, result);
23339
23340 // Pass argument that will make the Dart callback return null.
23341 a0 = 84;
23342
23343 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14,
23344 a15, a16, a17, a18, a19);
23345
23346 CHECK_APPROX(0.0, result);
23347
23348 return 0;
23349}
23350
23351// Used for testing structs and unions by value.
23352// Variadic arguments including struct.
23354 // NOLINTNEXTLINE(whitespace/parens)
23355 int64_t (*f)(int64_t a0, ...)) {
23356 int64_t a0;
23357 int64_t a1;
23358 Struct8BytesInt a2 = {};
23359 int64_t a3;
23360
23361 a0 = -1;
23362 a1 = 2;
23363 a2.a0 = -3;
23364 a2.a1 = 4;
23365 a2.a2 = -5;
23366 a3 = 6;
23367
23368 std::cout << "Calling TestVariadicAt1Int64x2Struct8BytesIntInt64(" << "("
23369 << a0 << ", " << a1 << ", (" << a2.a0 << ", " << a2.a1 << ", "
23370 << a2.a2 << "), " << a3 << ")" << ")\n";
23371
23372 int64_t result = f(a0, a1, a2, a3);
23373
23374 std::cout << "result = " << result << "\n";
23375
23376 CHECK_EQ(3, result);
23377
23378 // Pass argument that will make the Dart callback throw.
23379 a0 = 42;
23380
23381 result = f(a0, a1, a2, a3);
23382
23383 CHECK_EQ(0, result);
23384
23385 // Pass argument that will make the Dart callback return null.
23386 a0 = 84;
23387
23388 result = f(a0, a1, a2, a3);
23389
23390 CHECK_EQ(0, result);
23391
23392 return 0;
23393}
23394
23395// Used for testing structs and unions by value.
23396// Variadic arguments including struct.
23398 // NOLINTNEXTLINE(whitespace/parens)
23399 double (*f)(double a0, ...)) {
23400 double a0;
23401 double a1;
23403 double a3;
23404
23405 a0 = -1.0;
23406 a1 = 2.0;
23407 a2.a0 = -3.0;
23408 a2.a1 = 4.0;
23409 a2.a2 = -5.0;
23410 a2.a3 = 6.0;
23411 a3 = -7.0;
23412
23413 std::cout << "Calling TestVariadicAt1Doublex2Struct32BytesHomogeneousDoubleD("
23414 << "(" << a0 << ", " << a1 << ", (" << a2.a0 << ", " << a2.a1
23415 << ", " << a2.a2 << ", " << a2.a3 << "), " << a3 << ")" << ")\n";
23416
23417 double result = f(a0, a1, a2, a3);
23418
23419 std::cout << "result = " << result << "\n";
23420
23421 CHECK_APPROX(-4.0, result);
23422
23423 // Pass argument that will make the Dart callback throw.
23424 a0 = 42;
23425
23426 result = f(a0, a1, a2, a3);
23427
23428 CHECK_APPROX(0.0, result);
23429
23430 // Pass argument that will make the Dart callback return null.
23431 a0 = 84;
23432
23433 result = f(a0, a1, a2, a3);
23434
23435 CHECK_APPROX(0.0, result);
23436
23437 return 0;
23438}
23439
23440// Used for testing structs and unions by value.
23441// Variadic arguments including struct.
23443 // NOLINTNEXTLINE(whitespace/parens)
23444 double (*f)(double a0, ...)) {
23445 double a0;
23447 double a2;
23448
23449 a0 = -1.0;
23450 a1.a0 = 2.0;
23451 a1.a1 = -3.0;
23452 a1.a2 = 4.0;
23453 a2 = -5.0;
23454
23455 std::cout << "Calling TestVariadicAt1DoubleStruct12BytesHomogeneousFloatDoub("
23456 << "(" << a0 << ", (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2
23457 << "), " << a2 << ")" << ")\n";
23458
23459 double result = f(a0, a1, a2);
23460
23461 std::cout << "result = " << result << "\n";
23462
23463 CHECK_APPROX(-3.0, result);
23464
23465 // Pass argument that will make the Dart callback throw.
23466 a0 = 42;
23467
23468 result = f(a0, a1, a2);
23469
23470 CHECK_APPROX(0.0, result);
23471
23472 // Pass argument that will make the Dart callback return null.
23473 a0 = 84;
23474
23475 result = f(a0, a1, a2);
23476
23477 CHECK_APPROX(0.0, result);
23478
23479 return 0;
23480}
23481
23482// Used for testing structs and unions by value.
23483// Variadic arguments including struct.
23485 // NOLINTNEXTLINE(whitespace/parens)
23486 int32_t (*f)(int32_t a0, ...)) {
23487 int32_t a0;
23489 int32_t a2;
23490
23491 a0 = -1;
23492 a1.a0 = 2;
23493 a1.a1 = -3;
23494 a1.a2 = 4;
23495 a1.a3 = -5;
23496 a1.a4 = 6;
23497 a2 = -7;
23498
23499 std::cout << "Calling TestVariadicAt1Int32Struct20BytesHomogeneousInt32Int32("
23500 << "(" << a0 << ", (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2
23501 << ", " << a1.a3 << ", " << a1.a4 << "), " << a2 << ")" << ")\n";
23502
23503 int32_t result = f(a0, a1, a2);
23504
23505 std::cout << "result = " << result << "\n";
23506
23507 CHECK_EQ(-4, result);
23508
23509 // Pass argument that will make the Dart callback throw.
23510 a0 = 42;
23511
23512 result = f(a0, a1, a2);
23513
23514 CHECK_EQ(0, result);
23515
23516 // Pass argument that will make the Dart callback return null.
23517 a0 = 84;
23518
23519 result = f(a0, a1, a2);
23520
23521 CHECK_EQ(0, result);
23522
23523 return 0;
23524}
23525
23526// Used for testing structs and unions by value.
23527// Variadic arguments including struct.
23529 // NOLINTNEXTLINE(whitespace/parens)
23530 double (*f)(double a0, ...)) {
23531 double a0;
23533 double a2;
23534
23535 a0 = -1.0;
23536 a1.a0 = 2.0;
23537 a1.a1 = -3.0;
23538 a1.a2 = 4.0;
23539 a1.a3 = -5.0;
23540 a1.a4 = 6.0;
23541 a2 = -7.0;
23542
23543 std::cout << "Calling TestVariadicAt1DoubleStruct20BytesHomogeneousFloatDoub("
23544 << "(" << a0 << ", (" << a1.a0 << ", " << a1.a1 << ", " << a1.a2
23545 << ", " << a1.a3 << ", " << a1.a4 << "), " << a2 << ")" << ")\n";
23546
23547 double result = f(a0, a1, a2);
23548
23549 std::cout << "result = " << result << "\n";
23550
23551 CHECK_APPROX(-4.0, result);
23552
23553 // Pass argument that will make the Dart callback throw.
23554 a0 = 42;
23555
23556 result = f(a0, a1, a2);
23557
23558 CHECK_APPROX(0.0, result);
23559
23560 // Pass argument that will make the Dart callback return null.
23561 a0 = 84;
23562
23563 result = f(a0, a1, a2);
23564
23565 CHECK_APPROX(0.0, result);
23566
23567 return 0;
23568}
23569
23570// Used for testing structs and unions by value.
23571// Regression test for variadic arguments.
23572// https://github.com/dart-lang/sdk/issues/49460
23574 // NOLINTNEXTLINE(whitespace/parens)
23575 int32_t (*f)(int32_t a0, int64_t a1, ...)) {
23576 int32_t a0;
23577 int64_t a1;
23578 intptr_t a2;
23579
23580 a0 = -1;
23581 a1 = 2;
23582 a2 = -3;
23583
23584 std::cout << "Calling TestVariadicAt2Int32Int64IntPtr(" << "(" << a0 << ", "
23585 << a1 << ", " << a2 << ")" << ")\n";
23586
23587 int32_t result = f(a0, a1, a2);
23588
23589 std::cout << "result = " << result << "\n";
23590
23591 CHECK_EQ(-2, result);
23592
23593 // Pass argument that will make the Dart callback throw.
23594 a0 = 42;
23595
23596 result = f(a0, a1, a2);
23597
23598 CHECK_EQ(0, result);
23599
23600 // Pass argument that will make the Dart callback return null.
23601 a0 = 84;
23602
23603 result = f(a0, a1, a2);
23604
23605 CHECK_EQ(0, result);
23606
23607 return 0;
23608}
23609
23610// Used for testing structs and unions by value.
23611// Variadic arguments mixed.
23613 // NOLINTNEXTLINE(whitespace/parens)
23614 double (*f)(double a0, ...)) {
23615 double a0;
23616 int64_t a1;
23617 int32_t a2;
23618 double a3;
23619 int64_t a4;
23620 int32_t a5;
23621
23622 a0 = -1.0;
23623 a1 = 2;
23624 a2 = -3;
23625 a3 = 4.0;
23626 a4 = -5;
23627 a5 = 6;
23628
23629 std::cout << "Calling TestVariadicAt1DoubleInt64Int32DoubleInt64Int32(" << "("
23630 << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
23631 << ", " << a5 << ")" << ")\n";
23632
23633 double result = f(a0, a1, a2, a3, a4, a5);
23634
23635 std::cout << "result = " << result << "\n";
23636
23637 CHECK_APPROX(3.0, result);
23638
23639 // Pass argument that will make the Dart callback throw.
23640 a0 = 42;
23641
23642 result = f(a0, a1, a2, a3, a4, a5);
23643
23644 CHECK_APPROX(0.0, result);
23645
23646 // Pass argument that will make the Dart callback return null.
23647 a0 = 84;
23648
23649 result = f(a0, a1, a2, a3, a4, a5);
23650
23651 CHECK_APPROX(0.0, result);
23652
23653 return 0;
23654}
23655
23656// Used for testing structs and unions by value.
23657// Variadic arguments homogenous struct stack alignment on macos_arm64.
23659 // NOLINTNEXTLINE(whitespace/parens)
23660 double (*f)(int64_t a0, ...)) {
23661 int64_t a0;
23662 int32_t a1;
23664
23665 a0 = -1;
23666 a1 = 2;
23667 a2.a0 = -3.0;
23668 a2.a1 = 4.0;
23669 a2.a2 = -5.0;
23670
23671 std::cout << "Calling TestVariadicAt1Int64Int32Struct12BytesHomogeneousFloat("
23672 << "(" << a0 << ", " << a1 << ", (" << a2.a0 << ", " << a2.a1
23673 << ", " << a2.a2 << "))" << ")\n";
23674
23675 double result = f(a0, a1, a2);
23676
23677 std::cout << "result = " << result << "\n";
23678
23679 CHECK_APPROX(-3.0, result);
23680
23681 // Pass argument that will make the Dart callback throw.
23682 a0 = 42;
23683
23684 result = f(a0, a1, a2);
23685
23686 CHECK_APPROX(0.0, result);
23687
23688 // Pass argument that will make the Dart callback return null.
23689 a0 = 84;
23690
23691 result = f(a0, a1, a2);
23692
23693 CHECK_APPROX(0.0, result);
23694
23695 return 0;
23696}
23697
23698// Used for testing structs and unions by value.
23699// Variadic arguments homogenous struct stack alignment on macos_arm64.
23701 // NOLINTNEXTLINE(whitespace/parens)
23702 double (*f)(double a0,
23703 double a1,
23704 double a2,
23705 double a3,
23706 double a4,
23707 double a5,
23708 double a6,
23709 double a7,
23710 float a8,
23712 int64_t a10,
23713 ...)) {
23714 double a0;
23715 double a1;
23716 double a2;
23717 double a3;
23718 double a4;
23719 double a5;
23720 double a6;
23721 double a7;
23722 float a8;
23724 int64_t a10;
23725 int32_t a11;
23727
23728 a0 = -1.0;
23729 a1 = 2.0;
23730 a2 = -3.0;
23731 a3 = 4.0;
23732 a4 = -5.0;
23733 a5 = 6.0;
23734 a6 = -7.0;
23735 a7 = 8.0;
23736 a8 = -9.0;
23737 a9.a0 = 10.0;
23738 a9.a1 = -11.0;
23739 a9.a2 = 12.0;
23740 a10 = -13;
23741 a11 = 14;
23742 a12.a0 = -15.0;
23743 a12.a1 = 16.0;
23744 a12.a2 = -17.0;
23745
23746 std::cout << "Calling TestVariadicAt11Doublex8FloatStruct12BytesHomogeneousF("
23747 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
23748 << ", " << a5 << ", " << a6 << ", " << a7 << ", " << a8 << ", ("
23749 << a9.a0 << ", " << a9.a1 << ", " << a9.a2 << "), " << a10 << ", "
23750 << a11 << ", (" << a12.a0 << ", " << a12.a1 << ", " << a12.a2
23751 << "))" << ")\n";
23752
23753 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
23754
23755 std::cout << "result = " << result << "\n";
23756
23757 CHECK_APPROX(-9.0, result);
23758
23759 // Pass argument that will make the Dart callback throw.
23760 a0 = 42;
23761
23762 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
23763
23764 CHECK_APPROX(0.0, result);
23765
23766 // Pass argument that will make the Dart callback return null.
23767 a0 = 84;
23768
23769 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
23770
23771 CHECK_APPROX(0.0, result);
23772
23773 return 0;
23774}
23775
23776// Used for testing structs and unions by value.
23777// Variadic arguments mixed.
23779 // NOLINTNEXTLINE(whitespace/parens)
23780 double (*f)(double a0, ...)) {
23781 double a0;
23782 int64_t a1;
23783 int32_t a2;
23785 double a4;
23786 int64_t a5;
23787 int32_t a6;
23789 int64_t a8;
23790
23791 a0 = -1.0;
23792 a1 = 2;
23793 a2 = -3;
23794 a3.a0 = 4;
23795 a3.a1 = -5;
23796 a3.a2 = 6;
23797 a3.a3 = -7;
23798 a3.a4 = 8;
23799 a4 = -9.0;
23800 a5 = 10;
23801 a6 = -11;
23802 a7.a0 = 12.0;
23803 a7.a1 = -13.0;
23804 a7.a2 = 14.0;
23805 a8 = -15;
23806
23807 std::cout << "Calling TestVariadicAt1DoubleInt64Int32Struct20BytesHomogeneou("
23808 << "(" << a0 << ", " << a1 << ", " << a2 << ", (" << a3.a0 << ", "
23809 << a3.a1 << ", " << a3.a2 << ", " << a3.a3 << ", " << a3.a4 << "), "
23810 << a4 << ", " << a5 << ", " << a6 << ", (" << a7.a0 << ", " << a7.a1
23811 << ", " << a7.a2 << "), " << a8 << ")" << ")\n";
23812
23813 double result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
23814
23815 std::cout << "result = " << result << "\n";
23816
23817 CHECK_APPROX(-8.0, 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);
23823
23824 CHECK_APPROX(0.0, result);
23825
23826 // Pass argument that will make the Dart callback return null.
23827 a0 = 84;
23828
23829 result = f(a0, a1, a2, a3, a4, a5, a6, a7, a8);
23830
23831 CHECK_APPROX(0.0, result);
23832
23833 return 0;
23834}
23835
23836// Used for testing structs and unions by value.
23837// Variadic arguments function definition, but not passing any.
23839 // NOLINTNEXTLINE(whitespace/parens)
23840 double (*f)(double a0, double a1, double a2, double a3, double a4, ...)) {
23841 double a0;
23842 double a1;
23843 double a2;
23844 double a3;
23845 double a4;
23846
23847 a0 = -1.0;
23848 a1 = 2.0;
23849 a2 = -3.0;
23850 a3 = 4.0;
23851 a4 = -5.0;
23852
23853 std::cout << "Calling TestVariadicAt5Doublex5(" << "(" << a0 << ", " << a1
23854 << ", " << a2 << ", " << a3 << ", " << a4 << ")" << ")\n";
23855
23856 double result = f(a0, a1, a2, a3, a4);
23857
23858 std::cout << "result = " << result << "\n";
23859
23860 CHECK_APPROX(-3.0, result);
23861
23862 // Pass argument that will make the Dart callback throw.
23863 a0 = 42;
23864
23865 result = f(a0, a1, a2, a3, a4);
23866
23867 CHECK_APPROX(0.0, result);
23868
23869 // Pass argument that will make the Dart callback return null.
23870 a0 = 84;
23871
23872 result = f(a0, a1, a2, a3, a4);
23873
23874 CHECK_APPROX(0.0, result);
23875
23876 return 0;
23877}
23878
23879// Used for testing structs and unions by value.
23880// Struct stradles last argument register, variadic
23882 // NOLINTNEXTLINE(whitespace/parens)
23883 int64_t (*f)(int64_t a0, ...)) {
23884 int64_t a0;
23885 int64_t a1;
23886 int64_t a2;
23887 int64_t a3;
23888 int64_t a4;
23889 int64_t a5;
23890 int64_t a6;
23892
23893 a0 = -1;
23894 a1 = 2;
23895 a2 = -3;
23896 a3 = 4;
23897 a4 = -5;
23898 a5 = 6;
23899 a6 = -7;
23900 a7.a0 = 8;
23901 a7.a1 = -9;
23902 a7.a2 = 10;
23903
23904 std::cout << "Calling TestVariadicAt1Int64x7Struct12BytesHomogeneousInt32("
23905 << "(" << a0 << ", " << a1 << ", " << a2 << ", " << a3 << ", " << a4
23906 << ", " << a5 << ", " << a6 << ", (" << a7.a0 << ", " << a7.a1
23907 << ", " << a7.a2 << "))" << ")\n";
23908
23909 int64_t result = f(a0, a1, a2, a3, a4, a5, a6, a7);
23910
23911 std::cout << "result = " << result << "\n";
23912
23913 CHECK_EQ(5, result);
23914
23915 // Pass argument that will make the Dart callback throw.
23916 a0 = 42;
23917
23918 result = f(a0, a1, a2, a3, a4, a5, a6, a7);
23919
23920 CHECK_EQ(0, result);
23921
23922 // Pass argument that will make the Dart callback return null.
23923 a0 = 84;
23924
23925 result = f(a0, a1, a2, a3, a4, a5, a6, a7);
23926
23927 CHECK_EQ(0, result);
23928
23929 return 0;
23930}
23931
23932// Used for testing structs and unions by value.
23933// Variadic arguments test on macos_arm64.
23935 // NOLINTNEXTLINE(whitespace/parens)
23936 int32_t (*f)(Struct12BytesHomogeneousInt32 a0, ...)) {
23938 int32_t a1;
23939 int32_t a2;
23940 int32_t a3;
23941 int32_t a4;
23942
23943 a0.a0 = -1;
23944 a0.a1 = 2;
23945 a0.a2 = -3;
23946 a1 = 4;
23947 a2 = -5;
23948 a3 = 6;
23949 a4 = -7;
23950
23951 std::cout << "Calling TestVariadicAt1Struct12BytesHomogeneousInt32Int32x4("
23952 << "((" << a0.a0 << ", " << a0.a1 << ", " << a0.a2 << "), " << a1
23953 << ", " << a2 << ", " << a3 << ", " << a4 << ")" << ")\n";
23954
23955 int32_t result = f(a0, a1, a2, a3, a4);
23956
23957 std::cout << "result = " << result << "\n";
23958
23959 CHECK_EQ(-4, result);
23960
23961 // Pass argument that will make the Dart callback throw.
23962 a0.a0 = 42;
23963
23964 result = f(a0, a1, a2, a3, a4);
23965
23966 CHECK_EQ(0, result);
23967
23968 // Pass argument that will make the Dart callback return null.
23969 a0.a0 = 84;
23970
23971 result = f(a0, a1, a2, a3, a4);
23972
23973 CHECK_EQ(0, result);
23974
23975 return 0;
23976}
23977
23978} // namespace dart
#define DART_EXPORT
#define CHECK_EQ(X, Y)
#define CHECK_APPROX(EXPECTED, ACTUAL)
GAsyncResult * result
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]