Some tests require double-precision support, but the existing
arm_fp_ok effective-target only checks if hardware floating-point is
available, not what level. So this patch adds a new arm_fp_dp_ok
effective-target to check that double-precision is supported.

2020-03-24  Christophe Lyon  <christophe.l...@linaro.org>

        gcc/
        * doc/sourcebuild.texi (ARM-specific attributes): Add
        arm_fp_dp_ok.
        (Features for dg-add-options): Add arm_fp_dp.

        gcc/testsuite/
        * lib/target-supports.exp
        (check_effective_target_arm_fp_dp_ok_nocache): New.
        (check_effective_target_arm_fp_dp_ok): New.
        (add_options_for_arm_fp_dp): New.
---
 gcc/doc/sourcebuild.texi              | 11 +++++++++
 gcc/testsuite/lib/target-supports.exp | 44 +++++++++++++++++++++++++++++++++++
 2 files changed, 55 insertions(+)

diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi
index eef1432..91b46cc 100644
--- a/gcc/doc/sourcebuild.texi
+++ b/gcc/doc/sourcebuild.texi
@@ -1733,6 +1733,12 @@ ARM target defines @code{__ARM_FP} using 
@code{-mfloat-abi=softfp} or
 equivalent options.  Some multilibs may be incompatible with these
 options.
 
+@item arm_fp_dp_ok
+@anchor{arm_fp_dp_ok}
+ARM target defines @code{__ARM_FP} with double-precision support using
+@code{-mfloat-abi=softfp} or equivalent options.  Some multilibs may
+be incompatible with these options.
+
 @item arm_hf_eabi
 ARM target adheres to the VFP and Advanced SIMD Register Arguments
 variant of the ABI for the ARM Architecture (as selected with
@@ -2504,6 +2510,11 @@ are:
 in certain modes; see the @ref{arm_fp_ok,,arm_fp_ok effective target
 keyword}.
 
+@item arm_fp_dp
+@code{__ARM_FP} definition with double-precision support.  Only ARM
+targets support this feature, and only then in certain modes; see the
+@ref{arm_fp_dp_ok,,arm_fp_dp_ok effective target keyword}.
+
 @item arm_neon
 NEON support.  Only ARM targets support this feature, and only then
 in certain modes; see the @ref{arm_neon_ok,,arm_neon_ok effective target
diff --git a/gcc/testsuite/lib/target-supports.exp 
b/gcc/testsuite/lib/target-supports.exp
index 4413c26..332611c 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -3679,6 +3679,50 @@ proc add_options_for_arm_fp { flags } {
     return "$flags $et_arm_fp_flags"
 }
 
+# Return 1 if this is an ARM target defining __ARM_FP with
+# double-precision support. We may need -mfloat-abi=softfp or
+# equivalent options.  Some multilibs may be incompatible with these
+# options.  Also set et_arm_fp_dp_flags to the best options to add.
+
+proc check_effective_target_arm_fp_dp_ok_nocache { } {
+    global et_arm_fp_dp_flags
+    set et_arm_fp_dp_flags ""
+    if { [check_effective_target_arm32] } {
+       foreach flags {"" "-mfloat-abi=softfp" "-mfloat-abi=hard"} {
+           if { [check_no_compiler_messages_nocache arm_fp_dp_ok object {
+               #ifndef __ARM_FP
+               #error __ARM_FP not defined
+               #endif
+               #if ((__ARM_FP & 8) == 0)
+               #error __ARM_FP indicates that double-precision is not supported
+               #endif
+           } "$flags"] } {
+               set et_arm_fp_dp_flags $flags
+               return 1
+           }
+       }
+    }
+
+    return 0
+}
+
+proc check_effective_target_arm_fp_dp_ok { } {
+    return [check_cached_effective_target arm_fp_dp_ok \
+               check_effective_target_arm_fp_dp_ok_nocache]
+}
+
+# Add the options needed to define __ARM_FP with double-precision
+# support.  We need either -mfloat-abi=softfp or -mfloat-abi=hard, but
+# if one is already specified by the multilib, use it.
+
+proc add_options_for_arm_fp_dp { flags } {
+    if { ! [check_effective_target_arm_fp_dp_ok] } {
+       return "$flags"
+    }
+    global et_arm_fp_dp_flags
+    return "$flags $et_arm_fp_dp_flags"
+}
+
 # Return 1 if this is an ARM target that supports DSP multiply with
 # current multilib flags.
 
-- 
2.7.4

Reply via email to