X64

**x64**または**x86-64**
とは、x86アーキテクチャを64ビットに拡張した命令セットアーキテクチャ。

実際には、AMDが発表した**AMD64**命令セット、続けてインテルが採用した**Intel 64**命令セット（かつて**IA-32e**または**EM64T**と呼ばれていた）などを含む、各社のAMD64互換命令セットの総称である。x86命令セットと互換性を持っていることから、広義にはx86にx64を含む場合がある。

なお、インテルはIntel 64の他にIA-64の名前で64ビット命令セットアーキテクチャを開発・展開していたが、これは全くの別物であり、x64命令セット、x86命令セットのいずれとも互換性がない。

## AMD64
大元のAMD64は、AMDのOpteron、Athlon 64、Turion 64など最初に実装されたK8マイクロアーキテクチャとその後継製品のRyzenなどに実装されている。

### 開発経緯
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実行ファイルは、互換性あるいは性能の損失なしに動作させられる。ただし、アプリケーションソフトウェアがx64の性能を活かすには、x64ネイティブコードを出力するコンパイラを用いることが必要である。

### アーキテクチャの特徴
AMDがx86命令セットを64ビット化する際に使ったのは、x86命令の先頭にプリフィックスをつけるという手法である（REXプリフィックスと呼ばれる）。プリフィックスを使うのは、インテルが16ビットCPU 80286を32ビット化(80386)するときに使った手法でもある。
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命令で使われる）。呼出規約においても、引数渡しがIA-32では原則としてスタックのみを使用していたのが一部の引数についてレジスタ渡しに変更されたり、呼出に際して一部のレジスタの上書きを容認するなど効率が上がっている。
; アドレス空間の拡張
: AMD64アーキテクチャでは、初期の仕様で48ビット(仮想アドレス空間サイズで256テラバイト)、追加機能で57ビット(仮想アドレス空間サイズで512ペタバイト)の仮想アドレス幅を持つ。IA-32アーキテクチャにおいて初期のプロセッサでは、仮想アドレス空間は32ビットで表現できる4GiBに制約され、Pentium Pro以降の実装で追加された物理アドレス拡張機能を使用することで64GiBの物理メモリを接続できるが、その場合も仮想アドレス幅は広がらず、仮想アドレス空間はやはり4GiBに制約された。32bit版Windowsシリーズにおいては、OSの仕様でアプリケーションが利用可能なメモリはおよそ3GiBに制約される。これに対しAMD64のLongモードでは、IA-32の物理アドレス拡張をベースに、仮想アドレス空間をまず48ビットへ拡張し(現状物理アドレス空間は52ビット)、将来の拡張で4エクサバイトまでの仮想アドレス空間をサポートできるようになっている。
; 命令ポインタ相対のデータアクセス
: 命令は、命令ポインタ（RIPレジスタ）を基準にデータを参照できるようになった。これにより、共有ライブラリや実行時に読み込まれるコードでよく使用される位置独立コード（position-independent code、PIC））が、より効率的に動作するようになっている。
; SSE命令
: AMD64アーキテクチャは、当初からインテルのSSEとSSE2をコア命令として採用している。これらの命令セットは、単精度および倍精度のパックド/スカラー演算機能を提供する。SSE2は、8ビットから64ビットの精度までのデータ型に対応する整数のパックド演算機能も提供している。これらの命令は32ビットモードでも使用できる。64ビットプロセッサの普及により、これらの機能は家庭用コンピュータでも広く使われるようになり、32ビットアプリケーションの標準が向上した。例えば、32ビット版のWindows 8ではSSE2命令が必要とされている。SSE3以降のストリーミングSIMD拡張命令セットは、アーキテクチャの標準機能ではない。
:SSE/SSE2を標準機能としたものの、従来のx87 FPU命令、MMX命令も残されている。
; No-Executeビット
: NXビット(ページテーブルエントリのビット63)は仮想アドレス空間のどのページが実行可能か、実行不可かを指定することができる。NXビットがセットされたページにあるコードを実行しようとするとメモリアクセス違反となり、実行できない。これは、リードオンリーページへの書き込みを実行しようとしてもできないことと似ている。No-Execute機能は、ウイルスなどがバッファーオーバランなどを使用して、オペレーティングシステムを乗っ取ろうとすることを難しくする。
:類似の機能は、セグメントの属性として80286以降のプロセッサーに存在している。しかし、近代的なオペレーティングシステムではセグメント機能は古いものと見なされ、セグメントのベースを0、リミットを4Gバイト(32ビットOSの場合)に設定することにより、実質的にセグメントを使用していない。
:AMDはリニアアドレッシングモードでNo-Execute機能を実装した最初のx86ベンダーである。No-Execute機能は、PAEを有効にすれば、32ビットOSでも使用可能である。
; 古い機能の削除
: x86アーキテクチャーにある多くのシステムプログラミング機能は近代的なオペレーティングシステムでは使用されておらず、それら古い機能は、AMD64のLongモードにはない。それらは、セグメントアドレッシング、タスクステートセグメントを使用したタスクスイッチ、仮想86モードなどである（ただし、FS, GSセグメントは、オペレーティングシステム構造体へのエクストラベースポインタとして残されている）。これらの古い機能は、Legacyモードでは依然として、完全に実装されているので、これまでの32ビット、16ビットオペレーティングシステムは、修正なしにx64プロセッサー上で動作する。

