diff mbox

[5/7,Testsuite] Support ARMv8.1 ARM tests.

Message ID 56572ED9.2080108@foss.arm.com
State New
Headers show

Commit Message

Matthew Wahab Nov. 26, 2015, 4:10 p.m. UTC
Attached the missing patch.
Matthew

On 26/11/15 16:02, Matthew Wahab wrote:
> Hello,
>
> This patch adds ARMv8.1 support to GCC Dejagnu, to allow ARM
> tests to specify targest and to set up command line options.
> It builds on the ARMv8.1 target support added for AArch64 tests, partly
> reworking that support to take into account the different configurations
> that tests may be run under.
>
> The main changes are
> - add_options_for_arm_v8_1a_neon: Call
>    check_effective_target_arm_v8_1a_neon_ok to select a suitable set of
>    options.
> - check_effective_target_arm_v8_1a_neon_ok: Test possible command line
>    options, recording the first set that works.
> - check_effective_target_arm_v8_1a_neon_hw: Add a test for ARM targets.
>
> Tested the series for arm-none-eabi with cross-compiled check-gcc on an
> ARMv8.1 emulator. Also tested arm-none-linux-gnueabihf with native
> bootstrap and make check.
>
> Ok for trunk?
> Matthew
>
> testsuite/
> 2015-11-26  Matthew Wahab  <matthew.wahab@arm.com>
>
>      * lib/target-supports.exp (add_options_for_arm_v8_1a_neon): Update
>      comment.  Use check_effetive_target_arm_v8_1a_neon_ok to select
>      the command line options.
>      (check_effective_target_arm_v8_1a_neon_ok_nocache): Update initial
>      test to allow ARM targets.  Select and record a working set of
>      command line options.
>      (check_effective_target_arm_v8_1a_neon_hw): Add tests for ARM
>      targets.
>

Comments

Christophe Lyon Nov. 27, 2015, 1:44 p.m. UTC | #1
On 26 November 2015 at 17:10, Matthew Wahab <matthew.wahab@foss.arm.com> wrote:
> Attached the missing patch.
> Matthew
>
>
> On 26/11/15 16:02, Matthew Wahab wrote:
>>
>> Hello,
>>
>> This patch adds ARMv8.1 support to GCC Dejagnu, to allow ARM
>> tests to specify targest and to set up command line options.
>> It builds on the ARMv8.1 target support added for AArch64 tests, partly
>> reworking that support to take into account the different configurations
>> that tests may be run under.
>>
>> The main changes are
>> - add_options_for_arm_v8_1a_neon: Call
>>    check_effective_target_arm_v8_1a_neon_ok to select a suitable set of
>>    options.
>> - check_effective_target_arm_v8_1a_neon_ok: Test possible command line
>>    options, recording the first set that works.
>> - check_effective_target_arm_v8_1a_neon_hw: Add a test for ARM targets.
>>
>> Tested the series for arm-none-eabi with cross-compiled check-gcc on an
>> ARMv8.1 emulator. Also tested arm-none-linux-gnueabihf with native
>> bootstrap and make check.
>>
>> Ok for trunk?
>> Matthew
>>

Hi Matthew,

I may be mistaken, but -mfpu=neon-fp-armv8 and -mfloat-abi=softfp are not
supported by aarch64-gcc. So it seems to me that
check_effective_target_arm_v8_1a_neon_ok_nocache will not always work
for aarch64 after your patch.

Or does it work because no option is needed and thus "" always
matches and thus the loop always exits after the first iteration
on aarch64?

Maybe a more accurate comment would help remembering that, in case
-mfpu option becomes necessary for aarch64.

Christophe.



