diff mbox

[ARM] Fix, add tests for FP16 aapcs.

Message ID 5770F8DE.7040704@foss.arm.com
State New
Headers show

Commit Message

Matthew Wahab June 27, 2016, 9:58 a.m. UTC
On 10/06/16 15:30, Matthew Wahab wrote:
 > 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 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.
 >

Sorry for the delay. I've added effective-target requirements to the
tests to check for hard-fp and for VFP (i.e. non-neon) FP16 support. The
directives for the VFP FP16 support are new. I've split them out to a
separate patch, both patches are attached.

The first patch adds:

- effective-target keywords arm_fp16_ok and arm_fp16_hw to check for
   compiler and hardware support for FP16.

- add-options features arm_fp16_ieee and arm_fp16_alternative, to
   enable FP16 IEEE format and FP16 ARM Alternative format support

Note that the existing add-options feature arm_fp16 enables the default
FP16 format (fp16-format=none).

The second patch updates the tests to use these directives. It also
reworks gcc.target/arm/fp16-aapcs-1.c test is also reworked to focus on
argument passing and return values adds a softfp variant as
fp16-aapcs-2.c.

As before, checked for arm-none-eabi with cross-compiled check-gcc and
arm-linux-gnueabihf with native make check. I also ran the tests for
cross-compiled arm-none-eabi with -mcpu=Cortex-M3.

Ok for trunk?
Matthew

PATCH 1/2 ChangeLog
gcc/
2016-06-27  Matthew Wahab  <matthew.wahab@arm.com>

	* doc/sourcebuild.texi (Effective-Target keywords): Add entries
	for arm_fp16_ok and arm_fp16_hw.
	(Add Options): Add entries for arm_fp16, arm_fp16_ieee and
	arm_fp16_alternative.

testsuite/
2016-06-27  Matthew Wahab  <matthew.wahab@arm.com>

	* lib/target-supports.exp (add_options_for arm_fp16): Reword
	comment.
	(add_options_for_arm_fp16_ieee): New.
	(add_options_for_arm_fp16_alternative): New.
	(check_effective_target_arm_fp16_ok_nocache): Add to comment.  Fix a
	long-line.
	(check_effective_target_arm_fp16_hw): New.

PATCH 2/2 ChangeLog
testsuite/
2016-06-27  Matthew Wahab  <matthew.wahab@arm.com>

	* testsuite/gcc.target/arm/aapcs/neon-vect10.c: Require
	-mfloat-ab=hard.  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.  Also add
	options for ARM FP16 IEEE format.
	* 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: Require
	-mfloat-ab=hard.  Also simplify the test.
	* testsuite/gcc.target/arm/fp16-aapcs-2.c: New.

Comments

Christophe Lyon June 29, 2016, 8:26 a.m. UTC | #1
On 27 June 2016 at 11:58, Matthew Wahab <matthew.wahab@foss.arm.com> wrote:
> On 10/06/16 15:30, Matthew Wahab wrote:
>> 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 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.
>>
>
> Sorry for the delay. I've added effective-target requirements to the
> tests to check for hard-fp and for VFP (i.e. non-neon) FP16 support. The
> directives for the VFP FP16 support are new. I've split them out to a
> separate patch, both patches are attached.
>

I have run validations with the 2 patches applied, and the result
looks OK to me, FWIW.

Thanks,

Christophe.

