| /* Test AAPCS64 function result return. |
| |
| This test covers most composite types as described in AAPCS64 \S 4.3. |
| Homogeneous floating-point aggregate types are covered in func-ret-3.c. */ |
| |
| /* { dg-do run { target aarch64*-*-* } } */ |
| /* { dg-additional-sources "abitest.S" } */ |
| |
| #ifndef IN_FRAMEWORK |
| #define TESTFILE "func-ret-2.c" |
| |
| struct x0 |
| { |
| char ch; |
| int i; |
| } ys0 = { 'a', 12345 }; |
| |
| struct x1 |
| { |
| int a; |
| unsigned int b; |
| unsigned int c; |
| unsigned int d; |
| } ys1 = { 0xdeadbeef, 0xcafebabe, 0x87654321, 0xbcedf975 }; |
| |
| struct x2 |
| { |
| long long a; |
| long long b; |
| char ch; |
| } y2 = { 0x12, 0x34, 0x56 }; |
| |
| union x3 |
| { |
| char ch; |
| int i; |
| long long ll; |
| } y3; |
| |
| union x4 |
| { |
| int i; |
| struct x2 y2; |
| } y4; |
| |
| #define HAS_DATA_INIT_FUNC |
| void init_data () |
| { |
| /* Init small union. */ |
| y3.ll = 0xfedcba98LL; |
| |
| /* Init big union. */ |
| y4.y2.a = 0x78; |
| y4.y2.b = 0x89; |
| y4.y2.ch= 0x9a; |
| } |
| |
| |
| #include "abitest-2.h" |
| #else |
| /* Composite smaller than or equal to 16 bytes returned in X0 and X1. */ |
| FUNC_VAL_CHECK ( 0, struct x0, ys0, X0, flat) |
| FUNC_VAL_CHECK ( 1, struct x1, ys1, X0, flat) |
| FUNC_VAL_CHECK ( 2, union x3, y3, X0, flat) |
| |
| /* Composite larger than 16 bytes returned in the caller-reserved memory |
| block of which the address is passed as an additional argument to the |
| function in X8. */ |
| FUNC_VAL_CHECK (10, struct x2, y2, X8, flat) |
| FUNC_VAL_CHECK (11, union x4, y4, X8, flat) |
| #endif |