### 動作モード

このアーキテクチャは、LongモードとLegacyモードという二つの動作モードを持つ。

#### Longモード
AMD64で拡張された部分に対応する動作モードである。これにはネイティブの64ビットモードと互換のための32ビットモードが含まれる。IA-32でのマイナーな動作モードはサポートされない。このモードは64ビットのOSで使用される。

基本的な命令セットは同じなので、x86コードを実行しても性能が低下することはない。インテルのIA-64では32ビットコードの性能低下が問題となったが、これは命令セットが全く違うためにエミュレート実行していたためである。

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（DOS - Windows 3.1等）や32ビットOS（Windows 95 - Windows XP等）で使用される。このモードにおいて、プロセッサは基本的にx86の32ビットプロセッサとして振る舞い、16ビットと32ビットのコードのみが実行可能である。Legacyモードは、仮想アドレス空間の4GB制限のような32ビットの仮想アドレッシング上の上限がある。64ビットのプログラムは、Legacyモードで起動することができない。

### AMD64を採用するCPU
以下のマイクロアーキテクチャを採用したプロセッサは、AMD64を実装する
* K8（一部のモデルのみ）
* K10
* Bulldozer/Piledriver/Steamroller/Excavator
* Bobcat/Jaguar/Puma
* Zen/Zen +/Zen 2
* Zen 3/Zen 3+/Zen 4
* Zen 5

## Intel 64
**Intel 64**は、IA-32アーキテクチャの64ビット拡張であり、インテルによるAMD64の実装である。

### 開発経緯
従来、AMDはインテルがオリジナルであるx86の互換プロセッサを開発・生産していた。しかし、x64では立場が逆転し、インテルはAMDが開発したAMD64アーキテクチャ（x86プロセッサの64ビット拡張アーキテクチャ）を採用した。

当初プロジェクトは、**Yamhill**という開発コードネームで始まった。このプロジェクトの存在を否定し続けて数年が経ち、2004年2月のIDFで、インテルはプロジェクトが進行中であることを発表した。インテルの当時の会長クレイグ・バレットは、これが重要な機密の一つであったことを認めた。

インテルは、AMD64互換命令セットの名称を数回 変更した。IDFで用いられた名前は**CT**(Clackamas Technology)、その数週間後に**IA-32e**(IA-32 extensions)と呼称を変更し、2004年4月にはこれを **EM64T**(Extended Memory 64 Technology)という名前で公式に発表した。製品リリース後の2006年7月27日には、インテルはEM64Tを**Intel 64**と改称している。

### Intel 64を採用するCPU
インテルで最初にIntel 64を実装したのは、*Nocona*というコード名で2004年6月に発表されたマルチソケットのXeonプロセッサである。Xeonはデスクトップ向け Pentium 4 をベースにしているため、同時期のPentium 4もIntel 64を実装しているはずだが、ハイパースレッディング・テクノロジーのときと同様、この機能は*Prescott*では最初は動かないようになっていた。これはおそらく初期の実装が完全ではなかったためで、インテルはその後Intel 64を使用可能にしたPrescottのE0バージョンをmodel Fとして販売し始めた。このバージョンではAMD64のNXビットに相当する機能がIntel 64でサポートされた。インテルではこれをeXecute Disable (XD) ビットと呼んでいる。この機能はすぐにNocona（Xeon系列）にも実装された。8xx/6xx/5x6/5x1/3x6/3x1シリーズのCPUは全てIntel 64が使用可能になった。また、Intel Core 2・Intel AtomでもIntel 64が採用された。

以下のマイクロアーキテクチャを採用したプロセッサは、Intel 64を実装する
* NetBurst（一部のモデルのみ）
* Core
* Bonnell（一部のモデルのみ）
* Nehalem/Westmere
* Sandy Bridge/Ivy Bridge
* Saltwell（一部のモデルのみ）/Silvermont
* Haswell/Broadwell
* Airmont
* Skylake/Kaby Lake/Coffee Lake/Cascade Lake/Comet Lake/Cooper Lake/Cannon Lake
* Goldmont/Goldmont Plus
* Rocket Lake/Ice Lake/Tiger Lake
* Tremont
* Alder Lake/Sapphire Rapids/Raptor Lake/Emerald Rapids/Meteor Lake/Granite Rapids/Sierra Forest
* Gracemont
* Arrow Lake/Lunar Lake

## 命令セット
; REXプリフィックス
:次のような命令にはREXプリフィックスを使用する。
:* 64ビットのオペランドサイズの指定
:* 新しいR8〜R15レジスタ、追加されたXMMレジスタなどへのアクセス
:* 64ビットレジスタであるRSP, RBP, RDI, RSIのビット0から7を、8ビットレジスタSPL, BPL, DIL, SILとしてアクセス。一方でREXプリフィックスを付けると8ビットレジスタとして AH, BH, CH, DHにアクセスできない。これにより直交性が高まった。
:また、以下の命令は、デフォルトで64ビットのオペランドサイズであり、REXプリフィックスを必要としない。
:* ニア分岐命令
:* PUSH, POP命令
:* ENTER, LEAVE命令
; 暗黙のゼロ拡張
:32ビットレジスタにデータを書き込むとその汎用レジスタの上位32ビット(ビット32から63)はゼロになる。
:これは、コードサイズの最適化に使用できる。
:一方、16ビットレジスタや8ビットレジスタにデータを書き込んでも、このゼロ拡張は起きない。

:**NOP**(No Operation:オペコード 90h)命令は、かつてはXCHG EAX, EAXと等価であったが64ビットモードではこの命令を特別に扱い、暗黙のゼロ拡張を適用せずRAXレジスタは変化しない。
:**CMOV**(Conditional Move)命令では、64ビットモードでオペランドが32ビットの場合、条件が偽でもデスティネーションレジスタの上位32ビットはゼロになる。
; 即値
:64ビットモードであっても、即値(Immediate value)は、32ビットのままであり、64ビットに符号拡張されて使用される。ただし、MOV命令のみ64ビットの即値が使用できる。
; 変位
:64ビットモードであっても、変位(displacement)は、32ビットのままであり、64ビットに符号拡張されて使用される。ただし、RAXレジスタに対してのMOV命令のみ64ビットの変位が使用できる。
; 64ビットモードで廃止されたx86命令
:以下のx86命令は64ビットモードでは廃止されたため、64ビットモードで実行すると不正命令例外が発生する。
:* AAA, AAD, AAM, AAS (ASCII Adjust Addition/Division/Multiply/Subtraction)
:* BOUND (Check Array Bounds)
:* CALL far absolute, JMP far absolute
:* DAA, DAS (Decimal Adjust Addition/Subtraction)
:* INTO (Interrupt to Overflow Vector)
:* LDS, LES (Load Segment Register)
:* POP DS, POP ES, POP SS, POPA
:* PUSH CS, PUSH DS, PUSH, ES, PUSH SS, PUSHA
:* オペコード 82h (Redundant encoding of opcode 80h: undocumented)
:* SALC (Set AL According to CF: undocumented)
:LAHF, SAHF命令は、初期のAMD64, Intel 64では64ビットモードで廃止されたx86命令であった。
; 64ビットモードで再割り当てされたx86命令
:* ARPL (Adjust Requestor Privilege Level)命令は、64ビットモードでは、新しいMOVSXD命令になった。
:* 1バイトのINC, DEC命令は、64ビットモードでは、REXプリフィックスになった。一方、2バイトのINC, DEC命令は、64ビットモードでも使用可能である。
:* 64ビットモードで廃止されたLDS, LES命令は、のちにインテルによってAVX命令のVEXプリフィックスとして割り当てられた。VEXプリフィックスに続く2バイト目を32ビットモードでは不正であった*11xxxxxx*という形式にすることにより、AVX命令は32ビットモードでも使用可能である。
:* 64ビットモードで廃止されたBOUND命令は、のちにインテルによってAVX-512命令のEVEXプリフィックスとして割り当てられた。EVEXプリフィックスに続く2バイト目を32ビットモードでは不正であった*11xxxxxx*という形式にすることにより、AVX-512命令は32ビットモードでも使用可能である。

## AMD64とIntel 64の差異
AMD64とIntel 64は、ほとんど同じであるが、僅かながら違いはある。これらの違いはオペレーティングシステム、コンパイラなどの開発者のみが意識しなければならない。アプリケーションプログラムの開発者がこれらの違いを意識する必要は、ほぼない。
### 差異
* Intel 64では、SYSCALL, SYSRET命令は64ビットモードにしかない。SYSENTER, SYSEXIT命令は32ビット、64ビットの両方にある。
* AMD64では、SYSCALL, SYSRET命令は32ビット、64ビットの両方にあるが、SYSENTER, SYSEXIT命令は32ビットモードにしかない。
* Intel 64には、AMD64で定義されたSYSCFG, TOP_MEM, TOP_MEM2がMSR(model-specific registers)にない。
* Intel 64では、64ビットモードでニア分岐命令に66h（オペランドサイズ プリフィックス）を付けた場合サポート外となる。AMD64では、仕様書通り16ビットオペランドとして実行される。
* Intel 64では、LFS, LGS, LSS, CALL far indirect, JMP far indirect命令にREXプリフィックスをつけると、64ビットのオフセットをロードできる。AMD64ではこの機能は仕様書にない。
* BSF, BSR命令はソースが0の場合、Intel 64では元々のx86と同様にデスティネーションは不定(undefined)であるが、AMD64はデスティネーションを変更しない。
* Intel 64にはAMDのFast FXSAVE/FXRSTOR機能はない。
* ハードウェア仮想化支援機能のIntel VT-xとAMD-Vは互換性がない。仮想化ソフトウェアはそれぞれに対応する必要がある。
* Second Level Address Translation機能のIntel EPTとAMD RVIは互換性がない。仮想化ソフトウェアはそれぞれに対応する必要がある。

### 以前あった差異
* AMD64には、元々はCMPXCHG16B命令はなかった。この命令は16バイト(128ビット)のメモリ領域を複数のCPUコアで排他的に共有することに使用される。この命令はWindowsで16TB以上の仮想メモリを使うために必要である。Socket AM2以降のAMD64で対応。
* 初期のAMD64, Intel 64は、64ビットモードでLAHF, SAHF命令をサポートしていない。この2つの命令はAHレジスタとフラグ間の転送命令で、元々は8ビットCPUである8080のプログラムを8086へ移植するのを容易にするために提供されていた。64ビットモードでは、使い道があまりない命令のように見える。しかし、メモリにアクセスせず高速にフラグをコピーでき、VMwareなどの仮想化ソフトウェアがこの2つの命令に依存している。また、x87のステータスワードをフラグにコピーすることにも使用される。
* 初期のIntel 64には、PREFETCHW命令はなかった。この命令は、元々はAMDの3DNow!で導入されたキャッシュの最適化命令である。Pentium 4のCedarMillコアからIntel 64はこの命令を単にNOP(No Operation)として処理するようになった。NOPとして処理するIntel 64でもMicrosoft社のCoreinfoツールは、PREFETCHWに対応と表示する。2013年のSilvermont、2014年のBroadwellよりPREFETCHW命令に正式に対応している。（上記3つは、Windows 8.1、Windows 10の64ビット版が初期のAMD64、Intel 64CPUにインストールできない制約事項となる）
* 初期のIntel 64は、XDビット（AMD64におけるNXビット）をサポートしていない。したがってWindows 8（32ビット版、64ビット版とも）がインストールできない制約事項となる。

### その他
* POPFQ命令には、REXプリフィックスは必要ない。インテルのドキュメントにはこのことが正しく記載されていなかった。
* 同じオペコードに対するMOVDとMOVQの割り当てがIntel 64のドキュメントとAMD64のドキュメントで異なる。一方のドキュメント通りのアセンブリソースがアセンブルできない、逆アセンブル結果が想定と異なるといったことが起こり得る。

