【问题标题】:RV32E version of the soft-float methods such as __divdi3 and __mulsi3RV32E 版本的软浮点方法,例如 __divdi3 和 __mulsi3
【发布时间】: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 还没有实现?

【问题讨论】:

    标签: c gcc riscv


    【解决方案1】:

    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 的支持还没有完全实现。

    【讨论】:

    • 好吧,至少这是有道理的!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    相关资源
    最近更新 更多