博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编译器配置(1)——ARMv7,ARMv8(AArch64) 浮点配置等相关知识
阅读量:4029 次
发布时间:2019-05-24

本文共 3252 字,大约阅读时间需要 10 分钟。

-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       : 0BogoMIPS        : 48.00Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32CPU implementer : 0x41CPU architecture: 8CPU variant     : 0x0CPU part        : 0xd03CPU revision    : 4processor       : 1BogoMIPS        : 48.00Features        : fp asimd evtstrm aes pmull sha1 sha2 crc32CPU implementer : 0x41CPU architecture: 8CPU variant     : 0x0CPU part        : 0xd03CPU revision    : 4...Serial          : 79139f04652ea2da

s5p4418

# cat /proc/cpuinfoProcessor       : ARMv7 Processor rev 0 (v7l)processor       : 0BogoMIPS        : 1581.05processor       : 1BogoMIPS        : 1591.29processor       : 2BogoMIPS        : 1591.29processor       : 3BogoMIPS        : 1591.29Features        : swp half thumb fastmult vfp edsp neon vfpv3 tlsCPU implementer : 0x41CPU architecture: 7CPU variant     : 0x3CPU part        : 0xc09CPU revision    : 0Hardware        : s5p4418Revision        : 0000Serial          : 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 crc324418 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类型而产生很大变化的值。

你可能感兴趣的文章
drwtsn32.exe和adplus.vbs进行dump文件抓取
查看>>
cppcheck c++静态代码检查
查看>>
在C++中使用Lua
查看>>
在Dll中调用自身的位图资源
查看>>
IP校验和详解
查看>>
C++中使用Mongo执行count和distinct运算
查看>>
一些socket的编程经验
查看>>
socket编程中select的使用
查看>>
C++获取文件大小常用技巧分享
查看>>
未来5年大机遇:做贩卖多巴胺的超级玩家
查看>>
关于AIS编码解码的两个小问题
查看>>
GitHub 万星推荐:黑客成长技术清单
查看>>
可以在线C++编译的工具站点
查看>>
关于无人驾驶的过去、现在以及未来,看这篇文章就够了!
查看>>
所谓的进步和提升,就是完成认知升级
查看>>
昨夜今晨最大八卦终于坐实——人类首次直接探测到了引力波
查看>>
如何优雅、机智地和新公司谈薪水?
查看>>
为什么读了很多书,却学不到什么东西?
查看>>
长文干货:如何轻松应对工作中最棘手的13种场景?
查看>>
如何确保自己的Mac数据安全呢?这里有四个“小秘诀”
查看>>