## メモリ管理
; コードセグメントディスクリプタ
:64ビットモードでは、コードセグメントディスクリプタのP(Present)ビット、D(Default)ビット、DPL（Descriptor Privilege Level)フィールド、C(Conforming)ビット、および、新しく定義されたL(Long)ビットのみが有効である。L=1の場合、64ビットモードでプロセッサーが動作することを意味する。それ以外のベースアドレス、リミットなどは無視される。

　コードセグメントディスクリプタのフォーマット

; データセグメントディスクリプタ
:64ビットモードでは、データセグメントディスクリプタは、P(Present)ビットのみが有効である。それ以外のベースアドレス、リミットなどは無視される。ただし、FS,GSセグメントレジスタのみベースアドレスは有効で、MSRを使用して64ビットのベースアドレスを指定することもできる。
:のちにインテルは、特権レベル0以外でもFS,GSのベースアドレスを操作可能にするRDFSBASE, RDGSBASE, WRFSBASE, WRGSBASE命令を追加した。

　データセグメントディスクリプタのフォーマット

; 正規形(canonical form)
:64ビットモードでは、仮想アドレスは64ビットであるものの、実際の実装では、264バイト(16EB)のすべてを使用できるようにはなっていない。ほとんどのオペレーティングシステム、アプリケーションは、近い将来も含めて、そのような大きなアドレス空間を使用しそうにない。フル64ビットという大きなアドレス空間のサポートは、複雑さとアドレス変換のコストを増やすだけでメリットはない。そのため、AMDは最初のAMD64の実装では、48ビットの仮想アドレス空間のみを使用することにした。さらに仮想アドレスのビット48から63は、符号拡張によりビット47の値がコピーされなければならないことにした。そうでない仮想アドレスを使用した場合は、プロセッサーは例外エラーを発生する。このルールに従ったアドレスは、正規形(canonical form)と呼ばれる。正規形のアドレスは、0から00007FFF'FFFFFFFFとFFFF8000'00000000からFFFFFFFF'FFFFFFFFの範囲であり、合計で256TBの仮想アドレス空間が使用可能である。
:この仕様は、実際に64ビット仮想アドレスが使用可能になったときに重要な意味を持つ。正規形ではないアドレスを使用した場合、例外エラーが発生するので、アプリケーションやOSが、未使用の上位16ビットを別の用途に使用できない。そのため、将来、仮想アドレス空間が48ビットから拡張されたときに問題が起こらない。
:2020年頃までに、追加機能として仮想アドレスに対して初めてとなる9ビットの拡張が行われ、57ビットまでの仮想アドレスが使用できるようになった。仮想アドレス空間のサイズは512PBとなる。ビット57-63は引き続き未使用となり、正規形の仮想アドレスではビット56からの符号拡張が必要となる。
; Longモードでのページ変換(page translation)
:Longモードでのページ変換には物理アドレス拡張(PAE)が必須である。Longモードに入る前にCR4のPAEビットを1にセットする必要がある。AMD64では、PDPE(page-directory-pointer entry), PDE(page-directory entry), PTE(page-table entry)を拡張し、新たにPML4(page-map level-4)を追加した。いずれのページテーブルも、仮想アドレスのうち9ビット分を変換する。PAEが有効になっているため、CR4のPSE(page-size extensions)ビットは無視される。CPUIDのファンクション8000_0001hで、EDXのビット26がセットされていると、そのCPUは、1Gbyteページ変換に対応している。
:仮想アドレスの57ビットへの拡張に際しては、PML4のさらに上位にPML5(page-map level-5)を追加した。ページテーブルのビット幅は他のページテーブルと同じく9ビット分となる。なお、これに伴うページサイズの追加および変更はない。

:4Kbyteページ変換：  PML5(*), PML4, PDPE, PDE, PTEによって変換される。
:2Mbyteページ変換：  PML5(*), PML4, PDPE, PDEによって変換される。
:1Gbyteページ変換(*)：  PML5(*), PML4, PDPEによって変換される。

:(*) CPUがサポートしている場合にのみ使用可能。

## 特権レベル
特権レベルは80286のプロテクトモードでx86に導入され、レベル0,レベル1,レベル2,レベル3の4階層がある。リングプロテクションとも呼ばれる。x64の64ビットモードでも特権レベルは4階層あるが、通常は特権レベル0（カーネルモード）と特権レベル3（ユーザーモード）の2種類しか使用されない。
; コールゲートによるシステムコール(CALL far, RET)
:コールゲートは80286で特権レベル(0,1,2,3)を切り替える仕組みとして導入された。64ビットモードでは、コールゲートは64bitのオフセットが使用できるように拡張された。
:コールゲートの仕組みはRISCには無い。RISCにも対応していたWindows NTではシステムコールにコールゲートを使用せず、INT命令やPentium IIで追加されたSYSENTER, SYSEXIT命令を使用していた。

