首先需要了解一些概念:
浮点运算是指浮点数参与的运算,因为无法精确表示而进行近似或舍入。浮点运算就是实数运算,因为计算机只能存储整数,所以实数都是约数,这样浮点运算是很慢的而且会有误差。假如一台机器是32位的,32位都用来表示整数的话,那么对于无符号整数就是0到2^32-1,对于有符号的话就是-2^31到2^31-1。
浮点运算单元是专用于浮点运算的处理单元,以前的FPU是一种多带带芯片,在486之后,英特尔把FPU集成在CPU之内。
VFP (Vector Floating Point)从ARMv5开始,就有可选的 VFP模块,当然如 Cortex-A8, Cortex-A9 和 Cortex-A5 可以配置成不带VFP的模式供芯片厂商选择。VFP经过若干年的发展,有VFPv2 (一些 ARM9 / ARM11)、 VFPv3-D16(只使用16个浮点寄存器,默认为32个)和VFPv3+NEON (如大多数的Cortex-A8芯片)。对于包含NEON的ARM芯片,NEON一般和VFP共用寄存器。
硬浮点Hard-float
编译器将代码直接编译成发射给硬件浮点协处理器(浮点运算单元FPU)去执行。FPU通常有一套额外的寄存器来完成浮点参数传递和运算。
软浮点 Soft-float
编译器把浮点运算转换成浮点运算的函数调用和库函数调用,没有FPU的指令调用,也没有浮点寄存器的参数传递。浮点参数的传递也是通过ARM寄存器或者堆栈完成。 现在的Linux系统默认编译选择使用hard-float,即使系统没有任何浮点处理器单元,这就会产生非法指令和异常。因而一般的系统镜像都采用软浮点以兼容没有VFP的处理器。
armel和armhf ABI
在armel中&#x