riscv - RISC-V RV32I 软浮点库调用 __muldf3 中的 MUL 和 MULHU 指令

标签 riscv

我正在使用当前 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 的软 float ? 我需要编译自己的 libgcc.a 版本吗?是否有关于如何执行此操作的说明?

最佳答案

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

尽管存在用于构建工具链的“禁用原子”/“禁用 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)。

关于riscv - RISC-V RV32I 软浮点库调用 __muldf3 中的 MUL 和 MULHU 指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31022638/

相关文章:

scala - 使用伯克利硬浮点

riscv - 如何刷新RISCV火箭芯片的数据缓存?

qemu - RISC-V : Illegal instruction exception when switching to supervisor mode

assembly - 1 : mean in assembly language? 是什么

scala - 安装凿子

configure - 为 RISCV 配置 pocl

riscv - 为什么商店说明有自己的格式

assembly - 如何在 RISC-V 汇编中使用数组

multithreading - 是否可以在 riscv 中的两个锁上构建原子 "release-and-acquire"操作?