2009-06-19 40 views
8

在i386 linux上使用軟件浮點(很容易)是否可能,而不會導致在每次調用時陷入內核的開銷?我試過-msoft浮動,但它似乎正常(Ubuntu的)C庫沒有FP庫包括:在x86 linux上使用軟件浮點數

$ gcc -m32 -msoft-float -lm -o test test.c 
/tmp/cc8RXn8F.o: In function `main': 
test.c:(.text+0x39): undefined reference to `__muldf3' 
collect2: ld returned 1 exit status 

回答

4

除非你想通過手來引導整個工具鏈,可以從uclibc toolchain開始(i386版本,我想象) - 軟浮點數(AFAIK)不直接支持debian和衍生物上的「native」編譯,但它可以通過uclibc工具鏈的「embedded」方法使用。

+0

感謝您的回覆。我試圖引導uClibc的使用buildroot的,但它似乎被忽略我只要BR2_UCLIBC_CONFIG下,至少在UCLIBC_HAS_FPU選項的.config:/ – bdonlan 2009-06-19 18:07:47

+0

@Alex的uClibc的工具鏈鏈接斷開。 http://uclibc.org/toolchains.html應該是合適的? – zengr 2012-01-14 14:50:31

0

天兒真好,

除非你靶向不具有內置FP支持的平臺,我想不出理由,爲什麼你會想模仿FP支持。

您的x386平臺是否支持外部FPU?可惜它不是內置FPU的x486!

根據我的經驗,任何軟仿真肯定會比其硬件等效得慢。

這就是爲什麼我最終在Ada編寫一個程序包以達到板載68k FPU的目的,而不是使用編譯器製造商提供的軟模擬器。事實上,他們最終將其捆綁在編譯器中。

編輯:剛剛在下面看到您的評論。嗯,如果你不需要全套的FP支持,你可以推出自己的數學功能嗎?那我提到的Ada包是如何開始的。

HTH

歡呼聲,

4

GCC不無一些額外的庫支持這一點。從the 386 documentation

-msoft浮動生成包含庫調用浮動 點輸出。 警告:必要的 庫不是GCC的一部分。 通常使用 機器的通常C編譯器的設施, 但這不能直接在 交叉編譯中完成。您必須自己安排 爲 交叉編譯提供合適的 庫函數。

在一些機器上一個函數返回80387 寄存器堆棧 浮點結果,一些浮點 操作碼可以被髮射即使 -msoft浮子用於

另外,還可以不設置 - mfpmath =單位爲「無」,它必須是sse,387或兩者。

但是,根據this gnu wiki page,有fp-soft和ieee。還有SoftFloat

(對於ARM有-mfloat-ABI = softfp,但它似乎並不像類似的東西是供386 SX)。

它似乎並不像TCC支持軟件浮點數要麼。

祝你好運找到一個適合自己的圖書館。

6

出人意料的是,作爲該代碼是在一個名爲soft-fp目錄內的源提供明確的gcc不支持此本身。有可能手動編譯該庫:

$ svn co svn://gcc.gnu.org/svn/gcc/trunk/libgcc/ libgcc 
$ cd libgcc/soft-fp/ 
$ gcc -c -O2 -msoft-float -m32 -I../config/arm/ -I.. *.c 
$ ar -crv libsoft-fp.a *.o 

有幾個c文件由於錯誤而無法編譯,但大多數都是編譯的。複製libsoft-fp.a與我們的源文件所在的目錄後,他們現在編譯罰款與-msoft-float

$ gcc -g -m32 -msoft-float test.c -lsoft-fp -L. 

使用

$ objdump -D --disassembler-options=intel a.out | less 

快速檢查表明,由於預期沒有的x87浮點指令被稱爲和代碼運行在我的例子中,使用大量的除法,相當慢,也是8倍。

注:我會一直用最好

$ gcc -c -O2 -msoft-float -m32 -I../config/i386/ -I.. *.c 

編譯軟浮點庫,但導致的錯誤消息的負載,如

adddf3.c: In function '__adddf3': 
adddf3.c:46: error: unknown register name 'st(1)' in 'asm' 

好像i386版本st(1)指向使用-msoft-float時明顯不可用的x87寄存器之一,因此沒有得到很好的維護。 奇怪或幸運的是,arm版本編譯罰款上i386,似乎工作得很好。