SPARC CPU (および MIPS) で %r0 を読み取ると、常に 0 が返されることは知っていますが、理由を知りたいです。
この背後にある設計上の決定とその理由は何ですか?
SPARC CPU (および MIPS) で %r0 を読み取ると、常に 0 が返されることは知っていますが、理由を知りたいです。
この背後にある設計上の決定とその理由は何ですか?
それはちょうどCPUが設計された方法です。を常にゼロに設定することr0
は、非常に一般的な値に対するコストのかかる可能性のあるメモリ アクセスを回避する方法の 1 つです。
一方 (読み取り) では、ゼロの値を格納するためのレジスタを確保しておくと、それを使用できるようになると便利です。そうしないと、自分でゼロをレジスタにロードする必要があります。
多くの RISC プロセッサは、レジスタでのデータ操作を好む傾向があり、メモリにアクセスするのはロードおよびストア操作のみです。これは RISC の厳格なルールではなく、むしろ傾向です。常にゼロを使用できるようにレジスターを取っておくと便利です。汎用値に使用するレジスターが 1 つ少なくなるため、これはトレードオフですが、MIPS 設計者は明らかにそれが価値があると考えていました。
一方 (書き込み)r0
は値 0 に関連付けられているため、そこに必要なものを入れることができ、違いはありません - 値は 0 のままです。つまり、値を捨てたい場合は、それをターゲットとして使用できます。
繰り返しますが、これは RISC の背後にある哲学と関係があります。R
MIPSやフォーマット (レジスタ、即時、ジャンプ)などの非常に少数の命令フォーマットを優先する傾向がI
あります。J
例として、結果を保存するかどうかに応じて複数の命令形式を使用するのではなく、常に結果を保存する 1 つのセットを作成し、r0
気にしない場合はそれを保存するだけで済みます。
したがって、2 つのレジスタを追加するとオーバーフローが発生するかどうかを確認したいが、結果をどこにも保存したくない場合は、次のように使用できます。
add $0, $7, $8 ; r0 <- r7 + r8, but r0 remains at 0.
MIPS のドキュメント ではMIPS32 Architecture for Programmers Volume I: Introduction to the MIPS32 Architecture
、上記のことが確認されています。
R0 は値 0 に固定されており、結果を破棄する命令のターゲット レジスタとして使用できます。ゼロ値が必要な場合、R0 をソースとして使用することもできます。
命令セット設計の観点からの主な理由は、レジスタの存在により、/dev/null
そうでなければ2つ(またはそれ以上)の異なる命令を1つの命令に「凝縮」できるからです。いくつかの例:
call
とreturn
は、リンク レジスタを使用して、1 つの命令で実行できます。
jmp <tgtreg>,<pc>,<linkreg>
jmp
はアトミックですmov <pc>,<linkreg>; mov <tgtreg>,<pc>
)、およびjmp <linkreg>,<nullreg>,<nullreg>
cmp
またはtst
単純にすることができますsub <a>,<b>,<nullreg>
これらの完全な表は、Oracle のドキュメント、 SPARC 合成命令およびsparcv9 合成命令から見つけることができます。これらのほとんどは%g0
どこかに関係しています。