米Intelは,IA-32の上位互換性を備えた同社の64ビット・アーキテクチャ「64Bit-Extension Technology」に関して,ソフトウエア開発者向けのドキュメントをWebサイトで公開した。一方,米AMDも,同社の64ビット・アーキテクチャ「AMD 64-Bit Technology(AMD64)」に関するソフトウエア開発者向けのドキュメントをWebサイトで公開している。これらのドキュメントを読み比べると,命令セット上はほとんど同じであることが分かった。

 AMD64に対応したCPUは,64ビットOSが必要な「Long-Mode」と,IA-32互換で既存の32ビットOSが動作する「Legacy-Mode」を備える。Long-Modeはさらに,64ビット・アドレッシングが可能な64-Bit Modeと,64ビットOS上でIA-32向けアプリケーションがそのまま動作するCompatibility Modeの2つのサブモードに分かれる。64-Bit Modeではレジスタが拡張されており,RAX,RBX,RCX,REX,RSI,RDI,RSP,RBP,R8~R15の,合計16本の64ビット汎用レジスタを利用できる。そして,IA-32では16ビット単位でしかアクセスできなかったSI,DI,SP,BPの4つの汎用レジスタについて,それぞれ下位8ビットをSIL,DIL,SPL,BPLレジスタとしてアクセスできるようになっている。SSE命令セット用のレジスタは8本増やされ,XMM0~XMM15の16本である。Compatibility ModeまたはLegacy Modeのレジスタ構成は,既存のIA-32と同様で,32ビット汎用レジスタとSSE向けのXMMレジスタはそれぞれ8本である。

 一方,Intelの64Bit-Extensionも,64ビット・アドレッシング可能なIA-32e Modeと,IA-32互換のLegacy Modeを備える。IA-32e Modeは,さらに,64ビット・アドレッシングが可能な64-Bit Modeと,64ビットOS上でIA-32向けアプリケーションがそのまま動作するCompatibility Modeの2つのサブモードに分かれる点はAMD64と同じだ。各モードでのレジスタ構成/名称も全く同じで,64-Bit ModeではSIL,DIL,SPL,BPLレジスタも使える。

 AMD64の64-Bit Modeでは,アプリケーションは64ビット・フラットの仮想アドレスを扱う。その仮想アドレスは,CPUのページング機構によって最大52ビットの物理アドレスに変換される。ただ,現在のAMD64対応CPUが扱えるアドレスは,仮想アドレスは最大48ビット,物理アドレスは最大40ビットまでである。

 一方,IA-32eの64-Bit Modeも64ビットの仮想アドレスを扱うが,当初IA-32eに対応するCPUで扱える仮想アドレスは最大48ビットまでと,現在のAMD64対応CPUと同じである。

 AMD64の命令セットには,64-Bit Modeの拡張命令のためのREXプレフィックスが追加されている。このコードは40h~4Fhに割り当てられている。これらのコードは,IA-32ではDEC命令とINC命令に割り当てられている。そのため64-Bit Modeでは,オペ・コードが変更された。これらの点に関してもIntelの64Bit-Extensionは同じだ。その他の命令もマシン語レベルで同じで,AAA(ASCII Adjust After Addition)など64-Bit Modeで利用できないIA-32命令の種類も同じである。

 両者が微妙に異なるように見える部分もあるが事実上,無視できるだろう。まず,フラグ・レジスタは,AMD64では64ビットに拡張され,RFLAGSと名づけられている。ただし,上位32ビットは予約済みで現在は使われていない。これに対してIntelの64Bit-Extensionでは,32ビットのままで,名称もIA-32と同じEFLAGSだ。

 また,AMD64および64Bit-Extensionには,Extended Feature Enableレジスタ(IA32_EFER)が追加されている。これには,Long-Mode/IA-32eへの移行に使うフラグが格納されている。Long-Mode/IA-32eにするには,第8ビットを1にする。また,第10ビットは読み出し専用で,Long-Mode/IA-32eのときに1になる。この点は両者とも同じだ。違うのは,第11ビットで,AMD64ではNo-Executeビットに割り当てられている。1にすると,No-Executeが有効になる。No-Executeは,CPUが備えるページ保護機能で,バッファ・オーバーランなどを利用した不正なプログラムの実行を防ぐ仕組みである。これに対してIA-32eでは,このビットは予約済みで現在は使われていない。

 以上のようにアプリケーション・ソフトウエアの開発者にとっては,64Bit-ExtensionとAMD64は同じといっていいだろう。Intel製CPUが備えているSSE3命令セットやAMD製CPUが備えている3DNow!命令セットを使わなければ,1つのバイナリで両者に対応できるはずだ。

(山口 哲弘=日経Windowsプロ)