是的,你沒有FPU所以浮點數需要在整數數學中完成。但是,這樣做有兩種機制,一種比另一種快11倍。
GCC目標ARM-Linux的GNU通常包括在ARM的第一FPU代碼真正的浮點指令的「FPA」,現在這麼難得的是不存在的。這些會導致非法指令陷阱,然後在內核中被捕獲和模擬。由於上下文切換,這非常緩慢。
-msoft浮子代替插入到庫函數調用(在libgcc.a中)。這樣可以避免切換到內核空間,速度比仿真的FPA指令快11倍。
你不會說你正在使用什麼浮點模型 - 它可能是你已經用-msoft-float構建整個用戶空間 - 但它可能是值得檢查的,你的目標文件不包含FPA指令。你可以檢查:
objdump -d file | grep '<space><tab>f' | less
其中
file
是你的編譯器輸出的任何目標文件,可執行文件或庫。所有的FPA指令都以
f
開頭,而沒有其他ARM指令。這些是實際的空間和製表符,你可能需要說
<control-V><tab>
來讓製表符通過你的shell。
如果使用FPA的insn,您需要使用-msoft浮來編譯你的整個用戶空間。
最全面深入閱讀對這些問題是http://wiki.debian.org/ArmEabiPort這主要關心的是第三種選擇:使用arm-linux-gnueabi
編譯器,一個新的替代ABI,可從GCC-4.1.1開始並具有不同的特點。有關更多詳細信息,請參閱文檔
GCC 3.3!?你意識到這已經超過5年了?成爲'真正的程序員'並編譯你自己的GCC 4.4.2工具鏈! – LiraNuna
我已經爲它編譯了一個4.1 GCC工具鏈,但它看起來非常糟糕,所以我回到了供應商提供給我的那個工具鏈。 – user21293
不知道「真正的程序員」的東西,但如果你測量最近的GCC的操作,你會發現,至少對於ARM來說,4.2是編譯時所用的本地最小時間,用於編譯的內存,生成目標代碼的大小並且目標代碼需要運行的時間。從4.3開始,所有4組中的某種指數增長都在。 – martinwguy