ARM Core指令现在越来越强大,同时又因此能耗低,现在越来越广泛地应用于移动设备中。随着3G时代的到来,各种移动终端设备中都有多媒体功能,而且是功能越多且性能越优.很多smartphone上都能播放高清的视频了。在这就把ARM assembly instruction sets 进行次总结,也好让自己对相关的指令更加地灵活应用。
目前由指令集来看,主要有以下几种:ARMv4, ARMv5E, ARMv6 and Neon.
各种ARM CPU core都有其对应的指令集,其体的型号可查ARM 公司资料(在公司主页可以找到很有用的infos),如:ARM7TDMI, ARM720T,ARM920T等用ARMv4 ISA; ARM7EJ-S, AMR926EJ-S, ARM1020E 等用ARMv5E, ARM1036J-S, ARM1136J-S等用ARMv6 ISA, Cortex-A8 等用Neon. 所有的ARM core都有向下兼容性。
本文基于ARMv4,来对ARMv5E, ARMv6 和Neon ISAs增加部分进行汇总,并分析新增指令会带来什么样的性能提升。
ARMv5E 扩展提供了许多新的指令。
(1) CLZ Rd, Rm ---- 零计数指令用于计算最高符号位与第一个1之间的零的个数
这个指令在Speech/Audio codec 归一化运算中很有用,如用ARMv4 ISA实现前向零计数会有用到好几第指令来实现。
(2) QADD Rd, Rm, Rn --- Rd = Sat(Rm + Rn)
QDADD Rd, Rm, Rn ---- Rd = Sat(Rm + Rn << 1)
QSUB Rd, Rm, Rn ---- Rd = Sat(Rm - Rn)
QDSUB Rd, Rm, Rn ---- Rd = Sat(Rm - Rn << 1)
由于代码的定点化过程中,对很多运算都有饱和保护,用C或ARMv4 ISA来实现这个功能效率会很低。但用ARMv5只照一条指令就行了。
(3) 乘累加指令
ARMv5E在音频算法方面的optimization效果会很好,主要是有新增加了16bits*16bits,32bits*16bits乘累加指令。而音频很多源数据是16bits,同时也有可能一些filter coefs 是32bits,这时ARMv5E指令就能很好的发挥其威力.
SMLAxy Rd, Rm, Rs, Rn --- Rd = (Rm.x * Rs.y) + Rn
SMLALxy RdHi, RdLo, Rm, Rs --- [RdHi, RdLo] += Rm.x * Rs.y
SMLAWy Rd, Rm, Rs, Rn ---- Rd = ((Rm*Rs.y) >> 16) + Rn
SMULxy Rd, Rm, Rs ---- Rd = Rm.x + Rs. y
SMULWy Rd, Rm, Rs ---- Rd = ((Rm*Rs.y) >> 16)