RISC-V RV32I soft float lib 在 __muldf3 中调用 MUL 和 MULHU 指令

RISC-V RV32I soft float lib calls MUL and MULHU instructions in __muldf3

我正在使用当前的 riscv-tools to build a firmware image for the PicoRV32 内核。固件需要浮点数,所以我使用 -msoft-float。这是我正在使用的 compiler/linker 选项:

-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 不兼容:它使用 MULMULHU 指令!

如何获得普通 RV32I ISA 的软浮点数?我需要编译我自己的 libgcc.a 版本吗?是否有关于如何执行此操作的说明?

如您所见,“-march=”标志仅影响当前翻译单元,而不影响在工具链构建时生成的库。

尽管存在用于构建工具链的 "disable-atomics"/"disable-float" 配置标志,但 multiply/divide 没有 multilib 选项,因为它们不影响 ABI;假设执行环境可以模拟这些指令。

最后一点,最新的 Privileged ISA v1.7 设计为您可以 运行 mul/div 代码,然后陷入机器模式以模拟 mul/div说明(您甚至可以在 运行处于 M 模式时陷入 M 模式!)。您必须在 M 模式下提供您自己的 mul 陷阱处理程序(可能位于您自己的 crt0 文件中并在编译时链接)。

我建议您尝试使用“--with-arch”标志。最近的补丁支持 --with-arch 标志,因此可以构建默认情况下不会生成 multiply/divide 的 gcc。这将防止 libgcc 包含这些指令。您可以尝试将 --with-arch=RV32I 添加到 gcc 配置行(为此,您必须修改 riscv-gnu-toolchain 中的 Makefile.in)。