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

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

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

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

2023年7月にはIntelが、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に対応してリリース済み)。数年以内に製品化される予定になっている。

## 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出身者の経験がこのプロジェクトに活かされた。特筆すべき点は以下のようなものである。

### 動作モード

このアーキテクチャは、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(MS-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

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

## メモリ管理

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

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

## 特権レベル

特権レベルは80286のプロテクトモードでx86に導入され、レベル0,レベル1,レベル2,レベル3の4階層がある。リングプロテクションとも呼ばれる。x64の64ビットモードでも特権レベルは4階層あるが、通常は特権レベル0(カーネルモード)と特権レベル3(ユーザーモード)の2種類しか使用されない。

## マイクロアーキテクチャの世代

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

CPU microarchitecture levels

| Level | CPU features | Example instruction | Supported processors |
| --- | --- | --- | --- |
| x86-64 (x86-64-v1) | CMOV | cmov | 2003年頃の初期のAMD K8以降など  すべてのx86-64 CPU |
| CX8 | cmpxchg8b |
| FPU | fld |
| FXSR | fxsave |
| MMX | emms |
| OSFXSR | fxsave |
| SCE | syscall |
| SSE | cvtss2si |
| SSE2 | cvtpi2pd |
| x86-64-v2 | CMPXCHG16B | cmpxchg16b | 主に2008年頃のIntel Nehalem世代以降  Intel Nehalem and newer Intel "big" cores  Intel (Atom) Silvermont and newer Intel "small" cores  AMD Bulldozer and newer AMD "big" cores  AMD Jaguar  VIA Nano and Eden "C" |
| LAHF-SAHF | lahf |
| POPCNT | popcnt |
| SSE3 | addsubpd |
| SSE4\_1 | blendpd |
| SSE4\_2 | pcmpestri |
| SSSE3 | pshufb |
| x86-64-v3 | AVX | vzeroall | 主に2013年頃のIntel Haswell世代以降  Intel Haswell以降  Intel (Atom) Gracemont以降  AMD Excavator以降 |
| AVX2 | vpermd |
| BMI1 | andn |
| BMI2 | bzhi |
| F16C | vcvtph2ps |
| FMA | vfmadd132pd |
| LZCNT | lzcnt |
| MOVBE | movbe |
| OSXSAVE | xgetbv |
| x86-64-v4 | AVX512F | kmovw | 主に2017年頃のIntel Intel Skylake-X世代以降でAVX512が有効な場合  Intel Skylake以降  AMD Zen 4 以降 |
| AVX512BW | vdbpsadbw |
| AVX512CD | vplzcntd |
| AVX512DQ | vpmullq |
| AVX512VL | N/A |

## オペレーティングシステムの互換性と扱い

次のオペレーティングシステムは、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ビットがないため、これらのIntelのCPUではW^X機能は使えない。後にIntelは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ビットアプリケーションの開発が可能である。