On 10/12/15 10:49, Ramana Radhakrishnan wrote:
On Mon, Dec 7, 2015 at 4:10 PM, Matthew Wahab <matthew.wa...@foss.arm.com>
wrote:
On 27/11/15 17:11, Matthew Wahab wrote:
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.
[..]
# 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. Record the command +# line options that needed.
s/that//
Fixed in attached patch.
Can you also make sure doc/sourcebuild.texi is updated for this helper function
?
If not documented,it would be good to add the documentation for the same while
you
are here.
Done, I've listed them as ARM attributes based on their names.
Tested this and the other update patch (#4/7) for arm-none-eabi with
cross-compiled
check-gcc by running the gcc.target/aarch64/advsimd-intrinsics with and without
ARMv8.1 enabled as a test target.
Ok?
Matthew
testsuite/
2015-12-14 Matthew Wahab <matthew.wa...@arm.com>
* lib/target-supports.exp (add_options_for_arm_v8_1a_neon): Update
comment. Use check_effective_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.
gcc/
2015-12-14 Matthew Wahab <matthew.wa...@arm.com>
* doc/sourcebuild.texi (ARM-specific attributes): Add
"arm_v8_1a_neon_ok" and "arm_v8_1a_neon_hw".
>From d6a4dfd89cfb29aeaa0e2d58ac9d8271b31879c1 Mon Sep 17 00:00:00 2001
From: Matthew Wahab <matthew.wa...@arm.com>
Date: Fri, 9 Oct 2015 17:38:12 +0100
Subject: [PATCH 5/7] [Testsuite] Support ARMv8.1 NEON on ARM.
---
gcc/doc/sourcebuild.texi | 9 ++++++
gcc/testsuite/lib/target-supports.exp | 60 ++++++++++++++++++++++++++---------
2 files changed, 54 insertions(+), 15 deletions(-)
diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi
index 61de4a5..cd49e6d8 100644
--- a/gcc/doc/sourcebuild.texi
+++ b/gcc/doc/sourcebuild.texi
@@ -1582,6 +1582,15 @@ Some multilibs may be incompatible with these options.
ARM target supports @code{-mfpu=neon-fp-armv8 -mfloat-abi=softfp}.
Some multilibs may be incompatible with these options.
+@item arm_v8_1a_neon_ok
+ARM target supports options to generate ARMv8.1 Adv.SIMD instructions.
+Some multilibs may be incompatible with these options.
+
+@item arm_v8_1a_neon_hw
+ARM target supports executing ARMv8.1 Adv.SIMD instructions. Some
+multilibs may be incompatible with the options needed. Implies
+arm_v8_1a_neon_ok.
+
@item arm_prefer_ldrd_strd
ARM target prefers @code{LDRD} and @code{STRD} instructions over
@code{LDM} and @code{STM} instructions.
diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index 8d28b23..a0de314 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -2825,14 +2825,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 } {
@@ -3280,17 +3281,33 @@ 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. Record the command
+# line options needed.
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 ""]]
+
+ # Iterate through sets of options to find the compiler flags that
+ # need to be added to the -march option. Start with the empty set
+ # since AArch64 only needs the -march setting.
+ 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 { } {
@@ -3317,16 +3334,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;
@@ -3336,9 +3354,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