; 高速システムコール(SYSCALL, SYSRET)
:特権レベル3（ユーザーモード）と特権レベル0（カーネルモード）を高速に切り換える命令として、AMDは64ビットモードではx86にあるSYSENTER, SYSEXIT命令は実装せず、AMD独自のSYSCALL, SYSRET命令のみを実装した。SYSCALL命令は、CS（コードセグメント）、SS（スタックセグメント）、RIP（インストラクションポインタ）をあらかじめセットされたMSRから特権レベルのチェック無しにロードする。このときRSP(スタックポインタ)はロードされない。オペレーティングシステムは新しい**SWAPGS**命令を使用して、ユーザーモードのGSセグメントと、カーネルモードのGSセグメントを切り替え、GSセグメント経由でカーネルモードのRSPをロードする。
:なお、SYSCALLのオペコードは0Fh 05h、SYSRETのオペコードは0Fh 07hであり、これらはかつてx86に存在していた非公開命令LOADALLのオペコードを再割り当てしている。

## マイクロアーキテクチャの世代
機能拡張によりマイクロアーキテクチャの世代を分けて考える必要がある場合がある。2020 年には、AMD、インテル、Red Hat、SUSE のコラボレーションにより、x86-64 ベースラインの上に x86-64-v2、x86-64-v3、x86-64-v4 の 3 つのマイクロアーキテクチャ レベル (機能レベル) が定義された。

## アーキテクチャの拡張
### X86-S
2023年4月にはインテルが、x64の**Legacyモードを切り捨てる**ことによりLongモードのみにしてサブセット化することで回路をシンプルにして性能向上するうえで問題になっているボトルネックを解消することを目標にした**[[X86-S]]**の提案の文書を公表した。もっとも、構想が発表されただけで、具体的な製品化に関する情報は発表されていない。

### APX
2023年7月にはインテルが、x64にr16-r31の16本のレジスタを追加することを中心とした**APX**を発表した。APX対応のCPUでもx64対応のアプリケーションやOSは動作するが、逆にAPX対応のOSやアプリケーションはx64対応のCPUでは動作しない。レジスタを追加したことでレジスタへのロードやレジスタからメモリへのストアの負担が10％以上減ると期待され性能向上ができ、それに対して回路の追加は少なくて済むとされている。そのため、対応するCPUとOSとコンパイラがあれば、スタックサイズを調整してリコンパイルするだけで性能向上する。今後、32bit版のx86が64bitのx64へと推移していったように、x64からAPXにアーキテクチャを切り替えていくことが計画されている。開発環境としてIntelが開発エミュレータsde (Software Development Emulator)を提供しており、Windowsに関しては未発表であるものの、すでにGCCやLLVM CLangといったコンパイラやLinuxなどでソフトウェア側の開発が開始され、既に初期バージョンでの動作が確認されている。(LLVM CLangについては、ver.18.1-rc1でAVX10とAPXに対応してリリース済み)。数年以内に製品化される予定になっている。

## オペレーティングシステムの互換性と扱い
次のオペレーティングシステムは、x64アーキテクチャのLongモードをサポートする。

### BSD
#### FreeBSD
FreeBSDは、2003年6月の5.1-RELEASEで実験的なアーキテクチャーとして、amd64という名前でx64をサポートした。2004年1月の5.2-RELEASEでは公式なアーキテクチャーとして対応した。それ以来、FreeBSDでは、amd64をTier 1プラットフォームとしている。

#### NetBSD
x64アーキテクチャーのサポートは2001年6月19日にNetBSDのソースツリーに初めてコミットされた。2004年12月9日にリリースされたNetBSD 2.0では、NetBSD/amd64としてソースツリーに完全に統合され、公式なポートになった。32ビットのシステムコールのためのnetbsd-32カーネル互換レイヤーを通して、64ビットモードでの32ビットコードの実行がサポートされている。
NXビットは、実行不可のスタックとヒープを提供するために、使用されている。
#### OpenBSD
OpenBSDは2004年5月1日にリリースされたOpenBSD 3.5でAMD64をサポートした。ソースツリー内でのAMD64サポートの完全な実装は、実際のAMD64のハードウェアのリリースより前に行われていた。これはhackathonプロジェクトのためにAMDがいくつかのハードウェアを貸し出したためである。OpenBSDの開発者は、W^X (Write XOR Execute) 機能が容易に実装できるNXビットがあるため、AMD64プラットフォームを気に入った。
OpenBSDのAMD64ポートは、Intel 64でも走る。しかし、初期のIntel 64にはNXビットがないため、これらのインテルのCPUではW^X機能は使えない。後にインはXDビットの名前で、NXビットを追加している。

