RISC-V RV32I библиотека со свободным плаванием вызывает инструкции MUL и MULHU в __muldf3
Я использую текущие инструменты riscv для создания образа прошивки для ядра PicoRV32. Прошивка требует плавающей запятой, поэтому я использую -msoft-float
, Это параметры компилятора / компоновщика, которые я использую:
-Os -m32 -march=RV32I -msoft-float -ffreestanding -nostdlib -lgcc
в этой конфигурации __muldf3 предоставляется (по словам компоновщиков -Map
выход):
/opt/riscv/lib/gcc/riscv64-unknown-elf/4.9.2/soft-float/32/libgcc.a(dp-bit.o)
Но этот код не совместим с RV32I ISA: он использует MUL
а также MULHU
инструкции!
Как мне получить soft-float для простого RV32I ISA? Нужно ли мне компилировать мою собственную версию libgcc.a? Где-нибудь есть инструкции, как это сделать?
1 ответ
Как вы заметили, флаг "-march=" влияет только на текущий модуль перевода, а не на библиотеки, которые генерируются во время сборки инструментария.
Несмотря на то, что существуют флаги конфигурации "disable-atomics"/"disable-float" для построения цепочки инструментов, нет опции multilib для умножения / деления, потому что они не влияют на ABI; Предполагается, что среда выполнения может эмулировать эти инструкции.
И, наконец, последняя версия Privileged ISA v1.7 разработана таким образом, что вы можете запускать код mul/div и затем переходить в машинный режим для эмуляции инструкций mul/div (вы даже можете переходить в M-режим во время работы в M-режим!). Вы должны будете предоставить свой собственный обработчик муль-ловушек в M-режиме (возможно, расположенный в вашем собственном файле crt0 и связанный во время компиляции).
Вместо этого я рекомендую попробовать флаг "--with-arch". Недавний патч поддерживает флаг --with-arch, поэтому можно создать gcc, который по умолчанию не будет генерировать умножение / деление. Это не позволит libgcc содержать эти инструкции. Вы можете попробовать добавить --with-arch=RV32I в строку конфигурации gcc (для этого вам нужно будет изменить Makefile.in в riscv-gnu-toolchain).