1

我在 Altivec 中有一些 SIMD 代码并行处理 32 位整数值。在某些情况下,我想将整数加载为小端,在其他情况下加载为大端(注意:此选择与本机 CPU 字节序无关;它基于正在运行的算法)。正如Apple所记录的,使用 Altivec 的置换操作非常容易进行实际的字节交换。

我担心的部分是PowerPC允许大端或小端操作,所以我不知道我是否需要在小端加载/存储或大端加载/存储上进行字节交换。(目前我的代码总是为小端执行它,并且从不交换大端内存操作,这在我目前使用的 970 上运行良好,因为它当然运行的是大端)。

据我所知,小端模式下的 PPC 相对较少,但它们确实存在,理想情况下,我希望无论模式如何,我的代码都能正确快速地工作。

有没有一种方法可以处理对 AltiVec 寄存器的大小字节序负载,而不管 CPU 字节序如何?还有其他与此相关的问题我应该知道吗?维基百科有(未引用,自然)声明:

“AltiVec 操作,尽管是 128 位,但被视为 64 位。这允许与在 AltiVec 之前设计的小端主板兼容。”

这让我觉得在 little-endian 模式下可能还有其他特定于 AltiVec 的讨厌。

4

1 回答 1

2

几乎所有的 PowerPC 代码都采用大端序,而所有 ARM 代码都采用小端序。

有一些使用端交换的特殊情况——显然 VirtualPC 依赖于小端模式,因此最初不能在 G5 上工作(不包括它)——但我不会担心这些。

ARM 在大端模式下也有类似的问题:双打是混合端。“伪字节序”是通过将低位地址位与 0x2(用于半字访问)和 0x3(用于字节访问)进行异或运算来实现的,以便交换 32 位字中的有效顺序,但这会中断 64-位访问。我怀疑在 PowerPC 上使用了相同的技巧,除了一次完成 64 位。

于 2011-04-07T00:08:25.253 回答