### Linux
LinuxはLongモードでx64アーキテクチャを動作させる初めてのオペレーティングシステムカーネルとなった。これは、実際のAMD64のハードウェアのリリースより前の2001年、kernel 2.4にて始められた。Linuxは32ビット実行可能ファイルの実行に関して後方互換を保っている。これにより、32ビットプログラムの使用を継続しながらLongモード用にプログラムを再コンパイルすることが可能になった。

64ビット版Linuxでは、個々のプロセスで128TBの仮想アドレス空間と64TBの物理メモリが使用できる。（ただし、これは、CPUやPCシステムにより制限される）

### Mac OS X
Mac OS X v10.4のうちv10.4.7及びそれ以降のバージョンは、64ビットのインテルベースマシン上でPOSIX及び数学ライブラリを用いて64ビットコマンドラインツールが起動する。Mac OS X v10.4において、これ以外のライブラリ、フレームワークは、64ビットアプリケーションをサポートしない。このカーネル、およびカーネル拡張は32ビットのみである。

Mac OS X v10.5は、64ビットのPowerPCマシン同様に、64ビットのインテルベース・マシンにおいてCocoa, Quartz, OpenGL, そしてX11を用いた64ビットのGUIアプリケーションをサポートした。全ての非GUIライブラリとフレームワークは、このプラットフォームで64ビットアプリケーションをサポートしている。このカーネル、そして全てのカーネル拡張は、32ビットのみである。

Mac OS X v10.6は、64ビットカーネルをサポートしたMac OS Xの最初のバージョンである。しかし、最初のリリース(v10.6.0)では、全ての64ビットコンピュータがサポートされたわけではなかった。64ビットカーネルは、32ビットカーネル同様に32ビットアプリケーションをサポートし、それぞれのカーネルも同様に64ビットアプリケーションをサポートした。32ビットアプリケーションは、いずれのカーネルにおいても仮想アドレス空間が4GBであるという制限があった。
64ビットカーネルは32ビットカーネル拡張をサポートせず、同様に32ビットカーネルは64ビットカーネル拡張をサポートしない。

OS X Mountain Lionは、64ビットカーネルのみサポートするが、32ビット、64ビットの両方のアプリケーションをサポートする。

Macは、x86/x64の32ビット・64ビットだけでなく、PowerPCとインテル・アーキテクチャのサポートなど、アーキテクチャの互換性問題が複雑に入り組んでいた為、ユーザが混乱しない為にOSレベルでユニバーサルバイナリなどの仕組みが整えられた。これは、一つのアプリケーションファイル、またはライブラリファイルに対して複数のコードをパッケージし、実行時に最適なバージョンが選択されるというものである。

### Windows
Microsoft Windowsは、2005年4月（日本においては6月）にWindows XP Professional x64 Edition(クライアント版)、Windows Server 2003 x64 Editionをリリースし、x64に対応した。元来のx86版において、Windows XP の内部バージョンは 5.1.2600、Windows Server は 5.2.3790 であったが、x64 版においてはビルド番号が同一であり（5.2.3790.1830 SP1）、システムアップデートも統一された。

Windows Vistaは2007年1月に、Windows 7は2009年7月に、Windows 8は2012年10月にリリースされた。いずれのOSも、x86 に加えて、64ビット(x64) 版としてx64をサポートするが、Itanium をサポートしない。

Windows Server 2008は2008年2月にリリースされ、x86 版、x64 版に加えて、IA-64もItanium版としてサポートした。Windows Server 2008 R2では x86 版のリリースが打ち切られ、x64 版と Itanium 版のみリリースした。Itanium 版はこの版が最終リリースとなり、Windows Server 2012 では x64 版だけがリリースされた。

x64版Windowsには以下のような機能がある。
* 1プロセスあたり8TB（Windows 8まで）又は128TB（Windows 8.1以降）のユーザーモード仮想アドレス空間。x64のプログラムは、"large address aware"オプションを付けてリンクされていれば、これらのすべてを使用できる。ただし、補助記憶装置（すなわち、ハードディスク）の容量により使用できる最大値は、制限される。一方、32ビット版Windowsで提供されているユーザーモード仮想アドレス空間は2GBである。
* オペレーティングシステム用の8TB（Windows 8まで）又は128TB（Windows 8.1以降）のカーネルモード仮想アドレス空間。一方、32ビット版Windowsで提供されているカーネルモードアドレス空間は2GBである。この増加した空間のメリットは、ファイルシステムのキャッシュやカーネルモードヒープに使用できる。Windows 8までのWindowsはプロセッサーで実装されている256TBのアドレス空間のうち合計16TBしか使用できない。これは、初期のAMD64がCMPXCHG16B命令をサポートしていないためである。
* WOW64を使用して、既存の32ビットアプリケーション(.exeプログラム)とダイナミックリンクライブラリ(.dll)を実行する機能。さらに、32ビットアプリケーションが"large address aware"オプションを付けてリンクされていれば、そのアプリケーションは64ビットWindows上で、4GBの仮想アドレス空間を使用できる。一方、32ビットWindowsでは、デフォルトの仮想アドレス空間は2GBで、/3GBのブートオプションを付けてWindowsを起動し、"large address aware"オプションを付けてリンクされたアプリケーションであれば3GBである。/3GBのブートオプションを付けて起動した32ビットのWindowsとは異なり、64ビットWindowsではカーネルモード仮想アドレス空間が減らない。そのため、32ビットアプリケーションは、x64用に再コンパイルしなくても、64ビットWindows上で動作させることにメリットがある。
* 32ビット、および、64ビットのアプリケーションは、"large address aware"オプションを付けてリンクされていなければ、仮想アドレス空間は2GBに制限される。
* Windows XP/Vistaでは128GB, Windows 7では192GB、Windows 8では512GB、Windows Server 2003では1TB、Windows Server 2008では2TB、Windows Server 2012では4TBまでのRAMを使用可能。
* LLP64データモデルを採用。intとlongは32ビット、long longは64ビット、ポインタとポインタから派生したデータ型は64ビットである。
* カーネルモードデバイスドライバは64ビットでなければならない。32ビットのカーネルモードデバイスドライバは 64ビット版Windowsでは動作しない。ユーザーモードデバイスドライバは、32ビット、64ビットのどちらも64ビット版Windowsで動作する。
* 16ビットWindows(Win16)アプリケーションとDOSアプリケーションは64ビット版Windowsでは動作しない。これは、64ビットモードに仮想86モードがないため、64ビット版Windowsから仮想DOSマシンサブシステム(NTVDM)を削除したためである。
* NX(No Execute)ページ保護機能の完全な実装。この機能は32ビット版WindowsでもPAEモードで起動すれば使用できる。
* x86版のWindows NTファミリーでFSセグメントが使われている代わりに、x64ではGSセグメントがオペレーティングシステムが定義する2つの構造体を指している。ユーザーモードでのスレッドインフォメーションブロック(NT_TIB)とカーネルモードでのプロセスコントロールリージョン(KPCR)である。たとえば、ユーザーモードでは、GS:0はスレッドインフォメーションブロックの最初のメンバーのアドレスである。この規則を維持することによりx64版Windowsの開発が容易になった。しかし、AMDに対して、LongモードでFS, GSセグメントの機能を保持することを要求することになった。（ただし、セグメントアドレッシング自体は、近代的なオペレーティングシステムで使われるものではない）
* Microsoft Visual Studio 2005以降では、64ビット版Windowsのみで動作する64ビットアプリケーション、32ビット版Windowsと64ビット版WindowsのWOW64上の両方で動作する32ビットアプリケーションの開発が可能である。

## 脚注

### 注釈

### 出典

## 参考文献
* Intel 64 and IA-32 Architectures Software Developer Manuals
* AMD64 Architecture Programmer's Manual

## 関連項目
* プロセッサ - 命令セット - レジスタ (コンピュータ) - アドレッシングモード
* 32ビット - x86 - IA-32
* 64ビット - **x64** / IA-64
* Windows NT系#32ビットと64ビット

## 外部リンク
* AMD64 プラットフォーム
* アーキテクチャ技術資料
* インテル 64 アーキテクチャー