我从事没有FPU的嵌入式系统的软件。我希望能够在我的桌面上使用软件浮点库构建此软件,以获得更真实的性能视图。有没有人对如何实现这个有任何想法?
到目前为止,我在使用-msoft-float
和gcc方面没有取得多大进展。我目前正在使用clang。通过使用标志-Xclang -msoft-float -Xclang -no-implicit-float
并指定一个具有soft-float例程实现的库,我能够使我的应用程序进行编译。当我尝试运行它时,它总是会出现段错误。我可以说,这是因为这个程序所依赖的库没有用soft-float编译。该应用程序依赖于gtk,sqlite,expat,gcrypt,许多内部库和libc。
我想弄清楚如何使用soft-float支持构建完整的构建环境。我尝试了uclibc的buildroot并将CC
和CXX
设置为clang的二进制文件,但由于编译gcc工具链的要求(例如autotools抱怨编译器版本不正确等),这不起作用。因为我想在新的buildroot中使用clang作为编译器(为了获得软浮点支持),我认为没有迫切需要构建gcc。没有gcc可以做到这一点吗?
答案 0 :(得分:5)
如果没有一些额外的库,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