雑学クイズの答えを探していると思います。MIPSアーキテクチャがレジスタに対して明示的な「ゼロ」値を使用する理由を理解しようとしていますが、それに対してレジスタをXORするだけで同じことが実現できます。操作はすでに行われていると言えます。ただし、「ゼロ」値を多く使用するような状況は想像できません。私はヘネシーの元の論文を読みましたが、実際には正当な理由もなくゼロが割り当てられています。
ゼロのハードコーディングされたバイナリ割り当てがある論理的な理由はありますか?
更新: PIC32MZのMIPSコア用のxc32-gccからの実行可能ファイルの8kで、「ゼロ」の単一インスタンスがあります。
add t3,t1,zero
実際の答え: MIPSと条件コードに関する情報を持っている人に賞金を授与しました。答えは、実際には条件のMIPSアーキテクチャにあります。最初はこれに時間を割くつもりはありませんでしたが、opensparc、MIPS-V、およびOpenPOWER(このドキュメントは内部ドキュメントです)のアーキテクチャを確認しました。その概要を次に示します。パイプラインのアーキテクチャにより、ブランチでの比較に必要なR0レジスタ。
- 整数とゼロとの比較(bgez、bgtz、blez、bltz)
- 整数は2つのレジスタを比較して分岐します(beq、bne)
- 整数2つのレジスタを比較してトラップ(teq、tge、tlt、tne)
- 整数比較レジスタと即値およびトラップ(teqi、tgei、tlti、tnei)
それは単に、ハードウェアが実装でどのように見えるかにかかっています。MIPS-Vマニュアルから、68ページに参照されていない引用があります。
条件分岐は、条件コード(x86、ARM、SPARC、PowerPC)を使用するのではなく、(PA-RISCとXtensa ISAで行われるように)2つのレジスタ間の算術比較演算を含めるか、1つのレジスタのみをゼロと比較するように設計されました( Alpha、MIPS)、または2つのレジスター(MIPS)。この設計は、比較と分岐の命令tsを通常のパイプラインに結合し、追加の条件コード状態や一時レジスタの使用を回避し、静的コードサイズと動的命令フェッチトラックを削減するという観察に基づいています。もう1つのポイントは、ゼロとの比較には重要な回路遅延(特に、高度なプロセスでのスタティックロジックへの移行後)が必要であるため、算術マグニチュードの比較とほぼ同じくらいのコストがかかるということです。融合比較分岐命令の別の利点は、分岐がフロントエンド命令ストリームの早い段階で観察されるため、より早く予測できることです。同じ条件コードに基づいて複数の分岐を行うことができる場合、条件コードを使用した設計にはおそらく利点がありますが、このケースは比較的まれであると考えています。
MIPS-Vドキュメントは、引用されたセクションの作成者にヒットしません。皆様の時間とご配慮に感謝いたします。