|
还有的事,标准的arm,比如说堆栈内临时变量,一般采用堆栈寄存器加偏移地址来实现的。
void test()
{
...
..
int b = i;//这样的访问,b假如代码很长,临时变量很多,或者有一个数组的临时变量,超过了一个长度(貌似是4000字节左右的,具体忘了)
}
对于x86,那就是mov eax,[ebp+0x很长的偏移;假设
而arm则不行,因为ldr r0,r15,0x很长偏移;这里的很长偏移超过一定长度,超过了32bit指令的描述范围,单挑指令就不行了
所以结果就成了,刚才那个32bit赋值,付给了r1之类,然后再用ldr r0,r0,r1来实现。
thumb-2的话,则略好点,首先是thumb-2版本的ldr宽度变宽了,支持一些压缩数据算法,其次就是即使宽度不够了,需要的指令数量也远远少于arm本身指令。
thumb-2以后,arm的性能才稍微可以看看,标准arm就算了。
安卓其实早该统一下标准淘汰老的armv11之类的cpu算了。
|
|