x86_64 上的软浮动

2024-01-30

我正在为没有 FPU 的嵌入式系统开发软件。我希望能够在桌面上使用软件浮点库构建该软件,以获得更真实的性能视图。有人对如何实现这一目标有任何想法吗?

到目前为止,我在使用方面还没有取得太大进展-msoft-float与海湾合作委员会。我目前正在考虑使用 clang。通过使用标志-Xclang -msoft-float -Xclang -no-implicit-float并指定一个具有软浮点例程实现的库,我能够编译我的应用程序。当我尝试运行它时,它总是出现段错误。据我所知,这是因为该程序所依赖的库不是用软浮点编译的。该应用程序依赖于 gtk、sqlite、expat、gcrypt、许多内部库和 libc。

我想尝试弄清楚如何构建一个具有软浮动支持的完整构建环境。我尝试了 uclibc 的 buildroot 和设置CC and CXX到 clang 的二进制文件,但这不起作用,因为编译 gcc 工具链的要求(例如 autotools 抱怨编译器版本不正确)。由于我想在新的 buildroot 中使用 clang 作为编译器(以便获得软浮点支持),因此我认为构建 gcc 并不迫切。没有 gcc 可以做到这一点吗?


如果没有一些额外的库,GCC 就无法开箱即用。基本上,-msoft-float只是生成对浮点库的调用,但所需的库不是 GCC 的一部分。

要链接soft-fp您可以使用开关的库-lsoft-fp.

X86_64架构包含SSE扩展,因此编译器将尝试为+ - * /等基本操作生成SSE代码。我们将使用-mno-sse开关抑制这种未经授权的行为。

它可能如下所示:

gcc -g -msoft-float -mno-sse -m64 -lsoft-fp

对于代码:

int main()
{
    float a = 10;
    float b = 20;

    float c = a * b;

    return 0;
}

最终的组装结果将是:

    .file   "12.cpp"
    .def    __main; .scl    2;  .type   32; .endef
    .def    __mulsf3;   .scl    2;  .type   32; .endef
    .text
    .globl  main
    .def    main;   .scl    2;  .type   32; .endef
    .seh_proc   main
main:
    pushq   %rbp
    .seh_pushreg    %rbp
    movq    %rsp, %rbp
    subq    $48, %rsp
    .seh_stackalloc 48
    .seh_setframe   %rbp, 48
    .seh_endprologue
    call    __main
    movl    .LC0(%rip), %eax
    movl    %eax, -4(%rbp)
    movl    .LC1(%rip), %eax
    movl    %eax, -8(%rbp)
    movl    -8(%rbp), %edx
    movl    -4(%rbp), %ecx
    call    __mulsf3
    movl    %eax, -12(%rbp)
    movl    $0, %eax
    addq    $48, %rsp
    popq    %rbp
    ret
    .seh_endproc
    .section .rdata,"dr"
    .align 4
.LC0:
    .long   1092616192
    .align 4
.LC1:
    .long   1101004800
    .ident  "GCC: (GNU) 4.8.0 20120624 (experimental)"

没有生成 SSE 指令。请注意调用__mulsf3.

在这个问题中可以发现一些有趣的想法:在 x86 linux 上使用软件浮点 https://stackoverflow.com/q/1018638/1065190

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

x86_64 上的软浮动 的相关文章

随机推荐