将 C++ x86 代码移植到 ARM 处理器时有哪些主要注意事项?
我知道/听说过的那些(但我不知道它们是否真的是一个问题,甚至是真的 - 请验证):
- SSE -> NEON
- 64位整数变成32位
- 小端 -> 大端
程序员应该注意的任何其他差异和陷阱?
最佳答案
任何像样的编译器都支持 ARM 上的 64 位数学,因此可能没有必要缩小变量的范围。然而,ARM 本身是 32 位的,因此如果您不需要全范围,那么使用 32 位变量会更快。此外,32 位变量比 8 位和 16 位变量更快,因此如果您有任何 char
或 short
循环计数器,可能值得更新它们为 int
(或者更好的是,unsigned int
)。
字节序通常不是问题 - 大多数 ARM 芯片要么以小字节序运行,要么可以在大字节序和小字节序之间切换。 的一个问题是一致性。当您访问未对齐的数据时,x86 非常宽容。在 ARM 上,这要么会产生异常,要么(在以后的架构上)使代码运行速度变慢。这通常由编译器处理,但您需要注意是否使用汇编或打包结构。
另一件事可能会让你困惑是有符号/无符号变量。直到最近,ARM 还没有用于加载/存储有符号 char
的快速指令,因此传统上 char
在 ARM 上是无符号。如果您的代码依赖于 char
的符号性,则可能会遇到一些问题。快速修复可能是使用有符号字符的编译器开关,但在使用库函数时要小心。此外,签名的char
在旧芯片上会变慢。
编辑:我刚刚偶然发现了 great page在 Debian 维基上。它主要涉及从旧的 ARM ABI 到 EABI 的移植,但提到的很多内容仍然适用于 x86->ARM。它还链接到一个不错的FAQ about structure alignment (尽管对于 ARMv6/v7 来说并不完全正确)。
关于x86 - 将低级 x86 优化代码移植到 ARM Cortex-A8 架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5060565/