x86_64上的软浮动

Dar*_*con 13 gcc clang cross-compiling

我从事没有FPU的嵌入式系统的软件.我希望能够在我的桌面上使用软件浮点库构建此软件,以获得更真实的性能视图.有没有人对如何实现这一点有任何想法?

到目前为止,我在使用-msoft-floatgcc 方面没有取得多大进展.我目前正在使用clang.通过使用标志-Xclang -msoft-float -Xclang -no-implicit-float并指定一个具有soft-float例程实现的库,我可以让我的应用程序进行编译.当我尝试运行它时,它总是会出现段错误.我可以说,这是因为这个程序所依赖的库没有用soft-float编译.该应用程序依赖于gtk,sqlite,expat,gcrypt,许多内部库和libc.

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

Ser*_* K. 5

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

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

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

它可能如下所示:

gcc -g -msoft-float -mno-sse -m64 -lsoft-fp
Run Code Online (Sandbox Code Playgroud)

对于代码:

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

    float c = a * b;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

生成的程序集将是:

    .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)"
Run Code Online (Sandbox Code Playgroud)

没有生成SSE指令.请注意拨打电话__mulsf3.

在这个问题中可以找到一些有趣的想法:在x86 linux上使用软件浮点

  • 如果我尝试使用 gcc-4.7.2 编译它,我会收到“错误:SSE 寄存器返回且 SSE 已禁用”,也许需要 4.8? (2认同)