PPCエンディアンに関係なくAltivecのロードとストアを処理しますか?
-
08-07-2019 - |
質問
32ビット整数値を並列処理するAltivecのSIMDコードがあります。場合によっては、整数をリトルエンディアンとしてロードし、他の場合はビッグエンディアンとしてロードします(注:この選択は、ネイティブCPUエンディアンに関係なく、実行しているアルゴリズムに基づいています)。実際のバイトスワップの実行は、 Appleによって文書化されている。
心配しているのは、PowerPCがビッグエンディアンまたはリトルエンディアンの操作を許可しているため、リトルエンディアンのロード/ストアまたはビッグエンディアンのロード/ストアでバイトスワップする必要があるかどうかわからないことです。 (現在、私のコードは常にリトルエンディアンでそれを行い、ビッグエンディアンのメモリ操作とは決して交換しません。これはもちろん、ビッグエンディアンを実行しているため、現在使用している970で正常に動作します)。
見つけることができるものから、リトルエンディアンモードのPPCは比較的まれですが、存在します。理想的には、モードに関係なくコードを正しくかつ迅速に動作させたいと思います。
CPUエンディアンに関係なく、AltiVecレジスタへのビッグエンディアンロードとリトルエンディアンロードを処理する方法はありますか?これに関連する他の問題はありますか?ウィキペディアには、(当然のことながら)声明があります:
" AltiVec操作は、128ビットであるにもかかわらず、64ビットであるかのように扱われます。これにより、AltiVecより前に設計されたリトルエンディアンマザーボードとの互換性が実現します。
リトルエンディアンモードでは、AltiVecに特有のその他の気まぐれがあるかもしれないと思います。
解決
ほとんどすべてのPowerPCコードはビッグエンディアンを想定し、すべてのARMコードはリトルエンディアンを想定しています。
エンディアンスワッピングが使用される特殊なケースがいくつかあります-VirtualPCは明らかにリトルエンディアンモードに依存していたため、最初はG5で動作しませんでしたが(これは含まれていません)-私はこれらについて心配しません。
ARMには、ビッグエンディアンモードでも同様の問題があります。ダブルは混合エンディアンです。 「擬似エンディアン」下位アドレスビットを0x2(ハーフワードアクセスの場合)および0x3(バイトアクセスの場合)とXORすることにより、32ビットワード内の有効な順序がスワップされますが、64ビットアクセスの場合は中断されます。一度に64ビットを実行することを除いて、PowerPCでも同じトリックが使用されていると思われます。