概要*
この命令セットアーキテクチャは、元々AMDがx86-64の名前で仕様を発表したものが元になっている。AMDは2003年にAMD64と名前を改めて実装しており、IntelもAMD64の互換命令セットをEM64T(後にIntel 64と改称)として実装した。現在ではVIAがこれに続いている。
このような経緯もあり、ソフトウェアの対応命令セットの表記には、採用時期またはマイクロプロセッサベンダーとの立場などから、x86-64(x86_64), x64, AMD64, IA-32e, EM64T, Intel 64など複数の名称が用いられている。実際には、これらは全てAMD64(x86-64)を源流とする互換命令セットを指している。
特に「x64」の名称はマイクロプロセッサベンダーに中立的な用語として用いられる傾向がある。著名な例ではオラクルに買収されたサン・マイクロシステムズや、Microsoftなども「x64」の用語を使用している(ただ、遅々として開発の進まないIA-64にぶちキレて採用を決定した経緯からか、Microsoftの64bit版ダウンロードURLのディレクトリは未だに「AMD64」になっていたりする)。
AMD64
AMD64は、AMDのOpteron、Athlon 64、Turion 64など最初に実装されたK8マイクロアーキテクチャとその後継製品に実装されている。
開発経緯
PC用アーキテクチャとして普及したx86は、半導体の製造技術とマイクロアーキテクチャの革新とともに性能の向上を続け、サーバやワークステーションといったエントリークラスのエンタープライズ市場でも広く受け入れられるに至った。しかし、IA-32の性能向上によって自社開発の64ビットアーキテクチャであるIA-64との競合を懸念したインテルは、x86の拡張を32ビットアーキテクチャの範囲に留めてIA-64との棲み分けを図った。これに対し、市場からは普及したIA-32アーキテクチャと互換性を保ちつつ64ビットに拡張した、よりコストパフォーマンスに優れたエンタープライズ製品の登場が待ち望まれていた。高収益を望めるエンタープライズ市場への進出を図っていたAMDはそうした需要に応えて、x86の64ビット拡張アーキテクチャとして、従来のIA-32のソフトウェアも利用が可能な命令セットとしてx86-64を発表した。その後の実際の製品発表でAMD64と改称された。この計画は、2000年8月に発表され、最初のプロセッサは2003年4月に出荷された。
仕様
64ビットの汎用レジスタを持ち、32ビットのx86より広い物理および仮想のアドレス空間をサポートするため、プログラムが大きいデータをより容易に操作する事が可能である。またx64は32ビットのプログラムコードと完全な後方互換性を持つ。全ての32ビットの命令セットが、エミュレーションを介在せずにハードウェア上に実装され続けているため、32ビットのx86実行ファイルは、互換性上あるいは性能上の損失なしに稼動できる。ただし、既存のアプリケーションソフトウェアが性能向上を可能にするプロセッサ設計上の新機能を使用するには、再コード化が必要である。
アーキテクチャの特徴
AMD64命令セットには、インテルのIA-32アーキテクチャに指摘されるアンバランスで特異な部分を、きれいで使いやすいものにするという目論見があった。また、同時に先行している 64ビットRISC環境に似せたアーキテクチャにしようと考えて設計された。DEC Alpha の設計者の一人 ダーク・メイヤー が AMD64仕様の作成に関わり、彼をはじめとするDEC出身者の経験がこのプロジェクトに活かされた。特筆すべき点は以下のようなものである。
レジスタの追加と拡張
汎用レジスタ (GPR) 数はIA-32の8本 (EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP) に更にR8〜R15の8本を追加して16本に増やされ、各レジスタのビット幅も32ビットから64ビットに拡張された。IA-32は汎用レジスタが少ないことからコンパイラによる最適化に限界があり、これが最も大きな欠点とされた。AMD64に最適化されたアプリケーションでは、レジスタ本数の増加によって性能向上が見込まれ、特に深いループを持った演算主体のソフトウェアでその傾向が強いと見込まれる。さらに128ビットのXMMレジスタの本数も8本から16本に増やされた(Streaming SIMD命令で使われる)。
アドレス空間の拡張
AMD64アーキテクチャでは、現状の実装で48ビットのアドレス空間を持ち、256テラバイトまでのメモリを扱うことが出来る。IA-32アーキテクチャにおいて初期のプロセッサでは、アドレス空間は32ビットで表現できる4GiBに制約され、Pentium Pro以降の実装で追加された物理アドレス拡張機能を使用することで64GiBのメモリを接続できるが、1プロセスで利用可能なメモリ空間はやはり4GiBに制約された。32bit版Windowsシリーズにおいては、OSの仕様でアプリケーションが利用可能なメモリはおよそ3GiBに制約される[6]。これに対しAMD64のLongモードでは、IA-32の物理アドレス拡張をベースに、論理アドレス空間を48ビットへ拡張し(現状物理アドレス空間は52ビット)、将来の拡張で4エクサバイトまでの仮想空間をサポートできるようになっている。
RIP相対データアクセス
プログラムカウンタ (RIP) 相対でデータにアクセスすることができ、リロケータブルな共有ライブラリのコードを作成できる。また、共有ライブラリを仮想アドレス空間のどこにでも配置することができる。
SSE 命令
AMD64アーキテクチャでは明確にインテルのSSEとSSE2を基本命令セットに組み込んでいる。SSE2はx87の80ビット浮動小数点数から 32ビット/64ビットの浮動小数点数に置き換えたものである。SSE/SSE2命令セットは追加の8本のXMMレジスタを扱えるように拡張された。SSEとSSE2がAMD64命令セットに組み込まれており、それが従来のx87 FPUやMMXや3DNow!の機能をカバーする。x64版Windowsでの64ビットプログラムでは、FPU/MMXレジスタをコンテキストスイッチの際に保存しないようにすると噂されたが、実際には保存されるようになっている。
8ビットレジスタの拡張
64ビットレジスタであるRSP, RBP, RDI, RSI, R8 ... R15のビット0から7を、8ビットレジスタSPL, BPL, DIL, SIL, R8B ... R15Bとしてアクセス可能。
No-Executeビット
NXビット(ページテーブルエントリのビット63)は仮想アドレス空間のどのページが実行可能か、実行不可かを指定することができる。NXビットがセットされたページにあるコードを実行しようとするとメモリアクセス違反となり、実行できない。これは、リードオンリーページへの書き込みを実行しようとしてもできないことと似ている。No-Execute機能は、ウイルスなどがバッファーオーバランなどを使用して、オペレーティングシステムを乗っ取ろうとすることを難しくする。
類似の機能は、セグメントの属性として80286以降のプロセッサーに存在している。しかし、現在のオペレーティングシステムではセグメント機能は古いものと見なされ、セグメントのベースを0、リミットを4Gバイト(32ビットOSの場合)に設定することにより、実質的にセグメントを使用していない。
AMDはリニアアドレッシングモードでNo-Execute機能を実装した最初のx86ベンダーである。No-Execute機能は、PAEを有効にすれば、32ビットOSでも使用可能である。
古い機能の削除
x86アーキテクチャーにある多くのシステムプログラミング機能は近代的なオペレーティングシステムでは使用されておらず、それら古い機能は、AMD64のロングモードにはない。それらは、セグメントアドレッシング、タスクステートセグメントを使用したタスクスイッチ、仮想86モードなどである(ただし、FS, GSセグメントは、オペレーティングシステム構造体へのエクストラベースポインタとして残されている)。これらの古い機能は、レガシーモードでは依然として、完全に実装されているので、これまでの32ビット、16ビットオペレーティングシステムは、修正なしにx64プロセッサー上で動作する。
Long モード
AMD64で拡張された部分に対応する動作モードである。これにはネイティブの64ビットモードと互換のための32ビットモードが含まれる。IA-32でのマイナーな動作モードはサポートされない。このモードは64ビットのOSで使用される。
基本的な命令セットは同じなので、x86コードを実行しても性能が低下することはない。インテルのIA-64では32ビットコードの性能低下が問題となったが、これは命令セットが全く違うためにエミュレート実行していたためである。一方、AMD64では32ビットのx86用アプリケーションを再コンパイルすれば(レジスタが増えているため)性能が向上する。
Long モードを使うと、64ビットOSは 32ビットアプリケーションと64ビットアプリケーションを並行して実行できる。また、AMD64は 16ビットのアプリケーションも実行することができる。しかし、Windowsの16ビットアプリケーション (Win16) のサポートに欠かせない仮想86モードは使用できないため、マイクロソフトは WOW64サブシステムでの16ビットアプリケーションの実行機能の実装を断念し、Windows XP Professional x64 Edition でのWin16アプリケーション実行をサポートしていない。これはWindows Vista以降のx64版にも引き継がれる制限となっている。
Legacy モード
このモードは、16ビットOS(MS-DOS - Windows 3.1等)や32ビットOS(Windows 95 - Windows XP等)で使用される。このモードにおいて、プロセッサは基本的にx86の32ビットプロセッサとして振る舞い、16ビットと32ビットのコードのみが実行可能である。Legacy モードは、仮想アドレス空間の4GB制限のような32ビットの仮想アドレッシング上の上限がある。64ビットのプログラムは、Legacy モードで起動することができない。
Intel 64
Intel 64は、IA-32アーキテクチャの64ビット拡張であり、インテルによるx86-64の実装である。
インテルは、x86-64互換命令セットをIA-32に分類しており、IA-32の拡張を意味するIA-32e、EM64T (Extended Memory 64-bit Technology)などの名称を用いた。現在は「Intel 64」の名称に落ち着いており、これらは全て同じものを指している。
開発経緯
従来、AMDはインテルがオリジナルであるx86の互換プロセッサを開発・生産していた。しかし、x86-64では立場が逆転し、インテルはAMDが開発した、インテルによるx86プロセッサの拡張アーキテクチャを採用した。
当初プロジェクトは、Yamhillというコード名で始まった。このプロジェクトの存在を否定し続けて数年が経ち、2004年2月のIDFで、インテルはプロジェクトが進行中である事を発表した。インテルの当時の会長クレイグ・バレットは、これが重要な機密の一つであった事を認めた。
インテルによるこの命令セットの名称は、今日までに数回の変更を経ている。IDFで用いられた名前は CT(Clackamas Technology)、その数週間後に IA-32e (for IA-32 extensions) と呼称を変更し、2004年4月にはこれを EM64T (Extended Memory 64 Technology) という名前を公式に発表した。製品リリース後の2006年7月27日には、インテルはEM64TをIntel 64と改称している。
VIAによるx64の実装
VIA Nanoにおいて、x64互換命令セットであるVIA Isaiahアーキテクチャが採用されている。
AMD64とIntel64の差異
AMD64とIntel64は、ほとんど同じであるが、僅かながら違いはある。これらの違いはオペレーティングシステム、コンパイラ、BIOSなどの開発者のみが意識しなければならない。アプリケーションプログラムの開発者が、これらの違いを意識する必要は、ほぼない。
現在もある差異
Intel64のBSF, BSR命令は、ソースが0で32ビットのとき、AMD64と違う動作をする。
Intel64では、ゼロフラグをセットし、デスティネーションの64ビットのうち上位の32ビットをクリアする。AMD64は、デスティネーションを変更しない。ただし、元々のx86の仕様では、ソースが0の場合、デスティネーションは不定(undefined)である。
AMD64では、マイクロコードのアップデートに使用するMSR(model-specific registers)は、32ビットと64ビットで異なる。Intel64では、32ビットと64ビットで、同じMSRを使用する。
Intel64にはAMD64で定義されたSYSCFG, TOP_MEM, TOP_MEM2がMSRにない。
Intel64では、SYSCALL, SYSRET命令は、64ビットモードにしかない。SYSENTER, SYSEXIT命令は、32ビット、64ビットの両方にある。
AMD64では、SYSENTER, SYSEXIT命令は64ビットモードには、ない。
64ビットモードで、ニア分岐命令に66h(オペランドサイズ プリフィックス)を付けた場合、Intel64では、サポート外となる。AMD64では、仕様書通り16ビットオペランドとして実行される。
Intel64には、Fast FXSAVE/FXRSTOR命令がない。
最近のAMD64は、64ビットのゲストOSの仮想化を容易にするために、セグメンテーションを一部に再導入した。
以前あった差異
AMD64には、元々はCMPXCHG16B命令は、なかった。この命令はCMPXCHG8B命令の拡張である。
初期のAMD64, Intel 64は、64ビットモードで、LAHF, SAHF命令をサポートしていない。
AMDは、Athlon64,Opteron,Turion64のrevision D以降で、Intelは、Pentium 4 G1ステッピング以降でこれらの命令をサポートした。
初期のIntel64は、NXビットをサポートしていない。
初期のIntel64は、64GBまでの物理メモリしかサポートしていなかった。AMD64は1TBまでサポートしていた。
AMD64には、元々はSSE3命令、および、MONITOR, MWAIT命令は、なかった。