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

时间:2011-02-20 22:35:52

标签: x86 arm

将C ++ x86代码移植到ARM处理器有哪些主要注意事项?

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

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

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

1 个答案:

答案 0 :(得分:16)

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

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

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

编辑:我在Debian Wiki上偶然发现great page。它主要涉及从旧的ARM ABI到EABI的移植,但提到的很多内容仍然适用于x86-> ARM。它还链接到一个很好的FAQ about structure alignment(尽管它对于ARMv6 / v7来说并不完全正确)。