Hi all,

Currently on AArch32, invoking with -march=armv8.2-a+dotprod -mfpu=neon
incorrectly enables armv7 dotproduct. This patch restricts dotproduct to armv8
to correct the issue.

When using a float ABI different from that of the host platform, including
/usr/include/gnu/stubs.h errors due to a non-existent stubs-soft.h file, so
an inclusion of a standard header file is required to compile successfully and
find the correct float ABI to select in
check_effective_target_arm_v8_2a_dotprod_neon_ok_nocache.

Bootstrapped and regression tested on arm-none-linux-gnueabihf with no
regressions.

OK for trunk?

gcc/ChangeLog:

2018-11-23  Sam Tebbs<sam.te...@arm.com>

        * config/arm/arm.h (TARGET_DOTPROD): Add TARGET_VFP5 constraint.

gcc/testsuite/ChangeLog:

2018-11-23  Sam Tebbs<sam.te...@arm.com>

        * gcc.target/arm/neon-dotprod-restriction.c: New file.
         * lib/target-supports.exp
         (check_effective_target_arm_v8_2a_dotprod_neon_ok_nocache):
         Include stdint.h.

diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
index 8472312487b50d93edf47cd31660efd6bc043387..ab63fc5797a12c172ed77437b65388dd115146f3 100644
--- a/gcc/config/arm/arm.h
+++ b/gcc/config/arm/arm.h
@@ -214,7 +214,7 @@ extern tree arm_fp16_type_node;
 #define TARGET_NEON_RDMA (TARGET_NEON && arm_arch8_1)
 
 /* Supports the Dot Product AdvSIMD extensions.  */
-#define TARGET_DOTPROD (TARGET_NEON					\
+#define TARGET_DOTPROD (TARGET_NEON && TARGET_VFP5			\
 			&& bitmap_bit_p (arm_active_target.isa,		\
 					isa_bit_dotprod)		\
 			&& arm_arch8_2)
diff --git a/gcc/testsuite/gcc.target/arm/neon-dotprod-restriction.c b/gcc/testsuite/gcc.target/arm/neon-dotprod-restriction.c
new file mode 100644
index 0000000000000000000000000000000000000000..41a8992ff2a08af8ebd53f8f1ed5dcf67d86ddd3
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/neon-dotprod-restriction.c
@@ -0,0 +1,6 @@
+/* { dg-do "compile" } */
+/* { dg-options "-march=armv8.2-a+dotprod -mfpu=neon" } */
+
+#ifdef __ARM_FEATURE_DOTPROD
+#error Dot product is enabled when it should not be
+#endif
diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index c2a944738ccf8e1efc5249d0420ddeac1934cb31..06831627462435c10a1d7040bbeeba31037db949 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -4400,6 +4400,7 @@ proc check_effective_target_arm_v8_2a_dotprod_neon_ok_nocache { } {
     foreach flags {"" "-mfloat-abi=softfp -mfpu=neon-fp-armv8" "-mfloat-abi=hard -mfpu=neon-fp-armv8"} {
         if { [check_no_compiler_messages_nocache \
                   arm_v8_2a_dotprod_neon_ok object {
+	    #include <stdint.h>
             #if !defined (__ARM_FEATURE_DOTPROD)
             #error "__ARM_FEATURE_DOTPROD not defined"
             #endif

Reply via email to