> The first patch adds:
>
> - effective-target keywords arm_fp16_ok and arm_fp16_hw to check for
>   compiler and hardware support for FP16.
>
> - add-options features arm_fp16_ieee and arm_fp16_alternative, to
>   enable FP16 IEEE format and FP16 ARM Alternative format support
>
> Note that the existing add-options feature arm_fp16 enables the default
> FP16 format (fp16-format=none).
>
> The second patch updates the tests to use these directives. It also
> reworks gcc.target/arm/fp16-aapcs-1.c test is also reworked to focus on
> argument passing and return values adds a softfp variant as
> fp16-aapcs-2.c.
>
> As before, checked for arm-none-eabi with cross-compiled check-gcc and
> arm-linux-gnueabihf with native make check. I also ran the tests for
> cross-compiled arm-none-eabi with -mcpu=Cortex-M3.
>
> Ok for trunk?
> Matthew
>
> PATCH 1/2 ChangeLog
> gcc/
> 2016-06-27  Matthew Wahab  <matthew.wahab@arm.com>
>
>         * doc/sourcebuild.texi (Effective-Target keywords): Add entries
>         for arm_fp16_ok and arm_fp16_hw.
>         (Add Options): Add entries for arm_fp16, arm_fp16_ieee and
>         arm_fp16_alternative.
>
> testsuite/
> 2016-06-27  Matthew Wahab  <matthew.wahab@arm.com>
>
>         * lib/target-supports.exp (add_options_for arm_fp16): Reword
>         comment.
>         (add_options_for_arm_fp16_ieee): New.
>         (add_options_for_arm_fp16_alternative): New.
>         (check_effective_target_arm_fp16_ok_nocache): Add to comment.  Fix a
>         long-line.
>         (check_effective_target_arm_fp16_hw): New.
>
> PATCH 2/2 ChangeLog
> testsuite/
> 2016-06-27  Matthew Wahab  <matthew.wahab@arm.com>
>
>         * testsuite/gcc.target/arm/aapcs/neon-vect10.c: Require
>         -mfloat-ab=hard.  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.  Also add
>         options for ARM FP16 IEEE format.
>         * 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: Require
>         -mfloat-ab=hard.  Also simplify the test.
>         * testsuite/gcc.target/arm/fp16-aapcs-2.c: New.
>
Ramana Radhakrishnan June 29, 2016, 8:35 a.m. UTC | #2
On Mon, Jun 27, 2016 at 10:58 AM, Matthew Wahab
<matthew.wahab@foss.arm.com> wrote:
> On 10/06/16 15:30, Matthew Wahab wrote:
>> 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 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.
>>
>
> Sorry for the delay. I've added effective-target requirements to the
> tests to check for hard-fp and for VFP (i.e. non-neon) FP16 support. The
> directives for the VFP FP16 support are new. I've split them out to a
> separate patch, both patches are attached.
>
> The first patch adds:
>
> - effective-target keywords arm_fp16_ok and arm_fp16_hw to check for
>   compiler and hardware support for FP16.
>
> - add-options features arm_fp16_ieee and arm_fp16_alternative, to
>   enable FP16 IEEE format and FP16 ARM Alternative format support
>
> Note that the existing add-options feature arm_fp16 enables the default
> FP16 format (fp16-format=none).
>
> The second patch updates the tests to use these directives. It also
> reworks gcc.target/arm/fp16-aapcs-1.c test is also reworked to focus on
> argument passing and return values adds a softfp variant as
> fp16-aapcs-2.c.
>
> As before, checked for arm-none-eabi with cross-compiled check-gcc and
> arm-linux-gnueabihf with native make check. I also ran the tests for
> cross-compiled arm-none-eabi with -mcpu=Cortex-M3.
>
> Ok for trunk?

Ok

Thanks,
Ramana





> Matthew
>
> PATCH 1/2 ChangeLog
> gcc/
> 2016-06-27  Matthew Wahab  <matthew.wahab@arm.com>
>
>         * doc/sourcebuild.texi (Effective-Target keywords): Add entries
>         for arm_fp16_ok and arm_fp16_hw.
>         (Add Options): Add entries for arm_fp16, arm_fp16_ieee and
>         arm_fp16_alternative.
>
> testsuite/
> 2016-06-27  Matthew Wahab  <matthew.wahab@arm.com>
>
>         * lib/target-supports.exp (add_options_for arm_fp16): Reword
>         comment.
>         (add_options_for_arm_fp16_ieee): New.
>         (add_options_for_arm_fp16_alternative): New.
>         (check_effective_target_arm_fp16_ok_nocache): Add to comment.  Fix a
>         long-line.
>         (check_effective_target_arm_fp16_hw): New.
>
> PATCH 2/2 ChangeLog
> testsuite/
> 2016-06-27  Matthew Wahab  <matthew.wahab@arm.com>
>
>         * testsuite/gcc.target/arm/aapcs/neon-vect10.c: Require
>         -mfloat-ab=hard.  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.  Also add
>         options for ARM FP16 IEEE format.
>         * 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: Require
>         -mfloat-ab=hard.  Also simplify the test.
>         * testsuite/gcc.target/arm/fp16-aapcs-2.c: New.
>
diff mbox

Patch

