読者です 読者をやめる 読者になる 読者になる

エンディアン変換

.NET

PC Watch の記事より.

Intel CPUがエンディアン変換命令を備える?

だが、もし、Intelが今後のCPUに、Cellのような、エンディアン変換命令と変換ユニットを実装するなら、話は違ってくる。これは、何も確証のある話ではなく、あくまで可能性としての話だが。例えば、来年の「Yonah(ヨナ)」以降のCPUに、新命令としてエンディアン変換を実装するなら、x86 MacでのPowerPCエミュレーションの性能は大幅に改善される。Appleが、新CPUのタイミングでx86移行を持ってくるのは、それを前提にしているのかもしれない。

x86エンディアン変換というと bswap 命令ですかね.首藤氏の日記に詳しくまとまっています.
http://www.shudo.net/diary/2005jun.html#20050615
(追記:2005/6/18)PowerPC での状況については,topiyama 氏のエントリが参考になりました.

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

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

そういえば .NET Framework の世界でもエンディアン変換絡みで突然ソースコードに System.Net.IPAddress.HostToNetworkOrder が出現することがあります.C/C++ で書いているときは ntohl を通信系以外で使った記憶はなかったなぁとも思いつつ.実際のところ WinSock2 の ntohl は,パフォーマンスが欲しい局面ではあまり使い勝手は良くないのかもしれません.DLL で実装されていてインライン展開はできませんし,手元で見る限り中身も普通にシフト演算を行っているだけのようでした.
そんなわけで Visual C++ 7.0 以降で bswap 命令の恩恵にあずかりたければ,以下の組み込み関数を使うと良いでしょう.

_byteswap_uint64、_byteswap_ulong、_byteswap_ushort
http://msdn2.microsoft.com/ja-jp/library/a3140177.aspx