2012-11-02 48 views
12

我使用的軟件沒有FPU的嵌入式系統。我希望能夠在我的桌面上使用軟件浮點庫構建此軟件,以獲得更實際的性能視圖。有沒有人有關於如何實現這一目標的任何想法?x86_64上的Soft Float

到目前爲止,我還沒有取得很大的進展,使用gcc的-msoft-float。我目前正在使用clang。通過使用標誌-Xclang -msoft-float -Xclang -no-implicit-float並指定一個具有軟浮點例程實現的庫,我可以讓我的應用程序進行編譯。當我嘗試運行它時,它總是出現段錯誤。盡我所知,這是因爲這個程序所依賴的庫沒有用soft-float編譯。該應用程序依賴於gtk,sqlite,expat,gcrypt,一些內部庫和libc。

我想試圖弄清楚如何構建一個完整的軟構建支持的環境。我嘗試了uclibc的buildroot,並將CCCXX設置爲clang的二進制文件,但由於編譯gcc工具鏈(諸如autotools抱怨編譯器版本不正確等)的要求,此操作無效。因爲我想在新的buildroot中使用clang作爲編譯器(爲了實現soft-float支持),所以我沒有看到構建gcc的迫切需要。沒有gcc可以做到這一點嗎?

+0

我覺得這是在不改變代碼是不可能的,因爲'x86_64' ABI需要'xmm'寄存器存在。也許有一些'-Double = mpfr :: real'的技巧會使用'gcc'所需的'mpfr'庫。 – hirschhornsalz

+0

如上所述,'clang'能夠編譯一個二進制文件而不涉及浮點指令或寄存器。我想我的真正問題是如果有一種方法可以使用這樣的東西來製作整個工具鏈。 –

+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

+0

我懷疑這是否可行 - 對於圖書館調用這沒問題,但像'+ - * /'這樣的基本操作仍然是SSE/xmm,因爲沒有SSE沒有x86_64 – hirschhornsalz

+0

你對SSE是對的。但它會起作用。請看我最新的答案。 –

+1

如果我試着用gcc-4.7.2編譯這個,我得到一個'錯誤:SSE寄存器返回SSE禁用',可能4.8是必需的? – hirschhornsalz