とぴやまのブログ(アーカイブ)

元はてなダイアリー

エンディアン変換(バイト・オーダ反転)

http://pc.watch.impress.co.jp/docs/2005/0615/kaigai190.htm
後藤弘茂のWeekly海外ニュース PCとゲーム機で鍵となるバイナリ変換技術とエンディアン変換


IntelのCPUにもエンディアン変換(バイト・オーダ反転)する命令はある。
32/64bit (IA-32/IA-32e) では「bswap」で、 16bitでは 「xchg」。(MMX/SSEレジスタ用には無くて、IA-64では「mux2」?)

(2005/06/21追記: この件の訂正記事が上がっております。http://pc.watch.impress.co.jp/docs/2005/0621/kaigai192.htm )


bswap/xchg 命令は、共ににレジスタの値に対して行うもの。対して PowerPC では、記事に書かれている、

Cellには特殊なロード/ストア命令が実装されているという。エンディアン変換付きのロード命令とストア命令だ。データをメモリからレジスタにロードしたり、逆にレジスタからメモリに書き戻す際に、エンディアンをハードウェアで変換するという。

この記述のとおりの命令、lwbrx/lhbrx/stwbrx/sthbrx (32bitロード/16bitロード/32bitストア/16bitストア) 命令がある。PowerPCのこの4命令がCellにも移植されるのだろう。

PowerPCレジスタに格納されている値のエンディアン変換する命令を持っていない。実装は単純な命令にとどめて複雑な処理はソフトで、がRISCのモットーである。 シフト演算と加算で実現できるので、エンディアン変換用にわざわざ個別の命令は実装しない。

レジスタ演算命令で実装している Intel の CPU, メモリアクセスで実装している IBM (とMotorola/Freescale) の PowerPC という構図も面白い。


私の仕事が PowerPC 環境なので、こちらのことしか書けないが、PowerPC単体のシステムで、全てビッグエンディアンにあることは、まずない。何故なら一般に普及している I/Oインタフェース ――PCIバス、ATAディスクなど―― は、殆どリトルエンディアンであるためだ。そのI/Oにアクセスするときだけリトルエンディアンに変換する。(あるいは、組み込み装置でI/Oが固定的に決まっていればデータバスの結線の段階で反転させてしまうHW実装を行ったりもする。)

逆にリトルエンディアンの単体CPU環境では、エンディアン変換を行うのは、 socket でのネットワーク・バイト・オーダ変換くらいだろう。(ビッグエンディアン系ではネットワーク・バイト・オーダ変換マクロ htonl/ntohl は何もしない。)


話を戻して、最終段落の「Intel CPUがエンディアン変換命令を備える?」では、エンディアン変換機能付きロードストア命令を追加する、ということだろうか? あるいは、MMX/SSE用のすげぇ命令を実装するのか・・・


(2005/06/16 追記) いや、Vanderpool Technology で Bi-Endianをサポート、仮想システム毎にエンディアン設定が出来るようになる、とか?


参考:ネットワークバイトオーダー バイトオーダー (@IT:Insider's Computer Dictionary)