aboutsummaryrefslogtreecommitdiff
path: root/gcc/common/config/aarch64/aarch64-common.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/common/config/aarch64/aarch64-common.c')
-rw-r--r--gcc/common/config/aarch64/aarch64-common.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/gcc/common/config/aarch64/aarch64-common.c b/gcc/common/config/aarch64/aarch64-common.c
index 8d24c14..0bddcc8 100644
--- a/gcc/common/config/aarch64/aarch64-common.c
+++ b/gcc/common/config/aarch64/aarch64-common.c
@@ -391,7 +391,22 @@ aarch64_get_extension_string_for_isa_flags (uint64_t isa_flags,
/* We remove all the dependent bits, to prevent them from being turned
on twice. This only works because we assume that all there are
individual options to set all bits standalone. */
- isa_flag_bits &= ~opt->flags_on;
+
+ /* PR target/94396.
+
+ For flags which would already imply a bit that's on by default (e.g
+ fp16fml which implies +fp,+fp16) we must emit the flags that are not
+ on by default. i.e. in Armv8.4-a +fp16fml is default if +fp16. So
+ if a user passes armv8.4-a+fp16 (or +fp16fml) then we need to emit
+ +fp16. But if +fp16fml is used in an architecture where it is
+ completely optional we only have to emit the canonical flag. */
+ uint64_t toggle_bits = opt->flags_on & default_arch_flags;
+ /* Now check to see if the canonical flag is on by default. If it
+ is not then enabling it will enable all bits in flags_on. */
+ if ((opt->flag_canonical & default_arch_flags) == 0)
+ toggle_bits = opt->flags_on;
+
+ isa_flag_bits &= ~toggle_bits;
isa_flag_bits |= opt->flag_canonical;
}
}