无论PPC字节顺序如何,处理Altivec加载和存储?

时间:2009-10-28 20:39:30

标签: endianness powerpc altivec

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

我担心的部分是PowerPC允许大端或小端操作,所以我不知道是否需要在小端加载/存储或大端加载/存储上进行字节交换。 (目前我的代码总是用于小端,并且永远不会替换大端内存操作,这在我当前正在使用的970上工作正常,因为它当然正在运行big-endian)。

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

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

“尽管是128位,AltiVec操作被视为64位。这样可以兼容AltiVec之前设计的小端主板。”

这让我觉得在小端模式下AltiVec可能还有其他特有的肮脏。

1 个答案:

答案 0 :(得分:2)

几乎所有的PowerPC代码都会假设big-endian,并且所有ARM代码都会假定为小端。

有一些使用endian-swapping的特殊情况 - 显然VirtualPC依赖于小端模式,因此最初不适用于G5(不包括它) - 但我不担心这些

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