x64のレジスタ拡張(1/2 ページ)

x64の大きな特徴の1つに、レジスタの拡張が挙げられます。今回は、この部分を中心に解説していきます(特集:64ビットコンピューティング最前線)。

» 2005年06月29日 00時00分 公開
[ch3,C MAGAZINE]

C MAGAZINE 2005年6月号より転載

 x64には、64ビットに拡張された16本の汎用レジスタ(GPR)と、16本の128ビットXMMレジスタが搭載されています。

 x64で新たに追加されたレジスタは、アプリケーションレベルでは64ビットモード時においてのみ使用することができます。

 ここで1つ例をあげてみましょう。

ADD AL, DL ;8ビットの加算
ADD AX, DX ;16ビットの加算
ADD EAX, EDX ;32ビットの加算
ADD RAX, RDX ;64ビットの加算

 この4つの命令は従来のx86でも使われているADDという加算命令です。これらはすべて「A=A+B」の計算をしろという意味の命令ですが、x86では加算するデータの幅はオペランド(被演算子:ADDの右にあるパラメータ)のサイズで決定されることになっています。たとえば、8ビットの計算ならALやDLを、16ビットの計算ならAX/DXを、32ビットの計算ならEAX/EDXを、それぞれ指定することになります。

 従来の32ビットシステムでは、ここまでしか計算できませんでしたが、x64ではさらに64ビット幅のレジスタを示すRAX/RDXというオペランドも指定できます。もちろん、64ビット幅だけでなくこれまでどおりのレジスタ幅も扱えますし、ADDにかぎらずほとんどの命令がこうしたレジスタの拡張という形で実装されています。つまり64ビットをサポートしつつ、既存のx86命令との親和性もきわめて高いといえます。

 ここで、各レジスタがどういう構造になっているかをFig.1に簡単に示しておきます。すべての演算器は64ビット幅を前提に作られており、たとえば32ビットの命令なら単にその半分を使うだけということになります。64ビット幅のレジスタが前提なので、当然64ビットまでの幅の計算であれば一度に行うことができます。

Fig.1 Fig.1 レジスタの構造(アキュムレータの例)

 レジスタ全体の構造はFig.2のようになっています。Fig.2で、色の濃い部分が従来の32ビットシステムでサポートされていたレジスタで、色の薄い部分がx64で新しく追加されたレジスタです。

Fig.2 Fig.2 x64のレジスタ構造

 x64の大きな特徴の1つに、レジスタが大幅に増やされたという点があります。従来のx86では、8個の32ビット汎用レジスタが用意されていましたが、あまりにも数が少なく、しかも実際に使えるレジスタ数はかぎられていました。このため、レジスタ操作をするためにスタックを多用せざるをえない場合が多く、これがアプリケーションの性能を阻害している場合がありました。

 また8個の128ビットSSEレジスタも比較的新しいタイプのプロセッサでなければ扱うことができず、旧来のプロセッサとの互換性を保つことを考えた場合、使う場面がかなりかぎられていました。

 しかし、x64の64ビットシステム環境下では、これらのレジスタを積極的に使うことができ、その数も倍に増えたことで、プログラミングの自由度が向上しています。これは、ひいてはアプリケーション性能の改善にもつながると考えられます。

       1|2 次のページへ

Copyright(C) 2010 SOFTBANK Creative Inc. All Right Reserved.

注目のテーマ