Message ID | 57598992.8090106@foss.arm.com |
---|---|
State | New |
Headers | show |
On 9 June 2016 at 17:21, Matthew Wahab <matthew.wahab@foss.arm.com> wrote: > Hello, > > A number of tests were added to check for FP16 arguments and return > values being passed in registers. These require mfloat-abi=hard to be > selected but in some test configurations they were run with > -mfloat-abi=soft or -mfloat-abi=softfp. > > Explict skip-if directives are added to the tests to ensure that they > only run on valid configurations. In addition, the code in the > gcc.target/arm/fp16-aapcs-1.c test is reworked to focus on argument > passing and return values and a softfp variant is added as > fp16-aapcs-2.c. > > Tested for arm-none-linux-gnueabihf with native make check and for > arm-none-eabi with cross-compiled check-gcc. Also checked the new tests > with cross-compiled arm-eabi-qemu/-mcpu=cortex-m3/-mthumb. > > Ok for trunk? > Matthew > Hi Matthew, It's an improvement, but I'm still seeing a few problems with this patch: the vfp* tests are still failing in some of the configurations I test, because * you force dg-options that contains -mfloat-abi=hard, * you check effective-target arm_neon_fp16_hw * but you don't call dg-add-options arm_neon_fp16 on non-hf targets, the effective-target arm_neon_fp16_hw will want to add -mfloat-abi=softfp, but you actually force -mfloat-abi=hard. So, the dg-skip directive doesn't match, and the test fails to link because the dejagnu glue code is compiled in soft mode, and conflicts with the hard mode from vfpXX.o This is quite tricky :) Thanks, Christophe > 2016-06-09 Matthew Wahab <matthew.wahab@arm.com> > > * testsuite/gcc.target/arm/aapcs/neon-vect10.c: Skip for > mfloat-abi=soft and mfloat-abi=softfp. Replace arm_neon_fp16_ok > with arm_neon_fp16_hw. > * testsuite/gcc.target/arm/aapcs/neon-vect9.c: Likewise. > * testsuite/gcc.target/arm/aapcs/vfp18.c: Likewise. > * testsuite/gcc.target/arm/aapcs/vfp19.c: Likewise. > * testsuite/gcc.target/arm/aapcs/vfp20.c: Likewise. > * testsuite/gcc.target/arm/aapcs/vfp21.c: Likewise. > * testsuite/gcc.target/arm/fp16-aapcs-1.c: Skip for > mfloat-abi=soft and mfloat-abi=softfp. Also, simplify the test > and set option -mfloat-abi=hard. > * testsuite/gcc.target/arm/fp16-aapcs-2.c: New.
On 10/06/16 09:32, Christophe Lyon wrote: > On 9 June 2016 at 17:21, Matthew Wahab <matthew.wahab@foss.arm.com> wrote: >> A number of tests were added to check for FP16 arguments and return >> values being passed in registers. These require mfloat-abi=hard to be >> selected but in some test configurations they were run with >> -mfloat-abi=soft or -mfloat-abi=softfp. >> > It's an improvement, but I'm still seeing a few problems with this patch: > the vfp* tests are still failing in some of the configurations I test, because > * you force dg-options that contains -mfloat-abi=hard, > * you check effective-target arm_neon_fp16_hw > * but you don't call dg-add-options arm_neon_fp16 > > on non-hf targets, the effective-target arm_neon_fp16_hw will want to > add -mfloat-abi=softfp, but you actually force -mfloat-abi=hard. > So, the dg-skip directive doesn't match, and the test fails to link because > the dejagnu glue code is compiled in soft mode, and conflicts > with the hard mode from vfpXX.o Thanks for testing this. I'm not sure why the skip-if is failing, it's intended to skip the test if float-abi={soft,softfp} appears anywhere in the command line. That's needed because, in some configurations, the directives add an -mfloat-abi=softfp after the -mfloat-abi=hard from dg-options, making the test fail. The require-effective-target arm_neon_fp16_hw was intended to select a hard-float target with FP16 support. I don't think that dg-add-options arm_neon_fp16 is right because that could also force soft-fp. It may be better to not use arm_neon_fp16_hw. The existing aapc/vfp* tests have a list of require-effective-target directives to filter out invalid boards. I'll see if that can be made to work with arm_hard_vfp_ok and a selector for vfp-fp16 hardware. Matthew
On 10 June 2016 at 15:56, Matthew Wahab <matthew.wahab@foss.arm.com> wrote: > On 10/06/16 09:32, Christophe Lyon wrote: >> >> On 9 June 2016 at 17:21, Matthew Wahab <matthew.wahab@foss.arm.com> wrote: >>> >>> A number of tests were added to check for FP16 arguments and return >>> values being passed in registers. These require mfloat-abi=hard to be >>> selected but in some test configurations they were run with >>> -mfloat-abi=soft or -mfloat-abi=softfp. >>> >> It's an improvement, but I'm still seeing a few problems with this patch: >> the vfp* tests are still failing in some of the configurations I test, >> because >> * you force dg-options that contains -mfloat-abi=hard, >> * you check effective-target arm_neon_fp16_hw >> * but you don't call dg-add-options arm_neon_fp16 >> >> on non-hf targets, the effective-target arm_neon_fp16_hw will want to >> add -mfloat-abi=softfp, but you actually force -mfloat-abi=hard. >> So, the dg-skip directive doesn't match, and the test fails to link >> because >> the dejagnu glue code is compiled in soft mode, and conflicts >> with the hard mode from vfpXX.o > > > Thanks for testing this. > > I'm not sure why the skip-if is failing, it's intended to skip the test if > float-abi={soft,softfp} appears anywhere in the command line. That's needed > because, in some configurations, the directives add an -mfloat-abi=softfp > after the -mfloat-abi=hard from dg-options, making the test fail. > > The require-effective-target arm_neon_fp16_hw was intended to select a > hard-float target with FP16 support. I don't think that dg-add-options > arm_neon_fp16 is right because that could also force soft-fp. > I'm seeing arm_neon_fp16_hw test passing with -mfpu=neon-fp16 -mfloat-abi=softfp but since you don't call dg-add-options arm_neon_fp16, the dg-skip directive sees only the -mfloat-abi-hard which comes from dg-options. The test fails to link for me with -mfpu=vfp -mfloat-abi=hard -mfp16-format=ieee according to my gcc.log Christophe > It may be better to not use arm_neon_fp16_hw. The existing aapc/vfp* tests > have a list of require-effective-target directives to filter out invalid > boards. I'll see if that can be made to work with arm_hard_vfp_ok and a > selector for vfp-fp16 hardware. > > Matthew >
On 10/06/16 15:22, Christophe Lyon wrote: > On 10 June 2016 at 15:56, Matthew Wahab <matthew.wahab@foss.arm.com> wrote: >> On 10/06/16 09:32, Christophe Lyon wrote: >>> >>> On 9 June 2016 at 17:21, Matthew Wahab <matthew.wahab@foss.arm.com> wrote: >>>> >>> It's an improvement, but I'm still seeing a few problems with this patch: >>> the vfp* tests are still failing in some of the configurations I test, >>> because >>> * you force dg-options that contains -mfloat-abi=hard, >>> * you check effective-target arm_neon_fp16_hw >>> * but you don't call dg-add-options arm_neon_fp16 >>> >> >> I'm not sure why the skip-if is failing, it's intended to skip the test if >> float-abi={soft,softfp} appears anywhere in the command line. That's needed >> because, in some configurations, the directives add an -mfloat-abi=softfp >> after the -mfloat-abi=hard from dg-options, making the test fail. >> >> The require-effective-target arm_neon_fp16_hw was intended to select a >> hard-float target with FP16 support. I don't think that dg-add-options >> arm_neon_fp16 is right because that could also force soft-fp. >> > I'm seeing arm_neon_fp16_hw test passing with -mfpu=neon-fp16 -mfloat-abi=softfp > but since you don't call dg-add-options arm_neon_fp16, the dg-skip directive > sees only the -mfloat-abi-hard which comes from dg-options. > The test fails to link for me with -mfpu=vfp -mfloat-abi=hard -mfp16-format=ieee > according to my gcc.log > I understand now. I still think it would be better to use a list of require-effective-targets so I'll try that first and use the arm_neon_fp16 options if that doesn't work. Thanks, Matthew
From b02f0283367d4a4c1b012e8ca8e7b5c91f3ac561 Mon Sep 17 00:00:00 2001 From: Matthew Wahab <matthew.wahab@arm.com> Date: Tue, 24 May 2016 09:21:11 +0100 Subject: [PATCH] [ARM] Fix, add tests for FP16 aapcs. A number of tests were added to check for FP16 arguments and return values being passed in register. These require mfloat-abi=hard to be selected but, in some test configurations, they were run with -mfloat-abi=soft or -mfloat-abi=softfp. Explict skip-if directives are added to the tests to ensure that they only run on valid configurations. In addition, the code in the gcc.target/arm/fp16-aapcs-1.c test is reworked to focus on argument passing and return values and a softfp variant is added as fp16-aapcs-2.c. 2016-06-09 Matthew Wahab <matthew.wahab@arm.com> * testsuite/gcc.target/arm/aapcs/neon-vect10.c: Skip for mfloat-abi=soft and mfloat-abi=softfp. Replace arm_neon_fp16_ok with arm_neon_fp16_hw. * testsuite/gcc.target/arm/aapcs/neon-vect9.c: Likewise. * testsuite/gcc.target/arm/aapcs/vfp18.c: Likewise. * testsuite/gcc.target/arm/aapcs/vfp19.c: Likewise. * testsuite/gcc.target/arm/aapcs/vfp20.c: Likewise. * testsuite/gcc.target/arm/aapcs/vfp21.c: Likewise. * testsuite/gcc.target/arm/fp16-aapcs-1.c: Skip for mfloat-abi=soft and mfloat-abi=softfp. Also, simplify the test and set option -mfloat-abi=hard. * testsuite/gcc.target/arm/fp16-aapcs-2.c: New. --- gcc/testsuite/gcc.target/arm/aapcs/neon-vect10.c | 3 ++- gcc/testsuite/gcc.target/arm/aapcs/neon-vect9.c | 3 ++- gcc/testsuite/gcc.target/arm/aapcs/vfp18.c | 3 ++- gcc/testsuite/gcc.target/arm/aapcs/vfp19.c | 3 ++- gcc/testsuite/gcc.target/arm/aapcs/vfp20.c | 3 ++- gcc/testsuite/gcc.target/arm/aapcs/vfp21.c | 3 ++- gcc/testsuite/gcc.target/arm/fp16-aapcs-1.c | 22 +++++++++++++--------- gcc/testsuite/gcc.target/arm/fp16-aapcs-2.c | 21 +++++++++++++++++++++ 8 files changed, 46 insertions(+), 15 deletions(-) create mode 100644 gcc/testsuite/gcc.target/arm/fp16-aapcs-2.c diff --git a/gcc/testsuite/gcc.target/arm/aapcs/neon-vect10.c b/gcc/testsuite/gcc.target/arm/aapcs/neon-vect10.c index 680a3b5..6764a19 100644 --- a/gcc/testsuite/gcc.target/arm/aapcs/neon-vect10.c +++ b/gcc/testsuite/gcc.target/arm/aapcs/neon-vect10.c @@ -1,8 +1,9 @@ /* Test AAPCS layout (VFP variant for Neon types) */ /* { dg-do run { target arm_eabi } } */ -/* { dg-require-effective-target arm_neon_fp16_ok } */ +/* { dg-require-effective-target arm_neon_fp16_hw } */ /* { dg-add-options arm_neon_fp16 } */ +/* { dg-skip-if "" { *-*-* } { "-mfloat-abi=soft" "-mfloat-abi=softfp" } } */ #ifndef IN_FRAMEWORK #define VFP diff --git a/gcc/testsuite/gcc.target/arm/aapcs/neon-vect9.c b/gcc/testsuite/gcc.target/arm/aapcs/neon-vect9.c index fc2b13b..b2526a1 100644 --- a/gcc/testsuite/gcc.target/arm/aapcs/neon-vect9.c +++ b/gcc/testsuite/gcc.target/arm/aapcs/neon-vect9.c @@ -1,8 +1,9 @@ /* Test AAPCS layout (VFP variant for Neon types) */ /* { dg-do run { target arm_eabi } } */ -/* { dg-require-effective-target arm_neon_fp16_ok } */ +/* { dg-require-effective-target arm_neon_fp16_hw } */ /* { dg-add-options arm_neon_fp16 } */ +/* { dg-skip-if "" { *-*-* } { "-mfloat-abi=soft" "-mfloat-abi=softfp" } } */ #ifndef IN_FRAMEWORK #define VFP diff --git a/gcc/testsuite/gcc.target/arm/aapcs/vfp18.c b/gcc/testsuite/gcc.target/arm/aapcs/vfp18.c index 225e9ce..629b884 100644 --- a/gcc/testsuite/gcc.target/arm/aapcs/vfp18.c +++ b/gcc/testsuite/gcc.target/arm/aapcs/vfp18.c @@ -1,8 +1,9 @@ /* Test AAPCS layout (VFP variant) */ /* { dg-do run { target arm_eabi } } */ -/* { dg-require-effective-target arm_neon_fp16_ok } */ +/* { dg-require-effective-target arm_neon_fp16_hw } */ /* { dg-options "-O -mfpu=vfp -mfloat-abi=hard -mfp16-format=ieee" } */ +/* { dg-skip-if "" { *-*-* } { "-mfloat-abi=soft" "-mfloat-abi=softfp" } } */ #ifndef IN_FRAMEWORK #define VFP diff --git a/gcc/testsuite/gcc.target/arm/aapcs/vfp19.c b/gcc/testsuite/gcc.target/arm/aapcs/vfp19.c index 8928b15..39effbc 100644 --- a/gcc/testsuite/gcc.target/arm/aapcs/vfp19.c +++ b/gcc/testsuite/gcc.target/arm/aapcs/vfp19.c @@ -1,8 +1,9 @@ /* Test AAPCS layout (VFP variant) */ /* { dg-do run { target arm_eabi } } */ -/* { dg-require-effective-target arm_neon_fp16_ok } */ +/* { dg-require-effective-target arm_neon_fp16_hw } */ /* { dg-options "-O -mfpu=vfp -mfloat-abi=hard -mfp16-format=ieee" } */ +/* { dg-skip-if "" { *-*-* } { "-mfloat-abi=soft" "-mfloat-abi=softfp" } } */ #ifndef IN_FRAMEWORK #define VFP diff --git a/gcc/testsuite/gcc.target/arm/aapcs/vfp20.c b/gcc/testsuite/gcc.target/arm/aapcs/vfp20.c index 61f0704..38e3d46 100644 --- a/gcc/testsuite/gcc.target/arm/aapcs/vfp20.c +++ b/gcc/testsuite/gcc.target/arm/aapcs/vfp20.c @@ -1,8 +1,9 @@ /* Test AAPCS layout (VFP variant) */ /* { dg-do run { target arm_eabi } } */ -/* { dg-require-effective-target arm_neon_fp16_ok } */ +/* { dg-require-effective-target arm_neon_fp16_hw } */ /* { dg-options "-O -mfpu=vfp -mfloat-abi=hard -mfp16-format=ieee" } */ +/* { dg-skip-if "" { *-*-* } { "-mfloat-abi=soft" "-mfloat-abi=softfp" } } */ #ifndef IN_FRAMEWORK #define VFP diff --git a/gcc/testsuite/gcc.target/arm/aapcs/vfp21.c b/gcc/testsuite/gcc.target/arm/aapcs/vfp21.c index 15dff7d..d875bdc 100644 --- a/gcc/testsuite/gcc.target/arm/aapcs/vfp21.c +++ b/gcc/testsuite/gcc.target/arm/aapcs/vfp21.c @@ -1,8 +1,9 @@ /* Test AAPCS layout (VFP variant) */ /* { dg-do run { target arm_eabi } } */ -/* { dg-require-effective-target arm_neon_fp16_ok } */ +/* { dg-require-effective-target arm_neon_fp16_hw } */ /* { dg-options "-O -mfpu=vfp -mfloat-abi=hard -mfp16-format=ieee" } */ +/* { dg-skip-if "" { *-*-* } { "-mfloat-abi=soft" "-mfloat-abi=softfp" } } */ #ifndef IN_FRAMEWORK #define VFP diff --git a/gcc/testsuite/gcc.target/arm/fp16-aapcs-1.c b/gcc/testsuite/gcc.target/arm/fp16-aapcs-1.c index 5eab3e2..049f9e3 100644 --- a/gcc/testsuite/gcc.target/arm/fp16-aapcs-1.c +++ b/gcc/testsuite/gcc.target/arm/fp16-aapcs-1.c @@ -1,17 +1,21 @@ /* { dg-do compile } */ /* { dg-require-effective-target arm_fp16_ok } */ -/* { dg-options "-mfp16-format=ieee -O2" } */ +/* { dg-options "-mfp16-format=ieee -mfloat-abi=hard -O2" } */ /* { dg-add-options arm_fp16 } */ +/* { dg-skip-if "" { *-*-* } { "-mfloat-abi=soft" "-mfloat-abi=softfp" } } */ -/* Test __fp16 arguments and return value in registers. */ +/* Test __fp16 arguments and return value in registers (hard-float). */ -__fp16 F (__fp16 a, __fp16 b, __fp16 c) +void +swap (__fp16, __fp16); + +__fp16 +F (__fp16 a, __fp16 b, __fp16 c) { - if (a == b) - return c; - return a; + swap (b, a); + return c; } -/* { 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 } } */ +/* { dg-final { scan-assembler-times {vmov\tr[0-9]+, s[0-2]} 2 } } */ +/* { dg-final { scan-assembler-times {vmov.f32\ts1, s0} 1 } } */ +/* { dg-final { scan-assembler-times {vmov\ts0, r[0-9]+} 2 } } */ diff --git a/gcc/testsuite/gcc.target/arm/fp16-aapcs-2.c b/gcc/testsuite/gcc.target/arm/fp16-aapcs-2.c new file mode 100644 index 0000000..546e650 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/fp16-aapcs-2.c @@ -0,0 +1,21 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target arm_fp16_ok } */ +/* { dg-options "-mfp16-format=ieee -mfloat-abi=softfp -O2" } */ +/* { dg-add-options arm_fp16 } */ +/* { dg-skip-if "" { *-*-* } { "-mfloat-abi=soft" "-mfloat-abi=hard" } } */ + +/* Test __fp16 arguments and return value in registers (softfp). */ + +void +swap (__fp16, __fp16); + +__fp16 +F (__fp16 a, __fp16 b, __fp16 c) +{ + swap (b, a); + return c; +} + +/* { dg-final { scan-assembler-times {mov\tr[0-9]+, r[0-2]} 3 } } */ +/* { dg-final { scan-assembler-times {mov\tr1, r0} 1 } } */ +/* { dg-final { scan-assembler-times {mov\tr0, r[0-9]+} 2 } } */ -- 2.1.4