diff options
Diffstat (limited to 'gcc-4.9/gcc/testsuite/gcc.target/aarch64/aapcs64/func-ret-2.c')
-rw-r--r-- | gcc-4.9/gcc/testsuite/gcc.target/aarch64/aapcs64/func-ret-2.c | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/aarch64/aapcs64/func-ret-2.c b/gcc-4.9/gcc/testsuite/gcc.target/aarch64/aapcs64/func-ret-2.c new file mode 100644 index 000000000..6b171c46f --- /dev/null +++ b/gcc-4.9/gcc/testsuite/gcc.target/aarch64/aapcs64/func-ret-2.c @@ -0,0 +1,71 @@ +/* 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 |