arm_fp16_ok accepts a few -mfpu= overrides (*fp16*, vfpvN where N>=4,
*fp-armv8*), but exits early with -mfpu=auto even though the related
-march could include a valid FP option.
In addition, it is no longer necessary to check for such flags, since
modern DejaGnu gives them lower priority compared to the
dg-add-options directives from individual testcases.
Rework arm_fp16_ok to make it similar to arm_neon_ok and friends,
iterating over several sets of flags until a working combination is
found. Keep -mfpu=vfpv4 as in the original version.
Tested on:
-marm/-march=armv7-a/-mfloat-abi=soft
-marm/-march=armv7-a/-mfpu=vfpv3-d16/-mfloat-abi=softfp
-mthumb/-march=armv6s-m/-mtune=cortex-m0/-mfloat-abi=soft
-mthumb/-march=armv7-m/-mtune=cortex-m3/-mfloat-abi=softfp
-mthumb/-march=armv7e-m+fp/-mtune=cortex-m4/-mfloat-abi=hard
-mthumb/-march=armv7e-m+fp.dp/-mtune=cortex-m7/-mfloat-abi=hard
-mthumb/-march=armv8-m.base/-mtune=cortex-m23/-mfloat-abi=soft
-mthumb/-march=armv8-m.main+dsp+fp/-mtune=cortex-m33/-mfloat-abi=hard
-mthumb/-march=armv8.1-m.main+mve.fp+fp.dp/-mtune=cortex-m55/-mfloat-abi=hard
-mthumb/-march=armv7-a/-mfpu=vfpv3-d16/-mfloat-abi=softfp
-mthumb/-march=armv8-a+simd/-mfloat-abi=hard
The tests
gcc.target/arm/fp16-compile-vcvt.c
gcc.target/arm/fp16-rounding-alt-1.c
gcc.target/arm/vect-half-floats.c
now PASS on
* -marm/-march=armv7-a/-mfloat-abi=soft (was rejected because of
-mfloat-abi=soft)
* -mthumb/-march=armv7-a/-mfpu=vfpv3-d16/-mfloat-abi=softfp (was
rejected because of -mfpu=vfpv3-d16)
gcc.target/arm/vect-half-floats.c is UNSUPPORTED on
-mthumb/-march=armv8.1-m.main+mve.fp+fp.dp/-mtune=cortex-m55/-mfloat-abi=hard
thanks to the previous patch.
gcc/testsuite/ChangeLog:
* lib/target-supports.exp
(check_effective_target_arm_fp16_ok_nocache): Iterate to find
suitable flags.
---
gcc/testsuite/lib/target-supports.exp | 55 +++++++++++----------------
1 file changed, 23 insertions(+), 32 deletions(-)
diff --git a/gcc/testsuite/lib/target-supports.exp
b/gcc/testsuite/lib/target-supports.exp
index 803376006ae..5aa26f60866 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -6292,40 +6292,31 @@ proc add_options_for_arm_fp16_alternative { flags } {
# ARM only.
proc check_effective_target_arm_fp16_ok_nocache { } {
- global et_arm_fp16_flags
- set et_arm_fp16_flags ""
- if { ! [check_effective_target_arm32] } {
- return 0;
- }
- if [check-flags \
- [list "" { *-*-* } { "-mfpu=*" } \
- { "-mfpu=*fp16*" "-mfpu=*fpv[4-9]*" \
- "-mfpu=*fpv[1-9][0-9]*" "-mfpu=*fp-armv8*" } ]] {
- # Multilib flags would override -mfpu.
- return 0
- }
- if [check-flags [list "" { *-*-* } { "-mfloat-abi=soft" } { "" } ]] {
- # Must generate floating-point instructions.
+ if { ![istarget arm*-*-*] } {
return 0
}
- if [check_effective_target_arm_hf_eabi] {
- # Use existing float-abi and force an fpu which supports fp16
- set et_arm_fp16_flags "-mfpu=vfpv4"
- return 1;
- }
- if [check-flags [list "" { *-*-* } { "-mfpu=*" } { "" } ]] {
- # The existing -mfpu value is OK; use it, but add softfp.
- set et_arm_fp16_flags "-mfloat-abi=softfp"
- return 1;
- }
- # Add -mfpu for a VFP fp16 variant since there is no preprocessor
- # macro to check for this support.
- set flags "-mfpu=vfpv4 -mfloat-abi=softfp"
- if { [check_no_compiler_messages_nocache arm_fp16_ok assembly {
- int dummy;
- } "$flags"] } {
- set et_arm_fp16_flags "$flags"
- return 1
+ global et_arm_fp16_flags
+ set et_arm_fp16_flags ""
+ foreach flags {
+ ""
+ "-mfpu=vfpv4"
+ "-mfloat-abi=softfp"
+ "-mfloat-abi=softfp -mfpu=vfpv4"
+ "-mfloat-abi=hard"
+ "-mfloat-abi=hard -mfpu=vfpv4"
+ } {
+ if { [check_no_compiler_messages_nocache arm_fp16_ok assembly {
+ #ifndef __ARM_FP
+ #error __ARM_FP not defined
+ #endif
+ #if ((__ARM_FP & 2) == 0)
+ #error __ARM_FP indicates that half-precision floating point is not
supported
+ #endif
+ int dummy;
+ } "$flags"] } {
+ set et_arm_fp16_flags "$flags"
+ return 1
+ }
}
return 0
--
2.43.0