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

标签 x86 arm

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

我知道/听说过的那些(但我不知道它们是否真的是一个问题,甚至是真的 - 请验证):

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

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

最佳答案

任何像样的编译器都支持 ARM 上的 64 位数学,因此可能没有必要缩小变量的范围。然而,ARM 本身是 32 位的,因此如果您不需要全范围,那么使用 32 位变量会更快。此外,32 位变量比 8 位和 16 位变量更快,因此如果您有任何 charshort 循环计数器,可能值得更新它们为 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/

相关文章:

c++ - 在内联汇编代码中使用 C++ 命名空间

c - x86 程序集上的选择排序

arm - Cortex-M4 中的未对齐访问是原子的吗?

c++ - 为什么 ARM 使用两条指令来屏蔽一个值?

C++ 转换 char int ARM

c - 关于 setjmp/longjmp

assembly - x86 和内存寻址

c - 堆栈缓冲区溢出文章中的奇怪地址

arm - 有谁知道如何启用ARM FIQ?

c - 是否可以通过 C 变量而不是使用 GPIO_Pin_N 值读取和/或写入端口?