スタックの実装と利用原則

データスタックのための格納庫としては基本的にはメモリーの1区画を利用すると考えてよいでしょう。もっと特定すればアプリケーションヒープということになります。そのアプリケーションが自由に利用できるメモリ内の、下の方(アドレス番号が若い方)にその領域は存在しています。

ただし、一般メモリー領域は広大であることもあってアクセスに時間がかかるため、直ちに消費されるデータスタックアイテムは、わざわざメモリーに格納することなく、レジスタだけで済ませて、実行速度の向上を図る方法があります。これを、スタックアイテムのレジスタキャッシュといいます。この技法は特にRISC CPUであるPowerPCでは重要になります。そこで、PowerMopsではこのレジスタキャッシュが原則として活用されます。

PowerMopsでは、整数データスタックアイテムのキャッシュのために、7本(1つ32ビット)の汎用レジスタが利用されています。スタックアイテムの操作の際の一時保管も含め、この個数を超える保存領域が必要なった場合にはメモリーが利用されます。ですから、スタック上に蓄積されるアイテムの個数を最小限に抑えることによって、非常に実行効率のよいプログラムとなります。

また、PowerMopsがスタックのキャッシュのために使うレジスタは、関数(ワード)の呼出しの前後で維持される保証がない部分であるため、ワードに消費させるアイテム以外のスタックアイテムは、呼出しの前後で保存・回復しなければなりません。その分のオーバーヘッドは当然あるでしょうから、ワードの呼出し時には、スタックアイテムを使い切るようにするのが好ましいようです。もっとも、これに反したとしても、眼に見える効率の低下があるということはないでしょう。なお、スタックアイテム操作のための基本的なワードのほとんどは、呼出しではなく、その場にコードを展開する方法(インラインといいます。)で実装されています。

浮動小数点数スタックに関しても、PowerMopsでは、浮動小数点数レジスタ(1つ64ビット)を最大限に利用するとされます。浮動小数点数レジスタの中にも特別な使い方があるものもあり、後で述べる局所変数のためにとっておかれるものもあるので、全てとはいいませんが、整数の場合よりも数多くのレジスタが空いています。そのため、PowerMopsは浮動小数点数に関して極めて高速な(効率の良い)実装を備えているといえるでしょう。

なお、iMopsにおいては、前提とするCPU x86-64ではレジスタ数が16本ではありますが、レジスタキャッシュが積極的に行われ、上とほぼ同じことがいえます。

関連項目:






最終更新:2018年12月10日 23:31