| デザイナー | インテル、AMD |
|---|---|
| ビット | 16ビット、32ビット、64ビット |
| 紹介された | 1978 (16 ビット)、1985 (32 ビット)、2003 (64 ビット) |
| デザイン | CISC |
| タイプ | レジスターメモリ |
| エンコーディング | 変数(1~15バイト) |
| 分岐 | コンディションコード |
| エンディアン | 少し |
| ページサイズ | 8086 – i286 : なしi386、i486 : 4 KB ページP5 Pentium : 4 MB ページを追加(レガシーPAE : 4 KB→2 MB) x86-64 : 1 GB ページを追加 |
| 拡張機能 | x87、IA-32、x86-64、MMX、3DNow!、SSE、MCA、ACPI、SSE2、NXビット、SMT、SSE3、SSSE3、SSE4.1、SSE4.2、AES-NI、CLMUL、SM3、SM4、RDRAND、SHA、MPX、SME、SGX、XOP、F16C、ADX、BMI、FMA、AVX、AVX2、AVX-VNNI、AVX-IFMA、AVX512、AVX10、AMX、VT-x、VT-d、AMD-V、AMD-Vi、TSX、ASF、TXT、APX |
| 開ける | 混合 |
| レジスタ | |
| 汎用 |
|
| 浮動小数点 |
|
x86 ( 80x86 [ 1 ]または8086 ファミリーとも呼ばれる)[ 2 ]は、インテルが最初に開発した、 8086マイクロプロセッサとその 8 ビット外部バス版である8088に基づく、複雑命令セットコンピュータ(CISC)命令セットアーキテクチャ[ a ]のファミリーです。8086 は、1978 年に、インテルの8 ビット8080マイクロプロセッサの完全な16 ビット拡張として導入され、メモリ分割が、通常の 16 ビット アドレスでカバーできる以上のメモリをアドレス指定するための解決策として採用されました。「x86」という用語は、インテルの 8086 プロセッサの後継機のいくつかの名前が「86」で終わることから生まれました。これには、 80186、80286、80386、80486などが含まれます。口語的には、彼らの名前は「186」「286」「386」「486」だった。
この用語は、 IBM PC 互換性と同義ではありません。なぜなら、IBM PC 互換性は、他の多数のコンピュータ ハードウェアを意味するからです。組み込みシステムや汎用コンピュータは、 PC 互換市場が始まる前から x86チップを使用しており、[ b ]その一部はIBM PC (1981 年) の登場よりも前に使用されていました。
2022年6月現在 デスクトップコンピュータやノートパソコンのほとんどはx86アーキテクチャファミリーに基づいて販売されているが[ 3 ] 、スマートフォンやタブレットなどのモバイルカテゴリはARMが主流である。ハイエンドでは、x86は計算集約型のワークステーションやクラウドコンピューティングセグメントで引き続き優位を占めている[ 4 ] 。
1980年代から1990年代初頭にかけて、8088と80286がまだ広く使われていた頃は、x86という用語は通常、8086互換のCPU全般を指していました。しかし今日では、x86は通常、80386の32ビット命令セットとのバイナリ互換性を意味します。これは、この命令セットが多くの最新オペレーティングシステムの共通基盤となっていること、そしておそらく1985年の80386の登場以降、この用語が一般的になったことが理由でしょう。
8086と8088の導入から数年後、Intelは、野心的だが不運なIntel iAPX 432プロセッサの「iAPX」を、より成功した8086ファミリーのチップに適用することで、命名規則と用語に複雑さを加えた。 [ c ] 8087や8089などのコプロセッサや、よりシンプルなIntel独自のシステムチップを含む8086システムは、 iAPX 86システムとして記述された。[ d ]また、 iRMX(オペレーティングシステム用)、iSBC(シングルボードコンピュータ用)、iSBX (8086アーキテクチャに基づくマルチモジュールボード用)といった用語もあり、これらはすべてMicrosystem 80という見出しの下にまとめられていた。 [ 6] [ 7 ]しかし、この命名規則は一時的なもので、1980年代初頭の数年間しか続かなかった。[ f ]
8086は主に組み込みシステムや小型のマルチユーザーまたはシングルユーザーコンピュータ向けに開発され、8080互換のZilog Z80の成功に対抗する形で開発されましたが、[ 8 ] x86シリーズはすぐに機能と処理能力が向上しました。今日では、x86は据え置き型およびポータブル型のパーソナルコンピュータで広く普及しており、ビデオゲームコンソール、ミッドレンジコンピュータ、ワークステーション、サーバー、そしてTOP500リストのほとんどの新しいスーパーコンピュータクラスタでも使用されています。多数のx86オペレーティングシステムを含む多くのソフトウェアが、 x86ベースのハードウェアを使用しています。
しかし、最新の x86 は組み込みシステムでは比較的まれです。小型の低電力アプリケーション (小型バッテリーを使用) や、家電製品や玩具などの低価格マイクロプロセッサ市場では、x86 の存在感はほとんどありません。[ g ]ここでは、シンプルな 8 ビットおよび 16 ビットベースのアーキテクチャが一般的で、 ARMやRISC-Vのようなよりシンプルな RISC アーキテクチャも一般的ですが、x86 互換のVIA C7、VIA Nano、AMDのGeode、Athlon Neo、Intel Atom は、比較的低電力で低コストのセグメントで使用される 32 ビットおよび64 ビット設計の例です。
Intel を含むいくつかの企業が、最初のシンプルな 8 ビット マイクロプロセッサから直接設計された「洗練されていない」 x86 アーキテクチャの市場支配を終わらせようと試みてきました。その例としては、 iAPX 432 (当初Intel 8800 [ 9 ]というプロジェクト名だった)、Intel 960、Intel 860、および Intel/Hewlett-Packard Itaniumアーキテクチャが挙げられます。しかし、x86マイクロアーキテクチャ、回路、および半導体製造の継続的な改良により、多くの分野で x86 を置き換えることは困難です。AMD の x86 の 64 ビット拡張 (Intel は最終的に互換性のある設計で対応しました) [ 10 ]と、最新のマルチコア CPU の形での x86 チップのスケーラビリティにより、確立された業界標準の継続的な改良が、まったく新しいアーキテクチャとの競争に抵抗できる例が x86 にあります。[ 11 ]
一部の高度な機能については、x86版ではIntelからのライセンスが必要となる場合がありますが、不要な機能もあります。また、x86-64版ではAMDからの追加ライセンスが必要となる場合があります。
下の表は、x86ファミリーの様々なアーキテクチャを実装したプロセッサのモデルとモデルシリーズを、時系列順に一覧にしたものです。各項目は、大幅に改良された、あるいは商業的に成功したプロセッサのマイクロアーキテクチャ設計を特徴としています。

