diff options
Diffstat (limited to 'gcc/testsuite/gcc.target/arm')
-rw-r--r-- | gcc/testsuite/gcc.target/arm/aapcs/neon-vect10.c | 31 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/aapcs/neon-vect9.c | 23 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/aapcs/vfp18.c | 27 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/aapcs/vfp19.c | 29 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/aapcs/vfp20.c | 21 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/aapcs/vfp21.c | 25 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/fp16-aapcs-1.c | 17 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/fp16-param-1.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/fp16-return-1.c | 7 |
9 files changed, 184 insertions, 8 deletions
diff --git a/gcc/testsuite/gcc.target/arm/aapcs/neon-vect10.c b/gcc/testsuite/gcc.target/arm/aapcs/neon-vect10.c new file mode 100644 index 00000000000..680a3b560d7 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/aapcs/neon-vect10.c @@ -0,0 +1,31 @@ +/* Test AAPCS layout (VFP variant for Neon types) */ + +/* { dg-do run { target arm_eabi } } */ +/* { dg-require-effective-target arm_neon_fp16_ok } */ +/* { dg-add-options arm_neon_fp16 } */ + +#ifndef IN_FRAMEWORK +#define VFP +#define NEON +#define TESTFILE "neon-vect10.c" +#include "neon-constants.h" + +#include "abitest.h" +#else + +ARG (int32x4_t, i32x4_constvec2, Q0) /* D0, D1. */ +#if defined (__ARM_BIG_ENDIAN) +ARG (__fp16, 3.0f, S4 + 2) /* D2, Q1. */ +#else +ARG (__fp16, 3.0f, S4) /* D2, Q1. */ +#endif +ARG (int32x4x2_t, i32x4x2_constvec1, Q2) /* Q2, Q3 - D4-D6 , s5-s12. */ +ARG (double, 12.0, D3) /* Backfill this particular argument. */ +#if defined (__ARM_BIG_ENDIAN) +ARG (__fp16, 5.0f, S5 + 2) /* Backfill in S5. */ +#else +ARG (__fp16, 5.0f, S5) /* Backfill in S5. */ +#endif +ARG (int32x4x2_t, i32x4x2_constvec2, STACK) +LAST_ARG (int, 3, R0) +#endif diff --git a/gcc/testsuite/gcc.target/arm/aapcs/neon-vect9.c b/gcc/testsuite/gcc.target/arm/aapcs/neon-vect9.c new file mode 100644 index 00000000000..fc2b13bf1b7 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/aapcs/neon-vect9.c @@ -0,0 +1,23 @@ +/* Test AAPCS layout (VFP variant for Neon types) */ + +/* { dg-do run { target arm_eabi } } */ +/* { dg-require-effective-target arm_neon_fp16_ok } */ +/* { dg-add-options arm_neon_fp16 } */ + +#ifndef IN_FRAMEWORK +#define VFP +#define NEON +#define TESTFILE "neon-vect9.c" +#include "neon-constants.h" + +#include "abitest.h" +#else + +ARG (int32x4_t, i32x4_constvec2, Q0) /* D0, D1. */ +#if defined (__ARM_BIG_ENDIAN) +ARG (__fp16, 3.0f, S4 + 2) /* D2, Q1 occupied. */ +#else +ARG (__fp16, 3.0f, S4) /* D2, Q1 occupied. */ +#endif +LAST_ARG (int, 3, R0) +#endif diff --git a/gcc/testsuite/gcc.target/arm/aapcs/vfp18.c b/gcc/testsuite/gcc.target/arm/aapcs/vfp18.c new file mode 100644 index 00000000000..225e9ce7c10 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/aapcs/vfp18.c @@ -0,0 +1,27 @@ +/* Test AAPCS layout (VFP variant) */ + +/* { dg-do run { target arm_eabi } } */ +/* { dg-require-effective-target arm_neon_fp16_ok } */ +/* { dg-options "-O -mfpu=vfp -mfloat-abi=hard -mfp16-format=ieee" } */ + +#ifndef IN_FRAMEWORK +#define VFP +#define TESTFILE "vfp18.c" +#include "abitest.h" + +#else +#if defined (__ARM_BIG_ENDIAN) +ARG (__fp16, 1.0f, S0 + 2) +#else +ARG (__fp16, 1.0f, S0) +#endif +ARG (float, 2.0f, S1) +ARG (double, 4.0, D1) +ARG (float, 2.0f, S4) +#if defined (__ARM_BIG_ENDIAN) +ARG (__fp16, 1.0f, S5 + 2) +#else +ARG (__fp16, 1.0f, S5) +#endif +LAST_ARG (int, 3, R0) +#endif diff --git a/gcc/testsuite/gcc.target/arm/aapcs/vfp19.c b/gcc/testsuite/gcc.target/arm/aapcs/vfp19.c new file mode 100644 index 00000000000..8928b1562e9 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/aapcs/vfp19.c @@ -0,0 +1,29 @@ +/* Test AAPCS layout (VFP variant) */ + +/* { dg-do run { target arm_eabi } } */ +/* { dg-require-effective-target arm_neon_fp16_ok } */ +/* { dg-options "-O -mfpu=vfp -mfloat-abi=hard -mfp16-format=ieee" } */ + +#ifndef IN_FRAMEWORK +#define VFP +#define TESTFILE "vfp19.c" + +__complex__ x = 1.0+2.0i; + +#include "abitest.h" +#else +#if defined (__ARM_BIG_ENDIAN) +ARG (__fp16, 1.0f, S0 + 2) +#else +ARG (__fp16, 1.0f, S0) +#endif +ARG (float, 2.0f, S1) +ARG (__complex__ double, x, D1) +ARG (float, 3.0f, S6) +#if defined (__ARM_BIG_ENDIAN) +ARG (__fp16, 2.0f, S7 + 2) +#else +ARG (__fp16, 2.0f, S7) +#endif +LAST_ARG (int, 3, R0) +#endif diff --git a/gcc/testsuite/gcc.target/arm/aapcs/vfp20.c b/gcc/testsuite/gcc.target/arm/aapcs/vfp20.c new file mode 100644 index 00000000000..61f07049f2c --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/aapcs/vfp20.c @@ -0,0 +1,21 @@ +/* Test AAPCS layout (VFP variant) */ + +/* { dg-do run { target arm_eabi } } */ +/* { dg-require-effective-target arm_neon_fp16_ok } */ +/* { dg-options "-O -mfpu=vfp -mfloat-abi=hard -mfp16-format=ieee" } */ + +#ifndef IN_FRAMEWORK +#define VFP +#define TESTFILE "vfp20.c" + +#define PCSATTR __attribute__((pcs("aapcs"))) + +#include "abitest.h" +#else +ARG (float, 1.0f, R0) +ARG (double, 2.0, R2) +ARG (float, 3.0f, STACK) +ARG (__fp16, 2.0f, STACK+4) +LAST_ARG (double, 4.0, STACK+8) +#endif + diff --git a/gcc/testsuite/gcc.target/arm/aapcs/vfp21.c b/gcc/testsuite/gcc.target/arm/aapcs/vfp21.c new file mode 100644 index 00000000000..15dff7d19f8 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/aapcs/vfp21.c @@ -0,0 +1,25 @@ +/* Test AAPCS layout (VFP variant) */ + +/* { dg-do run { target arm_eabi } } */ +/* { dg-require-effective-target arm_neon_fp16_ok } */ +/* { dg-options "-O -mfpu=vfp -mfloat-abi=hard -mfp16-format=ieee" } */ + +#ifndef IN_FRAMEWORK +#define VFP +#define TESTFILE "vfp21.c" + +#define PCSATTR __attribute__((pcs("aapcs"))) + +#include "abitest.h" +#else +#if defined (__ARM_BIG_ENDIAN) +ARG (__fp16, 1.0f, R0 + 2) +#else +ARG (__fp16, 1.0f, R0) +#endif +ARG (double, 2.0, R2) +ARG (__fp16, 3.0f, STACK) +ARG (float, 2.0f, STACK+4) +LAST_ARG (double, 4.0, STACK+8) +#endif + diff --git a/gcc/testsuite/gcc.target/arm/fp16-aapcs-1.c b/gcc/testsuite/gcc.target/arm/fp16-aapcs-1.c new file mode 100644 index 00000000000..5eab3e2ca78 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/fp16-aapcs-1.c @@ -0,0 +1,17 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target arm_fp16_ok } */ +/* { dg-options "-mfp16-format=ieee -O2" } */ +/* { dg-add-options arm_fp16 } */ + +/* Test __fp16 arguments and return value in registers. */ + +__fp16 F (__fp16 a, __fp16 b, __fp16 c) +{ + if (a == b) + return c; + return a; +} + +/* { dg-final { scan-assembler-times {vcvtb\.f32\.f16\ts[0-9]+, s0} 1 } } */ +/* { dg-final { scan-assembler-times {vcvtb\.f32\.f16\ts[0-9]+, s1} 1 } } */ +/* { dg-final { scan-assembler-times {vmov\ts0, r[0-9]+} 1 } } */ diff --git a/gcc/testsuite/gcc.target/arm/fp16-param-1.c b/gcc/testsuite/gcc.target/arm/fp16-param-1.c index af4845f9fd5..9c527301c44 100644 --- a/gcc/testsuite/gcc.target/arm/fp16-param-1.c +++ b/gcc/testsuite/gcc.target/arm/fp16-param-1.c @@ -1,10 +1,14 @@ /* { dg-do compile } */ /* { dg-options "-mfp16-format=ieee" } */ -/* Functions cannot have parameters of type __fp16. */ -extern void f (__fp16); /* { dg-error "parameters cannot have __fp16 type" } */ -extern void (*pf) (__fp16); /* { dg-error "parameters cannot have __fp16 type" } */ +/* Test that the ACLE macro is defined. */ +#if __ARM_FP16_ARGS != 1 +#error Unexpected value for __ARM_FP16_ARGS +#endif + +/* Test that __fp16 is supported as a parameter type. */ +extern void f (__fp16); +extern void (*pf) (__fp16); -/* These should be OK. */ extern void g (__fp16 *); extern void (*pg) (__fp16 *); diff --git a/gcc/testsuite/gcc.target/arm/fp16-return-1.c b/gcc/testsuite/gcc.target/arm/fp16-return-1.c index f763941268a..f97a8d7f585 100644 --- a/gcc/testsuite/gcc.target/arm/fp16-return-1.c +++ b/gcc/testsuite/gcc.target/arm/fp16-return-1.c @@ -1,10 +1,9 @@ /* { dg-do compile } */ /* { dg-options "-mfp16-format=ieee" } */ -/* Functions cannot return type __fp16. */ -extern __fp16 f (void); /* { dg-error "cannot return __fp16" } */ -extern __fp16 (*pf) (void); /* { dg-error "cannot return __fp16" } */ +/* Test that __fp16 is supported as a return type. */ +extern __fp16 f (void); +extern __fp16 (*pf) (void); -/* These should be OK. */ extern __fp16 *g (void); extern __fp16 *(*pg) (void); |