gcc - x86_64 上的软浮点

标签 gcc clang cross-compiling

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

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

我想尝试弄清楚如何构建具有软浮点支持的完整构建环境。我尝试了 uclibc 的 buildroot 和设置 CCCXX到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 的调用.

在这个问题中可以找到一些有趣的想法:Using software floating point on x86 linux

关于gcc - x86_64 上的软浮点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13201495/

相关文章:

linux - 带有 fPIC 编译器标志的 CrossCompile openssl 不起作用(找不到 e_os.h)

c -/usr/bin/ld : error: cannot find -lecl

c++ - 使用 lldb 和 -fsanitize=address 调试问题

c++ - Clang "couldn' t 推断模板参数“而 gcc/g++ 可以。哪个是正确的?

linux - 如何在Buildroot中定义局部变量,这是bash脚本的执行结果

c++ - qemu-user 在运行动态链接的可执行文件时找不到共享库

c++ - "multiple definition of ` 与 DLL 链接时 atexit '"

c - 如何在 gcc 中使用 lzcnt

c - "sizeof (char[0])"怎么用 GCC 编译得很好

c++ - C/C++ 中 isspace 的声明不一致?