![kelly的头像 kelly的头像](https://cdn.eetrend.com/files/styles/picture200/public/pictures/picture-233-1470101630.jpg?itok=1zaKJM2x)
自25年前ARM1的诞生起,ARM指令集便不断演变。Cortex-A处理器实际支持两个指令集,每个指令集都有各自的扩展。
ARM指令集
ARM指令集基于首款ARM处理器支持的原始指令集。该指令集已经过了数次扩展。简而言之,这是一个负载-存储指令集,拥有不同指令组,主要用于数据处理、存储访问、系统控制和控制流程。现代的ARM指令集非常强大,适用范围非常广泛。在指令集内,所有指令被编码为32位固定长度的字,并且必须与字边界一致。
Thumb指令集
Thumb指令集是ARM指令集的子集,其中每个指令被编码为16位半字,并且必须与半字边界一致。Thumb指令集最初的依据是,在编译高级语言(如C语言)时,减小最常用的指令的大小,从而提高代码密度。由于指令越小,会有更多指令可以汇集在给定的高速缓存,对运行指令的高速缓存就越有利。
高级SIMD扩展
高级SIMD扩展也被称为NEON,是一组庞大的指令集,通过扩充寄存器集实现SIMD向量处理能力。
向量浮点(VFP)
VFP指令集实用与NEON的相同的寄存器分组,是符合IEEE-754单、双精度浮点的运算指令。
Thumb-2技术
Thumb-2是一个扩展集的总称,起初为ARMv6T2(第一款,使用ARM1156T2-S处理器)的Thumb指令集。由此生成一个混合长度指令集,同时具备Thumb的高代码密度和ARM指令集的高性能和高灵活性。
如果使用过Cortex-M微控制器,您一定会对Thumb-2非常熟悉。在最小(Cortex-M0和Cortex-M0+)到最大(Cortex-M7中)的各种子集中,核心仅支持Thumb-2。你会发现,使用Cortex-A处理器可以生成更多的代码。
一般来说,为Cortex-A编译的大部分高级代码都是针对Thumb(及Thumb-2)的。这使编译器能够在最大程度上做出明智的判断,从多种选择中选取需要的指令,并实现代码空间编译和性能编译之间的差异最大化。
ARM指令集通常被用于代码段,性能至关重要。有时,这些代码段需要通过手工在汇编器上编码,ARM指令集也因此成为最佳选择。
NEON指令集可通过多种方式访问:
1、支持常用数学、分析函数和算法的库。
2、编译器可以为多种内在函数集提供支持,允许直接使用C语言访问几乎整个NEON指令集。通过这种方法,可以用最简便的方式将NEON操作插入C语言。
3、可以直接在汇编器上手工实现NEON。
4、编译器还支持迭代循环的自动向量化。将代码写入一些简单指令,编译器会非常有效地展开极其复杂的循环,并进行向量化。
如果对ARMv7-A处理器很熟悉,您还会注意到作为ARMv8-A也在使用的一些其它指令。
加密扩展
这些是ARMv8-A中的新指令,运行在NEON寄存器组,旨在有效地执行密码函数的算法。
负载获取和存储释放(Load Acquire and Store Release)
这些新指令匹配C++11访存排序语义,编译非常高效。它们还可用于降低对数据端内存屏障的需求,部分消除与其有关的能耗支出。
另外,还有其它一些浮点和屏障指令的扩展。
文章来源:ARM微信公众号