RISC-V RV32I软浮点型lib在__muldf3中调用MUL和MULHU指令

Cli*_*nna 5 riscv

我正在使用当前的riscv-toolsPicoRV32内核构建固件映像.固件需要浮点,所以我正在使用-msoft-float.这是我正在使用的编译器/链接器选项:

-Os -m32 -march=RV32I -msoft-float -ffreestanding -nostdlib -lgcc
Run Code Online (Sandbox Code Playgroud)

在此配置中,__ muldf3由(根据链接器-Map输出)提供:

/opt/riscv/lib/gcc/riscv64-unknown-elf/4.9.2/soft-float/32/libgcc.a(dp-bit.o)
Run Code Online (Sandbox Code Playgroud)

但是这段代码与RV32I ISA不兼容:它使用MULMULHU指令!

如何获得普通RV32I ISA的软浮动?我需要编译自己的libgcc.a版本吗?有没有关于如何做到这一点的说明?

Chr*_*ris 3

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

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

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

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