将低级x86优化代码移植到ARM Cortex-A8体系结构 < >将C++ x86代码移植到ARM处理器的主要注意事项是什么?

将低级x86优化代码移植到ARM Cortex-A8体系结构 < >将C++ x86代码移植到ARM处理器的主要注意事项是什么?,x86,arm,X86,Arm,我知道/听说过的(但我不知道它们是否真的是个问题,甚至是真的-请验证): SSE->霓虹灯 64位整数变为32位整数 小端->大端 程序员应该注意的任何其他差异和陷阱?任何一个好的编译器都支持ARM上的64位数学,因此可能没有必要缩小变量的范围。然而,ARM本机是32位的,所以如果您不需要全量程,那么使用32位变量会更快。此外,32位变量比8位和16位变量快,因此如果您有任何char或short循环计数器,则可能值得将其更新为ints(或者更好的是,无符号ints) Endianness通常

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

  • SSE->霓虹灯
  • 64位整数变为32位整数
  • 小端->大端

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

任何一个好的编译器都支持ARM上的64位数学,因此可能没有必要缩小变量的范围。然而,ARM本机是32位的,所以如果您不需要全量程,那么使用32位变量会更快。此外,32位变量比8位和16位变量快,因此如果您有任何
char
short
循环计数器,则可能值得将其更新为
int
s(或者更好的是,
无符号int
s)

Endianness通常不是问题-大多数ARM芯片要么以小endian运行,要么可以在大endian和小endian之间切换。问题在于对齐。当您访问未对齐的数据时,x86非常宽容。在ARM上,这要么产生异常,要么(在以后的ARCH上)使代码运行变慢。这通常由编译器负责,但如果使用汇编或压缩结构,则需要小心

另一件可能使您感到困惑的事情是有符号/无符号变量。直到最近,ARM还没有加载/存储有符号的
char
s的快速指令,因此传统上
char
在ARM上是无符号的。如果您的代码依赖于
char
的签名,那么您可能会遇到一些问题。一个快速修复方法可能是对有符号字符使用编译器开关,但在使用库函数时要小心。此外,在较旧的芯片上,有符号的
char
速度会较慢


编辑:我刚刚在Debian Wiki上偶然发现了一个。它主要处理从旧的ARM ABI到EABI的移植,但是上面提到的很多东西仍然适用于x86->ARM。它还链接到一个nice(尽管它对于ARMv6/v7并不完全正确)。

Hi,Cortex-A8体系结构实际上支持little-endian和big-endian,因此取决于处理器运行的模式是否与x86不同。ARM本身就是little-endian,应该以这种方式运行。64到32位可能是一个问题,具体取决于代码的编写方式。否则C++是C++。如果混入汇编程序,则必须进行移植。ARM EABI是现代ARM编译器最常用的ABI,它是little endian。ARM CPU可以处理大端或小端。