On 07/10/2026 16:04, Christophe Lyon wrote:
> 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 {
> + ""
Could we try "{,-mfloat-abi=softfp ,-mfloat-abi=hard }-mfpu=auto" before trying
to force a specific FPU variant? I'd also tweak the order here as well,
running "", "-mfloat-abi=softfp" and "-mfloat-abi=hard" before the variants
that add -mfpu flags as well.
Having said that, given that this is a simple compile test, I doubt there will
be any case where -mfloat-abi=softfp will fail when -mfloat-abi=hard will then
succeed. There's nothing in this test that will hit the pathological cases
like system headers that only support one ABI variant.
R.
> + "-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