【问题标题】:RISC-V RV32I soft float lib calls MUL and MULHU instructions in __muldf3RISC-V RV32I 软浮点库在 __muldf3 中调用 MUL 和 MULHU 指令
【发布时间】:2015-09-10 10:11:02
【问题描述】:

我正在使用当前的riscv-toolsPicoRV32 内核构建固件映像。固件需要浮点,所以我使用-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 不兼容:它使用 MULMULHU 指令!

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

【问题讨论】:

    标签: riscv


    【解决方案1】:

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

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

    最后一点,最新的 Privileged 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)。

    【讨论】:

    • 感谢您富有洞察力的回答!我现在已将纯 RV32I 工具链的构建说明添加到 PicoRV32 README。这包括对 newlib/newlib/libc/machine/riscv/ieeefp.c 的快速解决方法,当 gcc 使用 --with-arch=RV32I 构建时不会构建,因为它使用内联汇编器调用 fssrfrsr。跨度>
    • @CliffordVienna,感谢您的指示。密切关注 riscv-gnu-toolchain 的最新拉取请求。我们正在努力使生成 RV32I 工具链变得更加容易。理想情况下,在未来,riscv-gcc 将使用 multilib 工具来生成不同的组合。
    猜你喜欢
    • 1970-01-01
    • 2018-11-22
    • 2023-03-22
    • 2023-04-09
    • 2023-04-01
    • 2020-03-27
    • 1970-01-01
    • 1970-01-01
    • 2014-12-10
    相关资源
    最近更新 更多