将低级x86优化代码移植到ARM Cortex-A8架构

Fab*_*ian 9 x86 arm

将C++ x86代码移植到ARM处理器的主要注意事项是什么?

我知道/听说过的(但我不知道他们是不是真的有问题,甚至是真的 - 请核实):

  • SSE - > NEON
  • 64位整数变为32位
  • 小端 - >大端

程序员应该注意的任何其他差异和陷阱?

Igo*_*sky 16

任何体面的编译器都支持ARM上的64位数学运算,因此可能没有必要减少变量的范围.但是,ARM 本身就是 32位,所以如果你不需要全范围,那么使用32位变量会更快.同样,32位变量比8位和16位变量快,所以如果你有任何charshort循环计数器,可能值得将它们更新为ints(或更好,unsigned ints).

字节顺序通常不是问题 - 大多数ARM芯片要么以小端运行,要么可以在大端和小端之间切换.什么问题是对齐.访问未对齐的数据时,x86非常宽容.在ARM上,这会产生异常,或者(在以后的archs上)会使代码运行得更慢.这通常由编译器负责,但您需要注意是否使用汇编或压缩结构.

可能会让你感到震惊的另一件事是签名/无符号变量.直到最近,ARM还没有加载/存储signed chars的快速指令,因此传统上ARM 上char没有签名.如果您的代码依赖于char签名,则可能存在一些问题.快速修复可能是将编译器开关用于签名字符,但在使用库函数时要小心.此外,char旧版芯片上的签名会更慢.

编辑:我偶然发现了Debian Wiki上的一个很棒的页面.它主要涉及从旧的ARM ABI到EABI的移植,但提到的很多内容仍然适用于x86-> ARM.它还链接到关于结构对齐的一个很好的常见问题解答(虽然它对于ARMv6/v7来说并不完全正确).