【发布时间】:2018-01-09 01:26:09
【问题描述】:
我已经成功地在我的英特尔 Ubuntu 机器上使用官方 riscv GitHub 工具链 (github.com/riscv/riscv-gnu-toolchain) 构建了一个 RV32E 交叉编译器,配置如下:-
./configure --prefix=/home/riscv --with-arch=rv32i --with-abi=ilp32e
ip32e 指定 RV32E 的软浮动。这会生成一个可以在我的简单 C 源代码上正常工作的编译器。如果我反汇编创建的应用程序,那么它确实符合 RV32E 规范。它只为使用前 16 个寄存器的代码生成程序集。
我使用静态链接,它会引入预期的一组软浮点例程,例如 __divdi3 和 __mulsi3。不幸的是,拉入的例程使用所有 32 个寄存器,而不是 RV32E 的受限低 16 个寄存器。因此,不是很有用!
我找不到这个静态链接代码的来源,它是从 C 源代码编译的,因此是在没有 RV32E 限制的情况下编译的吗?或者也许它是作为手工编码的程序集编写的,只为完整的 RV32I 而不是 RV32E 编写?我试图围绕源代码进行 grep,但没有找到任何类似于静态链接的实际代码的东西。
有什么想法吗?
编辑:刚刚检查了更多细节,编译器并没有仅使用前 16 个寄存器生成。结果是,通过一个简单的测试例程,它只使用了前 16 个,但更复杂的代码也使用了其他代码。也许 RV32E 还没有实现?
【问题讨论】: