微信公眾號mindshare思享
此文來源于本人在arm開發(fā)者網(wǎng)站發(fā)布的英文文章
Hints?for running software on V8-A processors without FPU
現(xiàn)用中文講一遍家卖。
熟悉arm
processor的朋友應(yīng)該知道arm的Cortex-A是帶有FPU和NEON的仿滔,F(xiàn)PU用來做浮點(diǎn)數(shù)運(yùn)算的,而NEON是SIMD指令做并行運(yùn)算的撇簿。在現(xiàn)有Cortex-A的設(shè)計里恢口,NEON和FPU是不可分的孝宗,也就是不能單獨(dú)只有NEON或是FPU。在比較高性能的Cortex-A
CPU(比如Cortex-A15/A57/A72/A73/A75)中耕肩,NEON和FPU是不能在RTL配置里去掉的因妇,在高能效的Cortex-A的CPU(比如Cortex-A7/A53/A55)中NEON和FPU是可以在RTL配置里面配置有或是沒有。
NEON和FPU畢竟是占面積的猿诸,也許你會認(rèn)為你的應(yīng)用可能用不到NEON或是FPU婚被,所以你可以配置RTL沒有NEON/FPU,以減少面積die size或功耗两芳。
這在Armv7里可能不是問題摔寨,但是在armv8 64位里需要非常小心,也許因為這個配置導(dǎo)致你的芯片稱為無用的廢片怖辆,有些客戶因此遭受損失是复,雖然我們已經(jīng)盡可能地告知客戶們。
在 armv8 aarch64中竖螃,arm規(guī)定了過程調(diào)用規(guī)范Procedure Call Standard for the ARM 64-bit Architecture’--AAPCS64淑廊,這個規(guī)范時規(guī)定在函數(shù)調(diào)用過程中怎么傳輸入和輸出參數(shù),哪些寄存器需要調(diào)用者保護(hù)特咆,哪些寄存器需要被調(diào)用者保護(hù)季惩。之所以要定義這個規(guī)范就是要使不同的compiler (arm compiler, gcc, llvm)生成的庫能兼容地被使用,能被鏈接器鏈接起來生成一個可執(zhí)行文件或是庫腻格。這保證了arm生態(tài)的軟件兼容画拾,非常重要。
和我們這次要討論的話題相關(guān)的是怎么來傳浮點(diǎn)數(shù)的函數(shù)輸入輸出參數(shù)菜职。
在Armv7的AAPCS32規(guī)范里青抛,我們實際上定義了兩種傳浮點(diǎn)數(shù)的方式:
softfp
hardfp
這兩個的區(qū)別在于,softfp 是用整形的通用寄存器(r0-r3)來傳浮點(diǎn)數(shù)參數(shù)的酬核,比如
float fadd(float a, float b)
a和b實際上是通過r0,r1傳入到被調(diào)函數(shù)的蜜另,結(jié)果也是通過r0傳出的。
但如果使用hardfp,那么用浮點(diǎn)數(shù)寄存器來傳參數(shù)嫡意,以上同樣的例子举瑰,a和b是通過s0, s1寄存器來傳的,結(jié)果是通過s0傳出的蔬螟。
在GCC compiler里提供了一下選項來選擇你編譯的代碼是使用哪個方式
-mfloat-abi=softfp/hard
因為使用不同的參數(shù)傳遞方式此迅,所以你不能將一個使用softfp另外一個使用hardfp的庫或目標(biāo)文件鏈接起來。
正式因為如此旧巾,在armv7的時候有些編譯好的庫(比如glibc使用softfp)沒法在使用另一種(使用hardfp)的應(yīng)用編譯中耸序。
有的工具鏈直接只支持一種方式比如arm-linux-gnueabi,和arm-linux-gnueabihf菠齿。
但是維護(hù)這種不同的ABI帶來了兼容性維護(hù)的問題佑吝,比如同樣一套庫可能要提供兩個版本。因此很多OS廠商開始只支持一種方式绳匀,比如ubuntu從12.04開始只支持hardfp.
正是因為以上原因芋忿,armv8 aarch64的AAPCS只支持hardfp,這就需要用到NEON/FPU寄存器。如果你的CPU配置了沒有NEON/FPU,可能軟件上會帶來比較大的問題疾棵,導(dǎo)致一些通用的OS分發(fā)版本(ubuntu戈钢,Redhat)沒法正常跑。
Compiler和一般的OS分發(fā)版本都會假設(shè)armv8
aarch64的CPU是帶NEON/FPU的是尔,除非你能非逞沉耍肯定地知道你的軟件和庫不會使用任何的浮點(diǎn)數(shù)運(yùn)算,這樣的話我們之后會提供一些編譯選項拟枚,以便compiler不生成使用浮點(diǎn)數(shù)的指令薪铜。這樣的話你或許可以在RTL里去掉NEON/FPU.
為了可以是之前的32位且使用softfp應(yīng)用可以跑在arm64kernel上众弓,Linux kernel提供下面的patch,
https://patchwork.kernel.org/patch/9405787/
這個patch允許arm64 Linux kernel本身可以在沒有NEON/FPU的CPU上跑隔箍。
但是我們不建議去除NEON/FPU谓娃,因為你可能需要跑通用的Linux kernel.即使Linux kernel本身可以在沒有NEON/FPU的CPU上運(yùn)行,但是還需要考慮user space的應(yīng)用和庫是使用AAPCS64ABI編譯的蜒滩,他們還是需要NEON/FPU.
GCC提供了-mgeneral-regs-onlyoption選項滨达,這個選項禁止生成的代碼使用浮點(diǎn)數(shù)寄存器,但他不限制匯編使用浮點(diǎn)數(shù)寄存器俯艰。
Arm compiler 6也提供了-mcpu=name+nofp+nosimd這個選項達(dá)到以上目標(biāo)捡遍,但是一旦使用這個選項,你的代碼就不能有浮點(diǎn)數(shù)的類型和運(yùn)算竹握。
如果你肯定你的程序和庫都只需要整形運(yùn)算画株,你可以試以上選項,這樣的話就不需要NEON/FPU的硬件支持涩搓。
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0773g/chr1383143713787.html
AAPCS32 allows both soft and hard float ABI by defining ‘The base standard’ and ‘The standard variants’.
5 THE BASE PROCEDURE CALL STANDARD?
The
base standard defines a machine-level, core-registers-only calling
standard common to the ARM and Thumb instruction sets. It should be used
for systems where there is no floating-point hardware, or where a high
degree of inter-working with Thumb code is required.
6.1 VFP and Advanced SIMD Register Arguments?
This
variant alters the manner in which floating-point values are passed
between a subroutine and its caller and allows significantly better
performance when a VFP co-processor or the Advanced SIMD Extension is
present.
6.1.1 Mapping between registers and memory format?
Values passed across a procedure call interface in VFP registers are laid out as follows:?
??A
half precision floating point type is passed as if it were loaded from
its memory format into the least significant 16 bits of a single
precision register.?
??A
single precision floating point type is passed as if it were loaded
from its memory format into a single precision register with VLDR.?
??A
double precision floating point type is passed as if it were loaded
from its memory format into a double precision register with VLDR.
See more information in AAPCS32 spec,
http://infocenter.arm.com/help/topic/com.arm.doc.ihi0042f/IHI0042F_aapcs.pdf