diff mbox

[ARM] Fix, add tests for FP16 aapcs.

Message ID 57598992.8090106@foss.arm.com
State New
Headers show

Commit Message

Matthew Wahab June 9, 2016, 3:21 p.m. UTC
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

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.

Comments

Christophe Lyon June 10, 2016, 8:32 a.m. UTC | #1
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.
Matthew Wahab June 10, 2016, 1:56 p.m. UTC | #2
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
Christophe Lyon June 10, 2016, 2:22 p.m. UTC | #3
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
>
Matthew Wahab June 10, 2016, 2:30 p.m. UTC | #4
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
diff mbox

Patch

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