IBM、VIA、NEC、[ h ] AMD、TI、STM、富士通、OKI、シーメンス、Cyrix、Intersil、C&T、NexGen、UMC、DM&Pなどの企業は、さまざまな時期にパーソナルコンピュータや組み込みシステム向けのx86プロセッサ(CPU)の設計や製造を開始しました[ i ] 。x86またはx87プロセッサを設計または製造した他の企業には、ITT Corporation、National Semiconductor、ULSI System Technology、Weitekなどがあります。
こうしたx86の実装は、単純なコピーであることは稀で、多くの場合、異なる内部マイクロアーキテクチャと、電子レベルおよび物理レベルでの異なるソリューションを採用していた。当然のことながら、初期の互換マイクロプロセッサは16ビットであり、32ビット設計ははるか後になって開発された。パーソナルコンピュータ市場向けには、1990年頃からi386およびi486互換プロセッサが本格的に登場し始め、それらはしばしばインテルのオリジナルチップと同様の名称が付けられた。
完全パイプラインのi486に続き、1993 年にIntel は新しいスーパースカラx86 設計群にPentiumブランド名 (番号とは異なり商標登録可能)を導入しました。x86 の命名規則が法的に承認されたため、他の x86 ベンダーは x86 互換製品に別の名前を選択する必要があり、当初は番号付け規則のバリエーションを継続することを選択したベンダーもありました。IBMはCyrixと提携して5x86を製造し、その後、投機的実行を可能にするためにレジスタリネーミングを実装した最初の x86 マイクロプロセッサである Cyrix 設計の非常に効率的な6x86 (M1) および6x86 MX ( MII ) ラインを製造しました。
一方、AMDは、先進的ではあるものの発売が遅れた5k86(K5)を設計・製造した。これは内部的には、AMDの以前の29K RISC設計に密接に基づいており、 NexGenのNx586と同様に、専用のパイプラインステージがx86命令を均一で扱いやすいマイクロオペレーションにデコードするという戦略を採用していた。この方法は、今日に至るまでほとんどのx86設計の基礎となっている。
これらのマイクロプロセッサの初期バージョンには、放熱の問題があった。6x86はいくつかの軽微な互換性の問題にも悩まされ、Nx586は浮動小数点演算ユニット(FPU)と(当時重要だった)ピン互換性を欠いていた。また、K5は(最終的に)登場した際、性能がやや期待外れだった。
ペンティウム シリーズの代替品に関する顧客の無知も、K5 がペンティウムとの互換性が非常に高く、6x86が整数コードでペンティウムより大幅に高速であったにもかかわらず、これらの設計が比較的成功しなかった要因の一つとなった。[ j ] AMD は後に、非常に成功したAthlonとOpteronに続くK6プロセッサ セットで本格的な競合相手に成長することに成功した。
Centaur Technology (旧IDT )、Rise Technology、Transmetaなど、他にも競合企業があった。Centaur社が設計したVIA Technologiesのエネルギー効率の高いC3およびC7プロセッサは、 2005年の発売後、長年にわたって販売された。Centaur 社の 2008 年の設計であるVIA Nanoは、スーパースカラ実行と投機的実行を備えた同社初のプロセッサだった。これは、Intel がP5 Pentiumに続く初の「インオーダー」プロセッサであるIntel Atomを発表したのとほぼ同時期 (2008 年) に発表された。
オリジナルの x86 命令セットには、長年にわたって多くの追加機能や拡張機能が追加されてきましたが、ほぼ一貫して完全な後方互換性が維持されています。[ k ]このアーキテクチャ ファミリーは、Intel、 Cyrix、AMD、VIA Technologiesおよびその他多くの企業のプロセッサに実装されています。また、Zet SoC プラットフォーム (現在は非アクティブ) のようなオープンな実装もあります。[ 14 ]それにもかかわらず、これらのうち、x86 アーキテクチャ ライセンスを保有しているのは Intel、AMD、VIA Technologies、およびDM&P Electronicsのみであり、これらのうち、最新の 64 ビット設計を積極的に生産しているのは最初の 2 社のみであるため、x86 プロセッサでは Intel と AMD の「寡占」と呼ばれる状況が生じています。
しかし、2014年に上海に拠点を置く中国企業Zhaoxin(中国企業とVIA Technologiesの合弁会社)は、デスクトップおよびノートパソコン向けのVIAベースのx86プロセッサの設計を開始しました。AMDやIntelのチップほど高速ではありませんが、依然として最先端である最新の「7」ファミリー[ 15 ]のx86プロセッサ(例:KX-7000)[ 16 ]のリリースは2021年に予定されていましたが、2022年3月の時点ではリリースされていませんでした。[ 17 ]
命令セットアーキテクチャは、2度にわたってより大きなワードサイズに拡張されました。1985年、インテルは32ビットの80386(後にi386として知られる)をリリースし、これはその後数年間でコンピュータ(ただし組み込みシステムでは通常使用されない)の以前の16ビットチップを徐々に置き換えていきました。この拡張されたプログラミングモデルは、当初は(最初の実装と同様に) i386アーキテクチャと呼ばれていましたが、インテルは後に(関連性のない)IA-64アーキテクチャを導入する際に、これをIA-32と名付けました。
1999年から2003年にかけて、AMDはこの32ビットアーキテクチャを64ビットに拡張し、初期の文書ではx86-64 、後にAMD64 と呼んだ。IntelはすぐにAMDのアーキテクチャ拡張をIA-32eという名前で採用し、後にEM64Tという名前を使用し、最終的にIntel 64を使用した。MicrosoftとSun Microsystems / Oracleも「x64」という用語を使用しており、多くのLinuxディストリビューションとBSDも「amd64」という用語を使用している。たとえば、Microsoft Windowsは32ビット版を「x86」、64ビット版を「x64」と指定しており、64ビット版Windowsのインストールファイルは「AMD64」というディレクトリに配置する必要がある。[ 18 ]
2023年、インテルはX86S(旧称X86-S)と呼ばれるアーキテクチャの大幅な変更を提案した。X86Sの「S」は「簡素化」を意味し、従来の実行モードや命令のサポートを削除することを目的としていた。
この提案を実装したプロセッサは、レガシーモードのサポートを欠き、直接ロングモードで実行を開始し、ページングなしモードを経由せずに5レベルページングに切り替える方法を提供するものであった。
新しいアーキテクチャでは、16 ビットおよび 32 ビットのオペレーティングシステムのサポートが削除される予定でした。32 ビットコードはリング 3 で実行されるユーザー アプリケーションでのみサポートされ、ロング モードと同じ簡略化されたセグメンテーションが使用される予定でした。[ 19 ] [ 20 ]
具体的に削除された機能には以下が含まれるだろう: [ 21 ]
ドラフト仕様は複数回更新され、2024年6月までにバージョン1.2に達した。インテルとAMDによるx86エコシステム諮問グループ の結成に伴い、2024年12月をもって最終的に放棄された。 [ 22 ]
x86アーキテクチャは、可変命令長で、主に「CISC 」設計であり、後方互換性を重視しています。ただし、命令セットは典型的なCISCではなく、基本的には単純な8ビットの8008および8080アーキテクチャの拡張バージョンです。バイトアドレッシングが有効で、ワードはリトルエンディアンのバイト順でメモリに格納されます。ほぼすべての命令で、アラインメントされていないアドレスへのメモリアクセスが許可されています。整数演算とメモリ アドレス(またはオフセット)の最大ネイティブ サイズは、アーキテクチャの世代に応じて16、32、または64 ビットです(新しいプロセッサには、より小さな整数の直接サポートも含まれています)。複数のスカラー値は、後世代に存在するSIMDユニットを介して同時に処理できます(以下で説明します)。[ l ]頻繁に発生するケースまたはコンテキストで、-128~127の範囲で十分な場合は、即値アドレッシング オフセットと即値データを8ビットの量として表現できます。したがって、一般的な命令の長さは2バイトまたは3バイトである(ただし、もっと長いものや、1バイトのものもある)。
エンコード領域をさらに節約するため、ほとんどのレジスタは3 ビットまたは 4 ビットのオペコードで表現され、後者は64 ビット モードのオペコード プレフィックスを介して表現されます。一方、命令のオペランドは最大で 1 つしかメモリ ロケーションにできません。[ m ]ただし、このメモリ オペランドは宛先 (またはソースと宛先の組み合わせ) にもなり得ますが、もう一方のオペランドであるソースはレジスタまたは即値のいずれかになります。他の要因の中でも、これは 8 ビット マシンに匹敵するコード サイズに貢献し、命令キャッシュ メモリの効率的な使用を可能にします。汎用レジスタの数が比較的少ない (これも 8 ビットの祖先から受け継がれています) ため、レジスタ相対アドレッシング (小さな即値オフセットを使用) は、特にスタック上のオペランドにアクセスする重要な方法となっています。そのため、このようなアクセスをレジスタ アクセスと同速にすること、つまり、アクセスするデータがトップ レベル キャッシュにあるほとんどの場合、1 サイクルの命令スループットを実現するために、多くの努力が注がれてきました。
80ビットの内部レジスタを備えた専用の浮動小数点プロセッサである8087は、オリジナルの8086向けに開発されました。このマイクロプロセッサはその後、拡張版の80387へと発展し、後継のプロセッサでは、この機能の下位互換性のあるバージョンがメインプロセッサと同じマイクロプロセッサに組み込まれました。これに加えて、最新のx86設計にはSIMDユニット(後述のSSEを参照)も含まれており、命令は(1つまたは2つの)128ビットワードで並列に動作できます。各ワードには、それぞれ2つまたは4つの浮動小数点数(それぞれ64ビットまたは32 ビット幅)が含まれるか、あるいは2つ、4つ、8つまたは16個の整数(それぞれ64ビット、32ビット、16ビットまたは8 ビット幅)が含まれます。
SIMD レジスタの幅が広いということは、既存の x86 プロセッサが 1 つの命令で最大 128 ビットのメモリ データをロードまたはストアでき、また、128 ビット全体の量に対してビット演算 (整数演算[ n ]は除く) を並列に実行できることを意味します。 Intel のSandy Bridgeプロセッサは、 Advanced Vector Extensions (AVX) 命令を追加し、SIMD レジスタの幅を 256 ビットに拡張しました。Knights Corner Xeon Phiプロセッサで実装されている Intel Initial Many Core 命令、およびKnights Landing Xeon Phi プロセッサとSkylake-Xプロセッサで実装されているAVX-512命令は、512 ビット幅の SIMD レジスタを使用します。
実行中、現在の x86 プロセッサは、ほとんどの命令をマイクロオペレーションと呼ばれる小さな断片に分割するために、いくつかの追加のデコード手順を使用します。これらは、 x86 セマンティクスに従ってバッファリングおよびスケジューリングする制御ユニットに渡され、複数の (多かれ少なかれ特殊化された)実行ユニットの 1 つによって部分的に並列に実行できます。これらの最新の x86 設計は、パイプライン化され、スーパースカラであり、また、アウトオブオーダー実行および投機的実行(分岐予測、レジスタリネーミング、およびメモリ依存性予測による) が可能であるため、複数の (部分的または完全な) x86 命令を同時に実行でき、必ずしも命令ストリームで指定された順序と同じ順序で実行する必要はありません。[ 23 ] 一部の Intel CPU ( Xeon Foster MP、一部のPentium 4、一部のNehalemおよびそれ以降のIntel Coreプロセッサ) および AMD CPU ( Zen以降) は、コアごとに2 つのスレッド( Xeon Phiはコアごとに 4 つのスレッド) による同時マルチスレッドも可能です。一部のIntel製CPUは、トランザクショナルメモリ(TSX)をサポートしています。
1990年代半ばに導入されたこの方法は、マーケティング上の理由もあり、「RISCコア」または「RISC変換」と呼ばれることもありましたが、これはこれらのマイクロオペレーションが特定の種類のRISC命令といくつかの特性を共有しているためでもあります。しかし、従来のマイクロコード(1950年代から使用されている)も本質的に多くの同じ特性を共有しています。新しい方法の主な違いは、マイクロオペレーションへの変換が非同期で行われるようになったことです。実行ユニットとデコード手順を同期させる必要がないため、(バッファリングされた)コードストリームの分析の可能性が広がり、並列実行可能な操作を検出して、複数の実行ユニットに同時に供給することが可能になります。
最新のプロセッサは、必要に応じてその逆の動作も行います。つまり、特定のx86シーケンス(比較命令に続く条件付きジャンプなど)を、実行モデルにより適した、より複雑なマイクロオペレーションに組み合わせることで、より高速に、あるいはより少ないマシンリソースで実行できるようにします。
パフォーマンスを向上させるもう 1 つの方法は、デコードされたマイクロオペレーションをキャッシュすることです。これにより、プロセッサはデコードされたマイクロオペレーションを再度デコードする代わりに、特別なキャッシュから直接アクセスできます。インテルはこのアプローチをNetBurstマイクロアーキテクチャ (Pentium 4 プロセッサ用) の実行トレース キャッシュ機能、および後に Decoded Stream Buffer (Sandy Bridge 以降の Core ブランドのプロセッサ用) で採用しました。[ 24 ]
Transmeta社は、 Crusoe x86互換CPUにおいて、全く異なる手法を採用した。同社は、ジャストインタイム変換を用いて、x86命令をCPUのネイティブVLIW命令セットに変換した。Transmeta社は、この手法によって、従来のx86実装における複雑なデコード処理を省略できるため、より電力効率の高い設計が可能になると主張した。
16ビットプロセッサモードのアドレッシングモードは、次の式で要約できます。 [ 25 ] [ 26 ]
32ビットx86プロセッサモードのアドレッシングモード[ 27 ]は、次の式で要約できます。[ 28 ]
64ビットプロセッサモードのアドレッシングモードは、次の式で要約できます。[ 28 ]
64ビットコードにおける命令相対アドレッシング(RIP + 変位、ここでRIPは命令ポインタレジスタ)は、位置独立コード(一部のオペレーティングシステムの共有ライブラリで使用されているもの)の実装を簡素化します。 [ 29 ]
オリジナルのIntel 8086および8088 には 14 個の 16ビットレジスタがあります。そのうち 4 つ (AX、BX、CX、DX) は汎用レジスタ (GPR) ですが、それぞれに別の用途がある場合もあります。たとえば、ループ命令でカウンタとして使用できるのは CX のみです。それぞれは 2 バイトの別々の値としてアクセスできます (したがって、BX の上位バイトは BH、下位バイトは BL としてアクセスできます)。2 つのポインタ レジスタには特別な役割があります。SP (スタック ポインタ) はスタックの「トップ」を指し、BP (ベース ポインタ) はスタック内の他の場所を指すためによく使用され、通常はローカル変数より上です (フレーム ポインタを参照)。レジスタ SI、DI、BX、BP はアドレス レジスタであり、配列のインデックスにも使用できます。
メモリ アドレスは、4 つのセグメント レジスタ (CS、DS、SS、ES) のうちの 1 つを使用して生成されます。初期の 8086 / 8088 / 80186 / 80188 では、すべてのアドレスはセグメント レジスタと汎用レジスタのいずれか 1 つから構成されていました。たとえば、ds:si は [16 * ds + si] として構成されたアドレスの表記であり、16 ビットではなく 20 ビットのアドレス指定を可能にしていましたが、これは後のプロセッサで変更されました。当時は、特定の組み合わせのみがサポートされていました。
FLAGSレジスタには、キャリーフラグ、オーバーフローフラグ、ゼロフラグなどのフラグが含まれています。最後に、命令ポインタ(IP)は、メモリからフェッチされて実行される次の命令を指します。このレジスタは、プログラムから直接アクセス(読み取りまたは書き込み)することはできません。[ 30 ]
8086には64 KBの 8 ビット (または代替として32 Kワードの16ビットI /O空間、そして コンピュータのハードウェアがサポートするメモリ上のスタックは64KB ( 1セグメント)です。スタックにはワード(2バイト)しかプッシュできません。スタックは数値的に小さいアドレスに向かって成長し、SS:SPは最後にプッシュされた項目を指します。割り込みは256種類あり、ハードウェアとソフトウェアの両方から呼び出すことができます。割り込みはカスケード接続が可能で、スタックを使用してステータスと戻りアドレスを格納します。
Intel 80186と80188は、それぞれ8086または8088 CPUのアップグレード版であり、オンチップ周辺機器が追加されています。また、8086および8088と同じCPUレジスタを備えています(周辺機器用のインターフェースレジスタも追加されています)。
8086、8088、80186、および80188は、オプションの浮動小数点コプロセッサである8087を使用できます。プログラマからは、8087はCPUの一部として認識され、80ビット幅のレジスタst(0)からst(7)が8つ追加されます。各レジスタは、32ビット、64ビット、または80ビットの浮動小数点、16ビット、32ビット、または64ビット(バイナリ)の整数、および80ビットのパック10進整数の7つの形式のいずれかで数値データを保持できます。[ 7 ]: S-6、S-13..S-15また、 fstsw命令でアクセスできる独自の16ビットステータスレジスタがあり、その一部のビットを通常のFLAGSにコピーして分岐に使用するのが一般的です。[ 31 ]
Intel 80286では、プロテクトモードをサポートするために、3つの特殊レジスタ(GDTR、LDTR、IDTR)に記述子テーブルのアドレスが格納され、4つ目のタスクレジスタ(TR)はタスク切り替えに使用されます。80287は80286用の浮動小数点コプロセッサであり、8087と同じレジスタとデータフォーマットを備えています。

32ビット80386プロセッサの登場に伴い、16ビットの汎用レジスタ、ベースレジスタ、インデックスレジスタ、命令ポインタ、およびFLAGSレジスタ(セグメントレジスタを除く)が32ビットに拡張されました。この拡張は、 x86アセンブリ言語のレジスタ名に 「E 」(「extended」の略)を接頭辞として付けることで表されました。したがって、AXレジスタは新しい32ビットEAXレジスタの下位16ビットに対応し、SIはESIの下位16ビットに対応するなどとなります。汎用レジスタ、ベースレジスタ、およびインデックスレジスタはすべてアドレッシングモードのベースとして使用でき、スタックポインタを除くこれらのレジスタはすべてアドレッシングモードのインデックスとして使用できます。
2つの新しいセグメントレジスタ(FSとGS)が追加されました。レジスタ、命令、オペランドの数が増えたため、マシンコード形式が拡張されました。下位互換性を確保するため、実行可能コードを含むセグメントには、16ビット命令または32ビット命令のいずれかが含まれているようにマークできます。特別なプレフィックスを使用することで、16ビットセグメントに32ビット命令を含めたり、その逆も可能です。
80386 には、オプションの浮動小数点コプロセッサである80387がありました。8087 や 80287 と同様に、80 ビット幅のレジスタ st(0) から st(7) が 8 つありました。[ 32 ] 80386 は 80287 コプロセッサも使用できました。[ 33 ] 80486 は、オンチップ浮動小数点処理ユニット (FPU) を搭載したものと搭載していないものがありました。それ以降のすべての x86 モデルには、オンチップ FPU が搭載されています。
Pentium MMX では、8 つの 64 ビットMMX整数ベクトルレジスタ (MM0 ~ MM7、下位ビットは 80 ビット幅の FPU スタックと共有) が追加されました。[ 34 ] Pentium IIIでは、Intel は 32 ビットのStreaming SIMD Extensions (SSE) 制御/ステータスレジスタ (MXCSR) と 8 つの 128 ビット SSE 浮動小数点レジスタ (XMM0 ~ XMM7) を追加しました。[ 35 ]
AMD Opteronプロセッサから始まり、x86 アーキテクチャは 16 ビットから 32 ビットへの拡張と同様の方法で 32 ビット レジスタを 64 ビット レジスタに拡張しました。Rプレフィックス (「レジスタ」の略) は 64 ビット レジスタ (RAX、RBX、RCX、RDX、RSI、RDI、RBP、RSP、RFLAGS、RIP)を識別し、x86-64 の作成時に 8 つの追加の 64 ビット汎用レジスタ (R8~R15) も導入されました。また、8 つの SSE ベクトル レジスタ (XMM8~XMM15) も追加されました。ただし、これらの拡張機能は 64 ビット モードのみで使用可能であり、これはロング モードのみで使用可能な 2 つのモードの 1 つです。アドレッシングモードは32ビットモードから大きく変更されたわけではなく、アドレッシングが64 ビットに拡張され、仮想アドレスが64 ビットに符号拡張される(仮想アドレスにモードビットを使用できないようにするため)、その他のセレクタの詳細が大幅に削減された、という点のみが異なっている。さらに、一部のオペレーティングシステムの共有ライブラリで使用される位置独立コードの実装を容易にするため、 RIP(命令ポインタ)を基準としたメモリ参照を可能にするアドレッシングモードが追加された。
SIMDレジスタはXMM0~XMM15( AVX-512がサポートされている場合はXMM0~XMM31 )です。
SIMDレジスタはYMM0~YMM15(AVX-512対応時はYMM0~YMM31)です。各YMMレジスタの下位半分は、対応するXMMレジスタにマッピングされます。
SIMDレジスタはZMM0~ZMM31です。各ZMMレジスタの下半分は、対応するYMMレジスタにマッピングされます。
保護モードを備えたx86プロセッサ、つまり80286以降のプロセッサには、3つのディスクリプタレジスタ(GDTR、LDTR、IDTR)とタスクレジスタ(TR)も備わっています。
32 ビット x86 プロセッサ (80386 から始まる) には、制御レジスタ(CR0 ~ 4、64 ビットのみ CR8)、デバッグレジスタ(DR0 ~ 3、さらに 6 と 7)、テストレジスタ(TR3 ~ 7、80486 のみ)、モデル固有レジスタ(MSR、Pentium [ o ]で登場) などのさまざまな特殊/その他のレジスタも含まれています。
AVX-512には、ベクトルレジスタ内の要素を選択するための8つの64ビットマスクレジスタ(K0~K7)が追加されています。ベクトルレジスタと要素の幅によっては、特定の命令で使用できるのはマスクレジスタのビットのサブセットのみとなる場合があります。
命令セットの32ビット版と64ビット版では、メインレジスタ(命令ポインタを除く)は「汎用」であり、何にでも使用できますが、当初は以下の目的で使用されることが想定されていました。
セグメントレジスタ:
64ビットモードでのみ使用可能な残りの8つのレジスタについては、特に用途は想定されていませんでした。
これらのレジスタを本来の目的に沿って使用すると、一部の命令はコンパイルおよび実行効率が向上します。例えば、ALレジスタをアキュムレータとして使用し、そこに即値バイト値を加算すると、効率的なAL加算オペコード04hが生成されます。一方、BLレジスタを使用すると、汎用的でより長いレジスタ加算オペコード80C3hが生成されます。また、倍精度除算と乗算は、AXレジスタとDXレジスタを特に利用して動作します。
現代のコンパイラは、レジスタを均一に扱うことができる(ミニコンピュータのように) sibバイト(スケール・インデックス・ベースバイト)の導入によって恩恵を受けています。しかし、sibバイトを普遍的に使用することは最適ではありません。必要な場合にのみ選択的に使用する場合よりもエンコードが長くなるためです。(sibバイトの主な利点は、直交性とより強力なアドレッシングモードを提供することであり、これにより命令数を削減し、インデックスのスケーリングなどのアドレス計算にレジスタを使用できるようになります。)一部の特殊命令はハードウェア設計において優先順位を失い、同等の小さなコードシーケンスよりも遅くなりました。顕著な例として、LODSW命令が挙げられます。
注:?PLレジスタは64ビットモードでのみ使用可能です。
注:?ILレジスタは64ビットモードでのみ使用可能です。
リアルアドレスモード[ 36 ]は、一般にリアルモードと呼ばれ、 8086以降のx86互換CPUの動作モードです。リアルモードの特徴は、20ビットのセグメント化されたメモリアドレス空間(つまり、アドレス指定できるメモリは1MiB強[ p ]のみ)、周辺ハードウェアへのソフトウェアによる直接アクセス、およびハードウェアレベルでのメモリ保護やマルチタスクの概念がないことです。80286シリーズ以降のすべてのx86 CPUは、電源投入時にリアルモードで起動します。80186以前のCPUは、後のチップのリアルモードに相当する動作モードが1つしかありませんでした。(IBM PCプラットフォームでは、BIOSがリアルモード用に記述されているため、IBM BIOSルーチンへのソフトウェアによる直接アクセスはリアルモードでのみ可能です。ただし、これはx86 CPUの特性ではなく、IBM BIOSの設計によるものです。)
64KBを超えるメモリを使用するには 、セグメントレジスタを使用する必要があります。これにより、コンパイラ実装者は大きな問題に直面し、セグメントアーキテクチャの暗黙的な性質をさまざまな程度で活用するために、「near」、「far」、「huge」などの特殊なポインタモードを導入しました。その結果、一部のポインタは暗黙的なセグメント内の16ビットオフセットを含み、他のポインタはセグメント内のセグメントアドレスとオフセットを含むようになりました。技術的には、 4 つのセグメント レジスタすべてを一度設定し、16 ビット オフセット (オプションでデフォルト セグメント オーバーライド プレフィックス付き) のみを使用して メモリをアドレス指定することで、コードとデータに最大 256 KB、コードに最大 64 KB のメモリを使用することは可能ですが、これはデータのアドレス指定方法とメモリ オペランドの組み合わせ方に大きな制限を課し、16 ビット アドレス空間を持つ以前の 8 ビット プロセッサから移植されていない新しいプログラムでは、個別のデータ項目 (配列、構造体、コード ユニットなど) を個別のセグメントに含め、独自のセグメント アドレスでアドレス指定するという Intel の設計者のアーキテクチャ意図に反します。
アンリアルモードは、一部の16ビットオペレーティングシステムと一部の32ビットブートローダーで使用されています。
システム管理モード(SMM)は、システムファームウェア(BIOS / UEFI)のみが使用し、オペレーティングシステムやアプリケーションソフトウェアは使用しません。SMMコードはSMRAM上で実行されます。
Intel 80286 は、リアル モードに加えて、保護モードをサポートしており、アドレス指定可能な物理メモリを 16 MB、アドレス指定可能な仮想メモリを1 GBに拡張し、プログラム同士の破損を防ぐ保護メモリを提供します。これは、セグメント レジスタをメモリに格納されている記述子テーブルへのインデックスを格納するためだけに使用することによって実現されます。このようなテーブルは 2 つあり、グローバル記述子テーブル(GDT) とローカル記述子テーブル(LDT) で、それぞれ最大 8192 個のセグメント記述子を保持し、各セグメントは 64 KB のメモリへのアクセスを提供します。80286 では、セグメント記述子は 24 ビットのベース アドレスを提供し、このベース アドレスに 16 ビットのオフセットを追加して絶対アドレスを作成します。テーブルからのベース アドレスは、リアル モードにおけるセグメント レジスタのリテラル値と同じ役割を果たします。セグメント レジスタは、直接レジスタから間接レジスタに変換されています。各セグメントには、ハードウェア ベースのコンピュータセキュリティに使用される 4 つのリングレベルの 1 つを割り当てることができます。各セグメント記述子には、セグメントで使用できる最大オフセットを指定するセグメント制限フィールドも含まれています。オフセットは16ビットであるため、80286保護モードではセグメントはそれぞれ64KBに制限されます。[ 37 ]
80286は、プロテクトモードでセグメントレジスタをロードするたびに、メモリから6バイトのセグメント記述子を読み取り、一連の隠し内部レジスタに格納する必要があります。そのため、プロテクトモードでのセグメントレジスタのロードは、リアルモードよりもはるかに遅く、セグメントを頻繁に変更することは避けるべきです。ただし、80286以降のプロセッサは、命令実行と並行してオフセットとセグメント制限との照合を行うハードウェアを備えているため、プロテクトモードのセグメントを使用した実際のメモリ操作は、それほど遅くはなりません。
Intel 80386 は、オフセットと各セグメント記述子のセグメント制限フィールドを 32 ビットに拡張し、セグメントがメモリ空間全体に及ぶようにしました。また、ページングの保護モードでのサポートも導入しました。ページングとは、ページ付き仮想メモリ(4 KB ページ サイズ)を使用できるメカニズムです 。ページングにより、CPU は仮想メモリ空間の任意のページを物理メモリ空間の任意のページにマッピングできます。これを行うために、メモリ内のページ テーブルと呼ばれる追加のマッピング テーブルを使用します。80386 の保護モードでは、ページングを有効または無効にすることができます。セグメント化メカニズムは常にアクティブであり、ページングメカニズムが有効になっている場合は、仮想アドレスを生成してマッピングします。セグメント化メカニズムは、すべてのセグメントのベース アドレスを 0 に設定し、サイズ制限をアドレス空間全体に等しくすることで、実質的に無効にすることもできます。この場合、最小サイズのセグメント記述子テーブル (記述子は 4 つのみ) が必要です (FS セグメントと GS セグメントは使用しないため)。[ q ]
ページングは、現代のマルチタスクオペレーティングシステムで広く利用されています。Linux 、386BSD、Windows NTは、ページングと32ビットセグメントオフセットをサポートした最初のIntelアーキテクチャCPUであった386向けに開発されました。386アーキテクチャは、x86シリーズにおけるその後のすべての開発の基礎となりました。
プロテクトモードをサポートするx86プロセッサは、旧世代の8086プロセッサとの下位互換性を保つため、リアルモードで起動します。電源投入時(ブート時)には、プロセッサはリアルモードで初期化され、その後命令の実行を開始します。読み取り専用メモリに格納されている可能性のあるオペレーティングシステムのブートコードは、ページングなどの機能を有効にするために、プロセッサをプロテクトモードに切り替えることがあります。逆に、リアルモードコードで一般的に用いられるセグメント演算は、プロテクトモードでは許可されていません。
32ビット保護モード(別名80386保護モード)には、仮想8086モード( V86モードとも呼ばれる)と呼ばれるサブモードも存在します。これは基本的に、保護モードのスーパーバイザオペレーティングシステムの制御下で、リアルモードのプログラムとオペレーティングシステムを実行できる特殊なハイブリッド動作モードです。これにより、保護モードのプログラムとリアルモードのプログラムを同時に実行する際の柔軟性が大幅に向上します。このモードは32ビット版の保護モードでのみ利用可能で、16ビット版の保護モードやロングモードには存在しません。
1990年代半ばには、x86アーキテクチャの32ビットアドレス空間が、大規模なデータセットを必要とするアプリケーションのパフォーマンスを制限していることは明らかでした。32ビットアドレス空間では、プロセッサが直接アドレス指定できるデータは4GBまでであり、ビデオ処理やデータベースエンジン などのアプリケーションではこのサイズを超えていました。64ビットアドレスを使用すれば、 16EiBのデータを直接アドレス指定できますが、ほとんどの64ビットアーキテクチャは64ビットアドレス空間全体へのアクセスをサポートしていません。たとえば、AMD64は64ビットアドレスから48ビットのみをサポートし、4つのページングレベルに分割されています。
1999年、AMDはx86アーキテクチャの64ビット拡張版であるx86-64の(ほぼ)完全な仕様を公開し、製品化の意向を表明した。この設計は現在、組み込みシステム向けの一部の例外を除き、ほぼすべてのx86プロセッサで使用されている。
一般市場向けの量産型x86-64チップは、動作するプロトタイプのテストと改良に時間が費やされた後、4年後の2003年に入手可能になりました。ほぼ同時期に、当初のx86-64という名称はAMD64に変更されました。AMD64プロセッサシリーズの成功とIA-64アーキテクチャの冷淡な反応により、IntelはAMD64命令セットの独自の実装をリリースせざるを得なくなりました。Intelは以前にAMD64のサポートを実装していましたが[ 38 ]、Itaniumの新しいIA-64命令セットが広く採用される前にAMDがAMD64を市場に投入しないことを期待して、それを有効にしないことを選択しました。IntelはAMD64の実装をEM64Tと名付け、後にIntel 64と改名しました。
MicrosoftとSunは、 WindowsおよびSolarisオペレーティングシステムにおいて、資料や製品バージョン名でAMD64/Intel64をまとめてx64と呼んでいます。Linuxディストリビューションでは、「x86-64」、その派生版である「x86_64」、または「amd64」と表記されます。BSDシステムでは「amd64」が、macOSでは「x86_64」が用いられます。
ロングモードは主に32ビット命令セットの拡張ですが、16ビットから32ビットへの移行とは異なり、64ビットモードでは多くの命令が削除されました。これは実際のバイナリの後方互換性(これらの命令をサポートする他のモードでレガシーコードを実行する)には影響しませんが、新しいコード用のアセンブラとコンパイラの動作方法を変更します。
これは、インテル以外のメーカーがx86アーキテクチャの大規模な拡張を主導し、開発した初めての事例であった。また、インテルが外部からこのような技術を受け入れたのも初めてのことだった。

初期のx86プロセッサは、8087、80287、80387といった一連の浮動小数点数値コプロセッサ(略称x87)の形で浮動小数点ハードウェアを追加することで拡張することができました。これはNPX (Numeric Processor eXtension)とも呼ばれ、コプロセッサは主に浮動小数点演算に使用されていましたが、2進数と10進数の両方で整数演算も実行できたため、適切な名称でした。ごくわずかな例外を除いて、80486以降のx86プロセッサはこのx87機能をチップ上に統合し、x87命令は事実上x86命令セットの不可欠な部分となりました。
ST(0)からST(7)と呼ばれる各x87レジスタは80 ビット幅で、IEEE浮動小数点標準の倍精度浮動小数点形式で数値を格納します。これらのレジスタは、ST(0)を最上位とするスタックとして構成されています。これはオペコード領域を節約するためであり、レジスタ間命令では、いずれかのオペランドに対してのみランダムアクセスが可能です。ST0は常に2つのオペランドのいずれか(ソースまたはデスティネーション)でなければならず、もう一方のオペランドがST(x)であるかメモリオペランドであるかは関係ありません。ただし、指定されたST(x)をST(0)と交換する命令を使用することで、スタックレジスタへのランダムアクセスが可能になります。
演算には、算術関数や超越関数(三角関数や指数関数を含む)、および共通定数(0、1、自然対数の底であるe、log2(10)、log10(2)など)をスタックレジスタのいずれかにロードする命令が含まれます。整数演算機能はしばしば見落とされがちですが、x87は8086、80286、80386、または64ビット拡張機能を持たない他のx86 CPUよりも大きな整数を単一の命令で演算できます。また、小さな値(例えば16ビット)に対する繰り返し整数計算も、x86 CPUとx87で整数命令を並列実行することで高速化できます。(x87コプロセッサが計算している間もx86 CPUは動作を続け、x87は計算が完了するとx86に信号を送るか、エラーのために注意が必要な場合はx86を割り込みます。)
物理アドレス拡張(PAE) は、最初に Intel Pentium Proで追加され、後にAMDがAthlon プロセッサで追加しました[ 39 ] 。これにより、最大 64 GB の RAM をアドレス指定できるようになりました。PAE がない場合、32 ビット保護モードの物理 RAM は通常 4 GBに制限されます。PAE は、より広いページ テーブル エントリと 3 番目のレベルのページ テーブルを備えた異なるページ テーブル構造を定義し、追加のビットの物理アドレスを許可します。32 ビット プロセッサの初期実装では、理論的には最大 64 GB の RAM をサポートしていましたが、チップセットやその他のプラットフォームの制限により、実際に使用できるものが制限されることがよくありました。x86-64プロセッサは、理論的には最大 52 ビットの物理アドレスを許可するページ テーブル構造を定義していますが、ここでも、チップセットやその他のプラットフォームの懸念 (使用可能な DIMM スロットの数や DIMM あたりの最大 RAM など) により、このような大きな物理アドレス空間は実現されません。 x86-64プロセッサでは、ロングモードに切り替える前にPAEモードが有効になっている必要があり、ロングモードが有効な間はPAEモードが有効のままでなければなりません。したがって、ロングモード中は「非PAE」モードは存在しません。PAEモードは、線形アドレスまたは仮想アドレスの幅には影響しません。
MMXは、Intelが設計し、1997年にPentium MMXマイクロプロセッサ向けに導入されたSIMD命令セットです。[ 40 ] MMX命令セットは、Intel i860で初めて使用された同様のコンセプトから開発されました。Intelおよび他のベンダーによって、その後のほとんどのIA-32プロセッサでサポートされています。MMXは通常、ビデオ処理(マルチメディアアプリケーションなど)に使用されます。[ 41 ]
MMX は、MM0 から MM7 (以降MMnと表記) と呼ばれる 8 つの新しいレジスタをアーキテクチャに追加しました。実際には、これらの新しいレジスタは既存の x87 FPU スタック レジスタのエイリアスに過ぎませんでした。したがって、浮動小数点スタックに対して行われた操作はすべて MMX レジスタにも影響しました。FP スタックとは異なり、これらの MMn レジスタは相対的ではなく固定されており、ランダムアクセスが可能でした。命令セットはスタックのようなセマンティクスを採用しなかったため、既存のオペレーティングシステムは変更を加えることなくマルチタスク時にレジスタの状態を正しく保存および復元することができました。[ 40 ]
MMnレジスタはそれぞれ64ビット整数です。ただし、MMX命令セットの主要な概念の1つはパックデータ型の概念であり、これはレジスタ全体を単一の64ビット整数(クワッドワード)に使用する代わりに、2つの32ビット整数(ダブルワード)、4つの16ビット整数(ワード)、または8つの8ビット整数(バイト)を格納するために使用できることを意味します。MMXの64ビットMMnレジスタはFPUスタックにエイリアスされており、各浮動小数点レジスタは80 ビット幅であるため、浮動小数点レジスタの上位16ビットはMMXでは使用されません。これらのビットは、MMX命令によってすべて1に設定され、これはNaN または無限大の浮動小数点表現に対応します。[ 40 ]
1997年、AMDは3DNow!を発表しました。[ 42 ]この技術の導入は3Dエンターテイメントアプリケーションの台頭と同時期であり、グラフィックを多用するアプリケーションのCPUのベクトル処理性能を向上させるように設計されていました。3Dビデオゲーム開発者と3Dグラフィックスハードウェアベンダーは、AMDのK6およびAthlonシリーズのプロセッサでパフォーマンスを向上させるために3DNow!を使用しています。 [ 43 ]
3DNow! は、MMX の整数から浮動小数点への自然な進化として設計されました。そのため、MMX とまったく同じレジスタ命名規則、つまり MM0 から MM7 を使用しています。[ 44 ]唯一の違いは、これらのレジスタに整数をパックする代わりに、各レジスタに 2 つの単精度浮動小数点数がパックされることです。FPU レジスタをエイリアスする利点は、FPU レジスタの状態を保存するために使用される同じ命令とデータ構造を、3DNow! レジスタの状態を保存するためにも使用できることです。したがって、そうでなければそれらを認識しないオペレーティングシステムに特別な変更を加える必要はありません。[ 45 ]
1999 年、インテルは Streaming SIMD Extensions (SSE)命令セットを導入し、2000 年に SSE2 を導入しました。最初の追加により、基本的な浮動小数点演算を x87 スタックからオフロードできるようになり、2 番目の追加により MMX がほぼ不要になり、従来のコンパイラで命令を現実的にターゲットできるようになりました。2004 年にPentium 4プロセッサのPrescott改訂版とともに導入された SSE3 は、インテルのHyperThreadingテクノロジーのパフォーマンスを向上させるために、特定のメモリおよびスレッド処理命令を追加しました。AMD は SSE3 命令セットのライセンスを取得し、改訂版 E 以降の Athlon 64 プロセッサに SSE3 命令のほとんどを実装しました。Athlon 64 は HyperThreading をサポートしておらず、HyperThreading 専用の SSE3 命令がありません。[ 46 ]
SSE は、FPU スタックへの従来の接続をすべて破棄しました。これは、この命令セットが MMX などの以前の世代の SIMD 命令セットへの従来の接続をすべて破棄したことも意味します。しかし、これにより設計者は自由になり、FPU レジスタのサイズに制限されないより大きなレジスタを使用できるようになりました。設計者は、XMM0 から XMM7 という名前の 8 つの 128 ビット レジスタを作成しました。( AMD64では、SSE XMM レジスタの数は 8 から 16 に増加しました。) ただし、欠点は、オペレーティングシステムがレジスタの状態を保存できるように、この新しい命令セットを認識する必要があったことです。そこで Intel は、SSE 命令の使用を可能にする拡張モードと呼ばれる、保護モードをわずかに変更したバージョンを作成しました。通常の保護モードでは、SSE 命令は無効のままです。SSE を認識している OS は拡張モードをアクティブにしますが、認識していない OS は従来の保護モードにしか入りません。
SSE は 3DNow! と同様に浮動小数点値のみを扱う SIMD 命令セットです。ただし、3DNow! とは異なり、FPU スタックへの従来の接続をすべて切断します。SSE は 3DNow! よりもレジスタが大きいため、レジスタに 2 倍の単精度浮動小数点数をパックできます。オリジナルの SSE は 3DNow! と同様に単精度数のみに制限されていました。SSE2 では倍精度数もパックできるようになりましたが、倍精度数は 64 ビットのサイズで、3DNow! の MMn レジスタ 1 つ分のサイズになるため、3DNow! では倍精度数をパックすることはできませんでした。128 ビットの SSE XMMn レジスタは、1 つのレジスタに 2 つの倍精度浮動小数点数をパックできます。したがって、SSE2 は、単精度のみに制限されていた SSE1 や 3DNow! よりも科学計算に適しています。SSE3 では追加のレジスタは導入されていません。[ 46 ]

2000年代までに、32ビットx86プロセッサのメモリアドレス指定の制限は、高性能コンピューティングクラスタや強力なデスクトップワークステーションでの利用の障害となっていた。旧式の32ビットx86は、より多くのメモリをアドレス指定できる、はるかに高度な64ビットRISCアーキテクチャと競合していた。ワークステーションやデスクトップソフトウェアアプリケーションが32ビットメモリアドレス指定の限界に達し始めると予想されていたため、インテルとx86エコシステム全体は、x86が64ビットコンピューティング時代を生き残るためには64ビットメモリアドレス指定を必要としていた。しかし、インテルは、64ビットデスクトップコンピュータへの移行を機に、x86アーキテクチャ全般からの脱却という大胆な一歩を踏み出すのが適切だと考えたが、この試みは最終的に失敗に終わった。
2001年、インテルは、当初は高性能コンピューティング市場をターゲットに、最終的に32ビットx86に取って代わることを期待して、IA-64と呼ばれる非x86 64ビットアーキテクチャをItaniumプロセッサに導入しようと試みました。 [ 47 ] IA-64はx86と互換性がありませんでしたが、Itaniumプロセッサはx86命令をIA-64に変換するエミュレーション機能を提供しました。しかし、これはx86プログラムのパフォーマンスに非常に悪影響を与え、実際にユーザーにとって役立つことはほとんどありませんでした。プログラマは、IA-64アーキテクチャ用にx86プログラムを書き直す必要があり、そうしないとItanium上でのパフォーマンスは真のx86プロセッサ上でのパフォーマンスよりも桁違いに悪くなりました。市場は、後方互換性を破ったためItaniumプロセッサを拒否し、x86チップの使用を継続することを好み、IA-64用に書き直されたプログラムはほとんどありませんでした。
AMD は、後方互換性が損なわれないように、64 ビット メモリ アドレス指定への別の道を選択することにしました。2003 年 4 月、AMD は、新しいx86-64拡張機能 (AMD64 または x64 とも呼ばれる) を使用して 4 GBをはるかに超える仮想メモリをアドレス指定できる、64 ビット汎用レジスタを備えた最初の x86 プロセッサであるOpteron をリリースしました。x86 アーキテクチャへの 64 ビット拡張機能は、新しく導入されたロング モードでのみ有効になったため、32 ビットおよび 16 ビットのアプリケーションとオペレーティングシステムは、パフォーマンスを少しも犠牲にすることなく[ 48 ]、16 ビット Intel 8086 の元の命令との完全な互換性を維持したまま、保護モードまたはその他のモードで AMD64 プロセッサをそのまま使用できました。 [ 49 ] : 13–14市場は好意的に反応し、高性能アプリケーションとビジネスまたは家庭用コンピュータの両方で 64 ビット AMD プロセッサを採用しました。
市場が互換性のないItaniumプロセッサを拒否し、MicrosoftがAMD64をサポートしているのを見て、Intelは対応せざるを得ず、2004年7月に独自のx86-64プロセッサであるPrescott Pentium 4を発表しました。[ 50 ]その結果、IA-64命令セットを持つItaniumプロセッサはほとんど使用されなくなり、x86はx86-64版を通じて、組み込み以外のコンピュータでは依然として支配的なCPUアーキテクチャとなっています。
x86-64ではNXビットも導入され、バッファオーバーランによって引き起こされるセキュリティバグに対する保護機能が提供されています。
AMDがx86系に64ビット技術を導入し、その後Intelがそれを採用した結果、64ビットRISCアーキテクチャはx86エコシステムへの脅威ではなくなり、ワークステーション市場からほぼ姿を消した。x86-64は、かつて64ビットRISC設計( IBM PowerマイクロプロセッサやSPARCプロセッサなど)の自然な活躍の場であったスーパーコンピュータ(AMD OpteronやIntel Xeonなど)で利用されるようになった。 64ビットコンピューティングへの大きな飛躍と、32ビットおよび16ビットソフトウェアとの後方互換性の維持により、x86アーキテクチャは今日では非常に柔軟なプラットフォームとなり、小型低消費電力システム(例えば、Intel QuarkやIntel Atom)から高速ゲーミングデスクトップコンピュータ(例えば、Intel Core i7やAMD FX / Ryzen)まで、さらには大規模なスーパーコンピューティングクラスタでもx86チップが利用され、スマートフォンやタブレット市場では、事実上ARM 32ビットおよび64ビットRISCアーキテクチャだけが競合相手として残されています。
2005年以前は、x86アーキテクチャのプロセッサは、 1974年にジェラルド・J・ポペックとロバート・P・ゴールドバーグによって作成された効率的な仮想化の条件であるポペックとゴールドバーグの仮想化要件を満たすことができませんでした。しかし、ソフトウェアベースの仮想化を使用して、プロプライエタリおよびオープンソースのx86仮想化ハイパーバイザ製品が開発されました。プロプライエタリシステムには、Hyper-V、Parallels Workstation、VMware ESX、VMware Workstation、VMware Workstation Player、Windows Virtual PCなどがあり、フリーおよびオープンソースシステムには、 QEMU、Kernel-based Virtual Machine、VirtualBox、Xenなどがあります。
2005年にAMD-VとIntel VT-x命令セットが導入されたことで、x86プロセッサはPopekとGoldbergの仮想化要件を満たすことができるようになった。[ 51 ]
Advanced Encryption Standard New Instructions (AES-NI) 命令セット拡張は、AES暗号化および復号処理を高速化するために設計されています。これは2008年にインテルによって初めて提案されました。
アドバンスト・ベクター・エクステンション(AVX)では、SSEレジスタのサイズが2倍になり、256ビットのYMMレジスタになりました。また、より大きなレジスタに対応するためにVEX符号化方式が導入され、要素を並べ替える命令もいくつか追加されました。AVX2ではレジスタの追加はありませんでしたが、マスキング、ギャザー、シャッフル命令が追加されたことが注目されました。
AVX-512は、512ビットZMMレジスタを32個に拡張し、新しいEVEX方式を採用しています。従来の方式では単一の拡張機能が採用されていましたが、AVX-512では複数のサブセットに分割されており、CPUの特定のモデルが実装するかどうかを選択できます。
Advanced Performance Extensions (APX) は、汎用レジスタの数を 16 から 32 に倍増し、汎用パフォーマンスを向上させる新機能を追加する拡張機能です。[ 52 ] [ 53 ] [ 54 ] [ 55 ]これらの拡張機能は「世代的」 [ 56 ]および「64 ビット以来最大の x86 の追加」[ 57 ]と呼ばれています。Intel はGNU Compiler Collection (GCC) 14に APX サポートを提供しました。 [ 58 ]また、Microsoft Visual Studio 2026 もAPXサポートを追加しました。2025年6 月現在 APXをサポートする最初の世代のチップはDiamond Rapidsになる予定である。[ 59 ]
2023年のアーキテクチャ仕様書[ 60 ]によると、 APXの主な特徴は以下のとおりです。
汎用命令用の拡張GPRは2バイトのREX2プレフィックスを使用してエンコードされ、新しい命令および既存のAVX / AVX2 / AVX-512命令の拡張オペランドは、異なる命令グループに使用される4つのバリアントを持つ拡張EVEXプレフィックスを使用してエンコードされます。
2024年10月、インテルとAMDが共同でx86エコシステム諮問グループ[ 61 ]を設立した。目標には、ソフトウェアの一貫性の向上とx86インターフェースおよび機能の標準化[ 62 ]が含まれていた。
主な技術的マイルストーンとしては、レイテンシを低減するために設計された最新の割り込みモデルであるFRED(Flexible Return and Event Delivery)、メモリ安全性の脆弱性に対処するためのChkTag(x86 Memory Tagging)、およびデバイス間で機能と開発者エクスペリエンスを標準化するためのACE(Advanced Matrix Extensions for Matrix Multiplication)などが挙げられます。AVX10は、次世代のベクトル命令セットおよび汎用命令セットとしてさらに確立されました。
データセンターではx86が圧倒的なシェアを占めているにもかかわらず、過去数年間、ARMなどの非x86アーキテクチャに関してベンダーが発信してきた話題を無視することは難しい。
「プロセッサ設計者たちはこれまで何度も、洗練されていないx86アーキテクチャを見て、最新のイノベーションに対応できるほど拡張することはできないと断言してきた」と、Insight 64の主席アナリストであるネイサン・ブルックウッドは述べている。
は16ビットおよび32ビットモードでのみマクロ演算融合を実行できます。Core Nehalemは64ビットモードでもこれを実行できます。
AX 形式の命令は、主に条件分岐で使用されます...
{{cite web}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク)ページ アドレス拡張) が有効になっている場合、または PDE が大きなページを記述していない場合は、ページ テーブル エントリの PCD ビットと PWT ビットで構成される 2 ビットのインデックスを使用して、4 つの PAT レジスタ フィールドのいずれかを選択します。
かつてインテルがx86製品ラインの後継として宣伝していたItaniumに対する期待は大幅に後退した。
図 5、6、7 は、WAS の 32 ビット バージョンが POWER および x86-64 プラットフォームでネイティブ ハードウェア パフォーマンスを完全に発揮してアプリケーションを実行することも示しています。一部の 64 ビット プロセッサ アーキテクチャとは異なり、POWER および x86-64 ハードウェアは 32 ビット モードをエミュレートしません。したがって、64 ビット機能の恩恵を受けないアプリケーションは、上記の 64 ビット プラットフォームで実行されている WebSphere の 32 ビット バージョンでフル パフォーマンスで実行できます。
{{cite web}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク)