Altivec に 32 ビット整数値を並列処理する SIMD コードがあります。場合によっては、整数をリトル エンディアンとしてロードしたい場合もあれば、ビッグ エンディアンとしてロードしたい場合もあります (注: この選択は、ネイティブ CPU のエンディアンに関係なく、実行中のアルゴリズムに基づいています)。実際のバイト スワップの実行は、Altivec の並べ替え操作を使用すると非常に簡単です。Apple が文書化しています。
私が心配しているのは、PowerPC ではビッグ エンディアンまたはリトル エンディアンの操作が許可されているため、リトル エンディアンのロード/ストアまたはビッグ エンディアンのロード/ストアでバイト スワップが必要かどうかわかりません。(現在、私のコードは常にリトル エンディアンで実行され、ビッグ エンディアンのメモリ操作では決してスワップされません。これは、もちろんビッグ エンディアンで実行されているため、現在使用している 970 で正常に動作します)。
私が見つけた限りでは、リトル エンディアン モードの PPC は比較的まれですが、実際には存在します。理想的には、コードがモードに関係なく正しく迅速に動作するようにしたいと考えています。
CPU のエンディアンに関係なく、AltiVec レジスタへのビッグ エンディアンとリトル エンディアンのロードを処理する方法はありますか? これに関連して知っておくべき他の問題はありますか? ウィキペディアには(引用されていない、当然のことながら)声明があります:
「AltiVec の操作は、128 ビットであるにもかかわらず、64 ビットであるかのように扱われます。これにより、AltiVec より前に設計されたリトルエンディアンのマザーボードとの互換性が可能になります。」
これは、リトルエンディアン モードの AltiVec に固有の他の不快感があるかもしれないと私に思わせます。