-mfpu -mfloat-abi

这两个编译器配置选项一般只适用于ARMv7及以下arm架构,对于ARMv8架构,对应的编译器是不能识别这两个编译配置的

arm-linux-gcc -march=armv7-a -mfpu=neon -mfloat-abi=hard -o test test.c
参考链接:
https://blog.csdn.net/u014470361/article/details/87931856

ABI即“application binary interface”,即编译器将c代码编译成汇编代码时使用的一种规则
使用规范如下:
在编译带有浮点参数的函数时,有三种可能的编译选项:
-mfloat-abi=soft
-mfloat-abi=softfp
-mfloat-abi=hard

"soft"选项:表明不使用FPU硬件,而是使用GCC的整数算术运算来模拟浮点运算。

"softfp"选项:表明要使用FPU硬件来做浮点运算,只是,函数的参数传递到整数寄存器(r0-r3)中,然后再传递到FPU中。
"hard"选项:表明要使用FPU硬件来做浮点运算,并且,函数的参数直接传递到FPU的寄存器(s0、d0)中。

AArch64

AArch64必须使用高级SIMD(又名NEON),这个架构下neon是默认启动的,因此不用添加这个’-mfpu=neon’的编译器选项来指示编译器使用NEON。

AArch64选项

参考链接:

https://gcc.gnu.org/onlinedocs/gcc/AArch64-Options.html#AArch64-Options
-mgeneral-regs-only		生成仅使用通用寄存器的代码。这将防止编译器使用浮点和高级SIMD寄存器,但不会对汇编程序施加任何限制。

-march and -mcpu Feature Modifiers
‘fp’
Enable floating-point instructions. This is on by default for all possible values for options -march and -mcpu.
‘simd’
Enable Advanced SIMD instructions. This also enables floating-point instructions. This is on by default for all possible values for options -march and -mcpu.

在这里插入图片描述

查看处理器特性

RK3399

rk3399_all:/ # cat /proc/cpuinfo                                               
processor       : 0
BogoMIPS        : 48.00
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

processor       : 1
BogoMIPS        : 48.00
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32
CPU implementer : 0x41
CPU architecture: 8
CPU variant     : 0x0
CPU part        : 0xd03
CPU revision    : 4

...

Serial          : 79139f04652ea2da

s5p4418

# cat /proc/cpuinfo
Processor       : ARMv7 Processor rev 0 (v7l)
processor       : 0
BogoMIPS        : 1581.05

processor       : 1
BogoMIPS        : 1591.29

processor       : 2
BogoMIPS        : 1591.29

processor       : 3
BogoMIPS        : 1591.29

Features        : swp half thumb fastmult vfp edsp neon vfpv3 tls
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x3
CPU part        : 0xc09
CPU revision    : 0

Hardware        : s5p4418
Revision        : 0000
Serial          : 760e92621ed002b70000008004e81234

RK3399是双Cortex-A72+四Cortex-A53 大小核CPU结构,Cortex-A72和Cortex-A53都属于Armv8-A 架构。
s5p4418是Cortex-A9架构,属于ARMv7架构。

3399 CPU:
Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32
4418 CPU:
Features        : swp half thumb fastmult vfp edsp neon vfpv3 tls

RK3399 CPU Features属性支持fp和asimd,s5p4418 CPU Features属性支持vfp、vfpv3和neon。
对应关系大致如下:
armv7–neon vfpv3
armv8–asimd fp

所以RK3399硬件上支持浮点和asimd,AArch64默认配置了fp和simd,因此RK3399平台默认是支持硬浮点的。

验证

反汇编

运算实例对比测试

TBC

==================================================

部分概念

Neon(ARM架构处理器扩展结构)

Neon是适用于ARM Cortex-A系列处理器的一种128位SIMD(Single Instruction, Multiple Data,单指令、多数据)扩展结构。

参考链接:
https://developer.arm.com/architectures/instruction-sets/simd-isas/neon?_ga=2.235784193.1624414071.1615184487-2111980882.1614667282

FPU:(Float Point Unit,浮点运算单元)

FPU是专用于浮点运算的处理器,以前的FPU是一种单独芯片,在486之后,英特尔把FPU集成在CPU之内。

proc文件系统

https://en.wikipedia.org/wiki/Procfs#Linux

/proc/cpuinfo,其中包含有关CPU的信息,例如其供应商(以及CPU系列,型号和型号名称,应允许用户识别CPU)及其速度(CPU时钟速度),缓存大小,同级件数,内核, 和CPU标志。 /proc/cpuinfo包含一个“ bogomips”的值,它经常被误认为是衡量CPU速度的指标(例如基准),但实际上根本没有衡量任何有意义的值(对于最终用户)。 它是内核计时器校准的副作用,即使在相同的时钟速度下,它也会根据CPU类型而产生很大变化的值。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