diff options
author | Dimitar Dimitrov <dimitar@dinux.eu> | 2024-11-07 20:13:02 +0200 |
---|---|---|
committer | Dimitar Dimitrov <dimitar@dinux.eu> | 2024-11-19 19:08:15 +0200 |
commit | c9530a0e24e35a6fdce91b2002b798f44b62fd44 (patch) | |
tree | 07f00e1b168c1beb797d03cd25219e97a5996f80 | |
parent | ceddd28d41f0b9cc797c3568544a114d60c1ba83 (diff) | |
download | gcc-c9530a0e24e35a6fdce91b2002b798f44b62fd44.zip gcc-c9530a0e24e35a6fdce91b2002b798f44b62fd44.tar.gz gcc-c9530a0e24e35a6fdce91b2002b798f44b62fd44.tar.bz2 |
RISC-V: Tie MUL and DIV masks to the M extension
When configuring GCC for RV32EC with:
./configure \
--target=riscv32-none-elf \
--with-multilib-generator="rv32ec-ilp32e--" \
--with-abi=ilp32e \
--with-arch=rv32ec
Then the build fails because division is erroneously left enabled:
cc1: error: '-mdiv' requires '-march' to subsume the 'M' extension
-fself-test: 8412281 pass(es) in 0.647173 seconds
Fix by disabling MASK_DIV if multiplication is not available and -mdiv
option has not been explicitly passed.
Tested the above RV32EC-only toolchain using the GNU simulator:
=== gcc Summary ===
# of expected passes 211635
# of unexpected failures 3004
# of expected failures 1061
# of unresolved testcases 5651
# of unsupported tests 18958
gcc/ChangeLog:
* config/riscv/riscv.cc (riscv_override_options_internal):
Set division option's default to disabled if multiplication
is not available.
Signed-off-by: Dimitar Dimitrov <dimitar@dinux.eu>
-rw-r--r-- | gcc/config/riscv/riscv.cc | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc index 03271d8..b423344 100644 --- a/gcc/config/riscv/riscv.cc +++ b/gcc/config/riscv/riscv.cc @@ -10307,9 +10307,13 @@ riscv_override_options_internal (struct gcc_options *opts) const struct riscv_tune_info *cpu; /* The presence of the M extension implies that division instructions - are present, so include them unless explicitly disabled. */ + are present, so include them unless explicitly disabled. + Similarly, if the M extension is not available, then disable + division instructions, unless they are explicitly enabled. */ if (TARGET_MUL_OPTS_P (opts) && (target_flags_explicit & MASK_DIV) == 0) opts->x_target_flags |= MASK_DIV; + else if (!TARGET_MUL_OPTS_P (opts) && (target_flags_explicit & MASK_DIV) == 0) + opts->x_target_flags &= ~MASK_DIV; else if (!TARGET_MUL_OPTS_P (opts) && TARGET_DIV_OPTS_P (opts)) error ("%<-mdiv%> requires %<-march%> to subsume the %<M%> extension"); |