通过使用正式的riscv GitHub工具链(github.com/riscv/riscv-gnu- toolchain ),我成功地在我的Intel机器上构建了一个GitHub交叉编译器,配置如下:
./configure --prefix=/home/riscv --with-arch=rv32i --with-abi=ilp32eip32e为RV32E指定软浮动。这将生成一个在我的简单C源代码上工作良好的编译器。如果我拆解创建的应用程序,那么它确实遵循RV32E规范。它只为使用前16个寄存器的代码生成程序集。
我使用静态链接,它引入了预期的软浮动例程集,如__divdi3和__mulsi3。不幸的是,拉入例程使用所有32个寄存器,而不是RV32E的限制下16。因此,不是很有用!
我找不到这个静态链接的代码是从哪里来的,它是从C源代码编译的,因此没有RV32E限制而被编译吗?或者它是作为手工编码的程序集编写的,它只为完整的RV32I而不是RV32E编写?我试图在源代码中找到grep,但没有找到任何类似静态链接的实际代码。
有什么想法吗?
编辑:只要签入更多细节,编译器就不会使用前16个寄存器生成。结果发现,使用一个简单的测试例程,它只能使用前16个,但更复杂的代码也使用其他代码。也许RV32E还没有实现?
发布于 2018-01-09 09:10:18
configure.ac文件包含以下代码:
AS_IF([test "x$with_abi" == xdefault],
[AS_CASE([$with_arch],
[*rv64g* | *rv64*d*], [with_abi=lp64d],
[*rv64*f*], [with_abi=lp64f],
[*rv64*], [with_abi=lp64],
[*rv32g* | *rv32*d*], [with_abi=ilp32d],
[*rv32*f*], [with_abi=ilp32f],
[*rv32*], [with_abi=ilp32],
[AC_MSG_ERROR([Unknown arch])]
)])它似乎将rv32i的输入映射到ABI ilp32,而忽略了e。因此,对...e ABI的支持似乎还没有完全实现。
https://stackoverflow.com/questions/48160285
复制相似问题