>> testsuite/
>> 2015-11-26  Matthew Wahab  <matthew.wahab@arm.com>
>>
>>      * lib/target-supports.exp (add_options_for_arm_v8_1a_neon): Update
>>      comment.  Use check_effetive_target_arm_v8_1a_neon_ok to select
>>      the command line options.
>>      (check_effective_target_arm_v8_1a_neon_ok_nocache): Update initial
>>      test to allow ARM targets.  Select and record a working set of
>>      command line options.
>>      (check_effective_target_arm_v8_1a_neon_hw): Add tests for ARM
>>      targets.
>>
>
Matthew Wahab Nov. 27, 2015, 5:10 p.m. UTC | #2
On 27/11/15 13:44, Christophe Lyon wrote:
>> On 26/11/15 16:02, Matthew Wahab wrote:

>>> This patch adds ARMv8.1 support to GCC Dejagnu, to allow ARM
>>> tests to specify targest and to set up command line options.
>>> It builds on the ARMv8.1 target support added for AArch64 tests, partly
>>> reworking that support to take into account the different configurations
>>> that tests may be run under.

> I may be mistaken, but -mfpu=neon-fp-armv8 and -mfloat-abi=softfp are not
> supported by aarch64-gcc. So it seems to me that
> check_effective_target_arm_v8_1a_neon_ok_nocache will not always work
> for aarch64 after your patch.

> Or does it work because no option is needed and thus "" always
> matches and thus the loop always exits after the first iteration
> on aarch64?

Yes, the idea is that the empty string will make the function first try 
'-march=armv8.1-a' without any other flag. That will work for AArch64 because it 
doesn't need any other option.

> Maybe a more accurate comment would help remembering that, in case
> -mfpu option becomes necessary for aarch64.
>

Agreed, it's worth having a comment to explain what the 'foreach' construct is doing.

Matthew
Matthew Wahab Nov. 27, 2015, 5:11 p.m. UTC | #3
On 27/11/15 13:44, Christophe Lyon wrote:
>> On 26/11/15 16:02, Matthew Wahab wrote:

>>> This patch adds ARMv8.1 support to GCC Dejagnu, to allow ARM
>>> tests to specify targest and to set up command line options.
>>> It builds on the ARMv8.1 target support added for AArch64 tests, partly
>>> reworking that support to take into account the different configurations
>>> that tests may be run under.

> I may be mistaken, but -mfpu=neon-fp-armv8 and -mfloat-abi=softfp are not
> supported by aarch64-gcc. So it seems to me that
> check_effective_target_arm_v8_1a_neon_ok_nocache will not always work
> for aarch64 after your patch.

> Or does it work because no option is needed and thus "" always
> matches and thus the loop always exits after the first iteration
> on aarch64?

Yes, the idea is that the empty string will make the function first try 
'-march=armv8.1-a' without any other flag. That will work for AArch64 because it 
doesn't need any other option.

> Maybe a more accurate comment would help remembering that, in case
> -mfpu option becomes necessary for aarch64.
>

Agreed, it's worth having a comment to explain what the 'foreach' construct is doing.

Matthew
diff mbox

Patch

From 6f767289ce83be88bc088c7adf66d137ed335762 Mon Sep 17 00:00:00 2001
From: Matthew Wahab <matthew.wahab@arm.com>
Date: Fri, 9 Oct 2015 17:38:12 +0100
Subject: [PATCH 5/7] [Testsuite] Support ARMv8.1 NEON on ARM.

Change-Id: I35436b64996789d54f215d66ed4b0ec5ffe48e37
---
 gcc/testsuite/lib/target-supports.exp | 56 +++++++++++++++++++++++++----------
 1 file changed, 41 insertions(+), 15 deletions(-)

diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index dcd51fd..34bb45d 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -2816,14 +2816,15 @@  proc add_options_for_arm_v8_neon { flags } {
     return "$flags $et_arm_v8_neon_flags -march=armv8-a"
 }
 