From 770e71af35f6e7f4e78409121e50ffb05a013645 Mon Sep 17 00:00:00 2001
From: Matthew Wahab <matthew.wahab@arm.com>
Date: Wed, 15 Jun 2016 09:20:31 +0100
Subject: [PATCH 2/2] [ARM] Fix, add tests for FP16 aapcs.

2016-06-27  Matthew Wahab  <matthew.wahab@arm.com>

	* testsuite/gcc.target/arm/aapcs/neon-vect10.c: Require
	-mfloat-ab=hard.  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: Require
	-mfloat-ab=hard.  Also simplify the test.
	* 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       |  7 ++++---
 gcc/testsuite/gcc.target/arm/aapcs/vfp19.c       |  9 +++++----
 gcc/testsuite/gcc.target/arm/aapcs/vfp20.c       |  9 +++++----
 gcc/testsuite/gcc.target/arm/aapcs/vfp21.c       |  9 +++++----
 gcc/testsuite/gcc.target/arm/fp16-aapcs-1.c      | 24 ++++++++++++++----------
 gcc/testsuite/gcc.target/arm/fp16-aapcs-2.c      | 21 +++++++++++++++++++++
 8 files changed, 58 insertions(+), 27 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..788079b 100644
--- a/gcc/testsuite/gcc.target/arm/aapcs/neon-vect10.c
+++ b/gcc/testsuite/gcc.target/arm/aapcs/neon-vect10.c
@@ -1,7 +1,8 @@ 
 /* 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_hard_vfp_ok }  */
+/* { dg-require-effective-target arm_neon_fp16_hw } */
 /* { dg-add-options arm_neon_fp16 } */
 
 #ifndef IN_FRAMEWORK
diff --git a/gcc/testsuite/gcc.target/arm/aapcs/neon-vect9.c b/gcc/testsuite/gcc.target/arm/aapcs/neon-vect9.c
index fc2b13b..b42fdd2 100644
--- a/gcc/testsuite/gcc.target/arm/aapcs/neon-vect9.c
+++ b/gcc/testsuite/gcc.target/arm/aapcs/neon-vect9.c
@@ -1,7 +1,8 @@ 
 /* 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_hard_vfp_ok }  */
+/* { dg-require-effective-target arm_neon_fp16_hw } */
 /* { dg-add-options arm_neon_fp16 } */
 
 #ifndef IN_FRAMEWORK
diff --git a/gcc/testsuite/gcc.target/arm/aapcs/vfp18.c b/gcc/testsuite/gcc.target/arm/aapcs/vfp18.c
index 225e9ce..0745a82 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) */
+/* 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" } */
+/* { dg-require-effective-target arm_hard_vfp_ok }  */
+/* { dg-require-effective-target arm_fp16_hw }  */
+/* { dg-add-options arm_fp16_ieee }  */
 
 #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..950c1f6 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) */
+/* 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" } */
+/* { dg-do run { target arm_eabi } }  */
+/* { dg-require-effective-target arm_hard_vfp_ok }  */
+/* { dg-require-effective-target arm_fp16_hw }  */
+/* { dg-add-options arm_fp16_ieee }  */
 
 #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..f898d4c 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) */
+/* 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" } */
+/* { dg-do run { target arm_eabi } }  */
+/* { dg-require-effective-target arm_hard_vfp_ok }  */
+/* { dg-require-effective-target arm_fp16_hw }  */
+/* { dg-add-options arm_fp16_ieee }  */
 
 #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..48bb598 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) */
+/* 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" } */
+/* { dg-do run { target arm_eabi } }  */
+/* { dg-require-effective-target arm_hard_vfp_ok }  */
+/* { dg-require-effective-target arm_fp16_hw }  */
+/* { dg-add-options arm_fp16_ieee }  */
 
 #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..9bf3fc0 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_hard_vfp_ok }  */
 /* { dg-require-effective-target arm_fp16_ok } */
-/* { dg-options "-mfp16-format=ieee -O2" }  */
-/* { dg-add-options arm_fp16 } */
+/* { dg-options "-O2" }  */
+/* { dg-add-options arm_fp16_ieee } */
 
-/* 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..4753e36
--- /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 "-mfloat-abi=softfp -O2" }  */
+/* { dg-add-options arm_fp16_ieee } */
+/* { dg-skip-if "incompatible float-abi" { arm*-*-* } { "-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