PowerPC のレジスタ
PowerPCには32本の32bit汎用レジスタ、32本の64bit浮動小数点レジスタ、数本の特殊目的レジスタがあります。スタック専用のレジスタはありません。
汎用レジスタ
32本の汎用レジスタ(General Purpose Register)があり、演算命令、比較命令、メモリ転送命令など多くの命令のオペランドとして使い、数値、アドレスを格納します。どのレジスタも同じ機能(GPR0だけは一部の命令で特殊な意味がある) を持っています。GNU as (アセンブラ)では、0 から 31の数値でレジスタを指定します。as に「-mregnames」オプションを指定した場合には r0 から r31 と表記することができます。今後、汎用レジスタの表記には r0 - r31 を用います。
ビットの番号付けが他のCPUと逆になっていて、bit0が最上位になります。ローテイト命令などでビット位置を指定する場合に注意が必要です。上位16ビットは0:15、下位16ビットは、16:31となることに注意してください。
PowerPCはスタックポインタを持たないため、汎用レジスタの1つをスタックポインタとして使います。ほとんどのOSと同じく Linux でも r1 をスタックポインタとします。各レジスタはr0を除いてまったく同じ働きをしますが、レジスタの使い方はOSで採用している ABI (Application Binary Interface) で定義された使い方(引数に使用するレジスタ、内容を壊してはいけないレジスタなどの決まり)があります。アセンブリだけでプログラムを作成する場合は、スタックポインタとして使う r1 以外は好きなように使ってかまいません。
32本のレジスタを図にしてみると、かなり多く使えることが分かります。
r0 が 0 と解釈される命令
次の命令で r0 がソースレジスタ(オペランドの2番目のレジスタ)に指定された場合には、 r0の内容ではなく数値 0 として扱われます。
演算 | ロード | ストア |
---|---|---|
addi | lbz | stb |
addis | lbzx | stbx |
lha | ||
lhax | ||
lhbrx | sthbrx | |
lhz | sth | |
lhzx | sthx | |
lmw | stmw | |
lswi | stswi | |
lswx | stswx | |
lwbrx | stwbrx | |
lwz | stw | |
lwzx | stwx | |
lwarx | stwcx. |
例えば、次のコードを実行すると r0 の値は「6」になるように思われますが、 r0には「1」が代入されます。
li r0, 0 addi r0, r0, 5 addi r0, r0, 1
addi命令がそれぞれ「r0 = 0 + 5」「r0 = 0 + 1」と解釈されるため、最終的に r0 の値は「1」となります。
特殊レジスタ
特権モードでは他にも多くの特殊レジスタが使用できますが、ここでは省略します。
リンクレジスタ
リンクレジスタ(Link Register)には、サブルーチン呼び出しに分岐命令を使用した場合に、戻り番地(分岐命令直後のアドレス)が格納されます。
カウントレジスタ
カウントレジスタ(Count Register)は専用の分岐命令と組み合わせてループのカウンタとして使用します。
条件レジスタ
条件レジスタ(Condition Register)は4ビット単位で8組に分かれます。指定しない場合は、CR0(最上位の4ビット)を指定したものとみなされます。演算結果にしたがって条件レジスタ(Condition Register)の対応する各ビットが変化します。
ビット | フラグ | 意味 |
---|---|---|
0 | 負 (LT) | 結果が負のときにセット |
1 | 正 (GT) | 結果が正(かつゼロでない)ときにセット |
2 | ゼロ (EQ) | 結果がゼロのときにセット |
3 | サマリオーバフロー (SO) | 命令完了時の XER[SO] のコピー |
整数例外レジスタ
整数例外レジスタ(Integer Exception Register)は演算結果のキャリー、オーバーフロー、サマリーオーバーフローの各ビットとstswx (Store String Word Indexed)、 lswx (Load String Word Indexed )の転送バイト数を設定するフィールドを持ちます。
ビット | フラグ | 意味 |
---|---|---|
0 | SO | 演算でオーバフローが発生したらセット、自動的にリセットされない |
1 | OV | 演算でオーバフローが発生したらセット |
2 | CA | MSB (最上位ビット) からの桁上り (キャリー) が発生したらセット |
25-31 | byte count | stswx/lswxの転送バイト数を設定 |
キャリーとオーバーフロー
演算の結果、第0ビット(最上位桁)で桁上り(キャリー)が発生するとキャリーフラグがセットされます。また、2の補数の演算で結果が32ビットに収まらない場合、オーバーフローフラグがセットされます。オーバーフローは大きな正数同士の加算、(絶対値が)大きな負数同士の加算によって発生します。次のように第0ビット(最上位桁)からのキャリーと第1ビットからのキャリーが異なる場合にオーバーフローフラグがセットされます。
乗除算で結果が32ビットに収まらない場合もオーバーフローが発生します。
浮動小数点レジスタ
浮動小数点演算専用の64bitレジスタ(Floating Point Register)も32本あります。 IEEE標準の形式で浮動小数点数を格納します。
Floating-Point Status and Control Register
浮動小数点演算の状態の保持と制御を行うレジスタです。
詳細は省略します。