-# Add the options needed for ARMv8.1 Adv.SIMD.
+# Add the options needed for ARMv8.1 Adv.SIMD.  Also adds the ARMv8 NEON
+# options for AArch64 and for ARM.
 
 proc add_options_for_arm_v8_1a_neon { flags } {
-    if { [istarget aarch64*-*-*] } {
-	return "$flags -march=armv8.1-a"
-    } else {
+    if { ! [check_effective_target_arm_v8_1a_neon_ok] } {
 	return "$flags"
     }
+    global et_arm_v8_1a_neon_flags
+    return "$flags $et_arm_v8_1a_neon_flags -march=armv8.1-a"
 }
 
 proc add_options_for_arm_crc { flags } {
@@ -3271,17 +3272,29 @@  proc check_effective_target_arm_neonv2_hw { } {
 }
 
 # Return 1 if the target supports the ARMv8.1 Adv.SIMD extension, 0
-# otherwise.  The test is valid for AArch64.
+# otherwise.  The test is valid for AArch64 and ARM.
 
 proc check_effective_target_arm_v8_1a_neon_ok_nocache { } {
-    if { ![istarget aarch64*-*-*] } {
-	return 0
+    global et_arm_v8_1a_neon_flags
+    set et_arm_v8_1a_neon_flags ""
+
+    if { ![istarget arm*-*-*] && ![istarget aarch64*-*-*] } {
+	return 0;
     }
-    return [check_no_compiler_messages_nocache arm_v8_1a_neon_ok assembly {
-	#if !defined (__ARM_FEATURE_QRDMX)
-	#error "__ARM_FEATURE_QRDMX not defined"
-	#endif
-    } [add_options_for_arm_v8_1a_neon ""]]
+
+    foreach flags {"" "-mfpu=neon-fp-armv8" "-mfloat-abi=softfp" \
+		       "-mfpu=neon-fp-armv8 -mfloat-abi=softfp"} {
+	if { [check_no_compiler_messages_nocache arm_v8_1a_neon_ok object {
+	    #if !defined (__ARM_FEATURE_QRDMX)
+	    #error "__ARM_FEATURE_QRDMX not defined"
+	    #endif
+	} "$flags -march=armv8.1-a"] } {
+	    set et_arm_v8_1a_neon_flags "$flags -march=armv8.1-a"
+	    return 1
+	}
+    }
+
+    return 0;
 }
 
 proc check_effective_target_arm_v8_1a_neon_ok { } {
@@ -3308,16 +3321,17 @@  proc check_effective_target_arm_v8_neon_hw { } {
 }
 
 # Return 1 if the target supports executing the ARMv8.1 Adv.SIMD extension, 0
-# otherwise.  The test is valid for AArch64.
+# otherwise.  The test is valid for AArch64 and ARM.
 
 proc check_effective_target_arm_v8_1a_neon_hw { } {
     if { ![check_effective_target_arm_v8_1a_neon_ok] } {
 	return 0;
     }
-    return [check_runtime_nocache arm_v8_1a_neon_hw_available {
+    return [check_runtime arm_v8_1a_neon_hw_available {
 	int
 	main (void)
 	{
+	  #ifdef __ARM_ARCH_ISA_A64
 	  __Int32x2_t a = {0, 1};
 	  __Int32x2_t b = {0, 2};
 	  __Int32x2_t result;
@@ -3327,9 +3341,21 @@  proc check_effective_target_arm_v8_1a_neon_hw { } {
 	       : "w"(a), "w"(b)
 	       : /* No clobbers.  */);
 
+	  #else
+
+	  __simd64_int32_t a = {0, 1};
+	  __simd64_int32_t b = {0, 2};
+	  __simd64_int32_t result;
+
+	  asm ("vqrdmlah.s32 %P0, %P1, %P2"
+	       : "=w"(result)
+	       : "w"(a), "w"(b)
+	       : /* No clobbers.  */);
+	  #endif
+
 	  return result[0];
 	}
-    }  [add_options_for_arm_v8_1a_neon ""]]
+    } [add_options_for_arm_v8_1a_neon ""]]
 }
 
 # Return 1 if this is a ARM target with NEON enabled.
-- 
2.1.4