このページの本文へ

ロードマップでわかる!当世プロセッサー事情 第731回

インテルの新命令セットでついに16bitモードが廃止に

2023年08月07日 12時00分更新

文● 大原雄介(http://www.yusuke-ohara.com/) 編集●北村/ASCII

  • この記事をはてなブックマークに追加
  • 本文印刷

汎用レジスターを増量する「APX」

 Intel APX(Advanced Performance Extensions)は、X86-Sと異なり提案ではなく、将来実装することが明らかにされている。こちらの基本的なアイディアは「64bit環境で利用できる汎用レジスターの数を増やすことで、より効率的にプログラムを実行できるようにしよう」というものだ。

 もともとx64(というよりx86-64)になった時、それまで8個だった汎用レジスターが16個に増えている。もっとも8086由来の8個の汎用レジスターのうち、プログラムからある程度自由に使えるレジスターは実質的には4つ(AX/CX/DX/BX)しかなかったので、汎用レジスターが16個に増えたことでプログラムから自由に使えるレジスターは12個になった計算で、3倍に増えたことでこれまでスタックしてカバーしていたレジスター不足の状況が大幅に緩和されることになった。

 これに加え、新しくNDD(New Data Destination)を利用した3オペランド命令も定義されることになった。NDDとはなにか? というと、これまでx86の命令セットは基本2オペランドだった。例えば加算(ADD)命令の場合、従来は以下のフォーマットになっていた。

ADD reg1, reg2

 この場合の処理は以下の計算式になる。

reg1 = reg1 + reg2

 つまりレジスターreg1の内容とレジスターreg2の内容を加算して、その結果をreg1に上書きする格好だ。この時点で、元のreg1の内容は失われる格好になる。これに対してNDDを利用した3オペランド命令では以下のようになる。

ADD reg1, reg2, reg3

 処理は以下の計算式になる。

reg1 = reg2 + reg3

 今度はレジスターreg2とreg3の内容を加算し、その結果をreg1に保存する。つまりADDを行なってもreg2の内容が上書きされることはなくなった。

 もともとx86でこの3オペランド命令がサポートされなかった理由は、8086でレジスターの数を節約するためである。当時の回路規模では、レジスターを多数実装するとそれだけでトランジスタ数が大きく増えてしまい不経済だったからだ。

 したがって、仮に命令を実行した後でも元のレジスターの内容を保存しておきたい場合は、あらかじめスタックなどにその値を格納しておいてから命令を実行し、その後スタックから復帰させるという方法が用いられていた。

 このあたりはx64の実装で利用できるレジスターの数が増えたことでだいぶ緩和された(スタックに格納しなくても、別の汎用レジスターに格納できる場合が増えた)が、どうせレジスターにコピーするくらいなら最初から3オペランド命令にした方が無駄にレジスター間コピーをする手間が省けて楽である。そこで汎用レジスター数の増加と併せて、この3オペランド命令のサポートが追加された格好だ。

 ただこれ、既存のx86/x64とはまるで互換性がない。そこでこの3オペランド命令に関しては、REX2という新しい命令Prefixが付くことになった。もともとx86では、命令Prefixと呼ばれる拡張フォーマットがサポートされている。

 例えば80386の場合、0x41では16bitのINC(インクリメント:1加算する)命令だが、0x66 0x41では32bit命令のINCになる。0x41はINCのオペコード(命令を示す値)だが、0x66がOperand Size Prefixで、この場合は32bitのINC命令を実行するようになるというわけだ。

 ほかにもAddress Size PrefixやSegment Size Prefix、Repeat Prefix、REX Prefix、VEX Prefixなどがある。このうちREX Prefixはx64に合わせて導入されたもので、これが冒頭に付くと続く命令は64bitとして扱うというものだが、今回はREX2という新しいプレフィックスが用意された格好だ。

 余談だが、REX Prefixは0x40~0x47を利用する。この値、オペコードとしては16bitのINC命令であった。つまり64bit拡張を行なう際に16bitのINC命令を潰した格好だ。同様にREX2 Prefixは0xD5を利用するが、これは16bitのAAD(0xD5 0x0A)ないしAAX(0xD5)で使われていたオペコードで、これを潰してREX2に割り当てた格好になる。

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン