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

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

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

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

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

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

有帮助吗?

解决方案

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top